diff --git a/DEPS b/DEPS
index e23e6a3..c68380c2 100644
--- a/DEPS
+++ b/DEPS
@@ -199,11 +199,11 @@
   # 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': '99c2e708b44435a26a652d3ac908cfa7ae671aff',
+  'skia_revision': '22cc3be64b3eca38f8326016f83b0e6ad7ef008e',
   # 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': '9fb4397af6206a06708ca8f579d923dd525059ea',
+  'v8_revision': '74ef1d1cf560c22c37a43f202a6275c8ed92ae97',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -211,11 +211,11 @@
   # 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': 'c38413f86cb98f088043c05eac900e7a9986d52a',
+  'angle_revision': '63b4df5913692d24b0b871a1a8db3a5165d116e9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'aec0826aba0db51914209ec85a515d3a99311f07',
+  'swiftshader_revision': '3e9b79ff42de0f5547809354de89e24c7a439e39',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -250,7 +250,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': 'c7cc947c0f3225a5b01e14456c65a8e3162dfd4c',
+  'freetype_revision': '601c5a611e4ce90bfdb1b113759d903baf88698e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -270,7 +270,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '1cd5ea42acb73f0cb3144bd16a110161600e6b76',
+  'catapult_revision': '9d5ec46922405ae79512edaca638c6654d099105',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -278,7 +278,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': 'c34246abbfd0c7a0b2344447bf6d3b5bef3415ad',
+  'devtools_frontend_revision': '0fcccc317bedcebb8d064e1d578eca379307c173',
   # 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.
@@ -318,7 +318,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': '2df77f4325841e667e6b9ff9921fd626496a3b64',
+  'dawn_revision': 'c1d3a66bd217395a501543b09c6d2c25e9d2e22e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -346,7 +346,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '437f5f6f8dee3ec4ec886939b87ab4ab9ccbe3d0',
+  'nearby_revision': '544c161e542a4d9eb0f11e91dde2ff3d1773572b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -683,7 +683,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'zGdAyNdySwhTXOWTtAushFRKlDwCWGcYSWiaS2R5m8YC',
+          'version': 'rGP-LC77LTKeBcOfzzaBhvp1lm1dGnVx0K7KgdqSzDAC',
       },
     ],
     'condition': 'checkout_android',
@@ -1050,7 +1050,7 @@
     Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '18e09b9197a3b1d771c077c530d1a4ebad04c167',
 
   'src/third_party/icu':
-    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '899e18383fd732b47e6978db2b960a1b2a80179b',
+    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '2eefd9a18a2084e02b12691a60ff932f82cfb385',
 
   'src/third_party/icu4j': {
       'packages': [
@@ -1275,7 +1275,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '17fea3e29e06aa364b040a696c78251fc44bc2cd',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f2d015349a7dfa75619a2fdcd841806b0a099c79',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1353,7 +1353,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/aemu/linux-amd64',
-              'version': 'LnKrohyendQPTMK98ZpUzCtXtDGHbtf4y3KkPBTDEZsC'
+              'version': 'DUWCHyibCTWCe-ijlAKpinTlXaJQW2jg8hs7uRUfK0gC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1394,7 +1394,7 @@
   },
 
   'src/third_party/re2/src':
-    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'c33d1680c7e9ab7edea02d7465a8db13e80b558d',
+    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'c50caed13fc5844fac271de8fc59d9e4658f2f1c',
 
   'src/third_party/r8': {
       'packages': [
@@ -1511,7 +1511,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '66460536ee975a3e98931b7b40a661a63fd9cd57',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fae4fb13451bea44ae1a94509befe8d7c6b11eb6',
+    Var('webrtc_git') + '/src.git' + '@' + '49dbad021e802197b3c0b966c03b4aa766a5b578',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1583,7 +1583,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3f282c6305c148b7e9ea05f67e9ecf35037e9624',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ba11d9a2ec63bb186063b08a29b8d73269546548',
     'condition': 'checkout_src_internal',
   },
 
@@ -1591,7 +1591,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'VVLYM4uR4nGwohdGRQv779zs4jL0VKz1YCTIOe5IUAMC',
+        'version': 'R-1nbC-AmnodYzBYqrEzkht8v6fRYS6CmM5bWWtt6cMC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1602,7 +1602,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'jge_2d5ALNVUmEFnbn5YlAt84A-kkbAfLsZzeqxZnLoC',
+        'version': 'gWs3eWGOWAPXzGA_h67xOXO9otnjSoMQx01RSmOl4hwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index c6df0652..d1aeca8 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -353,7 +353,6 @@
   '^chrome/browser/profiling_host/profiling_process_host.cc',
   '^chrome/browser/push_messaging/',
   '^chrome/browser/recovery/recovery_install_global_error.cc',
-  '^chrome/browser/renderer_context_menu/',
   '^chrome/browser/resource_coordinator/',
   '^chrome/browser/resources/chromeos/accessibility/',
   '^chrome/browser/rlz/chrome_rlz_tracker_delegate.cc',
diff --git a/android_webview/browser/aw_print_manager.h b/android_webview/browser/aw_print_manager.h
index 77fdfe4d..1a0ddc1 100644
--- a/android_webview/browser/aw_print_manager.h
+++ b/android_webview/browser/aw_print_manager.h
@@ -10,7 +10,6 @@
 #include "base/macros.h"
 #include "components/printing/browser/print_manager.h"
 #include "components/printing/common/print.mojom-forward.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "printing/print_settings.h"
 
diff --git a/android_webview/browser/metrics/aw_stability_metrics_provider_unittest.cc b/android_webview/browser/metrics/aw_stability_metrics_provider_unittest.cc
index 1dee3b2e..07e23a6 100644
--- a/android_webview/browser/metrics/aw_stability_metrics_provider_unittest.cc
+++ b/android_webview/browser/metrics/aw_stability_metrics_provider_unittest.cc
@@ -71,9 +71,8 @@
 
   provider.ProvideStabilityMetrics(&system_profile);
   EXPECT_EQ(1, system_profile.stability().page_load_count());
-  histogram_tester.ExpectUniqueSample("Stability.Experimental.Counts",
-                                      metrics::StabilityEventType::kPageLoad,
-                                      1);
+  histogram_tester.ExpectUniqueSample(
+      "Stability.Counts2", metrics::StabilityEventType::kPageLoad, 1);
 }
 
 TEST_F(AwStabilityMetricsProviderTest, RendererHangCount) {
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
index fe3de32..a375707f 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
@@ -88,8 +88,12 @@
     // it shouldn't be accessed from anywhere else.
     /* package */ final Object mLock = new Object();
 
-    // Read/write protected by mLock.
-    private boolean mStarted;
+    // mInitState should only transition INIT_NOT_STARTED -> INIT_STARTED -> INIT_FINISHED
+    private static final int INIT_NOT_STARTED = 0;
+    private static final int INIT_STARTED = 1;
+    private static final int INIT_FINISHED = 2;
+    // Read/write protected by mLock
+    private int mInitState;
     private Looper mFirstWebViewConstructedOn;
 
     private final WebViewChromiumFactoryProvider mFactory;
@@ -135,7 +139,7 @@
             // return paths. (Other threads will not wake-up until we release |mLock|, whatever).
             mLock.notifyAll();
 
-            if (mStarted) {
+            if (mInitState == INIT_FINISHED) {
                 return;
             }
 
@@ -180,7 +184,7 @@
                 mSharedStatics.setWebContentsDebuggingEnabledUnconditionally(true);
             }
 
-            mStarted = true;
+            mInitState = INIT_FINISHED;
 
             RecordHistogram.recordSparseHistogram("Android.WebView.TargetSdkVersion",
                     context.getApplicationInfo().targetSdkVersion);
@@ -249,7 +253,7 @@
     // Only called for apps which target <JB MR2, and which construct WebView on a non-main thread.
     void setFirstWebViewConstructedOn(Looper looper) {
         synchronized (mLock) {
-            if (!mStarted && mFirstWebViewConstructedOn == null) {
+            if (mInitState != INIT_FINISHED && mFirstWebViewConstructedOn == null) {
                 mFirstWebViewConstructedOn = looper;
             }
         }
@@ -273,26 +277,74 @@
     }
 
     boolean hasStarted() {
-        return mStarted;
+        return mInitState == INIT_FINISHED;
     }
 
-    void startYourEngines(boolean onMainThread) {
+    void startYourEngines(boolean fromThreadSafeFunction) {
         synchronized (mLock) {
-            ensureChromiumStartedLocked(onMainThread);
+            ensureChromiumStartedLocked(fromThreadSafeFunction);
         }
     }
 
     // This method is not private only because the downstream subclass needs to access it,
     // it shouldn't be accessed from anywhere else.
-    /* package */ void ensureChromiumStartedLocked(boolean onMainThread) {
+    /* package */ void ensureChromiumStartedLocked(boolean fromThreadSafeFunction) {
         assert Thread.holdsLock(mLock);
 
-        if (mStarted) { // Early-out for the common case.
+        if (mInitState == INIT_FINISHED) { // Early-out for the common case.
             return;
         }
 
-        Looper looper = !onMainThread ? Looper.myLooper() : Looper.getMainLooper();
-        Log.v(TAG, "Binding Chromium to "
+        if (mInitState == INIT_NOT_STARTED) {
+            // If we're the first thread to enter ensureChromiumStartedLocked, we need to determine
+            // which thread will be the UI thread; declare init has started so that no other thread
+            // will try to do this.
+            mInitState = INIT_STARTED;
+            setChromiumUiThreadLocked(fromThreadSafeFunction);
+        }
+
+        if (ThreadUtils.runningOnUiThread()) {
+            // If we are currently running on the UI thread then we must do init now. If there was
+            // already a task posted to the UI thread from another thread to do it, it will just
+            // no-op when it runs.
+            startChromiumLocked();
+            return;
+        }
+
+        // If we're not running on the UI thread (because init was triggered by a thread-safe
+        // function), post init to the UI thread, since init is *not* thread-safe.
+        AwThreadUtils.postToUiThreadLooper(new Runnable() {
+            @Override
+            public void run() {
+                synchronized (mLock) {
+                    startChromiumLocked();
+                }
+            }
+        });
+
+        // Wait for the UI thread to finish init.
+        while (mInitState != INIT_FINISHED) {
+            try {
+                mLock.wait();
+            } catch (InterruptedException e) {
+                // Keep trying; we can't abort init as WebView APIs do not declare that they throw
+                // InterruptedException.
+            }
+        }
+    }
+
+    private void setChromiumUiThreadLocked(boolean fromThreadSafeFunction) {
+        // If we're being started from a function that's allowed to be called on any thread,
+        // then we can't just assume the current thread is the UI thread; instead we assume the
+        // process's main looper will be the UI thread, because that's the case for almost all
+        // Android apps.
+        //
+        // If we're being started from a function that must be called from the UI
+        // thread, then by definition the current thread is the UI thread whether it's the main
+        // looper or not.
+        Looper looper = fromThreadSafeFunction ? Looper.getMainLooper() : Looper.myLooper();
+        Log.v(TAG,
+                "Binding Chromium to "
                         + (Looper.getMainLooper().equals(looper) ? "main" : "background")
                         + " looper " + looper);
         ThreadUtils.setUiThread(looper);
@@ -313,30 +365,6 @@
             // Reset to null to avoid leaking the app's looper.
             mFirstWebViewConstructedOn = null;
         }
-
-        if (ThreadUtils.runningOnUiThread()) {
-            startChromiumLocked();
-            return;
-        }
-
-        // We must post to the UI thread to cover the case that the user has invoked Chromium
-        // startup by using the (thread-safe) CookieManager rather than creating a WebView.
-        AwThreadUtils.postToUiThreadLooper(new Runnable() {
-            @Override
-            public void run() {
-                synchronized (mLock) {
-                    startChromiumLocked();
-                }
-            }
-        });
-        while (!mStarted) {
-            try {
-                // Important: wait() releases |mLock| the UI thread can take it :-)
-                mLock.wait();
-            } catch (InterruptedException e) {
-                // Keep trying... eventually the UI thread will process the task we sent it.
-            }
-        }
     }
 
     private void initPlatSupportLibrary() {
@@ -377,7 +405,7 @@
 
     // Only on UI thread.
     AwBrowserContext getBrowserContextOnUiThread() {
-        assert mStarted;
+        assert mInitState == INIT_FINISHED;
 
         if (BuildConfig.DCHECK_IS_ON && !ThreadUtils.runningOnUiThread()) {
             throw new RuntimeException(
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 ded21f9..f26e25a 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
@@ -77,6 +77,11 @@
             Flag.baseFeature(GpuFeatures.WEBVIEW_VULKAN,
                     "Use Vulkan for composite. Requires VizForWebView and Android device and "
                             + "OS support. May crash if enabled on unsupported device."),
+            Flag.baseFeature(GpuFeatures.WEBVIEW_SURFACE_CONTROL,
+                    "Use SurfaceControl. Requires VizForWebView, WebViewZeroCopyVideo and Android "
+                            + "device and OS support."),
+            Flag.baseFeature(GpuFeatures.WEBVIEW_ZERO_COPY_VIDEO,
+                    "Avoid extra copy for video frames when possible"),
             Flag.baseFeature(VizFeatures.VIZ_FOR_WEBVIEW, "Enables Viz for WebView."),
             Flag.baseFeature(
                     VizFeatures.WEBVIEW_VULKAN_INTERMEDIATE_BUFFER, "For debugging vulkan"),
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 3befaf0..f688e9a3 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -279,6 +279,8 @@
     "capture_mode/capture_mode_feature_pod_controller.h",
     "capture_mode/capture_mode_metrics.cc",
     "capture_mode/capture_mode_metrics.h",
+    "capture_mode/capture_mode_notification_view.cc",
+    "capture_mode/capture_mode_notification_view.h",
     "capture_mode/capture_mode_session.cc",
     "capture_mode/capture_mode_session.h",
     "capture_mode/capture_mode_settings_entry_view.cc",
@@ -2185,7 +2187,6 @@
     "shelf/login_shelf_gesture_controller_unittest.cc",
     "shelf/login_shelf_view_unittest.cc",
     "shelf/scrollable_shelf_view_unittest.cc",
-    "shelf/shelf_app_button_unittest.cc",
     "shelf/shelf_application_menu_model_unittest.cc",
     "shelf/shelf_background_animator_unittest.cc",
     "shelf/shelf_button_pressed_metric_tracker_unittest.cc",
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn
index faa9339..1496d192 100644
--- a/ash/app_list/BUILD.gn
+++ b/ash/app_list/BUILD.gn
@@ -214,7 +214,6 @@
   sources = [
     "folder_image_unittest.cc",
     "test/run_all_unittests.cc",
-    "views/app_list_item_view_unittest.cc",
     "views/app_list_main_view_unittest.cc",
     "views/app_list_menu_model_adapter_unittest.cc",
     "views/app_list_view_unittest.cc",
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 3e32add..4099ec7 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -335,6 +335,13 @@
     item->SetIcon(AppListConfigType::kShared, icon);
 }
 
+void AppListControllerImpl::SetItemNotificationBadgeColor(const std::string& id,
+                                                          const SkColor color) {
+  AppListItem* item = model_->FindItem(id);
+  if (item)
+    item->SetNotificationBadgeColor(color);
+}
+
 void AppListControllerImpl::SetModelData(
     int profile_id,
     std::vector<std::unique_ptr<AppListItemMetadata>> apps,
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index 82130c7..be9f47a 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -107,6 +107,8 @@
   void SetItemMetadata(const std::string& id,
                        std::unique_ptr<AppListItemMetadata> data) override;
   void SetItemIcon(const std::string& id, const gfx::ImageSkia& icon) override;
+  void SetItemNotificationBadgeColor(const std::string& id,
+                                     const SkColor color) override;
   void SetModelData(int profile_id,
                     std::vector<std::unique_ptr<AppListItemMetadata>> apps,
                     bool is_search_engine_google) override;
diff --git a/ash/app_list/model/app_list_item.cc b/ash/app_list/model/app_list_item.cc
index c7a076f..c5177c1f 100644
--- a/ash/app_list/model/app_list_item.cc
+++ b/ash/app_list/model/app_list_item.cc
@@ -43,6 +43,16 @@
   return metadata_->icon;
 }
 
+void AppListItem::SetNotificationBadgeColor(const SkColor color) {
+  if (notification_badge_color_ == color)
+    return;
+
+  notification_badge_color_ = color;
+  for (auto& observer : observers_) {
+    observer.ItemBadgeColorChanged();
+  }
+}
+
 void AppListItem::AddObserver(AppListItemObserver* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/ash/app_list/model/app_list_item.h b/ash/app_list/model/app_list_item.h
index acc9aeb..c3b1a3ad 100644
--- a/ash/app_list/model/app_list_item.h
+++ b/ash/app_list/model/app_list_item.h
@@ -40,6 +40,8 @@
   void SetIcon(AppListConfigType config_type, const gfx::ImageSkia& icon);
   const gfx::ImageSkia& GetIcon(AppListConfigType config_type) const;
 
+  void SetNotificationBadgeColor(const SkColor color);
+
   const std::string& GetDisplayName() const {
     return short_name_.empty() ? name() : short_name_;
   }
@@ -87,6 +89,8 @@
 
   bool has_notification_badge() const { return has_notification_badge_; }
 
+  SkColor notification_badge_color() const { return notification_badge_color_; }
+
   void UpdateNotificationBadgeForTesting(bool has_badge) {
     UpdateNotificationBadge(has_badge);
   }
@@ -148,6 +152,9 @@
   // Whether this item currently has a notification badge that should be shown.
   bool has_notification_badge_ = false;
 
+  // The color for the notification badge displayed over the app icon.
+  SkColor notification_badge_color_ = SK_ColorWHITE;
+
   base::ObserverList<AppListItemObserver>::Unchecked observers_;
 
   DISALLOW_COPY_AND_ASSIGN(AppListItem);
diff --git a/ash/app_list/model/app_list_item_observer.h b/ash/app_list/model/app_list_item_observer.h
index fb7c8b5..299497c5 100644
--- a/ash/app_list/model/app_list_item_observer.h
+++ b/ash/app_list/model/app_list_item_observer.h
@@ -23,6 +23,9 @@
   // Invoked when the item's notification badge visibility is changed.
   virtual void ItemBadgeVisibilityChanged() {}
 
+  // Invoked when the item's notification badge color is changed.
+  virtual void ItemBadgeColorChanged() {}
+
   // Invoked when the item is about to be destroyed.
   virtual void ItemBeingDestroyed() {}
 
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index d793517003..8dbbd22d 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -83,32 +83,6 @@
 // icon.
 constexpr float kNotificationIndicatorPaddingRatio = 4.0f / 64.0f;
 
-constexpr SkColor kDefaultIndicatorColor = SK_ColorWHITE;
-
-// Uses the icon image to calculate the light vibrant color to be used for
-// the notification indicator.
-base::Optional<SkColor> CalculateNotificationColor(gfx::ImageSkia image) {
-  const SkBitmap* source = image.bitmap();
-  if (!source || source->empty() || source->isNull())
-    return base::nullopt;
-
-  std::vector<color_utils::ColorProfile> color_profiles;
-  color_profiles.push_back(color_utils::ColorProfile(
-      color_utils::LumaRange::LIGHT, color_utils::SaturationRange::VIBRANT));
-
-  std::vector<color_utils::Swatch> best_swatches =
-      color_utils::CalculateProminentColorsOfBitmap(
-          *source, color_profiles, nullptr /* bitmap region */,
-          color_utils::ColorSwatchFilter());
-
-  // If the best swatch color is transparent, then
-  // CalculateProminentColorsOfBitmap() failed to find a suitable color.
-  if (best_swatches.empty() || best_swatches[0].color == SK_ColorTRANSPARENT)
-    return base::nullopt;
-
-  return best_swatches[0].color;
-}
-
 // The class clips the provided folder icon image.
 class ClippedFolderIconImageSource : public gfx::CanvasImageSource {
  public:
@@ -182,8 +156,6 @@
     SchedulePaint();
   }
 
-  SkColor GetColorForTest() { return indicator_color_; }
-
  private:
   const gfx::ShadowValues shadow_values_;
   SkColor indicator_color_;
@@ -316,8 +288,9 @@
   }
 
   if (is_notification_indicator_enabled_ && !is_folder_) {
-    notification_indicator_ = AddChildView(
-        std::make_unique<AppNotificationIndicatorView>(kDefaultIndicatorColor));
+    notification_indicator_ =
+        AddChildView(std::make_unique<AppNotificationIndicatorView>(
+            item->notification_badge_color()));
     notification_indicator_->SetPaintToLayer();
     notification_indicator_->layer()->SetFillsBoundsOpaquely(false);
     notification_indicator_->SetVisible(item->has_notification_badge());
@@ -362,13 +335,6 @@
       icon, skia::ImageOperations::RESIZE_BEST, icon_bounds);
   icon_->SetImage(resized);
 
-  if (is_notification_indicator_enabled_ && notification_indicator_) {
-    base::Optional<SkColor> notification_color =
-        CalculateNotificationColor(icon_image_);
-    notification_indicator_->SetColor(
-        notification_color.value_or(kDefaultIndicatorColor));
-  }
-
   Layout();
 }
 
@@ -964,10 +930,6 @@
   return notification_indicator_ && notification_indicator_->GetVisible();
 }
 
-SkColor AppListItemView::GetNotificationIndicatorColorForTest() const {
-  return notification_indicator_->GetColorForTest();
-}
-
 void AppListItemView::AnimationProgressed(const gfx::Animation* animation) {
   DCHECK(!is_folder_);
 
@@ -1093,6 +1055,11 @@
     notification_indicator_->SetVisible(item_weak_->has_notification_badge());
 }
 
+void AppListItemView::ItemBadgeColorChanged() {
+  if (notification_indicator_)
+    notification_indicator_->SetColor(item_weak_->notification_badge_color());
+}
+
 void AppListItemView::ItemBeingDestroyed() {
   DCHECK(item_weak_);
   item_weak_->RemoveObserver(this);
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h
index 542e02b..8135655 100644
--- a/ash/app_list/views/app_list_item_view.h
+++ b/ash/app_list/views/app_list_item_view.h
@@ -150,8 +150,6 @@
 
   bool IsNotificationIndicatorShownForTest() const;
 
-  SkColor GetNotificationIndicatorColorForTest() const;
-
  private:
   class IconImageView;
   class AppNotificationIndicatorView;
@@ -229,6 +227,7 @@
   void ItemIconChanged(AppListConfigType config_type) override;
   void ItemNameChanged() override;
   void ItemBadgeVisibilityChanged() override;
+  void ItemBadgeColorChanged() override;
   void ItemBeingDestroyed() override;
 
   // ui::ImplicitAnimationObserver:
diff --git a/ash/app_list/views/app_list_item_view_unittest.cc b/ash/app_list/views/app_list_item_view_unittest.cc
deleted file mode 100644
index be2452c..0000000
--- a/ash/app_list/views/app_list_item_view_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2020 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/app_list/views/app_list_item_view.h"
-
-#include "ash/app_list/model/app_list_item.h"
-#include "ash/app_list/test/app_list_test_view_delegate.h"
-#include "ash/app_list/views/app_list_main_view.h"
-#include "ash/app_list/views/app_list_view.h"
-#include "ash/app_list/views/apps_container_view.h"
-#include "ash/app_list/views/contents_view.h"
-#include "base/test/scoped_feature_list.h"
-#include "ui/base/ui_base_features.h"
-#include "ui/gfx/color_palette.h"
-#include "ui/views/test/views_test_base.h"
-
-namespace ash {
-
-class AppListItemViewTest : public views::ViewsTestBase {
- public:
-  AppListItemViewTest() {
-    scoped_feature_list_.InitWithFeatures({features::kNotificationIndicator},
-                                          {});
-  }
-  ~AppListItemViewTest() override = default;
-
-  // views::ViewsTestBase:
-  void SetUp() override {
-    views::ViewsTestBase::SetUp();
-
-    delegate_ = std::make_unique<test::AppListTestViewDelegate>();
-    app_list_view_ = new AppListView(delegate_.get());
-    app_list_view_->InitView(GetContext());
-  }
-
-  AppListItemView* CreateAppListItemView() {
-    AppsGridView* apps_grid_view = app_list_view_->app_list_main_view()
-                                       ->contents_view()
-                                       ->apps_container_view()
-                                       ->apps_grid_view();
-    return new AppListItemView(apps_grid_view, new AppListItem("Item 0"),
-                               delegate_.get(), false);
-  }
-
- private:
-  AppListView* app_list_view_ = nullptr;
-  std::unique_ptr<test::AppListTestViewDelegate> delegate_;
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// Test that the notification indicator has a color which is calculated
-// correctly when an icon is set for the AppListItemView.
-TEST_F(AppListItemViewTest, NotificatonBadgeColor) {
-  AppListItemView* view = CreateAppListItemView();
-
-  const int width = 64;
-  const int height = 64;
-
-  SkBitmap all_black_icon;
-  all_black_icon.allocN32Pixels(width, height);
-  all_black_icon.eraseColor(SK_ColorBLACK);
-
-  view->SetIcon(gfx::ImageSkia::CreateFrom1xBitmap(all_black_icon));
-
-  // For an all black icon, a white notification badge is expected, since there
-  // is no other light vibrant color to get from the icon.
-  EXPECT_EQ(SK_ColorWHITE, view->GetNotificationIndicatorColorForTest());
-
-  // Create an icon that is half kGoogleRed300 and half kGoogleRed600.
-  SkBitmap red_icon;
-  red_icon.allocN32Pixels(width, height);
-  red_icon.eraseColor(gfx::kGoogleRed300);
-  red_icon.erase(gfx::kGoogleRed600, {0, 0, width, height / 2});
-
-  view->SetIcon(gfx::ImageSkia::CreateFrom1xBitmap(red_icon));
-
-  // For the red icon, the notification badge should calculate and use the
-  // kGoogleRed300 color as the light vibrant color taken from the icon.
-  EXPECT_EQ(gfx::kGoogleRed300, view->GetNotificationIndicatorColorForTest());
-}
-
-}  //  namespace ash
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 166cece9..2267c6e 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/capture_mode/capture_mode_metrics.h"
+#include "ash/capture_mode/capture_mode_notification_view.h"
 #include "ash/capture_mode/capture_mode_session.h"
 #include "ash/capture_mode/capture_mode_util.h"
 #include "ash/capture_mode/video_recording_watcher.h"
@@ -49,6 +50,7 @@
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/message_center/public/cpp/notification_delegate.h"
+#include "ui/message_center/views/message_view_factory.h"
 #include "ui/snapshot/snapshot.h"
 
 namespace ash {
@@ -66,6 +68,8 @@
 constexpr char kScreenCaptureStoppedNotificationId[] =
     "capture_mode_stopped_notification";
 constexpr char kScreenCaptureNotifierId[] = "ash.capture_mode_controller";
+constexpr char kScreenCaptureNotificationType[] =
+    "capture_mode_notification_type";
 
 // The format strings of the file names of captured images.
 // TODO(afakhry): Discuss with UX localizing "Screenshot" and "Screen
@@ -169,7 +173,7 @@
     const gfx::VectorIcon& notification_icon = kCaptureModeIcon) {
   const auto type = optional_fields.image.IsEmpty()
                         ? message_center::NOTIFICATION_TYPE_SIMPLE
-                        : message_center::NOTIFICATION_TYPE_IMAGE;
+                        : message_center::NOTIFICATION_TYPE_CUSTOM;
   std::unique_ptr<message_center::Notification> notification =
       CreateSystemNotification(
           type, notification_id, l10n_util::GetStringUTF16(title_id),
@@ -180,6 +184,8 @@
               message_center::NotifierType::SYSTEM_COMPONENT,
               kScreenCaptureNotifierId),
           optional_fields, delegate, notification_icon, warning_level);
+  if (type == message_center::NOTIFICATION_TYPE_CUSTOM)
+    notification->set_custom_view_type(kScreenCaptureNotificationType);
 
   // Remove the previous notification before showing the new one if there is
   // any.
@@ -297,6 +303,12 @@
           &CaptureModeController::RecordAndResetScreenshotsTakenInLastWeek,
           weak_ptr_factory_.GetWeakPtr()));
 
+  DCHECK(!message_center::MessageViewFactory::HasCustomNotificationViewFactory(
+      kScreenCaptureNotificationType));
+  message_center::MessageViewFactory::SetCustomNotificationViewFactory(
+      kScreenCaptureNotificationType,
+      base::BindRepeating(&CaptureModeNotificationView::Create));
+
   Shell::Get()->session_controller()->AddObserver(this);
   chromeos::PowerManagerClient::Get()->AddObserver(this);
 }
@@ -304,6 +316,10 @@
 CaptureModeController::~CaptureModeController() {
   chromeos::PowerManagerClient::Get()->RemoveObserver(this);
   Shell::Get()->session_controller()->RemoveObserver(this);
+  // Remove the custom notification view factory.
+  message_center::MessageViewFactory::ClearCustomNotificationViewFactory(
+      kScreenCaptureNotificationType);
+
   DCHECK_EQ(g_instance, this);
   g_instance = nullptr;
 }
diff --git a/ash/capture_mode/capture_mode_notification_view.cc b/ash/capture_mode/capture_mode_notification_view.cc
new file mode 100644
index 0000000..c60190c
--- /dev/null
+++ b/ash/capture_mode/capture_mode_notification_view.cc
@@ -0,0 +1,125 @@
+// 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 "ash/capture_mode/capture_mode_notification_view.h"
+
+#include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/strings/grit/ash_strings.h"
+#include "ash/style/ash_color_provider.h"
+#include "ash/style/scoped_light_mode_as_default.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/background.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+namespace {
+
+// Constants related to the banner view on the image capture notification.
+constexpr int kBannerHeightDip = 36;
+constexpr int kBannerHorizontalInsetDip = 12;
+constexpr int kBannerVerticalInsetDip = 8;
+constexpr int kBannerIconTextSpacingDip = 8;
+constexpr int kBannerIconSizeDip = 20;
+
+// Creates the banner view that will show on top of the notification image.
+std::unique_ptr<views::View> CreateBannerViewImpl() {
+  std::unique_ptr<views::View> banner_view = std::make_unique<views::View>();
+
+  // Use the light mode as default as notification is still using light
+  // theme as the default theme.
+  ScopedLightModeAsDefault scoped_light_mode_as_default;
+
+  auto* color_provider = AshColorProvider::Get();
+  const SkColor background_color = color_provider->GetControlsLayerColor(
+      AshColorProvider::ControlsLayerType::kControlBackgroundColorActive);
+  // The text and icon are showing on the background with |background_color|
+  // so its color is same with kButtonLabelColorPrimary although they're
+  // not theoretically showing on a button.
+  const SkColor text_icon_color = color_provider->GetContentLayerColor(
+      AshColorProvider::ContentLayerType::kButtonLabelColorPrimary);
+  auto layout = std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kHorizontal,
+      gfx::Insets(kBannerVerticalInsetDip, kBannerHorizontalInsetDip),
+      kBannerIconTextSpacingDip);
+  banner_view->SetLayoutManager(std::move(layout));
+  banner_view->SetBackground(views::CreateSolidBackground(background_color));
+
+  views::ImageView* icon =
+      banner_view->AddChildView(std::make_unique<views::ImageView>());
+  icon->SetImage(gfx::CreateVectorIcon(kCaptureModeCopiedToClipboardIcon,
+                                       kBannerIconSizeDip, text_icon_color));
+
+  views::Label* label = banner_view->AddChildView(
+      std::make_unique<views::Label>(l10n_util::GetStringUTF16(
+          IDS_ASH_SCREEN_CAPTURE_SCREENSHOT_COPIED_TO_CLIPBOARD)));
+  label->SetBackgroundColor(background_color);
+  label->SetEnabledColor(text_icon_color);
+
+  return banner_view;
+}
+
+}  // namespace
+
+CaptureModeNotificationView::CaptureModeNotificationView(
+    const message_center::Notification& notification)
+    : message_center::NotificationViewMD(notification) {
+  // Create the banner view if notification image is not empty. The banner
+  // will show on top of the notification image.
+  if (!notification.image().IsEmpty())
+    CreateBannerView();
+
+  // We need to observe this view as |this| view will be re-used for
+  // notifications for with/without image scenarios if |this| is not destroyed
+  // by the user or by the timeout before the next notification shows up.
+  views::View::AddObserver(this);
+}
+
+CaptureModeNotificationView::~CaptureModeNotificationView() = default;
+
+// static
+std::unique_ptr<message_center::MessageView>
+CaptureModeNotificationView::Create(
+    const message_center::Notification& notification) {
+  return std::make_unique<CaptureModeNotificationView>(notification);
+}
+
+void CaptureModeNotificationView::Layout() {
+  message_center::NotificationViewMD::Layout();
+  if (!banner_view_)
+    return;
+
+  // Calculate the banner view's desired bounds.
+  gfx::Rect banner_bounds = image_container_view()->GetContentsBounds();
+  banner_bounds.set_y(banner_bounds.bottom() - kBannerHeightDip);
+  banner_bounds.set_height(kBannerHeightDip);
+  banner_view_->SetBoundsRect(banner_bounds);
+}
+
+void CaptureModeNotificationView::OnChildViewAdded(views::View* observed_view,
+                                                   views::View* child) {
+  if (observed_view == this && child == image_container_view())
+    CreateBannerView();
+}
+
+void CaptureModeNotificationView::OnChildViewRemoved(views::View* observed_view,
+                                                     views::View* child) {
+  if (observed_view == this && child == image_container_view())
+    banner_view_ = nullptr;
+}
+
+void CaptureModeNotificationView::OnViewIsDeleting(View* observed_view) {
+  DCHECK_EQ(observed_view, this);
+  views::View::RemoveObserver(this);
+}
+
+void CaptureModeNotificationView::CreateBannerView() {
+  DCHECK(image_container_view());
+  DCHECK(!image_container_view()->children().empty());
+  DCHECK(!banner_view_);
+  banner_view_ = image_container_view()->AddChildView(CreateBannerViewImpl());
+}
+
+}  // namespace ash
diff --git a/ash/capture_mode/capture_mode_notification_view.h b/ash/capture_mode/capture_mode_notification_view.h
new file mode 100644
index 0000000..f8b18562
--- /dev/null
+++ b/ash/capture_mode/capture_mode_notification_view.h
@@ -0,0 +1,53 @@
+// 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 ASH_CAPTURE_MODE_CAPTURE_MODE_NOTIFICATION_VIEW_H_
+#define ASH_CAPTURE_MODE_CAPTURE_MODE_NOTIFICATION_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ui/message_center/views/notification_view_md.h"
+#include "ui/views/view_observer.h"
+
+namespace ash {
+
+// A customized notification view for capture mode that can show a notification
+// with a banner on top of the notification image.
+class ASH_EXPORT CaptureModeNotificationView
+    : public message_center::NotificationViewMD,
+      public views::ViewObserver {
+ public:
+  explicit CaptureModeNotificationView(
+      const message_center::Notification& notification);
+  CaptureModeNotificationView(const CaptureModeNotificationView&) = delete;
+  CaptureModeNotificationView& operator=(const CaptureModeNotificationView&) =
+      delete;
+  ~CaptureModeNotificationView() override;
+
+  // Creates the custom capture mode notification for image capture
+  // notification. There is a banner on top of the image area of the
+  // notification to indicate the image has been copied to clipboard.
+  static std::unique_ptr<message_center::MessageView> Create(
+      const message_center::Notification& notification);
+
+  // message_center::NotificationViewMD:
+  void Layout() override;
+
+  // views::ViewObserver:
+  void OnChildViewAdded(views::View* observed_view,
+                        views::View* child) override;
+  void OnChildViewRemoved(views::View* observed_view,
+                          views::View* child) override;
+  void OnViewIsDeleting(View* observed_view) override;
+
+ private:
+  void CreateBannerView();
+
+  // The banner view that shows a banner string on top of the captured image.
+  // Owned by view hierarchy.
+  views::View* banner_view_ = nullptr;
+};
+
+}  // namespace ash
+
+#endif  // ASH_CAPTURE_MODE_CAPTURE_MODE_NOTIFICATION_VIEW_H_
diff --git a/ash/frame/wide_frame_view.cc b/ash/frame/wide_frame_view.cc
index 75a12fe..13b05779 100644
--- a/ash/frame/wide_frame_view.cc
+++ b/ash/frame/wide_frame_view.cc
@@ -85,8 +85,7 @@
   header_view_->UpdateCaptionButtons();
 }
 
-WideFrameView::WideFrameView(views::Widget* target)
-    : target_(target), widget_(std::make_unique<views::Widget>()) {
+WideFrameView::WideFrameView(views::Widget* target) : target_(target) {
   // WideFrameView is owned by its client, not by Views.
   SetOwnedByWidget(false);
   display::Screen::GetScreen()->AddObserver(this);
@@ -109,8 +108,9 @@
   // Setup Opacity Control.
   // WideFrame should be used only when the rounded corner is not necessary.
   params.opacity = views::Widget::InitParams::WindowOpacity::kOpaque;
-
-  widget_->Init(std::move(params));
+  auto widget = std::make_unique<views::Widget>();
+  widget->Init(std::move(params));
+  widget_ = std::move(widget);
 
   aura::Window* window = widget_->GetNativeWindow();
   // Overview normally clips the caption container which exists on the same
@@ -172,7 +172,8 @@
                                             uint32_t changed_metrics) {
   display::Screen* screen = display::Screen::GetScreen();
   if (screen->GetDisplayNearestWindow(target_->GetNativeWindow()).id() !=
-      display.id()) {
+          display.id() ||
+      !widget_) {
     return;
   }
   DCHECK(target_);
diff --git a/ash/public/cpp/app_list/app_list_controller.h b/ash/public/cpp/app_list/app_list_controller.h
index dcef1d4..0de6defd 100644
--- a/ash/public/cpp/app_list/app_list_controller.h
+++ b/ash/public/cpp/app_list/app_list_controller.h
@@ -83,6 +83,9 @@
   virtual void SetItemIcon(const std::string& id,
                            const gfx::ImageSkia& icon) = 0;
 
+  virtual void SetItemNotificationBadgeColor(const std::string& id,
+                                             const SkColor color) = 0;
+
   // Update the whole model, usually when profile changes happen in Chrome.
   virtual void SetModelData(
       int profile_id,
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
index 40095893..7529b67 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
@@ -137,9 +137,8 @@
 
     surface_manager_ = std::make_unique<ArcNotificationSurfaceManagerImpl>();
 
-    message_center::MessageViewFactory::
-        ClearCustomNotificationViewFactoryForTest(
-            kArcNotificationCustomViewType);
+    message_center::MessageViewFactory::ClearCustomNotificationViewFactory(
+        kArcNotificationCustomViewType);
     ArcNotificationManager::SetCustomNotificationViewFactory();
   }
 
@@ -347,7 +346,7 @@
 TEST_F(ArcNotificationContentViewTest, CloseButtonInMessageCenterView) {
   std::string notification_key("notification id");
 
-  message_center::MessageViewFactory::ClearCustomNotificationViewFactoryForTest(
+  message_center::MessageViewFactory::ClearCustomNotificationViewFactory(
       kArcNotificationCustomViewType);
 
   // Override MessageView factory to capture the created notification view in
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc b/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
index 98e73a1..7ef35cd 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
@@ -68,9 +68,8 @@
 
     item_ = std::make_unique<MockArcNotificationItem>(kDefaultNotificationKey);
 
-    message_center::MessageViewFactory::
-        ClearCustomNotificationViewFactoryForTest(
-            kArcNotificationCustomViewType);
+    message_center::MessageViewFactory::ClearCustomNotificationViewFactory(
+        kArcNotificationCustomViewType);
     message_center::MessageViewFactory::SetCustomNotificationViewFactory(
         kArcNotificationCustomViewType,
         base::BindRepeating(
diff --git a/ash/public/cpp/shelf_item.h b/ash/public/cpp/shelf_item.h
index 3bfb73f..5d58a73 100644
--- a/ash/public/cpp/shelf_item.h
+++ b/ash/public/cpp/shelf_item.h
@@ -33,6 +33,8 @@
   // The title to display for tooltips, etc.
   base::string16 title;
 
+  SkColor notification_badge_color = SK_ColorWHITE;
+
   // App status.
   AppStatus app_status = AppStatus::kReady;
 
diff --git a/ash/shelf/shelf_app_button.cc b/ash/shelf/shelf_app_button.cc
index b8114df..683bd6a 100644
--- a/ash/shelf/shelf_app_button.cc
+++ b/ash/shelf/shelf_app_button.cc
@@ -70,30 +70,6 @@
 // The drag and drop app icon scaling up or down animation transition duration.
 constexpr int kDragDropAppIconScaleTransitionMs = 200;
 
-// Uses the icon image to calculate the light vibrant color to be used for
-// the notification indicator.
-base::Optional<SkColor> CalculateNotificationColor(gfx::ImageSkia image) {
-  const SkBitmap* source = image.bitmap();
-  if (!source || source->empty() || source->isNull())
-    return base::nullopt;
-
-  std::vector<color_utils::ColorProfile> color_profiles;
-  color_profiles.push_back(color_utils::ColorProfile(
-      color_utils::LumaRange::LIGHT, color_utils::SaturationRange::VIBRANT));
-
-  std::vector<color_utils::Swatch> best_swatches =
-      color_utils::CalculateProminentColorsOfBitmap(
-          *source, color_profiles, nullptr /* bitmap region */,
-          color_utils::ColorSwatchFilter());
-
-  // If the best swatch color is transparent, then
-  // CalculateProminentColorsOfBitmap() failed to find a suitable color.
-  if (best_swatches.empty() || best_swatches[0].color == SK_ColorTRANSPARENT)
-    return base::nullopt;
-
-  return best_swatches[0].color;
-}
-
 // Simple AnimationDelegate that owns a single ThrobAnimation instance to
 // keep all Draw Attention animations in sync.
 class ShelfAppButtonAnimation : public gfx::AnimationDelegate {
@@ -207,8 +183,6 @@
     SchedulePaint();
   }
 
-  SkColor GetColorForTest() { return indicator_color_; }
-
  private:
   SkColor indicator_color_;
 
@@ -420,13 +394,6 @@
   }
   icon_image_ = image;
 
-  if (is_notification_indicator_enabled_) {
-    base::Optional<SkColor> notification_color =
-        CalculateNotificationColor(icon_image_);
-    notification_indicator_->SetColor(
-        notification_color.value_or(kDefaultIndicatorColor));
-  }
-
   const int icon_size = shelf_view_->GetButtonIconSize() * icon_scale_;
 
   // Resize the image maintaining our aspect ratio.
@@ -1009,8 +976,9 @@
   }
 }
 
-SkColor ShelfAppButton::GetNotificationIndicatorColorForTest() {
-  return notification_indicator_->GetColorForTest();
+void ShelfAppButton::SetNotificationBadgeColor(SkColor color) {
+  if (notification_indicator_)
+    notification_indicator_->SetColor(color);
 }
 
 }  // namespace ash
diff --git a/ash/shelf/shelf_app_button.h b/ash/shelf/shelf_app_button.h
index 45ce16b..ca6e38dd 100644
--- a/ash/shelf/shelf_app_button.h
+++ b/ash/shelf/shelf_app_button.h
@@ -119,8 +119,7 @@
   // Return the bounds in the local coordinates enclosing the small ripple area.
   gfx::Rect CalculateSmallRippleArea() const;
 
-  // Gets the color of the |notification_indicator_| for test usage.
-  SkColor GetNotificationIndicatorColorForTest();
+  void SetNotificationBadgeColor(SkColor color);
 
  protected:
   // ui::EventHandler:
diff --git a/ash/shelf/shelf_app_button_unittest.cc b/ash/shelf/shelf_app_button_unittest.cc
deleted file mode 100644
index 060e5c7a..0000000
--- a/ash/shelf/shelf_app_button_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2020 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/shelf/shelf_app_button.h"
-
-#include "ash/shelf/shelf_test_util.h"
-#include "ash/shelf/shelf_view.h"
-#include "ash/shelf/shelf_view_test_api.h"
-#include "ash/test/ash_test_base.h"
-#include "base/test/scoped_feature_list.h"
-#include "ui/base/ui_base_features.h"
-#include "ui/gfx/color_palette.h"
-
-namespace ash {
-
-class ShelfAppButtonTest : public AshTestBase {
- public:
-  ShelfAppButtonTest() {
-    scoped_feature_list_.InitWithFeatures({features::kNotificationIndicator},
-                                          {});
-  }
-  ~ShelfAppButtonTest() override = default;
-
-  // AshTestBase:
-  void SetUp() override {
-    AshTestBase::SetUp();
-
-    test_api_.reset(
-        new ShelfViewTestAPI(GetPrimaryShelf()->GetShelfViewForTesting()));
-  }
-
-  void TearDown() override {
-    test_api_.reset();
-    AshTestBase::TearDown();
-  }
-
-  ShelfViewTestAPI* test_api() { return test_api_.get(); }
-
-  void SetImageForButton(int button_num, gfx::ImageSkia image) {
-    test_api()->GetButton(button_num)->SetImage(image);
-  }
-
-  SkColor GetNotificationColorForButton(int button_num) {
-    return test_api()
-        ->GetButton(button_num)
-        ->GetNotificationIndicatorColorForTest();
-  }
-
- private:
-  std::unique_ptr<ShelfViewTestAPI> test_api_;
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// Test that the notification indicator has a color which is calculated
-// correctly when an image is set for the ShelfAppButton.
-TEST_F(ShelfAppButtonTest, NotificatonBadgeColor) {
-  ShelfTestUtil::AddAppShortcut("app_id", TYPE_PINNED_APP);
-
-  const int width = 64;
-  const int height = 64;
-
-  SkBitmap all_black_icon;
-  all_black_icon.allocN32Pixels(width, height);
-  all_black_icon.eraseColor(SK_ColorBLACK);
-
-  SetImageForButton(0, gfx::ImageSkia::CreateFrom1xBitmap(all_black_icon));
-
-  // For an all black icon, a white notification badge is expected, since there
-  // is no other light vibrant color to get from the icon.
-  EXPECT_EQ(SK_ColorWHITE, GetNotificationColorForButton(0));
-
-  // Create an icon that is half kGoogleRed300 and half kGoogleRed600.
-  SkBitmap red_icon;
-  red_icon.allocN32Pixels(width, height);
-  red_icon.eraseColor(gfx::kGoogleRed300);
-  red_icon.erase(gfx::kGoogleRed600, {0, 0, width, height / 2});
-
-  SetImageForButton(0, gfx::ImageSkia::CreateFrom1xBitmap(red_icon));
-
-  // For the red icon, the notification badge should calculate and use the
-  // kGoogleRed300 color as the light vibrant color taken from the icon.
-  EXPECT_EQ(gfx::kGoogleRed300, GetNotificationColorForButton(0));
-}
-
-}  // namespace ash
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 2d7c8e9..dfb6d957 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -1033,6 +1033,7 @@
       ShelfAppButton* button = new ShelfAppButton(
           this, shelf_button_delegate_ ? shelf_button_delegate_ : this);
       button->SetImage(item.image);
+      button->SetNotificationBadgeColor(item.notification_badge_color);
       button->ReflectItemStatus(item);
       view = button;
       break;
@@ -2121,6 +2122,7 @@
       ShelfAppButton* button = static_cast<ShelfAppButton*>(view);
       button->ReflectItemStatus(item);
       button->SetImage(item.image);
+      button->SetNotificationBadgeColor(item.notification_badge_color);
       button->SchedulePaint();
       break;
     }
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index f5fea0b3..bc1cb22 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -668,7 +668,7 @@
 <translation id="6818242057446442178">Riječ unazad</translation>
 <translation id="6820676911989879663">Odmori se!</translation>
 <translation id="6850010208275816200">Trenutna aplikacija je prikazana preko cijelog ekrana. Ako vam aplikacija zatraži lozinku, prvo izađite iz prikaza preko cijelog ekrana.</translation>
-<translation id="6852052252232534364">Klik da aktiv.</translation>
+<translation id="6852052252232534364">Kliknite da aktivirate</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> s</translation>
 <translation id="6857811139397017780">Aktiviraj <ph name="NETWORKSERVICE" /></translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Preostala je jedna cifra}one{Preostala je # cifra}few{Preostale su # cifre}other{Preostalo je # cifara}}</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index aa0f140..f58d548 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">Zurück um ein Wort</translation>
 <translation id="6820676911989879663">Zeit für eine Pause.</translation>
 <translation id="6850010208275816200">Ihre aktuelle App wird im Vollbildmodus angezeigt. Wenn Sie von der App nach Ihrem Passwort gefragt werden, beenden Sie zuerst den Vollbildmodus.</translation>
+<translation id="6852052252232534364">Zum Aktivieren klicken</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> Sek.</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> aktivieren</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Noch eine Ziffer}other{Noch # Ziffern}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">Kamera wird verwendet.</translation>
 <translation id="742608627846767349">Guten Morgen,</translation>
 <translation id="743058460480092004">Kamera und Mikrofon werden verwendet.</translation>
+<translation id="7434543979546293336">Als wichtige Idee markiert</translation>
 <translation id="7452560014878697800">Eine Anwendung verwendet Ihre Kamera</translation>
 <translation id="7456049842111127849">Aufnahmemodus – die Standardeinstellung ist <ph name="TYPE" /> (<ph name="SOURCE" />).</translation>
 <translation id="7461924472993315131">Anpinnen</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index 2882ae8..9f6abab 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -669,6 +669,7 @@
 <translation id="6818242057446442178">Joan aurreko hitzera</translation>
 <translation id="6820676911989879663">Hartu atseden</translation>
 <translation id="6850010208275816200">Pantaila osoko moduan dago uneko aplikazioa. Aplikazioak pasahitza eskatzen badizu, lehenik atera pantaila osoko modutik.</translation>
+<translation id="6852052252232534364">Sakatu aktibatzeko</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> s</translation>
 <translation id="6857811139397017780">Aktibatu <ph name="NETWORKSERVICE" /></translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{1 zenbaki geratzen da}other{# zenbaki geratzen dira}}</translation>
@@ -729,6 +730,7 @@
 <translation id="742594950370306541">Kamera abian da.</translation>
 <translation id="742608627846767349">Egun on:</translation>
 <translation id="743058460480092004">Norbait kamera eta mikrofonoa erabiltzen ari da.</translation>
+<translation id="7434543979546293336">Ideia nagusi gisa markatu da</translation>
 <translation id="7452560014878697800">Aplikazio bat kamera erabiltzen ari da</translation>
 <translation id="7456049842111127849">Edukia kapturatzeko modua. Balio lehenetsia <ph name="TYPE" /> <ph name="SOURCE" /> da.</translation>
 <translation id="7461924472993315131">Ainguratu</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 404ca3f7c..ca7afc0 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">Reculer par mot</translation>
 <translation id="6820676911989879663">Faites une pause !</translation>
 <translation id="6850010208275816200">Votre application actuelle est en plein écran. Si elle vous demande votre mot de passe, quittez d'abord le mode plein écran.</translation>
+<translation id="6852052252232534364">Cliquer pour activer</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> s</translation>
 <translation id="6857811139397017780">Activer <ph name="NETWORKSERVICE" /></translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{1 chiffre manquant}one{# chiffre manquant}other{# chiffres manquants}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">La caméra est en cours d'utilisation.</translation>
 <translation id="742608627846767349">Bonjour,</translation>
 <translation id="743058460480092004">La caméra et le micro sont en cours d'utilisation.</translation>
+<translation id="7434543979546293336">Indiquée comme idée principale</translation>
 <translation id="7452560014878697800">Une application utilise la caméra</translation>
 <translation id="7456049842111127849">Mode de capture, la valeur par défaut est : <ph name="TYPE" /> <ph name="SOURCE" />.</translation>
 <translation id="7461924472993315131">Épingler</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb
index 2c863ef..80b9be3 100644
--- a/ash/strings/ash_strings_gl.xtb
+++ b/ash/strings/ash_strings_gl.xtb
@@ -669,6 +669,7 @@
 <translation id="6818242057446442178">Retroceder unha palabra</translation>
 <translation id="6820676911989879663">Fai unha pausa!</translation>
 <translation id="6850010208275816200">A aplicación actual está aberta a pantalla completa. Se che pide o contrasinal, primeiro tes que saír do modo de pantalla completa.</translation>
+<translation id="6852052252232534364">Facer clic para activar</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> s</translation>
 <translation id="6857811139397017780">Activar <ph name="NETWORKSERVICE" /></translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{Falta un díxito}other{Faltan # díxitos}}</translation>
@@ -729,6 +730,7 @@
 <translation id="742594950370306541">Estase utilizando a cámara.</translation>
 <translation id="742608627846767349">Bos días!</translation>
 <translation id="743058460480092004">Estanse utilizando a cámara e o micrófono.</translation>
+<translation id="7434543979546293336">Marcouse como idea clave</translation>
 <translation id="7452560014878697800">Unha aplicación está utilizando a túa cámara</translation>
 <translation id="7456049842111127849">Modo de captura. A configuración predeterminada é <ph name="TYPE" /> <ph name="SOURCE" />.</translation>
 <translation id="7461924472993315131">Marcar cun alfinete</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 9d49fff16..a2b0287b 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -666,6 +666,7 @@
 <translation id="6818242057446442178">ഒരു വാക്ക് പിന്നിലേക്ക് പോവുക</translation>
 <translation id="6820676911989879663">ഒരു ഇടവേള എടുക്കൂ!</translation>
 <translation id="6850010208275816200">നിങ്ങളുടെ നിലവിലെ ആപ്പ് പൂർണ്ണ സ്ക്രീനിൽ ആണ്. ആപ്പ് നിങ്ങളുടെ പാസ്‌വേഡ് ആവശ്യപ്പെടുകയാണെങ്കിൽ ആദ്യം പൂർണ്ണ സ്ക്രീനിൽ നിന്ന് പുറത്ത് കടക്കുക.</translation>
+<translation id="6852052252232534364">ക്ലിക്ക് ചെയ്ത് സജീവമാക്കൂ</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> sec</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> സജീവമാക്കുക</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{ഒരു അക്കം ശേഷിക്കുന്നു}other{# അക്കങ്ങൾ ശേഷിക്കുന്നു}}</translation>
@@ -726,6 +727,7 @@
 <translation id="742594950370306541">ക്യാമറ ഉപയോഗത്തിലാണ്.</translation>
 <translation id="742608627846767349">ഗുഡ്മോണിംഗ്,</translation>
 <translation id="743058460480092004">ക്യാമറയും മൈക്രോഫോണും ഉപയോഗത്തിലാണ്.</translation>
+<translation id="7434543979546293336">പ്രധാന ആശയമായി അടയാളപ്പെടുത്തി</translation>
 <translation id="7452560014878697800">ഒരു ആപ്പ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation>
 <translation id="7456049842111127849">ക്യാപ്‌ചർ മോഡ്, <ph name="SOURCE" /> <ph name="TYPE" /> ഡിഫോൾട്ട് ആണ്.</translation>
 <translation id="7461924472993315131">പിൻ ചെയ്യുക</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index 67f3030c..38d98ba 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">कर्सरलाई एक शब्द पछाडि लैजानुहोस्</translation>
 <translation id="6820676911989879663">विश्राम लिनुहोस्!</translation>
 <translation id="6850010208275816200">तपाईंले अहिले प्रयोग गरिरहनुभएको एप फुल स्क्रिन मोडमा चलिरहेको छ। तपाईंले यो एपमा पासवर्ड हाल्नु पर्ने भएमा फुल स्क्रिन मोडबाट बाहिरिएपछि मात्र पासवर्ड हाल्नुहोला।</translation>
+<translation id="6852052252232534364">सक्रिय गर्न क्लिक गर्नुहोस्</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> सेकेन्ड</translation>
 <translation id="6857811139397017780">सक्रिय <ph name="NETWORKSERVICE" /></translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{एउटा अङ्क बाँकी छ}other{# वटा अङ्क बाँकी छन्}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">क्यामेरा प्रयोगमा छ।</translation>
 <translation id="742608627846767349">नमस्ते,</translation>
 <translation id="743058460480092004">क्यामेरा र माइक्रोफोन प्रयोगमा छ।</translation>
+<translation id="7434543979546293336">यो मुख्य विचारका रूपमा चिन्ह लगाइएको छ</translation>
 <translation id="7452560014878697800">कुनै एपले तपाईंको यन्त्रको क्यामेरा प्रयोग गरिरहेको छ</translation>
 <translation id="7456049842111127849">क्याप्चर मोड, पूर्वनिर्धारित मोड <ph name="SOURCE" /> <ph name="TYPE" /> हो।</translation>
 <translation id="7461924472993315131">पिन</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index 0785a06..d1c5e482 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">ଗୋଟିଏ ଶବ୍ଦ ପଛକୁ ଫେରନ୍ତୁ</translation>
 <translation id="6820676911989879663">ଏକ ବିରତି ନିଅନ୍ତୁ!</translation>
 <translation id="6850010208275816200">ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଆପ୍ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ ମୋଡରେ ଅଛି। ଯଦି ଆପ୍ ଆପଣଙ୍କ ପାସୱାର୍ଡ ପଚାରେ ତେବେ ପ୍ରଥମେ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ ମୋଡରୁ ବାହାରି ଯାଆନ୍ତୁ।</translation>
+<translation id="6852052252232534364">ସକ୍ରିୟ କରିବାକୁ କ୍ଲିକ୍ କରନ୍ତୁ</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> ସେ</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> ସକ୍ରିୟ କରନ୍ତୁ</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{ଗୋଟିଏ ଅଙ୍କ ବାକି ଅଛି}other{#ଟି ଅଙ୍କ ବାକି ଅଛି}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">କ୍ୟାମେରା ବ୍ୟବହାରରେ ଅଛି।</translation>
 <translation id="742608627846767349">ସୁପ୍ରଭାତ,</translation>
 <translation id="743058460480092004">କ୍ୟାମେରା ଓ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାରରେ ଅଛି।</translation>
+<translation id="7434543979546293336">ମୁଖ୍ୟ ଆଇଡିଆ ଭାବରେ ଚିହ୍ନଟ କରାଯାଇଛି</translation>
 <translation id="7452560014878697800">ଏକ ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କ କ୍ୟାମେରାକୁ ବ୍ୟବହାର କରୁଛି</translation>
 <translation id="7456049842111127849">କ୍ୟାପଚର୍ ମୋଡ୍, ଡିଫଲ୍ଟ ହେଉଛି <ph name="SOURCE" /> <ph name="TYPE" />।</translation>
 <translation id="7461924472993315131">ପିନ୍‍</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index b4231683..0a5e771 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -666,6 +666,7 @@
 <translation id="6818242057446442178">ਇੱਕ ਸ਼ਬਦ ਪਿੱਛੇ ਜਾਓ</translation>
 <translation id="6820676911989879663">ਥੋੜ੍ਹੀ ਦੇਰ ਆਰਾਮ ਕਰੋ!</translation>
 <translation id="6850010208275816200">ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਐਪ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ ਵਿੱਚ ਹੈ। ਜੇ ਐਪ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਪੁੱਛਦੀ ਹੈ, ਤਾਂ ਪਹਿਲਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ।</translation>
+<translation id="6852052252232534364">ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> ਸਕਿੰਟ</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> ਨੂੰ ਐਕਟੀਵੇਟ ਕਰੋ</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{ਇੱਕ ਅੰਕ ਬਾਕੀ}one{# ਅੰਕ ਬਾਕੀ}other{# ਅੰਕ ਬਾਕੀ}}</translation>
@@ -726,6 +727,7 @@
 <translation id="742594950370306541">ਕੈਮਰਾ ਵਰਤੋਂ ਵਿੱਚ ਹੈ।</translation>
 <translation id="742608627846767349">ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ,</translation>
 <translation id="743058460480092004">ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫੋਨ ਵਰਤੋਂ ਵਿੱਚ ਹਨ।</translation>
+<translation id="7434543979546293336">ਮੁੱਖ ਵਿਚਾਰ ਵਜੋਂ ਨਿਸ਼ਾਨਦੇਹੀ ਕੀਤੀ ਗਈ</translation>
 <translation id="7452560014878697800">ਐਪਲੀਕੇਸ਼ਨ ਵੱਲੋਂ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="7456049842111127849">ਕੈਪਚਰ ਮੋਡ, <ph name="SOURCE" /> <ph name="TYPE" /> ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਹੈ।</translation>
 <translation id="7461924472993315131">Pin</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index afdc084a..7e16516 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">சொல் வாரியாகப் பின்செல்</translation>
 <translation id="6820676911989879663">சிறிது நேரம் இடைவேளை எடுத்துக்கொள்ளவும்!</translation>
 <translation id="6850010208275816200">தற்போதைய ஆப்ஸ் முழுத்திரையில் உள்ளது. கடவுச்சொல்லை உள்ளிடுமாறு ஆப்ஸில் கேட்கப்பட்டால் முதலில் முழுத்திரையிலிருந்து வெளியேறவும்.</translation>
+<translation id="6852052252232534364">கிளிக் செய்க</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> வி</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> ஐ செயல்படுத்து</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{இன்னும் ஓர் இலக்கத்தை உள்ளிட வேண்டும்}other{இன்னும் # இலக்கங்களை உள்ளிட வேண்டும்}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">கேமரா பயன்பாட்டில் உள்ளது.</translation>
 <translation id="742608627846767349">காலை வணக்கம்,</translation>
 <translation id="743058460480092004">கேமராவும் மைக்ரோஃபோனும் பயன்பாட்டில் உள்ளன.</translation>
+<translation id="7434543979546293336">முக்கிய யோசனையாகக் குறிக்கப்பட்டது</translation>
 <translation id="7452560014878697800">உங்கள் கேமராவை ஆப்ஸ் பயன்படுத்துகிறது</translation>
 <translation id="7456049842111127849">படமெடுப்புப் பயன்முறையின் இயல்பு நிலை <ph name="SOURCE" /> <ph name="TYPE" />.</translation>
 <translation id="7461924472993315131">நிலையாக வை</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 28872fa2..fd464bd6 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -669,6 +669,7 @@
 <translation id="6818242057446442178">ఒక పదం వెనుకకు</translation>
 <translation id="6820676911989879663">విరామం తీసుకోండి!</translation>
 <translation id="6850010208275816200">మీ ప్రస్తుత యాప్ ఫుల్ స్క్రీన్ మోడ్‌లో ఉంది. యాప్ మీ పాస్‌వర్డ్ కోసం అడిగితే మొదట ఫుల్ స్క్రీన్ నుండి నిష్క్రమించండి.</translation>
+<translation id="6852052252232534364">యాక్టివేట్ చేయడానికి క్లిక్ చేయండి</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> సెక</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" />ని సక్రియం చేయి</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{ఒక అంకె మిగిలింది}other{# అంకెలు మిగిలాయి}}</translation>
@@ -729,6 +730,7 @@
 <translation id="742594950370306541">కెమెరా ఉపయోగంలో ఉంది.</translation>
 <translation id="742608627846767349">శుభోదయం,</translation>
 <translation id="743058460480092004">కెమెరా మరియు మైక్రోఫోన్ ఉపయోగంలో ఉన్నాయి.</translation>
+<translation id="7434543979546293336">ముఖ్య ఐడియాగా మార్క్ చేయబడింది</translation>
 <translation id="7452560014878697800">ఒక యాప్ మీ కెమెరాను ఉపయోగిస్తోంది</translation>
 <translation id="7456049842111127849">క్యాప్చర్ మోడ్, ఆటోమేటిక్ సెట్టింగ్ <ph name="SOURCE" /> <ph name="TYPE" />.</translation>
 <translation id="7461924472993315131">పిన్ చేయి</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index ac228c0..465d47f1 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -668,6 +668,7 @@
 <translation id="6818242057446442178">ایک لفظ پیچھے جائیں</translation>
 <translation id="6820676911989879663">تھوڑا وقفہ لیں!</translation>
 <translation id="6850010208275816200">آپ کی موجودہ ایپ فُل اسکرین وضع میں ہے۔ اگر ایپ آپ کے پاس ورڈ کا مطالبہ کرتی ہے تو پہلے فُل اسکرین وضع سے باہر نکلیں۔</translation>
+<translation id="6852052252232534364">کلک برائے فعال</translation>
 <translation id="6857725247182211756"><ph name="SECONDS" /> سیکنڈ</translation>
 <translation id="6857811139397017780"><ph name="NETWORKSERVICE" /> فعال کریں</translation>
 <translation id="685782768769951078">{NUM_DIGITS,plural, =1{ایک ہندسہ باقی ہے}other{# ہندسے باقی ہیں}}</translation>
@@ -728,6 +729,7 @@
 <translation id="742594950370306541">کیمرا زیر استعمال ہے۔</translation>
 <translation id="742608627846767349">صبح بخیر،</translation>
 <translation id="743058460480092004">کیمرا اور مائیکروفون زیر استعمال ہیں۔</translation>
+<translation id="7434543979546293336">اہم تصور کے طور پر نشان زد کیا گیا ہے</translation>
 <translation id="7452560014878697800">ایک ایپلیکیشن آپ کا کیمرا استعمال کر رہی ہے</translation>
 <translation id="7456049842111127849">کیپچر وضع، <ph name="SOURCE" /> <ph name="TYPE" /> ڈیفالٹ موڈ ہے۔</translation>
 <translation id="7461924472993315131">پن کریں</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index 775cedd8..6fc3aee 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -729,7 +729,7 @@
 <translation id="742594950370306541">相機正在使用中。</translation>
 <translation id="742608627846767349">早晨,</translation>
 <translation id="743058460480092004">相機和麥克風正在使用中。</translation>
-<translation id="7434543979546293336">已標示為重要提案</translation>
+<translation id="7434543979546293336">已標記為重要想法</translation>
 <translation id="7452560014878697800">某個應用程式正在使用攝錄機</translation>
 <translation id="7456049842111127849">擷取模式,預設係<ph name="SOURCE" /><ph name="TYPE" />。</translation>
 <translation id="7461924472993315131">Pin</translation>
diff --git a/ash/system/power/power_button_controller.cc b/ash/system/power/power_button_controller.cc
index 0c3ccfa..b66ef83 100644
--- a/ash/system/power/power_button_controller.cc
+++ b/ash/system/power/power_button_controller.cc
@@ -140,7 +140,10 @@
 
 void PowerButtonController::OnPreShutdownTimeout() {
   lock_state_controller_->StartShutdownAnimation(ShutdownReason::POWER_BUTTON);
-  DCHECK(menu_widget_);
+  // |menu_widget_| might be reset on login status change while shutting down.
+  if (!menu_widget_)
+    return;
+
   static_cast<PowerButtonMenuScreenView*>(menu_widget_->GetContentsView())
       ->power_button_menu_view()
       ->FocusPowerOffButton();
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index efd42a8..046e5c5 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -196,6 +196,12 @@
       count_ += visible_desk_changes;
   }
 
+  // Fires |timer_| immediately.
+  void FireTimerForTesting() {
+    if (timer_.IsRunning())
+      timer_.FireNow();
+  }
+
  private:
   void OnTimerStop() {
     // If an animation is still running, add its current visible desk change
@@ -720,6 +726,10 @@
   desks_restore_util::RestorePrimaryUserDesks();
 }
 
+void DesksController::FireMetricsTimerForTesting() {
+  metrics_helper_->FireTimerForTesting();
+}
+
 void DesksController::OnAnimationFinished(DeskAnimationBase* animation) {
   DCHECK_EQ(animation_.get(), animation);
   metrics_helper_->OnAnimationFinished(animation->visible_desk_changes());
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h
index 6c1d04e..06aabfb 100644
--- a/ash/wm/desks/desks_controller.h
+++ b/ash/wm/desks/desks_controller.h
@@ -218,6 +218,9 @@
   void OnActiveUserSessionChanged(const AccountId& account_id) override;
   void OnFirstSessionStarted() override;
 
+  // Fires the timer used for recording desk traversals immediately.
+  void FireMetricsTimerForTesting();
+
  private:
   class DeskTraversalsMetricsHelper;
   friend class DeskAnimationBase;
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index d4a23ef9..e914cba8 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -2900,6 +2900,35 @@
   EXPECT_TRUE(split_view_controller->InSplitViewMode());
 }
 
+TEST_F(DesksTest, DeskTraversalNonTouchpadMetrics) {
+  NewDesk();
+  NewDesk();
+  NewDesk();
+  ASSERT_EQ(4u, DesksController::Get()->desks().size());
+
+  constexpr char kDeskTraversalsHistogramName[] =
+      "Ash.Desks.NumberOfDeskTraversals";
+
+  base::HistogramTester histogram_tester;
+  auto* controller = DesksController::Get();
+  const auto& desks = controller->desks();
+  ASSERT_EQ(controller->active_desk(), desks[0].get());
+
+  // Move 5 desks. There is nothing recorded at the end since the timer is still
+  // running.
+  ActivateDesk(desks[1].get());
+  ActivateDesk(desks[0].get());
+  ActivateDesk(desks[1].get());
+  ActivateDesk(desks[2].get());
+  ActivateDesk(desks[3].get());
+  histogram_tester.ExpectBucketCount(kDeskTraversalsHistogramName, 5, 0);
+
+  // Simulate advancing the time to end the timer. There should be 5 desks
+  // recorded.
+  controller->FireMetricsTimerForTesting();
+  histogram_tester.ExpectBucketCount(kDeskTraversalsHistogramName, 5, 1);
+}
+
 namespace {
 
 constexpr char kUser1Email[] = "user1@desks";
@@ -3786,45 +3815,6 @@
   VerifyViewVisibility(app2, true);
 }
 
-// A test class that uses a mock time task environment.
-class DesksMockTimeTest : public AshTestBase {
- public:
-  DesksMockTimeTest()
-      : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
-  DesksMockTimeTest(const DesksMockTimeTest&) = delete;
-  DesksMockTimeTest& operator=(const DesksMockTimeTest&) = delete;
-  ~DesksMockTimeTest() override = default;
-};
-
-// crbug.com/1163489
-TEST_F(DesksMockTimeTest, DISABLED_DeskTraversalNonTouchpadMetrics) {
-  NewDesk();
-  NewDesk();
-  NewDesk();
-  ASSERT_EQ(4u, DesksController::Get()->desks().size());
-
-  constexpr char kDeskTraversalsHistogramName[] =
-      "Ash.Desks.NumberOfDeskTraversals";
-
-  base::HistogramTester histogram_tester;
-  auto* controller = DesksController::Get();
-  const auto& desks = controller->desks();
-  ASSERT_EQ(controller->active_desk(), desks[0].get());
-
-  // Move 5 desks. There is nothing recorded at the end since the timer is still
-  // running.
-  ActivateDesk(desks[1].get());
-  ActivateDesk(desks[0].get());
-  ActivateDesk(desks[1].get());
-  ActivateDesk(desks[2].get());
-  ActivateDesk(desks[3].get());
-  histogram_tester.ExpectBucketCount(kDeskTraversalsHistogramName, 5, 0);
-
-  // Advance the time to end the timer. There should be 5 desks recorded.
-  task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(8));
-  histogram_tester.ExpectBucketCount(kDeskTraversalsHistogramName, 5, 1);
-}
-
 // A test class for testing Bento features.
 class DesksBentoTest : public AshTestBase {
  public:
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index 9363923..aa99613 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -135,77 +135,6 @@
 
 }  // namespace
 
-// Class that updates the focusable overview widgets so that the point to the
-// correct next and previous widgets for a11y purposes. Needs to be updated when
-// an overview item is added or removed. It is expected that the desk widget
-// does not get altered for the duration of overview.
-class OverviewSession::AccessibilityFocusAnnotator {
- public:
-  explicit AccessibilityFocusAnnotator(OverviewSession* session)
-      : session_(session) {}
-  AccessibilityFocusAnnotator(const AccessibilityFocusAnnotator&) = delete;
-  AccessibilityFocusAnnotator& operator=(const AccessibilityFocusAnnotator&) =
-      delete;
-  ~AccessibilityFocusAnnotator() = default;
-
-  void UpdateAccessibilityFocus() {
-    if (session_->is_shutting_down())
-      return;
-
-    // Construct the list of accessible widgets, these are the overview focus
-    // widget, desk bar widget, all the item widgets and the no window indicator
-    // widget, if available.
-    std::vector<views::Widget*> a11y_widgets;
-    if (session_->overview_focus_widget_)
-      a11y_widgets.push_back(session_->overview_focus_widget_.get());
-
-    for (aura::Window* root : Shell::GetAllRootWindows()) {
-      OverviewGrid* grid = session_->GetGridWithRootWindow(root);
-      DCHECK(grid);
-      if (grid->desks_widget())
-        a11y_widgets.push_back(
-            const_cast<views::Widget*>(grid->desks_widget()));
-      for (const auto& item : grid->window_list())
-        a11y_widgets.push_back(item->item_widget());
-    }
-    if (session_->no_windows_widget_.get())
-      a11y_widgets.push_back(session_->no_windows_widget_.get());
-
-    if (a11y_widgets.empty())
-      return;
-
-    auto get_view_a11y =
-        [&a11y_widgets](int index) -> views::ViewAccessibility& {
-      return a11y_widgets[index]->GetContentsView()->GetViewAccessibility();
-    };
-
-    // If there is only one widget left, clear the focus overrides so that they
-    // do not point to deleted objects.
-    if (a11y_widgets.size() == 1) {
-      get_view_a11y(/*index=*/0).OverridePreviousFocus(nullptr);
-      get_view_a11y(/*index=*/0).OverrideNextFocus(nullptr);
-      a11y_widgets[0]->GetContentsView()->NotifyAccessibilityEvent(
-          ax::mojom::Event::kTreeChanged, true);
-      return;
-    }
-
-    int size = a11y_widgets.size();
-    for (int i = 0; i < size; ++i) {
-      int previous_index = (i + size - 1) % size;
-      int next_index = (i + 1) % size;
-      get_view_a11y(i).OverridePreviousFocus(a11y_widgets[previous_index]);
-      get_view_a11y(i).OverrideNextFocus(a11y_widgets[next_index]);
-      a11y_widgets[i]->GetContentsView()->NotifyAccessibilityEvent(
-          ax::mojom::Event::kTreeChanged, true);
-    }
-  }
-
- private:
-  // The associated overview session. Guaranteed to be non null for the lifetime
-  // of |this|.
-  OverviewSession* session_;
-};
-
 OverviewSession::OverviewSession(OverviewDelegate* delegate)
     : delegate_(delegate),
       active_window_before_overview_(window_util::GetActiveWindow()),
@@ -284,7 +213,7 @@
 
   // Create the widget that will receive focus while in overview mode for
   // accessibility purposes. Add a button as the contents so that
-  // |accessibility_focus_annotator_| can put it on the accessibility focus
+  // UpdateAccessibilityFocus can put it on the accessibility focus
   // cycler.
   overview_focus_widget_ = std::make_unique<views::Widget>();
   views::Widget::InitParams params;
@@ -584,9 +513,7 @@
   --num_items_;
 
   UpdateNoWindowsWidget();
-
-  if (accessibility_focus_annotator_)
-    accessibility_focus_annotator_->UpdateAccessibilityFocus();
+  UpdateAccessibilityFocus();
 }
 
 void OverviewSession::RemoveDropTargets() {
@@ -775,10 +702,7 @@
     }
   }
 
-  accessibility_focus_annotator_ =
-      std::make_unique<AccessibilityFocusAnnotator>(this);
-  accessibility_focus_annotator_->UpdateAccessibilityFocus();
-
+  UpdateAccessibilityFocus();
   Shell::Get()->overview_controller()->DelayedUpdateRoundedCornersAndShadow();
 }
 
@@ -1275,8 +1199,55 @@
   // instead of ActivateWindow() to show and activate the widget.
   overview_focus_widget_->Show();
 
-  if (accessibility_focus_annotator_)
-    accessibility_focus_annotator_->UpdateAccessibilityFocus();
+  UpdateAccessibilityFocus();
+}
+
+void OverviewSession::UpdateAccessibilityFocus() {
+  if (is_shutting_down())
+    return;
+
+  // Construct the list of accessible widgets, these are the overview focus
+  // widget, desk bar widget, all the item widgets and the no window indicator
+  // widget, if available.
+  std::vector<views::Widget*> a11y_widgets;
+  if (overview_focus_widget_)
+    a11y_widgets.push_back(overview_focus_widget_.get());
+
+  for (auto& grid : grid_list_) {
+    if (grid->desks_widget())
+      a11y_widgets.push_back(const_cast<views::Widget*>(grid->desks_widget()));
+    for (const auto& item : grid->window_list())
+      a11y_widgets.push_back(item->item_widget());
+  }
+  if (no_windows_widget_.get())
+    a11y_widgets.push_back(no_windows_widget_.get());
+
+  if (a11y_widgets.empty())
+    return;
+
+  auto get_view_a11y = [&a11y_widgets](int index) -> views::ViewAccessibility& {
+    return a11y_widgets[index]->GetContentsView()->GetViewAccessibility();
+  };
+
+  // If there is only one widget left, clear the focus overrides so that they
+  // do not point to deleted objects.
+  if (a11y_widgets.size() == 1) {
+    get_view_a11y(/*index=*/0).OverridePreviousFocus(nullptr);
+    get_view_a11y(/*index=*/0).OverrideNextFocus(nullptr);
+    a11y_widgets[0]->GetContentsView()->NotifyAccessibilityEvent(
+        ax::mojom::Event::kTreeChanged, true);
+    return;
+  }
+
+  int size = a11y_widgets.size();
+  for (int i = 0; i < size; ++i) {
+    int previous_index = (i + size - 1) % size;
+    int next_index = (i + 1) % size;
+    get_view_a11y(i).OverridePreviousFocus(a11y_widgets[previous_index]);
+    get_view_a11y(i).OverrideNextFocus(a11y_widgets[next_index]);
+    a11y_widgets[i]->GetContentsView()->NotifyAccessibilityEvent(
+        ax::mojom::Event::kTreeChanged, true);
+  }
 }
 
 }  // namespace ash
diff --git a/ash/wm/overview/overview_session.h b/ash/wm/overview/overview_session.h
index ec98b79..cb0369d 100644
--- a/ash/wm/overview/overview_session.h
+++ b/ash/wm/overview/overview_session.h
@@ -320,7 +320,6 @@
  private:
   friend class DesksAcceleratorsTest;
   friend class OverviewSessionTest;
-  class AccessibilityFocusAnnotator;
 
   // Helper function that moves the highlight forward or backward on the
   // corresponding window grid.
@@ -340,6 +339,11 @@
 
   void OnItemAdded(aura::Window* window);
 
+  // Updates the focusable overview widgets so that they point to the correct
+  // next and previous widgets for a11y purposes. Needs to be updated when an
+  // overview item is added or removed.
+  void UpdateAccessibilityFocus();
+
   // Weak pointer to the overview delegate which will be called when a selection
   // is made.
   OverviewDelegate* delegate_;
@@ -402,10 +406,6 @@
 
   std::unique_ptr<OverviewHighlightController> highlight_controller_;
 
-  // Updates accessibility with the correct focus order among all overview
-  // widgets.
-  std::unique_ptr<AccessibilityFocusAnnotator> accessibility_focus_annotator_;
-
   DISALLOW_COPY_AND_ASSIGN(OverviewSession);
 };
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 9ab9975c6..4e5a3ac 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -72,7 +72,7 @@
   build_base_unittests = true
 
   # Set to true to use BackupRefPtr as the implementation of CheckedPtr.
-  # Optionally can be disabled in Renderer.
+  # Optionally can be controlled (partially disabled) at run-time.
   use_backup_ref_ptr = false
   enable_runtime_backup_ref_ptr_control = false
 }
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index 0016bc5c..10c29bdf 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -1270,27 +1270,23 @@
   EXPECT_TRUE(slot_span->freelist_head);
   EXPECT_EQ(0, slot_span->num_allocated_slots);
 
-  size_t very_small_size = (kExtraAllocSize <= 32) ? (32 - kExtraAllocSize) : 0;
-  size_t very_small_size_raw_size = very_small_size;
-#if BUILDFLAG(USE_BACKUP_REF_PTR)
-  // Zero-sized allocations are adjusted to a size of 1.
-  if (very_small_size == 0)
-    very_small_size_raw_size = 1;
-#endif
-  bucket_index = SizeToIndex(very_small_size_raw_size + kExtraAllocSize);
+  static_assert(kExtraAllocSize < 64, "");
+  size_t very_small_size =
+      (kExtraAllocSize <= 32) ? (32 - kExtraAllocSize) : (64 - kExtraAllocSize);
+  bucket_index = SizeToIndex(very_small_size + kExtraAllocSize);
   bucket = &allocator.root()->buckets[bucket_index];
   EXPECT_EQ(nullptr, bucket->empty_slot_spans_head);
 
-  ptr = allocator.root()->Alloc(very_small_size_raw_size, type_name);
+  ptr = allocator.root()->Alloc(very_small_size, type_name);
   EXPECT_TRUE(ptr);
   slot_span = SlotSpan::FromSlotStartPtr(
       allocator.root()->AdjustPointerForExtrasSubtract(ptr));
   EXPECT_EQ(1, slot_span->num_allocated_slots);
   total_slots =
       (slot_span->bucket->num_system_pages_per_slot_span * SystemPageSize()) /
-      (very_small_size_raw_size + kExtraAllocSize);
+      (very_small_size + kExtraAllocSize);
   first_slot_span_slots =
-      SystemPageSize() / (very_small_size_raw_size + kExtraAllocSize);
+      SystemPageSize() / (very_small_size + kExtraAllocSize);
   EXPECT_EQ(total_slots - first_slot_span_slots,
             slot_span->num_unprovisioned_slots);
 
diff --git a/base/allocator/partition_allocator/partition_oom.cc b/base/allocator/partition_allocator/partition_oom.cc
index 0503d90..ba69c76 100644
--- a/base/allocator/partition_allocator/partition_oom.cc
+++ b/base/allocator/partition_allocator/partition_oom.cc
@@ -15,26 +15,20 @@
 OomFunction g_oom_handling_function = nullptr;
 
 NOINLINE void NOT_TAIL_CALLED PartitionExcessiveAllocationSize(size_t size) {
-  // Prevent code folding.
-  const int line_number = __LINE__;
-  base::debug::Alias(&line_number);
+  NO_CODE_FOLDING();
   OOM_CRASH(size);
 }
 
 #if !defined(ARCH_CPU_64_BITS)
 NOINLINE void NOT_TAIL_CALLED
 PartitionOutOfMemoryWithLotsOfUncommitedPages(size_t size) {
-  // Prevent code folding.
-  const int line_number = __LINE__;
-  base::debug::Alias(&line_number);
+  NO_CODE_FOLDING();
   OOM_CRASH(size);
 }
 
 [[noreturn]] NOINLINE void NOT_TAIL_CALLED
 PartitionOutOfMemoryWithLargeVirtualSize(size_t virtual_size) {
-  // Prevent code folding.
-  const int line_number = __LINE__;
-  base::debug::Alias(&line_number);
+  NO_CODE_FOLDING();
   OOM_CRASH(virtual_size);
 }
 
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java
index 7744d69..c5dee30 100644
--- a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java
+++ b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java
@@ -193,6 +193,10 @@
     // This is also used as the initial binding before any priorities are set.
     private ChildServiceConnection mModerateBinding;
 
+    // Uses the BIND_NOT_FOREGROUND flag. This is the same as |mModerateBinding| for memory
+    // management and same as |mWaivedBinding| for CPU scheduling.
+    private ChildServiceConnection mModerateWaiveCpuBinding;
+
     // Low priority binding maintained in the entire lifetime of the connection, i.e. between calls
     // to start() and stop().
     private ChildServiceConnection mWaivedBinding;
@@ -200,6 +204,7 @@
     // Refcount of bindings.
     private int mStrongBindingCount;
     private int mModerateBindingCount;
+    private int mModerateWaiveCpuBindingCount;
 
     private int mGroup;
     private int mImportanceInGroup;
@@ -309,6 +314,8 @@
 
         mModerateBinding = mConnectionFactory.createConnection(
                 intent, defaultFlags, mConnectionDelegate, mInstanceName);
+        mModerateWaiveCpuBinding = mConnectionFactory.createConnection(intent,
+                defaultFlags | Context.BIND_NOT_FOREGROUND, mConnectionDelegate, mInstanceName);
         mStrongBinding = mConnectionFactory.createConnection(
                 intent, defaultFlags | Context.BIND_IMPORTANT, mConnectionDelegate, mInstanceName);
         mWaivedBinding = mConnectionFactory.createConnection(intent,
@@ -547,6 +554,7 @@
         s.append("bindings:");
         s.append(mWaivedBinding.isBound() ? "W" : " ");
         s.append(mModerateBinding.isBound() ? "M" : " ");
+        s.append(mModerateWaiveCpuBinding.isBound() ? "C" : " ");
         s.append(mStrongBinding.isBound() ? "S" : " ");
 
         synchronized (sBindingStateLock) {
@@ -700,13 +708,18 @@
         sFallbackEnabled = true;
         boolean isStrongBindingBound = mStrongBinding.isBound();
         boolean isModerateBindingBound = mModerateBinding.isBound();
+        boolean isModerateWaiveCpuBindingBound = mModerateWaiveCpuBinding.isBound();
         boolean isWaivedBindingBound = mWaivedBinding.isBound();
         mStrongBinding.retire();
         mModerateBinding.retire();
+        mModerateWaiveCpuBinding.retire();
         mWaivedBinding.retire();
         createBindings(mFallbackServiceName);
         if (isStrongBindingBound) mStrongBinding.bindServiceConnection();
         if (isModerateBindingBound) mModerateBinding.bindServiceConnection();
+        if (isModerateWaiveCpuBindingBound) {
+            mModerateWaiveCpuBinding.bindServiceConnection();
+        }
         if (isWaivedBindingBound) mWaivedBinding.bindServiceConnection();
     }
 
@@ -719,6 +732,7 @@
         mStrongBinding.unbindServiceConnection();
         mWaivedBinding.unbindServiceConnection();
         mModerateBinding.unbindServiceConnection();
+        mModerateWaiveCpuBinding.unbindServiceConnection();
         updateBindingState();
 
         synchronized (sBindingStateLock) {
@@ -789,15 +803,29 @@
 
     public boolean isModerateBindingBound() {
         assert isRunningOnLauncherThread();
-        return mModerateBinding.isBound();
+        return mModerateBinding.isBound() || mModerateWaiveCpuBinding.isBound();
     }
 
-    public void addModerateBinding() {
+    /**
+     * @param waiveCpuPriority Normally moderate binding may raise the CPU scheduling priority
+     * as well as the importance for memory management. Pass true to not affect CPU scheduling
+     * priority. Note the refcounts for waiveCpuPriority and not are separate,
+     * so removeModerateBinding parameter must match.
+     */
+    public void addModerateBinding(boolean waiveCpuPriority) {
         assert isRunningOnLauncherThread();
         if (!isConnected()) {
             Log.w(TAG, "The connection is not bound for %d", getPid());
             return;
         }
+        if (waiveCpuPriority) {
+            if (mModerateWaiveCpuBindingCount == 0) {
+                mModerateWaiveCpuBinding.bindServiceConnection();
+                updateBindingState();
+            }
+            mModerateWaiveCpuBindingCount++;
+            return;
+        }
         if (mModerateBindingCount == 0) {
             mModerateBinding.bindServiceConnection();
             updateBindingState();
@@ -805,11 +833,23 @@
         mModerateBindingCount++;
     }
 
-    public void removeModerateBinding() {
+    /**
+     * @param waiveCpuPriority See addModerateBinding.
+     */
+    public void removeModerateBinding(boolean waiveCpuPriority) {
         assert isRunningOnLauncherThread();
         if (!isConnected()) {
             return;
         }
+        if (waiveCpuPriority) {
+            assert mModerateWaiveCpuBindingCount > 0;
+            mModerateWaiveCpuBindingCount--;
+            if (mModerateWaiveCpuBindingCount == 0) {
+                mModerateWaiveCpuBinding.unbindServiceConnection();
+                updateBindingState();
+            }
+            return;
+        }
         assert mModerateBindingCount > 0;
         mModerateBindingCount--;
         if (mModerateBindingCount == 0) {
@@ -894,7 +934,7 @@
             newBindingState = ChildBindingState.UNBOUND;
         } else if (mStrongBinding.isBound()) {
             newBindingState = ChildBindingState.STRONG;
-        } else if (mModerateBinding.isBound()) {
+        } else if (mModerateBinding.isBound() || mModerateWaiveCpuBinding.isBound()) {
             newBindingState = ChildBindingState.MODERATE;
         } else {
             assert mWaivedBinding.isBound();
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
index 25c100a7..69aeaf1 100644
--- a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
+++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
@@ -387,9 +387,9 @@
         verify(mConnectionCallback, times(1)).onConnected(connection);
 
         // Add strong binding so that connection is oom protected.
-        connection.removeModerateBinding();
+        connection.removeModerateBinding(false);
         assertEquals(ChildBindingState.WAIVED, connection.bindingStateCurrentOrWhenDied());
-        connection.addModerateBinding();
+        connection.addModerateBinding(false);
         assertEquals(ChildBindingState.MODERATE, connection.bindingStateCurrentOrWhenDied());
         connection.addStrongBinding();
         assertEquals(ChildBindingState.STRONG, connection.bindingStateCurrentOrWhenDied());
@@ -441,10 +441,10 @@
         ShadowLooper.runUiThreadTasks();
 
         // Add and remove moderate binding works as expected.
-        connection2.removeModerateBinding();
+        connection2.removeModerateBinding(false);
         assertArrayEquals(
                 connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 1, 0, 1});
-        connection2.addModerateBinding();
+        connection2.addModerateBinding(false);
         assertArrayEquals(
                 connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1});
 
@@ -463,7 +463,7 @@
         assertArrayEquals(
                 connection1.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 0});
 
-        connection2.removeModerateBinding();
+        connection2.removeModerateBinding(false);
         assertArrayEquals(
                 connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1});
         assertArrayEquals(
@@ -479,8 +479,7 @@
         connection.updateGroupImportance(1, 2);
         assertEquals(1, connection.getGroup());
         assertEquals(2, connection.getImportanceInGroup());
-        // Expect a important, moderate and waived bindings.
-        assertEquals(3, mMockConnections.size());
+        assertEquals(4, mMockConnections.size());
         // Group should be set on the wavied (last) binding.
         ChildServiceConnectionMock mock = mMockConnections.get(mMockConnections.size() - 1);
         assertEquals(1, mock.getGroup());
@@ -520,7 +519,7 @@
         assertNotNull(mFirstServiceConnection);
         connection.start(false /* useStrongBinding */, mServiceCallback);
 
-        Assert.assertEquals(3, mMockConnections.size());
+        Assert.assertEquals(4, mMockConnections.size());
         boolean anyServiceConnectionBound = false;
         for (ChildServiceConnectionMock serviceConnection : mMockConnections) {
             anyServiceConnectionBound = anyServiceConnectionBound || serviceConnection.isBound();
@@ -545,15 +544,15 @@
         verify(mServiceCallback, never()).onChildStartFailed(any());
         verify(mServiceCallback, never()).onChildProcessDied(any());
 
-        Assert.assertEquals(6, mMockConnections.size());
-        // First 3 should be unbound now.
-        for (int i = 0; i < 3; ++i) {
+        Assert.assertEquals(8, mMockConnections.size());
+        // First 4 should be unbound now.
+        for (int i = 0; i < 4; ++i) {
             verify(mMockConnections.get(i), times(1)).retire();
             Assert.assertFalse(mMockConnections.get(i).isBound());
         }
         // New connection for fallback service should be bound.
         ChildServiceConnectionMock boundServiceConnection = null;
-        for (int i = 3; i < 6; ++i) {
+        for (int i = 4; i < 8; ++i) {
             if (mMockConnections.get(i).isBound()) {
                 boundServiceConnection = mMockConnections.get(i);
             }
@@ -570,4 +569,33 @@
         verify(mServiceCallback, never()).onChildStartFailed(any());
         verify(mServiceCallback, never()).onChildProcessDied(any());
     }
+
+    @Test
+    public void testModerateWaiveCpuPriority() throws RemoteException {
+        ChildProcessConnection connection = createDefaultTestConnection();
+        connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+        when(mIChildProcessService.bindToCaller(any())).thenReturn(true);
+        mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+        ChildServiceConnectionMock moderateConnection = mMockConnections.get(0);
+        ChildServiceConnectionMock moderateWaiveCpuConnection = mMockConnections.get(1);
+
+        Assert.assertTrue(connection.isModerateBindingBound());
+        assertTrue(moderateConnection.isBound());
+        assertFalse(moderateWaiveCpuConnection.isBound());
+
+        connection.removeModerateBinding(false /* waiveCpuPriority */);
+        Assert.assertFalse(connection.isModerateBindingBound());
+        assertFalse(moderateConnection.isBound());
+        assertFalse(moderateWaiveCpuConnection.isBound());
+
+        connection.addModerateBinding(true /* waiveCpuPriority */);
+        Assert.assertTrue(connection.isModerateBindingBound());
+        assertFalse(moderateConnection.isBound());
+        assertTrue(moderateWaiveCpuConnection.isBound());
+
+        connection.removeModerateBinding(true /* waiveCpuPriority */);
+        Assert.assertFalse(connection.isModerateBindingBound());
+        assertFalse(moderateConnection.isBound());
+        assertFalse(moderateWaiveCpuConnection.isBound());
+    }
 }
diff --git a/base/compiler_specific.h b/base/compiler_specific.h
index 03c9295..fa961b0c 100644
--- a/base/compiler_specific.h
+++ b/base/compiler_specific.h
@@ -65,7 +65,7 @@
 // To provide the complementary behavior (prevent the annotated function from
 // being omitted) look at NOINLINE. Also note that this doesn't prevent code
 // folding of multiple identical caller functions into a single signature. To
-// prevent code folding, see base::debug::Alias.
+// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h.
 // Use like:
 //   void NOT_TAIL_CALLED FooBar();
 #if defined(__clang__) && __has_attribute(not_tail_called)
diff --git a/base/debug/alias.h b/base/debug/alias.h
index bd0904e..b653b31 100644
--- a/base/debug/alias.h
+++ b/base/debug/alias.h
@@ -40,7 +40,7 @@
 // call stack. In this case there is no memory that needs to be on
 // the stack so we can use nullptr. The call to base::debug::Alias() needs to
 // happen after the call that is suspected to be tail called. Note: This
-// technique will prevent taill calls at the specific call site only. To prevent
+// technique will prevent tail calls at the specific call site only. To prevent
 // them for all invocations of a function look at NOT_TAIL_CALLED.
 //
 // Example usage:
@@ -55,13 +55,13 @@
 // cause the same address to be assigned to different functions if they are
 // identical. If finding the precise signature of a function in the call-stack
 // is important and it's suspected the function is identical to other functions
-// it can be made unique using base::debug::Alias().
+// it can be made unique using NO_CODE_FOLDING which is a wrapper around
+// base::debug::Alias();
 //
 // Example usage:
 //   NOINLINE void Foo(){
+//     NO_CODE_FOLDING();
 //     Bar();
-//     const int line_number = __LINE__;
-//     base::debug::Alias(&line_number);
 //   }
 //
 // Finally please note that these effects compound. This means that saving a
@@ -84,4 +84,19 @@
   ::base::strlcpy(var_name, (c_str), sizeof(var_name));   \
   ::base::debug::Alias(var_name);
 
+// Code folding is a linker optimization whereby the linker identifies functions
+// that are bit-identical and overlays them. This saves space but it leads to
+// confusing call stacks because multiple symbols are at the same address and
+// it is unpredictable which one will be displayed. Disabling of code folding is
+// particularly useful when function names are used as signatures in crashes.
+// This macro doesn't guarantee that code folding will be prevented but it
+// greatly reduces the odds and always prevents it within one source file.
+// If using in a function that terminates the process it is safest to put the
+// NO_CODE_FOLDING macro at the top of the function.
+// Use like:
+//   void FooBarFailure(size_t size) { NO_CODE_FOLDING(); OOM_CRASH(size); }
+#define NO_CODE_FOLDING()           \
+  const int line_number = __LINE__; \
+  base::debug::Alias(&line_number)
+
 #endif  // BASE_DEBUG_ALIAS_H_
diff --git a/base/memory/shared_memory_security_policy.h b/base/memory/shared_memory_security_policy.h
index bf356bb..e581188 100644
--- a/base/memory/shared_memory_security_policy.h
+++ b/base/memory/shared_memory_security_policy.h
@@ -7,8 +7,15 @@
 
 #include <stddef.h>
 
+#include "base/base_export.h"
 #include "base/compiler_specific.h"
 
+namespace mojo {
+namespace core {
+class ChannelLinux;
+}  // namespace core
+}  // namespace mojo
+
 namespace base {
 
 namespace subtle {
@@ -19,10 +26,11 @@
 // mapped. This can help prevent an attacker from spraying the address space of
 // a process with shared memory mappings to bypass ASLR. For more details, see
 // https://googleprojectzero.blogspot.com/2019/04/virtually-unlimited-memory-escaping.html
-class SharedMemorySecurityPolicy {
+class BASE_EXPORT SharedMemorySecurityPolicy {
  private:
   friend class subtle::PlatformSharedMemoryRegion;
   friend class SharedMemoryMapping;
+  friend class mojo::core::ChannelLinux;
 
   // Checks that a mapping with |size| can be created. Returns false if there is
   // an overflow in internal calculations, or the max limit has been reached.
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py
index db3b0b23..7d5cca9 100755
--- a/build/android/gyp/compile_java.py
+++ b/build/android/gyp/compile_java.py
@@ -4,8 +4,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import distutils.spawn
-import functools
 import logging
 import multiprocessing
 import optparse
@@ -730,6 +728,8 @@
       options.warnings_as_errors, options.jar_info_exclude_globs
   ]
 
+  # Keep md5_check since we plan to use its changes feature to implement a build
+  # speed improvement for non-signature compiles: https://crbug.com/1170778
   md5_check.CallAndWriteDepfileIfStale(
       lambda: _OnStaleMd5(options, javac_cmd, javac_args, java_files),
       options,
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py
index ed48b087..3d721e6 100755
--- a/build/android/gyp/dex.py
+++ b/build/android/gyp/dex.py
@@ -598,6 +598,8 @@
   if options.force_enable_assertions:
     dex_cmd += ['--force-enable-assertions']
 
+  # The changes feature from md5_check allows us to only re-dex the class files
+  # that have changed and the class files that need to be re-desugared by D8.
   md5_check.CallAndWriteDepfileIfStale(
       lambda changes: _OnStaleMd5(changes, options, final_dex_inputs, dex_cmd),
       options,
diff --git a/build/android/pylib/utils/app_bundle_utils.py b/build/android/pylib/utils/app_bundle_utils.py
index ab57036..b2e9927 100644
--- a/build/android/pylib/utils/app_bundle_utils.py
+++ b/build/android/pylib/utils/app_bundle_utils.py
@@ -153,6 +153,9 @@
     if mode is not None:
       input_strings.append(mode)
 
+    # Avoid rebuilding (saves ~20s) when the input files have not changed. This
+    # is essential when calling the apk_operations.py script multiple times with
+    # the same bundle (e.g. out/Debug/bin/monochrome_public_bundle run).
     md5_check.CallAndRecordIfStale(
         rebuild,
         input_paths=input_paths,
diff --git a/build/config/OWNERS b/build/config/OWNERS
index 361d45a3..eeb6706 100644
--- a/build/config/OWNERS
+++ b/build/config/OWNERS
@@ -1,6 +1,5 @@
 dpranke@google.com
 scottmg@chromium.org
 
-per-file *jumbo*=bratell.d@gmail.com
 per-file ozone.gni=file://ui/ozone/OWNERS
 per-file ozone_extra.gni=file://ui/ozone/OWNERS
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index ccf1dd5..2040b5c5 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -119,7 +119,7 @@
   # the space overhead is too great. We should use some mixture of profiles and
   # optimization settings to better tune the size increase.
   thin_lto_enable_optimizations =
-      (is_chromeos_ash || is_android || is_win) && is_official_build
+      (is_chromeos_ash || is_android || is_win || is_linux) && is_official_build
 
   # Initialize all local variables with a pattern. This flag will fill
   # uninitialized floating-point types (and 32-bit pointers) with 0xFF and the
@@ -620,6 +620,7 @@
 
         # Experimentally determined to yield a reasonable trade-off between
         # build time, run-time performance, and binary size.
+        # Keep this in sync with the Linux value below.
         "-mllvm:-import-instr-limit=10",
 
         "/lldltocache:" +
@@ -649,7 +650,10 @@
         # TODO(gbiv): We ideally shouldn't need to specify this; ThinLTO
         # should be able to better manage binary size increases on its own.
         import_instr_limit = -1
-        if (is_android) {
+        if (is_linux) {
+          # Keep this in sync with the Windows value above.
+          import_instr_limit = 10
+        } else if (is_android) {
           import_instr_limit = 5
         } else if (is_chromeos_ash) {
           # Not much performance difference was noted between the default (100)
diff --git a/build/config/merge_for_jumbo.py b/build/config/merge_for_jumbo.py
deleted file mode 100755
index 6d037a8..0000000
--- a/build/config/merge_for_jumbo.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2016 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.
-
-"""This script creates a "jumbo" file which merges all incoming files
-for compiling.
-
-"""
-
-from __future__ import print_function
-from __future__ import unicode_literals
-
-import argparse
-import hashlib
-import io
-import os
-
-def cut_ranges(boundaries):
-  # Given an increasing sequence of boundary indices, generate a sequence of
-  # non-overlapping ranges. The total range is inclusive of the first index
-  # and exclusive of the last index from the given sequence.
-  for start, stop in zip(boundaries, boundaries[1:]):
-    yield range(start, stop)
-
-
-def generate_chunk_stops(inputs, output_count, smart_merge=True):
-  # Note: In the comments below, unique numeric labels are assigned to files.
-  #       Consider them as the sorted rank of the hash of each file path.
-  # Simple jumbo chunking generates uniformly sized chunks with the ceiling of:
-  # (output_index + 1) * input_count / output_count
-  input_count = len(inputs)
-  stops = [((i + 1) * input_count + output_count - 1) // output_count
-           for i in range(output_count)]
-  # This is disruptive at times because file insertions and removals can
-  # invalidate many chunks as all files are offset by one.
-  # For example, say we have 12 files in 4 uniformly sized chunks:
-  # 9, 4, 0; 7,  1, 11;  5, 10, 2; 6, 3, 8
-  # If we delete the first file we get:
-  # 4, 0, 7; 1, 11,  5; 10,  2, 6; 3, 8
-  # All of the chunks have new sets of inputs.
-
-  # With path-aware chunking, we start with the uniformly sized chunks:
-  # 9, 4, 0; 7,  1, 11;  5, 10, 2; 6, 3, 8
-  # First we find the smallest rank in each of the chunks. Their indices are
-  # stored in the |centers| list and in this example the ranks would be:
-  # 0, 1, 2, 3
-  # Then we find the largest rank between the centers. Their indices are stored
-  # in the |stops| list and in this example the ranks would be:
-  # 7, 11, 6
-  # These files mark the boundaries between chunks and these boundary files are
-  # often maintained even as files are added or deleted.
-  # In this example, 7, 11, and 6 are the first files in each chunk:
-  # 9, 4, 0; 7,  1; 11,  5, 10, 2; 6, 3, 8
-  # If we delete the first file and repeat the process we get:
-  # 4, 0; 7, 1; 11,  5, 10,  2; 6, 3, 8
-  # Only the first chunk has a new set of inputs.
-  if smart_merge:
-    # Starting with the simple chunks, every file is assigned a rank.
-    # This requires a hash function that is stable across runs.
-    hasher = lambda n: hashlib.md5(inputs[n].encode()).hexdigest()
-    # In each chunk there is a key file with lowest rank; mark them.
-    # Note that they will not easily change.
-    centers = [min(indices, key=hasher) for indices in cut_ranges([0] + stops)]
-    # Between each pair of key files there is a file with highest rank.
-    # Mark these to be used as border files. They also will not easily change.
-    # Forget the inital chunks and create new chunks by splitting the list at
-    # every border file.
-    stops = [max(indices, key=hasher) for indices in cut_ranges(centers)]
-    stops.append(input_count)
-  return stops
-
-
-def write_jumbo_files(inputs, outputs, written_input_set, written_output_set):
-  chunk_stops = generate_chunk_stops(inputs, len(outputs))
-
-  written_inputs = 0
-  for output_index, output_file in enumerate(outputs):
-    written_output_set.add(output_file)
-    if os.path.isfile(output_file):
-      with open(output_file, "r") as current:
-        current_jumbo_file = current.read()
-    else:
-      current_jumbo_file = None
-
-    out = io.StringIO()
-    out.write("/* This is a Jumbo file. Don't edit. */\n\n")
-    out.write("/* Generated with merge_for_jumbo.py. */\n\n")
-    input_limit = chunk_stops[output_index]
-    while written_inputs < input_limit:
-      filename = inputs[written_inputs]
-      written_inputs += 1
-      out.write("#include \"%s\"\n" % filename)
-      written_input_set.add(filename)
-    new_jumbo_file = out.getvalue()
-    out.close()
-
-    if new_jumbo_file != current_jumbo_file:
-      with open(output_file, "w") as out:
-        out.write(new_jumbo_file)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument("--outputs", nargs="+", required=True,
-                      help='List of output files to split input into')
-  parser.add_argument("--file-list", required=True)
-  parser.add_argument("--verbose", action="store_true")
-  args = parser.parse_args()
-
-  lines = []
-  # If written with gn |write_file| each file is on its own line.
-  with open(args.file_list) as file_list_file:
-    lines = [line.strip() for line in file_list_file if line.strip()]
-  # If written with gn |response_file_contents| the files are space separated.
-  all_inputs = []
-  for line in lines:
-    all_inputs.extend(line.split())
-
-  written_output_set = set()  # Just for double checking
-  written_input_set = set()  # Just for double checking
-  for language_ext in (".cc", ".c", ".mm",):
-    if language_ext == ".cc":
-      ext_pattern = (".cc", ".cpp")
-    else:
-      ext_pattern = tuple([language_ext])
-
-    outputs = [x for x in args.outputs if x.endswith(ext_pattern)]
-    inputs = [x for x in all_inputs if x.endswith(ext_pattern)]
-
-    if not outputs:
-      assert not inputs
-      continue
-
-    write_jumbo_files(inputs, outputs, written_input_set, written_output_set)
-
-  assert set(args.outputs) == written_output_set, "Did not fill all outputs"
-  assert set(all_inputs) == written_input_set, "Did not use all inputs"
-  if args.verbose:
-    print("Generated %s (%d files) based on %s" % (
-      str(args.outputs), len(written_input_set), args.file_list))
-
-if __name__ == "__main__":
-  main()
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 92f58ef..5e08249 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20210126.2.1
+0.20210127.1.2
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 92f58ef..5e08249 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20210126.2.1
+0.20210127.1.2
diff --git a/cc/document_transition/document_transition_request.cc b/cc/document_transition/document_transition_request.cc
index a2e374dd..220d097f1 100644
--- a/cc/document_transition/document_transition_request.cc
+++ b/cc/document_transition/document_transition_request.cc
@@ -5,6 +5,7 @@
 #include "cc/document_transition/document_transition_request.h"
 
 #include <memory>
+#include <sstream>
 #include <utility>
 
 #include "base/callback.h"
@@ -12,6 +13,50 @@
 #include "components/viz/common/quads/compositor_frame_transition_directive.h"
 
 namespace cc {
+namespace {
+
+std::string TypeToString(viz::CompositorFrameTransitionDirective::Type type) {
+  switch (type) {
+    case viz::CompositorFrameTransitionDirective::Type::kSave:
+      return "kSave";
+    case viz::CompositorFrameTransitionDirective::Type::kAnimate:
+      return "kAnimate";
+  }
+  return "<unknown>";
+}
+
+std::string EffectToString(
+    viz::CompositorFrameTransitionDirective::Effect effect) {
+  switch (effect) {
+    case viz::CompositorFrameTransitionDirective::Effect::kNone:
+      return "kNone";
+    case viz::CompositorFrameTransitionDirective::Effect::kCoverDown:
+      return "kCoverDown";
+    case viz::CompositorFrameTransitionDirective::Effect::kCoverLeft:
+      return "kCoverLeft";
+    case viz::CompositorFrameTransitionDirective::Effect::kCoverRight:
+      return "kCoverRight";
+    case viz::CompositorFrameTransitionDirective::Effect::kCoverUp:
+      return "kCoverUp";
+    case viz::CompositorFrameTransitionDirective::Effect::kExplode:
+      return "kExplode";
+    case viz::CompositorFrameTransitionDirective::Effect::kFade:
+      return "kFade";
+    case viz::CompositorFrameTransitionDirective::Effect::kImplode:
+      return "kImplode";
+    case viz::CompositorFrameTransitionDirective::Effect::kRevealDown:
+      return "kRevealDown";
+    case viz::CompositorFrameTransitionDirective::Effect::kRevealLeft:
+      return "kRevealLeft";
+    case viz::CompositorFrameTransitionDirective::Effect::kRevealRight:
+      return "kRevealRight";
+    case viz::CompositorFrameTransitionDirective::Effect::kRevealUp:
+      return "kRevealUp";
+  }
+  return "<unknown>";
+}
+
+}  // namespace
 
 uint32_t DocumentTransitionRequest::s_next_sequence_id_ = 1;
 
@@ -58,4 +103,12 @@
                                                  effect_, clamped_duration);
 }
 
+std::string DocumentTransitionRequest::ToString() const {
+  std::ostringstream str;
+  str << "[type: " << TypeToString(type_)
+      << " effect: " << EffectToString(effect_)
+      << " duration: " << duration_.InMillisecondsF() << "ms]";
+  return str.str();
+}
+
 }  // namespace cc
diff --git a/cc/document_transition/document_transition_request.h b/cc/document_transition/document_transition_request.h
index c496bebd..dddfd4a9 100644
--- a/cc/document_transition/document_transition_request.h
+++ b/cc/document_transition/document_transition_request.h
@@ -6,6 +6,7 @@
 #define CC_DOCUMENT_TRANSITION_DOCUMENT_TRANSITION_REQUEST_H_
 
 #include <memory>
+#include <string>
 #include <utility>
 
 #include "base/callback.h"
@@ -48,6 +49,9 @@
   // processed again by viz.
   viz::CompositorFrameTransitionDirective ConstructDirective() const;
 
+  // Testing / debugging functionality.
+  std::string ToString() const;
+
  private:
   using Type = viz::CompositorFrameTransitionDirective::Type;
 
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index a66a71d..0dcf681 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -367,6 +367,15 @@
     }                                                                          \
   }
 
+bool IsScrollActive(const CompositorFrameReporter::ActiveTrackers& trackers) {
+  return trackers.test(
+             static_cast<size_t>(FrameSequenceTrackerType::kWheelScroll)) ||
+         trackers.test(
+             static_cast<size_t>(FrameSequenceTrackerType::kTouchScroll)) ||
+         trackers.test(
+             static_cast<size_t>(FrameSequenceTrackerType::kScrollbarScroll));
+}
+
 }  // namespace
 
 CompositorFrameReporter::CompositorFrameReporter(
@@ -384,7 +393,7 @@
       dropped_frame_counter_(dropped_frame_counter),
       smooth_thread_(smooth_thread),
       layer_tree_host_id_(layer_tree_host_id) {
-  dropped_frame_counter_->OnBeginFrame(args);
+  dropped_frame_counter_->OnBeginFrame(args, IsScrollActive(active_trackers_));
 }
 
 std::unique_ptr<CompositorFrameReporter>
diff --git a/cc/metrics/dropped_frame_counter.cc b/cc/metrics/dropped_frame_counter.cc
index 870f8e09..818de70 100644
--- a/cc/metrics/dropped_frame_counter.cc
+++ b/cc/metrics/dropped_frame_counter.cc
@@ -8,6 +8,7 @@
 #include <cmath>
 
 #include "base/bind.h"
+#include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/trace_event/trace_event.h"
@@ -86,9 +87,24 @@
   frame_sorter_.Reset();
 }
 
-void DroppedFrameCounter::OnBeginFrame(const viz::BeginFrameArgs& args) {
-  if (fcp_received_)
+void DroppedFrameCounter::OnBeginFrame(const viz::BeginFrameArgs& args,
+                                       bool is_scroll_active) {
+  // Remember when scrolling starts/ends. Do this even if fcp has not happened
+  // yet.
+  if (!is_scroll_active) {
+    scroll_start_.reset();
+  } else if (!scroll_start_.has_value()) {
+    ScrollStartInfo info = {args.frame_time, args.frame_id};
+    scroll_start_ = info;
+  }
+
+  if (fcp_received_) {
     frame_sorter_.AddNewFrame(args);
+    if (is_scroll_active) {
+      DCHECK(scroll_start_.has_value());
+      scroll_start_per_frame_[args.frame_id] = *scroll_start_;
+    }
+  }
 }
 
 void DroppedFrameCounter::OnEndFrame(const viz::BeginFrameArgs& args,
@@ -101,6 +117,23 @@
       ++total_smoothness_dropped_;
     ReportFrames();
   }
+  auto iter = scroll_start_per_frame_.find(args.frame_id);
+  if (iter != scroll_start_per_frame_.end()) {
+    ScrollStartInfo& scroll_start = iter->second;
+    if (args.frame_id.source_id == scroll_start.frame_id.source_id) {
+      UMA_HISTOGRAM_CUSTOM_TIMES(
+          "Graphics.Smoothness.Diagnostic.DroppedFrameAfterScrollStart.Time",
+          (args.frame_time - scroll_start.timestamp),
+          base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromSeconds(4),
+          50);
+      UMA_HISTOGRAM_CUSTOM_COUNTS(
+          "Graphics.Smoothness.Diagnostic.DroppedFrameAfterScrollStart.Frames",
+          (args.frame_id.sequence_number -
+           scroll_start.frame_id.sequence_number),
+          1, 250, 50);
+    }
+    scroll_start_per_frame_.erase(iter);
+  }
 
   if (fcp_received_)
     frame_sorter_.AddFrameResult(args, is_dropped);
diff --git a/cc/metrics/dropped_frame_counter.h b/cc/metrics/dropped_frame_counter.h
index 027ebe05..153d0ff 100644
--- a/cc/metrics/dropped_frame_counter.h
+++ b/cc/metrics/dropped_frame_counter.h
@@ -64,7 +64,7 @@
   void AddDroppedFrame();
   void ReportFrames();
 
-  void OnBeginFrame(const viz::BeginFrameArgs& args);
+  void OnBeginFrame(const viz::BeginFrameArgs& args, bool is_scroll_active);
   void OnEndFrame(const viz::BeginFrameArgs& args, bool is_dropped);
   void SetUkmSmoothnessDestination(UkmSmoothnessDataShared* smoothness_data);
   void OnFcpReceived();
@@ -110,6 +110,17 @@
   UkmSmoothnessDataShared* ukm_smoothness_data_ = nullptr;
   FrameSorter frame_sorter_;
   TotalFrameCounter* total_counter_ = nullptr;
+
+  struct ScrollStartInfo {
+    // The timestamp of when the scroll started.
+    base::TimeTicks timestamp;
+
+    // The vsync corresponding to the scroll-start.
+    viz::BeginFrameId frame_id;
+  };
+  base::Optional<ScrollStartInfo> scroll_start_;
+
+  std::map<viz::BeginFrameId, ScrollStartInfo> scroll_start_per_frame_;
 };
 
 }  // namespace cc
diff --git a/cc/metrics/dropped_frame_counter_unittest.cc b/cc/metrics/dropped_frame_counter_unittest.cc
index 835357db..6bab7b5 100644
--- a/cc/metrics/dropped_frame_counter_unittest.cc
+++ b/cc/metrics/dropped_frame_counter_unittest.cc
@@ -263,7 +263,7 @@
     for (int i = 0; i < repeat; i++) {
       for (auto is_dropped : frame_states) {
         viz::BeginFrameArgs args_ = SimulateBeginFrameArgs();
-        dropped_frame_counter_.OnBeginFrame(args_);
+        dropped_frame_counter_.OnBeginFrame(args_, /*is_scroll_active=*/false);
         dropped_frame_counter_.OnEndFrame(args_, is_dropped);
         sequence_number_++;
         frame_time_ += interval_;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 16c195eb0..c07966b6 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1124,7 +1124,7 @@
 
   return root_surface_has_visible_damage ||
          active_tree_->property_trees()->effect_tree.HasCopyRequests() ||
-         hud_wants_to_draw_;
+         hud_wants_to_draw_ || active_tree_->HasDocumentTransitionRequests();
 }
 
 DrawResult LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) {
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index e0b7d9e..f2cc09f3 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -29,6 +29,7 @@
 #include "cc/animation/transform_operations.h"
 #include "cc/base/features.h"
 #include "cc/base/histograms.h"
+#include "cc/document_transition/document_transition_request.h"
 #include "cc/input/browser_controls_offset_manager.h"
 #include "cc/input/main_thread_scrolling_reason.h"
 #include "cc/input/page_scale_animation.h"
@@ -18226,4 +18227,38 @@
       GetInputHandler().FindFrameElementIdAtPoint(gfx::PointF(30, 30)));
 }
 
+TEST_F(LayerTreeHostImplTest, DocumentTransitionRequestCausesDamage) {
+  const gfx::Size viewport_size(100, 100);
+  SetupDefaultRootLayer(viewport_size);
+  UpdateDrawProperties(host_impl_->active_tree());
+
+  const gfx::Transform draw_transform;
+  const gfx::Rect draw_viewport(viewport_size);
+  bool resourceless_software_draw = false;
+
+  // Clear any damage.
+  host_impl_->OnDraw(draw_transform, draw_viewport, resourceless_software_draw,
+                     false);
+  last_on_draw_frame_.reset();
+  did_request_redraw_ = false;
+
+  // Ensure there is no damage.
+  host_impl_->OnDraw(draw_transform, draw_viewport, resourceless_software_draw,
+                     false);
+  EXPECT_FALSE(did_request_redraw_);
+  EXPECT_TRUE(last_on_draw_frame_->has_no_damage);
+  last_on_draw_frame_.reset();
+  did_request_redraw_ = false;
+
+  // Adding a transition effect should cause us to redraw.
+  host_impl_->active_tree()->AddDocumentTransitionRequest(
+      DocumentTransitionRequest::CreateStart(base::OnceClosure()));
+
+  // Ensure there is damage and we requested a redraw.
+  host_impl_->OnDraw(draw_transform, draw_viewport, resourceless_software_draw,
+                     false);
+  EXPECT_TRUE(did_request_redraw_);
+  EXPECT_FALSE(last_on_draw_frame_->has_no_damage);
+}
+
 }  // namespace cc
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 7f979cac..1ac475f 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -2681,4 +2681,8 @@
   return std::move(document_transition_requests_);
 }
 
+bool LayerTreeImpl::HasDocumentTransitionRequests() const {
+  return !document_transition_requests_.empty();
+}
+
 }  // namespace cc
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 9289e1c..ec13bafd 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -759,6 +759,8 @@
   std::vector<std::unique_ptr<DocumentTransitionRequest>>
   TakeDocumentTransitionRequests();
 
+  bool HasDocumentTransitionRequests() const;
+
  protected:
   float ClampPageScaleFactorToLimits(float page_scale_factor) const;
   void PushPageScaleFactorAndLimits(const float* page_scale_factor,
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index af6b502..cb1f6ad 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -719,7 +719,6 @@
     "//chrome/browser/android/webapk/webapk_install_service.h",
     "//chrome/browser/android/webapk/webapk_installer.h",
     "//chrome/browser/android/webapk/webapk_types.h",
-    "//chrome/browser/banners/app_banner_settings_helper.h",
     "//chrome/browser/download/android/download_open_source.h",
     "//chrome/browser/installable/installed_webapp_geolocation_bridge.cc",
     "//chrome/browser/installable/quality_enforcer.cc",
@@ -3430,7 +3429,6 @@
     "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationPopupBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLauncher.java",
-    "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingBridge.java",
     "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordUIView.java",
     "java/src/org/chromium/chrome/browser/permissions/PermissionSettingsBridge.java",
     "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index 59f6cf13..ba9abd2 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -843,7 +843,6 @@
   "java/res/layout/os_version_unsupported_text.xml",
   "java/res/layout/other_forms_of_history_dialog.xml",
   "java/res/layout/passphrase_type_item.xml",
-  "java/res/layout/password_entry_editor.xml",
   "java/res/layout/password_entry_exception.xml",
   "java/res/layout/password_entry_viewer_copyable_row.xml",
   "java/res/layout/password_entry_viewer_interactive.xml",
@@ -914,7 +913,6 @@
   "java/res/menu/custom_tabs_menu.xml",
   "java/res/menu/history_manager_menu.xml",
   "java/res/menu/languages_action_bar_menu.xml",
-  "java/res/menu/password_entry_editor_action_bar_menu.xml",
   "java/res/menu/password_entry_viewer_action_bar_menu.xml",
   "java/res/menu/prefeditor_editor_menu.xml",
   "java/res/menu/save_password_preferences_action_bar_menu.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 607ed72..412c566a 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1107,10 +1107,6 @@
   "java/src/org/chromium/chrome/browser/password_manager/settings/ExportFlow.java",
   "java/src/org/chromium/chrome/browser/password_manager/settings/ExportWarningDialogFragment.java",
   "java/src/org/chromium/chrome/browser/password_manager/settings/ManualCallbackDelayer.java",
-  "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingBridge.java",
-  "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegate.java",
-  "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegateProvider.java",
-  "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditor.java",
   "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryViewer.java",
   "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordManagerHandler.java",
   "java/src/org/chromium/chrome/browser/password_manager/settings/PasswordManagerHandlerProvider.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index bf849fda..95fa8d8 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -369,7 +369,6 @@
   "javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java",
-  "javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditorTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java",
   "javatests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java",
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
index 01edc61..165294b 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -91,6 +91,12 @@
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.suggestions.SiteSuggestion;
+import org.chromium.chrome.browser.suggestions.mostvisited.MostVisitedSitesMetadataUtils;
+import org.chromium.chrome.browser.suggestions.tile.Tile;
+import org.chromium.chrome.browser.suggestions.tile.TileSectionType;
+import org.chromium.chrome.browser.suggestions.tile.TileSource;
+import org.chromium.chrome.browser.suggestions.tile.TileTitleSource;
 import org.chromium.chrome.browser.tab.TabState;
 import org.chromium.chrome.browser.tab.TabStateFileManager;
 import org.chromium.chrome.browser.tabmodel.TabModelFilter;
@@ -120,12 +126,15 @@
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.browser.test.util.TestTouchUtils;
 import org.chromium.ui.test.util.UiRestriction;
+import org.chromium.url.GURL;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
@@ -1143,6 +1152,44 @@
                 surface, "singlePane_landscape" + (isFeedV2 ? "_FeedV2" : "_FeedV1"));
     }
 
+    @Test
+    @SmallTest
+    @Feature({"RenderTest"})
+    @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE})
+    // clang-format off
+    @EnableFeatures({ChromeFeatureList.TAB_SWITCHER_ON_RETURN + "<Study,",
+            ChromeFeatureList.START_SURFACE_ANDROID + "<Study"})
+    @CommandLineFlags.Add({ChromeSwitches.DISABLE_NATIVE_INITIALIZATION,
+            "force-fieldtrials=Study/Group",
+            IMMEDIATE_RETURN_PARAMS + "/start_surface_variation/single"+
+                    "/exclude_mv_tiles/false"})
+    public void renderSingleAsHomepage_MVTiles() throws IOException, InterruptedException {
+        // clang-format on
+        // Get old file and ensure to delete it.
+        File oldFile = MostVisitedSitesMetadataUtils.getOrCreateTopSitesDirectory();
+        Assert.assertTrue(oldFile.delete() && !oldFile.exists());
+
+        // Save suggestion lists to file.
+        final CountDownLatch latch = new CountDownLatch(1);
+        MostVisitedSitesMetadataUtils.saveSuggestionListsToFile(
+                createFakeSiteSuggestionTiles(), latch::countDown);
+
+        // Wait util the file has been saved.
+        latch.await();
+
+        startMainActivityFromLauncher();
+        CriteriaHelper.pollUiThread(
+                () -> mActivityTestRule.getActivity().getLayoutManager().overviewVisible());
+
+        View surface =
+                mActivityTestRule.getActivity().findViewById(R.id.primary_tasks_surface_view);
+
+        ViewUtils.onViewWaiting(
+                allOf(withId(R.id.tile_view_title), withText("0 TOP_SITES"), isDisplayed()));
+        ChromeRenderTestRule.sanitize(surface);
+        mRenderTestRule.render(surface, "singlePane_MV");
+    }
+
     /**
      * Toggles the header and checks whether the header has the right status.
      *
@@ -1201,4 +1248,19 @@
         CriteriaHelper.pollUiThread(
                 mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized);
     }
+
+    private static List<Tile> createFakeSiteSuggestionTiles() {
+        List<Tile> suggestionTiles = new ArrayList<>();
+        SiteSuggestion data = new SiteSuggestion("0 TOP_SITES", new GURL("https://www.foo.com"), "",
+                TileTitleSource.TITLE_TAG, TileSource.TOP_SITES, TileSectionType.PERSONALIZED,
+                new Date());
+        suggestionTiles.add(new Tile(data, 0));
+
+        data = new SiteSuggestion("1 ALLOWLIST", new GURL("https://www.bar.com"), "",
+                TileTitleSource.UNKNOWN, TileSource.ALLOWLIST, TileSectionType.PERSONALIZED,
+                new Date());
+        suggestionTiles.add(new Tile(data, 1));
+
+        return suggestionTiles;
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
index 2709e4c..64f9067 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
@@ -18,6 +18,7 @@
 import org.chromium.chrome.browser.suggestions.SuggestionsMetrics;
 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl;
+import org.chromium.chrome.browser.suggestions.mostvisited.MostVisitedSitesMetadataUtils;
 import org.chromium.chrome.browser.suggestions.tile.SuggestionsTileView;
 import org.chromium.chrome.browser.suggestions.tile.Tile;
 import org.chromium.chrome.browser.suggestions.tile.TileGroup;
@@ -26,12 +27,18 @@
 import org.chromium.chrome.browser.suggestions.tile.TileRenderer;
 import org.chromium.chrome.browser.suggestions.tile.TileSectionType;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration;
 import org.chromium.components.favicon.LargeIconBridge;
+import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.PageTransition;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
+import java.io.IOException;
+import java.util.List;
+
 /**
  * Coordinator for displaying a list of {@link SuggestionsTileView} in a {@link ViewGroup}.
  *
@@ -63,6 +70,22 @@
     public void initialize() {
         mRenderer =
                 new TileRenderer(mActivity, SuggestionsConfig.TileStyle.MODERN, TITLE_LINES, null);
+
+        // If it's a cold start and Instant Start is turned on, we render MV tiles placeholder here
+        // pre-native.
+        if (!mInitializationComplete && StartSurfaceConfiguration.isStartSurfaceEnabled()
+                && TabUiFeatureUtilities.supportInstantStart(
+                        DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity))) {
+            try {
+                List<Tile> tiles =
+                        MostVisitedSitesMetadataUtils.restoreFileToSuggestionListsOnUiThread();
+                if (tiles != null) {
+                    mRenderer.renderTileSection(tiles, mParent, this);
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
     }
 
     public void initWithNative() {
@@ -122,6 +145,9 @@
 
         mRenderer.renderTileSection(
                 mTileGroup.getTileSections().get(TileSectionType.PERSONALIZED), mParent, this);
+
+        MostVisitedSitesMetadataUtils.getInstance().saveSuggestionListsToFile(
+                mTileGroup.getTileSections().get(TileSectionType.PERSONALIZED));
     }
 
     @Override
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
index 930f7436..82485466 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
@@ -59,7 +59,7 @@
 <translation id="8304833501377495048">የትር ድርድር ዳግም አይታይ?</translation>
 <translation id="83556505225171773">{TABS_COUNT,plural, =1{የተመረጠ <ph name="TABS_COUNT_ONE" /> ትር ዝጋ}one{የተመረጡ <ph name="TABS_COUNT_MANY" /> ትሮችን ዝጋ}other{የተመረጡ <ph name="TABS_COUNT_MANY" /> ትሮችን ዝጋ}}</translation>
 <translation id="8557923272772633250">ከ<ph name="NUMBER_OF_TABS" /> ትሮች ጋር የትር ቡድኖችን ይዘርጉ።</translation>
-<translation id="860282621117673749">የዋጋ ቅናሽ ማንቂያዎች</translation>
+<translation id="860282621117673749">የዋጋ ቅነሳ ማንቂያዎች</translation>
 <translation id="8714939927607906138">ዝቅተኛ ዋጋ</translation>
 <translation id="8749939518995770034">የትር ድርድር ተዘግቷል</translation>
 <translation id="8820741577754260431">በትሮችዎ ላይ የዋጋ ቅነሳዎችን ይመልከቱ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
index cc9a434..59afa70 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
@@ -59,7 +59,7 @@
 <translation id="8304833501377495048">Ne plus afficher la barre d'onglets ?</translation>
 <translation id="83556505225171773">{TABS_COUNT,plural, =1{Fermer l'onglet sélectionné (<ph name="TABS_COUNT_ONE" />)}one{Fermer l'onglet sélectionné (<ph name="TABS_COUNT_MANY" />)}other{Fermer les onglets sélectionnés (<ph name="TABS_COUNT_MANY" />)}}</translation>
 <translation id="8557923272772633250">Développez le groupe d'onglets qui contient <ph name="NUMBER_OF_TABS" /> onglets.</translation>
-<translation id="860282621117673749">Alertes de baisse de prix</translation>
+<translation id="860282621117673749">Alertes de prix en baisse</translation>
 <translation id="8714939927607906138">Prix inférieur</translation>
 <translation id="8749939518995770034">Barre d'onglets fermée</translation>
 <translation id="8820741577754260431">Consultez les baisses de prix dans les onglets</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
index f3428427..1d39f5d5 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
@@ -59,7 +59,7 @@
 <translation id="8304833501377495048">აღარ გამოჩნდეს ჩანართების ზოლი?</translation>
 <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> არჩეული ჩანართის დახურვა}other{<ph name="TABS_COUNT_MANY" /> არჩეული ჩანართის დახურვა}}</translation>
 <translation id="8557923272772633250">ჩანართების <ph name="NUMBER_OF_TABS" />-ჩანართიანი ჯგუფის გაფართოება.</translation>
-<translation id="860282621117673749">გაფრთხილებები ფასის დაწევის შესახებ</translation>
+<translation id="860282621117673749">გაფრთხილებები ფასის დაწევაზე</translation>
 <translation id="8714939927607906138">უფრო დაბალი ფასი</translation>
 <translation id="8749939518995770034">ჩანართების ზოლი დახურულია</translation>
 <translation id="8820741577754260431">იხილეთ ინფორმაცია ფასების დაწევის შესახებ თქვენს ჩანართებზე</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
index 2706fa8..7f2059b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
@@ -18,7 +18,7 @@
 <translation id="2759453070259087442">Išskleisti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra tiek skirtukų: <ph name="NUMBER_OF_TABS" />.</translation>
 <translation id="2977480621796371840">Pašalinti iš grupės</translation>
 <translation id="3328308545011660196">Pasiūlymas: skirtukai (iš viso: <ph name="NUMBER_OF_TABS" />) atrodo susiję. Grupuoti juos?</translation>
-<translation id="3340978935015468852">nustatymų</translation>
+<translation id="3340978935015468852">Nustatymai</translation>
 <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Sutraukti <ph name="TABS_COUNT_ONE" /> skirtuką.}one{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukas.}few{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukai.}many{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtuko.}other{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukų.}}</translation>
 <translation id="3940195383040445971">Stebėti kainas skirtukuose</translation>
 <translation id="3996880007329611795">Pranešti</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
index c4b28a2..d47b69b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -18,7 +18,7 @@
 <translation id="2759453070259087442">Добавить несколько вкладок (<ph name="NUMBER_OF_TABS" />) в группу "<ph name="TITLE_OF_GROUP" />".</translation>
 <translation id="2977480621796371840">Удалить из группы</translation>
 <translation id="3328308545011660196">Подсказка: обнаружены похожие вкладки (<ph name="NUMBER_OF_TABS" />). Сгруппировать их?</translation>
-<translation id="3340978935015468852">настройках</translation>
+<translation id="3340978935015468852">настройки</translation>
 <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Свернуть <ph name="TABS_COUNT_ONE" /> вкладку.}one{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки под названием "<ph name="TITLE_OF_GROUP" />".}few{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок под названием "<ph name="TITLE_OF_GROUP" />".}many{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок под названием "<ph name="TITLE_OF_GROUP" />".}other{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки под названием "<ph name="TITLE_OF_GROUP" />".}}</translation>
 <translation id="3940195383040445971">Отслеживать цены на вкладках</translation>
 <translation id="3996880007329611795">Получать уведомления</translation>
diff --git a/chrome/android/java/res/layout/password_entry_editor.xml b/chrome/android/java/res/layout/password_entry_editor.xml
deleted file mode 100644
index 46d5d70..0000000
--- a/chrome/android/java/res/layout/password_entry_editor.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/password_entry_editor"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingStart="@dimen/password_entry_editor_content_spacing"
-    android:paddingEnd="@dimen/password_entry_editor_content_spacing"
-    android:paddingLeft="@dimen/password_entry_editor_content_spacing"
-    android:paddingRight="@dimen/password_entry_editor_content_spacing">
-
-    <!-- Site/App -->
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/site_label"
-        android:labelFor="@+id/site_edit"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/password_entry_editor_field_large_top_margin"
-        android:layout_marginBottom="@dimen/password_entry_editor_field_bottom_margin">
-
-        <EditText
-            tools:ignore="LabelFor"
-            android:id="@+id/site_edit"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="flagNoExtractUi"
-            android:importantForAutofill="noExcludeDescendants"
-            android:inputType="text"
-            android:hint="@string/password_entry_viewer_site_title"
-            android:enabled="false"/>
-    </com.google.android.material.textfield.TextInputLayout>
-
-    <!-- Username -->
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/username_label"
-        android:labelFor="@+id/username_edit"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/password_entry_editor_field_top_margin"
-        android:layout_marginBottom="@dimen/password_entry_editor_field_bottom_margin">
-
-        <EditText
-            tools:ignore="LabelFor"
-            android:id="@+id/username_edit"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:imeOptions="flagNoExtractUi"
-            android:importantForAutofill="noExcludeDescendants"
-            android:inputType="text"
-            android:hint="@string/password_entry_viewer_username_title"/>
-    </com.google.android.material.textfield.TextInputLayout>
-
-    <!-- Password -->
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:gravity="center">
-
-        <com.google.android.material.textfield.TextInputLayout
-            android:id="@+id/password_label"
-            android:labelFor="@+id/password_edit"
-            android:layout_height="wrap_content"
-            android:layout_width="0dp"
-            android:layout_weight="1"
-            android:layout_marginTop="@dimen/password_entry_editor_field_top_margin"
-            android:layout_marginBottom="@dimen/password_entry_editor_field_bottom_margin">
-
-            <EditText
-                tools:ignore="LabelFor"
-                android:id="@+id/password_edit"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:imeOptions="flagNoExtractUi"
-                android:importantForAutofill="noExcludeDescendants"
-                android:inputType="textPassword"
-                android:hint="@string/password_entry_viewer_password"/>
-        </com.google.android.material.textfield.TextInputLayout>
-
-
-        <org.chromium.ui.widget.ChromeImageButton
-            android:id="@+id/password_entry_editor_view_password"
-            android:background="?attr/selectableItemBackground"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:srcCompat="@drawable/ic_visibility_black"
-            app:tint="@color/default_icon_color_tint_list"
-            style="?android:attr/buttonStyleSmall"/>
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/chrome/android/java/res/menu/password_entry_editor_action_bar_menu.xml b/chrome/android/java/res/menu/password_entry_editor_action_bar_menu.xml
deleted file mode 100644
index fca29bf..0000000
--- a/chrome/android/java/res/menu/password_entry_editor_action_bar_menu.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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. -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto" >
-
-    <item
-        android:id="@+id/action_save_edited_password"
-        android:title="@string/save"
-        app:showAsAction="always"/>
-</menu>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
index 2d996ce..ecf9d41 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -16,7 +16,6 @@
 import androidx.recyclerview.widget.RecyclerView.ViewHolder;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -223,16 +222,14 @@
         }
 
         if (!mSignInManager.getIdentityManager().hasPrimaryAccount()) {
-            if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)) {
-                CoreAccountInfo primaryAccount =
-                        mSignInManager.getIdentityManager().getPrimaryAccountInfo(
-                                ConsentLevel.NOT_REQUIRED);
-                if (primaryAccount != null && !wasPersonalizedSigninPromoDeclined()) {
-                    return PromoState.PROMO_SYNC_PERSONALIZED;
-                }
+            if (!shouldShowBookmarkSigninPromo()) {
+                return PromoState.PROMO_NONE;
             }
-            return shouldShowBookmarkSigninPromo() ? PromoState.PROMO_SIGNIN_PERSONALIZED
-                                                   : PromoState.PROMO_NONE;
+            CoreAccountInfo primaryAccount =
+                    mSignInManager.getIdentityManager().getPrimaryAccountInfo(
+                            ConsentLevel.NOT_REQUIRED);
+            return primaryAccount == null ? PromoState.PROMO_SIGNIN_PERSONALIZED
+                                          : PromoState.PROMO_SYNC_PERSONALIZED;
         }
 
         boolean impressionLimitNotReached =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
index 7c60179..28c34010 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
@@ -20,6 +20,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.collection.ArraySet;
+import androidx.fragment.app.FragmentActivity;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceFragmentCompat;
 
@@ -429,7 +430,8 @@
                 && mFetcher.isDialogAboutOtherFormsOfBrowsingHistoryEnabled()
                 && !OtherFormsOfHistoryDialogFragment.wasDialogShown()) {
             mDialogAboutOtherFormsOfBrowsingHistory = new OtherFormsOfHistoryDialogFragment();
-            mDialogAboutOtherFormsOfBrowsingHistory.show(getActivity());
+            FragmentActivity fragmentActivity = (FragmentActivity) getActivity();
+            mDialogAboutOtherFormsOfBrowsingHistory.show(fragmentActivity);
             dismissProgressDialog();
             RecordHistogram.recordBooleanHistogram(DIALOG_HISTOGRAM, true);
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/OtherFormsOfHistoryDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/OtherFormsOfHistoryDialogFragment.java
index 97ed80b..19f09069 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/OtherFormsOfHistoryDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/OtherFormsOfHistoryDialogFragment.java
@@ -4,9 +4,7 @@
 
 package org.chromium.chrome.browser.browsing_data;
 
-import android.app.Activity;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.text.SpannableString;
@@ -17,6 +15,8 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentActivity;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
@@ -38,8 +38,8 @@
      * Show the dialog.
      * @param activity The activity in which to show the dialog.
      */
-    public void show(Activity activity) {
-        show(activity.getFragmentManager(), TAG);
+    public void show(FragmentActivity activity) {
+        show(activity.getSupportFragmentManager(), TAG);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index 81f408c..ac1009d4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -11,6 +11,7 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.browser.customtabs.CustomTabsIntent;
 
@@ -43,6 +44,7 @@
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.util.ColorUtils;
 import org.chromium.url.GURL;
 
@@ -233,6 +235,11 @@
         removeTabState();
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     /** Clear the reader mode state for this manager. */
     private void removeTabState() {
         if (mWebContentsObserver != null) mWebContentsObserver.destroy();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java
index 1d7c758..07bb3c24 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java
@@ -13,6 +13,7 @@
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * A {@link TabObserver} that also handles screenshot related events.
@@ -28,15 +29,6 @@
 
     private static final Class<ScreenshotTabObserver> USER_DATA_KEY = ScreenshotTabObserver.class;
 
-    /** Number of screenshots taken of the tab while on the same page */
-    private int mScreenshotsTaken;
-    /** Actions performed after a screenshot was taken. */
-    private int mScreenshotAction;
-
-    public ScreenshotTabObserver() {
-        mScreenshotAction = SCREENSHOT_ACTION_NONE;
-    }
-
     /**
      * Gets the existing observer if it exists, otherwise creates one.
      * @param tab The Tab for which to create the observer.
@@ -48,8 +40,8 @@
         // observer and put it into the UserData for the tab.
         ScreenshotTabObserver observer = get(tab);
         if (observer == null) {
-            observer =
-                    tab.getUserDataHost().setUserData(USER_DATA_KEY, new ScreenshotTabObserver());
+            observer = tab.getUserDataHost().setUserData(
+                    USER_DATA_KEY, new ScreenshotTabObserver(tab));
             tab.addObserver(observer);
         }
         return observer;
@@ -65,6 +57,24 @@
         return tab.getUserDataHost().getUserData(USER_DATA_KEY);
     }
 
+    /** Number of screenshots taken of the tab while on the same page */
+    private int mScreenshotsTaken;
+    /** Actions performed after a screenshot was taken. */
+    private int mScreenshotAction;
+    private Tab mTab;
+
+    public ScreenshotTabObserver(Tab tab) {
+        mTab = tab;
+        mTab.addObserver(this);
+        mScreenshotAction = SCREENSHOT_ACTION_NONE;
+    }
+
+    @Override
+    public void destroy() {
+        mTab.removeObserver(this);
+        mTab = null;
+    }
+
     @Override
     public void onClosingStateChanged(Tab tab, boolean closing) {
         reportScreenshotUMA(tab);
@@ -80,6 +90,11 @@
         reportScreenshotUMA(tab);
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     public void onActionPerformedAfterScreenshot(int action) {
         if (mScreenshotsTaken > 0) mScreenshotAction = action;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
index 65952c5..a73a2eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
@@ -7,6 +7,7 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.R;
@@ -19,6 +20,7 @@
 import org.chromium.components.browser_ui.media.MediaNotificationManager;
 import org.chromium.components.browser_ui.media.MediaSessionHelper;
 import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * A tab helper that wraps {@link MediaSessionHelper} and is responsible for Chrome-specific
@@ -51,6 +53,11 @@
             mTab.removeObserver(this);
             mTab = null;
         }
+
+        @Override
+        public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+            // Intentionally do nothing to prevent automatic observer removal on detachment.
+        }
     };
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingBridge.java
deleted file mode 100644
index c8ed973..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingBridge.java
+++ /dev/null
@@ -1,77 +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.
-
-package org.chromium.chrome.browser.password_manager.settings;
-
-import android.content.Context;
-import android.os.Bundle;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
-import org.chromium.components.browser_ui.settings.SettingsLauncher;
-
-/**
- * This is a bridge between PasswordEntryEditor and the C++ code. The bridge is in charge of
- * launching the PasswordEntryEditor and handling the password changes that happen through the
- * PasswordEntryEditor.
- */
-public class PasswordEditingBridge implements PasswordEditingDelegate {
-    private long mNativePasswordEditingBridge;
-
-    public PasswordEditingBridge(long nativePasswordEditingBridge) {
-        mNativePasswordEditingBridge = nativePasswordEditingBridge;
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(this);
-    }
-
-    /**
-     * The method edits a password form saved in the password store according to changes performed
-     * in PasswordEntryEditor. The delegate holds all the information about the password form that
-     * was loaded in the PasswordEntryEditor, so there's no need to pass the site, the old username
-     * or the old password to this method. Sometimes the form can have no username (for PSL-matched
-     * credentials), but it has to always have a password.
-     *
-     * @param newUsername that will replace the old one if it's given.
-     * @param newPassword that will replace the old one.
-     */
-    @Override
-    public void editSavedPasswordEntry(String newUsername, String newPassword) {
-        PasswordEditingBridgeJni.get().handleEditSavedPasswordEntry(
-                mNativePasswordEditingBridge, PasswordEditingBridge.this, newUsername, newPassword);
-    }
-
-    @CalledByNative
-    private static PasswordEditingBridge create(long nativePasswordEditingBridge) {
-        return new PasswordEditingBridge(nativePasswordEditingBridge);
-    }
-
-    @CalledByNative
-    private void showEditingUI(Context context, String site, String username, String password) {
-        Bundle fragmentArgs = new Bundle();
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_URL, site);
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_NAME, username);
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_PASSWORD, password);
-        SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
-        settingsLauncher.launchSettingsActivity(context, PasswordEntryEditor.class, fragmentArgs);
-    }
-
-    /**
-     * Destroy the native object.
-     */
-    @Override
-    public void destroy() {
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(null);
-        assert mNativePasswordEditingBridge != 0;
-        PasswordEditingBridgeJni.get().destroy(
-                mNativePasswordEditingBridge, PasswordEditingBridge.this);
-        mNativePasswordEditingBridge = 0;
-    }
-
-    @NativeMethods
-    interface Natives {
-        void destroy(long nativePasswordEditingBridge, PasswordEditingBridge caller);
-        void handleEditSavedPasswordEntry(long nativePasswordEditingBridge,
-                PasswordEditingBridge caller, String newUsername, String newPassword);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegate.java
deleted file mode 100644
index 98752e9..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegate.java
+++ /dev/null
@@ -1,23 +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.
-
-package org.chromium.chrome.browser.password_manager.settings;
-
-/**
- * Interface for accessing the PasswordEditingBridge. It's used to mock it in tests.
- */
-public interface PasswordEditingDelegate {
-    /**
-     * Edits the credential record that was loaded in the PasswordEntryEditor.
-     *
-     * @param newUsername The new username value.
-     * @param newPassword The new password value.
-     */
-    void editSavedPasswordEntry(String newUsername, String newPassword);
-
-    /**
-     * Destroy the native object. This needs to be called after using the bridge is done.
-     */
-    void destroy();
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegateProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegateProvider.java
deleted file mode 100644
index cd6c0031..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEditingDelegateProvider.java
+++ /dev/null
@@ -1,42 +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.
-
-package org.chromium.chrome.browser.password_manager.settings;
-
-/**
- * A provider for PasswordEditingDelegate implementations, handling the choice of the proper
- * one (production vs. testing).
- *
- * This class is used by the code responsible for Chrome's passwords settings. The
- * provider is a singleton because it needs to provide a bridge to the password editing
- * UI. The editing UI can't get the bridge any other way because it's an object and
- * it can't be sent to the editing UI through bundle arguments when the UI is started.
- */
-public class PasswordEditingDelegateProvider {
-    private static final PasswordEditingDelegateProvider INSTANCE =
-            new PasswordEditingDelegateProvider();
-
-    private PasswordEditingDelegate mPasswordEditingDelegate;
-
-    /** Private constructor, use GetInstance() instead. */
-    private PasswordEditingDelegateProvider() {}
-
-    public static PasswordEditingDelegateProvider getInstance() {
-        return INSTANCE;
-    }
-
-    /**
-     * Sets an implementation of PasswordEditingDelegate to be used.
-     */
-    public void setPasswordEditingDelegate(PasswordEditingDelegate passwordEditingDelegate) {
-        mPasswordEditingDelegate = passwordEditingDelegate;
-    }
-
-    /**
-     * A function to get a PasswordEditingDelegate implementation.
-     */
-    public PasswordEditingDelegate getPasswordEditingDelegate() {
-        return mPasswordEditingDelegate;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditor.java
deleted file mode 100644
index d2782bf..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditor.java
+++ /dev/null
@@ -1,152 +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.
-
-package org.chromium.chrome.browser.password_manager.settings;
-
-import android.os.Bundle;
-import android.text.InputType;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import androidx.fragment.app.Fragment;
-import com.google.android.material.textfield.TextInputLayout;
-import org.chromium.chrome.R;
-import org.chromium.ui.widget.Toast;
-
-/**
- * Password entry editor that allows editing passwords stored in Chrome.
- */
-public class PasswordEntryEditor extends Fragment {
-    static final String VIEW_BUTTON_PRESSED = "viewButtonPressed";
-    public static final String CREDENTIAL_URL = "credentialUrl";
-    public static final String CREDENTIAL_NAME = "credentialName";
-    public static final String CREDENTIAL_PASSWORD = "credentialPassword";
-
-    private EditText mSiteText;
-    private EditText mUsernameText;
-    private EditText mPasswordText;
-    private TextInputLayout mPasswordLabel;
-
-    private ImageButton mViewPasswordButton;
-
-    private Runnable mPendingAction;
-
-    @Override
-    public View onCreateView(
-            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        setHasOptionsMenu(true);
-        getActivity().setTitle(R.string.password_entry_viewer_edit_stored_password_action_title);
-        return inflater.inflate(R.layout.password_entry_editor, container, false);
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        mSiteText = (EditText) view.findViewById(R.id.site_edit);
-        mUsernameText = (EditText) view.findViewById(R.id.username_edit);
-        mPasswordText = (EditText) view.findViewById(R.id.password_edit);
-        mPasswordLabel = (TextInputLayout) view.findViewById(R.id.password_label);
-        mViewPasswordButton = view.findViewById(R.id.password_entry_editor_view_password);
-
-        mSiteText.setText(getArguments().getString(CREDENTIAL_URL));
-        mUsernameText.setText(getArguments().getString(CREDENTIAL_NAME));
-        mPasswordText.setText(getArguments().getString(CREDENTIAL_PASSWORD));
-        maskPassword();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        boolean hasValidReauth = ReauthenticationManager.authenticationStillValid(
-                ReauthenticationManager.ReauthScope.ONE_AT_A_TIME);
-        if (!hasValidReauth) {
-            maskPassword();
-        } else if (mPendingAction != null) {
-            mPendingAction.run();
-        }
-        mPendingAction = null;
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.password_entry_editor_action_bar_menu, menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int id = item.getItemId();
-        if (id == R.id.action_save_edited_password) {
-            saveChanges();
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    private void maskPassword() {
-        getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
-        mPasswordText.setInputType(InputType.TYPE_CLASS_TEXT
-                | InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
-        mViewPasswordButton.setImageResource(R.drawable.ic_visibility_black);
-        mViewPasswordButton.setOnClickListener(
-                (unusedView)
-                        -> this.performActionAfterReauth(this::unmaskPassword,
-                                R.string.lockscreen_description_view,
-                                R.string.password_entry_view_set_screen_lock));
-    }
-
-    private void unmaskPassword() {
-        getActivity().getWindow().setFlags(
-                WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
-        mPasswordText.setInputType(InputType.TYPE_CLASS_TEXT
-                | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
-                | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
-        mViewPasswordButton.setImageResource(R.drawable.ic_visibility_off_black);
-        mViewPasswordButton.setOnClickListener((unusedView) -> this.maskPassword());
-    }
-
-    private void saveChanges() {
-        String password = mPasswordText.getText().toString();
-        if (TextUtils.isEmpty(password)) {
-            mPasswordLabel.setError(getContext().getString(
-                    R.string.pref_edit_dialog_field_required_validation_message));
-        } else {
-            PasswordEditingDelegateProvider.getInstance()
-                    .getPasswordEditingDelegate()
-                    .editSavedPasswordEntry(
-                            mUsernameText.getText().toString(), mPasswordText.getText().toString());
-            getActivity().finish();
-        }
-    }
-
-    private void performActionAfterReauth(
-            Runnable action, int reasonString, int noScreenLockMessage) {
-        if (!ReauthenticationManager.isScreenLockSetUp(getActivity().getApplicationContext())) {
-            Toast.makeText(getActivity().getApplicationContext(), noScreenLockMessage,
-                         Toast.LENGTH_LONG)
-                    .show();
-            return;
-        }
-        if (ReauthenticationManager.authenticationStillValid(
-                    ReauthenticationManager.ReauthScope.ONE_AT_A_TIME)) {
-            action.run();
-            return;
-        }
-        mPendingAction = action;
-        ReauthenticationManager.displayReauthenticationFragment(reasonString, View.NO_ID,
-                getParentFragmentManager(), ReauthenticationManager.ReauthScope.ONE_AT_A_TIME);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        PasswordEditingDelegateProvider.getInstance().getPasswordEditingDelegate().destroy();
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java
index e955519..7abb2c2fa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java
@@ -118,7 +118,7 @@
      * show something else.
      */
     public static List<Tile> restoreFileToSuggestionListsOnUiThread() throws IOException {
-        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
+        try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
             return restoreFileToSuggestionLists();
         }
     }
@@ -128,8 +128,8 @@
      * @param suggestionTiles The site suggestion tiles.
      * @param callback Callback function after saving file.
      */
-    @VisibleForTesting
-    protected static void saveSuggestionListsToFile(List<Tile> suggestionTiles, Runnable callback) {
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public static void saveSuggestionListsToFile(List<Tile> suggestionTiles, Runnable callback) {
         new AsyncTask<Void>() {
             @Override
             protected Void doInBackground() {
@@ -264,7 +264,8 @@
         return data;
     }
 
-    protected static File getOrCreateTopSitesDirectory() {
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public static File getOrCreateTopSitesDirectory() {
         try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
             synchronized (DIR_CREATION_LOCK) {
                 if (sStateDirectory == null) {
@@ -276,8 +277,7 @@
         }
     }
 
-    @VisibleForTesting
-    protected void updatePendingToCurrent() {
+    private void updatePendingToCurrent() {
         mCurrentTask = mPendingTask;
         mPendingTask = null;
         if (mCurrentTask != null) {
@@ -292,11 +292,6 @@
     }
 
     @VisibleForTesting
-    public Runnable getPendingTaskForTesting() {
-        return mPendingTask;
-    }
-
-    @VisibleForTesting
     public void setCurrentTaskForTesting(Runnable currentTask) {
         mCurrentTask = currentTask;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
index d76a4ab..62489c34 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -20,6 +20,7 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Log;
+import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge;
@@ -113,7 +114,8 @@
 
         for (Tile tile : sectionTiles) {
             SuggestionsTileView tileView = oldTileViews.get(tile.getData());
-            if (tileView == null) {
+            if (tileView == null || tileView.mIconView == null
+                    || tileView.mIconView.getDrawable() == null) {
                 tileView = buildTileView(tile, parent, setupDelegate);
             }
 
@@ -153,6 +155,11 @@
                     VectorDrawableCompat.create(mResources, R.drawable.ic_apps_blue_24dp, mTheme));
             tile.setType(TileVisualType.ICON_DEFAULT);
 
+            if (!LibraryLoader.getInstance().isInitialized()) {
+                tileView.initialize(tile, mTitleLinesCount);
+                return tileView;
+            }
+
             // One task to load actual icon.
             LargeIconBridge.LargeIconCallback bridgeCallback =
                     setupDelegate.createIconLoadCallback(tile);
@@ -168,6 +175,10 @@
 
         tileView.initialize(tile, mTitleLinesCount);
 
+        if (!LibraryLoader.getInstance().isInitialized()) {
+            return tileView;
+        }
+
         // Note: It is important that the callbacks below don't keep a reference to the tile or
         // modify them as there is no guarantee that the same tile would be used to update the view.
         if (mImageFetcher != null && tile.getSource() != TileSource.EXPLORE) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java
index fec3ec5..14359f6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java
@@ -15,6 +15,7 @@
 import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.components.external_intents.RedirectHandler;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * This class glues RedirectHandler instances to Tabs.
@@ -23,6 +24,7 @@
     private static final Class<RedirectHandlerTabHelper> USER_DATA_KEY =
             RedirectHandlerTabHelper.class;
 
+    private Tab mTab;
     private RedirectHandler mRedirectHandler;
 
     /**
@@ -36,7 +38,7 @@
         UserDataHost host = tab.getUserDataHost();
         RedirectHandlerTabHelper helper = host.getUserData(USER_DATA_KEY);
         if (helper == null) {
-            helper = new RedirectHandlerTabHelper();
+            helper = new RedirectHandlerTabHelper(tab);
             host.setUserData(USER_DATA_KEY, helper);
             tab.addObserver(helper);
         }
@@ -62,7 +64,7 @@
         UserDataHost host = tab.getUserDataHost();
         RedirectHandlerTabHelper oldHelper = host.getUserData(USER_DATA_KEY);
         if (newHandler != null) {
-            RedirectHandlerTabHelper newHelper = new RedirectHandlerTabHelper(newHandler);
+            RedirectHandlerTabHelper newHelper = new RedirectHandlerTabHelper(tab, newHandler);
             host.setUserData(USER_DATA_KEY, newHelper);
         } else {
             host.removeUserData(USER_DATA_KEY);
@@ -72,19 +74,32 @@
         return oldHelper.mRedirectHandler;
     }
 
-    private RedirectHandlerTabHelper() {
+    private RedirectHandlerTabHelper(Tab tab) {
+        mTab = tab;
         mRedirectHandler = RedirectHandler.create();
     }
 
-    private RedirectHandlerTabHelper(RedirectHandler handler) {
+    private RedirectHandlerTabHelper(Tab tab, RedirectHandler handler) {
+        mTab = tab;
         mRedirectHandler = handler;
     }
 
     @Override
+    public void destroy() {
+        mTab.removeObserver(this);
+        mTab = null;
+    }
+
+    @Override
     public void onHidden(Tab tab, @TabHidingType int type) {
         mRedirectHandler.clear();
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     /**
      * Wrapper around RedirectHandler#updateIntent() that supplies //chrome-level params.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
index ef0eebc74..de1d2307 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
@@ -6,12 +6,15 @@
 
 import android.text.TextUtils;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.ContextUtils;
 import org.chromium.content_public.browser.ImeAdapter;
 import org.chromium.content_public.browser.ImeEventObserver;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.PageTransition;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * User data for a {@link Tab} managing an ID of an external application that opened it.
@@ -55,6 +58,11 @@
             public void onDestroyed(Tab tab) {
                 tab.removeObserver(this);
             }
+
+            @Override
+            public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+                // Intentionally do nothing to prevent automatic observer removal on detachment.
+            }
         });
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
index 61f310f..fbbc0a9c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
@@ -5,9 +5,11 @@
 package org.chromium.chrome.browser.tab;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.UserData;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * Helper that coordinates the browser controls offsets from the perspective of a particular Tab.
@@ -16,7 +18,7 @@
     private static final Class<TabBrowserControlsOffsetHelper> USER_DATA_KEY =
             TabBrowserControlsOffsetHelper.class;
 
-    private final TabImpl mTab;
+    private TabImpl mTab;
 
     private int mTopControlsOffset;
     private int mBottomControlsOffset;
@@ -47,6 +49,12 @@
         tab.addObserver(this);
     }
 
+    @Override
+    public void destroy() {
+        mTab.removeObserver(this);
+        mTab = null;
+    }
+
     /**
      * Sets new top control, content, and min-height offset from renderer.
      * @param topControlsOffset Top control offset.
@@ -103,6 +111,11 @@
         mOffsetInitialized = false;
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     /** @return Top control offset */
     public int topControlsOffset() {
         return mTopControlsOffset;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabIdManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabIdManager.java
index 0362697..f242cfa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabIdManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabIdManager.java
@@ -97,7 +97,7 @@
     }
 
     @VisibleForTesting
-    static void resetInstanceForTesting() {
+    public static void resetInstanceForTesting() {
         sInstance = null;
     }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
index 989d9f6..6168654 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
@@ -4,9 +4,12 @@
 
 package org.chromium.chrome.browser.tab;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.Callback;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.net.NetError;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
 
 /**
@@ -57,4 +60,9 @@
     public void onDestroyed(Tab tab) {
         tab.removeObserver(this);
     }
+
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
index 46acb35..0d4a808 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
@@ -7,11 +7,14 @@
 import android.os.SystemClock;
 import android.text.format.DateUtils;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.UserData;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.net.NetError;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
 
 /**
@@ -295,6 +298,11 @@
         }
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     private static void increaseTabShowCount() {
         sAllTabsShowCount++;
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClientLocationDelegationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClientLocationDelegationTest.java
index 0b6b964..3e9f2055 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClientLocationDelegationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClientLocationDelegationTest.java
@@ -21,6 +21,7 @@
 
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.dependency_injection.ChromeAppComponent;
@@ -43,6 +44,7 @@
  * 3. TestTrustedWebActivityService notify the result with TrustedWebActivityCallback.
  */
 @RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.PER_CLASS)
 public class TrustedWebActivityClientLocationDelegationTest {
     private static final Uri SCOPE = Uri.parse("https://www.example.com/notifications");
     private static final Origin ORIGIN = Origin.create(SCOPE);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
index b605829..09cb209 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityShareTargetTest.java
@@ -22,6 +22,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
@@ -42,6 +43,7 @@
 
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(Batch.PER_CLASS)
 public class TrustedWebActivityShareTargetTest {
     // We are not actually navigating to POST target, so ok not to use test pages here.
     private static final ShareTarget POST_SHARE_TARGET =
@@ -79,6 +81,7 @@
     @Before
     public void setUp() throws Exception {
         mJniMocker.mock(WebApkPostShareTargetNavigatorJni.TEST_HOOKS, mPostNavigatorNatives);
+        mCustomTabActivityTestRule.setFinishActivity(true);
 
         LibraryLoader.getInstance().ensureInitialized();
         mEmbeddedTestServerRule.setServerUsesHttps(true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
index 2d53ef6d..7fd13818 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -82,7 +82,8 @@
 
         NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
 
-        when(mItemDelegate.getPageUrl()).thenReturn(new GURL(PAGE_URL));
+        GURL pageUrl = new GURL(PAGE_URL);
+        when(mItemDelegate.getPageUrl()).thenReturn(pageUrl);
         when(mItemDelegate.isIncognitoSupported()).thenReturn(true);
         when(mItemDelegate.isOpenInOtherWindowSupported()).thenReturn(true);
         when(mItemDelegate.supportsCall()).thenReturn(true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
index 6858b8e..f5ccc433 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java
@@ -12,12 +12,14 @@
 
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -26,6 +28,8 @@
 import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
+import org.chromium.components.search_engines.TemplateUrl;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.url.GURL;
 
@@ -34,9 +38,15 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(Batch.PER_CLASS)
 public class ContextualSearchPolicyTest {
+    @ClassRule
+    public static ChromeTabbedActivityTestRule sActivityTestRule =
+            new ChromeTabbedActivityTestRule();
+
     @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+    public BlankCTATabInitialStateRule mInitialStateRule =
+            new BlankCTATabInitialStateRule(sActivityTestRule, false);
 
     @Mock
     private ContextualSearchFakeServer mMockServer;
@@ -46,7 +56,6 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mActivityTestRule.startMainActivityOnBlankPage();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(
                 () -> mPolicy = new ContextualSearchPolicy(null, mMockServer));
     }
@@ -126,9 +135,14 @@
     @Feature({"ContextualSearch"})
     public void testDoSendBasePageUrlWhenNonGoogleSearchEngine() {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
+            TemplateUrl defaultSearchEngine =
+                    TemplateUrlServiceFactory.get().getDefaultSearchEngineTemplateUrl();
             setupAllConditionsToSendUrl();
             TemplateUrlServiceFactory.get().setSearchEngine("yahoo.com");
             Assert.assertFalse(mPolicy.doSendBasePageUrl());
+            // Set default search engine back to default to prevent cross-talk from
+            // this test which sets it to Yahoo
+            TemplateUrlServiceFactory.get().setSearchEngine(defaultSearchEngine.getShortName());
         });
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crypto/CipherFactoryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crypto/CipherFactoryTest.java
index d7f98e7e..55301517 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/crypto/CipherFactoryTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crypto/CipherFactoryTest.java
@@ -14,6 +14,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
 import org.chromium.chrome.browser.crypto.CipherFactory.CipherDataObserver;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
@@ -29,6 +30,7 @@
  * throughout the class to simulate artificial blockages.
  */
 @RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class CipherFactoryTest {
     private static final byte[] INPUT_DATA = {1, 16, 84};
 
@@ -84,6 +86,7 @@
      */
     @Before
     public void setUp() {
+        CipherFactory.resetInstanceForTesting();
         mNumberProvider = new DeterministicParameterGenerator();
         CipherFactory.getInstance().setRandomNumberProviderForTests(mNumberProvider);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
index 8cd2c73..790790c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
@@ -8,14 +8,16 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Rule;
+import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.UiThreadTest;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
@@ -30,9 +32,10 @@
  * Test class for {@link DistilledPagePrefs}.
  */
 @RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.PER_CLASS)
 public class DistilledPagePrefsTest {
-    @Rule
-    public final ChromeBrowserTestRule mChromeBrowserTestRule = new ChromeBrowserTestRule();
+    @ClassRule
+    public static final ChromeBrowserTestRule sChromeBrowserTestRule = new ChromeBrowserTestRule();
 
     private DistilledPagePrefs mDistilledPagePrefs;
 
@@ -43,6 +46,12 @@
         getDistilledPagePrefs();
     }
 
+    @After
+    public void tearDown() {
+        // Set back to default theme
+        setTheme(Theme.LIGHT);
+    }
+
     private void getDistilledPagePrefs() {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // TODO (https://crbug.com/1063807):  Add incognito mode tests.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoViewTest.java
index ff368ac..8691b9a0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoViewTest.java
@@ -4,16 +4,12 @@
 
 package org.chromium.chrome.browser.page_info;
 
-import static org.chromium.base.test.util.Batch.PER_CLASS;
-
 import androidx.test.filters.MediumTest;
 
-import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.app.ChromeActivity;
@@ -21,7 +17,6 @@
 import org.chromium.chrome.browser.vr.VrModuleProvider;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.components.page_info.ConnectionInfoView;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -31,15 +26,9 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-@Batch(PER_CLASS)
 public class ConnectionInfoViewTest {
-    @ClassRule
-    public static final ChromeTabbedActivityTestRule sActivityTestRule =
-            new ChromeTabbedActivityTestRule();
-
     @Rule
-    public final BlankCTATabInitialStateRule mInitialStateRule =
-            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
     /**
      * Tests that ConnectionInfoView can be instantiated and shown.
@@ -48,8 +37,9 @@
     @MediumTest
     @Feature({"ConnectionInfoView"})
     public void testShow() throws InterruptedException {
+        mActivityTestRule.startMainActivityOnBlankPage();
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ChromeActivity context = sActivityTestRule.getActivity();
+            ChromeActivity context = mActivityTestRule.getActivity();
             WebContents webContents = context.getActivityTab().getWebContents();
             ConnectionInfoView.show(context, webContents, context.getModalDialogManager(),
                     VrModuleProvider.getDelegate());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
index 7a57009..78fea73 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
@@ -4,29 +4,25 @@
 
 package org.chromium.chrome.browser.page_info;
 
-import static org.chromium.base.test.util.Batch.PER_CLASS;
+import android.support.test.InstrumentationRegistry;
 
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.RequiresRestart;
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.components.page_info.PageInfoController;
 import org.chromium.components.page_info.PageInfoFeatureList;
@@ -43,21 +39,16 @@
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
-@Batch(PER_CLASS)
 public class PageInfoControllerTest {
-    @ClassRule
-    public static final ChromeTabbedActivityTestRule sActivityTestRule =
-            new ChromeTabbedActivityTestRule();
-
     @Rule
-    public final BlankCTATabInitialStateRule mInitialStateRule =
-            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
     private EmbeddedTestServer mTestServer;
 
     @Before
     public void setUp() throws Exception {
-        mTestServer = sActivityTestRule.getTestServer();
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
     }
 
     @After
@@ -73,9 +64,9 @@
     @Feature({"PageInfoController"})
     public void testShow() {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ChromeActivity activity = sActivityTestRule.getActivity();
+            ChromeActivity activity = mActivityTestRule.getActivity();
             Tab tab = activity.getActivityTab();
-            PageInfoController.show(sActivityTestRule.getActivity(), tab.getWebContents(), null,
+            PageInfoController.show(mActivityTestRule.getActivity(), tab.getWebContents(), null,
                     PageInfoController.OpenedFromSource.MENU,
                     new ChromePageInfoControllerDelegate(activity, tab.getWebContents(),
                             activity::getModalDialogManager,
@@ -92,13 +83,12 @@
     @MediumTest
     @Feature({"PageInfoController"})
     @DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
-    @RequiresRestart
     public void testPageInfoUrl() {
         String testUrl = mTestServer.getURLWithHostName("xn--allestrungen-9ib.ch", "/");
-        sActivityTestRule.loadUrlInTab(
-                testUrl, PageTransition.TYPED, sActivityTestRule.getActivity().getActivityTab());
+        mActivityTestRule.loadUrlInTab(
+                testUrl, PageTransition.TYPED, mActivityTestRule.getActivity().getActivityTab());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ChromeActivity activity = sActivityTestRule.getActivity();
+            ChromeActivity activity = mActivityTestRule.getActivity();
             Tab tab = activity.getActivityTab();
             ChromePageInfoControllerDelegate chromePageInfoControllerDelegate =
                     new ChromePageInfoControllerDelegate(activity, tab.getWebContents(),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
index 17ee516..903f192 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -18,7 +18,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import static org.chromium.base.test.util.Batch.PER_CLASS;
+import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.UI_THEME_SETTING;
 import static org.chromium.chrome.test.util.ViewUtils.onViewWaiting;
 import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;
 
@@ -34,28 +34,22 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.FeatureList;
-import org.chromium.base.test.util.Batch;
-import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.Log;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
-import org.chromium.base.test.util.RequiresRestart;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.app.ChromeActivity;
-import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
-import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
-import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils;
+import org.chromium.chrome.browser.night_mode.ThemeType;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.browser_ui.site_settings.SiteSettingsFeatureList;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge;
@@ -76,8 +70,6 @@
 import org.chromium.ui.test.util.RenderTestRule;
 
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.concurrent.TimeoutException;
 
 /**
@@ -85,31 +77,23 @@
  * configurations correctly.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.
-Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ChromeSwitches.DISABLE_STARTUP_PROMOS,
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
-@Batch(PER_CLASS)
 public class PageInfoViewTest {
+    private static final String TAG = "PageInfoViewTest";
+
     private static final String sSimpleHtml = "/chrome/test/data/android/simple.html";
     private static final String sSiteDataHtml = "/content/test/data/browsing_data/site_data.html";
 
     private static String[] sCookieDataTypes = {"Cookie", "LocalStorage", "ServiceWorker",
             "CacheStorage", "IndexedDb", "FileSystem", "WebSql"};
 
-    @ClassRule
-    public static final ChromeTabbedActivityTestRule sActivityTestRule =
-            new ChromeTabbedActivityTestRule();
+    @Rule
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
     @Rule
     public EmbeddedTestServerRule mTestServerRule = new EmbeddedTestServerRule();
 
-    @ClassRule
-    public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
-
-    @Rule
-    public final BlankCTATabInitialStateRule mInitialStateRule =
-            new BlankCTATabInitialStateRule(sActivityTestRule, false);
-
     @Rule
     public RenderTestRule mRenderTestRule =
             RenderTestRule.Builder.withPublicCorpus().setRevision(4).build();
@@ -123,13 +107,23 @@
         }
     }
 
+    @ClassRule
+    public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
+
     private void loadUrlAndOpenPageInfo(String url) {
-        sActivityTestRule.loadUrl(url);
+        mActivityTestRule.loadUrl(url);
         openPageInfo();
     }
 
     private void openPageInfo() {
-        onViewWaiting(allOf(withId(R.id.location_bar_status_icon), isDisplayed())).perform(click());
+        for (int i = 0; i < 5; i++) {
+            try {
+                onViewWaiting(allOf(withId(R.id.location_bar_status_icon), isDisplayed()));
+            } catch (AssertionError e) {
+                Log.e(TAG, "Lock icon hasn't shown up yet...");
+            }
+        }
+        onView(withId(R.id.location_bar_status_icon)).perform(click());
     }
 
     private View getPageInfoView() {
@@ -149,7 +143,7 @@
 
     private String runJavascriptAsync(String type) throws TimeoutException {
         return JavaScriptUtils.runJavascriptWithAsyncResult(
-                sActivityTestRule.getWebContents(), type);
+                mActivityTestRule.getWebContents(), type);
     }
 
     private void expectHasCookies(boolean hasData) throws TimeoutException {
@@ -200,26 +194,18 @@
         });
     }
 
-    private void clearPermissions() throws TimeoutException {
-        CallbackHelper helper = new CallbackHelper();
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            BrowsingDataBridge.getInstance().clearBrowsingData(helper::notifyCalled,
-                    new int[] {BrowsingDataType.SITE_SETTINGS}, TimePeriod.ALL_TIME);
-        });
-        helper.waitForCallback(0);
-    }
-
     @Before
     public void setUp() throws InterruptedException {
         // Some test devices have geolocation disabled. Override LocationUtils for a stable result.
         LocationUtils.setFactory(TestLocationUtils::new);
 
-        mTestServerRule.setServerUsesHttps(true);
+        // Choose a fixed, "random" port to create stable screenshots.
         mTestServerRule.setServerPort(424242);
+        mTestServerRule.setServerUsesHttps(true);
     }
 
     @After
-    public void tearDown() throws Exception {
+    public void tearDown() {
         LocationUtils.setFactory(null);
         // Notification channels don't get cleaned up automatically.
         // TODO(crbug.com/951402): Find a general solution to avoid leaking channels between tests.
@@ -229,23 +215,8 @@
                 manager.deleteAllSiteChannels();
             });
         }
-
-        setThirdPartyCookieBlocking(CookieControlsMode.INCOGNITO_ONLY);
-        clearPermissions();
-
-        // Reset features added during tests for batch.
-        FeatureList.setTestFeatures(null);
     }
 
-    // Batch tests discards the feature flags that are set by test methods.
-    // It only takes into consideration the feature flags set by the class or
-    // the first test method which was executed.
-    // TODO(roagarwal@): Remove this hack when https://crrev.com/c/2645136 is merged.
-    public void explicitOverrideFeatureFlagForBatch(boolean value) {
-        Map<String, Boolean> features = new HashMap<>();
-        features.put(PageInfoFeatureList.PAGE_INFO_V2, value);
-        FeatureList.setTestFeatures(features);
-    }
     /**
      * Tests PageInfo on an insecure website.
      */
@@ -254,7 +225,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowOnInsecureHttpWebsite() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         mTestServerRule.setServerUsesHttps(false);
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_HttpWebsite");
@@ -268,7 +239,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowOnSecureWebsite() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsite");
     }
@@ -281,7 +252,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowOnExpiredCertificateWebsite() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         mTestServerRule.setCertificateType(ServerCertificate.CERT_EXPIRED);
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_ExpiredCertWebsite");
@@ -295,7 +266,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testChromePage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         loadUrlAndOpenPageInfo("chrome://version/");
         mRenderTestRule.render(getPageInfoView(), "PageInfo_InternalSite");
     }
@@ -309,7 +280,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowWithPermissions() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         mIsSystemLocationSettingEnabled = false;
         addSomePermissions(mTestServerRule.getServer().getURL("/"));
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
@@ -324,7 +295,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowWithCookieBlocking() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_CookieBlocking");
@@ -338,7 +309,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowWithPermissionsAndCookieBlocking() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         addSomePermissions(mTestServerRule.getServer().getURL("/"));
         setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
@@ -353,7 +324,7 @@
     @Feature({"RenderTest"})
     @Features.DisableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowWithDefaultSettingPermissions() throws IOException {
-        explicitOverrideFeatureFlagForBatch(false);
+        mActivityTestRule.startMainActivityOnBlankPage();
         addDefaultSettingPermissions(mTestServerRule.getServer().getURL("/"));
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_DefaultSettingPermissions");
@@ -367,7 +338,7 @@
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowOnSecureWebsiteV2() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteV2");
     }
@@ -379,21 +350,13 @@
     @MediumTest
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
-    @RequiresRestart
     public void testShowOnSecureWebsiteDarkV2() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
-        String url = mTestServerRule.getServer().getURL(sSimpleHtml);
-
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ChromeNightModeTestUtils.setUpNightModeForChromeActivity(/*nightModeEnabled=*/true);
+            SharedPreferencesManager.getInstance().writeInt(UI_THEME_SETTING, ThemeType.DARK);
         });
-
-        loadUrlAndOpenPageInfo(url);
+        mActivityTestRule.startMainActivityOnBlankPage();
+        loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         mRenderTestRule.render(getPageInfoView(), "PageInfo_SecureWebsiteDarkV2");
-
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ChromeNightModeTestUtils.setUpNightModeForChromeActivity(/*nightModeEnabled=*/false);
-        });
     }
 
     /**
@@ -404,7 +367,7 @@
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowConnectionInfoSubpage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         onView(withId(R.id.page_info_connection_row)).perform(click());
         onViewWaiting(
@@ -421,7 +384,7 @@
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowPermissionsSubpage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         addSomePermissions(mTestServerRule.getServer().getURL("/"));
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         onView(withId(R.id.page_info_permissions_row)).perform(click());
@@ -440,7 +403,7 @@
             {PageInfoFeatureList.PAGE_INFO_V2, SiteSettingsFeatureList.ACTIONABLE_CONTENT_SETTINGS})
     public void
     testShowPermissionsActionableSubpage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         addSomePermissions(mTestServerRule.getServer().getURL("/"));
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         onView(withId(R.id.page_info_permissions_row)).perform(click());
@@ -456,7 +419,7 @@
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowCookiesSubpage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         setThirdPartyCookieBlocking(CookieControlsMode.BLOCK_THIRD_PARTY);
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         onView(withId(R.id.page_info_cookies_row)).perform(click());
@@ -473,7 +436,7 @@
     @MediumTest
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testNoPermissionsSubpage() throws IOException {
-        explicitOverrideFeatureFlagForBatch(true);
+        mActivityTestRule.startMainActivityOnBlankPage();
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(sSimpleHtml));
         onView(withId(R.id.page_info_permissions_row))
                 .check(matches(withEffectiveVisibility(GONE)));
@@ -487,8 +450,8 @@
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     @FlakyTest(message = "https://crbug.com/1147236")
     public void testClearCookiesOnSubpage() throws Exception {
-        explicitOverrideFeatureFlagForBatch(true);
-        sActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
         // Create cookies.
         expectHasCookies(false);
         createCookies();
@@ -514,8 +477,8 @@
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     @DisabledTest(message = "Flaky, see crbug.com/1169667")
     public void testResetPermissionsOnSubpage() throws Exception {
-        explicitOverrideFeatureFlagForBatch(true);
-        sActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mActivityTestRule.loadUrl(mTestServerRule.getServer().getURL(sSiteDataHtml));
         String url = mTestServerRule.getServer().getURL("/");
         // Create permissions.
         expectHasPermissions(url, false);
@@ -542,9 +505,9 @@
     @MediumTest
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testPaintPreview() {
+        mActivityTestRule.startMainActivityOnBlankPage();
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            explicitOverrideFeatureFlagForBatch(true);
-            final ChromeActivity activity = sActivityTestRule.getActivity();
+            final ChromeActivity activity = mActivityTestRule.getActivity();
             final Tab tab = activity.getActivityTab();
             ChromePageInfoControllerDelegate pageInfoControllerDelegate =
                     new ChromePageInfoControllerDelegate(activity, tab.getWebContents(),
@@ -555,7 +518,7 @@
                             return true;
                         }
                     };
-            PageInfoController.show(sActivityTestRule.getActivity(), tab.getWebContents(), null,
+            PageInfoController.show(mActivityTestRule.getActivity(), tab.getWebContents(), null,
                     PageInfoController.OpenedFromSource.MENU, pageInfoControllerDelegate,
                     new ChromePermissionParamsListBuilderDelegate());
         });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditorTest.java
deleted file mode 100644
index f7cb1ed0..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordEntryEditorTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2020 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.password_manager.settings;
-
-import static android.text.InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.action.ViewActions.click;
-import static androidx.test.espresso.action.ViewActions.typeText;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-
-import static org.mockito.Mockito.verify;
-
-import static org.chromium.base.test.util.CriteriaHelper.pollUiThread;
-import static org.chromium.chrome.browser.password_manager.settings.PasswordSettingsTest.withSaveMenuIdOrText;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.EditText;
-
-import androidx.test.espresso.matcher.BoundedMatcher;
-import androidx.test.filters.SmallTest;
-
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-
-/**
- * View tests for the password entry editor screen.
- */
-@RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-public class PasswordEntryEditorTest {
-    private static final String URL = "https://example.com";
-    private static final String USERNAME = "test user";
-    private static final String PASSWORD = "passw0rd";
-
-    @Mock
-    private PasswordEditingDelegate mMockPasswordEditingDelegate;
-
-    private PasswordEntryEditor mPasswordEntryEditor;
-
-    @Rule
-    public SettingsActivityTestRule<PasswordEntryEditor> mTestRule =
-            new SettingsActivityTestRule<>(PasswordEntryEditor.class);
-
-    @Before
-    public void setUp() throws InterruptedException {
-        MockitoAnnotations.initMocks(this);
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(
-                mMockPasswordEditingDelegate);
-
-        launchEditor();
-        pollUiThread(() -> mPasswordEntryEditor != null);
-    }
-    /**
-     * Check that the password editing activity displays the data received through arguments.
-     */
-    @Test
-    @SmallTest
-    public void testPasswordDataDisplayedInEditingActivity() {
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(
-                mMockPasswordEditingDelegate);
-
-        onView(withId(R.id.site_edit)).check(matches(withText(URL)));
-        onView(withId(R.id.username_edit)).check(matches(withText(USERNAME)));
-        onView(withId(R.id.password_edit)).check(matches(withText(PASSWORD)));
-    }
-
-    /**
-     * Check that the password editing method from the PasswordEditingDelegate was called when the
-     * save button in the password editing activity was clicked.
-     */
-    @Test
-    @SmallTest
-    public void testPasswordEditingMethodWasCalled() throws Exception {
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(
-                mMockPasswordEditingDelegate);
-        onView(withId(R.id.username_edit)).perform(typeText(" new"));
-
-        onView(withSaveMenuIdOrText()).perform(click());
-
-        verify(mMockPasswordEditingDelegate).editSavedPasswordEntry(USERNAME + " new", PASSWORD);
-    }
-
-    /**
-     * Check that the stored password is visible after clicking the unmasking icon and invisible
-     * after another click.
-     */
-    @Test
-    @SmallTest
-    public void testStoredPasswordCanBeUnmaskedAndMaskedAgain() {
-        ReauthenticationManager.setApiOverride(ReauthenticationManager.OverrideState.AVAILABLE);
-        ReauthenticationManager.setScreenLockSetUpOverride(
-                ReauthenticationManager.OverrideState.AVAILABLE);
-
-        ReauthenticationManager.recordLastReauth(
-                System.currentTimeMillis(), ReauthenticationManager.ReauthScope.ONE_AT_A_TIME);
-
-        // Masked by default
-        onView(withId(R.id.password_edit)).check(matches(isVisiblePasswordInput(false)));
-
-        // Clicking the unmask button shows the password.
-        onView(withId(R.id.password_entry_editor_view_password)).perform(click());
-        onView(withId(R.id.password_edit)).check(matches(isVisiblePasswordInput(true)));
-
-        // Clicking the mask button hides the password again.
-        onView(withId(R.id.password_entry_editor_view_password)).perform(click());
-        onView(withId(R.id.password_edit)).check(matches(isVisiblePasswordInput(false)));
-    }
-
-    private void launchEditor() {
-        Bundle fragmentArgs = new Bundle();
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_URL, URL);
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_NAME, USERNAME);
-        fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_PASSWORD, PASSWORD);
-        mTestRule.startSettingsActivity(fragmentArgs);
-        mPasswordEntryEditor = mTestRule.getFragment();
-    }
-
-    /**
-     * Matches any {@link EditText} which has the content visibility matching to |shouldBeVisible|.
-     * @return The matcher checking the input type.
-     */
-    private static Matcher<View> isVisiblePasswordInput(final boolean shouldBeVisible) {
-        return new BoundedMatcher<View, EditText>(EditText.class) {
-            @Override
-            public boolean matchesSafely(EditText editText) {
-                return ((editText.getInputType() & TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
-                               == TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
-                        == shouldBeVisible;
-            }
-
-            @Override
-            public void describeTo(Description description) {
-                if (shouldBeVisible) {
-                    description.appendText("The content should be visible.");
-                } else {
-                    description.appendText("The content should not be visible.");
-                }
-            }
-        };
-    }
-}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java
index 66f42caf..253ec25 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettingsTest.java
@@ -104,13 +104,11 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
-import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
-import org.chromium.components.browser_ui.settings.SettingsLauncher;
 import org.chromium.components.prefs.PrefService;
 import org.chromium.components.sync.ModelType;
 import org.chromium.components.user_prefs.UserPrefs;
@@ -132,8 +130,6 @@
 @RunWith(ChromeJUnit4ClassRunner.class)
 public class PasswordSettingsTest {
     private static final long UI_UPDATING_TIMEOUT_MS = 3000;
-    @Mock
-    private PasswordEditingDelegate mMockPasswordEditingDelegate;
 
     @Rule
     public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
@@ -272,16 +268,6 @@
         @Override
         public void showPasswordEntryEditingView(Context context, int index) {
             mLastEntryIndex = index;
-            Bundle fragmentArgs = new Bundle();
-            fragmentArgs.putString(
-                    PasswordEntryEditor.CREDENTIAL_URL, getSavedPasswordEntry(index).getUrl());
-            fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_NAME,
-                    getSavedPasswordEntry(index).getUserName());
-            fragmentArgs.putString(PasswordEntryEditor.CREDENTIAL_PASSWORD,
-                    getSavedPasswordEntry(index).getPassword());
-            SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
-            settingsLauncher.launchSettingsActivity(
-                    context, PasswordEntryEditor.class, fragmentArgs);
         }
     }
 
@@ -752,8 +738,6 @@
     @Feature({"Preferences"})
     @EnableFeatures({ChromeFeatureList.EDIT_PASSWORDS_IN_SETTINGS})
     public void testSelectedStoredPasswordIndexIsSameAsInShowPasswordEntryEditingView() {
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(
-                mMockPasswordEditingDelegate);
         setPasswordSourceWithMultipleEntries( // Initialize preferences
                 new SavedPasswordEntry[] {new SavedPasswordEntry("https://example.com",
                                                   "example user", "example password"),
@@ -768,37 +752,6 @@
     }
 
     /**
-     * Check that the changes of password data are shown in the password viewing activity and in the
-     * list of passwords after the save button was clicked.
-     */
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @EnableFeatures(ChromeFeatureList.EDIT_PASSWORDS_IN_SETTINGS)
-    public void testChangeOfStoredPasswordDataIsPropagated() throws Exception {
-        PasswordEditingDelegateProvider.getInstance().setPasswordEditingDelegate(
-                mMockPasswordEditingDelegate);
-        setPasswordSource(new SavedPasswordEntry("https://example.com", "test user", "password"));
-
-        startPasswordSettingsFromMainSettings();
-
-        Espresso.onView(withId(R.id.recycler_view))
-                .perform(scrollToHolder(hasTextInViewHolder("test user")));
-        Espresso.onView(withText(containsString("test user"))).perform(click());
-
-        // Performing a change of saved credentials.
-        mHandler.mSavedPasswords.set(
-                0, new SavedPasswordEntry("https://example.com", "test user new", "password"));
-
-        Espresso.onView(withSaveMenuIdOrText()).perform(click());
-
-        // Check if the password preferences activity has the updated data in the list of passwords.
-        Espresso.onView(withId(R.id.recycler_view))
-                .perform(scrollToHolder(hasTextInViewHolder("test user new")));
-        Espresso.onView(withText("test user new")).check(matches(isDisplayed()));
-    }
-
-    /**
      * Check that if there are no saved passwords, the export menu item is disabled.
      */
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegateTest.java
index 06b4202..245a2f8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegateTest.java
@@ -10,18 +10,20 @@
 
 import androidx.test.filters.SmallTest;
 
-import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.chromium.base.task.PostTask;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
@@ -32,15 +34,17 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(SiteSettingsTest.SITE_SETTINGS_BATCH_NAME)
 public class ChromeSiteSettingsDelegateTest {
-    @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
-    ChromeSiteSettingsDelegate mSiteSettingsDelegate;
+    @ClassRule
+    public static ChromeTabbedActivityTestRule sActivityTestRule =
+            new ChromeTabbedActivityTestRule();
 
-    @Before
-    public void setUp() throws Exception {
-        mActivityTestRule.startMainActivityOnBlankPage();
-    }
+    @Rule
+    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
+            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+
+    ChromeSiteSettingsDelegate mSiteSettingsDelegate;
 
     // Tests that a fallback favicon is generated when a real one isn't found locally.
     // This is a regression test for crbug.com/1077716.
@@ -49,7 +53,7 @@
     public void testFallbackFaviconLoads() throws TimeoutException {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mSiteSettingsDelegate = new ChromeSiteSettingsDelegate(
-                    mActivityTestRule.getActivity(), Profile.getLastUsedRegularProfile());
+                    sActivityTestRule.getActivity(), Profile.getLastUsedRegularProfile());
         });
 
         // Hold the Bitmap in an array because it gets assigned to in a closure, and all captured
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
index 75eba43..7162331 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
@@ -6,20 +6,27 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Assert;
-import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
+import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.OTRProfileID;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni;
@@ -29,20 +36,33 @@
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
 
 /** Tests for the PermissionInfoTest. */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(SiteSettingsTest.SITE_SETTINGS_BATCH_NAME)
 public class PermissionInfoTest {
     private static final String DSE_ORIGIN = "https://www.google.com";
     private static final String OTHER_ORIGIN = "https://www.other.com";
 
-    @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+    @ClassRule
+    public static ChromeTabbedActivityTestRule sActivityTestRule =
+            new ChromeTabbedActivityTestRule();
 
-    @Before
-    public void setUp() throws Exception {
-        mActivityTestRule.startMainActivityOnBlankPage();
+    @Rule
+    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
+            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+
+    @After
+    public void tearDown() throws TimeoutException {
+        // Clean up cookies and permissions.
+        CallbackHelper helper = new CallbackHelper();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            BrowsingDataBridge.getInstance().clearBrowsingData(helper::notifyCalled,
+                    new int[] {BrowsingDataType.SITE_SETTINGS}, TimePeriod.ALL_TIME);
+        });
+        helper.waitForCallback(0);
     }
 
     private static Profile getRegularProfile() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
index 1f349ef2..c9ffd8a82 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
@@ -21,16 +21,21 @@
 
 import org.junit.After;
 import org.junit.Assert;
-import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
+import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
@@ -41,6 +46,7 @@
 import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil;
 import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
@@ -61,6 +67,7 @@
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
 import org.chromium.components.embedder_support.util.Origin;
+import org.chromium.components.location.LocationUtils;
 import org.chromium.components.permissions.nfc.NfcSystemLevelSetting;
 import org.chromium.components.policy.test.annotations.Policies;
 import org.chromium.components.user_prefs.UserPrefs;
@@ -80,22 +87,47 @@
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1", "ignore-certificate-errors"})
+@Batch(SiteSettingsTest.SITE_SETTINGS_BATCH_NAME)
 public class SiteSettingsTest {
+    public static final String SITE_SETTINGS_BATCH_NAME = "site_settings";
+
+    @ClassRule
+    public static PermissionTestRule mPermissionRule = new PermissionTestRule(true);
+
     @Rule
-    public PermissionTestRule mPermissionRule = new PermissionTestRule(true);
+    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
+            new BlankCTATabInitialStateRule(mPermissionRule, false);
 
     private PermissionUpdateWaiter mPermissionUpdateWaiter;
 
-    @Before
-    public void setUp() throws Exception {
-        mPermissionRule.startMainActivityOnBlankPage();
-    }
-
     @After
-    public void tearDown() {
+    public void tearDown() throws TimeoutException {
         if (mPermissionUpdateWaiter != null) {
             mPermissionRule.getActivity().getActivityTab().removeObserver(mPermissionUpdateWaiter);
         }
+
+        // Clean up default content setting and system settings.
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            for (int t = 0; t < SiteSettingsCategory.Type.NUM_ENTRIES; t++) {
+                if (SiteSettingsCategory.contentSettingsType(t) >= 0) {
+                    WebsitePreferenceBridge.setContentSetting(getBrowserContextHandle(),
+                            SiteSettingsCategory.contentSettingsType(t),
+                            ContentSettingValues.DEFAULT);
+                }
+            }
+        });
+        LocationUtils.setFactory(null);
+        LocationProviderOverrider.setLocationProviderImpl(null);
+        NfcSystemLevelSetting.resetNfcForTesting();
+
+        // Clean up cookies and permissions.
+        CallbackHelper helper = new CallbackHelper();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            BrowsingDataBridge.getInstance().clearBrowsingData(helper::notifyCalled,
+                    new int[] {BrowsingDataType.COOKIES, BrowsingDataType.SITE_SETTINGS},
+                    TimePeriod.ALL_TIME);
+        });
+        helper.waitForCallback(0);
     }
 
     private void initializeUpdateWaiter(final boolean expectGranted) {
@@ -233,7 +265,7 @@
                     (FourStateCookieSettingsPreference) preferences.findPreference(
                             SingleCategorySettings.FOUR_STATE_COOKIE_TOGGLE_KEY);
             Assert.assertEquals(state + " button should be " + (expected ? "enabled" : "disabled"),
-                    fourStateCookieToggle.isButtonEnabledForTesting(state), expected);
+                    expected, fourStateCookieToggle.isButtonEnabledForTesting(state));
         });
     }
 
@@ -241,9 +273,9 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Assert.assertEquals(
                     "Default Cookie Setting should be " + (expected ? "managed" : "unmanaged"),
+                    expected,
                     WebsitePreferenceBridge.isContentSettingManaged(
-                            getBrowserContextHandle(), ContentSettingsType.COOKIES),
-                    expected);
+                            getBrowserContextHandle(), ContentSettingsType.COOKIES));
         });
     }
 
@@ -251,9 +283,9 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Assert.assertEquals(
                     "Third Party Cookie Blocking should be " + (expected ? "managed" : "unmanaged"),
+                    expected,
                     UserPrefs.get(Profile.getLastUsedRegularProfile())
-                            .isManagedPreference(COOKIE_CONTROLS_MODE),
-                    expected);
+                            .isManagedPreference(COOKIE_CONTROLS_MODE));
         });
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
index d2c7daa..c06afcc7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -10,15 +10,20 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.chromium.base.Callback;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
+import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
+import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
@@ -45,6 +50,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * Tests for WebsitePermissionsFetcher.
@@ -53,6 +59,7 @@
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         WebsitePermissionsFetcherTest.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES,
         WebsitePermissionsFetcherTest.ENABLE_WEB_BLUETOOTH_NEW_PERMISSIONS_BACKEND})
+@Batch(Batch.PER_CLASS)
 public class WebsitePermissionsFetcherTest {
     @Rule
     public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
@@ -273,6 +280,17 @@
         }
     }
 
+    @After
+    public void tearDown() throws TimeoutException {
+        // Clean up permissions.
+        CallbackHelper helper = new CallbackHelper();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            BrowsingDataBridge.getInstance().clearBrowsingData(helper::notifyCalled,
+                    new int[] {BrowsingDataType.SITE_SETTINGS}, TimePeriod.ALL_TIME);
+        });
+        helper.waitForCallback(0);
+    }
+
     @Test
     @SmallTest
     public void testNullsCanBeHandled() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabIdManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabIdManagerTest.java
index 1cbc521c..9a15134 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabIdManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabIdManagerTest.java
@@ -9,6 +9,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -33,6 +34,11 @@
         TabIdManager.resetInstanceForTesting();
     }
 
+    @After
+    public void tearDown() {
+        TabIdManager.resetInstanceForTesting();
+    }
+
     /** Tests that IDs are stored and generated properly. */
     @Test
     @UiThreadTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java
index 154dc91..2a81569 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java
@@ -85,6 +85,7 @@
                                                            .getTargetContext()
                                                            .getApplicationContext());
         ContextUtils.initApplicationContextForTests(mAppContext);
+        TabIdManager.resetInstanceForTesting();
     }
 
     static class AdvancedMockContextWithTestDir extends AdvancedMockContext {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java
index 0209475a..d7acb332 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrPermissionTest.java
@@ -129,7 +129,7 @@
     @MediumTest
     @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL})
     @DisableIf.Build(message = "https://crbug.com/1091800, https://crbug.com/1166223",
-            sdk_is_less_than = Build.VERSION_CODES.M, sdk_is_greater_than = Build.VERSION_CODES.P)
+            sdk_is_less_than = Build.VERSION_CODES.P, sdk_is_greater_than = Build.VERSION_CODES.R)
     public void
     testPermissionPersistsAfterReload() {
         mWebXrVrPermissionTestFramework.loadFileAndAwaitInitialization(
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index e58e479c..273dd0f 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-90.0.4399.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-90.0.4400.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_exe_main_win.cc b/chrome/app/chrome_exe_main_win.cc
index 1a4da34..15ce45f 100644
--- a/chrome/app/chrome_exe_main_win.cc
+++ b/chrome/app/chrome_exe_main_win.cc
@@ -356,10 +356,10 @@
   delete loader;
 
   // Process shutdown is hard and some process types have been crashing during
-  // shutdown. TerminateProcess is safer and faster.
+  // shutdown. TerminateCurrentProcessImmediately is safer and faster.
   if (process_type == switches::kUtilityProcess ||
       process_type == switches::kPpapiPluginProcess) {
-    TerminateProcess(GetCurrentProcess(), rc);
+    base::Process::TerminateCurrentProcessImmediately(rc);
   }
   return rc;
 }
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index b54a1234..275f005 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3876,7 +3876,7 @@
     Restart requested
   </message>
   <message name="IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_MESSAGE" desc="Message in the notification shown to the user when ARC data snapshot must be updated">
-    You Administrator requested to restart your device to update apps. This may take several minutes to complete
+    Your administrator requested to restart your device to update apps. This may take several minutes to complete.
   </message>
   <message name="IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_RESTART_BUTTON" desc="Label on button in the notification shown to the user when ARC data snapshot must be updated">
     Restart
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_MESSAGE.png.sha1
index 78e53259..6efd1a1 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_MESSAGE.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_MESSAGE.png.sha1
@@ -1 +1 @@
-b09211972ca9a49469070e4a9b6f13ec55902db9
\ No newline at end of file
+6d9fa6d4901fef7bdc23a563ff8d0a08ede70f24
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_RESTART_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_RESTART_BUTTON.png.sha1
index 78e53259..6efd1a1 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_RESTART_BUTTON.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_RESTART_BUTTON.png.sha1
@@ -1 +1 @@
-b09211972ca9a49469070e4a9b6f13ec55902db9
\ No newline at end of file
+6d9fa6d4901fef7bdc23a563ff8d0a08ede70f24
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_TITLE.png.sha1
index 78e53259..6efd1a1 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_TITLE.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_ARC_SNAPSHOT_RESTART_NOTIFICATION_TITLE.png.sha1
@@ -1 +1 @@
-b09211972ca9a49469070e4a9b6f13ec55902db9
\ No newline at end of file
+6d9fa6d4901fef7bdc23a563ff8d0a08ede70f24
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 084e9ed0..b17fd7d 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5807,6 +5807,9 @@
       <message name="IDS_ACCDESCRIPTION_BACK" desc="Help text that explains to keyboard users how to interact with the back button, similar to the tooltip presented to mouse users.">
         Press to go back, context menu to see history
       </message>
+      <message name="IDS_TOOLTIP_CHROMELABS_BUTTON" desc="The tooltip for the Chrome Labs button in the toolbar">
+      Experiments
+      </message>
       <message name="IDS_TOOLTIP_FORWARD" desc="The tooltip for forward button">
         Click to go forward, hold to see history
       </message>
diff --git a/chrome/app/generated_resources_grd/IDS_TOOLTIP_CHROMELABS_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_TOOLTIP_CHROMELABS_BUTTON.png.sha1
new file mode 100644
index 0000000..f4a6037
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_TOOLTIP_CHROMELABS_BUTTON.png.sha1
@@ -0,0 +1 @@
+fa9e8b6afdcdc5e6333759013cdf12fe4c8f9873
\ No newline at end of file
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp
index 69d7947..22a0a9e 100644
--- a/chrome/app/profiles_strings.grdp
+++ b/chrome/app/profiles_strings.grdp
@@ -664,6 +664,9 @@
     <message name="IDS_PROFILE_CUSTOMIZATION_PICK_THEME_TITLE" desc="Title of the section of the profile customization bubble where the user can select a theme color for the profile">
       Pick a theme color
     </message>
+    <message name="IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL" desc="Not displayed. Used by screen readers to describe the input used to rename the profile.">
+      Rename your profile
+    </message>
 
     <!-- Profile Picker -->
     <message name="IDS_PROFILE_PICKER_ADD_SPACE_BUTTON" desc="Text for the add space button on the profile picker main view">
@@ -681,6 +684,9 @@
     <message name="IDS_PROFILE_PICKER_PROFILE_CARD_LABEL" desc="Label for a profile card button that opens a new profile">
       Open <ph name="PROFILE_NAME">$1<ex>User</ex></ph> profile
     </message>
+    <message name="IDS_PROFILE_PICKER_PROFILE_CARD_INPUT_LABEL" desc="Not displayed. Used by screen readers to describe the input used to rename the profile.">
+      Rename your profile
+    </message>
     <message name="IDS_PROFILE_PICKER_PROFILE_MENU_REMOVE_TEXT" desc="Text of the remove button in profile card menu.">
       Delete
     </message>
diff --git a/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL.png.sha1
new file mode 100644
index 0000000..1cfbde4
--- /dev/null
+++ b/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL.png.sha1
@@ -0,0 +1 @@
+9f9cf7e62f9b687c1d7d3da3d7bd41af5a430bde
\ No newline at end of file
diff --git a/chrome/app/profiles_strings_grdp/IDS_PROFILE_PICKER_PROFILE_CARD_INPUT_LABEL.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_PROFILE_PICKER_PROFILE_CARD_INPUT_LABEL.png.sha1
new file mode 100644
index 0000000..5e129a6
--- /dev/null
+++ b/chrome/app/profiles_strings_grdp/IDS_PROFILE_PICKER_PROFILE_CARD_INPUT_LABEL.png.sha1
@@ -0,0 +1 @@
+374de420da646ee53b8e117ff89092cec1432d06
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index 9a57124f..66da64e5 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -92,7 +92,7 @@
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation>
 <translation id="388648406173476553">自定义和控制 Chromium。出了点需要您注意的状况 - 点击即可查看详情。</translation>
 <translation id="3889543394854987837">点击您的姓名即可打开Chromium并开始浏览。</translation>
-<translation id="390528597099634151"><ph name="EXISTING_USER" />已登录这份 Chromium 个人资料。Chromium 可为您创建一份专属的个人资料,以将您的浏览数据与该用户的浏览数据分隔开来。</translation>
+<translation id="390528597099634151"><ph name="EXISTING_USER" />已登录这份 Chromium 个人资料。Chromium 可为您创建一份专属的个人资料,以将您的浏览数据单独存储。</translation>
 <translation id="3945058413678539331">Chromium 正在尝试复制密码。请输入您的 Windows 密码以允许此操作。</translation>
 <translation id="4036079820698952681">报告<ph name="BEGIN_LINK" />当前设置<ph name="END_LINK" />,协助我们改进 Chromium</translation>
 <translation id="4050175100176540509">最新版本不仅在安全性方面做出了重要改进,还提供了多项新功能。</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 2f22d263..65c9601 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Kopieer URL</translation>
 <translation id="2155772377859296191">Lyk soos <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Dienswerker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Doen veiligheidskontrole weer</translation>
 <translation id="2157474325782140681">Gebruik 'n Dell-dokstasie wat ontwerp is om saam met hierdie Chromebook te gebruik om bykomende kenmerke te kry.</translation>
 <translation id="215753907730220065">Gaan by Volskerm uit</translation>
 <translation id="2157875535253991059">Hierdie bladsy is nou volskerm.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Kode-ondertekening</translation>
 <translation id="3227137524299004712">Mikrofoon</translation>
 <translation id="3233271424239923319">Rugsteun- Linux-programme en lêers</translation>
+<translation id="3238192140106069382">Koppel en verifieer tans</translation>
 <translation id="3239373508713281971">Tydlimiet vir <ph name="APP_NAME" /> is verwyder</translation>
 <translation id="3241680850019875542">Kies die wortelgids vir die uitbreiding om te pak. Om 'n uitbreiding op te dateer, kies ook die private sleutel om te hergebruik.</translation>
 <translation id="3244294424315804309">Hou aan om klank te demp</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Bestaande video van kamera of lêer af</translation>
 <translation id="3884152383786131369">Webinhoud wat in veelvuldige tale beskikbaar is, sal die eerste gesteunde taal op hierdie lys gebruik. Hierdie voorkeure word met jou blaaierinstellings gesinkroniseer. <ph name="BEGIN_LINK_LEARN_MORE" />Kom meer te wete<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Jou versoek om by hierdie werf in te gaan, is na <ph name="NAME" /> gestuur</translation>
-<translation id="3888364689515978571">Af. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Maak tans notas met <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Skakel Chrome-sinkronisering aan om Wi-fi-sinkronisering te gebruik</translation>
 <translation id="3892414795099177503">Voeg OpenVPN / L2TP by …</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Voer boekmerke en instellings in</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Skakel sellulêre netwerk af</translation>
-<translation id="3965730875470565266">Aan, <ph name="MINUTES" /> minute</translation>
 <translation id="3965811923470826124">Met</translation>
 <translation id="3965965397408324205">Verlaat <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Kies 'n ander vouer …</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profiele</translation>
 <translation id="583281660410589416">Onbekend</translation>
 <translation id="5833397272224757657">Gebruik inhoud op werwe wat jy besoek, asook blaaieraktiwiteit en -interaksies vir personalisering</translation>
-<translation id="5833551944249825624">Almal in die omtrek sal jou Chromebook vir 5 minute kan sien</translation>
 <translation id="5833726373896279253">Hierdie instellings kan slegs deur die eienaar verander word:</translation>
 <translation id="5834581999798853053">Ongeveer <ph name="TIME" /> minute oor</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera- of mikrofoonopname</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index b399d974..2ad258a 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">URL ቅዳ</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ይመስላል</translation>
 <translation id="2156294658807918600">አገልግሎት ሠራተኛ፦ <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">የደህንነት ፍተሻውን እንደገና አሂድ</translation>
 <translation id="2157474325782140681">ተጨማሪ ባሕሪያትን ለማግኘት፣ ከዚህ Chromebook ጋር እንዲሠራ የተዘጋጀውን የ Dell ተከላ ጣቢያ ይጠቀሙ።</translation>
 <translation id="215753907730220065">ከሙሉ ገጽ ዕይታ ውጣ</translation>
 <translation id="2157875535253991059">ይህ ገጽ አሁን ሙሉ ማያ ገጽ ነው።</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">ኮድ መፈረም</translation>
 <translation id="3227137524299004712">ማይክሮፎን</translation>
 <translation id="3233271424239923319">Linux መተግበሪያዎችን እና ፋይሎችን በምትኬ ያስቀምጡ</translation>
+<translation id="3238192140106069382">በመገናኘት እና በማረጋገጥ ላይ</translation>
 <translation id="3239373508713281971">ለ<ph name="APP_NAME" /> የጊዜ ገደብ ተወግዷል</translation>
 <translation id="3241680850019875542">ለመሸከፍ የቅጥያውን ስርወ ማውጫ ይምረጡ። ቅጥያውን ለማዘመን እንዲሁ የግል ቁልፍ ፋይልን እንደገና ለመጠቀም ይምረጡ።</translation>
 <translation id="3244294424315804309">ድምጽን መዝጋቱ ቀጥል</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">ከካሜራ ወይም ፋይል ላይ ያለ ቪዲዮ</translation>
 <translation id="3884152383786131369">በበርካታ ቋንቋዎች የሚገኝ የድር ይዘት ከዚህ ዝርዝር ላይ የመጀመሪያውን የሚደገፍ ቋንቋ ይጠቀማል። እነዚህ ምርጫዎች ከአሳሽዎ ቅንብሮች ጋር ይሰምራሉ። <ph name="BEGIN_LINK_LEARN_MORE" />የበለጠ ለመረዳት<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ይህን ጣቢያ የመድረስ ጥያቄዎ ለ<ph name="NAME" /> ተልኳል</translation>
-<translation id="3888364689515978571">ጠፍቷል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">ማስታወሻዎችን በ<ph name="LOCK_SCREEN_APP_NAME" /> በመውሰድ ላይ</translation>
 <translation id="3890064827463908288">የWi-Fi ስምረትን ለመጠቀም የChrome ስምረትን ያብሩ</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ያክሉ...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">ዕልባቶችን እና ቅንብሮችን አስመጣ</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ተንቀሳቃሽ አውታረ መረብን አጥፋ</translation>
-<translation id="3965730875470565266">በርቷል፣ <ph name="MINUTES" /> ደቂቃ</translation>
 <translation id="3965811923470826124">ከ</translation>
 <translation id="3965965397408324205">ከ<ph name="PROFILE_NAME" /> ውጣ</translation>
 <translation id="3966072572894326936">ሌላ አቃፊ ምረጥ…</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">መገለጫዎች</translation>
 <translation id="583281660410589416">ያልታወቀ </translation>
 <translation id="5833397272224757657">እርስዎ የሚጎበኙዋቸውን ጣቢያዎች ላይ ይዘትን እንዲሁም የአሰሳ እንቅስቃሴ እና መስተጋብሮች ለግላዊነት ለማላበስ ይጠቀማል</translation>
-<translation id="5833551944249825624">የእርስዎ Chromebook ለ5 ደቂቃ በአቅራቢያ ላለ ለሁሉም ይታያል</translation>
 <translation id="5833726373896279253">እነዚህ ቅንብሮች በባለቤቱ ብቻ ነው ሊቀየሩ የሚችሉት።</translation>
 <translation id="5834581999798853053"><ph name="TIME" /> ደቂቃዎች አካባቢ ቀርቷል</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ካሜራ ወይም ማይክራፎን በመቅረጽ ላይ ነው</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index a10754a..1f434b2 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1049,6 +1049,7 @@
 <translation id="2154710561487035718">‏نسخ عنوان URL</translation>
 <translation id="2155772377859296191">‏تبدو كـ <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">مشغّل الخدمات: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">تشغيل اختبار "التحقق من الأمان" مرة أخرى</translation>
 <translation id="2157474325782140681">‏للحصول على ميزات إضافية، يُرجى استخدام محطة إرساء Dell المصمّمة للعمل مع جهاز Chromebook هذا.</translation>
 <translation id="215753907730220065">إنهاء وضع ملء الشاشة</translation>
 <translation id="2157875535253991059">هذه الصفحة في وضع ملء الشاشة الآن.</translation>
@@ -1994,6 +1995,7 @@
 <translation id="3225319735946384299">التوقيع بالرمز</translation>
 <translation id="3227137524299004712">الميكروفون</translation>
 <translation id="3233271424239923319">‏الاحتفاظ بنسخة احتياطية من تطبيقات وملفات Linux</translation>
+<translation id="3238192140106069382">جارٍ الاتصال والتحقق</translation>
 <translation id="3239373508713281971">تمت إزالة المهلة المحددّة لتطبيق <ph name="APP_NAME" />.</translation>
 <translation id="3241680850019875542">حدد الدليل الجذر للإضافة المراد إنشاء حزمة لها، ولتحديث إضافة، حدد أيضًا ملف المفتاح الخاص لإعادة استخدامه.</translation>
 <translation id="3244294424315804309">استمرار كتم الصوت</translation>
@@ -2591,7 +2593,6 @@
 <translation id="3882165008614329320">الفيديو الحالي من الكاميرا أو الملف</translation>
 <translation id="3884152383786131369">سيستخدم محتوى الويب المتوفّر بلغات متعدّدة أول لغة معتمَدة من القائمة. وستتم مزامنة هذه الإعدادات المفضّلة مع إعدادات المتصفّح. <ph name="BEGIN_LINK_LEARN_MORE" />مزيد من المعلومات<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">تمّ إرسال طلبك للدخول إلى هذا الموقع إلى <ph name="NAME" /></translation>
-<translation id="3888364689515978571">غير مفعَّلة. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">تسجيل الملاحظات من خلال <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">‏تفعيل ميزة "مزامنة Chrome" لاستخدام "مزامنة الواي فاي"</translation>
 <translation id="3892414795099177503">‏إضافة OpenVPN / L2TP...</translation>
@@ -2672,7 +2673,6 @@
 <translation id="3958088479270651626">استيراد الإشارات المرجعية والإعدادات</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">إيقاف شبكة الجوّال</translation>
-<translation id="3965730875470565266">مفعَّلة لمدة <ph name="MINUTES" /> دقيقة.</translation>
 <translation id="3965811923470826124">مع</translation>
 <translation id="3965965397408324205">الخروج من <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">اختيار مجلد آخر...</translation>
@@ -4223,7 +4223,6 @@
 <translation id="5832813618714645810">الملفات الشخصية</translation>
 <translation id="583281660410589416">غير معروف</translation>
 <translation id="5833397272224757657">يتم استخدام المحتوى على المواقع الإلكترونية التي تزورها، بالإضافة إلى نشاط المتصفِّح وتفاعلاته للتخصيص.</translation>
-<translation id="5833551944249825624">‏سيكون Chromebook مرئيًا لجميع المستخدمين القريبين منك لمدة 5 دقائق.</translation>
 <translation id="5833726373896279253">يمكن تعديل هذه الإعدادات بواسطة المالك فقط: </translation>
 <translation id="5834581999798853053">تتبقى <ph name="TIME" /> دقيقة تقريبًا</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - تسجيل الكاميرا أو الميكروفون</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 1df2a55a..5f2df61b 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -2583,7 +2583,6 @@
 <translation id="3882165008614329320">কেমেৰা অথবা ফাইলৰ পৰা ইতিমধ্যে থকা ভিডিঅ’</translation>
 <translation id="3884152383786131369">একাধিক ভাষাত উপলব্ধ ৱেবৰ সমলে এই সূচীখনৰ পৰা সমৰ্থিত প্ৰথম ভাষাটো ব্যৱহাৰ কৰিব। এই অগ্ৰাধিকাৰসমূহ আপোনাৰ ব্ৰাউজাৰৰ ছেটিঙৰ সৈতে ছিংক কৰা আছে। <ph name="BEGIN_LINK_LEARN_MORE" />অধিক জানক<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">এই ছাইটটো এক্সেছ কৰিবলৈ আপুনি কৰা অনুৰোধ <ph name="NAME" />লৈ পঠিওৱা হৈছে</translation>
-<translation id="3888364689515978571">অফ আছে। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />ৰ জৰিয়তে টোকা লৈ থকা হৈছে</translation>
 <translation id="3890064827463908288">ৱাই-ফাই ছিংক ব্যৱহাৰ কৰিবলৈ Chrome ছিংক অন কৰক</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP যোগ কৰক...</translation>
@@ -2665,7 +2664,6 @@
 <translation id="3958088479270651626">বুকমার্ক আৰু ছেটিংসমূহ আমদানি কৰক</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">চেলুলাৰ নেটৱৰ্ক অফ কৰক</translation>
-<translation id="3965730875470565266">অন আছে, <ph name="MINUTES" /> মিনিট</translation>
 <translation id="3965811923470826124">সৈতে</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />ৰ পৰা বাহিৰ হওক</translation>
 <translation id="3966072572894326936">অন্য এটা ফ'ল্ডাৰ বাছনি কৰক...</translation>
@@ -4212,7 +4210,6 @@
 <translation id="5832813618714645810">প্ৰ’ফাইল</translation>
 <translation id="583281660410589416">অজ্ঞাত</translation>
 <translation id="5833397272224757657">ব্যক্তিগতকৰণ কৰিবলৈ আপুনি চোৱা ছাইটৰ সমল, ব্ৰাউজাৰৰ কার্যকলাপ আৰু ভাব-বিনিময়সমূহ ব্যৱহাৰ কৰে</translation>
-<translation id="5833551944249825624">আপোনাৰ Chromebook নিকটৱৰ্তী সকলোৰে বাবে ৫ মিনিটৰ কাৰণে দৃশ্যমান হ’ব</translation>
 <translation id="5833726373896279253">এই ছেটিংসমূহ কেৱল গৰাকীয়েহে সংশোধন কৰিব পাৰে:</translation>
 <translation id="5834581999798853053">আনুমানিক <ph name="TIME" /> মিনিট বাকী আছে</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - কেমেৰা বা মাইক্ৰফ’নৰ জৰিয়তে ৰেকর্ডিং</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 0b39006..6554415 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1041,6 +1041,7 @@
 <translation id="2154710561487035718">Linki Kopyalayın</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Xidmət İşçisi: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Təhlükəsizlik yoxlanışını yenidən icra edin</translation>
 <translation id="2157474325782140681">Əlavə funksiyalar əldə etmək məqsədilə bu Chromebook üçün hazırlanmış Dell dok stansiyasını işlədin.</translation>
 <translation id="215753907730220065">Tam Ekrandan Çıxın</translation>
 <translation id="2157875535253991059">Bu səhifə indi tam ekrandadır.</translation>
@@ -1984,6 +1985,7 @@
 <translation id="3225319735946384299">Kodu İmzalaması</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Linux tətbiq və fayllarını yedəkləyin</translation>
+<translation id="3238192140106069382">Qoşulur və doğrulanır</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> üçün vaxt limiti ləğv edilib</translation>
 <translation id="3241680850019875542">Artırma paketinin kök direktoriyasını seçin. Artırmanı güncəlləşdirmək üçün yenidən istifadə etmək məqsədilə şəxsi açar seçin.</translation>
 <translation id="3244294424315804309">Səssiz etməyə davam edin</translation>
@@ -2580,7 +2582,6 @@
 <translation id="3882165008614329320">Kamera və ya fayldan mövcud video</translation>
 <translation id="3884152383786131369">Bir neçə dildə əlçatan veb məzmun siyahıdakı ilk dəstəklənən dili istifadə edəcək. Bu tərcihlər brauzer ayarlarınızla sinxronlaşdırılır. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Bu sayta giriş sorğunuz <ph name="NAME" /> ünvanına göndərilib</translation>
-<translation id="3888364689515978571">Deaktivdir. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ilə qeyd götürmə</translation>
 <translation id="3890064827463908288">Wi-Fi Sinxronlaşdırmasını istifadə etmək üçün Chrome Sinxronlaşdırmasını aktiv edin</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP əlavə edin...</translation>
@@ -2664,7 +2665,6 @@
 <translation id="3958088479270651626">Əlfəcinləri və ayarları import edin...</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobil şəbəkəni deaktiv edin</translation>
-<translation id="3965730875470565266">Aktivdir, <ph name="MINUTES" /> dəq</translation>
 <translation id="3965811923470826124">Bununla:</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> profilindən çıxın</translation>
 <translation id="3966072572894326936">Başqa qovluq seçin...</translation>
@@ -4212,7 +4212,6 @@
 <translation id="5832813618714645810">Profillər</translation>
 <translation id="583281660410589416">Naməlum</translation>
 <translation id="5833397272224757657">Daxil olduğunuz saytlardakı kontent, brauzer fəaliyyəti və bağlantılardan fərdiləşdirmə üçün istifadə edilir</translation>
-<translation id="5833551944249825624">Chromebook'unuz 5 dəqiqə ərzində yaxınlıqdakı hər kəsə görünəcək</translation>
 <translation id="5833726373896279253">Bu ayarlar yalnız sahibi tərəfindən dəyişdirilə bilər:</translation>
 <translation id="5834581999798853053">Təxminən <ph name="TIME" /> dəqiqə qaldı</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Kamera və ya mikrofon qeydə alması</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 3aa6f1a..74bd04d 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1048,6 +1048,7 @@
 <translation id="2154710561487035718">Скапіраваць URL-адрас</translation>
 <translation id="2155772377859296191">Здаецца, <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Выканаць праверку бяспекі яшчэ раз</translation>
 <translation id="2157474325782140681">Каб карыстацца дадатковымі функцыямі, знайдзіце док-станцыю Dell, сумяшчальную з гэтым Chromebook.</translation>
 <translation id="215753907730220065">Выключыць поўнаэкранны рэжым</translation>
 <translation id="2157875535253991059">Старонка ў поўнаэкранным рэжыме.</translation>
@@ -1992,6 +1993,7 @@
 <translation id="3225319735946384299">Падпісванне кода</translation>
 <translation id="3227137524299004712">Мікрафон</translation>
 <translation id="3233271424239923319">Стварыць рэзервовую копію файлаў і праграм Linux</translation>
+<translation id="3238192140106069382">Ідзе падключэнне і спраўджанне</translation>
 <translation id="3239373508713281971">Абмежаванне часу выдалена для праграмы "<ph name="APP_NAME" />"</translation>
 <translation id="3241680850019875542">Выберыце каранёвы каталог, куды трэба ўпакаваць пашырэнне. Каб абнавіць пашырэнне, таксама выберыце файл закрытага ключа, які трэба ўжыць.</translation>
 <translation id="3244294424315804309">Працягнуць блакіраваць гук</translation>
@@ -2588,7 +2590,6 @@
 <translation id="3882165008614329320">Існуючае відэа з камеры або файла</translation>
 <translation id="3884152383786131369">Вэб-змесціва, даступнае на некалькіх мовах, будзе адлюстроўвацца на першай мове з дадзенага спіса. Гэтыя параметры сінхранізуюцца з наладамі вашага браўзера. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Запыт на доступ да гэтага сайта адпраўлены карыстальніку <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Выключана. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Нататкі ў <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Каб выкарыстоўваць функцыю сінхранізацыі параметраў Wi-Fi, уключыце Сінхранізацыю Chrome</translation>
 <translation id="3892414795099177503">Дадаць OpenVPN/L2TP...</translation>
@@ -2672,7 +2673,6 @@
 <translation id="3958088479270651626">Імпарт закладак і налад</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Выключыць сотавую сетку</translation>
-<translation id="3965730875470565266">Уключана, <ph name="MINUTES" /> хв</translation>
 <translation id="3965811923470826124">З дапамогай</translation>
 <translation id="3965965397408324205">Выйсці з профілю <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Выбраць іншую папку...</translation>
@@ -4222,7 +4222,6 @@
 <translation id="5832813618714645810">Профілі</translation>
 <translation id="583281660410589416">Невядома</translation>
 <translation id="5833397272224757657">Для персаналізацыі выкарыстоўвае змесціва з сайтаў, якія вы праглядалі, а таксама дзеянні ў браўзеры</translation>
-<translation id="5833551944249825624">Ваш Chromebook на працягу пяці хвілін будзе бачны ўсім, хто паблізу</translation>
 <translation id="5833726373896279253">Гэтыя налады можа змяняць толькі ўладальнік:</translation>
 <translation id="5834581999798853053">Засталося каля <ph name="TIME" /> хв</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – ідзе запіс з камеры або мікрафона</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index ed5b43c..20feec9 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">Копиране на URL адреса</translation>
 <translation id="2155772377859296191">Разделителната способност е <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Повторно стартиране на функцията за проверка на безопасността</translation>
 <translation id="2157474325782140681">За да получите още функции, използвайте докинг станция от Dell, предназначена да работи с този Chromebook.</translation>
 <translation id="215753907730220065">Изход от цял екран</translation>
 <translation id="2157875535253991059">Тази страница сега е на цял екран.</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Подписване на код</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Създаване на резервно копие за приложенията и файловете на Linux</translation>
+<translation id="3238192140106069382">Установява се връзка и се потвърждава</translation>
 <translation id="3239373508713281971">Времевото ограничение за <ph name="APP_NAME" /> бе премахнато</translation>
 <translation id="3241680850019875542">Изберете основната директория на разширението, което ще се пакетира. За да актуализирате разширение, изберете и файла с личен ключ за повторно използване.</translation>
 <translation id="3244294424315804309">Продължаване без звук</translation>
@@ -2583,7 +2585,6 @@
 <translation id="3882165008614329320">Съществуващ видеоклип от камерата или от файл</translation>
 <translation id="3884152383786131369">За показване на уеб съдържанието, което се предлага на няколко езика, ще се използва първият поддържан от този списък. Тези предпочитания се синхронизират с настройките на браузъра. <ph name="BEGIN_LINK_LEARN_MORE" />Научете повече<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Заявката ви за достъп до този сайт бе изпратена до <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Изкл. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Водене на бележки с/ъс <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Включете синхронизирането в Chrome, за да използвате синхронизирането на Wi-Fi</translation>
 <translation id="3892414795099177503">Добавяне на OpenVPN/L2TP...</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">Импортиране на отметки и настройки</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Изключване на мобилната мрежа</translation>
-<translation id="3965730875470565266">Вкл., <ph name="MINUTES" /> мин</translation>
 <translation id="3965811923470826124">Със</translation>
 <translation id="3965965397408324205">Изход от <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Изберете друга папка...</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">Потребителски профили</translation>
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5833397272224757657">Използва за персонализиране съдържанието на посещаваните от вас сайтове, както и активността в браузъра и взаимодействията с него</translation>
-<translation id="5833551944249825624">Вашият Chromebook ще бъде видим за всички в близост в продължение на 5 мин</translation>
 <translation id="5833726373896279253">Тези настройки могат да се променят само от собственика:</translation>
 <translation id="5834581999798853053">Остават около <ph name="TIME" /> минути</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – записва се чрез камерата или микрофона</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 2d4494a..f45a1a0 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2575,7 +2575,6 @@
 <translation id="3882165008614329320">ক্যামেরা বা ফাইলে আগে থেকে থাকা ভিডিও</translation>
 <translation id="3884152383786131369">যেসকল ওয়েব কন্টেন্ট একাধিক ভাষায় উপলভ্য সেগুলি এই তালিকা থেকে উপযুক্ত প্রথম ভাষাটি ব্যবহার করবে। আপনার ব্রাউজার সেটিংসের সাথে এই পছন্দ সিঙ্ক করা আছে। <ph name="BEGIN_LINK_LEARN_MORE" />আরও জানুন<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">এই সাইটটি অ্যাক্সেস করার জন্য আপনার অনুরোধ <ph name="NAME" />কে পাঠানো হয়েছে</translation>
-<translation id="3888364689515978571">বন্ধ আছে। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ব্যবহার করে নোট নেওয়া হচ্ছে</translation>
 <translation id="3890064827463908288">ওয়াই-ফাই সিঙ্ক ব্যবহার করতে Chrome সিঙ্ক চালু করুন</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP যোগ করুন...</translation>
@@ -2658,7 +2657,6 @@
 <translation id="3958088479270651626">বুকমার্কস এবং সেটিংস ইমপোর্ট করুন</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">মোবাইল নেটওয়ার্ক বন্ধ করুন</translation>
-<translation id="3965730875470565266">চালু আছে, <ph name="MINUTES" /> মিনিট</translation>
 <translation id="3965811923470826124">সহ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> ছেড়ে যান</translation>
 <translation id="3966072572894326936">অন্য ফোল্ডার বেছে নিন...</translation>
@@ -4200,7 +4198,6 @@
 <translation id="5832813618714645810">প্রোফাইল</translation>
 <translation id="583281660410589416">অজানা</translation>
 <translation id="5833397272224757657">নিজের মতো সাজিয়ে নেওয়ার জন্য আপনার দেখা সাইটগুলির কন্টেন্ট এবং ব্রাউজারের অ্যাক্টিভিটি ও ইন্টার‌্যাকশনগুলি ব্যবহার করে</translation>
-<translation id="5833551944249825624">কাছাকাছি থাকা সবাই ৫ মিনিটের জন্য আপনার Chromebook দেখতে পাবে</translation>
 <translation id="5833726373896279253">এই সেটিংস কেবল মালিক ঈষত্সংশোধন করতে পারেন:</translation>
 <translation id="5834581999798853053">প্রায় <ph name="TIME" /> মিনিট বাকি</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ক্যামেরা বা মাইক্রোফোন রেকর্ডিং</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 9c1211c6..1d8cfa8 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Kopiranje URL-a</translation>
 <translation id="2155772377859296191">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Serviser: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Ponovno pokretanje sigurnosne provjere</translation>
 <translation id="2157474325782140681">Za dodatne funkcije, koristite Dell priključnu stanicu koja je namijenjena za rad s ovim Chromebookom.</translation>
 <translation id="215753907730220065">Izađi iz prikaza preko cijelog ekrana</translation>
 <translation id="2157875535253991059">Ova stranica se sada prikazuje preko cijelog ekrana.</translation>
@@ -1991,6 +1992,7 @@
 <translation id="3225319735946384299">Potpisivanje koda</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Napravite sigurnosnu kopiju Linux aplikacija i fajlova</translation>
+<translation id="3238192140106069382">Povezivanje i potvrđivanje</translation>
 <translation id="3239373508713281971">Uklonjeno je vremensko ograničenje za aplikaciju <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Odaberite korijenski direktorij ekstenzije koju treba zapakirati. Da ažurirate ekstenziju, odaberite i fajl s privatnim ključem da ga ponovo upotrijebite.</translation>
 <translation id="3244294424315804309">Nastavi blokirati zvuk</translation>
@@ -2587,7 +2589,6 @@
 <translation id="3882165008614329320">Postojeći videozapis s kamere ili fajla</translation>
 <translation id="3884152383786131369">Sadržaj weba koji je dostupan na više jezika će koristiti prvi podržani jezik s liste. Ove postavke se sinhroniziraju s postavkama preglednika. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Vaš zahtjev za pristup ovoj web lokaciji je poslan korisniku <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Isključeno. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Kreiranje bilježaka pomoću aplikacije <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Uključivanje Sinhronizacije Chromea radi korištenja WiFi sinhronizacije</translation>
 <translation id="3892414795099177503">Dodaj OpenVPN/L2TP...</translation>
@@ -2671,7 +2672,6 @@
 <translation id="3958088479270651626">Uvezite oznake i postavke</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Isključi mobilnu mrežu</translation>
-<translation id="3965730875470565266">Uključeno, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Koristeći</translation>
 <translation id="3965965397408324205">Izađi iz profila <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Odaberite drugi folder...</translation>
@@ -4221,7 +4221,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Nepoznato</translation>
 <translation id="5833397272224757657">Koristi sadržaj na web lokacijama koje posjećujete te aktivnosti i interakcije prilikom pregledanja radi personalizacije</translation>
-<translation id="5833551944249825624">Vaš Chromebook će biti vidljiv svakome u blizini u trajanju od 5 min</translation>
 <translation id="5833726373896279253">Ove postavke može promijeniti samo vlasnik.</translation>
 <translation id="5834581999798853053">Preostalo otprilike <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Snimanje kamerom ili mikrofonom</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index ca0c1e3..168f954 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Copia l'URL</translation>
 <translation id="2155772377859296191">Resolució: <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Torna a executar la comprovació de seguretat</translation>
 <translation id="2157474325782140681">Per obtenir funcions addicionals, fes servir una base de connexió Dell que funcioni amb aquest Chromebook.</translation>
 <translation id="215753907730220065">Surt de la pantalla completa</translation>
 <translation id="2157875535253991059">Ara aquesta pàgina es mostra a pantalla completa.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">Signatura de codi</translation>
 <translation id="3227137524299004712">Micròfon</translation>
 <translation id="3233271424239923319">Crea una còpia de seguretat dels fitxers i de les aplicacions de Linux</translation>
+<translation id="3238192140106069382">S'està connectant i verificant</translation>
 <translation id="3239373508713281971">S'ha suprimit el límit de temps per a <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Seleccioneu el directori arrel de l'extensió que voleu empaquetar. Per actualitzar una extensió, cal que seleccioneu també el fitxer de clau privada que s'utilitzarà.</translation>
 <translation id="3244294424315804309">Continua silenciant el so</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">Vídeo existent de la càmera o d'un fitxer</translation>
 <translation id="3884152383786131369">El contingut web disponible en diversos idiomes utilitzarà el primer idioma admès d'aquesta llista. Aquestes preferències se sincronitzen amb les opcions de configuració del navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Més informació<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">La teva sol·licitud per accedir a aquest lloc s'ha enviat a <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Desactivat. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Escriu notes amb <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activa l'opció Sincronització de Chrome per utilitzar la funció Sincronització Wi‑Fi</translation>
 <translation id="3892414795099177503">Afegeix OpenVPN/L2TP…</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">Importa les adreces d'interès i la configuració</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desactiva la xarxa mòbil</translation>
-<translation id="3965730875470565266">Activat, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Amb</translation>
 <translation id="3965965397408324205">Surt del perfil <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Tria una altra carpeta...</translation>
@@ -3840,7 +3840,7 @@
 <translation id="5390677308841849479">Vermell fosc i taronja</translation>
 <translation id="5390743329570580756">Envia per a</translation>
 <translation id="5392192690789334093">Amb permís per enviar notificacions</translation>
-<translation id="5393761864111565424">{COUNT,plural, =1{enllaç}other{# enllaços}}</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{Enllaç}other{# enllaços}}</translation>
 <translation id="5397794290049113714">Usuari</translation>
 <translation id="5398497406011404839">Adreces d'interès amagades</translation>
 <translation id="5398572795982417028">La pàgina indicada no respecta el límit de <ph name="MAXIMUM_PAGE" /></translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Perfils</translation>
 <translation id="583281660410589416">Desconegut</translation>
 <translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada</translation>
-<translation id="5833551944249825624">Tothom que sigui a prop podrà veure el teu Chromebook durant 5 minuts</translation>
 <translation id="5833726373896279253">Només el propietari d'aquesta configuració la pot modificar:</translation>
 <translation id="5834581999798853053">Queda cosa de <ph name="TIME" /> minuts</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: la càmera o el micròfon estan enregistrant contingut</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 613c553..db1cf52 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Kopírovat adresu URL</translation>
 <translation id="2155772377859296191">Vypadá jako <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Pracovní proces služby: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Znovu spustit bezpečnostní kontrolu</translation>
 <translation id="2157474325782140681">Chcete-li získat další funkce, použijte dokovací stanici Dell kompatibilní s tímto Chromebookem.</translation>
 <translation id="215753907730220065">Ukončit režim celé obrazovky</translation>
 <translation id="2157875535253991059">Tato stránka se teď zobrazuje na celou obrazovku</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Podepisování kódu</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Zálohovat aplikace a soubory systému Linux</translation>
+<translation id="3238192140106069382">Připojování a ověřování</translation>
 <translation id="3239373508713281971">U aplikace <ph name="APP_NAME" /> byl odstraněn časový limit</translation>
 <translation id="3241680850019875542">Vyberte kořenový adresář rozšíření, které chcete zabalit. Chcete-li rozšíření aktualizovat, vyberte také soubor soukromého klíče, který chcete znovu použít.</translation>
 <translation id="3244294424315804309">Pokračovat v tlumení zvuku</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Existující video z fotoaparátu nebo soubor</translation>
 <translation id="3884152383786131369">U webového obsahu, který je k dispozici v několika jazycích, se použije první jazyk v seznamu. Tyto předvolby jsou synchronizovány s nastavením prohlížeče. <ph name="BEGIN_LINK_LEARN_MORE" />Další informace<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Vaše žádost o přístup k tomuto webu byla odeslána uživateli <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Vypnuto. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Pořizování poznámek pomocí aplikace <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Chcete-li použít Synchronizaci Wi-Fi, zapněte Synchronizaci Chromu</translation>
 <translation id="3892414795099177503">Přidat síť OpenVPN/L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Importovat záložky a nastavení</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Vypnout mobilní síť</translation>
-<translation id="3965730875470565266">Zapnuto, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Přes</translation>
 <translation id="3965965397408324205">Zavřít profil <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Vybrat jinou složku...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profily</translation>
 <translation id="583281660410589416">Neznámé</translation>
 <translation id="5833397272224757657">Používá k personalizaci obsah navštěvovaných webů a aktivitu a interakce v prohlížeči</translation>
-<translation id="5833551944249825624">Váš Chromebook bude viditelný všem v okolí po dobu 5 min</translation>
 <translation id="5833726373896279253">Toto nastavení může upravit pouze vlastník.</translation>
 <translation id="5834581999798853053">Zbývá přibližně <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – probíhá záznam z fotoaparátu nebo mikrofonu</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 94d67dd..2a344ec 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">Kopier webadresse</translation>
 <translation id="2155772377859296191">Ligner <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Scripttjeneste: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Kør sikkerhedstjek igen</translation>
 <translation id="2157474325782140681">Hvis du vil have yderligere funktioner, skal du bruge en Dell-dockingstation, som er udviklet til at fungere sammen med denne Chromebook.</translation>
 <translation id="215753907730220065">Afslut fuld skærm</translation>
 <translation id="2157875535253991059">Denne side er nu i fuld skærm.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Kodesignering</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Sikkerhedskopiér Linux-apps og -filer</translation>
+<translation id="3238192140106069382">Opretter forbindelse og verificerer</translation>
 <translation id="3239373508713281971">Tidsgrænsen blev fjernet for <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Vælg rodmappen for udvidelsen, der skal pakkes. Opdater en udvidelse ved også at vælge den private nøglefil til genbrug.</translation>
 <translation id="3244294424315804309">Lad lyden forblive slået fra</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Eksisterende video fra kamera eller fil</translation>
 <translation id="3884152383786131369">Webindhold, som er tilgængeligt på flere sprog, vises på det første understøttede sprog på denne liste. Disse præferencer synkroniseres med dine browserindstillinger. <ph name="BEGIN_LINK_LEARN_MORE" />Få flere oplysninger<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Din anmodning om adgang til dette website er blevet sendt til <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Fra. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Notetagning med <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Aktivér Chrome-synkronisering for at bruge Wi-Fi-synkronisering</translation>
 <translation id="3892414795099177503">Tilføj OpenVPN/L2TP...</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Importér bogmærker og indstillinger</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Deaktiver mobilnetværk</translation>
-<translation id="3965730875470565266">Til, <ph name="MINUTES" /> min.</translation>
 <translation id="3965811923470826124">Med</translation>
 <translation id="3965965397408324205">Log <ph name="PROFILE_NAME" /> ud</translation>
 <translation id="3966072572894326936">Vælg en anden mappe...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Profiler</translation>
 <translation id="583281660410589416">Ukendt</translation>
 <translation id="5833397272224757657">Anvender indhold på websites, du besøger, samt browseraktivitet og -interaktioner, så din brugeroplevelse tilpasses</translation>
-<translation id="5833551944249825624">Din Chromebook vil være synlig for alle i nærheden i fem minutter</translation>
 <translation id="5833726373896279253">Disse indstillinger kan kun ændres af ejeren:</translation>
 <translation id="5834581999798853053">Omkring <ph name="TIME" /> minutter tilbage</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kameraet eller mikrofonen optager</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 352334e..d74fdc4 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="1235458158152011030">Bekannte Netzwerke</translation>
 <translation id="123578888592755962">Datenträger voll</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{Text}other{# Texte}}</translation>
 <translation id="1239594683407221485">Sie können die Inhalte in der App "Dateien" ansehen.</translation>
 <translation id="124116460088058876">Weitere Sprachen</translation>
 <translation id="1241753985463165747">Beim Aufrufen alle Ihre Daten auf der aktuellen Website lesen und ändern</translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">Passwörter suchen</translation>
 <translation id="1487335504823219454">An – benutzerdefinierte Einstellungen</translation>
 <translation id="1489664337021920575">Andere Option auswählen</translation>
+<translation id="1490491397986065675">Ihr Administrator sagt „<ph name="CUSTOM_MESSAGE" />“.</translation>
 <translation id="1492417797159476138">Sie haben diesen Nutzernamen für diese Website bereits gespeichert</translation>
 <translation id="1493892686965953381">Warten auf <ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1495677929897281669">Zurück zum Tab</translation>
@@ -731,7 +733,7 @@
 <translation id="1803545009660609783">Neu trainieren</translation>
 <translation id="1805738995123446102">Tab im Hintergrund verwendet Ihr Mikrofon</translation>
 <translation id="1805822111539868586">Ansichten prüfen</translation>
-<translation id="1805888043020974594">Druckerserver</translation>
+<translation id="1805888043020974594">Druckserver</translation>
 <translation id="1805967612549112634">PIN bestätigen</translation>
 <translation id="1806335016774576568">Zu einer anderen geöffneten App wechseln</translation>
 <translation id="1809483812148634490">Die bei Google Play heruntergeladenen Apps werden von diesem Chromebook gelöscht.
@@ -808,6 +810,7 @@
 <translation id="1879000426787380528">Anmelden als</translation>
 <translation id="1880905663253319515">Zertifikat "<ph name="CERTIFICATE_NAME" />" löschen?</translation>
 <translation id="1881445033931614352">Tastaturlayout</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{Element}other{# Elemente}}</translation>
 <translation id="1884013283844450420">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Verbinden</translation>
 <translation id="1884340228047885921">Die aktuelle Sichtbarkeitseinstellung ist "Einige Kontakte"</translation>
 <translation id="1884705339276589024">Größe des Linux-Laufwerks anpassen</translation>
@@ -986,6 +989,7 @@
 <translation id="2099686503067610784">Serverzertifikat "<ph name="CERTIFICATE_NAME" />" löschen?</translation>
 <translation id="2100273922101894616">Automatisch anmelden</translation>
 <translation id="2101225219012730419">Version:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{Telefonnummer}other{# Telefonnummern}}</translation>
 <translation id="211144231511833662">Häkchen für Typen entfernen</translation>
 <translation id="2111670510994270194">Neuer Tab rechts</translation>
 <translation id="21133533946938348">Tab anpinnen</translation>
@@ -1038,6 +1042,7 @@
 <translation id="2154710561487035718">URL kopieren</translation>
 <translation id="2155772377859296191">Auflösung <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Sicherheitscheck noch einmal durchführen</translation>
 <translation id="2157474325782140681">Verwenden Sie eine für dieses Chromebook entwickelte Dockingstation von Dell, um zusätzliche Funktionen nutzen zu können.</translation>
 <translation id="215753907730220065">Vollbildmodus aus</translation>
 <translation id="2157875535253991059">Diese Seite wird nun im Vollbildmodus angezeigt.</translation>
@@ -1281,6 +1286,7 @@
 <translation id="2435457462613246316">Passwort anzeigen</translation>
 <translation id="2435579801172349831">Alle (<ph name="URL_COUNT" />) in Inkognitofenster öffnen</translation>
 <translation id="2436186046335138073">Öffnen aller <ph name="PROTOCOL" />-Links durch <ph name="HANDLER_HOSTNAME" /> zulassen?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{App}other{# Apps}}</translation>
 <translation id="2440604414813129000">Quelltext an&amp;zeigen</translation>
 <translation id="244231003699905658">Ungültige Adresse. Prüfen Sie die Adresse und versuchen Sie es noch einmal.</translation>
 <translation id="2442916515643169563">Textschatten</translation>
@@ -1429,6 +1435,7 @@
 <translation id="2604255671529671813">Fehler bei der Netzwerkverbindung</translation>
 <translation id="2606246518223360146">Daten verknüpfen</translation>
 <translation id="2606454609872547359">Nein, ohne ChromeVox fortfahren</translation>
+<translation id="2606568927909309675">Erstellt automatisch Untertitel für englischsprachige Audioinhalte und Videos. Audioinhalte und Untertitel werden ausschließlich auf dem Gerät gespeichert.</translation>
 <translation id="2607101320794533334">Informationen zum öffentlichen Schlüssel des Antragstellers</translation>
 <translation id="2609896558069604090">Verknüpfungen erstellen...</translation>
 <translation id="2609980095400624569">Es konnte keine Verbindung hergestellt werden</translation>
@@ -1693,6 +1700,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">Link öffnen mit...</translation>
 <translation id="2889925978073739256">Plug-ins ohne Sandbox weiterhin blockieren</translation>
+<translation id="2891922230654533301">Möchten Sie sich mit Ihrem Gerät auf <ph name="APP_NAME" /> anmelden?</translation>
 <translation id="2893168226686371498">Standardbrowser</translation>
 <translation id="2894757982205307093">Neuer Tab in Gruppe</translation>
 <translation id="289644616180464099">SIM-Karte ist gesperrt</translation>
@@ -1978,6 +1986,7 @@
 <translation id="3225319735946384299">Codesignatur</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Linux-Apps und -Dateien sichern</translation>
+<translation id="3238192140106069382">Verbindung wird hergestellt und geprüft</translation>
 <translation id="3239373508713281971">Zeitlimit entfernt für <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Wählen Sie das Stammverzeichnis der Erweiterung, die gepackt werden soll. Zur Aktualisierung einer Erweiterung wählen Sie außerdem den privaten Schlüssel zur Wiederverwendung.</translation>
 <translation id="3244294424315804309">Töne weiterhin stummschalten</translation>
@@ -2004,6 +2013,7 @@
 <translation id="3269069891205016797">Ihre Daten werden von dem Gerät entfernt, wenn Sie sich abmelden.</translation>
 <translation id="3269093882174072735">Bild laden</translation>
 <translation id="3269612321104318480">Helles Blaugrün und Weiß</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{Datei}other{# Dateien}}</translation>
 <translation id="326999365752735949">DIFF-Datei wird heruntergeladen.</translation>
 <translation id="3270965368676314374">Fotos, Musik und andere Medien auf Ihrem Computer lesen, ändern und löschen</translation>
 <translation id="327147043223061465">Alle Cookies und Websitedaten anzeigen</translation>
@@ -2193,7 +2203,7 @@
 <translation id="347785443197175480"><ph name="HOST" /> weiterhin Zugriff auf Kamera und Mikrofon gestatten</translation>
 <translation id="3478685642445675458">Entsperren Sie Ihr Profil, bevor Sie eine Person entfernen.</translation>
 <translation id="3479552764303398839">Jetzt nicht</translation>
-<translation id="3479685872808224578">Der Druckerserver wurde nicht erkannt. Prüfen Sie die Adresse und versuchen Sie es noch einmal.</translation>
+<translation id="3479685872808224578">Der Druckserver wurde nicht erkannt. Prüfen Sie die Adresse und versuchen Sie es noch einmal.</translation>
 <translation id="3480827850068960424"><ph name="NUM" /> Tabs gefunden</translation>
 <translation id="3481268647794498892">Wird in <ph name="COUNTDOWN_SECONDS" /> Sekunden in <ph name="ALTERNATIVE_BROWSER_NAME" /> geöffnet</translation>
 <translation id="3482719661246593752"><ph name="ORIGIN" /> darf die folgenden Dateien aufrufen</translation>
@@ -2299,6 +2309,7 @@
 <translation id="3600792891314830896">Websites stummschalten, die Ton wiedergeben</translation>
 <translation id="360180734785106144">Neue Funktionen anbieten, sobald sie verfügbar sind</translation>
 <translation id="3602290021589620013">Vorschau</translation>
+<translation id="3602870520245633055">Drucken und scannen</translation>
 <translation id="3603622770190368340">Netzwerkzertifikat anfordern</translation>
 <translation id="3604193429970465812">Sekundäre Konten</translation>
 <translation id="3604713164406837697">Hintergrund ändern</translation>
@@ -2314,6 +2325,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> wird gegenwärtig gescannt</translation>
 <translation id="3616741288025931835">&amp;Browserdaten löschen...</translation>
 <translation id="3617891479562106823">Hintergründe sind nicht verfügbar. Bitte versuchen Sie es später noch einmal.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{Video}other{# Videos}}</translation>
 <translation id="3619115746895587757">Cappuccino</translation>
 <translation id="362333465072914957">Es wird darauf gewartet, dass die Zertifizierungsstelle ein Zertifikat ausstellt</translation>
 <translation id="3624567683873126087">Gerät entsperren und im Google-Konto anmelden</translation>
@@ -2400,7 +2412,7 @@
 <translation id="3707163604290651814">Derzeit angemeldet als <ph name="NAME" /></translation>
 <translation id="3709244229496787112">Der Browser wurde beendet, bevor der Download abgeschlossen war.</translation>
 <translation id="3711931198657368127">Einfügen und <ph name="URL" /> aufrufen</translation>
-<translation id="3711945201266135623">Auf dem Druckerserver wurden <ph name="NUM_PRINTERS" /> Drucker gefunden</translation>
+<translation id="3711945201266135623">Auf dem Druckserver wurden <ph name="NUM_PRINTERS" /> Drucker gefunden</translation>
 <translation id="3712050472459130149">Kontoaktualisierung erforderlich</translation>
 <translation id="3712217561553024354">Zulassen, dass dieses Gerät nach anderen Geräten mit Ihrem Google-Konto sucht, die eine Mobilfunkverbindung haben</translation>
 <translation id="3712897371525859903">Seite speichern &amp;unter...</translation>
@@ -2571,7 +2583,6 @@
 <translation id="3882165008614329320">Vorhandenes Video von der Kamera oder als Datei</translation>
 <translation id="3884152383786131369">Für Webinhalte in mehreren Sprachen wird die erste unterstützte Sprache aus dieser Liste verwendet. Diese Einstellungen werden mit den Browsereinstellungen synchronisiert. <ph name="BEGIN_LINK_LEARN_MORE" />Weitere Informationen<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Deine Anfrage zum Zugriff auf diese Website wurde an <ph name="NAME" /> gesendet</translation>
-<translation id="3888364689515978571">Ausgeschaltet. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Notizerstellung mit <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Chrome-Synchronisierung aktivieren, um WLAN-Synchronisation zu verwenden</translation>
 <translation id="3892414795099177503">OpenVPN/L2TP hinzufügen…</translation>
@@ -2655,7 +2666,6 @@
 <translation id="3958088479270651626">Lesezeichen und Einstellungen importieren</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobilfunknetz ausschalten</translation>
-<translation id="3965730875470565266">Eingeschaltet, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Mit</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> beenden</translation>
 <translation id="3966072572894326936">Anderen Ordner wählen...</translation>
@@ -2725,6 +2735,7 @@
 <translation id="4047726037116394521">Zur Startseite</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# Kontakt ist nicht verfügbar. Wenn Sie Nearby Share mit ihm verwenden möchten, müssen Sie in Ihren Kontakten die mit seinem Google-Konto verknüpfte E-Mail-Adresse hinzufügen.}other{# Kontakte sind nicht verfügbar. Wenn Sie Nearby Share mit ihnen verwenden möchten, müssen Sie in Ihren Kontakten die mit ihren Google-Konten verknüpften E-Mail-Adressen hinzufügen.}}</translation>
 <translation id="4050225813016893843">Authentifizierungsmethode</translation>
+<translation id="4050534976465737778">Beide Geräte müssen entsperrt sein und sich nah beieinander befinden. Außerdem muss Bluetooth aktiviert sein. Wenn Sie Inhalte mit einem Chromebook teilen möchten, das sich nicht in Ihren Kontakten befindet, muss die Nearby-Sichtbarkeit aktiviert sein. Öffnen Sie dazu den Statusbereich und schalten Sie „Nearby-Sichtbarkeit“ ein. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">Winzig</translation>
 <translation id="4054070260844648638">Für alle sichtbar</translation>
 <translation id="4056908315660577142">Du hast das Zeitlimit erreicht, das deine Eltern für die Chrome-App <ph name="APP_NAME" /> festgelegt haben. Morgen kannst du die App wieder <ph name="TIME_LIMIT" /> lang nutzen.</translation>
@@ -2959,6 +2970,7 @@
 <translation id="4364327530094270451">Melone</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation>
 <translation id="4364830672918311045">Benachrichtigungen einblenden</translation>
+<translation id="4366138410738374926">Druckvorgang gestartet</translation>
 <translation id="437004882363131692">Hier können Sie angeben, ob Sie Tipps, Angebote und Neuigkeiten rund um <ph name="DEVICE_TYPE" /> erhalten und Feedback geben möchten. Sie können sich jederzeit wieder abmelden.</translation>
 <translation id="4370425812909262207">Einkaufswagen ausgeblendet. Sie werden wieder angezeigt, wenn Sie Änderungen vornehmen.</translation>
 <translation id="4370975561335139969">Die E-Mail-Adresse und das Passwort, die Sie eingegeben haben, stimmen nicht überein.</translation>
@@ -3146,6 +3158,7 @@
 <translation id="4568025708905928793">Ein Sicherheitsschlüssel wird angefordert</translation>
 <translation id="4568213207643490790">Google-Konten sind auf diesem Gerät nicht zugelassen.</translation>
 <translation id="4569747168316751899">Bei Inaktivität</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{Adresse}other{# Adressen}}</translation>
 <translation id="4570387585180509432">Adressen, Telefonnummern…</translation>
 <translation id="4572659312570518089">Beim Herstellen der Verbindung zu "<ph name="DEVICE_NAME" />" wurde die Authentifizierung abgebrochen.</translation>
 <translation id="4572779512957829735">Geben Sie die PIN für Ihren Sicherheitsschlüssel ein</translation>
@@ -3205,6 +3218,7 @@
 <translation id="4635444580397524003">Die Linux-Sicherung wurde erfolgreich wiederhergestellt.</translation>
 <translation id="4636930964841734540">Info</translation>
 <translation id="4637083375689622795">Weitere Aktionen, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{Text}other{# Texte}}</translation>
 <translation id="4638930039313743000">ADB-Fehlerbehebung aktivieren</translation>
 <translation id="4641539339823703554">Die Systemzeit konnte nicht eingestellt werden. Bitte überprüfen Sie die unten angegebene Uhrzeit und korrigieren Sie sie gegebenenfalls.</translation>
 <translation id="4642769377300286600">Mobiles Profil wird installiert, Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3220,10 +3234,12 @@
 <translation id="4651484272688821107">Die Onlinekomponente konnte mit den Ressourcen des Demomodus nicht geladen werden.</translation>
 <translation id="4652935475563630866">Nach dem Ändern der Kameraeinstellung muss Parallels Desktop neu gestartet werden. Starten Sie Parallels Desktop neu, um fortzufahren.</translation>
 <translation id="4653405415038586100">Fehler bei der Konfiguration von Linux</translation>
+<translation id="4654236001025007561">Sie können Dateien ganz einfach mit Chromebooks und Android-Geräten in der Nähe teilen</translation>
 <translation id="4657914796247705218">TrackPoint-Geschwindigkeit</translation>
 <translation id="465878909996028221">Nur HTTP-, HTTPS- und Dateiprotokolle werden für Browserweiterleitungen unterstützt.</translation>
 <translation id="4659077111144409915">Primäres Konto</translation>
 <translation id="4659126640776004816">Wenn Sie sich in Ihrem Google-Konto anmelden, ist diese Funktion eingeschaltet.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{Bild}other{# Bilder}}</translation>
 <translation id="4660476621274971848">Erwartete Version: "<ph name="EXPECTED_VERSION" />", tatsächliche Version "<ph name="NEW_ID" />"</translation>
 <translation id="4660540330091848931">Größenanpassung läuft</translation>
 <translation id="4661407454952063730">App-Daten können alle Daten sein, die eine App aufgrund der Einstellungen des Entwicklers gespeichert hat, wie z. B. Kontakte, Nachrichten und Fotos.</translation>
@@ -3324,6 +3340,7 @@
 <translation id="4794810983896241342">Updates werden von <ph name="BEGIN_LINK" />Ihrem Administrator<ph name="END_LINK" /> verwaltet</translation>
 <translation id="479536056609751218">Webseite, nur HTML</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />Bluetooth-Protokolle<ph name="END_LINK" /> anhängen (Google-intern)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{Element}other{# Elemente}}</translation>
 <translation id="4801448226354548035">Konten ausblenden</translation>
 <translation id="4801512016965057443">Mobilfunk-Roaming zulassen</translation>
 <translation id="4804818685124855865">Verbindung trennen</translation>
@@ -3352,7 +3369,7 @@
 <translation id="4830121310592638841">Nachfragen, wenn eine Website Fenster auf meinen Bildschirmen öffnen und platzieren möchte</translation>
 <translation id="4830502475412647084">Betriebssystem-Update wird installiert</translation>
 <translation id="4830573902900904548">Ihr Gerät (<ph name="DEVICE_TYPE" />) kann über <ph name="NETWORK_NAME" /> keine Internetverbindung herstellen. Bitte wählen Sie ein anderes Netzwerk aus. <ph name="LEARN_MORE_LINK_START" />Weitere Informationen<ph name="LEARN_MORE_LINK_END" /></translation>
-<translation id="4833683849865011483">Auf dem Druckerserver wurde 1 Drucker gefunden</translation>
+<translation id="4833683849865011483">Auf dem Druckserver wurde 1 Drucker gefunden</translation>
 <translation id="4836504898754963407">Fingerabdrücke verwalten</translation>
 <translation id="4837128290434901661">Wieder zur Google Suche wechseln?</translation>
 <translation id="4837926214103741331">Sie sind nicht zur Verwendung dieses Geräts berechtigt. Bitten Sie den Geräteinhaber um eine Anmeldeberechtigung.</translation>
@@ -3754,6 +3771,7 @@
 <translation id="531118851858162334">Wir zeigen Ihnen diesen Eintrag auf der Grundlage Ihrer bisherigen Nutzung von Google-Diensten. Auf <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> können Sie Ihre Daten einsehen, sie löschen und Ihre Einstellungen ändern.</translation>
 <translation id="5311304534597152726">Anmeldung als</translation>
 <translation id="5311565231560644461">Websites nicht erlauben, meine Virtual-Reality-Geräte und ‑Daten zu verwenden</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{Bild}other{# Bilder}}</translation>
 <translation id="5314381603623123224">Die Nutzungsbedingungen von Chrome ändern sich am 31. März</translation>
 <translation id="5315738755890845852">Zusätzliche geschweifte Klammer: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">Speichern</translation>
@@ -3819,6 +3837,7 @@
 <translation id="5390677308841849479">Dunkelrot und Orange</translation>
 <translation id="5390743329570580756">Senden für</translation>
 <translation id="5392192690789334093">Dürfen Benachrichtigungen senden</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{Link}other{# Links}}</translation>
 <translation id="5397794290049113714">Ich</translation>
 <translation id="5398497406011404839">Ausgeblendete Lesezeichen</translation>
 <translation id="5398572795982417028">Der Seitenbereich ist zu groß. Die maximale Seitenanzahl liegt bei <ph name="MAXIMUM_PAGE" /></translation>
@@ -4196,7 +4215,6 @@
 <translation id="5832813618714645810">Profile</translation>
 <translation id="583281660410589416">Unbekannt</translation>
 <translation id="5833397272224757657">Inhalte von besuchten Websites sowie Browseraktivitäten und -interaktionen werden zur Personalisierung verwendet</translation>
-<translation id="5833551944249825624">Ihr Chromebook wird für alle in der Nähe 5 min lang sichtbar</translation>
 <translation id="5833726373896279253">Diese Einstellungen können nur vom Eigentümer geändert werden:</translation>
 <translation id="5834581999798853053">Noch etwa <ph name="TIME" /> Minuten</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera oder Mikrofon nimmt auf</translation>
@@ -4347,6 +4365,7 @@
 <translation id="6011074160056912900">Ethernet-Netzwerk</translation>
 <translation id="6011193465932186973">Fingerabdruck</translation>
 <translation id="6011449291337289699">Websitedaten löschen</translation>
+<translation id="6013027779243312217">Untertitel für Audioinhalte und Videos</translation>
 <translation id="6015796118275082299">Jahr</translation>
 <translation id="6016178549409952427">Zu zusätzlichem Inhalt <ph name="CURRENT_ELEMENT" /> von <ph name="TOTAL_ELEMENTS" /> gehen</translation>
 <translation id="6016551720757758985">Powerwash und Zurücksetzen auf vorherige Version bestätigen</translation>
@@ -4856,6 +4875,7 @@
 <translation id="6605847144724004692">Noch nicht von Nutzern bewertet.</translation>
 <translation id="6607831829715835317">Weitere Too&amp;ls</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> wird schon von <ph name="DOMAIN" /> verwaltet. Wenn du die Jugendschutzeinstellungen auf ein anderes Google-Konto anwenden möchtest, melde dich nach der Einrichtung ab und wähle auf dem Anmeldebildschirm "Person hinzufügen" aus.</translation>
+<translation id="6609478180749378879">Nach dem Verlassen des Inkognitomodus werden Anmeldedaten auf diesem Gerät gespeichert. Sie können sich später erneut mit Ihrem Gerät auf dieser Website anmelden.</translation>
 <translation id="6611972847767394631">Hier finden Sie Ihre Tabs</translation>
 <translation id="6612358246767739896">Geschützte Inhalte</translation>
 <translation id="6615455863669487791">Zeigen</translation>
@@ -4874,6 +4894,7 @@
 <translation id="6628328486509726751">Hochgeladen am <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">USB-Geräte werden gesucht…</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> fordert ständigen Zugriff auf ein Zertifikat an, um sich in Ihrem Namen zu authentifizieren.</translation>
+<translation id="6635362468090274700">Andere Personen können nur Daten mit Ihnen teilen, wenn Sie sich sichtbar machen.<ph name="BR" /><ph name="BR" />Wenn Sie sich vorübergehend sichtbar machen möchten, öffnen Sie den Statusbereich und schalten Sie „Nearby-Sichtbarkeit“ ein.</translation>
 <translation id="6635944431854494329">Diese Funktion kann vom Inhaber über "Einstellungen" &gt; "Erweitert" &gt; "Diagnose- und Nutzungsdaten automatisch an Google senden" gesteuert werden.</translation>
 <translation id="6635956300022133031">Stimmen für die Sprachausgabe auswählen und anpassen</translation>
 <translation id="6636588250634969791">SIM-Karte einlegen, um fortzufahren</translation>
@@ -5025,6 +5046,7 @@
 <translation id="6811332638216701903">DHCP-Hostname</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> kann nicht als Root ausgeführt werden.</translation>
 <translation id="6812841287760418429">Änderungen beibehalten</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{Datei}other{# Dateien}}</translation>
 <translation id="6817174620439930047">Nachfragen, wenn eine Website versucht, mit systemexklusiven Meldungen auf MIDI-Geräte zuzugreifen (empfohlen)</translation>
 <translation id="6818198425579322765">Sprache der Seite, die übersetzt wird</translation>
 <translation id="6818802132960437751">Integrierter Virenschutz</translation>
@@ -5045,6 +5067,7 @@
 <translation id="6835762382653651563">Stellen Sie eine Internetverbindung her, um Ihr Gerät (<ph name="DEVICE_TYPE" />) zu aktualisieren.</translation>
 <translation id="6838034009068684089">Nachfragen, wenn eine Website Fenster auf meinen Bildschirmen öffnen und platzieren möchte (empfohlen)</translation>
 <translation id="6838694093138907871">Ungültiger Code. Bitte noch einmal versuchen.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{Telefonnummer}other{# Telefonnummern}}</translation>
 <translation id="6839225236531462745">Fehler beim Löschen des Zertifikats</translation>
 <translation id="6839916869147598086">Anmeldung hat sich geändert</translation>
 <translation id="6840155290835956714">Vor dem Senden nachfragen</translation>
@@ -5150,6 +5173,7 @@
 <translation id="6955446738988643816">Pop-up prüfen</translation>
 <translation id="6955535239952325894">Diese Einstellung ist bei verwalteten Browsern deaktiviert</translation>
 <translation id="6957044667612803194">Der Sicherheitsschlüssel unterstützt keine PINs</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{Link}other{# Links}}</translation>
 <translation id="6960507406838246615">Linux-Update erforderlich</translation>
 <translation id="696103774840402661">Alle Dateien und lokalen Daten für alle Nutzer auf diesem <ph name="DEVICE_TYPE" /> wurden dauerhaft gelöscht.</translation>
 <translation id="6964390816189577014">Held</translation>
@@ -5540,7 +5564,7 @@
 <translation id="740624631517654988">Pop-up blockiert</translation>
 <translation id="7407430846095439694">Importieren und binden</translation>
 <translation id="7407504355934009739">Die meisten Nutzer blockieren Benachrichtigungen von dieser Website</translation>
-<translation id="740810853557944681">Druckerserver hinzufügen</translation>
+<translation id="740810853557944681">Druckserver hinzufügen</translation>
 <translation id="7409549334477097887">Sehr groß</translation>
 <translation id="7409735910987429903">Websites senden möglicherweise Pop-ups zum Anzeigen von Werbung oder bringen Sie mithilfe von Weiterleitungen zu Websites, die Sie möglicherweise gar nicht besuchen möchten</translation>
 <translation id="7410344089573941623">Nachfragen, wenn <ph name="HOST" /> auf Kamera und Mikrofon zugreifen möchte</translation>
@@ -5564,7 +5588,7 @@
 <translation id="7434509671034404296">Entwickler</translation>
 <translation id="7434635829372401939">Einstellungen synchronisieren</translation>
 <translation id="7434757724413878233">Mausbeschleunigung</translation>
-<translation id="7434969625063495310">Der Druckerserver konnte nicht hinzugefügt werden. Prüfen Sie die Konfiguration des Servers und versuchen Sie es noch einmal.</translation>
+<translation id="7434969625063495310">Der Druckserver konnte nicht hinzugefügt werden. Prüfen Sie die Konfiguration des Servers und versuchen Sie es noch einmal.</translation>
 <translation id="7436921188514130341">Oh nein! Beim Umbenennen ist ein Fehler aufgetreten.</translation>
 <translation id="7439519621174723623">Geben Sie einen Gerätenamen ein, um fortzufahren</translation>
 <translation id="7441736921018636843">Wenn Sie diese Einstellung ändern möchten, müssen Sie die <ph name="BEGIN_LINK" />Synchronisierung zurücksetzen<ph name="END_LINK" />, um die Synchronisierungspassphrase zu entfernen</translation>
@@ -6059,6 +6083,7 @@
 <translation id="797394244396603170">Wähle das Gerät aus, mit dem du Dateien teilen möchtest</translation>
 <translation id="7973962044839454485">Fehler bei PPP-Authentifizierung aufgrund eines falschen Nutzernamens oder Passworts</translation>
 <translation id="7974566588408714340">Über <ph name="EXTENSIONNAME" /> erneut versuchen</translation>
+<translation id="7974713334845253259">Standardfarbe</translation>
 <translation id="7974936243149753750">Overscan</translation>
 <translation id="7975504106303186033">Sie müssen dieses Chrome Education-Gerät im Konto einer Bildungseinrichtung anmelden. Unter g.co/workspace/edusignup können Sie sich für ein neues Konto registrieren.</translation>
 <translation id="7978412674231730200">Privater Schlüssel</translation>
@@ -6224,6 +6249,7 @@
 <translation id="8157704005178149728">Elternaufsicht wird eingerichtet</translation>
 <translation id="8158117992543756526">Dieses Gerät erhält seit <ph name="MONTH_AND_YEAR" /> keine automatischen Software- und Sicherheitsupdates mehr. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">Fehler beim Festlegen der Vertrauenswürdigkeit des Zertifikats</translation>
+<translation id="8160775796528709999">Aktivieren Sie „Automatische Untertitel“ in den Einstellungen, um Ihre Audioinhalte und Videos zu untertiteln</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">Lesemodus für Webseiten</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Tab in ein neues Fenster verschieben}other{Tabs in ein neues Fenster verschieben}}</translation>
@@ -6348,6 +6374,7 @@
 <translation id="8300011035382349091">Lesezeichen für diesen Tab bearbeiten</translation>
 <translation id="8300374739238450534">Mitternachtsblau</translation>
 <translation id="8300849813060516376">OTASP fehlgeschlagen</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{Adresse}other{# Adressen}}</translation>
 <translation id="8304383784961451596">Du bist nicht zur Verwendung dieses Geräts berechtigt. Bitte den Administrator um eine Anmeldeberechtigung oder melde dich mit einem Google-Konto an, das über Family Link beaufsichtigt wird.</translation>
 <translation id="8308179586020895837">Nachfragen, wenn <ph name="HOST" /> auf Ihre Kamera zugreifen möchte</translation>
 <translation id="830868413617744215">Beta</translation>
@@ -6525,7 +6552,7 @@
 <translation id="8540136935098276800">Bitte geben Sie eine korrekt formatierte URL ein</translation>
 <translation id="8540608333167683902">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Signalstärke bei <ph name="SIGNAL_STRENGTH" /> %, Details</translation>
 <translation id="854071720451629801">Als gelesen markieren</translation>
-<translation id="8541462173655894684">Auf dem Druckerserver wurden keine Drucker gefunden</translation>
+<translation id="8541462173655894684">Auf dem Druckserver wurden keine Drucker gefunden</translation>
 <translation id="8542618328173222274">Nachfragen, wenn eine Website meine Virtual-Reality-Geräte und ‑Daten verwenden möchte</translation>
 <translation id="8543556556237226809">Fragen? Wenden Sie sich an die Person, die Ihr Profil überwacht.</translation>
 <translation id="8546186510985480118">Ihr Gerät hat wenig freien Speicherplatz</translation>
@@ -6646,6 +6673,7 @@
 <translation id="867085395664725367">Ein temporärer Serverfehler ist aufgetreten.</translation>
 <translation id="8673026256276578048">Im Web suchen...</translation>
 <translation id="8673383193459449849">Serverfehler</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{Video}other{# Videos}}</translation>
 <translation id="8676374126336081632">Eingabe löschen</translation>
 <translation id="8676770494376880701">Leistungsschwaches Ladegerät angeschlossen</translation>
 <translation id="8677212948402625567">Alle minimieren...</translation>
@@ -7071,6 +7099,7 @@
 <translation id="9128870381267983090">Mit Netzwerk verbinden</translation>
 <translation id="9130015405878219958">Eingegebener Modus ist ungültig.</translation>
 <translation id="9131487537093447019">Nachrichten an Bluetooth-Geräte senden und von diesen erhalten</translation>
+<translation id="9134119143784876218">Erstellt automatisch Untertitel für englischsprachige Audioinhalte und Videos (zurzeit nur im Chrome-Browser verfügbar). Audioinhalte und Untertitel werden ausschließlich auf dem Gerät gespeichert.</translation>
 <translation id="9137013805542155359">Original anzeigen</translation>
 <translation id="9137157311132182254">Bevorzugte Suchmaschine</translation>
 <translation id="9137248913990643158">Melden Sie sich in Chrome an, bevor Sie diese App nutzen.</translation>
@@ -7118,6 +7147,7 @@
 <translation id="9179524979050048593">Nutzername auf Anmeldebildschirm</translation>
 <translation id="9180281769944411366">Der Vorgang kann einige Minuten dauern. Linux-Container wird gestartet.</translation>
 <translation id="9180380851667544951">Die Website kann Ihren Bildschirm freigeben</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{App}other{# Apps}}</translation>
 <translation id="9186963452600581158">Mit dem Google-Konto eines Kindes anmelden</translation>
 <translation id="9188732951356337132">Sie haben die Möglichkeit, Nutzungsdaten &amp; Fehlerberichte zu senden. Dieses Gerät sendet momentan automatisch Diagnose- sowie Geräte- und App-Nutzungsdaten an Google. Ihr Kind wird mithilfe dieser Daten nicht identifiziert, sie helfen jedoch beispielsweise dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Wenn zusätzlich die Einstellung "Web- &amp; App-Aktivitäten" für Ihr Kind aktiviert ist, werden diese Daten in seinem Google-Konto gespeichert. <ph name="BEGIN_LINK2" />Weitere Informationen<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">Android-Smartphone als Sicherheitsschlüssel verwenden</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 0f7e962..9152626 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Αντιγραφή διεύθυνσης URL</translation>
 <translation id="2155772377859296191">Θα εμφανίζεται ως <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Επανάληψη εκτέλεσης ελέγχου ασφαλείας</translation>
 <translation id="2157474325782140681">Για επιπλέον λειτουργίες, χρησιμοποιήστε μια βάση σύνδεσης Dell που έχει σχεδιαστεί για χρήση με αυτό το Chromebook.</translation>
 <translation id="215753907730220065">Έξοδος από πλήρη οθόνη</translation>
 <translation id="2157875535253991059">Αυτή η σελίδα εμφανίζεται σε πλήρη οθόνη</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Υπογραφή κώδικα</translation>
 <translation id="3227137524299004712">Μικρόφωνο</translation>
 <translation id="3233271424239923319">Δημιουργία αντιγράφων ασφαλείας για εφαρμογές και αρχεία Linux</translation>
+<translation id="3238192140106069382">Σύνδεση και επαλήθευση</translation>
 <translation id="3239373508713281971">Το χρονικό όριο για την εφαρμογή <ph name="APP_NAME" /> καταργήθηκε.</translation>
 <translation id="3241680850019875542">Επιλέξτε τον κατάλογο ρίζας της επέκτασης που θέλετε να στοιβάξετε. Για να ενημερώσετε μια επέκταση, επιλέξτε επίσης το αρχείο ιδιωτικού κλειδιού που θα επαναχρησιμοποιηθεί.</translation>
 <translation id="3244294424315804309">Συνέχιση σίγασης ήχου</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Υπάρχον βίντεο από την κάμερα ή από αρχείο</translation>
 <translation id="3884152383786131369">Το περιεχόμενο ιστού που είναι διαθέσιμο σε πολλές γλώσσες θα χρησιμοποιεί την πρώτη υποστηριζόμενη γλώσσα από αυτήν τη λίστα. Αυτές οι προτιμήσεις συγχρονίζονται με τις ρυθμίσεις του προγράμματος περιήγησης. <ph name="BEGIN_LINK_LEARN_MORE" />Μάθετε περισσότερα<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Το αίτημά σας για να αποκτήσετε πρόσβαση σε αυτόν τον ιστότοπο έχει σταλεί στον/η(ν) <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Ανενεργή. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Λήψη σημειώσεων με την εφαρμογή <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Ενεργοποιήστε τον Συγχρονισμό Chrome για να χρησιμοποιήσετε τον Συγχρονισμό Wi-Fi</translation>
 <translation id="3892414795099177503">Προσθήκη OpenVPN / L2TP…</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Εισαγωγή σελιδοδεικτών και ρυθμίσεων</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Απενεργοποίηση δικτύου κινητής τηλεφωνίας</translation>
-<translation id="3965730875470565266">Ενεργή, <ph name="MINUTES" /> λ.</translation>
 <translation id="3965811923470826124">Με</translation>
 <translation id="3965965397408324205">Έξοδος από <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Επιλέξτε άλλο φάκελο...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Προφίλ</translation>
 <translation id="583281660410589416">Άγνωστο</translation>
 <translation id="5833397272224757657">Χρησιμοποιεί περιεχόμενο στους ιστότοπους που επισκέπτεστε, καθώς και δραστηριότητα και αλληλεπιδράσεις του προγράμματος περιήγησης, για εξατομίκευση</translation>
-<translation id="5833551944249825624">Το Chromebook θα είναι ορατό σε όλους τους χρήστες σε κοντινή απόσταση για 5 λεπτά.</translation>
 <translation id="5833726373896279253">Οι ρυθμίσεις αυτές μπορούν να τροποποιηθούν μόνο από τον κάτοχο:</translation>
 <translation id="5834581999798853053">Απομένουν περίπου <ph name="TIME" /> λεπτά</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Εγγραφή κάμερας ή μικροφώνου</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index d2665d9..d620649 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2587,7 +2587,6 @@
 <translation id="3882165008614329320">Existing video from camera or file</translation>
 <translation id="3884152383786131369">Web content available in multiple languages will use the first supported language from this list. These preferences are synced with your browser settings. <ph name="BEGIN_LINK_LEARN_MORE" />Learn more<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Your request to access this site has been sent to <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Off. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Taking notes with <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Turn on Chrome Sync to use Wi-Fi Sync</translation>
 <translation id="3892414795099177503">Add OpenVPN/L2TP...</translation>
@@ -2671,7 +2670,6 @@
 <translation id="3958088479270651626">Import bookmarks and settings</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Turn off mobile network</translation>
-<translation id="3965730875470565266">On, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">With</translation>
 <translation id="3965965397408324205">Exit <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Choose another folder...</translation>
@@ -4221,7 +4219,6 @@
 <translation id="5832813618714645810">Profiles</translation>
 <translation id="583281660410589416">Unknown</translation>
 <translation id="5833397272224757657">Uses content on sites that you visit, plus browser activity and interactions, for personalisation</translation>
-<translation id="5833551944249825624">Your Chromebook will be visible to everyone nearby for five minutes</translation>
 <translation id="5833726373896279253">These settings may only be modified by the owner:</translation>
 <translation id="5834581999798853053">About <ph name="TIME" /> minutes left</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Camera or microphone recording</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 96792709..1918799 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2155772377859296191">Resolución: <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Volver a ejecutar la verificación de seguridad</translation>
 <translation id="2157474325782140681">Para obtener más funciones, usa una estación de conexión Dell diseñada para funcionar con esta Chromebook.</translation>
 <translation id="215753907730220065">Salir de pantalla completa</translation>
 <translation id="2157875535253991059">Esta página está en modo de pantalla completa.</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Firma de código</translation>
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3233271424239923319">Crear una copia de seguridad de los archivos y apps de Linux</translation>
+<translation id="3238192140106069382">Conectando y verificando</translation>
 <translation id="3239373508713281971">Se quitó el límite de tiempo para <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Seleccionar el directorio de raíz de la extensión que debe empaquetarse. Para actualizar una extensión, también debes seleccionar el archivo de clave privada que será reutilizado.</translation>
 <translation id="3244294424315804309">Continuar silenciando el sonido</translation>
@@ -2582,7 +2584,6 @@
 <translation id="3882165008614329320">Video existente de la cámara o archivo</translation>
 <translation id="3884152383786131369">El contenido web disponible en múltiples idiomas usará el primer idioma compatible de esta lista. Estas preferencias están sincronizadas con la configuración de tu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Tu solicitud de acceso a este sitio se envió a <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Desactivado. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Tomar notas con <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activa la Sincronización de Chrome para usar la Sincronización Wi-Fi</translation>
 <translation id="3892414795099177503">Agregar OpenVPN/L2TP…</translation>
@@ -2666,7 +2667,6 @@
 <translation id="3958088479270651626">Importar favoritos y configuración</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desactivar la red móvil</translation>
-<translation id="3965730875470565266">Activado: <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Con</translation>
 <translation id="3965965397408324205">Salir de <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Seleccionar otra carpeta...</translation>
@@ -4216,7 +4216,6 @@
 <translation id="5832813618714645810">Perfiles</translation>
 <translation id="583281660410589416">Desconocido</translation>
 <translation id="5833397272224757657">Usa el contenido de los sitios que visitas, tus interacciones y actividad de navegación para personalizar las opciones</translation>
-<translation id="5833551944249825624">Tu Chromebook estará visible para todas las personas que estén cerca durante 5 min</translation>
 <translation id="5833726373896279253">Esta configuración sólo puede ser modificada por el propietario:</translation>
 <translation id="5834581999798853053">Faltan aproximadamente <ph name="TIME" /> minutos.</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: La cámara o el micrófono están grabando</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 12a779f..5526f39 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2155772377859296191">Resolución de <ph name="WIDTH" />x<ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Volver a ejecutar la comprobación de seguridad</translation>
 <translation id="2157474325782140681">Si quieres obtener funciones adicionales, usa una base Dell que se haya diseñado para funcionar con este Chromebook.</translation>
 <translation id="215753907730220065">Desactivar pantalla completa</translation>
 <translation id="2157875535253991059">Esta página se muestra ahora en pantalla completa.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Code Signing</translation>
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3233271424239923319">Copia de seguridad de las aplicaciones y archivos de Linux</translation>
+<translation id="3238192140106069382">Conectando y verificando</translation>
 <translation id="3239373508713281971">Se ha quitado el límite de tiempo de <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Selecciona el directorio raíz de las extensiones que quieras empaquetar. Para actualizar una extensión, debes seleccionar también el archivo de clave privada que se va a volver a usar.</translation>
 <translation id="3244294424315804309">Seguir silenciando el sonido</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Vídeo de la cámara o un archivo</translation>
 <translation id="3884152383786131369">El contenido web que esté disponible en varios idiomas usará el primer idioma admitido de esta lista. Estas preferencias se sincronizan con la configuración de tu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Más información<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Tu solicitud de acceso a este sitio web se ha enviado a <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Desactivado. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Tomando notas con <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activa la Sincronización de Chrome para usar la Sincronización Wi‑Fi</translation>
 <translation id="3892414795099177503">Añadir OpenVPN / L2TP...</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">Importar marcadores y configuración</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desactivar red móvil</translation>
-<translation id="3965730875470565266">Activado, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Con</translation>
 <translation id="3965965397408324205">Salir de <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Seleccionar otra carpeta...</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">Perfiles</translation>
 <translation id="583281660410589416">Desconocido</translation>
 <translation id="5833397272224757657">Utiliza el contenido de los sitios que visitas, así como las interacciones y la actividad del navegador, para ofrecer una experiencia personalizada</translation>
-<translation id="5833551944249825624">Tu Chromebook será visible para todos los usuarios cercanos durante 5 minutos.</translation>
 <translation id="5833726373896279253">Esta configuración solo puede modificarla el propietario:</translation>
 <translation id="5834581999798853053">Unos <ph name="TIME" /> minutos</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: grabación de la cámara o del micrófono</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 6895a20..e91262c1 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -2587,7 +2587,6 @@
 <translation id="3882165008614329320">Olemasolev video kaamerast või failist</translation>
 <translation id="3884152383786131369">Mitmes keeles saadaval olev veebisisu esitatakse loendi esimeses toetatud keeles. Need eelistused sünkroonitakse teie brauseri seadetega. <ph name="BEGIN_LINK_LEARN_MORE" />Lisateave<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Teie juurdepääsutaotlus sellele saidile saadeti kasutajale <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Väljas. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Märkmete tegemine rakendusega <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">WiFi sünkroonimise kasutamiseks lülitage sisse Chrome'i sünkroonimine</translation>
 <translation id="3892414795099177503">Lisa OpenVPN/L2TP …</translation>
@@ -2671,7 +2670,6 @@
 <translation id="3958088479270651626">Järjehoidjate ja seadete importimine</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobiilsidevõrgu väljalülitamine</translation>
-<translation id="3965730875470565266">Sees, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Teenusepakkuja:</translation>
 <translation id="3965965397408324205">Välju profiililt <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Vali muu kaust...</translation>
@@ -4221,7 +4219,6 @@
 <translation id="5832813618714645810">Profiilid</translation>
 <translation id="583281660410589416">Tundmatu</translation>
 <translation id="5833397272224757657">Kasutab isikupärastamiseks teie külastatavate saitide sisu ning brauseri tegevusi ja interaktsioone</translation>
-<translation id="5833551944249825624">Teie Chromebook on kõigile läheduses olevatele kasutajatele viis minutit nähtav</translation>
 <translation id="5833726373896279253">Neid seadeid saab muuta ainult omanik:</translation>
 <translation id="5834581999798853053">Jäänud on umbes <ph name="TIME" /> minutit</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kaamera või mikrofon salvestab</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 30808dd..802e34d9 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">Zerbitzuetako langileak</translation>
 <translation id="1235458158152011030">Sare ezagunak</translation>
 <translation id="123578888592755962">Diskoa beteta dago</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{testua}other{# testu}}</translation>
 <translation id="1239594683407221485">Arakatu gailuko edukia Fitxategiak aplikazioan.</translation>
 <translation id="124116460088058876">Hizkuntza gehiago</translation>
 <translation id="1241753985463165747">Abiarazitakoan, irakurri eta aldatu uneko webgunean dituzun datu guztiak</translation>
@@ -308,7 +309,7 @@
 <translation id="1341988552785875222">"<ph name="APP_NAME" />" aplikazioak ezarri du uneko horma-papera. Agian "<ph name="APP_NAME" />" desinstalatu beharko duzu beste horma-paper bat hautatu aurretik.</translation>
 <translation id="1343865611738742294">Eman USB bidezko gailua atzitzeko baimena Linux-eko aplikazioei. USB bidezko gailu bat kendu ondoren, Linux-ek ez du gogoratuko.</translation>
 <translation id="1346630054604077329">Berretsi eta berrezarri</translation>
-<translation id="1347256498747320987">Instalatu eguneratzeak eta aplikazioak. Aurrera eginez gero, onartu egingo duzu agian gailuak automatikoki deskargatu eta instalatuko dituela Google-ren, operadorearen edo fabrikatzailearen eguneratzeak eta aplikazioak ere, beharbada datu-konexioa erabilita. Baliteke aplikazio horietako batzuetan erosketak egin ahal izatea. <ph name="BEGIN_LINK1" />Lortu informazio gehiago<ph name="END_LINK1" /></translation>
+<translation id="1347256498747320987">Instalatu eguneratzeak eta aplikazioak. Aurrera eginez gero, onartuko duzu agian gailuak automatikoki deskargatu eta instalatuko dituela Google-ren, operadorearen edo fabrikatzailearen eguneratzeak eta aplikazioak ere, beharbada datu-konexioa erabilita. Baliteke aplikazio horietako batzuetan erosketak egin ahal izatea. <ph name="BEGIN_LINK1" />Lortu informazio gehiago<ph name="END_LINK1" /></translation>
 <translation id="1347512539447549782">Linux-en biltegiratzea</translation>
 <translation id="1347975661240122359">Bateriaren gutxienez % <ph name="BATTERY_LEVEL" /> duzunean hasiko da eguneratzen.</translation>
 <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">Bilatu pasahitza</translation>
 <translation id="1487335504823219454">Aktibatuta: ezarpen pertsonalizatuak</translation>
 <translation id="1489664337021920575">Hautatu beste aukera bat</translation>
+<translation id="1490491397986065675">Administratzaileak hau dio: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1492417797159476138">Dagoeneko gorde duzu erabiltzaile-izen hau webgune honetarako</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> parametroaren zain…</translation>
 <translation id="1495677929897281669">Itzuli fitxara</translation>
@@ -811,6 +813,7 @@
 <translation id="1879000426787380528">Hasi saioa kontu honekin:</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" ziurtagiria ezabatu nahi duzu?</translation>
 <translation id="1881445033931614352">Teklatuaren diseinua</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{Elementua}other{# elementu}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> sarea. <ph name="NETWORK_NAME" />. Konektatu.</translation>
 <translation id="1884340228047885921">Uneko ikusgaitasun-ezarpena: Kontaktu batzuk</translation>
 <translation id="1884705339276589024">Aldatu Linux-eko diskoaren tamaina</translation>
@@ -989,6 +992,7 @@
 <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" zerbitzari-ziurtagiria ezabatu nahi duzu?</translation>
 <translation id="2100273922101894616">Saio-hasiera automatikoa</translation>
 <translation id="2101225219012730419">Bertsioa:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{Telefono-zenbakia}other{# telefono-zenbaki}}</translation>
 <translation id="211144231511833662">Garbitu motak</translation>
 <translation id="2111670510994270194">Fitxa berria eskuinean</translation>
 <translation id="21133533946938348">Ainguratu fitxa</translation>
@@ -1041,6 +1045,7 @@
 <translation id="2154710561487035718">Kopiatu URLa</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> × <ph name="HEIGHT" /> dirudi</translation>
 <translation id="2156294658807918600">Zerbitzuko langilea: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Egin segurtasun-egiaztapena berriro</translation>
 <translation id="2157474325782140681">Eginbide gehiago lortzeko, erabili Chromebook honekin funtzionatzeko diseinatu den Dell-eko oinarri bat.</translation>
 <translation id="215753907730220065">Irten pantaila osoko modutik</translation>
 <translation id="2157875535253991059">Orria pantaila osoan dago orain.</translation>
@@ -1285,6 +1290,7 @@
 <translation id="2435457462613246316">Erakutsi pasahitza</translation>
 <translation id="2435579801172349831">Ireki guztiak (<ph name="URL_COUNT" />) ezkutuko moduko leiho batean</translation>
 <translation id="2436186046335138073"><ph name="PROTOCOL" /> esteka guztiak irekitzeko baimena eman nahi diozu <ph name="HANDLER_HOSTNAME" /> maneiatzaileari?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{aplikazioa}other{# aplikazio}}</translation>
 <translation id="2440604414813129000">Ikusi &amp;iturburua</translation>
 <translation id="244231003699905658">Helbideak ez du balio. Egiaztatu helbidea zuzena dela eta saiatu berriro.</translation>
 <translation id="2442916515643169563">Testuaren itzala</translation>
@@ -1433,6 +1439,7 @@
 <translation id="2604255671529671813">Sareko konexioaren errorea</translation>
 <translation id="2606246518223360146">Lotu datuak</translation>
 <translation id="2606454609872547359">Ez, egin aurrera ChromeVox gabe</translation>
+<translation id="2606568927909309675">Automatikoki sortzen ditu ingelesezko audio eta bideoen azpitituluak. Audioa eta azpitituluak ez dira ateratzen gailutik.</translation>
 <translation id="2607101320794533334">Hartzailearen gako publikoaren informazioa</translation>
 <translation id="2609896558069604090">Sortu lasterbideak…</translation>
 <translation id="2609980095400624569">Ezin izan da ezarri konexioa</translation>
@@ -1697,6 +1704,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">Ireki esteka honekin…</translation>
 <translation id="2889925978073739256">Jarraitu blokeatzen proben eremuan sartu gabeko pluginak</translation>
+<translation id="2891922230654533301">Gailua erabili nahi duzu <ph name="APP_NAME" /> webgunean saioa hasteko?</translation>
 <translation id="2893168226686371498">Arakatzaile lehenetsia</translation>
 <translation id="2894757982205307093">Gehitu fitxa bat taldean</translation>
 <translation id="289644616180464099">Blokeatuta dago SIM txartela</translation>
@@ -1982,6 +1990,7 @@
 <translation id="3225319735946384299">Kode-sinadura</translation>
 <translation id="3227137524299004712">Mikrofonoa</translation>
 <translation id="3233271424239923319">Egin Linux aplikazioen eta fitxategien babeskopiak</translation>
+<translation id="3238192140106069382">Konektatzen eta egiaztatzen</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> aplikazioaren denbora-muga kendu da</translation>
 <translation id="3241680850019875542">Hautatu paketatu beharreko luzapenaren erroko direktorioa. Luzapenak eguneratzeko, hautatu berriro erabili beharreko gako pribatuaren fitxategia ere.</translation>
 <translation id="3244294424315804309">Ez aktibatu audioa</translation>
@@ -2008,6 +2017,7 @@
 <translation id="3269069891205016797">Zure informazioa gailutik kenduko da saioa amaitzen duzunean.</translation>
 <translation id="3269093882174072735">Kargatu irudia</translation>
 <translation id="3269612321104318480">Anil argia eta zuria</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{Fitxategia}other{# fitxategi}}</translation>
 <translation id="326999365752735949">Aldea deskargatzen</translation>
 <translation id="3270965368676314374">Irakurri, aldatu eta ezabatu ordenagailuko argazkiak, musika eta bestelako multimedia-edukia</translation>
 <translation id="327147043223061465">Ikusi webguneko datu eta cookie guztiak</translation>
@@ -2108,7 +2118,7 @@
 <translation id="3390013585654699824">Aplikazioaren xehetasunak</translation>
 <translation id="3390741581549395454">Egin dira Linux aplikazio eta fitxategien babeskopiak. Laster hasiko da bertsio-berritzen.</translation>
 <translation id="339178315942519818">Ikusi txat-aplikazioen jakinarazpenak <ph name="DEVICE_TYPE" /> gailuan</translation>
-<translation id="3396800784455899911">"Onartu eta egin aurrera" botoia sakatuta, onartu egingo duzu Google-ren zerbitzuok prozesatzeko modua, arestian aipatu bezala.</translation>
+<translation id="3396800784455899911">"Onartu eta egin aurrera" botoia sakatuta, onartuko duzu Google-ren zerbitzuok prozesatzeko modua, arestian aipatu bezala.</translation>
 <translation id="3399432415385675819">Desgaitu egingo dira jakinarazpenak</translation>
 <translation id="3400390787768057815"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> hertz) - gurutzatuta</translation>
 <translation id="3402255108239926910">Aukeratu abatarra</translation>
@@ -2303,6 +2313,7 @@
 <translation id="3600792891314830896">Desaktibatu soinua erreproduzitzen duten webguneen audioa</translation>
 <translation id="360180734785106144">Eskuratu eginbide berriak erabilgarri dauden bezain laster</translation>
 <translation id="3602290021589620013">Aurrebista</translation>
+<translation id="3602870520245633055">Inprimatu eta eskaneatu</translation>
 <translation id="3603622770190368340">Eskuratu sareko ziurtagiria</translation>
 <translation id="3604193429970465812">Bigarren mailako kontuak</translation>
 <translation id="3604713164406837697">Aldatu horma-papera</translation>
@@ -2318,6 +2329,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> aztertzen ari gara.</translation>
 <translation id="3616741288025931835">&amp;Garbitu arakatze-datuak...</translation>
 <translation id="3617891479562106823">Atzeko planoak ez daude erabilgarri. Saiatu berriro geroago.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{bideoa}other{# bideo}}</translation>
 <translation id="3619115746895587757">Kaputxinoa</translation>
 <translation id="362333465072914957">Ziurtagiri-emaileak ziurtagiria jaulkitzeko zain</translation>
 <translation id="3624567683873126087">Desblokeatu gailua eta hasi saioa Google-ko kontuan</translation>
@@ -2575,7 +2587,6 @@
 <translation id="3882165008614329320">Kamerako bideo bat edo bideo-fitxategi bat (lehendik duzuna)</translation>
 <translation id="3884152383786131369">Hizkuntza onartuen zerrendan agertzen den lehenengo hizkuntza erabiliko dute hizkuntza batean baino gehiagotan dauden web-edukiek. Arakatzaileko ezarpenekin sinkronizatuta daude hobespen horiek. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Bidali zaio webgunean sartzeko eskaera <ph name="NAME" /> erabiltzaileari.</translation>
-<translation id="3888364689515978571">Desaktibatuta. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> aplikazioarekin oharrak idaztea</translation>
 <translation id="3890064827463908288">Aktibatu Chrome-ren Sinkronizazioa Wifi-sinkronizazioa erabiltzeko</translation>
 <translation id="3892414795099177503">Gehitu OpenVPN/L2TP…</translation>
@@ -2659,7 +2670,6 @@
 <translation id="3958088479270651626">Inportatu laster-markak eta ezarpenak</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desaktibatu sare mugikorra</translation>
-<translation id="3965730875470565266">Aktibatuta, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Zerbitzu-hornitzaile honekin:</translation>
 <translation id="3965965397408324205">Irten <ph name="PROFILE_NAME" /> profiletik</translation>
 <translation id="3966072572894326936">Aukeratu beste karpeta bat…</translation>
@@ -2729,6 +2739,7 @@
 <translation id="4047726037116394521">Joan orri nagusira</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# kontaktu ez dago erabilgarri. Nearby Share kontaktu horrekin erabiltzeko, gehitu kontaktuetan haren Google-ko kontuarekin lotutako helbide elektronikoa.}other{# kontaktu ez daude erabilgarri. Nearby Share kontaktu horiekin erabiltzeko, gehitu kontaktuetan haien Google-ko kontuarekin lotutako helbide elektronikoa.}}</translation>
 <translation id="4050225813016893843">Autentifikazio-metodoa</translation>
+<translation id="4050534976465737778">Egiaztatu bi gailuak desblokeatuta eta elkarrengandik hurbil daudela, eta Bluetooth-a aktibatuta daukatela. Edukia zure kontaktuetan ez dagoen Chromebook batekin partekatzeko asmoa baduzu, egiaztatu Nearby-ren ikusgaitasuna aktibatuta dagoela (ireki egoeraren eremua eta, gero, aktibatu Nearby-ren ikusgaitasuna). <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">Oso txikia</translation>
 <translation id="4054070260844648638">Guztientzat ikusgai</translation>
 <translation id="4056908315660577142">Iritsi zara gurasoak Chrome-ren <ph name="APP_NAME" /> aplikazioa erabiltzeko ezarritako denbora-mugara. Bihar, <ph name="TIME_LIMIT" /> izango dituzu hura erabiltzeko.</translation>
@@ -2963,6 +2974,7 @@
 <translation id="4364327530094270451">Meloia</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> leiho bat partekatzen ari da.</translation>
 <translation id="4364830672918311045">Bistaratu jakinarazpenak</translation>
+<translation id="4366138410738374926">Inprimatzen hasi da</translation>
 <translation id="437004882363131692">Lortu <ph name="DEVICE_TYPE" /> gailuari buruzko aholkuak, eskaintzak eta berritasunak, eta partekatu zure iritzia. Edonoiz ken dezakezu harpidetza.</translation>
 <translation id="4370425812909262207">Ezkutatu dira saskiak. Aldaketak egiten dituzunean agertuko dira berriro.</translation>
 <translation id="4370975561335139969">Idatzitako helbide elektronikoa eta pasahitza ez datoz bat</translation>
@@ -3150,6 +3162,7 @@
 <translation id="4568025708905928793">Segurtasun-giltza bat eskatzen</translation>
 <translation id="4568213207643490790">Gailu honetan ezin da erabili Google-ko konturik.</translation>
 <translation id="4569747168316751899">Inaktibo dagoenean</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{helbidea}other{# helbide}}</translation>
 <translation id="4570387585180509432">Helbideak, telefono-zenbakiak, eta beste</translation>
 <translation id="4572659312570518089">Autentifikazioa bertan behera utzi da "<ph name="DEVICE_NAME" />" gailura konektatzean.</translation>
 <translation id="4572779512957829735">Idatzi segurtasun-giltzaren PINa</translation>
@@ -3209,6 +3222,7 @@
 <translation id="4635444580397524003">Leheneratu da Linux-en babeskopia.</translation>
 <translation id="4636930964841734540">Informazioa</translation>
 <translation id="4637083375689622795">Ekintza gehiago, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{Testua}other{# testu}}</translation>
 <translation id="4638930039313743000">Gautu ADB arazketa</translation>
 <translation id="4641539339823703554">Chrome-k ezin izan du sistemaren ordua ezarri. Egiaztatu beheko ordua eta, beharrezkoa bada, zuzen ezazu.</translation>
 <translation id="4642769377300286600">Mugikorreko profila instalatzen, <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> sarea, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3224,10 +3238,12 @@
 <translation id="4651484272688821107">Ezin izan da kargatu sareko osagaia demo moduko baliabideekin.</translation>
 <translation id="4652935475563630866">Kameraren ezarpenean egindako aldaketa gauzatzeko, berrabiarazi egin behar da Parallels Desktop. Aurrera egiteko, berrabiarazi Parallels Desktop.</translation>
 <translation id="4653405415038586100">Errore bat gertatu da Linux konfiguratzean</translation>
+<translation id="4654236001025007561">Partekatu fitxategiak inguruan dituzun Chromebook-ekin eta Android-eko gailuekin</translation>
 <translation id="4657914796247705218">TrackPoint-aren abiadura</translation>
 <translation id="465878909996028221">HTTP, HTTPS eta fitxategi-protokoloak soilik onartzen dira arakatzaileen birbideratzeak gauzatzeko.</translation>
 <translation id="4659077111144409915">Kontu nagusia</translation>
 <translation id="4659126640776004816">Google-ko kontuan saioa hastean, aktibatu egiten da eginbide hau.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{Irudia}other{# irudi}}</translation>
 <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" bertsioa espero zen, baina "<ph name="NEW_ID" />" da bertsioa</translation>
 <translation id="4660540330091848931">Tamaina aldatzen</translation>
 <translation id="4661407454952063730">Aplikazioek gordetako datu guztiak sartzen dira aplikazioetako datuetan (garatzaileen ezarpenen arabera), kontaktuak, mezuak eta argazkiak barne.</translation>
@@ -3328,6 +3344,7 @@
 <translation id="4794810983896241342"><ph name="BEGIN_LINK" />Administratzaileak<ph name="END_LINK" /> kudeatzen ditu eguneratzeak</translation>
 <translation id="479536056609751218">Web-orria, HTML soilik</translation>
 <translation id="4798236378408895261">Erantsi <ph name="BEGIN_LINK" />Bluetooth konexioari buruzko erregistroak<ph name="END_LINK" /> (Google barnekoa)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{elementua}other{# elementu}}</translation>
 <translation id="4801448226354548035">Ezkutatu kontuak</translation>
 <translation id="4801512016965057443">Baimendu mugikorreko ibiltaritzako datuak</translation>
 <translation id="4804818685124855865">Deskonektatu</translation>
@@ -3758,6 +3775,7 @@
 <translation id="531118851858162334">Google-ren zerbitzuak erabiltzean egin dituzun jardueretan oinarrituta ari gara erakusten produktu hau. Jarduera horiei buruzko datuak ikusi eta ezabatu nahi badituzu, edo haiei buruzko ezarpenak aldatu, joan <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunera.</translation>
 <translation id="5311304534597152726">Kontu honetan hasiko duzu saioa:</translation>
 <translation id="5311565231560644461">Ez utzi webguneei errealitate birtualeko gailuak eta datuak erabiltzen</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{irudia}other{# irudi}}</translation>
 <translation id="5314381603623123224">Chrome-ren Zerbitzu-baldintzak martxoaren 31n aldatuko dira</translation>
 <translation id="5315738755890845852">Giltza gehigarria: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">Gorde</translation>
@@ -3823,6 +3841,7 @@
 <translation id="5390677308841849479">Gorri iluna eta laranja</translation>
 <translation id="5390743329570580756">Bidali honetarako</translation>
 <translation id="5392192690789334093">Jakinarazpenak bidal ditzakete</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{Esteka}other{# esteka}}</translation>
 <translation id="5397794290049113714">Zu</translation>
 <translation id="5398497406011404839">Ezkutatutako laster-markak</translation>
 <translation id="5398572795982417028">Orriaren erreferentziak muga gainditzen du. Muga <ph name="MAXIMUM_PAGE" /> da.</translation>
@@ -4120,7 +4139,7 @@
 <translation id="5731247495086897348">It&amp;satsi eta listo</translation>
 <translation id="5732392974455271431">Gurasoek desblokea diezazukete</translation>
 <translation id="5734362860645681824">Komunikazioak</translation>
-<translation id="5734697361979786483">Gehitu fitxategiak partekatzeko sareko gailua</translation>
+<translation id="5734697361979786483">Gehitu fitxategiak partekatzeko biltegia</translation>
 <translation id="5736796278325406685">Idatzi balio duen erabiltzaile-izen bat</translation>
 <translation id="5739017626473506901">Hasi saioa <ph name="USER_NAME" /> erabiltzaileak ikastetxeko kontua gehi dezan</translation>
 <translation id="5739235828260127894">Egiaztapenaren zain. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
@@ -4199,7 +4218,6 @@
 <translation id="5832813618714645810">Profilak</translation>
 <translation id="583281660410589416">Ezezaguna</translation>
 <translation id="5833397272224757657">Zerbitzua pertsonalizatzeko, bisitatzen dituzun webguneetako edukiak eta arakatzailean izandako jarduerak nahiz interakzioak erabiltzen ditu</translation>
-<translation id="5833551944249825624">Inguruko guztientzat egongo da ikusgai Chromebook-a bost minutuz</translation>
 <translation id="5833726373896279253">Jabeak soilik alda ditzake ezarpen hauek:</translation>
 <translation id="5834581999798853053"><ph name="TIME" /> minutu inguru geratzen dira</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Kamera edo mikrofonoa grabatzen ari da</translation>
@@ -4210,7 +4228,7 @@
 <translation id="584451707753263735">Istanteko azpitituluak ikusgai; sakatu F6 fokuratzea aldatzeko</translation>
 <translation id="5844574845205796324">Iradoki arakatzeko eduki berria</translation>
 <translation id="5846200638699387931">Erlazio-sintaxiaren errorea: <ph name="ERROR_LINE" /></translation>
-<translation id="5846807460505171493">Instalatu eguneratzeak eta aplikazioak. Halaber, aurrera eginez gero, onartu egingo duzu Google-ren, operadorearen edo fabrikatzailearen eguneratzeak eta aplikazioak automatikoki deskargatu eta instalatuko direla agian, beharbada datu-konexioa erabilita. Baliteke aplikazio horietako batzuetan erosketak egin ahal izatea.</translation>
+<translation id="5846807460505171493">Instalatu eguneratzeak eta aplikazioak. Halaber, aurrera eginez gero, onartuko duzu Google-ren, operadorearen edo fabrikatzailearen eguneratzeak eta aplikazioak automatikoki deskargatu eta instalatuko direla agian, beharbada datu-konexioa erabilita. Baliteke aplikazio horietako batzuetan erosketak egin ahal izatea.</translation>
 <translation id="5849212445710944278">Gehitu da jada</translation>
 <translation id="5851868085455377790">Jaulkitzailea</translation>
 <translation id="5852112051279473187">Arazo larriren bat gertatu da gailua erregistratzean. Saiatu berriro edo jarri harremanetan laguntza-zerbitzuko ordezkariren batekin.</translation>
@@ -4350,6 +4368,7 @@
 <translation id="6011074160056912900">Ethernet sarea</translation>
 <translation id="6011193465932186973">Hatz-marka</translation>
 <translation id="6011449291337289699">Garbitu webgunearen datuak</translation>
+<translation id="6013027779243312217">Lortu audioaren eta bideoen azpitituluak</translation>
 <translation id="6015796118275082299">Urtea</translation>
 <translation id="6016178549409952427">Joan <ph name="CURRENT_ELEMENT" /> elementu gehigarritatik <ph name="TOTAL_ELEMENTS" />garrenera</translation>
 <translation id="6016551720757758985">Berretsi fabrikako ezarpenak berrezarri nahi dituzula eta aurreko bertsiora itzuli nahi duzula</translation>
@@ -4859,6 +4878,7 @@
 <translation id="6605847144724004692">Ezein erabiltzailek ez du baloratu oraindik.</translation>
 <translation id="6607831829715835317">&amp;Tresna gehiago</translation>
 <translation id="6607890859198268021"><ph name="DOMAIN" /> da <ph name="USER_EMAIL" /> kontuaren kudeatzailea. Google-ko beste kontu batekin gurasoen murriztapenak erabiltzeko, amaitu saioa konfigurazioa osatu ondoren. Gero, hautatu "Gehitu pertsona bat" saioa hasteko pantailan.</translation>
+<translation id="6609478180749378879">Ezkutuko modutik irteten zarenean, saioa hasteko datuak gailu honetan gordeko dira. Horrela, gailu honekin webgune honetan saioa hasi ahalko duzu berriro.</translation>
 <translation id="6611972847767394631">Bilatu fitxak hemen</translation>
 <translation id="6612358246767739896">Eduki babestua</translation>
 <translation id="6615455863669487791">Erakutsi</translation>
@@ -4877,6 +4897,7 @@
 <translation id="6628328486509726751">Kargatze-denbora: <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">USB bidezko gailuak bilatzen…</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> luzapenak ziurtagiri baterako sarbide iraunkorra nahi du bere burua zure izenean autentifikatzeko.</translation>
+<translation id="6635362468090274700">Ikusgai zaudenean soilik parteka dezakete edukia zurekin.<ph name="BR" /><ph name="BR" />Aldi baterako ikusgai egoteko, ireki egoeraren eremua eta, ondoren, aktibatu Nearby-ren ikusgaitasuna.</translation>
 <translation id="6635944431854494329">Jabeak eginbide hau kontrolatzeko, atal honetara joan behar du: Ezarpenak &gt; Aurreratuak &gt; Bidali Google-ri diagnostikoak eta erabilera-datuak automatikoki.</translation>
 <translation id="6635956300022133031">Hautatu eta pertsonalizatu testua ahots bihurtzeko eginbidearen ahotsak</translation>
 <translation id="6636588250634969791">Sartu SIM txartela aurrera egin baino lehen</translation>
@@ -5028,6 +5049,7 @@
 <translation id="6811332638216701903">DHCP motako ostalari-izena</translation>
 <translation id="6812349420832218321">Ezin da <ph name="PRODUCT_NAME" /> erro gisa exekutatu.</translation>
 <translation id="6812841287760418429">Mantendu aldaketak</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{fitxategia}other{# fitxategi}}</translation>
 <translation id="6817174620439930047">Eskatu nire baimena webgune batek sistemaren mezu esklusiboak erabili nahi dituenean MIDI gailuak atzitzeko (gomendatua)</translation>
 <translation id="6818198425579322765">Orriaren jatorrizko hizkuntza</translation>
 <translation id="6818802132960437751">Birusen aurkako babes integratua</translation>
@@ -5048,6 +5070,7 @@
 <translation id="6835762382653651563"><ph name="DEVICE_TYPE" /> eguneratzeko, konektatu Internetera.</translation>
 <translation id="6838034009068684089">Eskatu zure baimena webguneren batek zure pantailetan leihoak ireki eta kokatu nahi dituenean (gomendatua)</translation>
 <translation id="6838694093138907871">Kodeak ez du balio. Saiatu berriro.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{telefono-zenbakia}other{# telefono-zenbaki}}</translation>
 <translation id="6839225236531462745">Errore bat gertatu da ziurtagiria ezabatzean</translation>
 <translation id="6839916869147598086">Aldatu egin da saioa hasteko modua</translation>
 <translation id="6840155290835956714">Eskatu berrespena bidali aurretik</translation>
@@ -5153,6 +5176,7 @@
 <translation id="6955446738988643816">Ikuskatu leiho gainerakorra</translation>
 <translation id="6955535239952325894">Ezarpen hau desgaituta dago kudeatutako arakatzaileetan</translation>
 <translation id="6957044667612803194">Segurtasun-giltza honek ez ditu onartzen PIN kodeak</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{esteka}other{# esteka}}</translation>
 <translation id="6960507406838246615">Linux eguneratu egin behar da</translation>
 <translation id="696103774840402661"><ph name="DEVICE_TYPE" /> gailuan gordeta zeuden erabiltzaile guztien fitxategi eta gailuko datu guztiak betiko ezabatu dira.</translation>
 <translation id="6964390816189577014">Heroia</translation>
@@ -5728,7 +5752,7 @@
 <translation id="7628201176665550262">Freskatze-abiadura</translation>
 <translation id="7629827748548208700">Fitxa: <ph name="TAB_NAME" /></translation>
 <translation id="7631014249255418691">Egin dira Linux aplikazioen eta fitxategien babeskopiak</translation>
-<translation id="7631205654593498032">Gailuak konektatzen dituzunean, onartu egingo duzu <ph name="DEVICE_TYPE" /> gailuak gaitasuna izango duela hauek egiteko:</translation>
+<translation id="7631205654593498032">Gailuak konektatzen dituzunean, onartuko duzu <ph name="DEVICE_TYPE" /> gailuak gaitasuna izango duela hauek egiteko:</translation>
 <translation id="7631887513477658702">Ireki beti &amp;mota honetako fitxategiak</translation>
 <translation id="7632948528260659758">Aplikazio espezializatu hauek ezin izan dira eguneratu:</translation>
 <translation id="7633724038415831385">Hau da eguneratzeen zain egongo zaren aldi bakarra. Izan ere, atzeko planoan eguneratzen da softwarea Chromebook-etan.</translation>
@@ -6062,6 +6086,7 @@
 <translation id="797394244396603170">Hautatu zein gailurekin partekatu nahi dituzun fitxategiak</translation>
 <translation id="7973962044839454485">Ezin izan da PPP bidez autentifikatu erabiltzaile-izena edo pasahitza okerra zelako</translation>
 <translation id="7974566588408714340">Saiatu berriro <ph name="EXTENSIONNAME" /> erabilita</translation>
+<translation id="7974713334845253259">Kolore lehenetsia</translation>
 <translation id="7974936243149753750">Bilatu gainetik</translation>
 <translation id="7975504106303186033">Chrome Education-eko gailu hau G Suite for Education-eko kontu batekin erregistratu behar duzu. Beste kontu bat erregistratzeko, joan g.co/workspace/edusignup helbidera.</translation>
 <translation id="7978412674231730200">Gako pribatua</translation>
@@ -6227,6 +6252,7 @@
 <translation id="8157704005178149728">Gainbegiratzea konfiguratzen</translation>
 <translation id="8158117992543756526">Data honetan utzi zitzaion softwarea eta segurtasun-eguneratzeak automatikoki jasotzeari: <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">Errore bat gertatu da ziurtagiriaren konfiantza-maila editatzean</translation>
+<translation id="8160775796528709999">Audioaren eta bideoen azpitituluak lortzeko, gaitu Istanteko azpitituluak ezarpenetan</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">Web-orrietarako irakurgailu modua</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Eraman fitxa leiho berri batera}other{Eraman fitxak leiho berri batera}}</translation>
@@ -6351,6 +6377,7 @@
 <translation id="8300011035382349091">Editatu fitxa honen laster-marka</translation>
 <translation id="8300374739238450534">Urdin iluna</translation>
 <translation id="8300849813060516376">OTASP zerbitzuak huts egin du</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{Helbidea}other{# helbide}}</translation>
 <translation id="8304383784961451596">Ez duzu baimenik gailu hau erabiltzeko. Jarri harremanetan administratzailearekin saioa hasteko baimena lortzeko, edo hasi saioa Family Link-ek gainbegiratutako Google-ko kontu batean.</translation>
 <translation id="8308179586020895837">Galdetu <ph name="HOST" /> ostalariak zure kamera atzitu nahi duenean</translation>
 <translation id="830868413617744215">Beta</translation>
@@ -6649,6 +6676,7 @@
 <translation id="867085395664725367">Aldi baterako errore bat gertatu da zerbitzarian.</translation>
 <translation id="8673026256276578048">Bilatu Interneten…</translation>
 <translation id="8673383193459449849">Zerbitzariaren arazoa</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{Bideoa}other{# bideo}}</translation>
 <translation id="8676374126336081632">Garbitu idatzitakoa</translation>
 <translation id="8676770494376880701">Potentzia txikiko kargagailua konektatu da</translation>
 <translation id="8677212948402625567">Tolestu guztiak…</translation>
@@ -7074,6 +7102,7 @@
 <translation id="9128870381267983090">Konektatu sarera</translation>
 <translation id="9130015405878219958">Sartutako moduak ez du balio.</translation>
 <translation id="9131487537093447019">Bidali mezuak Bluetooth bidezko gailuetara eta jaso haien mezuak.</translation>
+<translation id="9134119143784876218">Automatikoki sortzen ditu ingelesezko audioaren eta bideoen azpitituluak (Chrome arakatzailean bakarrik dago erabilgarri oraingoz). Audioa eta azpitituluak ez dira ateratzen gailutik.</translation>
 <translation id="9137013805542155359">Ikusi jatorrizkoa</translation>
 <translation id="9137157311132182254">Bilatzaile hobetsia</translation>
 <translation id="9137248913990643158">Aplikazio hau erabili aurretik, ireki Chrome eta hasi saioa.</translation>
@@ -7121,6 +7150,7 @@
 <translation id="9179524979050048593">Saioa hasteko pantailako erabiltzaile-izena</translation>
 <translation id="9180281769944411366">Baliteke prozesuak minutu batzuk behar izatea. Linux edukiontzia abiarazten.</translation>
 <translation id="9180380851667544951">Webguneak pantaila parteka dezake</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{Aplikazioa}other{# aplikazio}}</translation>
 <translation id="9186963452600581158">Hasi saioa haurraren Google-ko kontuan</translation>
 <translation id="9188732951356337132">Bidali erabilera- eta diagnostiko-datuak. Gailu honek automatikoki bidaltzen dizkio Google-ri diagnostikoak eta gailu zein aplikazioen erabilerari buruzko datuak. Informazio hori ez da erabiliko haurra identifikatzeko eta, hari esker, sistemaren eta aplikazioen egonkortasuna hobetuko da, besteak beste. Gainera, multzokatutako datu batzuk oso baliagarriak izango dira Google-ren aplikazioak hobetzeko eta bazkideei laguntzeko (adibidez, Android-en garatzaileei). Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea. <ph name="BEGIN_LINK2" />Lortu informazio gehiago<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">Erabili Android-eko telefonoa segurtasun-giltza gisa</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 9a791ef6..1010d38 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1043,6 +1043,7 @@
 <translation id="2154710561487035718">کپی نشانی وب</translation>
 <translation id="2155772377859296191">‏‎<ph name="WIDTH" /> × <ph name="HEIGHT" />‎ به‌نظر می‌رسد</translation>
 <translation id="2156294658807918600">عامل خدماتی: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">اجرای مجدد «بررسی ایمنی»</translation>
 <translation id="2157474325782140681">‏برای دریافت ویژگی‌های اضافی، از ایستگاه پایه اتصال Dell که برای کار با این Chromebook طراحی شده است، استفاده کنید.</translation>
 <translation id="215753907730220065">خروج از حالت تمام صفحه</translation>
 <translation id="2157875535253991059">این صفحه اکنون در حالت تمام صفحه است.</translation>
@@ -1987,6 +1988,7 @@
 <translation id="3225319735946384299">امضای کد</translation>
 <translation id="3227137524299004712">میکروفن</translation>
 <translation id="3233271424239923319">‏پشتیبان‌گیری برنامه‌ها و فایل‌های Linux</translation>
+<translation id="3238192140106069382">درحال اتصال و تأیید</translation>
 <translation id="3239373508713281971">محدودیت زمانی برای <ph name="APP_NAME" /> برداشته شده است</translation>
 <translation id="3241680850019875542">دایرکتوری ریشه برنامهٔ افزودنی را برای فشرده کردن انتخاب کنید. همچنین برای به‌روزرسانی برنامهٔ افزودنی، فایل کلید خصوصی را برای استفاده مجدد انتخاب کنید.</translation>
 <translation id="3244294424315804309">همچنان بی‌صدا</translation>
@@ -2583,7 +2585,6 @@
 <translation id="3882165008614329320">ویدیوی موجود از دوربین یا فایل</translation>
 <translation id="3884152383786131369">محتوای وبی که به چند زبان دردسترس است از اولین زبان پشتیبانی‌شده در این فهرست استفاده خواهد کرد. این اولویت‌ها با تنظیمات مرورگرتان همگام‌سازی می‌شود. <ph name="BEGIN_LINK_LEARN_MORE" />بیشتر بدانید<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">درخواست شما برای دسترسی به این سایت برای <ph name="NAME" /> ارسال شده است</translation>
-<translation id="3888364689515978571">خاموش. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">یادداشت‌برداری با <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">‏روشن کردن «همگام‌سازی Chrome» برای استفاده از «همگام‌سازی Wi-Fi»</translation>
 <translation id="3892414795099177503">‏افزودن OpenVPN / L2TP…</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">وارد کردن نشانک‌ها و تنظیمات</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">خاموش کردن شبکه تلفن همراه</translation>
-<translation id="3965730875470565266">روشن، <ph name="MINUTES" /> دقیقه</translation>
 <translation id="3965811923470826124">با</translation>
 <translation id="3965965397408324205">خارج شدن از <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">انتخاب یک پوشه دیگر…</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">نمایه‌ها</translation>
 <translation id="583281660410589416">ناشناس</translation>
 <translation id="5833397272224757657">از محتوای سایت‌هایی که بازدید می‌کنید و فعالیت و تعاملات مرورگر برای شخصی‌سازی استفاده می‌کند</translation>
-<translation id="5833551944249825624">‏Chromebook شما به‌مدت ۵ دقیقه برای همه افرادی که در این اطراف هستند نمایان خواهد بود</translation>
 <translation id="5833726373896279253">این تنظیمات فقط توسط مالک قابل تغییر هستند:</translation>
 <translation id="5834581999798853053">حدود <ph name="TIME" /> دقیقه باقی مانده است</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - دوربین یا میکروفون درحال ضبط کردن است</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 57375ae..41c68a8f 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Kopioi URL-osoite</translation>
 <translation id="2155772377859296191">Näyttää olevan <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Tee turvatarkistus uudelleen</translation>
 <translation id="2157474325782140681">Jos haluat lisäominaisuuksia, käytä Dell-telinettä, joka on suunniteltu yhteensopivaksi tämän Chromebookin kanssa.</translation>
 <translation id="215753907730220065">Poistu koko näytön tilasta</translation>
 <translation id="2157875535253991059">Tämä sivu on nyt koko näytöllä.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Koodin allekirjoitus</translation>
 <translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3233271424239923319">Varmuuskopioi Linux-sovellukset ja ‑tiedostot</translation>
+<translation id="3238192140106069382">Yhdistetään ja tarkistetaan</translation>
 <translation id="3239373508713281971">Aikaraja poistettu: <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Voit pakata laajennuksen valitsemalla sen juurihakemiston. Jos haluat päivittää laajennuksen, valitse myös yksityinen avaintiedosto, jotta laajennusta voidaan käyttää uudelleen.</translation>
 <translation id="3244294424315804309">Jatka äänen mykistystä</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Olemassa oleva video kamerasta tai tiedostosta</translation>
 <translation id="3884152383786131369">Verkkosisältö, joka on saatavilla useilla kielillä, käyttää ensimmäistä tuettua kieltä tältä listalta. Nämä asetukset synkronoidaan selainasetustesi kanssa. <ph name="BEGIN_LINK_LEARN_MORE" />Lue lisää<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Pyyntösi päästä tälle sivustolle on lähetetty henkilölle <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Poissa päältä. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Muistiinpanojen kirjoittaminen sovelluksella <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Laita Chromen synkronointi päälle, jotta voit käyttää Wi-Fin synkronointia</translation>
 <translation id="3892414795099177503">Lisää OpenVPN tai L2TP…</translation>
@@ -2666,7 +2667,6 @@
 <translation id="3958088479270651626">Kirjanmerkkien ja asetusten tuominen</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Laita mobiiliverkko pois päältä</translation>
-<translation id="3965730875470565266">Päällä, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Palveluntarjoaja:</translation>
 <translation id="3965965397408324205">Sulje <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Valitse toinen kansio...</translation>
@@ -4216,7 +4216,6 @@
 <translation id="5832813618714645810">Profiilit</translation>
 <translation id="583281660410589416">Tuntematon</translation>
 <translation id="5833397272224757657">Käyttää personointiin avaamiesi sivujen sisältöä, selaustoimintaa ja selainvuorovaikutusta</translation>
-<translation id="5833551944249825624">Chromebookisi näkyy kaikille lähistöllä oleville 5 minuutin ajan</translation>
 <translation id="5833726373896279253">Vain omistaja voi muokata näitä asetuksia:</translation>
 <translation id="5834581999798853053">Noin <ph name="TIME" /> minuuttia jäljellä</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kamera tai mikrofoni tallentaa sisältöä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 2da4b62..687e444b 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -2588,7 +2588,6 @@
 <translation id="3882165008614329320">Kasalukuyang video mula sa camera o file</translation>
 <translation id="3884152383786131369">Gagamitin ng content sa web na nasa maraming wika ang unang sinusuportahang wika mula sa listahang ito. Naka-sync ang mga kagustuhang ito sa iyong mga setting ng browser. <ph name="BEGIN_LINK_LEARN_MORE" />Matuto pa<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Ipinadala ang iyong kahilingang i-access ang site na ito kay <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Naka-off. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Nagtatala gamit ang <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">I-on ang Chrome Sync para gamitin ang Wi-Fi Sync</translation>
 <translation id="3892414795099177503">Idagdag ang OpenVPN / L2TP...</translation>
@@ -2672,7 +2671,6 @@
 <translation id="3958088479270651626">I-import ang mga bookmark at setting</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">I-off ang Cellular network</translation>
-<translation id="3965730875470565266">Naka-on, <ph name="MINUTES" /> (na) min</translation>
 <translation id="3965811923470826124">Gamit ang</translation>
 <translation id="3965965397408324205">Lumabas sa <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Pumili ng isa pang folder...</translation>
@@ -4222,7 +4220,6 @@
 <translation id="5832813618714645810">Mga Profile</translation>
 <translation id="583281660410589416">Hindi-alam</translation>
 <translation id="5833397272224757657">Ginagamit ang content sa mga site na binibisita mo at ang aktibidad at mga pakikipag-ugnayan sa browser para sa pag-personalize</translation>
-<translation id="5833551944249825624">Makikita ng lahat ng kalapit ang iyong Chromebook sa loob ng 5 min</translation>
 <translation id="5833726373896279253">Mababago lang ang mga setting na ito ng may-ari:</translation>
 <translation id="5834581999798853053">Mga <ph name="TIME" /> (na) minuto ang natitira</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Nagre-record ang camera o mikropono</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 3218e40..b3a32ef6 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -2577,7 +2577,6 @@
 <translation id="3882165008614329320">Vidéo existante de la caméra ou du fichier</translation>
 <translation id="3884152383786131369">Le contenu Web offert en plusieurs langues utilisera la première langue prise en charge de cette liste. Ces préférences sont synchronisées avec les paramètres de votre navigateur. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Votre demande d'accès à ce site a été envoyée à <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Désactivé. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Prendre des notes avec <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activez la synchronisation Chrome pour utiliser la synchronisation Wi-Fi</translation>
 <translation id="3892414795099177503">Ajouter OpenVPN/L2TP…</translation>
@@ -2661,7 +2660,6 @@
 <translation id="3958088479270651626">Importation des favoris et des paramètres</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Désactiver la connectivité cellulaire</translation>
-<translation id="3965730875470565266">Activé, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Avec</translation>
 <translation id="3965965397408324205">Quitter <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Choisir un autre dossier...</translation>
@@ -4201,7 +4199,6 @@
 <translation id="5832813618714645810">Profils</translation>
 <translation id="583281660410589416">Inconnu</translation>
 <translation id="5833397272224757657">Utilise le contenu de sites que vous consultez, ainsi que l'activité du navigateur et les interactions avec celui-ci pour la personnalisation</translation>
-<translation id="5833551944249825624">Votre Chromebook sera visible par toutes les personnes à proximité pendant cinq minutes</translation>
 <translation id="5833726373896279253">Seul le propriétaire peut modifier ces paramètres :</translation>
 <translation id="5834581999798853053">Il reste environ <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Enregistrement de la caméra ou du micro</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 1cbec76..9a5c83f 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -219,6 +219,7 @@
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="1235458158152011030">Réseaux connus</translation>
 <translation id="123578888592755962">Disque saturé.</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{SMS}one{# SMS}other{# SMS}}</translation>
 <translation id="1239594683407221485">Explorez le contenu de l'appareil dans l'application Fichiers.</translation>
 <translation id="124116460088058876">Plus de langues</translation>
 <translation id="1241753985463165747">Accéder à toutes vos données sur le site Web actuellement consulté et les modifier</translation>
@@ -441,6 +442,7 @@
 <translation id="1486096554574027028">Rechercher</translation>
 <translation id="1487335504823219454">Activée – Paramètres personnalisés</translation>
 <translation id="1489664337021920575">Sélectionner une autre option</translation>
+<translation id="1490491397986065675">Message de votre administrateur : "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1492417797159476138">Vous avez déjà enregistré ce nom d'utilisateur pour ce site</translation>
 <translation id="1493892686965953381">En attente de <ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1495677929897281669">Retour à l'onglet</translation>
@@ -812,6 +814,7 @@
 <translation id="1879000426787380528">Se connecter à l'aide du compte</translation>
 <translation id="1880905663253319515">Supprimer le certificat "<ph name="CERTIFICATE_NAME" />" ?</translation>
 <translation id="1881445033931614352">Disposition des touches du clavier</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{Élément}one{# élément}other{# éléments}}</translation>
 <translation id="1884013283844450420">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, connexion</translation>
 <translation id="1884340228047885921">Le paramètre actuel de visibilité s'applique à certains contacts</translation>
 <translation id="1884705339276589024">Redimensionner le disque Linux</translation>
@@ -990,6 +993,7 @@
 <translation id="2099686503067610784">Supprimer le certificat de serveur "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="2100273922101894616">Connexion automatique</translation>
 <translation id="2101225219012730419">Version :</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{Numéro de téléphone}one{# numéro de téléphone}other{# numéros de téléphone}}</translation>
 <translation id="211144231511833662">Effacer les types</translation>
 <translation id="2111670510994270194">Nouvel onglet à droite</translation>
 <translation id="21133533946938348">Épingler l'onglet</translation>
@@ -1042,6 +1046,7 @@
 <translation id="2154710561487035718">Copier l'URL</translation>
 <translation id="2155772377859296191">La résolution est de <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker : <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Relancer le contrôle de situation</translation>
 <translation id="2157474325782140681">Pour bénéficier de fonctionnalités supplémentaires, utilisez une station d'accueil Dell compatible avec ce Chromebook.</translation>
 <translation id="215753907730220065">Quitter le mode plein écran</translation>
 <translation id="2157875535253991059">Cette page est maintenant en mode plein écran</translation>
@@ -1286,6 +1291,7 @@
 <translation id="2435457462613246316">Afficher le mot de passe</translation>
 <translation id="2435579801172349831">Tout ouvrir (<ph name="URL_COUNT" />) dans une fenêtre de navigation privée</translation>
 <translation id="2436186046335138073">Autoriser <ph name="HANDLER_HOSTNAME" /> à ouvrir tous les liens <ph name="PROTOCOL" /> ?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{application}one{# application}other{# applications}}</translation>
 <translation id="2440604414813129000">Afficher la s&amp;ource</translation>
 <translation id="244231003699905658">Adresse non valide. Veuillez vérifier l'adresse, puis réessayer.</translation>
 <translation id="2442916515643169563">Ombre du texte</translation>
@@ -1434,6 +1440,7 @@
 <translation id="2604255671529671813">Erreur de connexion réseau</translation>
 <translation id="2606246518223360146">Associer les données</translation>
 <translation id="2606454609872547359">Non, continuer sans ChromeVox</translation>
+<translation id="2606568927909309675">Génère automatiquement des sous-titres pour les contenus audio et vidéo en anglais. Le flux audio et les sous-titres ne sont jamais exportés hors de votre appareil.</translation>
 <translation id="2607101320794533334">Infos sur la clé publique de l'objet</translation>
 <translation id="2609896558069604090">Créer des raccourcis…</translation>
 <translation id="2609980095400624569">Impossible d'établir la connexion</translation>
@@ -1698,6 +1705,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">Ouvrir le lien avec...</translation>
 <translation id="2889925978073739256">Continuer à bloquer l'exécution hors bac à sable des plug-ins</translation>
+<translation id="2891922230654533301">Utiliser cet appareil pour vous connecter à <ph name="APP_NAME" /> ?</translation>
 <translation id="2893168226686371498">Navigateur par défaut</translation>
 <translation id="2894757982205307093">Nouvel onglet dans le groupe</translation>
 <translation id="289644616180464099">La carte SIM est verrouillée</translation>
@@ -1983,6 +1991,7 @@
 <translation id="3225319735946384299">Signature du code</translation>
 <translation id="3227137524299004712">Micro</translation>
 <translation id="3233271424239923319">Sauvegarder des applications et fichiers Linux</translation>
+<translation id="3238192140106069382">Connexion et validation…</translation>
 <translation id="3239373508713281971">Limite de temps supprimée pour <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Sélectionnez le répertoire racine de l'extension à empaqueter. Pour mettre à jour une extension, sélectionnez également le fichier de clé privée à réutiliser.</translation>
 <translation id="3244294424315804309">Ne pas réactiver le son</translation>
@@ -2009,6 +2018,7 @@
 <translation id="3269069891205016797">Les informations vous concernant seront supprimées de cet appareil dès votre déconnexion.</translation>
 <translation id="3269093882174072735">Charger l'image</translation>
 <translation id="3269612321104318480">Turquoise clair et blanc</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{Fichier}one{# fichier}other{# fichiers}}</translation>
 <translation id="326999365752735949">Différence de téléchargement</translation>
 <translation id="3270965368676314374">Accéder aux photos, à la musique et aux autres fichiers multimédias stockés sur votre ordinateur, les modifier et les supprimer</translation>
 <translation id="327147043223061465">Afficher l'ensemble des cookies et données de sites</translation>
@@ -2304,6 +2314,7 @@
 <translation id="3600792891314830896">Couper le son des sites</translation>
 <translation id="360180734785106144">Proposer de nouvelles fonctionnalités dès qu'elles sont disponibles</translation>
 <translation id="3602290021589620013">Aperçu</translation>
+<translation id="3602870520245633055">Imprimer et numériser</translation>
 <translation id="3603622770190368340">Obtenir un certificat réseau</translation>
 <translation id="3604193429970465812">Comptes secondaires</translation>
 <translation id="3604713164406837697">Changer de fond d'écran</translation>
@@ -2319,6 +2330,7 @@
 <translation id="3615579745882581859">Analyse de <ph name="FILE_NAME" />…</translation>
 <translation id="3616741288025931835">&amp;Effacer les données de navigation...</translation>
 <translation id="3617891479562106823">Les arrière-plans sont indisponibles. Réessayez plus tard.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{vidéo}one{# vidéo}other{# vidéos}}</translation>
 <translation id="3619115746895587757">Cappuccino</translation>
 <translation id="362333465072914957">En attente de l'émission du certificat par l'autorité de certification</translation>
 <translation id="3624567683873126087">Déverrouiller l'appareil et se connecter au compte Google</translation>
@@ -2576,7 +2588,6 @@
 <translation id="3882165008614329320">Vidéo existante filmée avec la caméra ou lue à partir d'un fichier</translation>
 <translation id="3884152383786131369">Le contenu Web disponible dans plusieurs langues vous sera proposé dans la première langue disponible de cette liste. Ces préférences sont synchronisées avec les paramètres de votre navigateur. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Votre demande d'accès à ce site a bien été envoyée à <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Désactivé. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Prise de notes avec <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activer la synchronisation Chrome pour utiliser Sync Wi-Fi</translation>
 <translation id="3892414795099177503">Ajouter une connexion OpenVPN/L2TP…</translation>
@@ -2660,7 +2671,6 @@
 <translation id="3958088479270651626">Importer les favoris et les paramètres</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Désactiver le réseau mobile</translation>
-<translation id="3965730875470565266">Activé, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Avec</translation>
 <translation id="3965965397408324205">Quitter <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Choisir un autre dossier...</translation>
@@ -2730,6 +2740,7 @@
 <translation id="4047726037116394521">Accéder à l'écran d'accueil</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# contact n'est pas disponible. Pour utiliser le Partage à proximité avec cette personne, ajoutez à vos contacts l'adresse e-mail associée à son compte Google.}one{# contact n'est pas disponible. Pour utiliser le Partage à proximité avec cette personne, ajoutez à vos contacts l'adresse e-mail associée à son compte Google.}other{# contacts ne sont pas disponibles. Pour utiliser le Partage à proximité avec ces personnes, ajoutez à vos contacts les adresses e-mail associées à leurs comptes Google.}}</translation>
 <translation id="4050225813016893843">Méthode d'authentification</translation>
+<translation id="4050534976465737778">Assurez-vous que les deux appareils sont déverrouillés, qu'ils sont proches l'un de l'autre et que le Bluetooth est activé sur les deux. Si vous partagez des fichiers avec un Chromebook qui ne figure pas dans vos contacts, assurez-vous que l'option "Visibilité à proximité" est activée sur celui-ci. Pour cela, ouvrez la zone d'état, puis sélectionnez "Visibilité à proximité". <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">Très petite</translation>
 <translation id="4054070260844648638">Visible par tous</translation>
 <translation id="4056908315660577142">Tu as atteint la limite de temps fixée par l'un de tes parents pour l'application Chrome <ph name="APP_NAME" />. Tu pourras l'utiliser demain pendant <ph name="TIME_LIMIT" />.</translation>
@@ -2964,6 +2975,7 @@
 <translation id="4364327530094270451">Melon</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation>
 <translation id="4364830672918311045">Afficher les notifications</translation>
+<translation id="4366138410738374926">L'impression a commencé</translation>
 <translation id="437004882363131692">Recevez des conseils, des offres et des informations sur <ph name="DEVICE_TYPE" />, et partagez vos commentaires. Vous pouvez vous désabonner à tout moment.</translation>
 <translation id="4370425812909262207">Les paniers sont masqués. Ils s'afficheront de nouveau si vous effectuez des changements.</translation>
 <translation id="4370975561335139969">L'adresse e-mail et le mot de passe saisis ne correspondent pas.</translation>
@@ -3151,6 +3163,7 @@
 <translation id="4568025708905928793">Demande de clé de sécurité…</translation>
 <translation id="4568213207643490790">Désolé, les comptes Google ne sont pas autorisés sur cet appareil.</translation>
 <translation id="4569747168316751899">En cas d'inactivité</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{adresse}one{# adresse}other{# adresses}}</translation>
 <translation id="4570387585180509432">Adresses, numéros de téléphone, etc.</translation>
 <translation id="4572659312570518089">Annulation de l'authentification lors de la connexion à l'appareil "<ph name="DEVICE_NAME" />".</translation>
 <translation id="4572779512957829735">Saisissez le code associé à votre clé de sécurité</translation>
@@ -3210,6 +3223,7 @@
 <translation id="4635444580397524003">La sauvegarde Linux a bien été restaurée.</translation>
 <translation id="4636930964841734540">Infos</translation>
 <translation id="4637083375689622795">Autres actions, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{SMS}one{# SMS}other{# SMS}}</translation>
 <translation id="4638930039313743000">Activer le débogage ADB</translation>
 <translation id="4641539339823703554">Impossible de définir l'heure du système. Veuillez vérifier l'heure ci-dessous et la corriger si nécessaire.</translation>
 <translation id="4642769377300286600">Installation du profil mobile, réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />…</translation>
@@ -3225,10 +3239,12 @@
 <translation id="4651484272688821107">Impossible de charger le composant en ligne avec les ressources du mode de démonstration.</translation>
 <translation id="4652935475563630866">La modification des paramètres de l'appareil photo nécessite le redémarrage de Parallels Desktop. Relancez Parallels Desktop pour continuer.</translation>
 <translation id="4653405415038586100">Erreur lors de la configuration de Linux</translation>
+<translation id="4654236001025007561">Partagez des fichiers avec des Chromebooks et des appareils Android à proximité</translation>
 <translation id="4657914796247705218">Vitesse</translation>
 <translation id="465878909996028221">Seuls les protocoles http et https, ainsi que les protocoles de fichiers, sont compatibles avec les redirections de navigateur.</translation>
 <translation id="4659077111144409915">Compte principal</translation>
 <translation id="4659126640776004816">Lorsque vous vous connectez à votre compte Google, cette fonctionnalité est activée.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{Image}one{# image}other{# images}}</translation>
 <translation id="4660476621274971848">Version <ph name="NEW_ID" /> reçue au lieu de la version <ph name="EXPECTED_VERSION" /> attendue</translation>
 <translation id="4660540330091848931">Redimensionnement…</translation>
 <translation id="4661407454952063730">Les données de l'application peuvent désigner toutes les données enregistrées par une application (en fonction des paramètres définis par le développeur), y compris celles comme les contacts, les messages et les photos.</translation>
@@ -3329,6 +3345,7 @@
 <translation id="4794810983896241342">Les mises à jour sont gérées par <ph name="BEGIN_LINK" />votre administrateur<ph name="END_LINK" /></translation>
 <translation id="479536056609751218">Page Web, HTML uniquement</translation>
 <translation id="4798236378408895261">Joindre les <ph name="BEGIN_LINK" />journaux Bluetooth<ph name="END_LINK" /> (usage interne de Google)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{élément}one{# élément}other{# éléments}}</translation>
 <translation id="4801448226354548035">Masquer les comptes</translation>
 <translation id="4801512016965057443">Autoriser l'itinérance des données mobiles</translation>
 <translation id="4804818685124855865">Se déconnecter</translation>
@@ -3759,6 +3776,7 @@
 <translation id="531118851858162334">Cet élément s'affiche en raison de vos activités précédentes sur les services Google. Vous pouvez consulter et supprimer vos données, ainsi que modifier vos paramètres, sur <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="5311304534597152726">Connexion en tant que</translation>
 <translation id="5311565231560644461">Interdire aux sites d'utiliser vos données et appareils de réalité virtuelle</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{image}one{# image}other{# images}}</translation>
 <translation id="5314381603623123224">Les conditions d'utilisation de Chrome vont changer le 31 mars</translation>
 <translation id="5315738755890845852">Accolade supplémentaire : <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">Enregistrer</translation>
@@ -3824,6 +3842,7 @@
 <translation id="5390677308841849479">Rouge foncé et orange</translation>
 <translation id="5390743329570580756">Envoyer pour</translation>
 <translation id="5392192690789334093">Autorisés à envoyer des notifications</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{Lien}one{# lien}other{# liens}}</translation>
 <translation id="5397794290049113714">Vous</translation>
 <translation id="5398497406011404839">Favoris masqués</translation>
 <translation id="5398572795982417028">Plage de pages hors limites. Le nombre maximal de pages est <ph name="MAXIMUM_PAGE" />.</translation>
@@ -4202,7 +4221,6 @@
 <translation id="5832813618714645810">Profils</translation>
 <translation id="583281660410589416">Inconnu</translation>
 <translation id="5833397272224757657">Utilise le contenu des sites que vous consultez, votre activité de navigation et vos interactions pour la personnalisation</translation>
-<translation id="5833551944249825624">Votre Chromebook sera visible par toutes les personnes à proximité pendant cinq minutes</translation>
 <translation id="5833726373896279253">Ces paramètres ne peuvent être modifiés que par le propriétaire :</translation>
 <translation id="5834581999798853053">Environ <ph name="TIME" /> minutes restantes</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> –  Enregistrement vidéo ou audio</translation>
@@ -4353,6 +4371,7 @@
 <translation id="6011074160056912900">Réseau Ethernet</translation>
 <translation id="6011193465932186973">Empreinte digitale</translation>
 <translation id="6011449291337289699">Effacer les données de sites</translation>
+<translation id="6013027779243312217">Afficher des sous-titres pour vos contenus audio et vidéo</translation>
 <translation id="6015796118275082299">Année</translation>
 <translation id="6016178549409952427">Accéder au contenu supplémentaire <ph name="CURRENT_ELEMENT" /> sur <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="6016551720757758985">Confirmer la réinitialisation Powerwash et rétablir la version précédente</translation>
@@ -4862,6 +4881,7 @@
 <translation id="6605847144724004692">Aucune note d'utilisateurs reçue.</translation>
 <translation id="6607831829715835317">Plus d'outi&amp;ls</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> est déjà géré par <ph name="DOMAIN" />. Pour utiliser le contrôle parental avec un autre compte Google, déconnectez-vous une fois la configuration terminée, puis sélectionnez "Ajouter une personne" sur l'écran de connexion.</translation>
+<translation id="6609478180749378879">Les données de connexion seront stockées sur l'appareil lorsque vous quitterez le mode navigation privée. Vous pourrez vous reconnecter à ce site Web avec votre appareil plus tard.</translation>
 <translation id="6611972847767394631">Retrouvez vos onglets ici</translation>
 <translation id="6612358246767739896">Contenu protégé</translation>
 <translation id="6615455863669487791">Démonstration</translation>
@@ -4880,6 +4900,7 @@
 <translation id="6628328486509726751">Date et heure d'importation : <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">Recherche d'appareils USB…</translation>
 <translation id="6630752851777525409">Une demande d'accès permanent à un certificat pour s'authentifier en votre nom a été initiée pour l'extension "<ph name="EXTENSION_NAME" />".</translation>
+<translation id="6635362468090274700">Personne ne peut partager du contenu avec vous tant que vous n'avez pas choisi d'être visible.<ph name="BR" /><ph name="BR" />Pour devenir visible temporairement, ouvrez la zone d'état, puis activez "Visibilité à proximité".</translation>
 <translation id="6635944431854494329">Le propriétaire peut contrôler cette fonctionnalité dans Paramètres &gt; Paramètres avancés &gt; Envoyer automatiquement des données de diagnostic et d'utilisation à Google.</translation>
 <translation id="6635956300022133031">Sélectionner et personnaliser les voix de la synthèse vocale</translation>
 <translation id="6636588250634969791">Insérez une carte SIM avant de continuer</translation>
@@ -5031,6 +5052,7 @@
 <translation id="6811332638216701903">Nom d'hôte DHCP</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ne peut pas être exécuté en tant que root.</translation>
 <translation id="6812841287760418429">Conserver les modifications</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{fichier}one{# fichier}other{# fichiers}}</translation>
 <translation id="6817174620439930047">Demander lorsqu'un site souhaite utiliser des messages spécifiques au système pour accéder aux appareils MIDI (recommandé)</translation>
 <translation id="6818198425579322765">Langue source</translation>
 <translation id="6818802132960437751">Protection antivirus intégrée</translation>
@@ -5051,6 +5073,7 @@
 <translation id="6835762382653651563">Connectez-vous à Internet pour mettre à jour votre <ph name="DEVICE_TYPE" />.</translation>
 <translation id="6838034009068684089">Vous demander votre avis lorsqu'un site souhaite ouvrir et placer des fenêtres sur vos écrans (recommandé)</translation>
 <translation id="6838694093138907871">Code non valide. Veuillez réessayer.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{numéro de téléphone}one{# numéro de téléphone}other{# numéros de téléphone}}</translation>
 <translation id="6839225236531462745">Erreur de suppression de certificat</translation>
 <translation id="6839916869147598086">Le processus de connexion a été modifié</translation>
 <translation id="6840155290835956714">Demander avant d'envoyer</translation>
@@ -5156,6 +5179,7 @@
 <translation id="6955446738988643816">Inspecter le pop-up</translation>
 <translation id="6955535239952325894">Ce paramètre est désactivé sur les navigateurs gérés</translation>
 <translation id="6957044667612803194">Cette clé de sécurité n'accepte pas les codes d'identification personnels</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{lien}one{# lien}other{# liens}}</translation>
 <translation id="6960507406838246615">Mise à jour de Linux requise</translation>
 <translation id="696103774840402661">L'ensemble des fichiers et des données locales de tous les utilisateurs sur cet appareil (<ph name="DEVICE_TYPE" />) ont été supprimés définitivement.</translation>
 <translation id="6964390816189577014">Héros</translation>
@@ -6065,6 +6089,7 @@
 <translation id="797394244396603170">Sélectionnez l'appareil avec lequel vous souhaitez partager des fichiers</translation>
 <translation id="7973962044839454485">Échec de l'authentification PPP en raison de la saisie d'un nom d'utilisateur ou d'un mot de passe erronés.</translation>
 <translation id="7974566588408714340">Réessayer avec "<ph name="EXTENSIONNAME" />"</translation>
+<translation id="7974713334845253259">Couleur par défaut</translation>
 <translation id="7974936243149753750">Surbalayage</translation>
 <translation id="7975504106303186033">Vous devez enregistrer cet appareil Chrome Education dans un compte G Suite for Education. Pour créer un compte, rendez-vous sur g.co/workspace/edusignup.</translation>
 <translation id="7978412674231730200">Clé privée</translation>
@@ -6231,6 +6256,7 @@
 <translation id="8157704005178149728">Configuration de la supervision…</translation>
 <translation id="8158117992543756526">Cet appareil cessera de recevoir automatiquement des mises à jour logicielles et de sécurité en <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">Erreur de définition du paramètre de confiance du certificat</translation>
+<translation id="8160775796528709999">Activez l'option "Sous-titres instantanés" dans les paramètres afin de bénéficier de sous-titres pour vos contenus vidéo et audio</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">Mode Lecteur pour les pages Web</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Déplacer l'onglet vers une nouvelle fenêtre}one{Déplacer l'onglet vers une nouvelle fenêtre}other{Déplacer les onglets vers une nouvelle fenêtre}}</translation>
@@ -6355,6 +6381,7 @@
 <translation id="8300011035382349091">Modifier le favori de cet onglet</translation>
 <translation id="8300374739238450534">Bleu nuit</translation>
 <translation id="8300849813060516376">Échec de l'opération OTASP</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{Adresse}one{# adresse}other{# adresses}}</translation>
 <translation id="8304383784961451596">Vous n'êtes pas autorisé à utiliser cet appareil. Veuillez contacter l'administrateur pour obtenir l'autorisation de connexion ou connectez-vous à l'aide d'un compte Google supervisé par Family Link.</translation>
 <translation id="8308179586020895837">Demander si l'accès à votre caméra est requis sur <ph name="HOST" /></translation>
 <translation id="830868413617744215">Bêta</translation>
@@ -6653,6 +6680,7 @@
 <translation id="867085395664725367">Erreur temporaire de serveur.</translation>
 <translation id="8673026256276578048">Rechercher sur le Web...</translation>
 <translation id="8673383193459449849">Problème avec le serveur.</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{Vidéo}one{# vidéo}other{# vidéos}}</translation>
 <translation id="8676374126336081632">Effacer la saisie</translation>
 <translation id="8676770494376880701">Chargeur de faible puissance connecté</translation>
 <translation id="8677212948402625567">Tout réduire...</translation>
@@ -7079,6 +7107,7 @@
 <translation id="9128870381267983090">Connectez-vous au réseau</translation>
 <translation id="9130015405878219958">Le mode indiqué est incorrect.</translation>
 <translation id="9131487537093447019">Envoyer des messages à des appareils Bluetooth, et en recevoir de ces derniers</translation>
+<translation id="9134119143784876218">Génère automatiquement des sous-titres pour les contenus audio et vidéo en anglais (option actuellement disponible dans le navigateur Chrome uniquement). Le flux audio et les sous-titres ne sont jamais exportés hors de votre appareil.</translation>
 <translation id="9137013805542155359">Afficher l'original</translation>
 <translation id="9137157311132182254">Moteur de recherche préféré</translation>
 <translation id="9137248913990643158">Veuillez démarrer Chrome et vous connecter à votre compte avant d'utiliser cette application</translation>
@@ -7126,6 +7155,7 @@
 <translation id="9179524979050048593">Nom d'utilisateur sur l'écran de connexion</translation>
 <translation id="9180281769944411366">Cette opération peut prendre quelques minutes. Démarrage du conteneur Linux…</translation>
 <translation id="9180380851667544951">Le site peut partager votre écran</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{Application}one{# application}other{# applications}}</translation>
 <translation id="9186963452600581158">Se connecter avec le compte Google d'un enfant</translation>
 <translation id="9188732951356337132">Envoyer des données d'utilisation et de diagnostic. À l'heure actuelle, cet appareil envoie automatiquement à Google des données relatives aux diagnostics et à l'utilisation de l'appareil et des applications. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires, tels que les développeurs Android. Si vous activez le paramètre relatif à l'activité supplémentaire sur le Web et les applications pour votre enfant, ces données peuvent être enregistrées dans son compte Google. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">Utiliser votre téléphone Android comme clé de sécurité</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 5f4bea95..a81c921f 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">Traballadores de servizos</translation>
 <translation id="1235458158152011030">Redes coñecidas</translation>
 <translation id="123578888592755962">Disco cheo</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{texto}other{# textos}}</translation>
 <translation id="1239594683407221485">Explora o contido do dispositivo na aplicación Ficheiros.</translation>
 <translation id="124116460088058876">Máis idiomas</translation>
 <translation id="1241753985463165747">Ler e cambiar todos os teus datos no sitio web actual cando se invoque</translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">Buscar contrasinais</translation>
 <translation id="1487335504823219454">Activado: configuración personalizada</translation>
 <translation id="1489664337021920575">Seleccionar outra opción</translation>
+<translation id="1490491397986065675">O teu administrador di o seguinte: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1492417797159476138">Xa gardaches este nome de usuario para este sitio</translation>
 <translation id="1493892686965953381">Agardando por <ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1495677929897281669">Volver á pestana</translation>
@@ -810,6 +812,7 @@
 <translation id="1879000426787380528">Iniciar sesión como</translation>
 <translation id="1880905663253319515">Queres eliminar o certificado "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="1881445033931614352">Deseño do teclado</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{Elemento}other{# elementos}}</translation>
 <translation id="1884013283844450420">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, conectar</translation>
 <translation id="1884340228047885921">Visibilidade actual configurada como Algúns contactos</translation>
 <translation id="1884705339276589024">Cambiar o tamaño do disco de Linux</translation>
@@ -988,6 +991,7 @@
 <translation id="2099686503067610784">Queres eliminar o certificado do servidor "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="2100273922101894616">Inicio de sesión automático</translation>
 <translation id="2101225219012730419">Versión:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{Número de teléfono}other{# números de teléfono}}</translation>
 <translation id="211144231511833662">Borrar tipos</translation>
 <translation id="2111670510994270194">Nova pestana á dereita</translation>
 <translation id="21133533946938348">Ancorar pestana</translation>
@@ -1040,6 +1044,7 @@
 <translation id="2154710561487035718">Copiar o URL</translation>
 <translation id="2155772377859296191">A resolución parece de <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Traballador de servizos: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Executar comprobación de seguranza de novo</translation>
 <translation id="2157474325782140681">Para gozar de funcións adicionais, utiliza unha base de Dell deseñada para funcionar con este Chromebook.</translation>
 <translation id="215753907730220065">Saír do modo de pantalla completa</translation>
 <translation id="2157875535253991059">Esta páxina está agora en pantalla completa.</translation>
@@ -1284,6 +1289,7 @@
 <translation id="2435457462613246316">Mostrar contrasinal</translation>
 <translation id="2435579801172349831">Abre todos os URL (<ph name="URL_COUNT" />) nunha ventá do modo de incógnito</translation>
 <translation id="2436186046335138073">Queres que se use <ph name="HANDLER_HOSTNAME" /> para abrir todas as ligazóns de <ph name="PROTOCOL" />?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{aplicación}other{# aplicacións}}</translation>
 <translation id="2440604414813129000">Ver f&amp;onte</translation>
 <translation id="244231003699905658">O enderezo non é válido. Compróbao e téntao de novo.</translation>
 <translation id="2442916515643169563">Sombra do texto</translation>
@@ -1432,6 +1438,7 @@
 <translation id="2604255671529671813">Produciuse un erro de conexión de rede</translation>
 <translation id="2606246518223360146">Ligar datos</translation>
 <translation id="2606454609872547359">Non, continuar sen ChromeVox</translation>
+<translation id="2606568927909309675">Crea subtítulos automaticamente para o contido de audio e de vídeo que estea en inglés. O audio e os subtítulos nunca saen do dispositivo.</translation>
 <translation id="2607101320794533334">Información de clave pública de entidade</translation>
 <translation id="2609896558069604090">Crear atallos...</translation>
 <translation id="2609980095400624569">Non se puido establecer a conexión</translation>
@@ -1696,6 +1703,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">Abrir ligazón con...</translation>
 <translation id="2889925978073739256">Continuar bloqueando plugins de illamento de procesos</translation>
+<translation id="2891922230654533301">Queres utilizar o teu dispositivo para iniciar sesión en <ph name="APP_NAME" />?</translation>
 <translation id="2893168226686371498">Navegador predeterminado</translation>
 <translation id="2894757982205307093">Nova pestana no grupo</translation>
 <translation id="289644616180464099">A tarxeta SIM está bloqueada</translation>
@@ -1981,6 +1989,7 @@
 <translation id="3225319735946384299">Sinatura de código</translation>
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3233271424239923319">Crea unha copia de seguranza das aplicacións e os ficheiros de Linux</translation>
+<translation id="3238192140106069382">Conectando e verificando</translation>
 <translation id="3239373508713281971">Quitouse o límite de tempo de <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Selecciona o directorio raíz da extensión que vaias comprimir. Para actualizar unha extensión, selecciona tamén o ficheiro da clave privada que queres reutilizar.</translation>
 <translation id="3244294424315804309">Continuar silenciando o son</translation>
@@ -2007,6 +2016,7 @@
 <translation id="3269069891205016797">Cando peches sesión quitarase do dispositivo a túa información.</translation>
 <translation id="3269093882174072735">Cargar imaxe</translation>
 <translation id="3269612321104318480">Verde azulado claro e branco</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{Ficheiro}other{# ficheiros}}</translation>
 <translation id="326999365752735949">Descargando ficheiro diff</translation>
 <translation id="3270965368676314374">Ler, cambiar e eliminar fotos, música e outros ficheiros multimedia do teu ordenador</translation>
 <translation id="327147043223061465">Ver todas as cookies e os datos do sitio</translation>
@@ -2302,6 +2312,7 @@
 <translation id="3600792891314830896">Silencia sitios que reproducen son</translation>
 <translation id="360180734785106144">Ofrecerche funcións novas a medida que estean dispoñibles</translation>
 <translation id="3602290021589620013">Previsualizar</translation>
+<translation id="3602870520245633055">Imprimir e escanear</translation>
 <translation id="3603622770190368340">Obter certificado de rede</translation>
 <translation id="3604193429970465812">Contas secundarias</translation>
 <translation id="3604713164406837697">Cambiar fondo de pantalla</translation>
@@ -2317,6 +2328,7 @@
 <translation id="3615579745882581859">Estase analizando <ph name="FILE_NAME" />.</translation>
 <translation id="3616741288025931835">&amp;Borrar datos de navegación...</translation>
 <translation id="3617891479562106823">Os fondos non están dispoñibles. Téntao de novo máis tarde.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{vídeo}other{# vídeos}}</translation>
 <translation id="3619115746895587757">Capuchino</translation>
 <translation id="362333465072914957">Agardando a que a entidade de certificación emita un certificado</translation>
 <translation id="3624567683873126087">Desbloquea o dispositivo e inicia sesión na Conta de Google</translation>
@@ -2574,7 +2586,6 @@
 <translation id="3882165008614329320">Vídeo existente da cámara ou do ficheiro</translation>
 <translation id="3884152383786131369">No contido web que estean dispoñibles varios idiomas usarase o primeiro admitido da lista. Estas preferencias sincronízanse coa configuración do teu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Máis información<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Enviouse a túa solicitude para acceder a este sitio a <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Desactivado. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Tomar notas con <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activar Sincronización de Chrome para usar a función Sincronización wifi</translation>
 <translation id="3892414795099177503">Engadir OpenVPN/L2TP...</translation>
@@ -2658,7 +2669,6 @@
 <translation id="3958088479270651626">Importar marcadores e configuración</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desactivar rede móbil</translation>
-<translation id="3965730875470565266">Activado, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Con</translation>
 <translation id="3965965397408324205">Saír de <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Seleccionar outro cartafol...</translation>
@@ -2728,6 +2738,7 @@
 <translation id="4047726037116394521">Ir á páxina de inicio</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# contacto non está dispoñible. Para utilizar con el a función Compartir por Nearby, engade aos teus contactos os enderezos de correo electrónico asociados á súa Conta de Google.}other{# contactos non están dispoñibles. Para utilizar con eles a función Compartir por Nearby, engádelles os enderezos de correo electrónico asociados ás súas Contas de Google.}}</translation>
 <translation id="4050225813016893843">Método de autenticación</translation>
+<translation id="4050534976465737778">Asegúrate de que os dous dispositivos estean desbloqueados, preto un do outro e co Bluetooth activado. Se vas compartir contido cun Chromebook que non se atope entre os teus contactos, asegúrate de que teña activada a opción de visibilidade de Nearby (abre a área de estado e, a continuación, activa Visibilidade). <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">Minúsculo</translation>
 <translation id="4054070260844648638">Visible para todos</translation>
 <translation id="4056908315660577142">Chegaches ao límite que definiu teu pai ou túa nai para a aplicación de Chrome <ph name="APP_NAME" />. Mañá poderás utilizala durante <ph name="TIME_LIMIT" />.</translation>
@@ -2962,6 +2973,7 @@
 <translation id="4364327530094270451">Melón</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartindo unha ventá.</translation>
 <translation id="4364830672918311045">Mostrar notificacións</translation>
+<translation id="4366138410738374926">Comezou a impresión</translation>
 <translation id="437004882363131692">Recibe consellos sobre <ph name="DEVICE_TYPE" />, mantente ao tanto das novidades e das ofertas, e envíanos os teus comentarios. Podes cancelar a subscrición en calquera momento.</translation>
 <translation id="4370425812909262207">Ocultáronse os carros. Mostraranse de novo cando fagas algún cambio.</translation>
 <translation id="4370975561335139969">O correo electrónico e o contrasinal inseridos non coinciden</translation>
@@ -3149,6 +3161,7 @@
 <translation id="4568025708905928793">Solicítase unha chave de seguranza</translation>
 <translation id="4568213207643490790">Non se admiten contas de Google neste dispositivo.</translation>
 <translation id="4569747168316751899">Cando está inactivo</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{enderezo}other{# enderezos}}</translation>
 <translation id="4570387585180509432">Enderezos, número de teléfono etc.</translation>
 <translation id="4572659312570518089">Autenticación cancelada durante a conexión con "<ph name="DEVICE_NAME" />".</translation>
 <translation id="4572779512957829735">Introduce o PIN da túa chave de seguranza</translation>
@@ -3208,6 +3221,7 @@
 <translation id="4635444580397524003">Restaurouse correctamente a copia de seguranza de Linux.</translation>
 <translation id="4636930964841734540">Información</translation>
 <translation id="4637083375689622795">Máis accións, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{Texto}other{# textos}}</translation>
 <translation id="4638930039313743000">Activar depuración de ADB</translation>
 <translation id="4641539339823703554">Chrome non puido establecer a hora do sistema. Comproba a hora a continuación e corríxea se é necesario.</translation>
 <translation id="4642769377300286600">Instalando perfil para móbiles, rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3223,10 +3237,12 @@
 <translation id="4651484272688821107">Non se puido cargar o compoñente en liña cos recursos do modo de demostración.</translation>
 <translation id="4652935475563630866">Para cambiar a configuración da cámara, é necesario reiniciar Parallels Desktop. Reiníciao para continuar.</translation>
 <translation id="4653405415038586100">Produciuse un erro ao configurar Linux</translation>
+<translation id="4654236001025007561">Comparte ficheiros con Chromebooks e con dispositivos Android que estean preto de ti</translation>
 <translation id="4657914796247705218">Velocidade de TrackPoint</translation>
 <translation id="465878909996028221">Só se poden redirixir a outro navegador os URL que utilicen os protocolos http, https e de ficheiro.</translation>
 <translation id="4659077111144409915">Conta principal</translation>
 <translation id="4659126640776004816">Cando inicies sesión na túa Conta de Google, activarase esta función.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{Imaxe}other{# imaxes}}</translation>
 <translation id="4660476621274971848">A versión esperada era "<ph name="EXPECTED_VERSION" />", pero a obtida foi "<ph name="NEW_ID" />"</translation>
 <translation id="4660540330091848931">Cambiando tamaño</translation>
 <translation id="4661407454952063730">Os datos das aplicacións poden incluír calquera tipo de información que gardase unha aplicación (baseándose na configuración do programador), incluídos os contactos, as mensaxes e as fotos.</translation>
@@ -3327,6 +3343,7 @@
 <translation id="4794810983896241342"><ph name="BEGIN_LINK" />O teu administrador<ph name="END_LINK" /> xestiona as actualizacións</translation>
 <translation id="479536056609751218">Páxina web, só HTML</translation>
 <translation id="4798236378408895261">Achegar <ph name="BEGIN_LINK" />rexistros de Bluetooth<ph name="END_LINK" /> (uso interno de Google)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{elemento}other{# elementos}}</translation>
 <translation id="4801448226354548035">Ocultar contas</translation>
 <translation id="4801512016965057443">Permitir a itinerancia de datos móbiles</translation>
 <translation id="4804818685124855865">Desconectar</translation>
@@ -3757,6 +3774,7 @@
 <translation id="531118851858162334">Estás vendo este elemento debido á túa actividade anterior nos servizos de Google. Podes ver os teus datos, eliminalos e cambiar a configuración en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="5311304534597152726">Iniciando sesión como</translation>
 <translation id="5311565231560644461">Non permitir que os sitios utilicen os teus datos e dispositivos de realidade virtual</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{imaxe}other{# imaxes}}</translation>
 <translation id="5314381603623123224">As Condicións de servizo de Chrome cambiarán o 31 de marzo</translation>
 <translation id="5315738755890845852">Hai unha chave de máis: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">Gardar</translation>
@@ -3822,6 +3840,7 @@
 <translation id="5390677308841849479">Vermello escuro e laranxa</translation>
 <translation id="5390743329570580756">Enviar para</translation>
 <translation id="5392192690789334093">Con permiso para enviar notificacións</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{Ligazón}other{# ligazóns}}</translation>
 <translation id="5397794290049113714">Ti</translation>
 <translation id="5398497406011404839">Marcadores ocultos</translation>
 <translation id="5398572795982417028">A referencia da páxina supera o límite, que é <ph name="MAXIMUM_PAGE" /></translation>
@@ -4198,7 +4217,6 @@
 <translation id="5832813618714645810">Perfís</translation>
 <translation id="583281660410589416">Descoñecido</translation>
 <translation id="5833397272224757657">Para personalizar a experiencia, utiliza o contido dos sitios que visitas e mais as interaccións e a actividade do navegador</translation>
-<translation id="5833551944249825624">Todas as persoas que estean preto poderán ver o teu Chromebook durante 5 min</translation>
 <translation id="5833726373896279253">O único que pode modificar esta configuración é o propietario:</translation>
 <translation id="5834581999798853053">Quedan uns <ph name="TIME" /> minutos</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: estase gravando contido coa cámara ou co micrófono</translation>
@@ -4349,6 +4367,7 @@
 <translation id="6011074160056912900">Rede Ethernet</translation>
 <translation id="6011193465932186973">Impresión dixital</translation>
 <translation id="6011449291337289699">Borrar datos do sitio</translation>
+<translation id="6013027779243312217">Obtén subtítulos para o contido de audio e de vídeo</translation>
 <translation id="6015796118275082299">Ano</translation>
 <translation id="6016178549409952427">Ir ao contido extra: <ph name="CURRENT_ELEMENT" /> de <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="6016551720757758985">Confirmar o powerwash para volver á versión anterior</translation>
@@ -4858,6 +4877,7 @@
 <translation id="6605847144724004692">Ningún usuario valorou a extensión.</translation>
 <translation id="6607831829715835317">Máis &amp;ferramentas</translation>
 <translation id="6607890859198268021">O enderezo <ph name="USER_EMAIL" /> xa está xestionado por <ph name="DOMAIN" />. Para usar os controis parentais cunha Conta de Google diferente, pecha sesión ao rematar a configuración. A continuación, vai á páxina de inicio de sesión e selecciona Engadir persoa.</translation>
+<translation id="6609478180749378879">Os datos de inicio de sesión almacenaranse neste dispositivo cando saias do modo de incógnito. Poderás iniciar sesión de novo neste sitio web desde o teu dispositivo máis tarde.</translation>
 <translation id="6611972847767394631">Atopa aquí as túas pestanas</translation>
 <translation id="6612358246767739896">Contido protexido</translation>
 <translation id="6615455863669487791">Mostrar</translation>
@@ -4876,6 +4896,7 @@
 <translation id="6628328486509726751">Data da carga: <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">Buscando dispositivos USB…</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> solicita acceso permanente a un certificado para autenticarse no teu nome.</translation>
+<translation id="6635362468090274700">Ninguén pode compartir contido contigo ata que o teu dispositivo sexa visible.<ph name="BR" /><ph name="BR" />Se queres facelo visible de forma temporal, abre a área de estado e, a continuación, activa Visibilidade.</translation>
 <translation id="6635944431854494329">O propietario pode controlar esta función en Configuración &gt; Avanzada &gt; Enviar de forma automática datos de uso e diagnóstico a Google.</translation>
 <translation id="6635956300022133031">Selecciona e personaliza as voces da síntese de voz</translation>
 <translation id="6636588250634969791">Para continuar, introduce unha SIM</translation>
@@ -5027,6 +5048,7 @@
 <translation id="6811332638216701903">Nome do host de DHCP</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> non se pode executar como raíz.</translation>
 <translation id="6812841287760418429">Manter os cambios</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{ficheiro}other{# ficheiros}}</translation>
 <translation id="6817174620439930047">Preguntar cando un sitio queira utilizar mensaxes exclusivas do sistema para acceder aos dispositivos MIDI (recomendado)</translation>
 <translation id="6818198425579322765">Idioma da páxina que se quere traducir</translation>
 <translation id="6818802132960437751">Protección antivirus integrada</translation>
@@ -5047,6 +5069,7 @@
 <translation id="6835762382653651563">Conéctate a Internet para actualizar o teu dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="6838034009068684089">Preguntar cando un sitio queira abrir e colocar ventás nas túas pantallas (recomendado)</translation>
 <translation id="6838694093138907871">O código non é válido. Téntao de novo.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{número de teléfono}other{# números de teléfono}}</translation>
 <translation id="6839225236531462745">Erro de eliminación do certificado</translation>
 <translation id="6839916869147598086">O inicio de sesión cambiou</translation>
 <translation id="6840155290835956714">Preguntar antes de enviar</translation>
@@ -5152,6 +5175,7 @@
 <translation id="6955446738988643816">Inspeccionar ventá emerxente</translation>
 <translation id="6955535239952325894">Esta opción de configuración está desactivada nos navegadores xestionados</translation>
 <translation id="6957044667612803194">Esta chave de seguranza non admite códigos PIN</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{ligazón}other{# ligazóns}}</translation>
 <translation id="6960507406838246615">É necesario actualizar Linux</translation>
 <translation id="696103774840402661">Elimináronse permanentemente todos os ficheiros e os datos locais de todos os usuarios deste dispositivo (<ph name="DEVICE_TYPE" />).</translation>
 <translation id="6964390816189577014">Heroe</translation>
@@ -6061,6 +6085,7 @@
 <translation id="797394244396603170">Selecciona o dispositivo co que queiras compartir ficheiros</translation>
 <translation id="7973962044839454485">Non se puido efectuar a autenticación de PPP debido a un nome de usuario ou un contrasinal incorrecto</translation>
 <translation id="7974566588408714340">Tentar de novo usando <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974713334845253259">Cor predeterminada</translation>
 <translation id="7974936243149753750">Sobrevarrido</translation>
 <translation id="7975504106303186033">Debes inscribir este dispositivo de Chrome Education nunha conta de centro educativo. Se queres rexistrarte para conseguir unha nova conta, visita g.co/workspace/edusignup.</translation>
 <translation id="7978412674231730200">Clave privada</translation>
@@ -6226,6 +6251,7 @@
 <translation id="8157704005178149728">Configurando supervisión</translation>
 <translation id="8158117992543756526">Este dispositivo deixou de recibir actualizacións automáticas de software e de seguranza en <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">Erro ao establecer o certificado de confianza</translation>
+<translation id="8160775796528709999">Obtén subtítulos para o contido de audio e de vídeo activando a función Subtítulos instantáneos en Configuración</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> (<ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" />)</translation>
 <translation id="8161293209665121583">Modo de lector para páxinas web</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Mover pestana a unha ventá nova}other{Mover pestanas a unha ventá nova}}</translation>
@@ -6350,6 +6376,7 @@
 <translation id="8300011035382349091">Editar o marcador desta pestana</translation>
 <translation id="8300374739238450534">Azul noite</translation>
 <translation id="8300849813060516376">Erro de OTASP</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{Enderezo}other{# enderezos}}</translation>
 <translation id="8304383784961451596">Non tes autorización para usar este dispositivo. Se queres obter permiso para iniciar sesión, ponte en contacto co administrador. Tamén podes iniciar sesión cunha conta de Google supervisada por Family Link.</translation>
 <translation id="8308179586020895837">Preguntar se <ph name="HOST" /> quere acceder á túa cámara</translation>
 <translation id="830868413617744215">Beta</translation>
@@ -6648,6 +6675,7 @@
 <translation id="867085395664725367">Produciuse un erro temporal no servidor.</translation>
 <translation id="8673026256276578048">Buscar na web...</translation>
 <translation id="8673383193459449849">Problema do servidor</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{Vídeo}other{# vídeos}}</translation>
 <translation id="8676374126336081632">Borrar texto</translation>
 <translation id="8676770494376880701">Cargador de baixa potencia conectado</translation>
 <translation id="8677212948402625567">Contraer todo...</translation>
@@ -7073,6 +7101,7 @@
 <translation id="9128870381267983090">Conectarse á rede</translation>
 <translation id="9130015405878219958">Modo non válido introducido.</translation>
 <translation id="9131487537093447019">Enviar mensaxes a dispositivos Bluetooth e recibilos.</translation>
+<translation id="9134119143784876218">Crea subtítulos automaticamente para o contido de audio e de vídeo que estea en inglés (nestes momentos, esta función só está dispoñible no navegador Chrome). O audio e os subtítulos nunca saen do dispositivo.</translation>
 <translation id="9137013805542155359">Mostrar orixinal</translation>
 <translation id="9137157311132182254">Motor de busca preferido</translation>
 <translation id="9137248913990643158">Empeza e inicia sesión en Chrome antes de utilizar esta aplicación.</translation>
@@ -7120,6 +7149,7 @@
 <translation id="9179524979050048593">Nome de usuario da pantalla de inicio de sesión</translation>
 <translation id="9180281769944411366">Este proceso pode tardar uns minutos. Iniciando o contedor de Linux.</translation>
 <translation id="9180380851667544951">O sitio pode compartir a túa pantalla</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{Aplicación}other{# aplicacións}}</translation>
 <translation id="9186963452600581158">Iniciar sesión cunha Conta de Google infantil</translation>
 <translation id="9188732951356337132">Enviar datos de uso e de diagnóstico. Este dispositivo envía automaticamente datos de diagnóstico e de uso do dispositivo e das aplicacións a Google. Esta información non se utilizará para identificar o teu fillo, senón co obxectivo de aumentar a estabilidade do sistema e das aplicacións, e de realizar outras melloras. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android. Se está activada a opción de configuración Actividade web e das aplicacións adicional para o teu fillo, estes datos pódense gardar na súa Conta de Google <ph name="BEGIN_LINK2" />Máis información<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">Utilizar o teléfono Android como chave de seguranza</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 57e4f7c..1557d69 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2582,7 +2582,6 @@
 <translation id="3882165008614329320">કૅમેરા અથવા ફાઇલમાંથી અસ્તિત્વમાં છે તે વીડિયો</translation>
 <translation id="3884152383786131369">એકથી વધારે ભાષાઓમાં ઉપલબ્ધ વેબ કન્ટેન્ટ આ સૂચિમાંની પહેલી સપોર્ટેડ ભાષાનો ઉપયોગ કરશે. આ પસંદગીઓને તમારા બ્રાઉઝર સેટિંગ સાથે સિંક કરવામાં આવે છે. <ph name="BEGIN_LINK_LEARN_MORE" />વધુ જાણો<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">આ સાઇટને ઍક્સેસ કરવાની તમારી વિનંતી <ph name="NAME" /> ને મોકલવામાં આવી છે</translation>
-<translation id="3888364689515978571">બંધ. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> વડે નોંધ લેવી</translation>
 <translation id="3890064827463908288">વાઇ-ફાઇ સિંકનો ઉપયોગ કરવા માટે 'Chrome સિંક' ચાલુ કરો</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ઉમેરો...</translation>
@@ -2666,7 +2665,6 @@
 <translation id="3958088479270651626">બુકમાર્ક્સ અને સેટિંગ્સ આયાત કરો</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">સેલ્યુલર નેટવર્ક બંધ કરો</translation>
-<translation id="3965730875470565266">ચાલુ, <ph name="MINUTES" /> મિનિટ</translation>
 <translation id="3965811923470826124">આ સાથે</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />માંથી બહાર નીકળો</translation>
 <translation id="3966072572894326936">બીજું ફોલ્ડર પસંદ કરો...</translation>
@@ -4217,7 +4215,6 @@
 <translation id="5832813618714645810">પ્રોફાઇલ</translation>
 <translation id="583281660410589416">અજ્ઞાત</translation>
 <translation id="5833397272224757657">વૈયક્તિકરણ માટે, તમે મુલાકાત લીધેલી સાઇટના કન્ટેન્ટનો, ઉપરાંત બ્રાઉઝરની પ્રવૃત્તિ અને ક્રિયાપ્રતિક્રિયાઓનો ઉપયોગ કરે છે</translation>
-<translation id="5833551944249825624">તમારી Chromebook તમારી નજીક આવેલી દરેક વ્યક્તિને 5 મિનિટ દેખાશે</translation>
 <translation id="5833726373896279253">આ સેટિંગ્સ ફક્ત માલિક દ્વારા જ સંશોધિત થઈ શકે છે:</translation>
 <translation id="5834581999798853053">લગભગ <ph name="TIME" /> મિનિટ બાકી</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - કૅમેરા અથવા માઇક્રોફોન રેકોર્ડિંગ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index b3b6263..5b6b9f06 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">URL की कॉपी बनाएं</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> जैसा लगता है</translation>
 <translation id="2156294658807918600">सर्विस वर्कर: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">फिर से सुरक्षा जांच करें</translation>
 <translation id="2157474325782140681">ज़्यादा सुविधाएं पाने के लिए, ऐसा Dell डॉकिंग स्टेशन इस्तेमाल करें जिसे इस Chromebook के साथ काम करने के लिए बनाया गया हो.</translation>
 <translation id="215753907730220065">फ़ुल स्क्रीन से बाहर निकलें</translation>
 <translation id="2157875535253991059">यह पेज अब फ़ुल स्‍क्रीन है.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">कोड हस्ताक्षर</translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
 <translation id="3233271424239923319">Linux ऐप्लिकेशन और फ़ाइलों का बैकअप लें</translation>
+<translation id="3238192140106069382">डिवाइस कनेक्ट कर रहा है और पुष्टि हो रही है</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> के लिए समयसीमा हटा दी गई है</translation>
 <translation id="3241680850019875542">पैक के एक्सटेंशन की 'रूट निर्देशिका' को चुनें. किसी एक्स्टेंशन को अपडेट करने के लिए, फिर से इस्तेमाल करने के लिए 'निजी कुंजी फ़ाइल' को भी चुनें.</translation>
 <translation id="3244294424315804309">आवाज़ बंद रखें</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">कैमरा या फ़ाइल से मौजूदा वीडियो</translation>
 <translation id="3884152383786131369">कई भाषाओं में उपलब्ध वेब कॉन्टेंट, इस सूची में दी गई पहली भाषा में दिखाया जाएगा. इन प्राथमिकताओं को आपके ब्राउज़र की सेटिंग के साथ सिंक किया जाता है. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">यह साइट एक्सेस करने का आपका अनुरोध <ph name="NAME" /> को भेज दिया गया है</translation>
-<translation id="3888364689515978571">बंद है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> से नोट लेना</translation>
 <translation id="3890064827463908288">'वाई-फ़ाई सिंक' इस्तेमाल करने के लिए 'Chrome सिंक' चालू करें</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP जोड़ें...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">बुकमार्क और सेटिंग आयात करें</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">सेल्युलर नेटवर्क बंद करें</translation>
-<translation id="3965730875470565266">चालू है, <ph name="MINUTES" /> मिनट तक रहेगा</translation>
 <translation id="3965811923470826124">इसके साथ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> से बाहर निकलें</translation>
 <translation id="3966072572894326936">कोई अन्य फ़ोल्डर चुनें</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">प्रोफ़ाइलें</translation>
 <translation id="583281660410589416">अज्ञात</translation>
 <translation id="5833397272224757657">आप जिन साइटों पर जाते हैं उनकी सामग्री के साथ ही ब्राउज़र गतिविधि और इंटरैक्शन का इस्तेमाल आपके मनमुताबिक बनाने के लिए करता है</translation>
-<translation id="5833551944249825624">आपका Chromebook आस-पास मौजूद हर व्यक्ति को पांच मिनट तक दिखेगा</translation>
 <translation id="5833726373896279253">ये सेटिंग केवल मालिक द्वारा ही संशोधित की जा सकती हैं:</translation>
 <translation id="5834581999798853053">करीब <ph name="TIME" /> मिनट शेष हैं</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - कैमरा या माइक्रोफ़ोन रिकॉर्डिंग</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 89057e1..f2f8384 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Kopiraj URL</translation>
 <translation id="2155772377859296191">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Uslužni alat: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Ponovo pokreni sigurnosnu provjeru</translation>
 <translation id="2157474325782140681">Za biste dobili dodatne značajke, upotrijebite priključnu stanicu Dell namijenjenu za ovaj Chromebook.</translation>
 <translation id="215753907730220065">Napusti potpuni ekran</translation>
 <translation id="2157875535253991059">Ova je stranica sada na cijelom zaslonu.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Kodno potpisivanje</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Sigurnosno kopiranje Linux aplikacija i datoteka</translation>
+<translation id="3238192140106069382">Povezivanje i potvrđivanje</translation>
 <translation id="3239373508713281971">Uklonjeno je vremensko ograničenje za aplikaciju <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Odaberite korijenski direktorij proširenja za pakiranje. Da biste ažurirali proširenje, odaberite i datoteku osobnog ključa za ponovnu upotrebu.</translation>
 <translation id="3244294424315804309">Neka zvuk ostane isključen</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Postojeći videozapis s kamere ili iz datoteke</translation>
 <translation id="3884152383786131369">Web-sadržaj dostupan na više jezika koristit će prvi podržani jezik s ovog popisa. Te se postavke sinkroniziraju s postavkama vašeg preglednika. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Zahtjev za pristup toj web-lokaciji poslan je korisniku <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Isključeno. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Izrada bilježaka pomoću aplikacije <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Uključite Chrome sinkronizaciju kako biste upotrebljavali Wi-Fi sinkronizaciju</translation>
 <translation id="3892414795099177503">Dodaj OpenVPN/L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Uvoz oznaka i postavki</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Isključivanje mobilne mreže</translation>
-<translation id="3965730875470565266">Uključeno, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Pomoću</translation>
 <translation id="3965965397408324205">Zatvori profil <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Odabir druge mape...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Nepoznato</translation>
 <translation id="5833397272224757657">Upotrebljava sadržaj na web-lokacijama koje posjećujete te aktivnosti i interakcije u pregledniku radi prilagodbe</translation>
-<translation id="5833551944249825624">Svi u blizini vidjet će vaš Chromebook na pet minuta</translation>
 <translation id="5833726373896279253">Ove postavke može izmjenjivati samo vlasnik:</translation>
 <translation id="5834581999798853053">Preostalo je oko <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kamera ili mikrofon snimaju</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 56a54b03..57050d4 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">URL másolása</translation>
 <translation id="2155772377859296191">Megjelenés: <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Szolgáltatás-munkavégző: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Biztonsági ellenőrzés újbóli futtatása</translation>
 <translation id="2157474325782140681">Ha további funkciókhoz is hozzá szeretne férni, használjon olyan Dell dokkolóállomást, amelyet ehhez a Chromebookhoz terveztek.</translation>
 <translation id="215753907730220065">Kilépés a teljes képernyős módból</translation>
 <translation id="2157875535253991059">Ez az oldal most teljes képernyős nézetben van.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Kódaláírás</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Biztonsági másolat készítése a Linux-alkalmazásokról és -fájlokról</translation>
+<translation id="3238192140106069382">Csatlakozás és ellenőrzés</translation>
 <translation id="3239373508713281971">Időkorlát eltávolítva a következő alkalmazásnál: <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Válassza ki a bővítmény gyökérkönyvtárát. A bővítmény frissítéséhez meg kell adni az ismét használandó privátkulcs-fájlt is.</translation>
 <translation id="3244294424315804309">Némítás megtartása</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Meglévő videó a fényképezőgépről vagy fájlból</translation>
 <translation id="3884152383786131369">A több nyelven hozzáférhető webes tartalmak az ezen a listán szereplő első támogatott nyelvet használják majd. Ezeket a preferenciákat a rendszer szinkronizálja a böngésző beállításaival. <ph name="BEGIN_LINK_LEARN_MORE" />További információ<ph name="END_LINK_LEARN_MORE" />.</translation>
 <translation id="3886446263141354045">Webhely-hozzáférési kérelme elküldve a következő személynek: <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Kikapcsolva. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation>
 <translation id="3888550877729210209">Jegyzetek készítése a(z) <ph name="LOCK_SCREEN_APP_NAME" /> alkalmazással</translation>
 <translation id="3890064827463908288">A Wi-Fi-szinkronizálás használatához kapcsolja be a Chrome-szinkronizálás funkciót</translation>
 <translation id="3892414795099177503">OpenVPN/L2TP hozzáadása…</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">Könyvjelzők és beállítások importálása</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobilhálózat kikapcsolása</translation>
-<translation id="3965730875470565266">Bekapcsolva, <ph name="MINUTES" /> percig</translation>
 <translation id="3965811923470826124">Biztonságos névfeloldó</translation>
 <translation id="3965965397408324205">Kilépés a(z) <ph name="PROFILE_NAME" /> profilból</translation>
 <translation id="3966072572894326936">Válasszon másik mappát...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Profilok</translation>
 <translation id="583281660410589416">Ismeretlen</translation>
 <translation id="5833397272224757657">A felkeresett webhelyeken található tartalmak, a böngészőtevékenysége, valamint a böngészőben végzett interakciók felhasználása személyre szabáshoz</translation>
-<translation id="5833551944249825624">A Chromebook a közelben lévő összes eszköz számára látható lesz öt percig</translation>
 <translation id="5833726373896279253">Ezeket a beállításokat csak a tulajdonos módosíthatja:</translation>
 <translation id="5834581999798853053">Körülbelül <ph name="TIME" /> perc van hátra</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – A kamera vagy a mikrofon felvételt készít</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index b553299..24ce524c 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Պատճենել URL-ը</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" />x<ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker՝ <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Նորից անցնել անվտանգություն ստուգում</translation>
 <translation id="2157474325782140681">Լրացուցիչ գործառույթների համար օգտագործեք այս Chromebook-ի համար նախատեսված Dell դոկ-կայան:</translation>
 <translation id="215753907730220065">Ելնել լիաէկրան ռեժիմից</translation>
 <translation id="2157875535253991059">Այս էջն այժմ լիաէկրան ռեժիմում է:</translation>
@@ -1991,6 +1992,7 @@
 <translation id="3225319735946384299">Կոդի ստորագրում</translation>
 <translation id="3227137524299004712">Խոսափող</translation>
 <translation id="3233271424239923319">Լինուքսի հավելվածների ու ֆայլերի պահուստավորում</translation>
+<translation id="3238192140106069382">Միացում և ստուգում</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> հավելվածի համար ժամանակի սահմանաչափը հեռացվել է</translation>
 <translation id="3241680850019875542">Ընտրեք արմատային գրացուցակը՝ փաթեթավորվող ընդլայնման համար: Ընդլայնումը թարմացնելու համար ընտրեք նաև մասնավոր բանալու ֆայլը:</translation>
 <translation id="3244294424315804309">Անջատել ձայնը</translation>
@@ -2587,7 +2589,6 @@
 <translation id="3882165008614329320">Տեսանյութ տեսախցիկից կամ ֆայլից</translation>
 <translation id="3884152383786131369">Տարբեր լեզուներով հասանելի վեբ բովանդակությունը կօգտագործի ցանկում նշված աջակցվող առաջին լեզուն։ Այս պարամետրերը համաժամացվում են ձեր դիտարկիչի կարգավորումների հետ։ <ph name="BEGIN_LINK_LEARN_MORE" />Իմանալ ավելին<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Այս կայք մուտք գործելու ձեր հարցումն ուղարկվել է <ph name="NAME" />-ին</translation>
-<translation id="3888364689515978571">Անջատված է։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Կատարեք նշումներ <ph name="LOCK_SCREEN_APP_NAME" />-ի միջոցով</translation>
 <translation id="3890064827463908288">Միացրեք Chrome Sync-ը՝ Wi-Fi համաժամացումն օգտագործելու համար։</translation>
 <translation id="3892414795099177503">Ավելացնել OpenVPN կամ L2TP...</translation>
@@ -2671,7 +2672,6 @@
 <translation id="3958088479270651626">Էջանիշների և կարգավորումների ներմուծում</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Անջատել բջջային ցանցը</translation>
-<translation id="3965730875470565266">Միացված է <ph name="MINUTES" /> րոպեով</translation>
 <translation id="3965811923470826124">Ինչով՝</translation>
 <translation id="3965965397408324205">Դուրս գալ պրոֆիլից (<ph name="PROFILE_NAME" />)</translation>
 <translation id="3966072572894326936">Ընտրել մեկ այլ պանակ...</translation>
@@ -4223,7 +4223,6 @@
 <translation id="5832813618714645810">Պրոֆիլներ</translation>
 <translation id="583281660410589416">Անհայտ</translation>
 <translation id="5833397272224757657">Անհատականացման նպատակով օգտագործում է ձեր այցելած կայքերի բովանդակությունը, այցելությունների պատմությունը և դիտարկիչով կատարած գործողությունները</translation>
-<translation id="5833551944249825624">Ձեր Chromebook-ը 5 րոպե տեսանելի կլինի մոտակայքում գտնվող բոլոր օգտատերերին։</translation>
 <translation id="5833726373896279253">Այս կարգավորումները կարող են միայն փոփոխվել սեփականատիրոջ կողմից՝</translation>
 <translation id="5834581999798853053">Մնացել է մոտ <ph name="TIME" /> րոպե</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Տեսախցիկը կամ խոսափողը ներկայումս ձայնագրում է</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 26ff023..7a662a0 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Salin URL</translation>
 <translation id="2155772377859296191">Sepertinya <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Pekerja Layanan: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Jalankan pemeriksaan keselamatan lagi</translation>
 <translation id="2157474325782140681">Untuk mendapatkan fitur tambahan, gunakan stasiun dok Dell yang didesain untuk berfungsi dengan Chromebook ini.</translation>
 <translation id="215753907730220065">Keluar dari Tampilan Layar Penuh</translation>
 <translation id="2157875535253991059">Sekarang halaman ini dalam mode layar penuh.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Penandaan Kode</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Cadangkan file dan aplikasi Linux</translation>
+<translation id="3238192140106069382">Menghubungkan dan memverifikasi</translation>
 <translation id="3239373508713281971">Batas waktu <ph name="APP_NAME" /> dihapus</translation>
 <translation id="3241680850019875542">Pilih direktori akar ekstensi untuk dipaket. Untuk memperbarui ekstensi, pilih juga file kunci pribadi untuk dipakai ulang.</translation>
 <translation id="3244294424315804309">Lanjutkan mematikan suara</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Video yang sudah ada dari kamera atau file</translation>
 <translation id="3884152383786131369">Konten web yang tersedia dalam beberapa bahasa akan menggunakan bahasa pertama yang didukung dari daftar ini. Preferensi ini akan disinkronkan dengan setelan browser Anda. <ph name="BEGIN_LINK_LEARN_MORE" />Pelajari lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Permintaan Anda untuk mengakses situs ini telah dikirim ke <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Nonaktif. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Mencatat dengan <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Aktifkan Sinkronisasi Chrome untuk menggunakan Wi-Fi Sync</translation>
 <translation id="3892414795099177503">Tambahkan OpenVPN / L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Impor bookmark dan setelan</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Matikan jaringan Seluler</translation>
-<translation id="3965730875470565266">Aktif, <ph name="MINUTES" /> mnt</translation>
 <translation id="3965811923470826124">Dengan</translation>
 <translation id="3965965397408324205">Tutup <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Pilih folder lain...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profil</translation>
 <translation id="583281660410589416">Tidak dikenal</translation>
 <translation id="5833397272224757657">Menggunakan konten di situs yang Anda buka serta aktivitas browser dan interaksi untuk personalisasi</translation>
-<translation id="5833551944249825624">Chromebook Anda akan terlihat oleh semua orang di sekitar selama 5 menit</translation>
 <translation id="5833726373896279253">Setelan ini hanya boleh diubah-ubah oleh pemiliknya:</translation>
 <translation id="5834581999798853053">Sekitar <ph name="TIME" /> menit lagi</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Perekaman kamera atau mikrofon</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 001cbac4..3061fe8 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">Afrita vefslóð</translation>
 <translation id="2155772377859296191">Virðist vera <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Þjónustuaðili: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Keyra öryggisathugun aftur</translation>
 <translation id="2157474325782140681">Til að fá viðbótareiginleika skaltu nota Dell-dokku sem er hönnuð fyrir þessa Chromebook tölvu.</translation>
 <translation id="215753907730220065">Hætta að nota allan skjáinn</translation>
 <translation id="2157875535253991059">Þessi síða birtist núna á öllum skjánum.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Kóðaundirritun</translation>
 <translation id="3227137524299004712">Hljóðnemi</translation>
 <translation id="3233271424239923319">Afrita Linux-forrit og -skrár</translation>
+<translation id="3238192140106069382">Tengist og staðfestir</translation>
 <translation id="3239373508713281971">Tímamörk fjarlægð fyrir <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Veldu rótarmöppu viðbótarinnar sem á að pakka. Til að uppfæra viðbót skaltu líka velja einkalykilsskrána til að endurnýta.</translation>
 <translation id="3244294424315804309">Hafa áfram slökkt á hljóði</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Fyrirliggjandi myndskeið úr myndavél eða skrá</translation>
 <translation id="3884152383786131369">Vefefni sem er í boði á mörgum tungumálum mun nota fyrsta studda tungumálið á listanum. Þessar kjörstillingar eru samstilltar vafrastillingunum. <ph name="BEGIN_LINK_LEARN_MORE" />Frekari upplýsingar<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Beiðni þín um aðgang að þessu vefsvæði hefur verið send til <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Slökkt. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Glósur með <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Kveiktu á Chrome samstillingu til að nota Wi-Fi-samstillingu</translation>
 <translation id="3892414795099177503">Bæta við OpenVPN / L2TP...</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Flytja inn bókamerki og stillingar</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Slökkva á farsímakerfi</translation>
-<translation id="3965730875470565266">Kveikt, <ph name="MINUTES" /> mín.</translation>
 <translation id="3965811923470826124">Með</translation>
 <translation id="3965965397408324205">Hætta sem <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Veldu aðra möppu...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Prófílar</translation>
 <translation id="583281660410589416">Óþekkt</translation>
 <translation id="5833397272224757657">Notar efni af vefsvæðum sem þú heimsækir auk virkni og samskipta í vafra til að bjóða upp á sérsniðna notkun</translation>
-<translation id="5833551944249825624">Allir sem eru nálægt Chromebook tölvunni munu geta séð hana í 5 mínútur</translation>
 <translation id="5833726373896279253">Einungis eigandinn getur breytt þessum stillingum:</translation>
 <translation id="5834581999798853053">Um <ph name="TIME" /> mínútur eftir</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – upptaka á myndavél eða hljóðnema</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 3fd7571..1079463 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Copia URL</translation>
 <translation id="2155772377859296191">Risoluzione di <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Ripeti il controllo di sicurezza</translation>
 <translation id="2157474325782140681">Per avere a disposizione funzionalità aggiuntive, usa una dock station Dell progettata per supportare questo Chromebook.</translation>
 <translation id="215753907730220065">Esci da schermo intero</translation>
 <translation id="2157875535253991059">Questa pagina ora è a schermo intero.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">Firma codice</translation>
 <translation id="3227137524299004712">Microfono</translation>
 <translation id="3233271424239923319">Backup app e file Linux</translation>
+<translation id="3238192140106069382">Connessione e verifica in corso…</translation>
 <translation id="3239373508713281971">Limite di tempo per l'app <ph name="APP_NAME" /> rimosso</translation>
 <translation id="3241680850019875542">Seleziona la directory principale dell'estensione di cui creare il pacchetto. Per aggiornare un'estensione, seleziona anche il file delle chiave privata da riutilizzare.</translation>
 <translation id="3244294424315804309">Continua a tenere l'audio disattivato</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">Video esistente da fotocamera o file</translation>
 <translation id="3884152383786131369">I contenuti web che sono disponibili in più lingue utilizzeranno la prima lingua supportata nell'elenco. Queste preferenze sono sincronizzate con le impostazioni del browser. <ph name="BEGIN_LINK_LEARN_MORE" />Ulteriori informazioni<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">La tua richiesta di accesso al sito è stata inviata a <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Off. <ph name="LINK_BEGIN" />Scopri di più<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Creazione di appunti con <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Per utilizzare Sync Wi-Fi, attiva Sincronizzazione Chrome</translation>
 <translation id="3892414795099177503">Aggiungi L2TP/OpenVPN</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">Importa preferiti e impostazioni</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Disattiva rete mobile</translation>
-<translation id="3965730875470565266">On, <ph name="MINUTES" /> minuti</translation>
 <translation id="3965811923470826124">Con</translation>
 <translation id="3965965397408324205">Esci da <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Scegli un'altra cartella...</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Sconosciuto</translation>
 <translation id="5833397272224757657">Utilizza i contenuti dei siti visitati oltre ad attività e interazioni relative al browser per la personalizzazione</translation>
-<translation id="5833551944249825624">Il tuo Chromebook sarà visibile a chiunque è nelle vicinanze per 5 minuti</translation>
 <translation id="5833726373896279253">Queste impostazioni possono essere modificate solo dal proprietario:</translation>
 <translation id="5834581999798853053">Circa <ph name="TIME" /> minuti rimanenti</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Registrazione tramite fotocamera o microfono in corso</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index c7aabbdb..db93ee0 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1044,6 +1044,7 @@
 <translation id="2154710561487035718">העתקת כתובת אתר</translation>
 <translation id="2155772377859296191">‏נראה כמו <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">‏קובץ שירות (service worker): <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">הפעלה חוזרת של הטיימר לדיווח אוטומטי</translation>
 <translation id="2157474325782140681">‏כדי להשתמש בתכונות נוספות, יש להשתמש בתחנת עגינה של Dell שתוכננה לפעול עם ה-Chromebook הזה.</translation>
 <translation id="215753907730220065">יציאה ממסך מלא</translation>
 <translation id="2157875535253991059">דף זה הוא במסך מלא כעת.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">חתימת קוד</translation>
 <translation id="3227137524299004712">מיקרופון</translation>
 <translation id="3233271424239923319">‏גיבוי קבצים ואפליקציות של Linux</translation>
+<translation id="3238192140106069382">מתבצעים התחברות ואימות</translation>
 <translation id="3239373508713281971">מגבלת הזמן של <ph name="APP_NAME" /> הוסרה</translation>
 <translation id="3241680850019875542">יש לבחור את ספריית הבסיס של התוסף שיש לארוז. כדי לעדכן תוסף, יש לבחור גם את קובץ המפתח הפרטי שבו ניתן להשתמש שוב.</translation>
 <translation id="3244294424315804309">המשך השתקת הצלילים</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">סרטון קיים ממצלמה או מקובץ</translation>
 <translation id="3884152383786131369">תוכן אינטרנט שזמין במספר שפות יוצג בשפה הנתמכת הראשונה ברשימה הזו. ההעדפות האלה מסונכרנות עם הגדרות הדפדפן. <ph name="BEGIN_LINK_LEARN_MORE" />מידע נוסף<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">הבקשה שלך לגשת לאתר הזה נשלחה אל <ph name="NAME" /></translation>
-<translation id="3888364689515978571">כבוי. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">כתיבת הערות בעזרת <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">‏צריך להפעיל סנכרון Chrome כדי להשתמש בסנכרון Wi-Fi</translation>
 <translation id="3892414795099177503">‏הוספת OpenVPN / L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">ייבוא סימניות והגדרות</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">כיבוי הרשת הסלולרית</translation>
-<translation id="3965730875470565266">פועל, <ph name="MINUTES" /> דק'</translation>
 <translation id="3965811923470826124">באמצעות</translation>
 <translation id="3965965397408324205">יציאה מ-<ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">בחירת תיקייה אחרת...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">פרופילים</translation>
 <translation id="583281660410589416">לא ידוע</translation>
 <translation id="5833397272224757657">התוכן מאתרים שנכנסת אליהם, פעילות הדפדפן והאינטראקציות שלך ישמשו לצורך התאמה אישית</translation>
-<translation id="5833551944249825624">‏ה-Chromebook שלך יהיה גלוי לכל מי שיימצא בקרבת מקום למשך 5 דקות</translation>
 <translation id="5833726373896279253">רק הבעלים יכול לשנות הגדרות אלה:</translation>
 <translation id="5834581999798853053">נותרו בערך <ph name="TIME" /> דקות</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - הקלטה במצלמה או במיקרופון</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 2904bc55..6fb4368 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2587,7 +2587,6 @@
 <translation id="3882165008614329320">カメラやファイルに保存されている動画</translation>
 <translation id="3884152383786131369">複数の言語に対応しているウェブ コンテンツでは、次のリストの最初にある対応言語が使用されます。これらの設定はブラウザの設定と同期されています。<ph name="BEGIN_LINK_LEARN_MORE" />詳細<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">このサイトへのアクセス リクエストを <ph name="NAME" /> さんに送信しました</translation>
-<translation id="3888364689515978571">オフ(<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" />)</translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> でメモをとる</translation>
 <translation id="3890064827463908288">Wi-Fi 同期を使用するには Chrome 同期をオンにしてください</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP を追加...</translation>
@@ -2671,7 +2670,6 @@
 <translation id="3958088479270651626">ブックマークと設定のインポート</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">モバイル ネットワークをオフにする</translation>
-<translation id="3965730875470565266">オン(<ph name="MINUTES" /> 分)</translation>
 <translation id="3965811923470826124">次を使用</translation>
 <translation id="3965965397408324205">「<ph name="PROFILE_NAME" />」を終了</translation>
 <translation id="3966072572894326936">別のフォルダを選択...</translation>
@@ -4221,7 +4219,6 @@
 <translation id="5832813618714645810">プロファイル</translation>
 <translation id="583281660410589416">不明</translation>
 <translation id="5833397272224757657">ユーザーがアクセスしたサイトのコンテンツと、ブラウザのアクティビティおよび操作をカスタマイズに使用します</translation>
-<translation id="5833551944249825624">あなたの Chromebook は近くにいる誰でも 5 分間検出できるようになります</translation>
 <translation id="5833726373896279253">これらの設定を変更できるのは所有者だけです:</translation>
 <translation id="5834581999798853053">あと約 <ph name="TIME" /> 分</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - カメラまたはマイクで記録中です</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 72729bab..62091e01 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">დააკოპიე URL</translation>
 <translation id="2155772377859296191">როგორც ჩანს, გარჩევადობა არის <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">სერვისის დამმუშავებელი: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">უსაფრთხოების შემოწმების ხელახლა გაშვება</translation>
 <translation id="2157474325782140681">დამატებითი ფუნქციებით სარგებლობისთვის გამოიყენეთ Dell-ის სამაგრი, რომელიც შექმნილია ამ Chromebook-თან მუშაობისთვის.</translation>
 <translation id="215753907730220065">სრულეკრანიანი რეჟიმიდან გამოსვლა</translation>
 <translation id="2157875535253991059">ეს გვერდი ახლა მთელ ეკრანზეა.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">კოდის ხელმოწერა</translation>
 <translation id="3227137524299004712">მიკროფონი</translation>
 <translation id="3233271424239923319">Linux აპებისა და ფაილების სარეზერვო კოპირება</translation>
+<translation id="3238192140106069382">დაკავშირება და დადასტურება</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" />-ისთვის დაყენებული დროის ლიმიტი გაუქმდა</translation>
 <translation id="3241680850019875542">აირჩიეთ გაფართოების ძირითადი დირექტორია შეფუთვისთვის. გაფართოების განსაახლებლად, აირჩიეთ პირადი გასაღების ფაილი ხელახლა გამოსაყენებლად.</translation>
 <translation id="3244294424315804309">ხმის დადუმების გაგრძელება</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">არსებული ვიდეო კამერიდან ან ფაილიდან</translation>
 <translation id="3884152383786131369">რამდენიმე ენაზე ხელმისაწვდომი ვებკონტენტი ამ სიიდან პირველ მხარდაჭერილ ენას გამოიყენებს. ეს პარამეტრები სინქრონიზდება თქვენი ბრაუზერის პარამეტრებთან. <ph name="BEGIN_LINK_LEARN_MORE" />შეიტყვეთ მეტი<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ამ საიტზე წვდომის მოთხოვნა გაეგზავნა <ph name="NAME" />-ს</translation>
-<translation id="3888364689515978571">გამორთული. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">ჩანიშვნა <ph name="LOCK_SCREEN_APP_NAME" />-ის მეშვეობით</translation>
 <translation id="3890064827463908288">Wi-Fi სინქრონიზაციის გამოსაყენებლად ჩართეთ Chrome სინქრონიზაცია</translation>
 <translation id="3892414795099177503">OpenVPN/L2TP-ის დამატება…</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">სანიშნეების და პარამეტრების იმპორტი</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ფიჭური ქსელის გამორთვა</translation>
-<translation id="3965730875470565266">ჩართული, <ph name="MINUTES" /> წთ</translation>
 <translation id="3965811923470826124">მეთოდი:</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />-იდან გასვლა</translation>
 <translation id="3966072572894326936">აირჩიეთ სხვა საქაღალდე...</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">პროფილები</translation>
 <translation id="583281660410589416">უცნობი</translation>
 <translation id="5833397272224757657">პერსონალიზებისთვის იყენებს თქვენ მიერ მონახულებული ვებსაიტების კონტენტს, ასევე ბრაუზერის აქტივობასა და მასთან ინტერაქციას</translation>
-<translation id="5833551944249825624">თქვენი Chromebook 5 წუთის განმავლობაში იქნება ხილული ყველა გარშემომყოფისთვის</translation>
 <translation id="5833726373896279253">ამ პარამეტრების შეცვლა მხოლოდ მფლობელს შეუძლია.</translation>
 <translation id="5834581999798853053">დარჩენილია დაახლოებით <ph name="TIME" /> წუთი</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> — მიმდინარეობს ჩაწერა კამერიდან ან მიკროფონიდან</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index f2dc780..c41c3ec 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">URL сілтемесін көшіру</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> болып көрінеді</translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Қауіпсіздік шарасын қайта қолдану</translation>
 <translation id="2157474325782140681">Қосымша функцияларды пайдалану үшін осы Chromebook құрылғысымен жұмыс істеуге арналған қондыру станциясын пайдаланыңыз.</translation>
 <translation id="215753907730220065">Толық экраннан шығу</translation>
 <translation id="2157875535253991059">Бұл бет енді толық экранға ауысты.</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Кодты белгілеу</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Linux қолданбалары мен файлдарының сақтық көшірмесін жасау</translation>
+<translation id="3238192140106069382">Қосылуда және расталуда</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> үшін уақыт шектеуі алынды.</translation>
 <translation id="3241680850019875542">Бумаға салу үшін кеңейтімнің түпкі каталогін таңдаңыз. Кеңейтімді жаңарту үшін қайта пайдалану мақсатында жеке кілтті таңдаңыз.</translation>
 <translation id="3244294424315804309">Дыбысын қоспау</translation>
@@ -2582,7 +2584,6 @@
 <translation id="3882165008614329320">Камерадан немесе файлдан алынған бейне</translation>
 <translation id="3884152383786131369">Бірнеше тілдегі веб-мазмұн осы тізімдегі бірінші тілді пайдаланады. Бұл параметрлер браузер параметрлерімен синхрондалады. <ph name="BEGIN_LINK_LEARN_MORE" />Толығырақ<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Бұл сайтқа кіру сұрауыңыз <ph name="NAME" /> деген контактіге жіберілді</translation>
-<translation id="3888364689515978571">Өшірулі. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> қолданбасымен жазбалар жазу</translation>
 <translation id="3890064827463908288">Wi-Fi деректерін синхрондау үшін Chrome Sync функциясын қосыңыз.</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP енгізу…</translation>
@@ -2666,7 +2667,6 @@
 <translation id="3958088479270651626">Бетбелгілер мен параметрлерді импорттау</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Ұялы байланыс желісін өшіру</translation>
-<translation id="3965730875470565266">Қосулы, <ph name="MINUTES" /> минутқа</translation>
 <translation id="3965811923470826124">Бекіту құралы</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> профилінен шығу</translation>
 <translation id="3966072572894326936">Басқа қалтаны таңдау…</translation>
@@ -4215,7 +4215,6 @@
 <translation id="5832813618714645810">Профильдер</translation>
 <translation id="583281660410589416">Белгісіз</translation>
 <translation id="5833397272224757657">Жекелендіру үшін кірген сайттардағы мазмұнды, браузерде жасалған әрекеттерді және өзара әрекеттестікті пайдаланады</translation>
-<translation id="5833551944249825624">Chromebook құрылғыңыз 5 минут бойы маңайдағы барлық құрылғыға көрінеді.</translation>
 <translation id="5833726373896279253">Бұл параметрлерді тек иеленуші ғана өзгерте алады:</translation>
 <translation id="5834581999798853053">Шамамен <ph name="TIME" /> минут қалды</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – камерадан не микрофоннан жазу</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index b97c85e..eab9c228 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">ចម្លង URL</translation>
 <translation id="2155772377859296191">មើល​ទៅដូចជា <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">បុគ្គលិក​បម្រើសេវាកម្ម៖ <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">ដំណើរការ​ការពិនិត្យសុវត្ថិភាព​ម្ដងទៀត</translation>
 <translation id="2157474325782140681">ដើម្បីទទួលបាន​មុខងារបន្ថែម សូមប្រើឧបករណ៍ភ្ជាប់ Dell​ ដែលរចនាឡើងសម្រាប់ដំណើរការជាមួយ​ Chromebook នេះ។</translation>
 <translation id="215753907730220065">ចាកចេញពីអេក្រង់ពេញ</translation>
 <translation id="2157875535253991059">ឥឡូវនេះទំព័រនេះពេញអេក្រង់ហើយ។</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">ការចុះហត្ថលេខាជាលេខកូដ</translation>
 <translation id="3227137524299004712">ម៉ៃក្រូហ្វូន</translation>
 <translation id="3233271424239923319">បម្រុងទុក​កម្មវិធី និង​ឯកសារ Linux</translation>
+<translation id="3238192140106069382">កំពុងភ្ជាប់ និងកំពុងផ្ទៀងផ្ទាត់</translation>
 <translation id="3239373508713281971">បានលុប​រយៈពេល​កំណត់​សម្រាប់ <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">ជ្រើសរើសថតឯកសារគោលនៃកម្មវិធីបន្ថែមដើម្បីវិចខ្ចប់។ ដើម្បីធ្វើបច្ចុប្បន្នភាព ផ្នែកបន្ថែម ជ្រើសរើសថតឯកសារប៊ូតុងឯកជន ដើម្បីប្រើម្តងទៀតផងដែរ។</translation>
 <translation id="3244294424315804309">បន្ត​បិទ​សំឡេង</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">វីដេអូដែល​មានស្រាប់​ពីកាមេរ៉ា ឬឯកសារ</translation>
 <translation id="3884152383786131369">ខ្លឹមសារបណ្ដាញ​ដែលមានជាច្រើន​ភាសា នឹងប្រើភាសាដែល​អាចប្រើបាន​ទីមួយនៅក្នុង​បញ្ជីនេះ។ ចំណូលចិត្តទាំងនេះ​ត្រូវបានធ្វើសមកាលកម្ម​ជាមួយការកំណត់​កម្មវិធីរុករកតាមអ៊ីនធឺណិត​របស់អ្នក។ <ph name="BEGIN_LINK_LEARN_MORE" />ស្វែងយល់បន្ថែម<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">សំណើរបស់អ្នកដើម្បីចូលទៅកាន់ទំព័រនេះត្រូវបានផ្ញើទៅ <ph name="NAME" /></translation>
-<translation id="3888364689515978571">បិទ។ សូម<ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">កត់ត្រាចំណាំដោយប្រើ <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">បើក Chrome សមកាលកម្ម ដើម្បីប្រើ Wi-Fi Sync</translation>
 <translation id="3892414795099177503">បន្ថែម OpenVPN / L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">នាំចូលចំណាំ និងការកំណត់</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">បិទ​បណ្ដាញ​ចល័ត</translation>
-<translation id="3965730875470565266">បើក <ph name="MINUTES" /> នាទី</translation>
 <translation id="3965811923470826124">ជាមួយ</translation>
 <translation id="3965965397408324205">ចាក​ចេញពី <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">ជ្រើសរើសថតឯកសារដ៏ទៃទៀត...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">កម្រងព័ត៌មាន</translation>
 <translation id="583281660410589416">មិនស្គាល់</translation>
 <translation id="5833397272224757657">ប្រើប្រាស់​ខ្លឹមសារ​នៅលើគេហ​ទំព័រដែល​អ្នកចូលមើល ព្រមទាំងអន្តរកម្ម និង​សកម្មភាពនៅ​លើ​កម្មវិធី​​រុករកតាមអ៊ីនធឺណិត ​ដើម្បី​ផ្ដល់​ការកំណត់ដែល​ស្រប​នឹង​អ្នក</translation>
-<translation id="5833551944249825624">អ្នកគ្រប់គ្នាដែលនៅជិត​នឹងអាចមើលឃើញ Chromebook របស់អ្នក​រយៈពេល 5 នាទី</translation>
 <translation id="5833726373896279253">ការកំណត់នេះអាចត្រូវបានកែសម្រួលដោយអ្នកគ្រប់គ្រង។</translation>
 <translation id="5834581999798853053">នៅសល់ <ph name="TIME" /> ប្រហែលនាទីទៀត</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - កាមេរ៉ា ឬ​មីក្រូហ្វូន​កំពុង​ថត​</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index f9372bb..015400b 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2586,7 +2586,6 @@
 <translation id="3882165008614329320">ಕ್ಯಾಮರಾ ಅಥವಾ ಫೈಲ್‌ನಲ್ಲಿರುವ ಪ್ರಸ್ತುತ ವೀಡಿಯೊ</translation>
 <translation id="3884152383786131369">ಹಲವು ಭಾಷೆಗಳಲ್ಲಿ ಲಭ್ಯವಿರುವ ವೆಬ್ ವಿಷಯವನ್ನು ಈ ಪಟ್ಟಿಯಿಂದ ಮೊದಲು ಬೆಂಬಲಿಸುವ ಭಾಷೆಯನ್ನು ಬಳಸುತ್ತವೆ. ಈ ಆದ್ಯತೆಗಳನ್ನು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ಈ ಸೈಟ್‌ಗೆ ಪ್ರವೇಶಿಸುವ ನಿಮ್ಮ ವಿನಂತಿಯನ್ನು <ph name="NAME" /> ಅವರಿಗೆ ಕಳುಹಿಸಲಾಗಿದೆ</translation>
-<translation id="3888364689515978571">ಆಫ್. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ಮೂಲಕ ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ</translation>
 <translation id="3890064827463908288">Wi-Fi ಸಿಂಕ್ ಅನ್ನು ಬಳಸಲು Chrome ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ಸೇರಿಸಿ...</translation>
@@ -2670,7 +2669,6 @@
 <translation id="3958088479270651626">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿ</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ಸೆಲ್ಯುಲರ್ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಆಫ್ ಮಾಡಿ</translation>
-<translation id="3965730875470565266">ಆನ್, <ph name="MINUTES" /> ನಿಮಿ</translation>
 <translation id="3965811923470826124">ಮೂಲಕ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> ಪ್ರೊಫೈಲ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="3966072572894326936">ಮತ್ತೊಂದು ಫೋಲ್ಡರ್ ಆಯ್ಕೆ ಮಾಡಿ...</translation>
@@ -4222,7 +4220,6 @@
 <translation id="5832813618714645810">ಪ್ರೊಫೈಲ್‌ಗಳು</translation>
 <translation id="583281660410589416">ಅಪರಿಚಿತ</translation>
 <translation id="5833397272224757657">ನೀವು ಭೇಟಿ ನೀಡುವ ವೆಬ್‌ಸೈಟ್‌ಗಳ ವಿಷಯ, ಜೊತೆಗೆ ಬ್ರೌಸರ್ ಚಟುವಟಿಕೆ ಹಾಗೂ ಸಂವಹನಗಳನ್ನು ವೈಯಕ್ತೀಕರಣಕ್ಕಾಗಿ ಬಳಸುತ್ತದೆ</translation>
-<translation id="5833551944249825624">5 ನಿಮಿಷಗಳಿಗಾಗಿ ಸಮೀಪದಲ್ಲಿರುವ ಪ್ರತಿಯೊಬ್ಬರಿಗೂ ನಿಮ್ಮ Chromebook ಗೋಚರಿಸುತ್ತದೆ</translation>
 <translation id="5833726373896279253">ಈ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮಾಲೀಕರಿಂದ ಮಾತ್ರ ನವೀಕರಿಸಬಹುದಾಗಿದೆ:</translation>
 <translation id="5834581999798853053">ಸುಮಾರು <ph name="TIME" /> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ಕ್ಯಾಮರಾ ಅಥವಾ ಮೈಕ್ರೊಫೋನ್ ರೆಕಾರ್ಡಿಂಗ್</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 6c55a2e..d75e1c8 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">URL 복사</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" />x<ph name="HEIGHT" />처럼 보입니다.</translation>
 <translation id="2156294658807918600">서비스 워커: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">안전 확인 다시 실행</translation>
 <translation id="2157474325782140681">추가 기능을 사용하려면 이 Chromebook과 호환되는 Dell 도킹 스테이션을 사용하세요.</translation>
 <translation id="215753907730220065">전체화면 종료</translation>
 <translation id="2157875535253991059">페이지가 현재 전체화면으로 전환되었습니다.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">코드 서명</translation>
 <translation id="3227137524299004712">마이크</translation>
 <translation id="3233271424239923319">Linux 앱 및 파일 백업</translation>
+<translation id="3238192140106069382">연결 및 확인 중</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" />의 시간제한이 삭제되었습니다.</translation>
 <translation id="3241680850019875542">압축할 확장 프로그램의 루트 디렉터리를 선택합니다. 확장 프로그램을 업데이트하려면 다시 사용할 비공개 키 파일도 선택합니다.</translation>
 <translation id="3244294424315804309">계속 음소거</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">카메라 또는 파일의 기존 동영상</translation>
 <translation id="3884152383786131369">여러 언어를 지원하는 웹 콘텐츠는 목록의 첫 번째 지원 언어를 사용합니다. 이러한 환경설정은 브라우저 설정과 동기화됩니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">사용자의 사이트 액세스 요청이 <ph name="NAME" />님에게 전송되었습니다.</translation>
-<translation id="3888364689515978571">사용 안함. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />(으)로 메모 작성</translation>
 <translation id="3890064827463908288">Wi-Fi 동기화를 사용하려면 Chrome 동기화 사용 설정</translation>
 <translation id="3892414795099177503">OpenVPN/L2TP... 추가</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">북마크 및 설정 가져오기</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">셀룰러 네트워크 끄기</translation>
-<translation id="3965730875470565266">사용, <ph name="MINUTES" />분</translation>
 <translation id="3965811923470826124">다음 항목 사용</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> 나가기</translation>
 <translation id="3966072572894326936">다른 폴더 선택...</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">프로필</translation>
 <translation id="583281660410589416">알 수 없음</translation>
 <translation id="5833397272224757657">방문한 사이트의 콘텐츠와 브라우저 활동 및 상호작용이 맞춤설정에 사용됩니다.</translation>
-<translation id="5833551944249825624">내 Chromebook이 주변에 있는 모든 사용자에게 5분 동안 공개됩니다.</translation>
 <translation id="5833726373896279253">이 설정은 소유자만 수정할 수 있습니다.</translation>
 <translation id="5834581999798853053">약 <ph name="TIME" />분 남음</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - 카메라 또는 마이크 녹음</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 9538e68..81b1652 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">URL көчүрүү</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> сыяктуу көрүнөт</translation>
 <translation id="2156294658807918600">Кызмат иштеткичи: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Коопсуздукту кайра текшерүү</translation>
 <translation id="2157474325782140681">Кошумча функцияларын колдонуу үчүн, ушул Chromebook менен иштөөгө арналган Dell док станциясын колдонуңуз.</translation>
 <translation id="215753907730220065">Толук экран режиминен чыгуу</translation>
 <translation id="2157875535253991059">Бул бет эми толук экранда.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Код колтамгасы</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Linux колдонмолору менен файлдарынын камдык көчүрмөлөрүн сактоо</translation>
+<translation id="3238192140106069382">Туташууга жана текшерүүгө аракет кылып жатат</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> үчүн коюлган чектөө өчүрүлдү</translation>
 <translation id="3241680850019875542">Кеңейтүүнүн топтомдоло турган өзөктүк каталогун, ошондой эле кеңейтүүнү жаңыртуу үчүн, кайра колдонула турган жеке ачкыч файлын тандаңыз.</translation>
 <translation id="3244294424315804309">Үнүн басууну улантуу</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Камерадагы же файлдагы учурдагы видео</translation>
 <translation id="3884152383786131369">Бир нече тилде жеткиликтүү болгон вебдеги мазмун бул тизмедеги колдоого алынган биринчи тилди колдонот. Бул параметрлер серепчиңиздин жөндөөлөрү менен шайкештирилет. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Бул сайтка кирүү өтүнүчүңүз <ph name="NAME" /> деген колдонуучуга жөнөтүлдү</translation>
-<translation id="3888364689515978571">Өчүк. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> колдонмосунда жазылууда</translation>
 <translation id="3890064827463908288">Wi-Fi Sync функциясын колдонуу үчүн Chrome шайкештирүүнү күйгүзүңүз</translation>
 <translation id="3892414795099177503">АчыкVPN/L2TP'ди кошуу…</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Кыстармалар менен жөндөөлөрдү импорттоо</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Мобилдик тармакты өчүрүү</translation>
-<translation id="3965730875470565266">Күйүк, <ph name="MINUTES" /> мүн.</translation>
 <translation id="3965811923470826124">Төмөнкү менен:</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> профилинен чыгуу</translation>
 <translation id="3966072572894326936">Башка куржун тандаңыз…</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">Профилдер</translation>
 <translation id="583281660410589416">Белгисиз</translation>
 <translation id="5833397272224757657">Жекелештирүү үчүн сиз баш баккан сайттардагы мазмунду жана башка серептөө таржымалын пайдаланат</translation>
-<translation id="5833551944249825624">Chromebook түзмөгүңүз жакын жердеги адамдарга 5 мүнөткө чейин көрүнөт</translation>
 <translation id="5833726373896279253">Бул жөндөөлөрдү ээси гана өзгөртө алат:</translation>
 <translation id="5834581999798853053">Болжол менен <ph name="TIME" /> мүнөт калды</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Видео же аудио жаздырылууда</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 35fb820..abf23de4 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -2585,7 +2585,6 @@
 <translation id="3882165008614329320">ວິດີໂອທີ່ມີຢູ່ແລ້ວຈາກກ້ອງຖ່າຍຮູບ ຫຼື ໄຟລ໌</translation>
 <translation id="3884152383786131369">ເນື້ອຫາເວັບທີ່ມີໃຫ້ເປັນຫຼາຍພາສາຈະໃຊ້ພາສາທີ່ຮອງຮັບທຳອິດຈາກລາຍຊື່ນີ້. ການຕັ້ງຄ່າເຫຼົ່ານີ້ຊິ້ງຂໍ້ມູນກັບການຕັ້ງຄ່າໂປຣແກຣມທ່ອງເວັບຂອງທ່ານ. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ຄຳຂໍເຂົ້າຫາເວັບໄຊນີ້ຂອງທ່ານໄດ້ຖືກສົ່ງຫາ <ph name="NAME" /> ແລ້ວ</translation>
-<translation id="3888364689515978571">ປິດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">ກຳລັງຈົດບັນທຶກດ້ວຍ <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">ເປີດ Chrome Sync ເພື່ອໃຊ້ Wi-Fi Sync</translation>
 <translation id="3892414795099177503">ເພີ່ມ OpenVPN / L2TP...</translation>
@@ -2669,7 +2668,6 @@
 <translation id="3958088479270651626">ນໍາເອົາບຸກມາກສ໌ ແລະການຕັ້ງຄ່າເຂົ້າມາ</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ປິດເຄືອຂ່າຍມືຖື</translation>
-<translation id="3965730875470565266">ເປີດ, <ph name="MINUTES" /> ນາທີ</translation>
 <translation id="3965811923470826124">ກັບ</translation>
 <translation id="3965965397408324205">ອອກຈາກ <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">ເລືອກ​ໂຟລເດີ​ອື່ນ...</translation>
@@ -4218,7 +4216,6 @@
 <translation id="5832813618714645810">ໂປຣໄຟລ໌</translation>
 <translation id="583281660410589416">ບໍ່​ຮູ້ຈັກ</translation>
 <translation id="5833397272224757657">ໃຊ້ເນື້ອຫາໃນເວັບໄຊທີ່ທ່ານເຂົ້າເບິ່ງ ແລະ ການເຄື່ອນໄຫວ ແລະ ການໂຕ້ຕອບໃນໂປຣແກຣມທ່ອງເວັບສຳລັບການປັບແຕ່ງເປັນແບບສ່ວນຕົວ</translation>
-<translation id="5833551944249825624">ທຸກຄົນທີ່ຢູ່ໃກ້ຄຽງຈະເບິ່ງເຫັນ Chromebook ຂອງທ່ານເປັນເວລາ 5 ນາທີ</translation>
 <translation id="5833726373896279253">ການຕັ້ງຄ່າເຫຼົ່ານີ້ອາດຈະມີແຕ່ເຈົ້າຂອງເທົ່ານັ້ນທີ່ດັດແກ້ໄດ້:</translation>
 <translation id="5834581999798853053">ຍັງເຫຼືອປະມານ <ph name="TIME" /> ນາ​ທີ</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ການບັນທຶກກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 8dae11e..206f9b7 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1048,6 +1048,7 @@
 <translation id="2154710561487035718">Kopijuoti URL adresą</translation>
 <translation id="2155772377859296191">Atrodo kaip <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Pagalbinis „JavaScript“ failas: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Dar kartą vykdyti saugos patikrą</translation>
 <translation id="2157474325782140681">Norėdami naudotis papildomomis funkcijomis, naudokite „Dell“ doką, sukurtą specialiai šiam „Chromebook“.</translation>
 <translation id="215753907730220065">Išeiti iš viso ekrano režimo</translation>
 <translation id="2157875535253991059">Dabar šis puslapis veikia viso ekrano režimu.</translation>
@@ -1992,6 +1993,7 @@
 <translation id="3225319735946384299">Kodo pasirašymas</translation>
 <translation id="3227137524299004712">Mikrofonas</translation>
 <translation id="3233271424239923319">Kurti atsarginę „Linux“ programų ir failų kopiją</translation>
+<translation id="3238192140106069382">Prisijungiama ir patvirtinama</translation>
 <translation id="3239373508713281971">Programos „<ph name="APP_NAME" />“ laiko apribojimas pašalintas</translation>
 <translation id="3241680850019875542">Pasirinkite norimo pakuoti plėtinio šakninį katalogą. Norėdami atnaujinti plėtinį, pasirinkite ir asmeninio rakto failą, kuris bus naudojamas iš naujo.</translation>
 <translation id="3244294424315804309">Tęsti nutildžius garsą</translation>
@@ -2588,7 +2590,6 @@
 <translation id="3882165008614329320">Esamas vaizdo įrašas iš kameros ar failo</translation>
 <translation id="3884152383786131369">Žiniatinklio turiniui, kuris pasiekiamas keliomis kalbomis, bus naudojama pirma palaikoma kalba iš šio sąrašo. Šios nuostatos sinchronizuojamos su naršyklės nustatymais. <ph name="BEGIN_LINK_LEARN_MORE" />Sužinokite daugiau<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Jūsų užklausa pasiekti šią svetainę išsiųsta <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Išjungta. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Užrašų kūrimas naudojant „<ph name="LOCK_SCREEN_APP_NAME" />“</translation>
 <translation id="3890064827463908288">Norėdami naudoti „Wi-Fi“ sinchronizavimą, įjunkite „Chrome“ sinchronizavimo funkciją</translation>
 <translation id="3892414795099177503">Atidaryti „OpenVPN“ / L2TP...</translation>
@@ -2672,7 +2673,6 @@
 <translation id="3958088479270651626">Importuoti žymes ir nustatymus</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Išjungti mobiliojo ryšio tinklą</translation>
-<translation id="3965730875470565266">Įjungta, <ph name="MINUTES" /> min.</translation>
 <translation id="3965811923470826124">Naudojant</translation>
 <translation id="3965965397408324205">Išeiti iš „<ph name="PROFILE_NAME" />“</translation>
 <translation id="3966072572894326936">Pasirinkti kitą aplanką...</translation>
@@ -4223,7 +4223,6 @@
 <translation id="5832813618714645810">Profiliai</translation>
 <translation id="583281660410589416">Nežinoma</translation>
 <translation id="5833397272224757657">Naudojamas svetainių, kuriose lankotės, turinys ir naršyklės veikla bei sąveikos suasmeninimo tikslais</translation>
-<translation id="5833551944249825624">Jūsų „Chromebook“ bus matomas visiems netoliese esantiems žmonėms penkias minutes</translation>
 <translation id="5833726373896279253">Šiuos nustatymus gali keisti tik savininkas:</translation>
 <translation id="5834581999798853053">Liko apie <ph name="TIME" /> min.</translation>
 <translation id="5835486486592033703">„<ph name="WINDOW_TITLE" />“ – fotoaparato ar mikrofono įrašymas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 4291b8d..bc07bfb 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Kopēt URL</translation>
 <translation id="2155772377859296191">Noteiktā izšķirtspēja: <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Pakalpojumu skripts: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Vēlreiz veikt drošības pārbaudi</translation>
 <translation id="2157474325782140681">Lai varētu izmantot papildu funkcijas, lietojiet Dell dokstaciju, kas paredzēta darbam ar šo Chromebook datoru.</translation>
 <translation id="215753907730220065">Iziet no pilnekrāna režīma</translation>
 <translation id="2157875535253991059">Šī lapa tagad ir redzama pilnekrāna režīmā.</translation>
@@ -1991,6 +1992,7 @@
 <translation id="3225319735946384299">Koda parakstīšana</translation>
 <translation id="3227137524299004712">Mikrofons</translation>
 <translation id="3233271424239923319">Dublēt Linux lietotnes un failus</translation>
+<translation id="3238192140106069382">Notiek savienojuma izveide un apstiprināšana</translation>
 <translation id="3239373508713281971">Lietotnei <ph name="APP_NAME" /> ir noņemts laika ierobežojums.</translation>
 <translation id="3241680850019875542">Atlasiet pakojamā paplašinājuma saknes direktoriju. Lai atjauninātu paplašinājumu, atlasiet arī privātās atslēgas failu atkārtotai izmantošanai.</translation>
 <translation id="3244294424315804309">Turpināt ar izslēgtu skaņu</translation>
@@ -2587,7 +2589,6 @@
 <translation id="3882165008614329320">Esošs videoklips no kameras vai faila</translation>
 <translation id="3884152383786131369">Tīmekļa saturam, kas ir pieejams vairākās valodās, tiks izmantota pirmā atbalstītā valoda no šī saraksta. Šīs preferences tiek sinhronizētas ar jūsu pārlūkprogrammas iestatījumiem. <ph name="BEGIN_LINK_LEARN_MORE" />Uzziniet vairāk<ph name="END_LINK_LEARN_MORE" />.</translation>
 <translation id="3886446263141354045">Pieprasījums piekļūt šai vietnei ir nosūtīts lietotājam <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Izslēgta. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation>
 <translation id="3888550877729210209">Piezīmju rakstīšana, izmantojot <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Lai izmantotu Wi-Fi sinhronizāciju, ieslēdziet Chrome sinhronizāciju</translation>
 <translation id="3892414795099177503">Pievienot OpenVPN/otrā slāņa tunelēšanas protokolu...</translation>
@@ -2671,7 +2672,6 @@
 <translation id="3958088479270651626">Grāmatzīmju un iestatījumu importēšana</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobilā tīkla izslēgšana</translation>
-<translation id="3965730875470565266">Ieslēgta, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Izmantojot</translation>
 <translation id="3965965397408324205">Iziet no profila <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Izvēlēties citu mapi...</translation>
@@ -4221,7 +4221,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Nezināms</translation>
 <translation id="5833397272224757657">Personalizācijai izmanto jūsu apmeklēto vietņu saturu, kā arī darbības un mijiedarbības pārlūkā.</translation>
-<translation id="5833551944249825624">Jūsu Chromebook dators 5 minūtes būs redzams visām tuvumā esošām personām.</translation>
 <translation id="5833726373896279253">Šos iestatījumus drīkst mainīt tikai īpašnieks:</translation>
 <translation id="5834581999798853053">Atlikušas apmēram <ph name="TIME" /> minūtes</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> — ierakstīšana ar kameru vai mikrofonu</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 80f166b8..5f645e22 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">Копирај URL</translation>
 <translation id="2155772377859296191">Изгледа како <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Услужен работник: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Извршете безбедносна проверка повторно</translation>
 <translation id="2157474325782140681">За да добиете дополнителни функции, користете приклучна станица од Dell што е дизајнирана да работи со овој Chromebook.</translation>
 <translation id="215753907730220065">Излези од цел екран</translation>
 <translation id="2157875535253991059">Страницава е сега на цел екран.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Потпишување шифра</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Направете бекап на апликациите и датотеките на Linux</translation>
+<translation id="3238192140106069382">Поврзување и потврдување</translation>
 <translation id="3239373508713281971">Временското ограничување за <ph name="APP_NAME" /> е отстрането</translation>
 <translation id="3241680850019875542">Изберете го основниот директориум на наставката за пакување. За да ажурирате наставка, изберете ја и датотеката со приватен клуч за повторно да се употреби.</translation>
 <translation id="3244294424315804309">Остави го звукот исклучен</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Постојно видео од камера или датотека</translation>
 <translation id="3884152383786131369">Содржините од интернет што се достапни на повеќе јазици ќе го користат првиот поддржан јазик од списоков. Поставкиве се синхронизираат со поставките за прелистувачот. <ph name="BEGIN_LINK_LEARN_MORE" />Дознајте повеќе<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Вашето барање за пристап на сајтов е испратено на <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Исклучено. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Прибележување со <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Вклучете „Синхронизација на Chrome“ за да користите „Синхронизирање на Wi-Fi“</translation>
 <translation id="3892414795099177503">Додајте OpenVPN / L2TP…</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Увези обележувачи и поставки</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Исклучување мобилна мрежа</translation>
-<translation id="3965730875470565266">Вклучено, <ph name="MINUTES" /> мин.</translation>
 <translation id="3965811923470826124">Со</translation>
 <translation id="3965965397408324205">Излези од <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Одберете друга папка...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Профили</translation>
 <translation id="583281660410589416">Непознат</translation>
 <translation id="5833397272224757657">За персонализација ги користи содржините на сајтовите што ги посетувате, како и активноста и интеракциите на прелистувачот</translation>
-<translation id="5833551944249825624">Вашиот Chromebook ќе биде видлив за секого во близина во траење од 5 мин.</translation>
 <translation id="5833726373896279253">Овие поставки може да ги менува само сопственикот:</translation>
 <translation id="5834581999798853053">Преостануваат околу <ph name="TIME" /> минути</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - камерата или микрофонот снима</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 027f58d46..2151b64 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">സർവീസ് വർക്കർമാർ</translation>
 <translation id="1235458158152011030">അറിയാവുന്ന നെറ്റ്‌വർക്കുകൾ</translation>
 <translation id="123578888592755962">ഡിസ്‌ക് നിറഞ്ഞു</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{ടെക്‌സ്റ്റ്}other{# ടെക്‌സ്റ്റുകൾ}}</translation>
 <translation id="1239594683407221485">ഫയലുകള്‍ ആപ്പിൽ ഉപകരണത്തിന്റെ ഉള്ളടക്കം അടുത്തറിയൂ.</translation>
 <translation id="124116460088058876">കൂടുതൽ ഭാഷകൾ</translation>
 <translation id="1241753985463165747">നിർദ്ദേശിക്കപ്പെടുമ്പോൾ നിലവിലെ വെബ്‌സൈറ്റിലെ നിങ്ങളുടെ ഡാറ്റ മുഴുവൻ വായിച്ച് അതിൽ മാറ്റം വരുത്തുക</translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">പാസ്‌വേഡുകള്‍ തിരയുക</translation>
 <translation id="1487335504823219454">ഇഷ്‌ടാനുസൃത ക്രമീകരണം ഓണാക്കുക</translation>
 <translation id="1489664337021920575">മറ്റൊരു ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക</translation>
+<translation id="1490491397986065675">"<ph name="CUSTOM_MESSAGE" />" എന്ന് നിങ്ങളുടെ അഡ്‌മിൻ പറയുന്നു.</translation>
 <translation id="1492417797159476138">ഈ സൈറ്റിനായി നിങ്ങൾ ഇതിനകം തന്നെ ഈ ഉപയോക്തൃനാമം സംരക്ഷിച്ചു</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />-നായി കാത്തിരിക്കുന്നു...</translation>
 <translation id="1495677929897281669">ടാബിലേക്ക് മടങ്ങുക</translation>
@@ -808,6 +810,7 @@
 <translation id="1879000426787380528">എന്ന പേരിൽ സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" എന്ന സർട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കണോ?</translation>
 <translation id="1881445033931614352">കീബോർഡ് ലേഔട്ട്</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{ഇനം}other{# ഇനങ്ങൾ}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" /> നെറ്റ്‌വർക്ക്, <ph name="NETWORK_NAME" />, കണക്‌റ്റ് ചെയ്യുക</translation>
 <translation id="1884340228047885921">നിലവിലെ ദൃശ്യപരതാ ക്രമീകരണം ചില കോൺടാക്റ്റുകളാണ്</translation>
 <translation id="1884705339276589024">Linux ഡിസ്‌ക്കിന്റെ വലുപ്പം‌ മാറ്റുക</translation>
@@ -986,6 +989,7 @@
 <translation id="2099686503067610784">"<ph name="CERTIFICATE_NAME" />" എന്ന സെർവർ സർട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കണോ?</translation>
 <translation id="2100273922101894616">സ്വയമേവയുള്ള സൈൻ ഇൻ</translation>
 <translation id="2101225219012730419">പതിപ്പ്:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{ഫോൺ നമ്പർ}other{# ഫോൺ നമ്പറുകൾ}}</translation>
 <translation id="211144231511833662">തരങ്ങൾ മായ്ക്കുക</translation>
 <translation id="2111670510994270194">പുതിയ ടാബ് വലതുവശത്തേക്ക്</translation>
 <translation id="21133533946938348">ടാബ് പിൻ ചെയ്യുക</translation>
@@ -1282,6 +1286,7 @@
 <translation id="2435457462613246316">പാസ്‌വേഡ് കാണിക്കുക</translation>
 <translation id="2435579801172349831">എല്ലാം (<ph name="URL_COUNT" />) അദൃശ്യ വിൻഡോയിൽ തുറക്കുക</translation>
 <translation id="2436186046335138073">എല്ലാ <ph name="PROTOCOL" /> ലിങ്കുകളും തുറക്കാൻ <ph name="HANDLER_HOSTNAME" /> എന്നതിനെ അനുവദിക്കണോ?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{ആപ്പ്}other{# ആപ്പുകൾ}}</translation>
 <translation id="2440604414813129000">ഉറവിടം കാണുക</translation>
 <translation id="244231003699905658">വിലാസം തെറ്റാണ്. വിലാസം പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2442916515643169563">ടെക്‌സ്‌റ്റ് ഷാഡോ</translation>
@@ -1430,6 +1435,7 @@
 <translation id="2604255671529671813">നെറ്റ്‌വർക്ക് കണക്ഷൻ പിശക്</translation>
 <translation id="2606246518223360146">ഡാറ്റ ലിങ്ക് ചെയ്യുക</translation>
 <translation id="2606454609872547359">വേണ്ട, ChromeVox ഇല്ലാതെ തുടരുക</translation>
+<translation id="2606568927909309675">ഇംഗ്ലീഷിലുള്ള ഓഡിയോയ്‌ക്കും വീഡിയോയ്‌ക്കും അടിക്കുറിപ്പുകൾ സ്വയമേവ സൃഷ്ടിക്കുന്നു. ഓഡിയോയും അടിക്കുറിപ്പുകളും നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പുറത്തുപോകില്ല.</translation>
 <translation id="2607101320794533334">സബ്‌ജക്റ്റ് പൊതു കീ വിവരം</translation>
 <translation id="2609896558069604090">കുറുക്കുവഴികൾ സൃഷ്‌ടിക്കുക...</translation>
 <translation id="2609980095400624569">കണക്ഷൻ സ്ഥാപിക്കാനായില്ല</translation>
@@ -1694,6 +1700,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">ഇനിപ്പറയുന്നതിൽ ലിങ്ക് തുറക്കുക...</translation>
 <translation id="2889925978073739256">അൺസാൻഡ്‌ബോക്‌സ് ചെയ്‌ത പ്ലഗിന്നുകൾ തടയുന്നത് തുടരുക</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" /> ആപ്പിൽ സൈൻ ചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം ഉപയോഗിക്കണോ?</translation>
 <translation id="2893168226686371498">ഡിഫോൾട്ട് ബ്രൗസര്‍</translation>
 <translation id="2894757982205307093">ഗ്രൂപ്പിലെ പുതിയ ടാബ്</translation>
 <translation id="289644616180464099">സിം കാർഡ് ലോക്കുചെയ്‌തു</translation>
@@ -2005,6 +2012,7 @@
 <translation id="3269069891205016797">സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരങ്ങൾ നീക്കംചെയ്യപ്പെടും.</translation>
 <translation id="3269093882174072735">ചിത്രം ലോഡ് ചെയ്യുക</translation>
 <translation id="3269612321104318480">ഇളം ടീലും വെള്ളയും</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{ഫയൽ}other{# ഫയലുകൾ}}</translation>
 <translation id="326999365752735949">ഡിഫ് ഡൗൺലോഡുചെയ്യുന്നു</translation>
 <translation id="3270965368676314374">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ഫോട്ടോകളും സംഗീതവും മറ്റ് മീഡിയയും വായിക്കുക, മാറ്റുക, ഇല്ലാതാക്കുക</translation>
 <translation id="327147043223061465">എല്ലാ കുക്കികളും സൈറ്റ് ഡാറ്റയും കാണുക</translation>
@@ -2300,6 +2308,7 @@
 <translation id="3600792891314830896">ശബ്‌ദം പ്ലേ ചെയ്യുന്ന സൈറ്റുകളെ മ്യൂട്ട് ചെയ്യുക</translation>
 <translation id="360180734785106144">പുതിയ ഫീച്ചറുകൾ ലഭ്യമാകുന്ന മുറയ്ക്ക് അവ വാഗ്ദാനം ചെയ്യുക</translation>
 <translation id="3602290021589620013">പ്രിവ്യൂ</translation>
+<translation id="3602870520245633055">പ്രിന്റ് ചെയ്ത് സ്‌കാൻ ചെയ്യുക</translation>
 <translation id="3603622770190368340">നെറ്റ്‌വർക്ക് സർട്ടിഫിക്കറ്റ് ലഭ്യമാക്കുക</translation>
 <translation id="3604193429970465812">ദ്വിതീയ അക്കൗണ്ടുകൾ</translation>
 <translation id="3604713164406837697">വാൾപേപ്പർ മാറ്റുക</translation>
@@ -2315,6 +2324,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> സ്‌കാൻ ചെയ്യുകയാണ്.</translation>
 <translation id="3616741288025931835">&amp;ബ്രൌസിംഗ് ഡാറ്റ ഇല്ലാതാക്കുക...</translation>
 <translation id="3617891479562106823">പശ്ചാത്തലങ്ങൾ ലഭ്യമല്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{വീഡിയോ}other{# വീഡിയോകൾ}}</translation>
 <translation id="3619115746895587757">കാപ്പുചീനോ</translation>
 <translation id="362333465072914957">സര്‍ട്ടിഫിക്കറ്റ് ഇഷ്യൂ ചെയ്യാൻ CA-ക്കായി കാത്തിരിക്കുന്നു</translation>
 <translation id="3624567683873126087">ഉപകരണം അൺലോക്ക് ചെയ്‌ത് Google അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
@@ -2572,7 +2582,6 @@
 <translation id="3882165008614329320">ക്യാമറയിൽ നിന്നോ ഫയലിൽ നിന്നോ ഉള്ള നിലവിലെ വീഡിയോ</translation>
 <translation id="3884152383786131369">ഒന്നിലധികം ഭാഷകളിൽ ലഭ്യമായ വെബ് ഉള്ളടക്കം, ഈ ലിസ്‌റ്റിലുള്ള പിന്തുണയ്‌ക്കുന്ന ആദ്യത്തെ ഭാഷ ഉപയോഗിക്കും. ഈ മുൻഗണനകൾ നിങ്ങളുടെ ബ്രൗസർ ക്രമീകരണവുമായി സമന്വയിപ്പിക്കുന്നു. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045"><ph name="NAME" /> എന്നയാൾക്ക് ഈ സൈറ്റ് ആക്‌സസ് ചെയ്യാനുള്ള നിങ്ങളുടെ അഭ്യർത്ഥന അയച്ചു</translation>
-<translation id="3888364689515978571">ഓഫാണ്. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ഉപയോഗിച്ച് കുറിപ്പുകൾ എടുക്കുന്നു</translation>
 <translation id="3890064827463908288">വൈഫൈ സമന്വയം ഉപയോഗിക്കാൻ Chrome സമന്വയം ഓണാക്കുക</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ചേർക്കുക...</translation>
@@ -2655,7 +2664,6 @@
 <translation id="3958088479270651626">ബുക്ക്മാർക്കുകളും ക്രമീകരണവും ഇമ്പോർട്ട് ചെയ്യുക</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">സെല്ലുലാർ നെറ്റ്‌വർക്ക് ഓഫാക്കുക</translation>
-<translation id="3965730875470565266">ഓണാണ്, <ph name="MINUTES" /> മിനിറ്റ്</translation>
 <translation id="3965811923470826124">ഉൾപ്പെടുത്തുക</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> എന്നതിൽ നിന്ന് പുറത്ത് കടക്കുക</translation>
 <translation id="3966072572894326936">മറ്റൊരു ഫോള്‍ഡര്‍ തിരഞ്ഞെടുക്കൂ...</translation>
@@ -2725,6 +2733,7 @@
 <translation id="4047726037116394521">ഹോമിലേക്ക് പോവുക</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# കോൺടാക്റ്റ് ലഭ്യമല്ല. കോൺടാക്റ്റുകൾക്കൊപ്പം സമീപമുള്ള പങ്കിടൽ ഉപയോഗിക്കുന്നതിന് അവരുടെ Google അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട ഇമെയിൽ വിലാസം നിങ്ങളുടെ കോൺടാക്റ്റുകളിൽ ചേർക്കുക.}other{# കോൺടാക്റ്റുകൾ ലഭ്യമല്ല. കോൺടാക്റ്റുകൾക്കൊപ്പം സമീപമുള്ള പങ്കിടൽ ഉപയോഗിക്കുന്നതിന് അവരുടെ Google അക്കൗണ്ടുകളുമായി ബന്ധപ്പെട്ട ഇമെയിൽ വിലാസങ്ങൾ നിങ്ങളുടെ കോൺടാക്റ്റുകളിൽ ചേർക്കുക.}}</translation>
 <translation id="4050225813016893843">പരിശോധിച്ചുറപ്പിക്കൽ രീതി</translation>
+<translation id="4050534976465737778">രണ്ട് ഉപകരണങ്ങളും അൺലോക്ക് ചെയ്‌തിട്ടുണ്ടെന്നും അടുത്തടുത്താണ് ഉള്ളതെന്നും Bluetooth ഓണാക്കിയിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക. നിങ്ങളുടെ കോൺടാക്റ്റുകളിൽ ഇല്ലാത്ത Chromebook-മായാണ് നിങ്ങൾ പങ്കിടുന്നതെങ്കിൽ അതിൽ സമീപമുള്ള ദൃശ്യപരത ഓണാക്കിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക (സ്റ്റാറ്റസ് ഏരിയ തുറന്ന് സമീപമുള്ള ദൃശ്യപരത തിരഞ്ഞെടുക്കുക). <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">ചെറുത്</translation>
 <translation id="4054070260844648638">എല്ലാവര്‍ക്കും ദൃശ്യം</translation>
 <translation id="4056908315660577142"><ph name="APP_NAME" /> Chrome ആപ്പിനായി നിങ്ങളുടെ രക്ഷിതാവ് സജ്ജീകരിച്ച സമയ പരിധിയിലെത്തി. നാളെ <ph name="TIME_LIMIT" /> സമയം നിങ്ങൾക്ക് അത് ഉപയോഗിക്കാം.</translation>
@@ -2959,6 +2968,7 @@
 <translation id="4364327530094270451">മത്തങ്ങ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation>
 <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation>
+<translation id="4366138410738374926">പ്രിന്റ് ചെയ്യൽ ആരംഭിച്ചു</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> നുറുങ്ങുകൾ, ഓഫറുകൾ, അപ്‌ഡേറ്റുകൾ എന്നിവ നേടുകയും ഫീഡ്‌ബാക്ക് പങ്കിടുകയും ചെയ്യുക. ഏത് സമയത്തും വരിക്കാരല്ലാതാവുക.</translation>
 <translation id="4370425812909262207">കാർട്ടുകൾ മറച്ചിരിക്കുന്നു. നിങ്ങൾ മാറ്റങ്ങൾ വരുത്തുമ്പോൾ അവ വീണ്ടും ദൃശ്യമാകും.</translation>
 <translation id="4370975561335139969">നിങ്ങൾ നൽകിയ ഇമെയിലും പാസ്‌വേഡും പൊരുത്തപ്പെടുന്നില്ല</translation>
@@ -3146,6 +3156,7 @@
 <translation id="4568025708905928793">ഒരു സുരക്ഷാ കീ അഭ്യർത്ഥിക്കുന്നു</translation>
 <translation id="4568213207643490790">ക്ഷമിക്കണം, ഈ ഉപകരണത്തിൽ Google അക്കൗണ്ടുകൾ അനുവദനീയമല്ല.</translation>
 <translation id="4569747168316751899">നിഷ്ക്രിയമായിരിക്കുമ്പോൾ</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{വിലാസം}other{# വിലാസങ്ങൾ}}</translation>
 <translation id="4570387585180509432">വിലാസം, ഫോൺ നമ്പറുകൾ എന്നിവയും മറ്റും</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" എന്നതിലേക്ക് കണക്റ്റ് ചെയ്യുമ്പോൾ പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കി.</translation>
 <translation id="4572779512957829735">നിങ്ങളുടെ സുരക്ഷാ കോഡിനുള്ള പിൻ നൽകുക</translation>
@@ -3205,6 +3216,7 @@
 <translation id="4635444580397524003">Linux ബാക്കപ്പ് പുനഃസ്ഥാപിച്ചു.</translation>
 <translation id="4636930964841734540">വിവരം</translation>
 <translation id="4637083375689622795">കൂടുതൽ പ്രവര്‍ത്തനങ്ങൾ, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{ടെക്‌സ്റ്റ്}other{# ടെക്‌സ്റ്റുകൾ}}</translation>
 <translation id="4638930039313743000">ADB ഡീബഗ് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="4641539339823703554">സിസ്‌റ്റം സമയം സജ്ജീകരിക്കാൻ Chrome-ന് കഴിഞ്ഞില്ല. ചുവടെകൊടുത്തിരിക്കുന്ന സമയം പരിശോധിച്ച്, ആവശ്യമുണ്ടെങ്കിൽ തിരുത്തുക.</translation>
 <translation id="4642769377300286600">മൊബെെൽ പ്രൊഫെെൽ ഇൻസ്‌റ്റാൾ ചെയ്യുന്നു, <ph name="NETWORK_COUNT" />-ൽ <ph name="NETWORK_INDEX" />-ാമത്തെ നെറ്റ്‌വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3220,10 +3232,12 @@
 <translation id="4651484272688821107">ഡെമോ മോഡ് ഉറവിടങ്ങൾ ഉപയോഗിച്ച് ഓൺലൈൻ ഘടകം ലോഡ് ചെയ്യാനായില്ല.</translation>
 <translation id="4652935475563630866">ക്യാമറാ ക്രമീകരണത്തിൽ മാറ്റം വരുത്തിയത് കാരണം Parallels Desktop വീണ്ടും ആരംഭിക്കേണ്ടതുണ്ട്. തുടരാൻ, Parallels Desktop വീണ്ടും ആരംഭിക്കുക.</translation>
 <translation id="4653405415038586100">Linux കോൺഫിഗർ ചെയ്യുന്നതിൽ പിശക്</translation>
+<translation id="4654236001025007561">നിങ്ങൾക്ക് ചുറ്റുമുള്ള Chromebook-കളുമായും Android ഉപകരണങ്ങളുമായും ഫയലുകൾ പങ്കിടുക</translation>
 <translation id="4657914796247705218">TrackPoint വേഗത</translation>
 <translation id="465878909996028221">http, https എന്നിവയും ഫയൽ പ്രോട്ടോകോളുകളും മാത്രമേ ബ്രൗസർ റീഡയറക്റ്റുകളിൽ പിന്തുണയ്ക്കൂ.</translation>
 <translation id="4659077111144409915">പ്രാഥമിക അക്കൗണ്ട്</translation>
 <translation id="4659126640776004816">നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സൈൻ ഇൻ ചെയ്യുമ്പോൾ ഈ ഫീച്ചർ ഓണാകും.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{ചിത്രം}other{# ചിത്രങ്ങൾ}}</translation>
 <translation id="4660476621274971848">പ്രതീക്ഷിച്ച പതിപ്പ് "<ph name="EXPECTED_VERSION" />" ആണ്, എന്നാൽ ലഭിച്ച പതിപ്പ് "<ph name="NEW_ID" />" ആയിരുന്നു</translation>
 <translation id="4660540330091848931">വലുപ്പം മാറ്റുന്നു</translation>
 <translation id="4661407454952063730">ആപ്പ് ഡാറ്റ എന്നത് കോൺടാക്റ്റുകൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ എന്നിവ ഉൾപ്പെടെ ആപ്പ് സംരക്ഷിച്ചിട്ടുള്ള ഏതൊരു ഡാറ്റയും (ഡെവലപ്പർ ക്രമീകരണം അടിസ്ഥാനമാക്കി) ആകാം.</translation>
@@ -3324,6 +3338,7 @@
 <translation id="4794810983896241342">അപ്‌ഡേറ്റുകൾ മാനേജ് ചെയ്യുന്നത് <ph name="BEGIN_LINK" />നിങ്ങളുടെ അഡ്‌മിനാണ്<ph name="END_LINK" /></translation>
 <translation id="479536056609751218">വെബ്‌പേജുകൾ, HTML മാത്രം</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />Bluetooth ലോഗുകൾ<ph name="END_LINK" /> (Google-ൽ ഉള്ളത് മാത്രം) അറ്റാച്ച് ചെയ്യുക</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{ഇനം}other{# ഇനങ്ങൾ}}</translation>
 <translation id="4801448226354548035">അക്കൗണ്ടുകൾ മറയ്‌ക്കുക</translation>
 <translation id="4801512016965057443">മൊബൈല്‍ ഡാറ്റ റോമിംഗ് അനുവദിക്കുക</translation>
 <translation id="4804818685124855865">വിച്ഛേദിക്കുക</translation>
@@ -3754,6 +3769,7 @@
 <translation id="531118851858162334">Google സേവനങ്ങൾ ഉപയോഗിച്ചപ്പോഴുള്ള നിങ്ങളുടെ മുമ്പത്തെ ആക്റ്റിവിറ്റിയുടെ അടിസ്ഥാനത്തിലാണ് നിങ്ങൾ ഈ ഇനം കാണുന്നത്. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-ൽ നിങ്ങളുടെ ഡാറ്റ കാണാനും ഇല്ലാതാക്കാനും ക്രമീകരണം മാറ്റാനും കഴിയും.</translation>
 <translation id="5311304534597152726">ഈ പേരിൽ സൈൻ ഇൻ ചെയ്യുന്നു</translation>
 <translation id="5311565231560644461">നിങ്ങളുടെ വെർച്വൽ റിയാലിറ്റി ഉപകരണങ്ങളും ഡാറ്റയും ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കരുത്</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{ചിത്രം}other{# ചിത്രങ്ങൾ}}</translation>
 <translation id="5314381603623123224">Chrome-ന്റെ സേവന നിബന്ധനകളിൽ മാർച്ച് 31-ന് മാറ്റം വരുന്നു</translation>
 <translation id="5315738755890845852">അധിക ചുരുൾ ബ്രാക്കറ്റ്: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation>
@@ -3819,6 +3835,7 @@
 <translation id="5390677308841849479">ഇരുണ്ട ചുവപ്പും ഓറഞ്ചും</translation>
 <translation id="5390743329570580756">ഇതിനുവേണ്ടി അയയ്‌ക്കുക</translation>
 <translation id="5392192690789334093">അറിയിപ്പുകൾ അയയ്ക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{ലിങ്ക്}other{# ലിങ്കുകൾ}}</translation>
 <translation id="5397794290049113714">നിങ്ങള്‍</translation>
 <translation id="5398497406011404839">മറച്ചിരിക്കുന്ന ബുക്ക്‌മാർക്കുകൾ</translation>
 <translation id="5398572795982417028">പേജ് റഫറൻസ് പരിധി കവിഞ്ഞു, <ph name="MAXIMUM_PAGE" /> പേജാണ് വേണ്ട പരിധി</translation>
@@ -4197,7 +4214,6 @@
 <translation id="5832813618714645810">പ്രൊഫൈലുകൾ</translation>
 <translation id="583281660410589416">അജ്ഞാതം</translation>
 <translation id="5833397272224757657">നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകളിലെ ഉള്ളടക്കവും ബ്രൗസർ ആക്റ്റിവിറ്റിയും ആശയവിനിമയങ്ങളും, വ്യക്തിപരമാക്കാൻ ഉപയോഗിക്കുന്നു</translation>
-<translation id="5833551944249825624">നിങ്ങളുടെ Chromebook സമീപമുള്ള എല്ലാവർക്കും 5 മിനിറ്റ് ദൃശ്യമാകും</translation>
 <translation id="5833726373896279253">ഈ ക്രമീകരണങ്ങള്‍ ഉടമയ്ക്ക് മാത്രമേ പരിഷ്ക്കരിക്കാന്‍ കഴിയൂ:</translation>
 <translation id="5834581999798853053">ഏകദേശം <ph name="TIME" /> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ക്യാമറ അല്ലെങ്കിൽ മൈക്രോഫോൺ റെക്കോർഡിംഗ്</translation>
@@ -4348,6 +4364,7 @@
 <translation id="6011074160056912900">എതെർനെറ്റ് നെറ്റ്‌വർക്ക്</translation>
 <translation id="6011193465932186973">ഫിംഗർപ്രിന്റ്</translation>
 <translation id="6011449291337289699">സൈറ്റ് ഡാറ്റ മായ്‌ക്കുക</translation>
+<translation id="6013027779243312217">നിങ്ങളുടെ ഓഡിയോയ്‌ക്കും വീഡിയോയ്‌ക്കുമുള്ള അടിക്കുറിപ്പുകൾ നേടൂ</translation>
 <translation id="6015796118275082299">വര്‍ഷം</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" />-ൽ <ph name="CURRENT_ELEMENT" />-ാമത്തെ അധിക ഉള്ളടക്കത്തിലേക്ക് നാവിഗേറ്റ് ചെയ്യുക</translation>
 <translation id="6016551720757758985">മുൻ പതിപ്പിലേക്ക് പോകുന്നതിലൂടെ പവർവാഷ് സ്ഥിരീകരിക്കുക</translation>
@@ -4858,6 +4875,7 @@
 <translation id="6605847144724004692">ഒരു ഉപയോക്താവും ഇതുവരെ റേറ്റ് ചെയ്തിട്ടില്ല.</translation>
 <translation id="6607831829715835317">കൂടുതൽ ഉപക&amp;രണങ്ങൾ</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> ഇപ്പോൾ തന്നെ <ph name="DOMAIN" /> മാനേജ് ചെയ്യുന്നുണ്ട്. മറ്റൊരു അക്കൗണ്ടിൽ രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ ഉപയോഗിക്കാൻ, സജ്ജീകരിച്ചതിനുശേഷം സൈൻ ഔട്ട് ചെയ്യുക, തുടർന്ന് സൈൻ-ഇൻ സ്ക്രീനിൽ "വ്യക്തിയെ ചേർക്കുക" തിരഞ്ഞെടുക്കുക.</translation>
+<translation id="6609478180749378879">നിങ്ങൾ അദൃശ്യ മോഡിൽ നിന്ന് പുറത്തുകടന്ന ശേഷം സൈൻ ഇൻ ഡാറ്റ ഈ ഉപകരണത്തിൽ സംഭരിക്കും. നിങ്ങളുടെ ഉപകരണത്തിലൂടെ പിന്നീട് വീണ്ടും ഈ വെബ്‌സൈറ്റിൽ സൈൻ ഇൻ ചെയ്യാനാകും.</translation>
 <translation id="6611972847767394631">നിങ്ങളുടെ ടാബുകൾ ഇവിടെ കണ്ടെത്തുക</translation>
 <translation id="6612358246767739896">പരിരക്ഷിത ഉള്ളടക്കം</translation>
 <translation id="6615455863669487791">എന്നെ കാണിക്കുക</translation>
@@ -4876,6 +4894,7 @@
 <translation id="6628328486509726751"><ph name="WEBRTC_LOG_UPLOAD_TIME" /> അപ്‌ലോഡുചെ‌യ്തു</translation>
 <translation id="6630043285902923878">USB ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു...</translation>
 <translation id="6630752851777525409">നിങ്ങൾക്കായി പ്രാമാണീകരിക്കുന്നതിന് <ph name="EXTENSION_NAME" /> ഒരു സർട്ടിഫിക്കറ്റിലേക്ക് സ്ഥിര ആക്‌സസ് ആവശ്യപ്പെടുന്നു.</translation>
+<translation id="6635362468090274700">നിങ്ങൾ ദൃശ്യപരതാ ക്രമീകരണം ഓണാക്കുന്നത് വരെ ആർക്കും നിങ്ങളുമായി പങ്കിടാനാകില്ല.<ph name="BR" /><ph name="BR" />താൽക്കാലികമായി നിങ്ങളുടെ ഉപകരണം ദൃശ്യമാക്കാൻ, സ്‌റ്റാറ്റസ് ഏരിയ തുറന്ന് സമീപമുള്ള ദൃശ്യപരത ഓണാക്കുക.</translation>
 <translation id="6635944431854494329">ക്രമീകരണം &gt; വിപുലമായത് &gt; ഡയഗണോസ്‌റ്റിക്, ഉപയോഗ ഡാറ്റ Google-ന് സ്വയമേവ അയയ്‌ക്കുക എന്നതിൽ ഉടമയ്‌ക്ക് ഈ ഫീച്ചർ നിയന്ത്രിക്കാനാവും.</translation>
 <translation id="6635956300022133031">ടെക്‌സ്റ്റ് ടു സ്‌പീച്ച് ശബ്ദങ്ങൾ തിരഞ്ഞെടുത്ത് ഇഷ്ടാനുസൃതമാക്കുക</translation>
 <translation id="6636588250634969791">തുടരുന്നതിന് മുമ്പ് SIM ഇടുക</translation>
@@ -5027,6 +5046,7 @@
 <translation id="6811332638216701903">DHCP ഹോസ്‌റ്റ് നാമം</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> റൂട്ട് ആയി പ്രവര്‍ത്തിപ്പിക്കാന്‍ കഴിയില്ല.</translation>
 <translation id="6812841287760418429">മാറ്റങ്ങൾ നിലനിർത്തുക</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{ഫയൽ}other{# ഫയലുകൾ}}</translation>
 <translation id="6817174620439930047">MIDI ഉപകരണങ്ങൾ (ശുപാർശ ചെയ്‌തത്) ആക്‌സസ് ചെയ്യാൻ ഒരു സൈറ്റിന് സിസ്റ്റം എക്‌സ്‌ക്ലൂസീവ് സന്ദേശങ്ങൾ ഉപയോഗിക്കേണ്ട സാഹചര്യത്തിൽ അത് ആവശ്യപ്പെടുക</translation>
 <translation id="6818198425579322765">വിവർത്തനം ചെയ്യേണ്ട പേജ് ഭാഷ</translation>
 <translation id="6818802132960437751">ബിൽറ്റ്-ഇൻ വെെറസ് പരിരക്ഷ</translation>
@@ -5047,6 +5067,7 @@
 <translation id="6835762382653651563">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്‌ഡേറ്റ് ചെയ്യാൻ ഇന്റർനെറ്റിൽ കണക്റ്റ് ചെയ്യുക.</translation>
 <translation id="6838034009068684089">ഒരു സൈറ്റിന് നിങ്ങളുടെ സ്ക്രീനുകളിൽ വിൻഡോകൾ തുറന്ന് വയ്ക്കണമെന്നുള്ളപ്പോൾ ചോദിക്കുക (ശുപാർശ ചെയ്യുന്നു)</translation>
 <translation id="6838694093138907871">കോഡ് അസാധുവാണ്. വീണ്ടും ശ്രമിക്കുക.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{ഫോൺ നമ്പർ}other{# ഫോൺ നമ്പറുകൾ}}</translation>
 <translation id="6839225236531462745">സര്‍ട്ടിഫിക്കറ്റ് ഇല്ലാതാക്കല്‍ പിശക്</translation>
 <translation id="6839916869147598086">സൈൻ ഇൻ മാറ്റി</translation>
 <translation id="6840155290835956714">അയയ്‌ക്കുന്നതിന് മുമ്പ് ചോദിക്കുക</translation>
@@ -5152,6 +5173,7 @@
 <translation id="6955446738988643816">പോപ്പ്‌അപ്പ് പരിശോധിക്കുക</translation>
 <translation id="6955535239952325894">മാനേജ് ചെയ്യപ്പെടുന്ന ബ്രൗസറുകളിൽ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു</translation>
 <translation id="6957044667612803194">പിൻ നമ്പറുകളെ ഈ സുരക്ഷാ കീ പിന്തുണയ്ക്കുന്നില്ല</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{ലിങ്ക്}other{# ലിങ്കുകൾ}}</translation>
 <translation id="6960507406838246615">Linux അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്</translation>
 <translation id="696103774840402661">ഈ <ph name="DEVICE_TYPE" /> എന്നതിലെ എല്ലാ ഉപയോക്താക്കളുടെയും എല്ലാ ഫയലുകളും ലോക്കൽ ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കി.</translation>
 <translation id="6964390816189577014">ഹീറോ</translation>
@@ -6061,6 +6083,7 @@
 <translation id="797394244396603170">ഫയലുകൾ പങ്കിടാൻ ആഗ്രഹിക്കുന്ന ഉപകരണം തിരഞ്ഞെടുക്കുക</translation>
 <translation id="7973962044839454485">തെറ്റായ ഉപയോക്തൃനാമമോ പാസ്‌വേഡോ കാരണം PPP പരിശോധിച്ചുറപ്പിക്കൽ പരാജയപ്പെട്ടു</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" /> ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക</translation>
+<translation id="7974713334845253259">ഡിഫോൾട്ട് നിറം</translation>
 <translation id="7974936243149753750">ഓവർസ്‌കാൻ</translation>
 <translation id="7975504106303186033">ഈ Chrome Education ഉപകരണം നിങ്ങൾ ഒരു വിദ്യാഭ്യാസ അക്കൗണ്ടിലേക്ക് എൻറോൾ ചെയ്തിരിക്കണം. പുതിയ അക്കൗണ്ടിനായി സൈൻ അപ്പ് ചെയ്യാൻ, g.co/workspace/edusignup സന്ദർശിക്കുക.</translation>
 <translation id="7978412674231730200">സ്വകാര്യ കീ</translation>
@@ -6227,6 +6250,7 @@
 <translation id="8157704005178149728">മേൽനോട്ടം സജ്ജീകരിക്കുന്നു</translation>
 <translation id="8158117992543756526"><ph name="MONTH_AND_YEAR" />-ൽ ഈ ഉപകരണത്തിന് സ്വയമേവയുള്ള സോഫ്റ്റ്‌വെയർ, സുരക്ഷാ അപ്ഡേറ്റുകൾ ലഭിക്കുന്നത് നിന്നു. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">പിശക് ക്രമീകരണ സര്‍ട്ടിഫിക്കറ്റ് ട്രസ്റ്റ്</translation>
+<translation id="8160775796528709999">ക്രമീകരണത്തിൽ തത്സമയ ക്യാപ്ഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നതിലൂടെ, നിങ്ങളുടെ ഓഡിയോയ്‌ക്കും വീഡിയോയ്‌ക്കുമുള്ള അടിക്കുറിപ്പുകൾ നേടൂ</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">വെബ് പേജുകൾക്കുള്ള വായനാ മോഡ്</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ടാബ് പുതിയ വിൻഡോയിലേക്ക് നീക്കുക}other{ടാബുകൾ പുതിയ വിൻഡോയിലേക്ക് നീക്കുക}}</translation>
@@ -6351,6 +6375,7 @@
 <translation id="8300011035382349091">ഈ ടാബിന്‍റെ ബുക്ക്‌മാർക്ക് എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="8300374739238450534">ഇരുളിൻ നീല</translation>
 <translation id="8300849813060516376">OTASP പരാജയപ്പെട്ടു</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{വിലാസം}other{# വിലാസങ്ങൾ}}</translation>
 <translation id="8304383784961451596">ഈ ഉപകരണം ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല. സൈൻ-ഇൻ അനുമതിക്കായി അഡ്‌മിനുമായി ബന്ധപ്പെടുക അല്ലെങ്കിൽ Family Link മേൽനോട്ടം വഹിക്കുന്ന ഒരു Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="8308179586020895837"><ph name="HOST" />-ന് നിങ്ങളുടെ ക്യാമറ ആക്‌സസ് ചെയ്യാൻ താൽപ്പര്യമുണ്ടോ എന്ന് ചോദിക്കുക</translation>
 <translation id="830868413617744215">ബീറ്റ</translation>
@@ -6649,6 +6674,7 @@
 <translation id="867085395664725367">താൽക്കാലിക സെർവർ പിശക് സംഭവിച്ചു.</translation>
 <translation id="8673026256276578048">വെബില്‍‌ തിരയുക...</translation>
 <translation id="8673383193459449849">സെർവർ പ്രശ്‌നം</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{വീഡിയോ}other{# വീഡിയോകൾ}}</translation>
 <translation id="8676374126336081632">ഇൻപുട്ട് മായ്‌ക്കുക</translation>
 <translation id="8676770494376880701">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ കണക്റ്റുചെയ്‌തു</translation>
 <translation id="8677212948402625567">എല്ലാം ചുരുക്കുക</translation>
@@ -7073,6 +7099,7 @@
 <translation id="9128870381267983090">നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക</translation>
 <translation id="9130015405878219958">അസാധുവായ മോഡ് നല്‍കി.</translation>
 <translation id="9131487537093447019">Bluetooth ഉപകരണങ്ങളിലേക്ക് സന്ദേശങ്ങൾ അയയ്ക്കുകയും സ്വീകരിക്കുകയും ചെയ്യുക.</translation>
+<translation id="9134119143784876218">ഇംഗ്ലീഷിലുള്ള ഓഡിയോയ്‌ക്കും വീഡിയോയ്‌ക്കും അടിക്കുറിപ്പുകൾ സ്വയമേവ സൃഷ്ടിക്കുന്നു (നിലവിൽ Chrome ബ്രൗസറിൽ മാത്രം ലഭ്യം). ഓഡിയോയും അടിക്കുറിപ്പുകളും നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പുറത്തുപോകില്ല.</translation>
 <translation id="9137013805542155359">യഥാര്‍ത്ഥമായത് കാണിക്കുക</translation>
 <translation id="9137157311132182254">തിരഞ്ഞെടുത്ത തിരയൽ യന്ത്രം</translation>
 <translation id="9137248913990643158">ഈ ആപ്പ് ഉപയോഗിക്കുന്നതിന് മുമ്പ് ആരംഭിച്ച് Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
@@ -7120,6 +7147,7 @@
 <translation id="9179524979050048593">സൈൻ ഇൻ സ്ക്രീൻ ഉപയോക്തൃനാമം</translation>
 <translation id="9180281769944411366">ഈ പ്രക്രിയയ്ക്ക് കുറച്ച് സമയമെടുത്തേക്കാം. Linux കണ്ടെയ്‌നർ പ്രവർത്തനം ആരംഭിക്കുന്നു.</translation>
 <translation id="9180380851667544951">സൈറ്റിന് നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടാനാകും</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{ആപ്പ്}other{# ആപ്പുകൾ}}</translation>
 <translation id="9186963452600581158">കുട്ടിയുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സെെൻ ഇൻ ചെയ്യുക</translation>
 <translation id="9188732951356337132">ഉപയോഗവും പ്രശ്‌നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്‌നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഈ ഉപകരണം നിലവിൽ സ്വയമേവ Google-ന് അയയ്ക്കുന്നുണ്ട്. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്‌റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്‌റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">നിങ്ങളുടെ Android ഫോൺ ഒരു സുരക്ഷാ കീ ആയി ഉപയോഗിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 4305742..393885ce 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -2582,7 +2582,6 @@
 <translation id="3882165008614329320">Камер эсвэл файлд байгаа видео</translation>
 <translation id="3884152383786131369">Олон хэл дээр ашиглах боломжтой веб контент энэ жагсаалтын эхний дэмжигдсэн хэлийг ашиглана. Эдгээр сонголтыг таны хөтчийн тохиргоотой синк хийдэг. <ph name="BEGIN_LINK_LEARN_MORE" />Нэмэлт мэдээлэл авах<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Таны энэ сайтад нэвтрэх хүсэлтийг <ph name="NAME" />-д илгээсэн</translation>
-<translation id="3888364689515978571">Унтраалттай. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />-р тэмдэглэл бичиж байна</translation>
 <translation id="3890064827463908288">Wi-Fi синкийг ашиглахын тулд Chrome Синкийг асаана уу</translation>
 <translation id="3892414795099177503">Нээлттэй VPN / L2TP-г нэмэх...</translation>
@@ -2665,7 +2664,6 @@
 <translation id="3958088479270651626">Хайлтын жагсаалтууд болон тохиргоонуудыг импортолж авах</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Үүрэн холбооны сүлжээг унтраах</translation>
-<translation id="3965730875470565266">Асаалттай, <ph name="MINUTES" /> минут</translation>
 <translation id="3965811923470826124">Хамт</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />-с гарах</translation>
 <translation id="3966072572894326936">Өөр хавтас сонгох ...</translation>
@@ -4215,7 +4213,6 @@
 <translation id="5832813618714645810">Профайлууд</translation>
 <translation id="583281660410589416">Үл мэдэгдэх</translation>
 <translation id="5833397272224757657">Таны зочилдог сайтын агуулга, хөтчийн үйл ажиллагаа болон харилцан үйлдлийг хувийн болгоход ашигладаг</translation>
-<translation id="5833551944249825624">Таны Chromebook ойролцоох бүх хүнд 5 минутын турш харагдана</translation>
 <translation id="5833726373896279253">Эдгээр тохиргоонуудийг зөвхөн эзэмшигч нь өөрчилж болно:</translation>
 <translation id="5834581999798853053"><ph name="TIME" /> үлдсэн минутын тухай</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Камер, эсвэл микрофоны бичлэг</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 358969a6..b4e5db9a 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2564,7 +2564,6 @@
 <translation id="3882165008614329320">कॅमेरा किंवा फाइलवरून सद्य व्हिडिओ</translation>
 <translation id="3884152383786131369">एकाहून अधिक भाषांमध्ये उपलब्ध असणारा वेब आशय सूचीमधील सपोर्ट असलेली पहिली भाषा वापरेल. ही प्राधान्ये तुमच्या ब्राउझर सेटिंग्जसह सिंक केली आहेत. <ph name="BEGIN_LINK_LEARN_MORE" />अधिक जाणून घ्या<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">या साइट ॲक्सेस करण्याची तुमची विनंती <ph name="NAME" /> कडे पाठवली गेली आहे</translation>
-<translation id="3888364689515978571">बंद. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> सोबत टिपा घेणे</translation>
 <translation id="3890064827463908288">वाय-फाय सिंक वापरणासाठी Chrome सिंक सुरू करा</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP जोडा...</translation>
@@ -2648,7 +2647,6 @@
 <translation id="3958088479270651626">बुकमार्क आणि सेटिंग्ज इंपोर्ट करा</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">मोबाइल नेटवर्क बंद करा</translation>
-<translation id="3965730875470565266">सुरू, <ph name="MINUTES" /> मि.</translation>
 <translation id="3965811923470826124">यासोबत</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> मधून बाहेर या</translation>
 <translation id="3966072572894326936">अन्य फोल्डर निवडा...</translation>
@@ -4175,7 +4173,6 @@
 <translation id="5832813618714645810">प्रोफाइल</translation>
 <translation id="583281660410589416">अज्ञात</translation>
 <translation id="5833397272224757657">तुम्ही भेट देता त्या साइट तसेच ब्राउझर ॲक्टिव्हिटी आणि संवाद यांच्यावरील आशयाचा वापर पर्सनलायझेशनसाठी करते</translation>
-<translation id="5833551944249825624">जवळपासच्या सर्व लोकांना तुमचे Chromebook पाच मिनिटांसाठी दृश्यमान असेल</translation>
 <translation id="5833726373896279253">ही सेटिंग्ज फक्त मालकाद्वारे सुधारित केली जाऊ शकतात:</translation>
 <translation id="5834581999798853053">सुमारे <ph name="TIME" /> मिनिटे बाकी</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - कॅमेरा किंवा मायक्रोफोन रेकॉर्डिंग</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 1194632..383aa329 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Salin URL</translation>
 <translation id="2155772377859296191">Kelihatan seperti <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Pekerja Perkhidmatan: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Jalankan semakan keselamatan sekali lagi</translation>
 <translation id="2157474325782140681">Gunakan stesen dok Dell yang direka khusus untuk Chromebook ini untuk mendapatkan ciri tambahan.</translation>
 <translation id="215753907730220065">Keluar Daripada Skrin Penuh</translation>
 <translation id="2157875535253991059">Halaman ini kini dalam skrin penuh.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Menandatangan Kod</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Sandarkan apl dan fail Linux</translation>
+<translation id="3238192140106069382">Menyambung dan mengesahkan</translation>
 <translation id="3239373508713281971">Had masa dialih keluar untuk <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Pilih direktori akar bagi sambungan untuk pek. Untuk mengemas kini sambungan, pilih kunci persendirian untuk gunakan semula juga.</translation>
 <translation id="3244294424315804309">Teruskan meredam bunyi</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Video sedia ada daripada kamera atau fail</translation>
 <translation id="3884152383786131369">Kandungan web yang tersedia dalam berbilang bahasa akan menggunakan bahasa pertama yang disokong daripada senarai ini. Pilihan ini disegerakkan dengan tetapan penyemak imbas anda. <ph name="BEGIN_LINK_LEARN_MORE" />Ketahui lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Permintaan anda untuk mengakses tapak ini telah dihantar kepada <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Dimatikan. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Mencatat nota dengan <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Hidupkan Penyegerakan Chrome untuk menggunakan Penyegerakan Wi-Fi</translation>
 <translation id="3892414795099177503">Tambahkan OpenVPN / L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Import penanda halaman dan tetapan</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Matikan Rangkaian selular</translation>
-<translation id="3965730875470565266">Dihidupkan, <ph name="MINUTES" /> minit</translation>
 <translation id="3965811923470826124">Dengan</translation>
 <translation id="3965965397408324205">Keluar daripada <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Pilih folder lain...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profil</translation>
 <translation id="583281660410589416">Tidak diketahui</translation>
 <translation id="5833397272224757657">Menggunakan kandungan di tapak yang anda lawati dan aktiviti serta interaksi penyemak imbas untuk pemperibadian</translation>
-<translation id="5833551944249825624">Chromebook anda akan kelihatan kepada semua orang yang berada berdekatan selama 5 minit</translation>
 <translation id="5833726373896279253">Tetapan ini hanya boleh diubah suai oleh pemilik:</translation>
 <translation id="5834581999798853053">Tinggal kira-kira <ph name="TIME" /> minit</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Kamera atau mikrofon sedang merakam</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 42eaa28..a84bb47 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">URL ကူးယူရန်</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ဟု ယူဆရပါသည်</translation>
 <translation id="2156294658807918600">ဝန်ဆောင်မှု ဆောင်ရွက်စနစ်− <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">လုံခြုံရေးစစ်ဆေးမှု ထပ်လုပ်ဆောင်ရန်</translation>
 <translation id="2157474325782140681">နောက်ထပ်ဝန်ဆောင်မှုများ ရရှိရန် ဤ Chromebook နှင့်တွဲသုံးရန် ထုတ်လုပ်ထားသော Dell အထိုင်စက်ကို အသုံးပြုပါ။</translation>
 <translation id="215753907730220065">မျက်နှာပြင် အပြည့်မှ ထွက်ရန်</translation>
 <translation id="2157875535253991059">ဤစာမျက်နှာသည် ယခု စကရင်ပြည့်ဖြစ်သည်။</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">ကုဒ်ဖြင့် လက်မှတ်ထိုးရန်</translation>
 <translation id="3227137524299004712">မိုက်ခရိုဖုန်း</translation>
 <translation id="3233271424239923319">Linux အက်ပ်နှင့် ဖိုင်များ အရန်သိမ်းသည်</translation>
+<translation id="3238192140106069382">ချိတ်ဆက်ပြီး စိစစ်နေသည်</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> အတွက် အချိန်ကန့်သတ်ချက် ဖယ်ရှားလိုက်သည်</translation>
 <translation id="3241680850019875542">ထုပ်ရန် အတွက် တိုးချဲ့မှု၏ ရင်းမြစ် ဒါရိုက်ထရီကို ရွေးပါ။ တိုးချဲ့မှု တစ်ခုကို အပ်ဒိတ်လုပ်ရန်၊ ကိုယ်ပိုင် သော့ ပြန်သုံးရန်ကိုပါ ရွေးပါ။</translation>
 <translation id="3244294424315804309">အသံကို ဆက်လက်ပိတ်ထားရန်</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">ကင်မရာ သို့မဟုတ် ဖိုင်မှ လက်ရှိဗီဒီယို</translation>
 <translation id="3884152383786131369">ဘာသာစကားအမျိုးမျိုး အသုံးပြုနိုင်သော ဝဘ်အကြောင်းအရာများက ဤစာရင်းထဲမှ ပထမဆုံးပံ့ပိုးထားသော ဘာသာစကားကို အသုံးပြုပါမည်။ ဤသတ်မှတ်ချက်များကို သင့်ဘရောင်ဇာဆက်တင်များနှင့် စင့်ခ်လုပ်ထားသည်။ <ph name="BEGIN_LINK_LEARN_MORE" />ပိုမိုလေ့လာရန်<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ဤဆိုက်အား အသုံးပြုရန် သင့်တောင်းဆိုချက်ကို <ph name="NAME" /> သို့ ပို့လိုက်ပါပြီ</translation>
-<translation id="3888364689515978571">ပိတ်ထားသည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ဖြင့် မှတ်စုရေးခြင်း</translation>
 <translation id="3890064827463908288">'Wi-Fi စင့်ခ်' အသုံးပြုရန် 'Chrome စင့်ခ်' ဖွင့်ပါ</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ထည့်ရန်...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">စာညှပ်များ နှင့် ဆက်တင်များကို တင်သွင်းရန်</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ဆယ်လူလာကွန်ရက် ပိတ်ရန်</translation>
-<translation id="3965730875470565266">ဖွင့်ထားသည်၊ <ph name="MINUTES" /> မိနစ်</translation>
 <translation id="3965811923470826124">အောက်ပါဖြင့်-</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> မှ ထွက်ရန်</translation>
 <translation id="3966072572894326936">နောက် ဖိုလ်ဒါ တစ်ခုကို ရွေးရန်...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">ပရိုဖိုင်များ</translation>
 <translation id="583281660410589416">မသိရ</translation>
 <translation id="5833397272224757657">ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရန် သင်ကြည့်ရှုသည့် ဝဘ်ဆိုက်များရှိ အကြောင်းအရာများအပြင် ဘရောင်ဇာ လုပ်ဆောင်ချက်နှင့် အပြန်အလှန်ဆက်သွယ်ချက်တို့ကို အသုံးပြုသည်</translation>
-<translation id="5833551944249825624">သင်၏ Chromebook ကို အနီးတွင်ရှိသူတိုင်းက ၅ မိနစ်ကြာ မြင်နိုင်မည်</translation>
 <translation id="5833726373896279253">ဒီဆက်တင်များကို ပိုင်ရှင်သာ မွမ်းမံနိုင်သည်:</translation>
 <translation id="5834581999798853053"><ph name="TIME" /> မိနစ်ခန့် ကျန်</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ကင်မရာ သို့မဟုတ် မိုက်ခရိုဖုန်း ဖမ်းယူရိုက်ကူးခြင်း</translation>
@@ -4896,7 +4895,7 @@
 <translation id="6628328486509726751">တင်ပြီး <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">USB စက်များ ရှာနေသည်...</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> သည် သင့်ကိုယ်စား ၎င်းကိုယ်တိုင် စစ်မှန်ကြောင်း သက်သေပြရန်အတွက် သက်သေခံလက်မှတ်တစ်ခုသို့ အမြဲဝင်သုံးခွင့် ရလိုသည်။</translation>
-<translation id="6635362468090274700">သင့်ကိုယ်သင်မြင်ရအောင် မပြုလုပ်မချင်း မည်သူမျှ သင်နှင့်မျှဝေ၍မရပါ။<ph name="BR" /><ph name="BR" />သင့်ကို ယာယီမြင်ရစေရန် အခြေအနေပြနေရာကို ဖွင့်ပါ၊ ထို့နောက် 'အနီးတစ်ဝိုက် မြင်နိုင်မှု' ကိုဖွင့်ပါ။</translation>
+<translation id="6635362468090274700">သင့်ကိုယ်သင် ဖျောက်မထားမှသာ အခြားသူများက သင်နှင့် မျှဝေနိုင်ပါမည်။<ph name="BR" /><ph name="BR" />သင့်ကို ယာယီမြင်နိုင်ရန် အခြေအနေပြနေရာတွင် 'အနီးတစ်ဝိုက် မြင်နိုင်မှု' ကိုဖွင့်ပါ။</translation>
 <translation id="6635944431854494329">ပိုင်ရှင်သည် ဤဝန်ဆောင်မှုကို 'ဆက်တင်များ &gt; အဆင့်မြင့် &gt; အမှားရှာဖွေခြင်းနှင့် အသုံးပြုမှုဒေတာများကို Google သို့ အလိုအလျောက်ပို့ရန်' တွင် ထိန်းချုပ်နိုင်သည်။</translation>
 <translation id="6635956300022133031">စာသားမှ စကားပြောသို့ ပြောင်းခြင်း အသံများကို ရွေးချယ်ပြီး စိတ်ကြိုက်ပြင်ဆင်ရန်</translation>
 <translation id="6636588250634969791">ရှေ့မဆက်မီ ဆင်းမ်ကတ်ထည့်သွင်းပါ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 6135c11..97a78077 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -216,6 +216,7 @@
 <translation id="1234808891666923653">सेवा कामदार</translation>
 <translation id="1235458158152011030">ज्ञात नेटवर्कहरू</translation>
 <translation id="123578888592755962">डिस्क भरियो</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{पाठ}other{# वटा पाठ}}</translation>
 <translation id="1239594683407221485">Files अनुप्रयोगमार्फत यन्त्रको सामग्री अन्वेषण गर्नुहोस्।</translation>
 <translation id="124116460088058876">थप भाषाहरू</translation>
 <translation id="1241753985463165747">इन्भोक गरिएको बेला हालको वेबसाइटमा रहेका आफ्ना सम्पूर्ण डेटा पढ्नुहोस् र तिनीहरूलाई परिवर्तन गर्नुहोस्</translation>
@@ -438,6 +439,7 @@
 <translation id="1486096554574027028">खोज पासवर्डहरू</translation>
 <translation id="1487335504823219454">सक्रिय - आफू अनुकूल सेटिङहरू</translation>
 <translation id="1489664337021920575">अर्को विकल्प छनौट गर्नुहोस्</translation>
+<translation id="1490491397986065675">तपाईंका एड्मिनका अनुसार "<ph name="CUSTOM_MESSAGE" />"।</translation>
 <translation id="1492417797159476138">तपाईंले यो साइटका लागि यो युजरनेम सुरक्षित गरिसक्नुभएको छ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> लाई प्रतिक्षा गर्दै...</translation>
 <translation id="1495677929897281669">ट्याबमा फर्कनुहोस्</translation>
@@ -807,6 +809,7 @@
 <translation id="1879000426787380528">निम्न व्यक्तिका रूपमा साइन इन गर्नुहोस्</translation>
 <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" लाई मेटाउने?</translation>
 <translation id="1881445033931614352">किबोर्ड लेआउट</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{वस्तु}other{# वटा वस्तु}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" /> मध्ये नेटवर्क <ph name="NETWORK_INDEX" />, जोड्नुहोस्</translation>
 <translation id="1884340228047885921">हालको भिजिबिलिटी सेटिङ यस प्रकार छ: सम्पर्क सूचीमा भएका केही मान्छेहरू</translation>
 <translation id="1884705339276589024">Linux को डिस्कको आकार बदल्नुहोस्</translation>
@@ -985,6 +988,7 @@
 <translation id="2099686503067610784">सर्भर प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" मेटाउने?</translation>
 <translation id="2100273922101894616">स्वत: साइन-इन</translation>
 <translation id="2101225219012730419">संस्करण:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{फोन नम्बर}other{# वटा फोन नम्बर}}</translation>
 <translation id="211144231511833662">प्रकारहरू हटाउनुहोस्</translation>
 <translation id="2111670510994270194">दायाँपट्टि नयाँ ट्याब</translation>
 <translation id="21133533946938348">ट्याबलाई पिन गर्नुहोस्</translation>
@@ -1281,6 +1285,7 @@
 <translation id="2435457462613246316">पासवर्ड देखाउनुहोस्</translation>
 <translation id="2435579801172349831">सबै (<ph name="URL_COUNT" />) URL इन्कोग्निटो विन्डोमा खोल्नुहोस्</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> लाई सबै <ph name="PROTOCOL" /> लिङ्कहरू खोल्ने अनुमति दिने?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{एप}other{# वटा एप}}</translation>
 <translation id="2440604414813129000">स्रो&amp;त हेर्नुहोस्</translation>
 <translation id="244231003699905658">अमान्य ठेगाना कृपया उक्त ठेगानाको जाँच गरी फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="2442916515643169563">पाठको छायाँ</translation>
@@ -1429,6 +1434,7 @@
 <translation id="2604255671529671813">नेटवर्कको जडानसम्बन्धी त्रुटि</translation>
 <translation id="2606246518223360146">डेटा लिंक गर्नुहोस्</translation>
 <translation id="2606454609872547359">अहँ, ChromeVox सक्रिय नगरी अगाडि बढ्नुहोस्</translation>
+<translation id="2606568927909309675">अङ्ग्रेजी भाषाका अडियो तथा भिडियोमा क्याप्सनहरू स्वतः सिर्जना गर्छ। तपाईंको यन्त्रमा सधैँ अडियो सुन्न र क्याप्सनहरू हेर्न मिल्छ।</translation>
 <translation id="2607101320794533334">विषय सार्वजनिक कुञ्जी जानकारी</translation>
 <translation id="2609896558069604090">सर्टकटहरू सिर्जना गर्नुहोस्...</translation>
 <translation id="2609980095400624569">कनेक्ट गर्न सकिएन</translation>
@@ -1693,6 +1699,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">कृपया लिङ्क खोल्नुहोस्...</translation>
 <translation id="2889925978073739256">स्यान्डबक्स हटाइएका प्लगइनहरू रोक्न जारी राख्नुहोस्</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" /> मा साइन इन गर्न तपाईंको यन्त्र प्रयोग गर्ने हो?</translation>
 <translation id="2893168226686371498">पूर्वनिर्धारित ब्राउजर</translation>
 <translation id="2894757982205307093">समूहमा नयाँ ट्याब थप्नुहोस्</translation>
 <translation id="289644616180464099">SIM कार्ड लक गरिएको छ</translation>
@@ -2005,6 +2012,7 @@
 <translation id="3269069891205016797">तपाईं साइन आउट हुनुभएपछि यो यन्त्रमा भएको तपाईंको जानकारी हटाइने छ।</translation>
 <translation id="3269093882174072735">छवि लोड गर्नुहोस्</translation>
 <translation id="3269612321104318480">हल्का निलो-हरियो मिश्रित रङ्ग र सेतो</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{फाइल}other{# वटा फाइल}}</translation>
 <translation id="326999365752735949">डाउनलोडिङ भिन्नता</translation>
 <translation id="3270965368676314374">तपाईंको कम्प्युटरबाट तस्बिरहरू, सङ्गीत, र अन्य मिडियालाई पढ्नुहोस्, परिवर्तन गर्नुहोस् र मेटाउनुहोस्</translation>
 <translation id="327147043223061465">सबै कुकी र साइटको डेटा हेर्नुहोस्‌</translation>
@@ -2300,6 +2308,7 @@
 <translation id="3600792891314830896">आवाज प्ले गर्ने साइटहरूलाई म्युट गर्नुहोस्‌</translation>
 <translation id="360180734785106144">नयाँ सुविधाहरू उपलब्ध भएपछि प्रस्ताव गर्नुहोस्</translation>
 <translation id="3602290021589620013">पूर्वावलोकन</translation>
+<translation id="3602870520245633055">प्रिन्ट गर्नुहोस् र स्क्यान गर्नुहोस्</translation>
 <translation id="3603622770190368340">नेटवर्क प्रमाणपत्र हासिल गर्नुहोस्</translation>
 <translation id="3604193429970465812">सहायक खाताहरू</translation>
 <translation id="3604713164406837697">वालपेपर परिवर्तन गर्नुहोस्</translation>
@@ -2315,6 +2324,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> स्क्यान गरिँदै छ।</translation>
 <translation id="3616741288025931835">&amp;ब्राउजिङ लगत खालि गर्नुहोस्...</translation>
 <translation id="3617891479562106823">पृष्ठभूमिहरू उपलब्ध छैनन्। पछि फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{भिडियो}other{# वटा भिडियो}}</translation>
 <translation id="3619115746895587757">कापाचिनो</translation>
 <translation id="362333465072914957">CA ले प्रमाणपत्र जारी गर्ने प्रतीक्षा गर्दै</translation>
 <translation id="3624567683873126087">यन्त्र अनलक गरी Google खातामा साइन इन गर्नुहोस्।</translation>
@@ -2572,7 +2582,6 @@
 <translation id="3882165008614329320">क्यामेरा वा फाइलको विद्यमान भिडियो</translation>
 <translation id="3884152383786131369">एकभन्दा बढी भाषामा उपलब्ध वेब सामग्री यो सूचीको प्रयोग गर्न मिल्ने पहिलो भाषामा देखाइने छ। यी प्राथमिकताहरू तपाईंको ब्राउजरका सेटिङसँग सिंक गरिन्छन्। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">यो साइटमाथि पहुँच राख्ने तपाईंको अनुरोध <ph name="NAME" /> लाई पठाइएको छ</translation>
-<translation id="3888364689515978571">अफ छ। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> मार्फत टिपोट लिँदै</translation>
 <translation id="3890064827463908288">Wi-Fi सिंक प्रयोग गर्न Chrome सिंक अन गर्नुहोस्</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP थप्नुहोस्...</translation>
@@ -2655,7 +2664,6 @@
 <translation id="3958088479270651626">पृष्ठमञ्जूषाहरू र सेटिङहरू आयात गर्नुहोस्</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">सेलुलर नेटवर्क अफ गर्नुहोस्</translation>
-<translation id="3965730875470565266">अन छ, <ph name="MINUTES" /> मिनेटसम्मका लागि</translation>
 <translation id="3965811923470826124">यससँग</translation>
 <translation id="3965965397408324205">बाहिरिन निस्कनुहोस् <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">अर्को फोल्डर रोज्नुहोस्...</translation>
@@ -2725,6 +2733,7 @@
 <translation id="4047726037116394521">गृह स्क्रिनमा जानुहोस्</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{सम्पर्क सूचीमा भएको # जना व्यक्ति उपलब्ध हुनुहुन्न। वरपरका यन्त्रसँग सेयर गर्ने सुविधा प्रयोग गरी उहाँसँग सेयर गर्न आफ्नो सम्पर्क सूचीमा उहाँको Google खातासँग सम्बद्ध इमेल ठेगाना हाल्नुहोस्।}other{सम्पर्क सूचीमा भएका # जना व्यक्ति उपलब्ध छैनन्। वरपरका यन्त्रसँग सेयर गर्ने सुविधा प्रयोग गरी उनीहरूसँग सेयर गर्न आफ्नो सम्पर्क सूचीमा उनीहरूको Google खातासँग सम्बद्ध इमेल ठेगाना हाल्नुहोस्।}}</translation>
 <translation id="4050225813016893843">प्रमाणीकरण विधि</translation>
+<translation id="4050534976465737778">दुवै यन्त्र अनलक गरिएका छन्, एकअर्काको नजिकै छन् र दुवैको ब्लुटुथ अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्। तपाईं आफ्ना सम्पर्क ठेगानाहरूको सूचीमा नभएको कुनै Chromebook सँग सेयर गर्दै हुनुहुन्छ भने त्यसमा 'नजिकैका यन्त्रमा फेला पर्ने' सुविधा अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् (वस्तुस्थिति क्षेत्र खोल्नुहोस् र त्यसपछि 'नजिकैका यन्त्रमा फेला पर्ने' सुविधा अन गर्नुहोस्)। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">सानु</translation>
 <translation id="4054070260844648638">सबैजनाले देख्न सक्ने</translation>
 <translation id="4056908315660577142">तपाईं आफ्ना अभिभावकले <ph name="APP_NAME" /> Chrome एप कति समय प्रयोग गर्न पाउने भनी तोक्नुभएको समयको सीमामा पुग्नुभएको छ। तपाईं भोलि यो एप <ph name="TIME_LIMIT" /> प्रयोग गर्न सक्नुहुन्छ।</translation>
@@ -2959,6 +2968,7 @@
 <translation id="4364327530094270451">खरबुजो</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> एउटा विन्डोलाई साझेदारी गर्दैछ</translation>
 <translation id="4364830672918311045">सूचनाहरू देखाउनुहोस्</translation>
+<translation id="4366138410738374926">प्रिन्ट गर्ने कार्य सुरु भयो</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> सम्बन्धी सुझाव, योजना तथा अपडेटहरू प्राप्त गर्नुहोस् र प्रतिक्रिया दिनुहोस्। जुनसुकै बेला सदस्यता रद्द गर्नुहोस्।</translation>
 <translation id="4370425812909262207">कार्टहरू नदेखिने पारिएको छ। तपाईंले सेटिङ बदल्नुभयो भने ती कार्टहरू फेरि देखिने छन्।</translation>
 <translation id="4370975561335139969">तपाईँले प्रविष्टि गर्नुभएको इमेल र पासवर्ड मेल खाँदैनन्</translation>
@@ -3146,6 +3156,7 @@
 <translation id="4568025708905928793">सुरक्षा साँचो मागिँदै छ</translation>
 <translation id="4568213207643490790">माफ गर्नुहोस्, यस यन्त्रमा Google खाताहरूलाई अनुमति छैन।</translation>
 <translation id="4569747168316751899">निष्क्रिय भएको बेला</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{ठेगाना}other{# वटा ठेगाना}}</translation>
 <translation id="4570387585180509432">ठेगाना, फोन नम्बर र थप कुराहरू</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" मा जडान गर्दा प्रमाणीकरण रद्द भयो।</translation>
 <translation id="4572779512957829735">तपाईंको सुरक्षा साँचो प्रयोग गर्नका लागि उक्त PIN प्रविष्टि गर्नुहोस्</translation>
@@ -3205,6 +3216,7 @@
 <translation id="4635444580397524003">Linux को ब्याकअप सफलतापूर्वक पुनर्स्थापना गरिएको छ।</translation>
 <translation id="4636930964841734540">जानकारी</translation>
 <translation id="4637083375689622795">थप कारबाहीहरू, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{पाठ}other{# वटा पाठ}}</translation>
 <translation id="4638930039313743000">ADB डिबग प्रक्रिया सक्षम पार्नुहोस्</translation>
 <translation id="4641539339823703554">प्रणाली समय सेट गर्न Chrome असफल भयो। कृपया तल समय हेर्नुहोस् र आवश्यक भएको खण्डमा ठिक बनाउनुहोस्।</translation>
 <translation id="4642769377300286600">मोबाइल प्रोफाइल इन्स्टल गरिँदै छ। यो प्रोफाइल <ph name="NETWORK_PROVIDER_NAME" /> ले उपलब्ध गराएको <ph name="NETWORK_NAME" /> नेटवर्कको <ph name="NETWORK_COUNT" /> मध्ये <ph name="NETWORK_INDEX" /> औँ नेटवर्क हो।</translation>
@@ -3220,10 +3232,12 @@
 <translation id="4651484272688821107">डेमो मोडका स्रोतहरूमार्फत अनलाइन कम्पोनेन्ट लोड गर्न सकिएन।</translation>
 <translation id="4652935475563630866">क्यामेराको सेटिङमा गरिएका परिवर्तन लागू गर्न Parallels Desktop बन्द गरेर फेरि खोल्नु पर्ने हुन्छ। अगाडि बढ्नका निम्ति Parallels Desktop बन्द गरेर फेरि खोल्नुहोस्।</translation>
 <translation id="4653405415038586100">Linux कन्फिगर गर्ने क्रममा त्रुटि भयो</translation>
+<translation id="4654236001025007561">आफू वरपरका Chromebook तथा Android यन्त्रसँग फाइलहरू सेयर गर्नुहोस्</translation>
 <translation id="4657914796247705218">TrackPoint को गति</translation>
 <translation id="465878909996028221">ब्राउजर रिडिरेक्ट गर्न http, https तथा फाइल प्रोटोकललाई मात्र समर्थन गरिन्छ।</translation>
 <translation id="4659077111144409915">प्राथमिक खाता</translation>
 <translation id="4659126640776004816">तपाईंले आफ्नो Google खातामा साइन इन गर्दा यो सुविधा सक्रिय गरिन्छ।</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{फोटो}other{# वटा फोटो}}</translation>
 <translation id="4660476621274971848">अपेक्षित संस्करण "<ph name="EXPECTED_VERSION" />" हो, तर भएको संस्करण भने "<ph name="NEW_ID" />" छ</translation>
 <translation id="4660540330091848931">आकार बदल्दै</translation>
 <translation id="4661407454952063730">एपको डेटा भनेको सम्पर्क ठेगाना, सन्देश र तस्बिरहरू जस्ता डेटालगायत कुनै अनुप्रयोगले (विकासकर्ताका सेटिङहरूमा आधारित भएर) सुरक्षित गरेको कुनै पनि डेटा हुन सक्छ।</translation>
@@ -3324,6 +3338,7 @@
 <translation id="4794810983896241342"><ph name="BEGIN_LINK" />तपाईंका प्रशासक<ph name="END_LINK" /> ले अध्यावधिकसम्बन्धी काम गर्छन्</translation>
 <translation id="479536056609751218">वेबपृष्ठ, HTML मात्रै</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />ब्लुटुथ लगहरू<ph name="END_LINK" /> संलग्न गर्नुहोस् (Google आन्तरिक)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{वस्तु}other{# वटा वस्तु}}</translation>
 <translation id="4801448226354548035">खाताहरू लुकाउनुहोस्</translation>
 <translation id="4801512016965057443">मोबाइल डाटा रोमिङको लागि अनुमति दिनुहोस्</translation>
 <translation id="4804818685124855865">जडान विच्छेद</translation>
@@ -3754,6 +3769,7 @@
 <translation id="531118851858162334">तपाईंले यसअघि Google का सेवाहरू प्रयोग गरी गर्नुभएका क्रियाकलापका आधारमा तपाईं यो वस्तु देखिरहनुभएको छ। तपाईं <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> मा गई आफ्नो डेटा हेर्न, मेटाउन तथा सेटिङ परिवर्तन गर्न सक्नुहुन्छ।</translation>
 <translation id="5311304534597152726">यस रूपमा साइन इन गर्दै</translation>
 <translation id="5311565231560644461">साइटहरूलाई भर्चुअल रियालिटी चल्ने तपाईंका यन्त्रहरू र तिनमा भएका डेटा प्रयोग गर्न नदिनुहोस्</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{फोटो}other{# वटा फोटो}}</translation>
 <translation id="5314381603623123224">३१ मार्चदेखि Chrome को सेवाका सर्तहरू परिवर्तन हुँदै छन्</translation>
 <translation id="5315738755890845852">अतिरिक्त मझौला कोष्ठक: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">बचत गर्नुहोस्</translation>
@@ -3819,6 +3835,7 @@
 <translation id="5390677308841849479">गाढा रातो र सुन्तले</translation>
 <translation id="5390743329570580756">निम्न कार्यका लागि पठाउनुहोस्</translation>
 <translation id="5392192690789334093">सूचना पठाउने अनुमति दिइएका साइटहरू</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{लिंक}other{# वटा लिंक}}</translation>
 <translation id="5397794290049113714">तपाइँ</translation>
 <translation id="5398497406011404839">लुकाइएका बुकमार्कहरू</translation>
 <translation id="5398572795982417028">सीमा बाहिरको पृष्ठ सन्दर्भ, सीमा <ph name="MAXIMUM_PAGE" /> हो</translation>
@@ -4195,7 +4212,6 @@
 <translation id="5832813618714645810">प्रोफाइलहरू</translation>
 <translation id="583281660410589416">अज्ञात</translation>
 <translation id="5833397272224757657">यसले वैयक्तीकरण गर्ने प्रयोजनका लागि तपाईं जाने साइटका सामग्रीका साथै ब्राउजरसम्बन्धी क्रियाकलाप तथा अन्तर्क्रियाहरूको प्रयोग गर्छ</translation>
-<translation id="5833551944249825624">तपाईंको Chromebook ५ मिनेटसम्म वरपर रहेका सबैजनाले देख्ने छन्</translation>
 <translation id="5833726373896279253">यी सेटिङहरूलाई केवल मालिकले मात्र संशोधन गर्न सक्छ:</translation>
 <translation id="5834581999798853053">करीव <ph name="TIME" /> मिनेट बाँकी</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - क्यामेरा वा माइक्रोफोन मार्फत रेकर्डिङ</translation>
@@ -4345,6 +4361,7 @@
 <translation id="6011074160056912900">इथरनेट नेटवर्क</translation>
 <translation id="6011193465932186973">फिंगरप्रिन्ट</translation>
 <translation id="6011449291337289699">साइट सम्बन्धी डेटा खाली गर्नुहोस्</translation>
+<translation id="6013027779243312217">आफ्ना अडियो तथा भिडियोमा क्याप्सन देखाइने सुविधा प्राप्त गर्नुहोस्</translation>
 <translation id="6015796118275082299">वर्ष</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" /> वटा थप सामग्रीमध्ये <ph name="CURRENT_ELEMENT" /> औँ सामग्रीमा जानुहोस्</translation>
 <translation id="6016551720757758985">अघिल्लो संस्करणमा फिर्तीसँग Powerwash पुष्टि गर्नुहोस्</translation>
@@ -4854,6 +4871,7 @@
 <translation id="6605847144724004692">अझै पनि कुनै पनि प्रयोगकर्ताले मूल्याङ्कन गर्नुभएको छैन।</translation>
 <translation id="6607831829715835317">थप उपक&amp;रणहरू</translation>
 <translation id="6607890859198268021"><ph name="DOMAIN" /> ले पहिल्यैदेखि <ph name="USER_EMAIL" /> व्यवस्थापन गरिरहेको छ। कुनै अर्को Google खातामार्फत अभिभावकीय नियन्त्रणहरू प्रयोग गर्न सेटअप गरिसकेपछि साइन आउट गर्नुहोस् त्यसपछि साइन इन गर्ने स्क्रिनमा "व्यक्ति थप्नुहोस्" बटन चयन गर्नुहोस्।</translation>
+<translation id="6609478180749378879">तपाईं इन्कोग्निटो मोडबाट बाहिरिएपछि साइन इन गर्न चाहिने डेटा यो यन्त्रमा भण्डारण गरिने छ। तपाईं पछि आफ्नो यन्त्रमार्फत यो वेबसाइटमा फेरि साइन इन गर्न सक्नु हुने छ।</translation>
 <translation id="6611972847767394631">आफ्ना ट्याबहरू यहाँ फेला पार्नुहोस्</translation>
 <translation id="6612358246767739896">संरक्षित सामग्री</translation>
 <translation id="6615455863669487791">मलाई देखाउनुहोस्</translation>
@@ -4872,6 +4890,7 @@
 <translation id="6628328486509726751"><ph name="WEBRTC_LOG_UPLOAD_TIME" /> लाई अपलोड गरियो</translation>
 <translation id="6630043285902923878">USB यन्त्रहरू खोजिँदै छन्...</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" />ले तपाईँको तर्फबाटप्रमाणीकरणगर्न एउटा प्रमाणपत्रको स्थायी पहुँच गर्न चाहन्छ।</translation>
+<translation id="6635362468090274700">तपाईंको यन्त्रका सेटिङमा देखियोस् भन्ने विकल्प अन नगर्दासम्म कसैले पनि तपाईंसँग सामग्री सेयर गर्न सक्दैन।<ph name="BR" /><ph name="BR" />आफ्नो यन्त्र स्थायी रूपमा देखाउने बनाउन वस्तुस्थिति क्षेत्र खोल्नुहोस् अनि 'नजिकैका यन्त्रमा फेला पर्ने' सुविधा अन गर्नुहोस्।</translation>
 <translation id="6635944431854494329">मालिक सेटिङ &gt; उन्नत &gt; निदान र प्रयोगसम्बन्धी डेटा स्वतः Google लाई पठाउनुहोस् नामक सेटिङमा गएर यो सुविधा नियन्त्रण गर्न सक्छन्।</translation>
 <translation id="6635956300022133031">पाठवाचकका आवाजहरू चयन गर्नुहोस् र आफू अनुकूल पार्नुहोस्</translation>
 <translation id="6636588250634969791">अगाडि बढ्न SIM कार्ड हाल्नुहोस्</translation>
@@ -5023,6 +5042,7 @@
 <translation id="6811332638216701903">DHCP होस्टनेम</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> लाई रूटको रूपमा चलाउन सकिन्न।</translation>
 <translation id="6812841287760418429">परिवर्तनहरू राख्नुहोस्</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{फाइल}other{# वटा फाइल}}</translation>
 <translation id="6817174620439930047">कुनै साइटले MIDI यन्त्रहरूमाथि पहुँच गर्नका लागि प्रणालीका विशिष्ट सन्देशहरू प्रयोग गर्न खोज्दा सोध्नुहोस् (सिफारिस गरिएको)</translation>
 <translation id="6818198425579322765">अनुवाद गरिनु पर्ने पृष्ठको भाषा</translation>
 <translation id="6818802132960437751">अन्तर्निर्मित भाइरस प्रोटेक्सन</translation>
@@ -5043,6 +5063,7 @@
 <translation id="6835762382653651563">कृपया तपाईँको <ph name="DEVICE_TYPE" /> अद्यावधिक गर्न इन्टरनेटमा जडान गर्नुहोस्।</translation>
 <translation id="6838034009068684089">कुनै साइटले मेरा स्क्रिनहरूमा विन्डो राख्न र त्यहाँ भएका विन्डो खोल्न खोज्दा त्यसो गर्न दिने कि नदिने भनी सोधियोस् (सिफारिस गरिएको)</translation>
 <translation id="6838694093138907871">कोड अवैध छ, कृपया फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{फोन नम्बर}other{# वटा फोन नम्बर}}</translation>
 <translation id="6839225236531462745">प्रमाणपत्र मेटाइमा त्रुटी</translation>
 <translation id="6839916869147598086">साइन इन परिवर्तन गरिएको छ</translation>
 <translation id="6840155290835956714">पठाउनु अघि सोध्नुहोस्</translation>
@@ -5148,6 +5169,7 @@
 <translation id="6955446738988643816">पपअप निरीक्षण गर्नुहोस्</translation>
 <translation id="6955535239952325894">व्यवस्थापन गरिएका ब्राउजरहरूमा यो सेटिङ असक्षम पारिएको हुन्छ</translation>
 <translation id="6957044667612803194">यस सुरक्षा साँचोमा PIN हरू सेट गर्न मिल्दैन</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{लिंक}other{# वटा लिंक}}</translation>
 <translation id="6960507406838246615">Linux अपडेट गर्न आवश्यक छ</translation>
 <translation id="696103774840402661">यो <ph name="DEVICE_TYPE" /> का सबै प्रयोगकर्ताका सबै फाइल तथा स्थानीय डेटा सदाका लागि मेटाइएका छन्।</translation>
 <translation id="6964390816189577014">नायक</translation>
@@ -6057,6 +6079,7 @@
 <translation id="797394244396603170">आफूले फाइल सेयर गर्न चाहेको यन्त्र चयन गर्नुहोस्</translation>
 <translation id="7973962044839454485">गलत एक-पटके पाठ सन्देश वा पासवर्डको कारणले गर्दा PPP प्रमाणीकरण असफल भयो</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" /> प्रयोग गर्न पुनः प्रयास गर्नुहोस्</translation>
+<translation id="7974713334845253259">पूर्वनिर्धारित रङ</translation>
 <translation id="7974936243149753750">ओभरस्क्यान</translation>
 <translation id="7975504106303186033">तपाईंले अनिवार्य रूपमा यो Chrome Education यन्त्र कुनै शैक्षिक खातामा दर्ता गर्नु पर्छ। नयाँ खाता बनाउन कृपया g.co/workspace/edusignup मा जानुहोस्।</translation>
 <translation id="7978412674231730200">निजी कुञ्जी</translation>
@@ -6222,6 +6245,7 @@
 <translation id="8157704005178149728">सुपरिवेक्षण सेटअप गरिँदै</translation>
 <translation id="8158117992543756526">यो यन्त्रले <ph name="MONTH_AND_YEAR" /> देखि सफ्टवेयर र सुरक्षासम्बन्धी अद्यावधिकहरू स्वत: प्राप्त गर्न छाड्यो। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">प्रमाणपत्र विश्वास सेट गर्नमा त्रुटि</translation>
+<translation id="8160775796528709999">सेटिङमा गई लाइभ क्याप्सन अन गरेर आफ्ना अडियो तथा भिडियोमा क्याप्सन देखाइने सुविधा प्राप्त गर्नुहोस्</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">पाठक मोडमा वेब पृष्ठहरू पढ्ने सुविधा</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ट्याब सारेर नयाँ विन्डोमा लैजानुहोस्}other{ट्याबहरू सारेर नयाँ विन्डोमा लैजानुहोस्}}</translation>
@@ -6346,6 +6370,7 @@
 <translation id="8300011035382349091">यस ट्याबको पुस्तक चिन्ह सम्पादन गर्नुहोस्</translation>
 <translation id="8300374739238450534">Midnight Blue</translation>
 <translation id="8300849813060516376">OTASP असफल</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{ठेगाना}other{# वटा ठेगाना}}</translation>
 <translation id="8304383784961451596">तपाईंलाई यो यन्त्र प्रयोग गर्नेे अधिकार दिइएको छैन। कृपया साइन इन गर्ने अनुमति प्राप्त गर्न एड्मिनसँग सम्पर्क गर्नुहोस् वा Family Link मार्फत सुपरिवेक्षण गरिएको Google खाता प्रयोग गरी साइन इन गर्नुहोस्।</translation>
 <translation id="8308179586020895837">Ask if <ph name="HOST" /> wants to access your camera</translation>
 <translation id="830868413617744215">बेटा</translation>
@@ -6644,6 +6669,7 @@
 <translation id="867085395664725367">सर्भरसम्बन्धी अस्थायी त्रुटि भयो।</translation>
 <translation id="8673026256276578048">वेबमा खोज्नुहोस्...</translation>
 <translation id="8673383193459449849">सर्भर समस्या</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{भिडियो}other{# वटा भिडियो}}</translation>
 <translation id="8676374126336081632">आगत मेटाउनुहोस्</translation>
 <translation id="8676770494376880701">अल्प-पावर चार्जर जडित</translation>
 <translation id="8677212948402625567">सबै संकुचित पार्नुहोस्...</translation>
@@ -7069,6 +7095,7 @@
 <translation id="9128870381267983090">नेटवर्कमा जडान गर्नुहोस्</translation>
 <translation id="9130015405878219958">अवैध मोड प्रविष्ट गरियो।</translation>
 <translation id="9131487537093447019">ब्लूटुथ यन्त्रहरूबाट सन्देश पठाउनुहोस् र प्राप्त गर्नुहोस्।</translation>
+<translation id="9134119143784876218">अङ्ग्रेजी भाषाका अडियो तथा भिडियोमा क्याप्सनहरू स्वतः सिर्जना गर्नुहोस् (यो सुविधा हाल Chrome ब्राउजरमा मात्र उपलब्ध छ)। तपाईंको यन्त्रमा सधैँ अडियो सुन्न र क्याप्सनहरू हेर्न मिल्छ।</translation>
 <translation id="9137013805542155359">मूल देखाउनुहोस्</translation>
 <translation id="9137157311132182254">मन पराइएको सर्च इन्जिन</translation>
 <translation id="9137248913990643158">यस एपको प्रयोग गर्नुअघि कृपया Chrome सुरु गरी साइन इन गर्नुहोस्।</translation>
@@ -7116,6 +7143,7 @@
 <translation id="9179524979050048593">साइन इन गर्ने स्क्रिनमा देखाइने युजरनेम</translation>
 <translation id="9180281769944411366">यो प्रक्रियामा केही मिनेट लाग्न सक्छ। Linux कन्टेनर सुरु गर्दै।</translation>
 <translation id="9180380851667544951">साइटले तपाईंको स्क्रिन आदान प्रदान गर्न सक्छ</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{एप}other{# वटा एप}}</translation>
 <translation id="9186963452600581158">आफ्ना बच्चाको Google खाता प्रयोग गरी साइन इन गर्नुहोस्</translation>
 <translation id="9188732951356337132">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। यो यन्त्रले हाल निदान, यन्त्र र एपको उपयोगसम्बन्धी डेटा स्वतः Google मा पठाइरहेको छ। यस्तो डेटा तपाईंका बालकको पहिचान गर्ने प्रयोजनका लागि प्रयोग गरिने छैन र यसले प्रणाली तथा एपको स्थिरता र थप कुराहरू सुधार गर्न मद्दत गर्ने छ। केही एकीकृत डेटाले Google का एप तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छ। तपाईंका बालकको खातामा वेब तथा एपसम्बन्धी अतिरिक्त क्रियाकलापको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सुरक्षित गरिन सक्छ। <ph name="BEGIN_LINK2" />थप जान्नुहोस्<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">आफ्नो Android फोन सुरक्षा साँचोका रूपमा प्रयोग गर्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 1891fdf..647a69d 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2587,7 +2587,6 @@
 <translation id="3882165008614329320">Bestaande video van camera of uit bestand</translation>
 <translation id="3884152383786131369">Voor webcontent die in meerdere talen beschikbaar is, wordt de eerste ondersteunde taal in deze lijst gebruikt. Deze voorkeuren worden gesynchroniseerd met je browserinstellingen. <ph name="BEGIN_LINK_LEARN_MORE" />Meer informatie<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Je verzoek voor toegang tot deze website is verzonden naar <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Uit. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Notities maken met <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Chrome-synchronisatie inschakelen om wifi-synchronisatie te gebruiken</translation>
 <translation id="3892414795099177503">OpenVPN/L2TP toevoegen...</translation>
@@ -2671,7 +2670,6 @@
 <translation id="3958088479270651626">Bookmarks en instellingen importeren</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobiel netwerk uitschakelen</translation>
-<translation id="3965730875470565266">Aan, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Met</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> sluiten</translation>
 <translation id="3966072572894326936">Een andere map kiezen...</translation>
@@ -4221,7 +4219,6 @@
 <translation id="5832813618714645810">Profielen</translation>
 <translation id="583281660410589416">Onbekend</translation>
 <translation id="5833397272224757657">Maakt gebruik van content op sites die je bezoekt en browseractiviteit en -interactie voor personalisatie</translation>
-<translation id="5833551944249825624">Je Chromebook is 5 minuten lang zichtbaar voor iedereen in de buurt</translation>
 <translation id="5833726373896279253">Deze instellingen kunnen alleen worden aangepast door de eigenaar:</translation>
 <translation id="5834581999798853053">Ongeveer <ph name="TIME" /> minuten resterend</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: camera of microfoon neemt op</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index f2bd607..faae6a0 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">Kopier nettadresse</translation>
 <translation id="2155772377859296191">Ser ut som <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Kjør sikkerhetssjekken på nytt</translation>
 <translation id="2157474325782140681">For å få flere funksjoner, bruk en Dell-dokkingstasjon som er laget for å fungere sammen med denne Chromebooken.</translation>
 <translation id="215753907730220065">Avslutt fullskjermmodus</translation>
 <translation id="2157875535253991059">Denne siden vises nå i full skjerm.</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Signering med kode</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Sikkerhetskopiér Linux-apper og -filer</translation>
+<translation id="3238192140106069382">Kobler til og verifiserer</translation>
 <translation id="3239373508713281971">Tidsgrensen er fjernet for <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Velg rotkatalogen til utvidelsen som skal pakkes. Hvis du vil oppdatere en utvidelse, velger du også den private nøkkelfilen.</translation>
 <translation id="3244294424315804309">Fortsett med å kutte lyden</translation>
@@ -2582,7 +2584,6 @@
 <translation id="3882165008614329320">Eksisterende video fra kamera eller fil</translation>
 <translation id="3884152383786131369">Nettinnhold som er tilgjengelig på flere språk, bruker det første språket på denne listen som støttes. Disse preferansene synkroniseres med nettleserinnstillingene dine. <ph name="BEGIN_LINK_LEARN_MORE" />Finn ut mer<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Forespørselen din om å få tilgang til dette nettstedet er sendt til <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Av. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Tar notater med <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Slå på Chrome-synkronisering for å bruke Wi-Fi-synkronisering</translation>
 <translation id="3892414795099177503">Legg til OpenVPN/L2TP</translation>
@@ -2664,7 +2665,6 @@
 <translation id="3958088479270651626">Importér bokmerker og innstillinger</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Slå av mobildata</translation>
-<translation id="3965730875470565266">På, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Med</translation>
 <translation id="3965965397408324205">Gå ut av <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Velg en annen mappe...</translation>
@@ -4214,7 +4214,6 @@
 <translation id="5832813618714645810">Profiler</translation>
 <translation id="583281660410589416">Ukjent</translation>
 <translation id="5833397272224757657">Bruker innhold fra nettsteder du besøker, nettleseraktivitet og andre interaksjoner for å gi ting et personlig preg</translation>
-<translation id="5833551944249825624">Chromebooken din blir synlig for alle i nærheten i fem minutter</translation>
 <translation id="5833726373896279253">Disse innstillingene kan bare modifiseres av eieren:</translation>
 <translation id="5834581999798853053">Omtrent <ph name="TIME" /> minutter igjen</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kamera- eller mikrofonopptak</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 54df0bc..aa5e4d57 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -217,6 +217,7 @@
 <translation id="1234808891666923653">ServiceWorkers</translation>
 <translation id="1235458158152011030">ଜଣାଶୁଣା ନେଟ୍‌ୱାର୍କ</translation>
 <translation id="123578888592755962">ଡିସ୍କ ପୂର୍ଣ୍ଣ ଅଛି</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{ଟେକ୍ସଟ୍}other{#ଟି ଟେକ୍ସଟ୍}}</translation>
 <translation id="1239594683407221485">Files ଆପ୍‌ରେ ଡିଭାଇସ୍‌ର ବିଷୟବସ୍ତୁ ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ।</translation>
 <translation id="124116460088058876">ଅନେକ ଭାଷା</translation>
 <translation id="1241753985463165747">ଲାଗୁ କରାଗଲେ ସାମ୍ପ୍ରତିକ ୱେବ୍‍ସାଇଟ୍‍‍ରେ ଆପଣଙ୍କ ଡାଟା ପଢ଼ନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ</translation>
@@ -439,6 +440,7 @@
 <translation id="1486096554574027028">ପାସ୍‌ୱର୍ଡ ସନ୍ଧାନ କରନ୍ତୁ</translation>
 <translation id="1487335504823219454">ଅନ୍ - କଷ୍ଟମ୍ ସେଟିଂସ୍</translation>
 <translation id="1489664337021920575">ଅନ୍ୟ ଏକ ବିକଳ୍ପ ବାଛନ୍ତୁ</translation>
+<translation id="1490491397986065675">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ କହନ୍ତି "<ph name="CUSTOM_MESSAGE" />"।</translation>
 <translation id="1492417797159476138">ଆପଣ ଏହି ସାଇଟ୍ ପାଇଁ ଏହି ଉପଯୋଗକର୍ତ୍ତାନାମ ପୂର୍ବରୁ ସେଭ୍ କରିଛନ୍ତି</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> ପାଇଁ ଅପେକ୍ଷାରତ...</translation>
 <translation id="1495677929897281669">ଟାବ୍‌କୁ ଫେରନ୍ତୁ</translation>
@@ -805,6 +807,7 @@
 <translation id="1879000426787380528">ଏହିପରି ଭାବରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
 <translation id="1880905663253319515">ସାର୍ଟିଫିକେଟ୍ "<ph name="CERTIFICATE_NAME" />" ଡିଲିଟ୍ କରିବେ କି?</translation>
 <translation id="1881445033931614352">କୀବୋର୍ଡ ଲେଆଉଟ୍</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{ଆଇଟମ୍}other{#ଟି ଆଇଟମ୍}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_COUNT" />ଟିର <ph name="NETWORK_INDEX" /> ନେଟ୍‌ୱାର୍କ, <ph name="NETWORK_NAME" /> ସଂଯୋଗ କରନ୍ତୁ</translation>
 <translation id="1884340228047885921">ବର୍ତ୍ତମାନର ଭିଜିବିଲିଟୀ ସେଟିଂସ୍ ହେଉଛି କିଛି ଯୋଗାଯୋଗ</translation>
 <translation id="1884705339276589024">Linux ଡିସ୍କର ଆକାର ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation>
@@ -983,6 +986,7 @@
 <translation id="2099686503067610784">ସର୍ଭର୍ ସାର୍ଟିଫିକେଟ୍ "<ph name="CERTIFICATE_NAME" />" ଡିଲିଟ୍ କରିବେ କି?</translation>
 <translation id="2100273922101894616">ସ୍ୱତଃ ସାଇନ୍-ଇନ୍‌</translation>
 <translation id="2101225219012730419">ସଂସ୍କରଣ:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{ଫୋନ୍ ନମ୍ବର}other{#ଟି ଫୋନ୍ ନମ୍ବର}}</translation>
 <translation id="211144231511833662">ପ୍ରକାରଗୁଡ଼ିକୁ ଖାଲି କରନ୍ତୁ</translation>
 <translation id="2111670510994270194">ଡାହାଣ ପଟରେ ନୂଆ ଟାବ୍</translation>
 <translation id="21133533946938348">ଟାବ୍ ପିନ୍ କରନ୍ତୁ</translation>
@@ -1278,6 +1282,7 @@
 <translation id="2435457462613246316">ପାସୱାର୍ଡ ଦେଖାନ୍ତୁ</translation>
 <translation id="2435579801172349831">ସମସ୍ତ (<ph name="URL_COUNT" />)ଟି URL ଇନକଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation>
 <translation id="2436186046335138073">ସମସ୍ତ <ph name="PROTOCOL" /> ଲିଙ୍କ୍ ଖୋଲିବା ପାଇଁ <ph name="HANDLER_HOSTNAME" />କୁ ଅନୁମତି ଦେବେ?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{ଆପ୍}other{#ଟି ଆପ୍}}</translation>
 <translation id="2440604414813129000">ଉ&amp;ତ୍ସ ଦର୍ଶନ୍ କରନ୍ତୁ</translation>
 <translation id="244231003699905658">ଅବୈଧ ଠିକଣା। ଦୟାକରି ଠିକଣା ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="2442916515643169563">ଟେକ୍ସଟ ଶାଡୋ</translation>
@@ -1426,6 +1431,7 @@
 <translation id="2604255671529671813">ନେଟ୍‍ୱାର୍କ ସଂଯୋଗରେ ତ୍ରୁଟି</translation>
 <translation id="2606246518223360146">ଡାଟା ଲିଙ୍କ୍‍ କରନ୍ତୁ</translation>
 <translation id="2606454609872547359">ନା, ChromeVox ବିନା ଜାରି ରଖନ୍ତୁ</translation>
+<translation id="2606568927909309675">ଇଂରାଜୀ ଅଡିଓ ଏବଂ ଭିଡିଓ ପାଇଁ ସ୍ୱଚାଳିତ ଭାବେ କ୍ୟାପ୍ସନଗୁଡ଼ିକ ତିଆରି କରେ। ଅଡିଓ ଏବଂ କ୍ୟାପ୍ସନଗୁଡ଼ିକୁ କେବେ ବି ଆପଣଙ୍କ ଡିଭାଇସରୁ କାଢ଼ି ଦିଆଯାଏ ନାହିଁ।</translation>
 <translation id="2607101320794533334">ବିଷୟ ସାର୍ବଜନିକ କୀ ସୂଚନା</translation>
 <translation id="2609896558069604090">ସର୍ଟକଟ୍‌ ତିଆରି କରନ୍ତୁ...</translation>
 <translation id="2609980095400624569">ସଂଯୋଗ ସ୍ଥାପନ କରାଯାଇପାରିଲା ନାହିଁ</translation>
@@ -1690,6 +1696,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">ଏହା ମାଧ୍ୟମରେ ଲିଙ୍କ୍‌ ଖୋଲନ୍ତୁ...</translation>
 <translation id="2889925978073739256">ଅନ୍‌ସ୍ୟାଣ୍ଡବକ୍ସ ହୋ‍ଇଥିବା ପ୍ଲଗଇନ୍‌ଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରିବା ଜାରି ରଖନ୍ତୁ</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" />ରେ ସାଇନ୍ ଇନ୍ କରିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ବ୍ୟବହାର କରିବେ?</translation>
 <translation id="2893168226686371498">ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍‌</translation>
 <translation id="2894757982205307093">ଗୋଷ୍ଠୀରେ ନୂଆ ଟାବ୍</translation>
 <translation id="289644616180464099">SIM କାର୍ଡ ଲକ୍ ହୋଇଯାଇଛି</translation>
@@ -2001,6 +2008,7 @@
 <translation id="3269069891205016797">ଆପଣ ଯେତେବେଳେ ସାଇନ୍ ଆଉଟ୍ କରିବେ ସେତେବେଳେ ଆପଣଙ୍କର ସୂଚନା ଡିଭାଇସ୍‌ରୁ କାଢ଼ି ଦିଆଯିବ।</translation>
 <translation id="3269093882174072735">ଛବିକୁ ଲୋଡ୍ କରନ୍ତୁ</translation>
 <translation id="3269612321104318480">ହାଲୁକା ଟିଲ୍ ଓ ଧଳା</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{ଫାଇଲ୍}other{#ଟି ଫାଇଲ୍}}</translation>
 <translation id="326999365752735949">diff ଡାଉନ୍‍‍ଲୋଡ୍ ହେଉଛି</translation>
 <translation id="3270965368676314374">ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର୍‍ରୁ ଫଟୋ, ସଙ୍ଗୀତ ଓ ଅନ୍ୟ ମିଡିଆ ପଢ଼ନ୍ତୁ, ପରିବର୍ତ୍ତନ କରନ୍ତୁ ଏବଂ ଡିଲିଟ୍ କରନ୍ତୁ</translation>
 <translation id="327147043223061465">ସମସ୍ତ କୁକୀସ୍ ଓ ସାଇଟ୍ ଡାଟା ଦେଖନ୍ତୁ</translation>
@@ -2296,6 +2304,7 @@
 <translation id="3600792891314830896">ଯେଉଁ ୱେବ୍‌ସାଇଟ୍‌ଗୁଡ଼ିକରେ ସାଉଣ୍ଡ ଚାଲୁଛି ସେଗୁଡ଼ିକୁ ମ୍ୟୁଟ୍ କରନ୍ତୁ</translation>
 <translation id="360180734785106144">ଉପଲବ୍ଧ ହେବା ପରେ ନୂତନ ବୈଶିଷ୍ଟ୍ୟ ଅଫର୍ କରନ୍ତୁ</translation>
 <translation id="3602290021589620013">ପ୍ରିଭ୍ୟୁ</translation>
+<translation id="3602870520245633055">ପ୍ରିଣ୍ଟ କରନ୍ତୁ ଏବଂ ସ୍କାନ୍ କରନ୍ତୁ</translation>
 <translation id="3603622770190368340">ନେଟ୍‍ୱାର୍କ ସାର୍ଟିଫିକେଟ୍ ପ୍ରାପ୍ତ କରନ୍ତୁ</translation>
 <translation id="3604193429970465812">ଦ୍ୱିତୀୟ ଆକାଉଣ୍ଟଗୁଡ଼ିକ</translation>
 <translation id="3604713164406837697">ୱାଲପେପର୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation>
@@ -2311,6 +2320,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" />ର ସ୍କାନ୍ କରାଯାଉଛି।</translation>
 <translation id="3616741288025931835">&amp;ବ୍ରାଉଜିଂ ଡାଟା ଖାଲି କରନ୍ତୁ...</translation>
 <translation id="3617891479562106823">ପୃଷ୍ଠଭୂମି ଉପଲବ୍ଧ ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{ଭିଡିଓ}other{#ଟି ଭିଡିଓ}}</translation>
 <translation id="3619115746895587757">କ୍ୟାପାଚିନୋ</translation>
 <translation id="362333465072914957">ଏକ ସାର୍ଟିଫିକେଟ୍ ଜାରି କରିବାକୁ CA ପାଇଁ ଅପେକ୍ଷା କରାଯାଉଛି</translation>
 <translation id="3624567683873126087">ଡିଭାଇସ୍ ଅନ୍‌ଲକ୍ କରନ୍ତୁ ଏବଂ Google ଆକାଉଣ୍ଟକୁ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
@@ -2568,7 +2578,6 @@
 <translation id="3882165008614329320">କ୍ୟାମେରା କିମ୍ବା ଫାଇଲ୍‌ରେ ପୂର୍ବରୁ ଥିବା ଭିଡିଓ</translation>
 <translation id="3884152383786131369">ଏକାଧିକ ଭାଷାରେ ଉପଲବ୍ଧ ୱେବ୍ ବିଷୟବସ୍ତୁ ଏହି ତାଲିକାରୁ ପ୍ରଥମ ସମର୍ଥିତ ଭାଷାକୁ ବ୍ୟବହାର କରିବ। ଆପଣଙ୍କ ବ୍ରାଉଜର୍ ସେଟିଂସ୍ ସହିତ ଏହି ପସନ୍ଦଗୁଡ଼ିକୁ ସିଙ୍କ୍ କରାଯାଇଛି। <ph name="BEGIN_LINK_LEARN_MORE" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ଏହି ସାଇଟ୍‌କୁ ଆକ୍ସେସ୍‌ କରିବାକୁ ଆପଣଙ୍କର ଅନୁରୋଧ <ph name="NAME" />ଙ୍କୁ ପଠାଯାଇଛି</translation>
-<translation id="3888364689515978571">ବନ୍ଦ ଅଛି। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />ରୁ ନୋଟ୍‌ ନେବା</translation>
 <translation id="3890064827463908288">ୱାଇ-ଫାଇ ସିଙ୍କ୍ ବ୍ୟବହାର କରିବାକୁ Chrome ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ଯୋଗ କରନ୍ତୁ...</translation>
@@ -2651,7 +2660,6 @@
 <translation id="3958088479270651626">ବୁକ୍‌ମାର୍କ୍‌ସ ଏବଂ ସେଟିଂସ୍‌କୁ ଇମ୍ପୋର୍ଟ କରନ୍ତୁ</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ସେଲ୍ୟୁଲାର୍ ନେଟୱାର୍କ ବନ୍ଦ କରନ୍ତୁ</translation>
-<translation id="3965730875470565266">ଚାଲୁ ଅଛି, <ph name="MINUTES" /> ମିନିଟ୍</translation>
 <translation id="3965811923470826124">ଏହା ସହିତ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />ରୁ ପ୍ରସ୍ଥାନ କରନ୍ତୁ</translation>
 <translation id="3966072572894326936">ଅନ୍ୟ ଫୋଲ୍ଡର୍ ଚୟନ କରନ୍ତୁ...</translation>
@@ -2721,6 +2729,7 @@
 <translation id="4047726037116394521">ମୂଳପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{#ଟି ଯୋଗାଯୋଗ ଉପଲବ୍ଧ ନାହିଁ। ସେମାନଙ୍କ ସହ Nearby Share ବ୍ୟବହାର କରିବାକୁ, ଆପଣଙ୍କ ଯୋଗାଯୋଗରେ ସେମାନଙ୍କ Google ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ ଇମେଲ୍ ଠିକଣାଗୁଡ଼ିକୁ ଯୋଗ କରନ୍ତୁ।}other{#ଟି ଯୋଗାଯୋଗ ଉପଲବ୍ଧ ନାହିଁ। ସେମାନଙ୍କ ସହ Nearby Share ବ୍ୟବହାର କରିବାକୁ, ଆପଣଙ୍କ ଯୋଗାଯୋଗରେ ସେମାନଙ୍କ Google ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ ଇମେଲ୍ ଠିକଣାଗୁଡ଼ିକୁ ଯୋଗ କରନ୍ତୁ।}}</translation>
 <translation id="4050225813016893843">ପ୍ରାମାଣିକତା ପଦ୍ଧତି</translation>
+<translation id="4050534976465737778">ଉଭୟ ଡିଭାଇସକୁ ଅନଲକ୍ କରାଯାଇଛି, ସେଗୁଡ଼ିକ ପାଖାପାଖି ରହିଛି ଏବଂ ବ୍ଲୁଟୁଥ୍ ଚାଲୁ ଅଛି ବୋଲି ସୁନିଶ୍ଚିତ କରନ୍ତୁ। ଯଦି ଆପଣ ଆପଣଙ୍କ ଯୋଗାଯୋଗରେ ନଥିବା ଏକ Chromebook ସହ ସେୟାର୍ କରୁଛନ୍ତି, ତେବେ ସେଥିରେ Nearby ଭିଜିବିଲିଟୀ ଚାଲୁ କରାଯାଇଛି ବୋଲି ସୁନିଶ୍ଚିତ କରନ୍ତୁ (ସ୍ଥିତି କ୍ଷେତ୍ର ଖୋଲନ୍ତୁ, ତା'ପରେ Nearby ଭିଜିବିଲିଟୀ ଚାଲୁ କରନ୍ତୁ)। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">ଛୋଟ</translation>
 <translation id="4054070260844648638">ସମସ୍ତଙ୍କୁ ଦୃଶ୍ୟମାନ ହେବ</translation>
 <translation id="4056908315660577142"><ph name="APP_NAME" /> Chrome ଆପ୍ ପାଇଁ ଆପଣଙ୍କ ବାପାମା ସେଟ୍ କରିଥିବା ସମୟ ସୀମାରେ ଆପଣ ପହଞ୍ଚି ଯାଇଛନ୍ତି। ଆପଣ ଏହାକୁ ଆସନ୍ତାକାଲି <ph name="TIME_LIMIT" /> ପାଇଁ ବ୍ୟବହାର କରିପାରିବେ।</translation>
@@ -2955,6 +2964,7 @@
 <translation id="4364327530094270451">ମେଲୋନ୍</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ଏକ ୱିଣ୍ଡୋ ସେୟାର୍ କରୁଛି।</translation>
 <translation id="4364830672918311045">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପ୍ରଦର୍ଶନ କରନ୍ତୁ</translation>
+<translation id="4366138410738374926">ପ୍ରିଣ୍ଟିଂ ଆରମ୍ଭ ହୋଇଛି</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ପରାମର୍ଶ, ଅଫର୍ ଓ ଅପଡେଟଗୁଡ଼ିକ ପାଆନ୍ତୁ ଏବଂ ମତାମତ ସେୟାର୍ କରନ୍ତୁ। ଯେ କୌଣସି ସମୟରେ ସଦସ୍ୟତା ତ୍ୟାଗ କରନ୍ତୁ।</translation>
 <translation id="4370425812909262207">କାର୍ଟଗୁଡ଼ିକ ଲୁକ୍କାୟିତ ଅଛି। ଯେତେବେଳେ ଆପଣ ପରିବର୍ତ୍ତନ କରିବେ ସେଗୁଡ଼ିକ ପୁଣି ଦେଖାଯିବ।</translation>
 <translation id="4370975561335139969">ଆପଣ ଲେଖିଥିବା ଇମେଲ୍ ଓ ପାସ୍‍ୱର୍ଡ ମେଳ ହେଉନାହିଁ</translation>
@@ -3142,6 +3152,7 @@
 <translation id="4568025708905928793">ଏକ ସୁରକ୍ଷା କୀ ଅନୁରୋଧ କରାଯାଇଛି</translation>
 <translation id="4568213207643490790">କ୍ଷମା କରିବେ, ଏହି ଡିଭାଇସ୍‌ରେ Google ଆକାଉଣ୍ଟଗୁଡ଼ିକର ଅନୁମତି ନାହିଁ।</translation>
 <translation id="4569747168316751899">ଯେତେବେଳେ ନିଷ୍କ୍ରିୟ ଅଛି</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{ଠିକଣା}other{#ଟି ଠିକଣା}}</translation>
 <translation id="4570387585180509432">ଠିକଣା, ଫୋନ୍‍ ନମ୍ବର୍ ଏବଂ ଆହୁରି ଅନେକ କିଛି</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />"ରେ ସଂଯୋଗ କରିବା ସମୟରେ ପ୍ରମାଣିକିକରଣ ବାତିଲ ହୋଇଛି।</translation>
 <translation id="4572779512957829735">ଆପଣଙ୍କର ସୁରକ୍ଷା କୀ ପାଇଁ ପିନ୍ ଲେଖନ୍ତୁ</translation>
@@ -3201,6 +3212,7 @@
 <translation id="4635444580397524003">Linux ବ୍ୟାକଅପ୍ ସଫଳତାର ସହ ରିଷ୍ଟୋର୍ କରାଯାଇଛି।</translation>
 <translation id="4636930964841734540">ସୂଚନା</translation>
 <translation id="4637083375689622795">ଅଧିକ ପଦକ୍ଷେପ, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{ଟେକ୍ସଟ୍}other{#ଟି ଟେକ୍ସଟ୍}}</translation>
 <translation id="4638930039313743000">ADB ଡିବଗିଂ ସକ୍ଷମ କରନ୍ତୁ</translation>
 <translation id="4641539339823703554">Chrome ସିଷ୍ଟମ୍ ସମୟ ସେଟ୍ କରିପାରିଲା ନାହିଁ। ଦୟାକରି ନିମ୍ନୋକ୍ତ ସମୟ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ଯଦି ଆବଶ୍ୟକ ଥାଏ ତେବେ ଏହାକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ।</translation>
 <translation id="4642769377300286600">ମୋବାଇଲ ପ୍ରୋଫାଇଲ୍, <ph name="NETWORK_COUNT" />ର ନେଟୱାର୍କ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> ଇନଷ୍ଟଲ୍ କରାଯାଉଛି</translation>
@@ -3216,10 +3228,12 @@
 <translation id="4651484272688821107">ଡେମୋ ମୋଡ୍ ସାଧନଗୁଡ଼ିକ ସହିତ ଅନ୍‌ଲାଇନ୍ କମ୍ପୋନେଟ୍ ଲୋଡ୍ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
 <translation id="4652935475563630866">କ୍ୟାମେରା ସେଟିଂରେ ହୋଇଥିବା ପରିବର୍ତ୍ତନ Parallels Desktopକୁ ପୁଣି ଲଞ୍ଚ କରିବା ଆବଶ୍ୟକ କରେ। ଆଗକୁ ବଢ଼ିବା ପାଇଁ Parallels Desktop ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ।</translation>
 <translation id="4653405415038586100">Linux କନଫିଗର୍ କରାଯାଉଥିବା ସମୟରେ ଏକ ତ୍ରୁଟି</translation>
+<translation id="4654236001025007561">ଆପଣଙ୍କ ଆଖପାଖରେ ଥିବା Chromebook ଏବଂ Android ଡିଭାଇସଗୁଡ଼ିକ ସହ ଫାଇଲଗୁଡ଼ିକ ସେୟାର୍ କରନ୍ତୁ</translation>
 <translation id="4657914796247705218">TrackPoint ସ୍ପିଡ୍</translation>
 <translation id="465878909996028221">କେବଳ http, ବ୍ରାଉଜର୍ ରିଡାଇରେକ୍ଟ ପାଇଁ https ଏବଂ ଫାଇଲ୍ ପ୍ରୋଟୋକଲ୍‍ଗୁଡ଼ିକ ସମର୍ଥିତ ଅଟେ।</translation>
 <translation id="4659077111144409915">ପ୍ରାଥମିକ ଆକାଉଣ୍ଟ</translation>
 <translation id="4659126640776004816">ଆପଣ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ସାଇନ୍ ଇନ୍ କଲେ ଏହି ଫିଚର୍ ଚାଲୁ ହୁଏ।</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{ଛବି}other{#ଟି ଛବି}}</translation>
 <translation id="4660476621274971848">ଆଶା କରାଯାଉଥିବା ସଂସ୍କରଣ "<ph name="EXPECTED_VERSION" />" ଅଛି, କିନ୍ତୁ ସଂସ୍କରଣ "<ph name="NEW_ID" />" ଥିଲା</translation>
 <translation id="4660540330091848931">ଆକାର ପରିବର୍ତ୍ତନ କରାଯାଉଛି</translation>
 <translation id="4661407454952063730">ଆପ୍ ଡାଟା, ଯୋଗାଯୋଗ, ମେସେଜ୍ ଓ ଫଟୋଗୁଡ଼ିକ ପରି ଡାଟା ସମେତ ଏକ ଆପ୍ ସେଭ୍ କରିଥିବା (ଡେଭଲପର୍ ସେଟିଂସ୍ ଉପରେ ଆଧାରିତ) ଯେ କୌଣସି ଡାଟା ହୋଇପାରିବ।</translation>
@@ -3320,6 +3334,7 @@
 <translation id="4794810983896241342">ଅପଡେଟଗୁଡ଼ିକ <ph name="BEGIN_LINK" />ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର<ph name="END_LINK" />ଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି</translation>
 <translation id="479536056609751218">ୱେବ୍‌ପୃଷ୍ଠା, କେବଳ HTML</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />ବ୍ଲୁଟୁଥ୍ ଲଗ୍‌ଗୁଡ଼ିକ<ph name="END_LINK" /> ଯୋଗ କରନ୍ତୁ (Google ଇଣ୍ଟର୍ନଲ୍)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{ଆଇଟମ୍}other{#ଟି ଆଇଟମ୍}}</translation>
 <translation id="4801448226354548035">ଆକାଉଣ୍ଟଗୁଡ଼ିକ ଲୁଚାନ୍ତୁ</translation>
 <translation id="4801512016965057443">ମୋବାଇଲ୍ ଡାଟା ରୋମିଂକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation>
 <translation id="4804818685124855865">ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ</translation>
@@ -3750,6 +3765,7 @@
 <translation id="531118851858162334">Google ସେବାଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ପୂର୍ବ କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ ଆପଣ ଏହି ଆଇଟମକୁ ଦେଖୁଛନ୍ତି। ଆପଣ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />ରେ ଆପଣଙ୍କ ଡାଟାକୁ ଦେଖିପାରିବେ, ତାହାକୁ ଡିଲିଟ୍ କରିପାରିବେ ଏବଂ ଆପଣଙ୍କ ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation>
 <translation id="5311304534597152726">ଏପରି ଭାବରେ ସାଇନ୍‌ ଇନ୍‌ ହେଉଛି</translation>
 <translation id="5311565231560644461">ସାଇଟଗୁଡ଼ିକୁ ଆପଣଙ୍କର ଭର୍ଚୁଆଲ୍ ରିଆଲିଟୀ ଡିଭାଇସ୍ ଏବଂ ଡାଟା ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{ଛବି}other{#ଟି ଛବି}}</translation>
 <translation id="5314381603623123224">Chromeର ସେବାର ସର୍ତ୍ତାବଳୀ ମାର୍ଚ୍ଚ 31ରୁ ବଦଳିବାକୁ ଯାଉଛି</translation>
 <translation id="5315738755890845852">ଅତିରିକ୍ତ କୁଟିଳ ବନ୍ଧନୀ: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">ସଞ୍ଚୟ</translation>
@@ -3815,6 +3831,7 @@
 <translation id="5390677308841849479">ଗାଢ଼ ଲାଲ ଓ କମଳା</translation>
 <translation id="5390743329570580756">ଏହା ପାଇଁ ପଠାନ୍ତୁ</translation>
 <translation id="5392192690789334093">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପଠାଇବାକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{ଲିଙ୍କ୍}other{#ଟି ଲିଙ୍କ୍}}</translation>
 <translation id="5397794290049113714">ଆପଣ</translation>
 <translation id="5398497406011404839">ଲୁକ୍କାୟିତ ବୁକମାର୍କଗୁଡ଼ିକ</translation>
 <translation id="5398572795982417028">ସୀମା ବାହାର ପୃଷ୍ଠାର ସନ୍ଦର୍ଭ, ସୀମା <ph name="MAXIMUM_PAGE" /> ଅଟେ</translation>
@@ -4192,7 +4209,6 @@
 <translation id="5832813618714645810">ପ୍ରୋଫାଇଲଗୁଡ଼ିକ</translation>
 <translation id="583281660410589416">ଅଜ୍ଞାତ</translation>
 <translation id="5833397272224757657">ବ୍ୟକ୍ତିଗତକରଣ ପାଇଁ ଆପଣ ଦେଖିଥିବା ସାଇଟ୍‌ଗୁଡ଼ିକର ବିଷୟବସ୍ତୁ ଏବଂ ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପ ଓ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ବ୍ୟବହାର କରେ।</translation>
-<translation id="5833551944249825624">ଆପଣଙ୍କ Chromebook 5 ମିନିଟ୍ ପାଇଁ ଆଖପାଖରେ ଥିବା ସମସ୍ତଙ୍କୁ ଦୃଶ୍ୟମାନ ହେବ</translation>
 <translation id="5833726373896279253">ଏହି ସେଟିଂସ୍‌ଗୁଡ଼ିକ କେବଳ ମାଲିକଙ୍କ ଦ୍ୱାରା ସଂଶୋଧିତ ହୋ‍ଇପାରେ:</translation>
 <translation id="5834581999798853053">ପାଖାପାଖି <ph name="TIME" /> ମିନିଟ୍ ବାକି ଅଛି</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - କ୍ୟାମେରା କିମ୍ବା ମାଇକ୍ରୋଫୋନ୍ ରେକର୍ଡିଂ</translation>
@@ -4343,6 +4359,7 @@
 <translation id="6011074160056912900">ଇଥର୍‌ନେଟ୍ ନେଟ୍‍ୱାର୍କ</translation>
 <translation id="6011193465932186973">ଟିପ ଚିହ୍ନ</translation>
 <translation id="6011449291337289699">ସାଇଟ୍‍ ଡାଟା ଖାଲି କରନ୍ତୁ</translation>
+<translation id="6013027779243312217">ଆପଣଙ୍କ ଅଡିଓ ଏବଂ ଭିଡିଓ ପାଇଁ କ୍ୟାପ୍ସନଗୁଡ଼ିକ ପାଆନ୍ତୁ</translation>
 <translation id="6015796118275082299">ବର୍ଷ</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" />ଟିରୁ <ph name="CURRENT_ELEMENT" />ଟି ଅତିରିକ୍ତ ବିଷୟବସ୍ତୁକୁ ନାଭିଗେଟ୍ କରନ୍ତୁ</translation>
 <translation id="6016551720757758985">ପୂର୍ବବର୍ତ୍ତୀ ସଂସ୍କରଣକୁ ଫେରିଆସିବା ସହିତ Powerwashକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation>
@@ -4853,6 +4870,7 @@
 <translation id="6605847144724004692">ବର୍ତ୍ତମାନ ପର୍ଯ୍ୟନ୍ତ କୌଣସି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ମୂଲ୍ୟାଙ୍କିତ କରାଯାଇନାହିଁ।</translation>
 <translation id="6607831829715835317">ଅଧିକ ଟୁ&amp;ଲ୍</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> ପୂର୍ବରୁ <ph name="DOMAIN" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି। ଏକ ଭିନ୍ନ Google ଆକାଉଣ୍ଟ ସହ ବାପାମାଙ୍କ ନିୟନ୍ତ୍ରଣ ବ୍ୟବହାର କରିବା ପାଇଁ, ସେଟଅପ୍ କରିବା ପରେ ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ, ତା'ପରେ ସାଇନ୍-ଇନ୍ ସ୍କ୍ରିନରେ "ବ୍ୟକ୍ତିଙ୍କୁ ଯୋଗ କରନ୍ତୁ"କୁ ଚୟନ କରନ୍ତୁ।</translation>
+<translation id="6609478180749378879">ଆପଣ ଇନକଗ୍ନିଟୋ ମୋଡରୁ ବାହାରି ଯିବା ପରେ ସାଇନ୍-ଇନ୍ ଡାଟା ଏହି ଡିଭାଇସରେ ଷ୍ଟୋର୍ କରାଯିବ। ଆପଣ ଆପଣଙ୍କ ଡିଭାଇସ୍ ମାଧ୍ୟମରେ ଏହି ୱେବସାଇଟରେ ପରେ ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ସକ୍ଷମ ହେବେ।</translation>
 <translation id="6611972847767394631">ଆପଣଙ୍କର ଟାବ୍‍ଗୁଡ଼ିକୁ ଏଠାରେ ଖୋଜନ୍ତୁ</translation>
 <translation id="6612358246767739896">ସୁରକ୍ଷିତ ବିଷୟବସ୍ତୁ</translation>
 <translation id="6615455863669487791">ମୋତେ ଦେଖାନ୍ତୁ</translation>
@@ -4872,6 +4890,7 @@
 <translation id="6630043285902923878">USB ଡିଭାଇସଗୁଡ଼ିକୁ ଖୋଜାଯାଉଛି...</translation>
 <translation id="6630752851777525409">ଆପଣଙ୍କ ତରଫରୁ ଏକ ସାର୍ଟିଫିକେଟ୍ ପ୍ରମାଣିକିକରଣ କରିବାକୁ
 <ph name="EXTENSION_NAME" /> ସ୍ଥାୟୀ ଆକ୍ସେସ୍ ଚାହୁଁଛି।</translation>
+<translation id="6635362468090274700">ଆପଣ ନିଜକୁ ଦୃଶ୍ୟମାନ ନକରିବା ପର୍ଯ୍ୟନ୍ତ କେହି ଆପଣଙ୍କ ସହ ସେୟାର୍ କରିପାରିବେ ନାହିଁ।<ph name="BR" /><ph name="BR" />ଅସ୍ଥାୟୀ ଭାବେ ନିଜକୁ ଦୃଶ୍ୟମାନ କରିବାକୁ, ସ୍ଥିତି କ୍ଷେତ୍ର ଖୋଲନ୍ତୁ, ତା'ପରେ Nearby ଭିଜିବିଲିଟୀ ଚାଲୁ କରନ୍ତୁ।</translation>
 <translation id="6635944431854494329">'ସେଟିଂସ୍ &gt; ଉନ୍ନତ &gt; ସ୍ଵଚାଳିତ ଭାବେ Googleକୁ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଓ ବ୍ୟବହାର ଡାଟା ପଠାନ୍ତୁ'ରୁ ମାଲିକ ଏହି ଫିଚରକୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ।</translation>
 <translation id="6635956300022133031">ଟେକ୍ସଟ୍‌ରୁ ସ୍ପିଚ୍‌ ଭଏସ୍ ବାଛନ୍ତୁ ଏବଂ କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ</translation>
 <translation id="6636588250634969791">ଆଗକୁ ବଢ଼ିବା ପୂର୍ବରୁ SIM ଇନସାର୍ଟ କରନ୍ତୁ</translation>
@@ -5023,6 +5042,7 @@
 <translation id="6811332638216701903">DHCP ହୋଷ୍ଟ ନାମ</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" />କୁ ମୂଳ ଭାବେ ଚଲାଯାଇପାରିବ ନାହିଁ।</translation>
 <translation id="6812841287760418429">ପରିବର୍ତ୍ତନ ଜାରି ରଖନ୍ତୁ</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{ଫାଇଲ୍}other{#ଟି ଫାଇଲ୍}}</translation>
 <translation id="6817174620439930047">ଗୋଟିଏ ସାଇଟ୍ MIDI ଡିଭାଇସ୍‍ଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଯେତେବେଳେ ସିଷ୍ଟମ୍‍ର ବିଶେଷ ମେସେଜ୍‍ଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ ଚାହେଁ, ସେତେବେଳେ ପଚାରନ୍ତୁ।(ସୁପାରିଶ୍ କରାଯାଇଛି)</translation>
 <translation id="6818198425579322765">ଅନୁବାଦ କରିବା ପାଇଁ ପୃଷ୍ଠାର ଭାଷା</translation>
 <translation id="6818802132960437751">ବିଲ୍ଟ-ଇନ୍ ଭାଇରସ୍ ସୁରକ୍ଷା</translation>
@@ -5043,6 +5063,7 @@
 <translation id="6835762382653651563">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />କୁ ଅପ୍‌ଡେଟ୍ କରିବା ପାଇଁ ଦୟାକରି ଇର୍ଣ୍ଟନେଟ୍ ସହ ସଂଯୋଗ କରନ୍ତୁ।</translation>
 <translation id="6838034009068684089">କୌଣସି ସାଇଟ୍ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ଖୋଲିବା ସହ ରଖିବାକୁ ଚାହିଁଲେ, ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
 <translation id="6838694093138907871">ଅବୈଧ କୋଡ୍, ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{ଫୋନ୍ ନମ୍ବର}other{#ଟି ଫୋନ୍ ନମ୍ବର}}</translation>
 <translation id="6839225236531462745">ସାର୍ଟିଫିକେଟ୍‌ ଡିଲିଟ୍ କରିବା ପ୍ରକ୍ରିୟାରେ ତ୍ରୁଟି</translation>
 <translation id="6839916869147598086">ସାଇନ-ଇନ୍ ବଦଳା ଯାଇଛି</translation>
 <translation id="6840155290835956714">ପଠାଇବା ପୂର୍ବରୁ ପଚାରନ୍ତୁ</translation>
@@ -5148,6 +5169,7 @@
 <translation id="6955446738988643816">ପପ୍‍ଅପ୍‍ର ନିରୀକ୍ଷଣ କରନ୍ତୁ</translation>
 <translation id="6955535239952325894">ପରିଚାଳିତ ବ୍ରାଉଜରଗୁଡ଼ିକରେ ଏହି ସେଟିଂସ୍ ଅକ୍ଷମ କରାଯାଇଛି</translation>
 <translation id="6957044667612803194">ଏହି ସୁରକ୍ଷାକୀ ପିନ୍‌ଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{ଲିଙ୍କ୍}other{#ଟି ଲିଙ୍କ୍}}</translation>
 <translation id="6960507406838246615">Linux ଅପଡେଟ୍ ଆବଶ୍ୟକ</translation>
 <translation id="696103774840402661">ଏହି <ph name="DEVICE_TYPE" />ରେ ଥିବା ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କର ସବୁ ଫାଇଲ୍ ଏବଂ ସ୍ଥାନୀୟ ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ୍ କରାଯାଇଛି।</translation>
 <translation id="6964390816189577014">ହିରୋ</translation>
@@ -6057,6 +6079,7 @@
 <translation id="797394244396603170">ଆପଣ ଯେଉଁ ଡିଭାଇସ୍ ସହ ଫାଇଲଗୁଡ଼ିକ ସେୟାର୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତାହା ଚୟନ କରନ୍ତୁ</translation>
 <translation id="7973962044839454485">ଏକ ଭୁଲ ଉପଯୋଗକର୍ତ୍ତା ନାମ କିମ୍ୱା ପାସ୍‌ୱର୍ଡ୍ କାରଣରୁ PPP ପ୍ରମାଣୀକରଣ ହୋଇପାରିଲା ନାହିଁ</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" /> ବ୍ୟବହାର କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation>
+<translation id="7974713334845253259">ଡିଫଲ୍ଟ ରଙ୍ଗ</translation>
 <translation id="7974936243149753750">ଓଭରସ୍କାନ୍‌</translation>
 <translation id="7975504106303186033">ଆପଣ ଏହି Chrome Education ଡିଭାଇସକୁ ଏକ ଶିକ୍ଷା ସମ୍ବନ୍ଧିତ ଆକାଉଣ୍ଟରେ ପଞ୍ଜିକରଣ କରିବା ଆବଶ୍ୟକ। ଏକ ନୂଆ ଆକାଉଣ୍ଟ ପାଇଁ ସାଇନ୍ ଅପ୍ କରିବାକୁ, ଦୟାକରି https://g.co/workspace/edusignupକୁ ଭିଜିଟ୍ କରନ୍ତୁ।</translation>
 <translation id="7978412674231730200">ବ୍ୟକ୍ତିଗତ କୀ</translation>
@@ -6220,6 +6243,7 @@
 <translation id="8157704005178149728">ନିରୀକ୍ଷଣ ସେଟ୍ ଅପ୍ ହେଉଛି</translation>
 <translation id="8158117992543756526">ଏହି ଡିଭାଇସକୁ <ph name="MONTH_AND_YEAR" />ରୁ ସ୍ୱଚାଳିତ ଭାବରେ ସଫ୍ଟୱେୟାର ଏବଂ ସୁରକ୍ଷା ଅପଡେଟଗୁଡ଼ିକ ମିଳିବା ବନ୍ଦ ହୋଇଯାଇଛି। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">ସାର୍ଟିଫିକେଟ୍ ବିଶ୍ୱାସ ସେଟ୍‌ କରିବାରେ ତ୍ରୁଟି</translation>
+<translation id="8160775796528709999">ସେଟିଂସରେ ଲାଇଭ୍ କ୍ୟାପ୍ସନକୁ ସକ୍ଷମ କରି ଆପଣଙ୍କ ଅଡିଓ ଏବଂ ଭିଡିଓ ପାଇଁ କ୍ୟାପ୍ସନଗୁଡ଼ିକ ପାଆନ୍ତୁ</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">ୱେବ୍ ପୃଷ୍ଠା ପାଇଁ ରିଡର୍ ମୋଡ୍</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ନୂଆ ୱିଣ୍ଡୋକୁ ଟାବ୍ ମୁଭ୍ କରନ୍ତୁ}other{ନୂଆ ୱିଣ୍ଡୋକୁ ଟାବଗୁଡ଼ିକ ମୁଭ୍ କରନ୍ତୁ}}</translation>
@@ -6344,6 +6368,7 @@
 <translation id="8300011035382349091">ଏହି ଟାବ୍ ପାଇଁ ବୁକ୍‌ମାର୍କ ସମ୍ପାଦନ କରନ୍ତୁ</translation>
 <translation id="8300374739238450534">ମଧ୍ୟରାତ୍ର ନୀଳ</translation>
 <translation id="8300849813060516376">OTASP ବିଫଳ ହେଲା</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{ଠିକଣା}other{#ଟି ଠିକଣା}}</translation>
 <translation id="8304383784961451596">ଏହି ଡିଭାଇସ୍ ବ୍ୟବହାର କରିବାକୁ ଆପଣଙ୍କୁ ଅଧିକାର ଦିଆଯାଇନାହିଁ। ଦୟାକରି ସାଇନ୍-ଇନ୍ ଅନୁମତି ପାଇଁ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ କିମ୍ବା Family Link ଦ୍ୱାରା ନିରୀକ୍ଷିତ ଏକ Google ଆକାଉଣ୍ଟ ସହିତ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> ଆପଣଙ୍କ କ୍ୟାମେରାକୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହାନ୍ତି କି, ତାହା ପଚାରନ୍ତୁ</translation>
 <translation id="830868413617744215">ବେଟା</translation>
@@ -6642,6 +6667,7 @@
 <translation id="867085395664725367">ଅସ୍ଥାୟୀ ସର୍ଭରରେ ତ୍ରୁଟି ଦେଖାଦେଇଛି।</translation>
 <translation id="8673026256276578048">ୱେବ୍ ସନ୍ଧାନ କରନ୍ତୁ...</translation>
 <translation id="8673383193459449849">ସର୍ଭର୍‌ରେ ସମସ୍ୟା।</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{ଭିଡିଓ}other{#ଟି ଭିଡିଓ}}</translation>
 <translation id="8676374126336081632">ଇନ୍‌ପୁଟ୍ ଖାଲି କରନ୍ତୁ</translation>
 <translation id="8676770494376880701">ନିମ୍ନ-ଶକ୍ତିର ଚାର୍ଜର୍ ସଂଯୋଗ କରାଯାଇଛି</translation>
 <translation id="8677212948402625567">ସମସ୍ତ ସଙ୍କୁଚିତ କରନ୍ତୁ...</translation>
@@ -7067,6 +7093,7 @@
 <translation id="9128870381267983090">ନେଟ୍‌ୱର୍କ ସହ ସଂଯୋଗ କରନ୍ତୁ</translation>
 <translation id="9130015405878219958">ଅବୈଧ ମୋଡ୍ ଏଣ୍ଟର୍ ହୋଇଛି।</translation>
 <translation id="9131487537093447019">ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍‍ଗୁଡ଼ିକୁ ମେସେଜ୍ ପଠାନ୍ତୁ ଏବଂ ସେଥିରୁ ମେସେଜ୍ ପ୍ରାପ୍ତ କରନ୍ତୁ।</translation>
+<translation id="9134119143784876218">ଇଂରାଜୀରେ ଅଡିଓ ଏବଂ ଭିଡିଓ ପାଇଁ ସ୍ୱଚାଳିତ ଭାବେ କ୍ୟାପ୍ସନଗୁଡ଼ିକ ତିଆରି କରେ (ବର୍ତ୍ତମାନ କେବଳ Chrome ବ୍ରାଉଜରରେ ଉପଲବ୍ଧ ଅଛି)। ଅଡିଓ ଏବଂ କ୍ୟାପ୍ସନଗୁଡ଼ିକୁ କେବେ ବି ଆପଣଙ୍କ ଡିଭାଇସରୁ କାଢ଼ି ଦିଆଯାଏ ନାହିଁ।</translation>
 <translation id="9137013805542155359">ମୂଳ ଲେଖା ଦେଖାନ୍ତୁ</translation>
 <translation id="9137157311132182254">ପସନ୍ଦ କରାଯାଇଥିବା ସନ୍ଧାନ ଇଞ୍ଜିନ୍</translation>
 <translation id="9137248913990643158">ଦୟାକରି ଏହି ଆପ୍ ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ Chrome ଖୋଲନ୍ତୁ ଏବଂ ଏଥିରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation>
@@ -7114,6 +7141,7 @@
 <translation id="9179524979050048593">ସାଇନ୍-ଇନ୍ ସ୍କ୍ରିନ୍ ଉପଯୋଗକର୍ତ୍ତା ନାମ</translation>
 <translation id="9180281769944411366">ଏହି ପ୍ରକ୍ରିୟା ପାଇଁ କିଛି ସମୟ ଲାଗିପାରେ। Linux କଣ୍ଟେନର୍ ଆରମ୍ଭ ହେଉଛି।</translation>
 <translation id="9180380851667544951">ସାଇଟ୍ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍‍କୁ ସେୟାର୍ କରିପାରିବ</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{ଆପ୍}other{#ଟି ଆପ୍}}</translation>
 <translation id="9186963452600581158">ଗୋଟିଏ ପିଲାର Google ଆକାଉଣ୍ଟ ସହିତ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
 <translation id="9188732951356337132">ବ୍ୟବହାର ଓ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟାକୁ ପଠାନ୍ତୁ। ଏହି ଡିଭାଇସ୍ ବର୍ତ୍ତମାନ ସ୍ୱଚାଳିତରୂପେ ଡାଏଗ୍ନୋଷ୍ଟିକ୍, ଆପ୍ ଏବଂ ଆପ୍ ବ୍ୟବହାର ଡାଟା Googleକୁ ପଠାଉଛି। ଏହା ଆପଣଙ୍କର ପିଲାକୁ ଚିହ୍ନଟ କରିବାରେ ବ୍ୟବହାର କରାଯିବ ନାହିଁ ଏବଂ ସିଷ୍ଟମ୍ ଓ ଆପ୍‌ର ସ୍ଥିରତା ତଥା ଅନ୍ୟାନ୍ୟ ଉନ୍ନତି ଆଣିବାରେ ସାହାଯ୍ୟ କରିବ। କିଛି ଏକତ୍ରିତ ଡାଟା ମଧ୍ୟ Google ଆପ୍ସ ଏବଂ ଏହାର ସହଭାଗୀ ଯେପରିକି, Android ଡେଭଲପର୍, ମାନଙ୍କୁ ସାହାଯ୍ୟ କରିବ। ଯଦି ଆପଣଙ୍କର ପିଲା ପାଇଁ ଅତିରିକ୍ତ ୱେବ୍ ଏବଂ ଆପ୍ ଗତିବିଧି ସେଟିଂସ୍ ଚାଲୁ ସ୍ଥିତିରେ ଥାଏ, ତେବେ ଏହି ଡାଟା ହୁଏତ ସେମାନଙ୍କର Google ଆକାଉଣ୍ଟରେ ସେଭ୍ ହୋଇଯିବ। <ph name="BEGIN_LINK2" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">ଆପଣଙ୍କ Android ଫୋନକୁ ଏକ ସୁରକ୍ଷା କୀ ଭାବରେ ବ୍ୟବହାର କରନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 81688f4..5f0bf30 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -219,6 +219,7 @@
 <translation id="1234808891666923653">ਸੇਵਾ ਕਰਮਚਾਰੀ</translation>
 <translation id="1235458158152011030">ਗਿਆਤ ਨੈੱਟਵਰਕ</translation>
 <translation id="123578888592755962">ਡਿਸਕ ਪੂਰੀ</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{ਲਿਖਤ}one{# ਲਿਖਤ}other{# ਲਿਖਤਾਂ}}</translation>
 <translation id="1239594683407221485">Files ਐਪ ਵਿੱਚ ਡੀਵਾਈਸ ਦੀ ਸਮੱਗਰੀ ਦੀ ਪੜਚੋਲ ਕਰੋ।</translation>
 <translation id="124116460088058876">ਹੋਰ ਭਾਸ਼ਾਵਾਂ</translation>
 <translation id="1241753985463165747">ਚਲਾਏ ਜਾਣ 'ਤੇ ਵਰਤਮਾਨ ਵੈੱਬਸਾਈਟ ਦਾ ਸਾਰਾ ਡਾਟਾ ਪੜ੍ਹੋ ਅਤੇ ਬਦਲੋ</translation>
@@ -441,6 +442,7 @@
 <translation id="1486096554574027028">ਪਾਸਵਰਡ ਖੋਜੋ</translation>
 <translation id="1487335504823219454">ਚਾਲੂ - ਸੈਟਿੰਗਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation>
 <translation id="1489664337021920575">ਕੋਈ ਹੋਰ ਵਿਕਲਪ ਚੁਣੋ</translation>
+<translation id="1490491397986065675">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ "<ph name="CUSTOM_MESSAGE" />" ਕਹਿੰਦਾ ਹੈ।</translation>
 <translation id="1492417797159476138">ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਇਸ ਸਾਈਟ ਲਈ ਇਹ ਵਰਤੋਂਕਾਰ ਨਾਮ ਰੱਖਿਅਤ ਕਰ ਚੁੱਕੇ ਹੋ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ...</translation>
 <translation id="1495677929897281669">ਟੈਬ 'ਤੇ ਵਾਪਸ ਜਾਓ</translation>
@@ -812,6 +814,7 @@
 <translation id="1879000426787380528">ਇਸ ਵਜੋਂ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="1880905663253319515">ਕੀ ਪ੍ਰਮਾਣ-ਪੱਤਰ "<ph name="CERTIFICATE_NAME" />" ਮਿਟਾਉਣਾ ਹੈ?</translation>
 <translation id="1881445033931614352">ਕੀ-ਬੋਰਡ ਖਾਕਾ</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{ਆਈਟਮ}one{# ਆਈਟਮ}other{# ਆਈਟਮਾਂ}}</translation>
 <translation id="1884013283844450420">ਨੈੱਟਵਰਕ <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, ਕਨੈਕਟ ਕਰੋ</translation>
 <translation id="1884340228047885921">ਮੌਜੂਦਾ ਦਿਖਣਯੋਗਤਾ ਸੈਟਿੰਗ 'ਕੁਝ ਸੰਪਰਕ' 'ਤੇ ਸੈੱਟ ਹੈ</translation>
 <translation id="1884705339276589024">Linux ਡਿਸਕ ਦਾ ਆਕਾਰ ਬਦਲੋ</translation>
@@ -990,6 +993,7 @@
 <translation id="2099686503067610784">ਕੀ ਸਰਵਰ ਪ੍ਰਮਾਣ-ਪੱਤਰ "<ph name="CERTIFICATE_NAME" />" ਮਿਟਾਉਣਾ ਹੈ?</translation>
 <translation id="2100273922101894616">ਸਵੈਚਲਿਤ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="2101225219012730419">ਵਰਜਨ:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{ਫ਼ੋਨ ਨੰਬਰ}one{# ਫ਼ੋਨ ਨੰਬਰ}other{# ਫ਼ੋਨ ਨੰਬਰ}}</translation>
 <translation id="211144231511833662">ਕਿਸਮਾਂ ਕਲੀਅਰ ਕਰੋ</translation>
 <translation id="2111670510994270194">ਸੱਜੇ ਪਾਸੇ ਨਵੀਂ ਟੈਬ</translation>
 <translation id="21133533946938348">ਟੈਬ ਪਿੰਨ ਕਰੋ</translation>
@@ -1285,6 +1289,7 @@
 <translation id="2435457462613246316">ਪਾਸਵਰਡ ਵੇਖੋ</translation>
 <translation id="2435579801172349831">ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਵਿੱਚ ਸਾਰੇ (<ph name="URL_COUNT" />) ਖੋਲ੍ਹੋ</translation>
 <translation id="2436186046335138073">ਕੀ <ph name="HANDLER_HOSTNAME" /> ਨੂੰ ਸਾਰੇ <ph name="PROTOCOL" /> ਲਿੰਕ ਖੋਲ੍ਹਣ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{ਐਪ}one{# ਐਪ}other{# ਐਪਾਂ}}</translation>
 <translation id="2440604414813129000">ਸ&amp;ਰੋਤ ਦੇਖੋ</translation>
 <translation id="244231003699905658">ਅਵੈਧ ਪਤਾ। ਕਿਰਪਾ ਕਰਕੇ ਪਤੇ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="2442916515643169563">ਲਿਖਤ ਸ਼ੈਡੋ</translation>
@@ -1433,6 +1438,7 @@
 <translation id="2604255671529671813">ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਗੜਬੜ</translation>
 <translation id="2606246518223360146">ਡਾਟਾ ਲਿੰਕ ਕਰੋ</translation>
 <translation id="2606454609872547359">ਨਹੀਂ, ChromeVox ਦੇ ਬਿਨਾਂ ਜਾਰੀ ਰੱਖੋ</translation>
+<translation id="2606568927909309675">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਅੰਗਰੇਜ਼ੀ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਲਈ ਸੁਰਖੀਆਂ ਬਣਾਉਂਦੀ ਹੈ। ਆਡੀਓ ਅਤੇ ਸੁਰਖੀਆਂ ਨੂੰ ਕਦੇ ਵੀ ਡੀਵਾਈਸ ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਲਿਜਾਇਆ ਜਾਂਦਾ ਹੈ।</translation>
 <translation id="2607101320794533334">ਵਿਸ਼ਾ ਜਨਤਕ ਕੁੰਜੀ ਜਾਣਕਾਰੀ</translation>
 <translation id="2609896558069604090">ਸ਼ਾਰਟਕੱਟ ਬਣਾਓ...</translation>
 <translation id="2609980095400624569">ਕਨੈਕਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation>
@@ -1697,6 +1703,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">ਇਸ ਨਾਲ ਲਿੰਕ ਖੋਲ੍ਹੇੋ...</translation>
 <translation id="2889925978073739256">ਅਨਸੈਂਡਬੌਕਸਿਡ ਪਲਗਇੰਸ ਨੂੰ ਬਲੌਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ</translation>
+<translation id="2891922230654533301">ਕੀ <ph name="APP_NAME" /> 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣਾ ਹੈ?</translation>
 <translation id="2893168226686371498">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ</translation>
 <translation id="2894757982205307093">ਗਰੁੱਪ ਵਿੱਚ ਨਵੀਂ ਟੈਬ</translation>
 <translation id="289644616180464099">ਸਿਮ ਕਾਰਡ ਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation>
@@ -2007,6 +2014,7 @@
 <translation id="3269069891205016797">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਈਨ-ਆਊਟ ਕਰਨ 'ਤੇ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਨੂੰ ਡੀਵਾਈਸ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation>
 <translation id="3269093882174072735">ਚਿੱਤਰ ਲੋਡ ਕਰੋ</translation>
 <translation id="3269612321104318480">ਹਲਕਾ ਹਰਾ-ਨੀਲਾ ਅਤੇ ਸਫ਼ੈਦ</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{ਫ਼ਾਈਲ}one{# ਫ਼ਾਈਲ}other{# ਫ਼ਾਈਲਾਂ}}</translation>
 <translation id="326999365752735949">diff ਡਾਊਨਲੋਡ ਕਰ ਰਿਹਾ ਹੈ</translation>
 <translation id="3270965368676314374">ਆਪਣੇ ਕੰਪਿਊਟਰ ਤੋਂ ਫ਼ੋਟੋਆਂ, ਸੰਗੀਤ ਅਤੇ ਹੋਰ ਮੀਡੀਆ ਪੜ੍ਹੋ, ਬਦਲੋ ਅਤੇ ਮਿਟਾਓ</translation>
 <translation id="327147043223061465">ਸਾਰੀਆਂ ਕੁਕੀਜ਼ ਅਤੇ ਸਾਈਟ ਡਾਟਾ ਦੇਖੋ</translation>
@@ -2302,6 +2310,7 @@
 <translation id="3600792891314830896">ਧੁਨੀ ਵਜਾਉਣ ਵਾਲੀਆਂ ਸਾਈਟਾਂ ਨੂੰ ਮਿਊਟ ਕਰੋ</translation>
 <translation id="360180734785106144">ਉਪਲਬਧ ਹੋਣ 'ਤੇ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਪੇਸ਼ਕਸ਼</translation>
 <translation id="3602290021589620013">ਪ੍ਰੀਵਿਊ</translation>
+<translation id="3602870520245633055">ਪ੍ਰਿੰਟ ਅਤੇ ਸਕੈਨ ਕਰੋ</translation>
 <translation id="3603622770190368340">ਨੈੱਟਵਰਕ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਪ੍ਰਾਪਤ ਕਰੋ</translation>
 <translation id="3604193429970465812">ਸੈਕੰਡਰੀ ਖਾਤੇ</translation>
 <translation id="3604713164406837697">ਵਾਲਪੇਪਰ ਬਦਲੋ</translation>
@@ -2317,6 +2326,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> ਨੂੰ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="3616741288025931835">&amp;ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਹਟਾਓ...</translation>
 <translation id="3617891479562106823">ਬੈਕਗ੍ਰਾਊਂਡਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{ਵੀਡੀਓ}one{# ਵੀਡੀਓ}other{# ਵੀਡੀਓ}}</translation>
 <translation id="3619115746895587757">ਕੈਪੁਚੀਨੋ</translation>
 <translation id="362333465072914957">CA ਦੇ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਜਾਰੀ ਕਰਨ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation>
 <translation id="3624567683873126087">ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰਕੇ 'Google ਖਾਤੇ' ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
@@ -2574,7 +2584,6 @@
 <translation id="3882165008614329320">ਕੈਮਰੇ ਜਾਂ ਫ਼ਾਈਲ ਤੋਂ ਮੌਜੂਦਾ ਵੀਡੀਓ</translation>
 <translation id="3884152383786131369">ਕਈ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਉਪਲਬਧ ਵੈੱਬ ਸਮੱਗਰੀ ਇਸ ਸੂਚੀ ਤੋਂ ਪਹਿਲੀ ਸਮਰਥਿਤ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰੇਗੀ। ਇਹ ਤਰਜੀਹਾਂ ਤੁਹਾਡੀਆਂ ਬ੍ਰਾਊਜ਼ਰ ਸੈਟਿੰਗਾਂ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ਇਸ ਸਾਈਟ 'ਤੇ ਪਹੁੰਚ ਦੀ ਤੁਹਾਡੀ ਬੇਨਤੀ <ph name="NAME" /> ਨੂੰ ਭੇਜੀ ਗਈ ਹੈ</translation>
-<translation id="3888364689515978571">ਬੰਦ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ਨਾਲ ਨੋਟ-ਕਥਨ ਲਏ ਜਾ ਰਹੇ ਹਨ</translation>
 <translation id="3890064827463908288">ਵਾਈ-ਫਾਈ ਸਿੰਕ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ Chrome ਸਮਕਾਲੀਕਰਨ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP ਸ਼ਾਮਲ ਕਰੋ...</translation>
@@ -2658,7 +2667,6 @@
 <translation id="3958088479270651626">ਬੁੱਕਮਾਰਕ ਅਤੇ ਸੈਟਿੰਗਾਂ ਆਯਾਤ ਕਰੋ</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਨੂੰ ਬੰਦ ਕਰੋ</translation>
-<translation id="3965730875470565266">ਚਾਲੂ ਹੈ, <ph name="MINUTES" /> ਮਿੰਟ</translation>
 <translation id="3965811923470826124">ਨਾਲ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> ਤੋਂ ਬਾਹਰ ਜਾਓ</translation>
 <translation id="3966072572894326936">ਦੂਜਾ ਫੋਲਡਰ ਚੁਣੋ...</translation>
@@ -2728,6 +2736,7 @@
 <translation id="4047726037116394521">ਹੋਮ 'ਤੇ ਜਾਓ</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# ਸੰਪਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਉਹਨਾਂ ਨਾਲ 'ਨਜ਼ਦੀਕੀ ਸਾਂਝ' ਵਰਤਣ ਲਈ, ਆਪਣੇ ਸੰਪਰਕਾਂ ਵਿੱਚ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਈਮੇਲ ਪਤਾ ਸ਼ਾਮਲ ਕਰੋ।}one{# ਸੰਪਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਉਹਨਾਂ ਨਾਲ 'ਨਜ਼ਦੀਕੀ ਸਾਂਝ' ਵਰਤਣ ਲਈ, ਆਪਣੇ ਸੰਪਰਕਾਂ ਵਿੱਚ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਈਮੇਲ ਪਤਾ ਸ਼ਾਮਲ ਕਰੋ।}other{# ਸੰਪਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਉਹਨਾਂ ਨਾਲ 'ਨਜ਼ਦੀਕੀ ਸਾਂਝ' ਵਰਤਣ ਲਈ, ਆਪਣੇ ਸੰਪਰਕਾਂ ਵਿੱਚ ਉਹਨਾਂ ਦੇ Google ਖਾਤਿਆਂ ਨਾਲ ਸੰਬੰਧਿਤ ਈਮੇਲ ਪਤੇ ਸ਼ਾਮਲ ਕਰੋ।}}</translation>
 <translation id="4050225813016893843">ਪ੍ਰਮਾਣੀਕਰਨ ਵਿਧੀ</translation>
+<translation id="4050534976465737778">ਪੱਕਾ ਕਰੋ ਕਿ ਦੋਵੇਂ ਡੀਵਾਈਸ ਅਣਲਾਕ ਹੋਣ, ਇੱਕ-ਦੂਜੇ ਦੇ ਨੇੜੇ ਹੋਣ ਅਤੇ ਬਲੂਟੁੱਥ ਚਾਲੂ ਹੋਵੇ। ਜੇ ਤੁਸੀਂ ਅਜਿਹੀ Chromebook ਨਾਲ ਸਾਂਝਾ ਕਰ ਰਹੇ ਹੋ ਜੋ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਵਿੱਚ ਨਹੀਂ ਹੈ, ਤਾਂ ਪੱਕਾ ਕਰੋ ਕਿ ਇਸ ਵਿੱਚ ਨਜ਼ਦੀਕੀ ਦਿਖਣਯੋਗਤਾ ਚਾਲੂ ਹੈ (ਸਥਿਤੀ ਖੇਤਰ ਖੋਲ੍ਹੋ, ਫਿਰ ਨਜ਼ਦੀਕੀ ਦਿਖਣਯੋਗਤਾ ਚਾਲੂ ਕਰੋ)। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">ਛੋਟਾ</translation>
 <translation id="4054070260844648638">ਹਰੇਕ ਨੂੰ ਦਿਸਦਾ ਹੈ</translation>
 <translation id="4056908315660577142">ਤੁਸੀਂ <ph name="APP_NAME" /> Chrome ਐਪ ਲਈ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਸਮਾਂ ਸੀਮਾ ਪੂਰੀ ਕਰ ਲਈ ਹੈ। ਤੁਸੀਂ ਕੱਲ੍ਹ ਇਸਨੂੰ <ph name="TIME_LIMIT" /> ਲਈ ਵਰਤ ਸਕਦੇ ਹੋ।</translation>
@@ -2962,6 +2971,7 @@
 <translation id="4364327530094270451">ਖਰਬੂਜ਼ਾ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="4364830672918311045">ਡਿਸਪਲੇ ਸੂਚਨਾਵਾਂ</translation>
+<translation id="4366138410738374926">ਪ੍ਰਿੰਟ ਕਰਨਾ ਸ਼ੁਰੂ ਹੋ ਗਿਆ</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> ਨੁਕਤੇ, ਪੇਸ਼ਕਸ਼ਾਂ ਅਤੇ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰੋ ਅਤੇ ਵਿਚਾਰ ਸਾਂਝਾ ਕਰੋ। ਕਿਸੇ ਵੀ ਵੇਲੇ ਗਾਹਕੀ ਹਟਾਓ।</translation>
 <translation id="4370425812909262207">ਕਾਰਟ ਲੁਕਾਏ ਗਏ। ਜਦੋਂ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਕਰਦੇ ਹੋ ਤਾਂ ਉਹ ਦੁਬਾਰਾ ਦਿਖਾਈ ਦੇਣਗੇ।</translation>
 <translation id="4370975561335139969">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਰਜ ਕੀਤਾ ਈਮੇਲ ਅਤੇ ਪਾਸਵਰਡ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ</translation>
@@ -3149,6 +3159,7 @@
 <translation id="4568025708905928793">ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation>
 <translation id="4568213207643490790">ਮਾਫ਼ ਕਰਨਾ, Google ਖਾਤਿਆਂ ਦੀ ਇਸ  ਡੀਵਾਈਸ 'ਤੇ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।</translation>
 <translation id="4569747168316751899">ਜਦੋਂ ਵਰਤੋਂ ਨਾ ਹੋ ਰਹੀ ਹੋਵੇ</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{ਪਤਾ}one{# ਪਤਾ}other{# ਪਤੇ}}</translation>
 <translation id="4570387585180509432">ਪਤੇ, ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵੇਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕੀਤਾ।</translation>
 <translation id="4572779512957829735">ਆਪਣੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਲਈ ਪਿੰਨ ਦਾਖਲ ਕਰੋ</translation>
@@ -3208,6 +3219,7 @@
 <translation id="4635444580397524003">Linux ਬੈਕਅੱਪ ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਗਿਆ।</translation>
 <translation id="4636930964841734540">ਜਾਣਕਾਰੀ</translation>
 <translation id="4637083375689622795">ਹੋਰ ਕਾਰਵਾਈਆਂ, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{ਲਿਖਤ}one{# ਲਿਖਤ}other{# ਲਿਖਤਾਂ}}</translation>
 <translation id="4638930039313743000">ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation>
 <translation id="4641539339823703554">Chrome ਸਿਸਟਮ ਸਮਾਂ ਸੈੱਟ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤਾ ਸਮਾਂ ਦੇਖੋ ਅਤੇ ਜੇਕਰ ਲੋੜ ਹੋਵੇ ਤਾਂ ਇਸਨੂੰ ਠੀਕ ਕਰੋ।</translation>
 <translation id="4642769377300286600">ਮੋਬਾਈਲ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ, <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" /> ਨੈੱਟਵਰਕ, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3223,10 +3235,12 @@
 <translation id="4651484272688821107">ਡੈਮੋ ਮੋਡ ਸਰੋਤਾਂ ਨਾਲ ਆਨਲਾਈਨ ਕੰਪੋਨੈਂਟ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation>
 <translation id="4652935475563630866">ਕੈਮਰਾ ਸੈਟਿੰਗ ਵਿੱਚ ਤਬਦੀਲੀ ਲਈ Parallels Desktop ਦਾ ਮੁੜ-ਲਾਂਚ ਹੋਣਾ ਲੋੜੀਂਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ Parallels Desktop ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ।</translation>
 <translation id="4653405415038586100">Linux ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ</translation>
+<translation id="4654236001025007561">ਆਪਣੇ ਆਲੇ-ਦੁਆਲੇ ਦੇ Chromebook ਅਤੇ Android ਡੀਵਾਈਸਾਂ ਨਾਲ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ</translation>
 <translation id="4657914796247705218">TrackPoint ਗਤੀ</translation>
 <translation id="465878909996028221">ਬ੍ਰਾਊਜ਼ਰ ਰੀਡਾਇਰੈਕਟਾਂ ਲਈ ਸਿਰਫ਼ http, https ਅਤੇ ਫ਼ਾਈਲ ਪ੍ਰੋਟੋਕੋਲ ਸਮਰਥਿਤ ਹਨ।</translation>
 <translation id="4659077111144409915">ਮੁੱਖ ਖਾਤਾ</translation>
 <translation id="4659126640776004816">ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਚਾਲੂ ਹੋ ਜਾਂਦੀ ਹੈ।</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{ਚਿੱਤਰ}one{# ਚਿੱਤਰ}other{# ਚਿੱਤਰ}}</translation>
 <translation id="4660476621274971848">ਸੰਭਾਵਿਤ ਵਰਜਨ "<ph name="EXPECTED_VERSION" />" ਹੈ, ਪਰ ਵਰਜਨ "<ph name="NEW_ID" />" ਸੀ</translation>
 <translation id="4660540330091848931">ਆਕਾਰ ਨੂੰ ਬਦਲਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="4661407454952063730">ਐਪ ਡਾਟਾ ਕਿਸੇ ਐਪ ਵੱਲੋਂ (ਵਿਕਾਸਕਾਰ ਸੈਟਿੰਗਾਂ ਦੇ ਆਧਾਰ 'ਤੇ) ਰੱਖਿਅਤ ਕੀਤਾ ਕੋਈ ਵੀ ਡਾਟਾ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕਾਂ, ਸੁਨੇਹਿਆਂ ਅਤੇ ਫ਼ੋਟੋਆਂ ਵਰਗਾ ਡਾਟਾ ਸ਼ਾਮਲ ਹੈ।</translation>
@@ -3327,6 +3341,7 @@
 <translation id="4794810983896241342"><ph name="BEGIN_LINK" />ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ<ph name="END_LINK" /> ਵੱਲੋਂ ਅੱਪਡੇਟਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation>
 <translation id="479536056609751218">ਵੈਬਪੇਜ, ਕੇਵਲ HTML</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />ਬਲੂਟੁੱਥ ਲੌਗ<ph name="END_LINK" /> ਅਟੈਚ ਕਰੋ (Google ਅੰਦਰੂਨੀ)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{ਆਈਟਮ}one{# ਆਈਟਮ}other{# ਆਈਟਮਾਂ}}</translation>
 <translation id="4801448226354548035">ਖਾਤੇ ਲੁਕਾਓ</translation>
 <translation id="4801512016965057443">ਮੋਬਾਈਲ ਡਾਟਾ ਰੋਮਿੰਗ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</translation>
 <translation id="4804818685124855865">ਡਿਸਕਨੈਕਟ ਕਰੋ</translation>
@@ -3757,6 +3772,7 @@
 <translation id="531118851858162334">ਤੁਸੀਂ ਇਹ ਆਈਟਮ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਰਤ ਕੇ ਆਪਣੀ ਪਿਛਲੀ ਸਰਗਰਮੀ ਦੇ ਆਧਾਰ 'ਤੇ ਦੇਖ ਰਹੇ ਹੋ। ਤੁਸੀਂ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 'ਤੇ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ, ਇਸਨੂੰ ਮਿਟਾ ਸਕਦੇ ਹੋ ਅਤੇ ਆਪਣੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation>
 <translation id="5311304534597152726">ਇਸ ਵਜੋਂ ਸਾਈਨ ਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="5311565231560644461">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ ਡੀਵਾਈਸਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਵਰਤਣ ਨਾ ਦਿਓ</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{ਚਿੱਤਰ}one{# ਚਿੱਤਰ}other{# ਚਿੱਤਰ}}</translation>
 <translation id="5314381603623123224">Chrome ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮ 31 ਮਾਰਚ ਨੂੰ ਬਦਲ ਰਹੇ ਹਨ</translation>
 <translation id="5315738755890845852">ਵਾਧੂ ਕੁੰਡਲਦਾਰ ਬ੍ਰੇਸ: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">ਰੱਖਿਅਤ ਕਰੋ</translation>
@@ -3822,6 +3838,7 @@
 <translation id="5390677308841849479">ਗੂੜ੍ਹਾ ਲਾਲ ਅਤੇ ਸੰਤਰੀ</translation>
 <translation id="5390743329570580756">ਮੰਗਵਾਓ</translation>
 <translation id="5392192690789334093">ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{ਲਿੰਕ}one{# ਲਿੰਕ}other{# ਲਿੰਕ}}</translation>
 <translation id="5397794290049113714">ਤੁਸੀਂ</translation>
 <translation id="5398497406011404839">ਲੁਕੇ ਹੋਏ ਬੁੱਕਮਾਰਕ</translation>
 <translation id="5398572795982417028">ਵਿਵਰਜਿਤ ਪੰਨਾ ਸੰਦਰਭ, ਸੀਮਾ <ph name="MAXIMUM_PAGE" /> ਹੈ</translation>
@@ -4198,7 +4215,6 @@
 <translation id="5832813618714645810">ਪ੍ਰੋਫਾਈਲਾਂ</translation>
 <translation id="583281660410589416">ਅਗਿਆਤ</translation>
 <translation id="5833397272224757657">ਵਿਅਕਤੀਗਤਕਰਨ ਲਈ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀਆਂ ਜਾਣ ਵਾਲੀਆਂ ਸਾਈਟਾਂ ਦੀ ਸਮੱਗਰੀ, ਨਾਲ ਹੀ ਬ੍ਰਾਊਜ਼ਰ ਸਰਗਰਮੀ ਅਤੇ ਅੰਤਰਕਿਰਿਆਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ</translation>
-<translation id="5833551944249825624">ਤੁਹਾਡੀ Chromebook 5 ਮਿੰਟ ਲਈ ਹਰ ਕਿਸੇ ਨਜ਼ਦੀਕੀ ਨੂੰ ਦਿਸਣਗੇ</translation>
 <translation id="5833726373896279253">ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਮਾਲਕ ਵੱਲੋਂ ਸੰਸ਼ੋਧਿਤ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।</translation>
 <translation id="5834581999798853053">ਲਗਭਗ <ph name="TIME" /> ਮਿੰਟ ਬਾਕੀ</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ਕੈਮਰਾ ਜਾਂ ਮਾਈਕ੍ਰੋਫੋਨ ਰਿਕਾਰਡਿੰਗ</translation>
@@ -4349,6 +4365,7 @@
 <translation id="6011074160056912900">ਈਥਰਨੈੱਟ ਨੈੱਟਵਰਕ</translation>
 <translation id="6011193465932186973">ਫਿੰਗਰਪ੍ਰਿੰਟ</translation>
 <translation id="6011449291337289699">ਕੀ ਸਾਈਟ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation>
+<translation id="6013027779243312217">ਆਪਣੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਲਈ ਸੁਰਖੀਆਂ ਪ੍ਰਾਪਤ ਕਰੋ</translation>
 <translation id="6015796118275082299">ਸਾਲ</translation>
 <translation id="6016178549409952427">ਵਾਧੂ ਸਮੱਗਰੀ ਦੇ <ph name="TOTAL_ELEMENTS" /> ਵਿੱਚੋਂ <ph name="CURRENT_ELEMENT" /> 'ਤੇ ਜਾਓ</translation>
 <translation id="6016551720757758985">ਪਿੱਛਲੇ ਰੂਪ ਤੇ ਵਾਪਸ ਆਉਣ ਨਾਲ ਪਾਵਰਵਾਸ਼ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
@@ -4858,6 +4875,7 @@
 <translation id="6605847144724004692">ਹਾਲੇ ਤੱਕ ਕਿਸੇ ਵੀ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਰੇਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।</translation>
 <translation id="6607831829715835317">ਹੋਰ ਟੂ&amp;ਲਸ</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> ਦਾ ਪਹਿਲਾਂ ਤੋਂ ਹੀ <ph name="DOMAIN" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਕਿਸੇ ਵੱਖਰੇ Google ਖਾਤੇ ਨਾਲ ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਵਰਤਣ ਲਈ, ਸੈੱਟਅੱਪ ਕਰਨ ਤੋਂ ਬਾਅਦ ਸਾਈਨ-ਆਊਟ ਕਰੋ, ਫਿਰ ਸਾਈਨ-ਇਨ ਸਕ੍ਰੀਨ 'ਤੇ "ਵਿਅਕਤੀ ਸ਼ਾਮਲ ਕਰੋ" ਨੂੰ ਚੁਣੋ।</translation>
+<translation id="6609478180749378879">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਤੋਂ ਬਾਹਰ ਨਿਕਲਣ ਦੇ ਬਾਅਦ ਸਾਈਨ-ਇਨ ਡਾਟਾ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਸਟੋਰ ਕੀਤਾ ਜਾਵੇਗਾ। ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਆਪਣੇ ਡੀਵਾਈਸ ਨਾਲ ਇਸ ਵੈੱਬਸਾਈਟ 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰ ਸਕੋਗੋ।</translation>
 <translation id="6611972847767394631">ਆਪਣੀਆਂ ਟੈਬਾਂ ਇੱਥੇ ਲੱਭੋ</translation>
 <translation id="6612358246767739896">ਸੁਰੱਖਿਅਤ ਸਮੱਗਰੀ</translation>
 <translation id="6615455863669487791">ਮੈਨੂੰ ਦਿਖਾਓ</translation>
@@ -4876,6 +4894,7 @@
 <translation id="6628328486509726751"><ph name="WEBRTC_LOG_UPLOAD_TIME" /> ਅਪਲੋਡ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="6630043285902923878">USB ਡੀਵਾਈਸ ਲੱਭੇ ਜਾ ਰਹੇ ਹਨ...</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> ਤੁਹਾਡੇ ਵੱਲੋਂ ਖੁਦ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਲਈ ਇੱਕ ਸਰਟੀਫਿਕੇਟ ਤੱਕ ਸਥਾਈ ਪਹੁੰਚ ਚਾਹੁੰਦਾ ਹੈ।</translation>
+<translation id="6635362468090274700">ਕੋਈ ਵੀ ਤੁਹਾਡੇ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕਰ ਸਕਦਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਆਪਣੇ ਆਪ ਨੂੰ ਦਿਖਣਯੋਗ ਨਹੀਂ ਬਣਾਉਂਦੇ।<ph name="BR" /><ph name="BR" />ਆਪਣੇ ਆਪ ਨੂੰ ਕੁਝ ਸਮੇਂ ਲਈ ਦਿਖਣਯੋਗ ਬਣਾਉਣ ਲਈ, ਸਥਿਤੀ ਖੇਤਰ ਖੋਲ੍ਹੋ, ਫਿਰ ਨਜ਼ਦੀਕੀ ਦਿਖਣਯੋਗਤਾ ਚਾਲੂ ਕਰੋ।</translation>
 <translation id="6635944431854494329">ਮਾਲਕ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸੈਟਿੰਗਾਂ &gt; ਉੱਨਤ &gt; Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ ਅਤੇ ਵਰਤੋਂ ਡਾਟਾ ਭੇਜੋ, ਤੋਂ ਕੰਟਰੋਲ ਕਰ ਸਕਦਾ ਹੈ।</translation>
 <translation id="6635956300022133031">ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਲਈ ਅਵਾਜ਼ਾਂ ਚੁਣੋ ਅਤੇ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation>
 <translation id="6636588250634969791">ਜਾਰੀ ਰੱਖਣ ਤੋਂ ਪਹਿਲਾਂ ਸਿਮ ਪਾਓ</translation>
@@ -5027,6 +5046,7 @@
 <translation id="6811332638216701903">DHCP ਹੋਸਟਨਾਮ</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ਰੂਟ ਦੇ ਤੌਰ ਤੇ ਨਹੀਂ ਚਲਾਇਆ ਜਾ ਸਕਦਾ।</translation>
 <translation id="6812841287760418429">ਬਦਲਾਵ ਰੱਖੋ</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{ਫ਼ਾਈਲ}one{# ਫ਼ਾਈਲ}other{# ਫ਼ਾਈਲਾਂ}}</translation>
 <translation id="6817174620439930047">ਪੁੱਛੋ ਜਦੋਂ ਕੋਈ ਸਾਈਟ MIDI ਡੀਵਾਈਸਾਂ 'ਤੇ ਪਹੁੰਚ ਕਰਨ ਲਈ ਸਿਸਟਮ ਦੇ ਵਿਸ਼ੇਸ਼ ਸੁਨੇਹੇ ਵਰਤਣਾ ਚਾਹੁੰਦੀ ਹੋਵੇ (ਸਿਫ਼ਾਰਿਸ਼ੀ)</translation>
 <translation id="6818198425579322765">ਅਨੁਵਾਦ ਕਰਨ ਲਈ ਪੰਨੇ ਦੀ ਭਾਸ਼ਾ</translation>
 <translation id="6818802132960437751">ਬਿਲਟ-ਇਨ ਵਾਇਰਸ ਸੁਰੱਖਿਆ</translation>
@@ -5047,6 +5067,7 @@
 <translation id="6835762382653651563">ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ।</translation>
 <translation id="6838034009068684089">ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ 'ਤੇ ਕਿਸੇ ਸਾਈਟ ਵੱਲੋਂ ਵਿੰਡੋ ਨੂੰ ਖੋਲ੍ਹਣ ਅਤੇ ਉਸਨੂੰ ਰੱਖਣ ਦੌਰਾਨ ਪੁੱਛੋ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation>
 <translation id="6838694093138907871">ਅਵੈਧ ਕੋਡ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{ਫ਼ੋਨ ਨੰਬਰ}one{# ਫ਼ੋਨ ਨੰਬਰ}other{# ਫ਼ੋਨ ਨੰਬਰ}}</translation>
 <translation id="6839225236531462745">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਮਿਟਾਉਣ ਵਿੱਚ ਗੜਬੜ</translation>
 <translation id="6839916869147598086">ਸਾਈਨ-ਇਨ ਬਦਲ ਗਿਆ ਹੈ</translation>
 <translation id="6840155290835956714">ਭੇਜਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛੋ</translation>
@@ -5152,6 +5173,7 @@
 <translation id="6955446738988643816">ਪੌਪਅਪ ਦੀ ਜਾਂਚ ਕਰੋ</translation>
 <translation id="6955535239952325894">ਇਹ ਸੈਟਿੰਗ ਪ੍ਰਬੰਧਿਤ ਬ੍ਰਾਊਜ਼ਰਾਂ 'ਤੇ ਬੰਦ ਹੈ</translation>
 <translation id="6957044667612803194">ਇਸ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਿੱਚ ਪਿੰਨ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{ਲਿੰਕ}one{# ਲਿੰਕ}other{# ਲਿੰਕ}}</translation>
 <translation id="6960507406838246615">Linux ਦਾ ਅੱਪਡੇਟ ਲੋੜੀਂਦਾ ਹੈ</translation>
 <translation id="696103774840402661">ਇਸ <ph name="DEVICE_TYPE" /> ਦੇ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਸਥਾਨਕ ਡਾਟੇ ਨੂੰ ਸਥਾਈ ਤੌਰ 'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="6964390816189577014">ਹੀਰੋ</translation>
@@ -6060,6 +6082,7 @@
 <translation id="797394244396603170">ਉਹ ਡੀਵਾਈਸ ਚੁਣੋ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਫ਼ਾਈਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨਾ ਚਾਹੋਗੇ</translation>
 <translation id="7973962044839454485">ਕਿਸੇ ਗਲਤ ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਪਾਸਵਰਡ ਕਰਕੇ PPP ਪ੍ਰਮਾਣੀਕਰਨ ਅਸਫਲ ਹੋ ਗਿਆ</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" /> ਵਰਤਦੇ ਹੋਏ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation>
+<translation id="7974713334845253259">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰੰਗ</translation>
 <translation id="7974936243149753750">ਓਵਰਸਕੈਨ</translation>
 <translation id="7975504106303186033">ਤੁਹਾਨੂੰ ਇਸ Chrome Education ਡੀਵਾਈਸ ਨੂੰ 'ਸਿੱਖਿਆ ਲਈ ਖਾਤੇ' ਵਿੱਚ ਦਰਜ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਨਵੇਂ ਖਾਤੇ ਲਈ ਸਾਈਨ-ਅੱਪ ਕਰਨ ਵਾਸਤੇ, ਕਿਰਪਾ ਕਰਕੇ g.co/workspace/edusignup 'ਤੇ ਜਾਓ।</translation>
 <translation id="7978412674231730200">ਨਿੱਜੀ ਕੁੰਜੀ</translation>
@@ -6224,6 +6247,7 @@
 <translation id="8157704005178149728">ਨਿਗਰਾਨੀ ਦਾ ਸੈੱਟਅੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="8158117992543756526">ਇਸ ਡੀਵਾਈਸ ਨੇ <ph name="MONTH_AND_YEAR" /> ਵਿੱਚ ਸਵੈਚਲਿਤ ਸਾਫ਼ਟਵੇਅਰ ਅਤੇ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨਾ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਗੜਬੜ</translation>
+<translation id="8160775796528709999">ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਲਾਈਵ ਸੁਰਖੀਆਂ ਨੂੰ ਚਾਲੂ ਕਰਕੇ ਆਪਣੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਲਈ ਸੁਰਖੀਆਂ ਪ੍ਰਾਪਤ ਕਰੋ</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">ਵੈੱਬ ਪੰਨਿਆਂ ਲਈ ਰੀਡਰ ਮੋਡ</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ਟੈਬ ਨੂੰ ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}one{ਟੈਬ ਨੂੰ ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}other{ਟੈਬਾਂ ਨੂੰ ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}}</translation>
@@ -6348,6 +6372,7 @@
 <translation id="8300011035382349091">ਇਸ ਟੈਬ ਦੇ ਬੁੱਕਮਾਰਕ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation>
 <translation id="8300374739238450534">ਘਸਮੈਲਾ ਨੀਲਾ</translation>
 <translation id="8300849813060516376">OTASP ਅਸਫ਼ਲ ਹੋ ਗਿਆ</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{ਪਤਾ}one{# ਪਤਾ}other{# ਪਤੇ}}</translation>
 <translation id="8304383784961451596">ਤੁਸੀਂ ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ ਅਧਿਕਾਰਤ ਨਹੀਂ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਸਾਈਨ-ਇਨ ਇਜਾਜ਼ਤ ਲਈ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ ਜਾਂ Family Link ਤੋਂ ਨਿਗਰਾਨੀ ਵਾਲੇ ਕਿਸੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation>
 <translation id="8308179586020895837">ਪੁੱਛੇ ਕਿ ਕੀ <ph name="HOST" /> ਤੁਹਾਡੇ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ</translation>
 <translation id="830868413617744215">ਬੀਟਾ</translation>
@@ -6646,6 +6671,7 @@
 <translation id="867085395664725367">ਸਰਵਰ ਵਿੱਚ ਅਸਥਾਈ ਗੜਬੜ ਹੋ ਗਈ।</translation>
 <translation id="8673026256276578048">ਵੈੱਬ ਖੋਜੋ...</translation>
 <translation id="8673383193459449849">ਸਰਵਰ ਸਮੱਸਿਆ</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{ਵੀਡੀਓ}one{# ਵੀਡੀਓ}other{# ਵੀਡੀਓ}}</translation>
 <translation id="8676374126336081632">ਇਨਪੁਟ ਹਟਾਓ</translation>
 <translation id="8676770494376880701">ਘੱਟ-ਪਾਵਰ ਦਾ ਚਾਰਜਰ ਕਨੈਕਟ ਕੀਤਾ</translation>
 <translation id="8677212948402625567">ਸਭ ਸਮੇਟੋ</translation>
@@ -7072,6 +7098,7 @@
 <translation id="9128870381267983090">ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ</translation>
 <translation id="9130015405878219958">ਅਵੈਧ ਮੋਡ ਦਾਖ਼ਲ ਕੀਤਾ ਗਿਆ।</translation>
 <translation id="9131487537093447019">ਬਲੂਟੁੱਥ ਡਿਵਾਈਸਾਂ ਨੂੰ ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਇਹਨਾਂ ਤੋਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰੋ।</translation>
+<translation id="9134119143784876218">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਅੰਗਰੇਜ਼ੀ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਲਈ ਸੁਰਖੀਆਂ ਬਣਾਉਂਦੀ ਹੈ (ਫ਼ਿਲਹਾਲ ਸਿਰਫ਼ Chrome ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਉਪਲਬਧ ਹੈ)। ਆਡੀਓ ਅਤੇ ਸੁਰਖੀਆਂ ਨੂੰ ਕਦੇ ਵੀ ਡੀਵਾਈਸ ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਲਿਜਾਇਆ ਜਾਂਦਾ ਹੈ।</translation>
 <translation id="9137013805542155359">ਅਸਲ ਦਿਖਾਓ</translation>
 <translation id="9137157311132182254">ਤਰਜੀਹੀ ਖੋਜ ਇੰਜਣ</translation>
 <translation id="9137248913990643158">ਕਿਰਪਾ ਕਰਕੇ ਇਸ ਐਪ ਨੂੰ ਵਰਤਣ ਤੋਂ ਪਹਿਲਾਂ Chrome ਨੂੰ ਸ਼ੁਰੂ ਕਰਕੇ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation>
@@ -7119,6 +7146,7 @@
 <translation id="9179524979050048593">ਸਾਈਨ-ਇਨ ਸਕ੍ਰੀਨ 'ਤੇ ਵਰਤੋਂਕਾਰ ਨਾਮ</translation>
 <translation id="9180281769944411366">ਇਸ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ ਕੁਝ ਮਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ। Linux ਕੰਟੇਨਰ ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="9180380851667544951">ਸਾਈਟ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਸਾਂਝੀ ਕਰ ਸਕਦੀ ਹੈ</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{ਐਪ}one{# ਐਪ}other{# ਐਪਾਂ}}</translation>
 <translation id="9186963452600581158">ਕਿਸੇ ਬੱਚੇ ਦੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="9188732951356337132">ਵਰਤੋਂ ਅਤੇ ਤਸ਼ਖੀਸ ਡਾਟਾ ਭੇਜੋ। ਇਹ ਡੀਵਾਈਸ ਇਸ ਵੇਲੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ, ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਵਰਤੋਂ ਡਾਟਾ Google ਨੂੰ ਭੇਜ ਰਿਹਾ ਹੈ। ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬੱਚੇ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ ਅਤੇ ਸਿਸਟਮ ਅਤੇ ਐਪ ਸਥਿਰਤਾ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ। ਕੁਝ ਏਕੀਕ੍ਰਿਤ ਜਾਣਕਾਰੀ Google ਐਪਾਂ ਅਤੇ ਪਾਰਟਨਰਾਂ, ਜਿਵੇਂ ਕਿ Android ਵਿਕਾਸਕਾਰਾਂ, ਦੀ ਵੀ ਮਦਦ ਕਰੇਗੀ। ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਸਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। <ph name="BEGIN_LINK2" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">ਆਪਣੇ Android ਫ਼ੋਨ ਨੂੰ ਇੱਕ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਜੋਂ ਵਰਤੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 7d79780..82fe4da7 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1043,6 +1043,7 @@
 <translation id="2154710561487035718">Kopiuj adres URL</translation>
 <translation id="2155772377859296191">Wygląda na <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Skrypt service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Uruchom ponownie potwierdzenie bezpieczeństwa</translation>
 <translation id="2157474325782140681">Aby korzystać z większej liczby funkcji, używaj stacji dokującej Dell przeznaczonej do tego Chromebooka.</translation>
 <translation id="215753907730220065">Zamknij pełny ekran</translation>
 <translation id="2157875535253991059">Ta strona jest wyświetlana w trybie pełnoekranowym.</translation>
@@ -1987,6 +1988,7 @@
 <translation id="3225319735946384299">Podpisywanie kodu</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Utwórz kopię zapasową aplikacji i plików Linuksa</translation>
+<translation id="3238192140106069382">Łączę i weryfikuję</translation>
 <translation id="3239373508713281971">Usunięto limit czasu dla aplikacji <ph name="APP_NAME" />.</translation>
 <translation id="3241680850019875542">Wybierz główny katalog rozszerzenia, które chcesz umieścić w pakiecie. Aby zaktualizować rozszerzenie, wybierz również plik kluczy prywatnych do ponownego użycia.</translation>
 <translation id="3244294424315804309">Nadal wyciszaj dźwięk</translation>
@@ -2583,7 +2585,6 @@
 <translation id="3882165008614329320">Istniejący film z aparatu lub pliku</translation>
 <translation id="3884152383786131369">Treści internetowe dostępne w wielu językach będą wyświetlać się w pierwszym obsługiwanym języku z tej listy. Te ustawienia są zsynchronizowane z ustawieniami przeglądarki. <ph name="BEGIN_LINK_LEARN_MORE" />Więcej informacji<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Twoja prośba o dostęp to tej strony została wysłana do: <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Wyłączono. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Robienie notatek w aplikacji <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Aby korzystać z synchronizacji Wi-Fi, włącz Synchronizację Chrome</translation>
 <translation id="3892414795099177503">Dodaj OpenVPN/L2TP…</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">Importuj zakładki i ustawienia</translation>
 <translation id="3960566196862329469">Konfiguracja ONC</translation>
 <translation id="3964480518399667971">Wyłącz sieć komórkową</translation>
-<translation id="3965730875470565266">Włączono, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Za pomocą</translation>
 <translation id="3965965397408324205">Zamknij: <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Wybierz inny folder...</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">Profile</translation>
 <translation id="583281660410589416">Nieznany</translation>
 <translation id="5833397272224757657">Zawartość otwieranych stron oraz informacje o Twoich interakcjach i aktywności w przeglądarce zostaną wykorzystane do personalizacji</translation>
-<translation id="5833551944249825624">Twój Chromebook będzie widoczny dla wszystkich w pobliżu przez 5 min</translation>
 <translation id="5833726373896279253">Tylko właściciel może zmodyfikować te ustawienia:</translation>
 <translation id="5834581999798853053">Zostało około <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – nagrywanie kamerą lub mikrofonem</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index daee2ab..531bf03 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2587,7 +2587,6 @@
 <translation id="3882165008614329320">Vídeo existente de uma câmera ou de um arquivo</translation>
 <translation id="3884152383786131369">Conteúdos da Web disponíveis em vários idiomas usarão o primeiro idioma compatível desta lista. Estas preferências são sincronizadas com as configurações do navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Sua solicitação para acessar este site foi enviada para <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Desativado. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Tomando notas com <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Ativar a Sincronização do Chrome para usar o recurso Sincronizar Wi-Fi</translation>
 <translation id="3892414795099177503">Adicionar OpenVPN / L2TP…</translation>
@@ -2671,7 +2670,6 @@
 <translation id="3958088479270651626">Importar favoritos e configurações</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desativar a rede celular</translation>
-<translation id="3965730875470565266">Ativado, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Com</translation>
 <translation id="3965965397408324205">Sair de <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Escolher outra pasta...</translation>
@@ -4222,7 +4220,6 @@
 <translation id="5832813618714645810">Perfis</translation>
 <translation id="583281660410589416">Desconhecido</translation>
 <translation id="5833397272224757657">Usa o conteúdo dos sites que você visita, além das interações e atividades do navegador, para personalização</translation>
-<translation id="5833551944249825624">O Chromebook ficará visível para qualquer pessoa por perto por 5 minutos</translation>
 <translation id="5833726373896279253">Estas definições somente poderão ser alteradas pelo proprietário:</translation>
 <translation id="5834581999798853053">Cerca de <ph name="TIME" /> minutos restantes</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Gravação de câmera ou microfone</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 973eb394..2611f907 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2155772377859296191">Parece ter <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Executar novamente a verificação de segurança</translation>
 <translation id="2157474325782140681">Para ter acesso a mais funcionalidades, utilize uma estação de ancoragem Dell concebida para trabalhar com este Chromebook.</translation>
 <translation id="215753907730220065">Sair do modo de ecrã inteiro</translation>
 <translation id="2157875535253991059">Esta página está agora em ecrã inteiro.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Assinatura de código</translation>
 <translation id="3227137524299004712">Microfone</translation>
 <translation id="3233271424239923319">Fazer uma cópia de segurança de aplicações e ficheiros do Linux</translation>
+<translation id="3238192140106069382">A ligar e a validar…</translation>
 <translation id="3239373508713281971">Limite de tempo removido para a app <ph name="APP_NAME" />.</translation>
 <translation id="3241680850019875542">Selecione o directório raiz da extensão a comprimir. Para atualizar uma extensão, selecione também o ficheiro de chave privada a reutilizar.</translation>
 <translation id="3244294424315804309">Manter o som desativado</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Vídeo existente da câmara ou do ficheiro</translation>
 <translation id="3884152383786131369">O conteúdo Web disponível em vários idiomas irá utilizar o primeiro idioma suportado desta lista. Estas preferências serão sincronizadas com as definições do seu navegador. <ph name="BEGIN_LINK_LEARN_MORE" />Saiba mais<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">O seu pedido para aceder a este site foi enviado para <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Desligado. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" />.</translation>
 <translation id="3888550877729210209">Tirar notas com a aplicação <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Ative a Sincronização do Chrome para utilizar o Sync Wi-Fi</translation>
 <translation id="3892414795099177503">Adicionar OpenVPN/L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Importar marcadores e definições</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Desativar rede móvel</translation>
-<translation id="3965730875470565266">Ligado, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Com</translation>
 <translation id="3965965397408324205">Sair de <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Escolher outra pasta...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Perfis</translation>
 <translation id="583281660410589416">Desconhecido</translation>
 <translation id="5833397272224757657">Utiliza conteúdo nos sites que visita e interações e atividades do navegador para personalização.</translation>
-<translation id="5833551944249825624">O seu Chromebook estará visível para todos os utilizadores nas proximidades durante 5 min.</translation>
 <translation id="5833726373896279253">Estas definições só podem ser modificadas pelo proprietário:</translation>
 <translation id="5834581999798853053">Faltam cerca de <ph name="TIME" /> minutos</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – câmara ou microfone a gravar</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 764c3df..8c5e089 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1046,6 +1046,7 @@
 <translation id="2154710561487035718">Copiați adresa URL</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Rulează din nou verificarea de siguranță</translation>
 <translation id="2157474325782140681">Pentru a beneficia de mai multe funcții, folosește o stație de andocare Dell proiectată să funcționeze cu acest Chromebook.</translation>
 <translation id="215753907730220065">Ieși din ecranul complet</translation>
 <translation id="2157875535253991059">Acum această pagină este în modul ecran complet.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Semnarea codului</translation>
 <translation id="3227137524299004712">Microfon</translation>
 <translation id="3233271424239923319">Fă backup pentru aplicațiile și fișierele Linux</translation>
+<translation id="3238192140106069382">Se conectează și se verifică</translation>
 <translation id="3239373508713281971">Limita de timp pentru <ph name="APP_NAME" /> a fost eliminată</translation>
 <translation id="3241680850019875542">Selectează directorul rădăcină al extensiei ce trebuie împachetată. Pentru a actualiza o extensie, selectează și fișierul cu cheia privată pentru reutilizare.</translation>
 <translation id="3244294424315804309">Continuă să dezactivezi sunetul</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Videoclip existent din camera foto sau din fișier</translation>
 <translation id="3884152383786131369">Conținutul web care este disponibil în mai multe limbi va folosi prima limbă acceptată din această listă. Aceste preferințe se sincronizează cu setările browserului. <ph name="BEGIN_LINK_LEARN_MORE" />Află mai multe<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Solicitarea de a accesa acest site a fost trimisă către <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Dezactivată. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Scriere de notițe cu <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Activează Sincronizarea Chrome pentru a folosi Sincronizarea Wi-Fi</translation>
 <translation id="3892414795099177503">Adaugă OpenVPN/L2TP…</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Importați marcaje și setări</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Dezactivează rețeaua mobilă</translation>
-<translation id="3965730875470565266">Activată, <ph name="MINUTES" /> min.</translation>
 <translation id="3965811923470826124">Cu</translation>
 <translation id="3965965397408324205">Ieși din <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Alegeți alt dosar...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Profiluri</translation>
 <translation id="583281660410589416">Necunoscut</translation>
 <translation id="5833397272224757657">Folosește conținutul de pe site-urile pe care le accesezi, activitatea browserului și interacțiunile pentru personalizare</translation>
-<translation id="5833551944249825624">Chromebookul tău va fi vizibil pentru toți utilizatorii din apropiere timp de cinci minute</translation>
 <translation id="5833726373896279253">Aceste setări pot fi modificate numai de proprietar:</translation>
 <translation id="5834581999798853053">Au mai rămas aproape <ph name="TIME" /> min.</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – camera foto sau microfonul înregistrează</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 7e84d4a7..6fd76b04 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Копировать URL</translation>
 <translation id="2155772377859296191">Выглядит как <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Снова запустить проверку безопасности</translation>
 <translation id="2157474325782140681">Чтобы получить доступ к дополнительным возможностям, используйте док-станцию Dell, предназначенную для этого устройства Chromebook.</translation>
 <translation id="215753907730220065">Выход из полноэкранного режима</translation>
 <translation id="2157875535253991059">Эта страница отображается в полноэкранном режиме.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Подписывание кода</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Выполнить резервное копирование приложений и файлов Linux</translation>
+<translation id="3238192140106069382">Подключение и проверка…</translation>
 <translation id="3239373508713281971">Для приложения "<ph name="APP_NAME" />" снято ограничение времени использования.</translation>
 <translation id="3241680850019875542">Выберите корневой каталог упаковываемого расширения. Для обновления расширения также укажите закрытый ключ.</translation>
 <translation id="3244294424315804309">Не включать звук</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Видео с камеры или из файла</translation>
 <translation id="3884152383786131369">Для веб-контента, доступного на нескольких языках, будет использоваться первый подходящий вариант из списка ниже. Эти настройки синхронизированы с настройками браузера. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Ваш запрос на доступ к сайту отправлен пользователю <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Функция выключена. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Заметки в приложении "<ph name="LOCK_SCREEN_APP_NAME" />"</translation>
 <translation id="3890064827463908288">Чтобы использовать функцию "Синхронизация Wi-Fi", включите синхронизацию Chrome</translation>
 <translation id="3892414795099177503">Включить OpenVPN/L2TP...</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Импорт закладок и настроек</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Отключить мобильную сеть</translation>
-<translation id="3965730875470565266">Функция включена на <ph name="MINUTES" /> мин.</translation>
 <translation id="3965811923470826124">Использовать</translation>
 <translation id="3965965397408324205">Выйти из профиля пользователя <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Выбрать другую папку...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Профили</translation>
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5833397272224757657">Использовать для персонализации информацию с посещенных вами сайтов и данные о действиях в браузере</translation>
-<translation id="5833551944249825624">Ваш Chromebook в течение пяти минут будет виден всем пользователям, которые находятся поблизости</translation>
 <translation id="5833726373896279253">Изменять данные настройки может только владелец:</translation>
 <translation id="5834581999798853053">Осталось <ph name="TIME" /> мин.</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: идет запись с камеры или микрофона</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index e0b9ca5..baa8063 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1043,6 +1043,7 @@
 <translation id="2154710561487035718">URL පිටපත්</translation>
 <translation id="2155772377859296191">පේන විදියට <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">සේවා සේවක: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">නැවත ආරක්ෂක පරීක්ෂාව ධාවනය කරන්න</translation>
 <translation id="2157474325782140681">අමතර විශේෂාංග ලබා ගැනීමට, මෙම Chromebook සමඟ ක්‍රියා කිරීමට සැලසුම් කර ඇති Dell ඩොක් කිරීමේ ස්ථානයක් භාවිත කරන්න.</translation>
 <translation id="215753907730220065">සම්පූර්ණ තිරයෙන් ඉවත් වන්න</translation>
 <translation id="2157875535253991059">මෙම පිටුව දැන් තිරය පුරා ඇත.</translation>
@@ -1987,6 +1988,7 @@
 <translation id="3225319735946384299">කේත අත්සන් කිරීම</translation>
 <translation id="3227137524299004712">මයික්‍රෆෝනය:</translation>
 <translation id="3233271424239923319">ලිනක්ස් යෙදුම් සහ ගොනු උපස්ථ කරන්න</translation>
+<translation id="3238192140106069382">සම්බන්ධ කරමින් සහ සත්‍යාපනය කරමින්</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> සඳහා වන කාල සීමාව</translation>
 <translation id="3241680850019875542">ඇසිරීම සඳහා වන දිගුවල මූල නාමාවලිය තෝරන්න. දිගුවක් යාවත් කිරීමට, නැවත භාවිතා කිරීමට පුද්ගලික යතුරද තෝරන්න.</translation>
 <translation id="3244294424315804309">හඬ නිහඬ කිරීම දිගටම කරගෙන යන්න</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">කැමරාවෙන් හෝ ගොනුවෙන් පවතින වීඩියෝව</translation>
 <translation id="3884152383786131369">භාෂා කිහිපයකින් ලබා ගත හැකි වෙබ් අන්තර්ගතය මෙම ලැයිස්තුවෙන් පළමු සහාය දක්වන භාෂාව භාවිත කරයි. මෙම මනාප ඔබගේ බ්‍රව්සර සැකසීම් සමඟ සමමුහුර්ත කර ඇත. <ph name="BEGIN_LINK_LEARN_MORE" />තව දැන ගන්න<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">මෙම අඩවියට පිවිසීමට ඔබ කළ ඉල්ලීම <ph name="NAME" /> වෙත යවන ලදී</translation>
-<translation id="3888364689515978571">ක්‍රියාවිරහිතයි. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> සමඟ සටහන් ගැනීම</translation>
 <translation id="3890064827463908288">Wi-Fi සමමුහුර්තකරණය භාවිත කිරීමට Chrome සමමුහුර්තකරණය ක්‍රියාත්මක කරන්න</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP එක් කරන්න...</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">පිටුසන් සහ සැකසුම් ආයාත කරන්න</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">සෙලියුලර් ජාලය අක්‍රිය කරන්න</translation>
-<translation id="3965730875470565266">ක්‍රියාත්මකයි, මිනිත්තු <ph name="MINUTES" /></translation>
 <translation id="3965811923470826124">සමඟ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> වෙතින් පිට වන්න</translation>
 <translation id="3966072572894326936">වෙනත් ෆෝල්ඩරයක් තෝරන්න...</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">පැතිකඩවල්</translation>
 <translation id="583281660410589416">නොදනී</translation>
 <translation id="5833397272224757657">ඔබ පිවිසෙන අඩවිවල අන්තර්ගතය සහ බ්‍රව්ස් කිරීමේ ක්‍රියාකාරකම් සහ අන්තර්ක්‍රියා, පුද්ගලිකකරණය සඳහා භාවිතා කරයි</translation>
-<translation id="5833551944249825624">ඔබගේ Chromebook මිනිත්තු 5ක් අවට සිටින සියලු දෙනාට දෘශ්‍යමාන වනු ඇත</translation>
 <translation id="5833726373896279253">මෙම සැකසුම් හිමිකරු විසින් පමණක් වෙනස් කළ හැක:</translation>
 <translation id="5834581999798853053">මිනිත්තු <ph name="TIME" /> පමණ ඉතිරිව ඇත</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - කැමරා හෝ මයික්‍රෆෝන පටිගත කිරීම</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 7c6a33b..c9d10dc 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1047,6 +1047,7 @@
 <translation id="2154710561487035718">Kopírovať webovú adresu</translation>
 <translation id="2155772377859296191">Vyzerá ako <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Obsluha: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Znova spustiť kontrolu bezpečnosti</translation>
 <translation id="2157474325782140681">Ak chcete získať ďalšie funkcie, použite dokovaciu stanicu od spoločnosti Dell, ktorá je navrhnutá pre tento Chromebook.</translation>
 <translation id="215753907730220065">Ukončiť zobrazenie na celú obrazovku</translation>
 <translation id="2157875535253991059">Táto stránka je teraz zobrazená na celú obrazovku.</translation>
@@ -1990,6 +1991,7 @@
 <translation id="3225319735946384299">Podpisovanie kódu</translation>
 <translation id="3227137524299004712">Mikrofón</translation>
 <translation id="3233271424239923319">Zálohovanie aplikácií a súborov pre Linux</translation>
+<translation id="3238192140106069382">Prebieha pripájanie a overovanie</translation>
 <translation id="3239373508713281971">Bol odstránený časový limit pre aplikáciu <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Vyberte koreňový adresár rozšírenia, ktoré chcete zbaliť. Ak chcete rozšírenie aktualizovať, vyberte tiež súbor súkromného kľúča, ktorý sa má znova použiť.</translation>
 <translation id="3244294424315804309">Ponechať zvuk vypnutý</translation>
@@ -2586,7 +2588,6 @@
 <translation id="3882165008614329320">Existujúce video z fotoaparátu alebo súboru</translation>
 <translation id="3884152383786131369">Internetový obsah dostupný vo viacerých jazykoch použije prvý podporovaný jazyk z tohto zoznamu. Tieto predvoľby sú synchronizované s nastaveniami vášho prehliadača. <ph name="BEGIN_LINK_LEARN_MORE" />Ďalšie informácie<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Vaša žiadosť o prístup na tento web sa odoslala správcovi <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Vypnuté. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Písanie poznámok v aplikácii <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Zapnite synchronizáciu Chromu, aby ste mohli používať Synchronizáciu Wi-Fi</translation>
 <translation id="3892414795099177503">Pridať OpenVPN / L2TP...</translation>
@@ -2670,7 +2671,6 @@
 <translation id="3958088479270651626">Importovať záložky a nastavenia</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Vypnúť mobilnú sieť</translation>
-<translation id="3965730875470565266">Zapnuté, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Pomocou</translation>
 <translation id="3965965397408324205">Ukončiť profil <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Vybrať iný priečinok...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Profily</translation>
 <translation id="583281660410589416">Neznáme</translation>
 <translation id="5833397272224757657">Používa obsah z navštívených webov, aktivitu prehliadača a interakcie s ním na prispôsobenie</translation>
-<translation id="5833551944249825624">Váš Chromebook bude päť minút viditeľný pre všetkých nablízku</translation>
 <translation id="5833726373896279253">Tieto nastavenia môže upraviť len vlastník:</translation>
 <translation id="5834581999798853053">Zostáva približne <ph name="TIME" /> min.</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera alebo mikrofón zaznamenáva obsah</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 40f56fd..2661c27 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1048,6 +1048,7 @@
 <translation id="2154710561487035718">Kopiraj URL</translation>
 <translation id="2155772377859296191">Videti je <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Proces storitve: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Vnovični zagon varnostnega preverjanja</translation>
 <translation id="2157474325782140681">Če želite dodatne funkcije, uporabite priklopno postajo Dell, zasnovano za uporabo s tem Chromebookom.</translation>
 <translation id="215753907730220065">Izhod iz celozaslonskega načina</translation>
 <translation id="2157875535253991059">Ta stran je zdaj prikazana na celotnem zaslonu.</translation>
@@ -1992,6 +1993,7 @@
 <translation id="3225319735946384299">Podpisovanje kode</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Varnostno kopiranje aplikacij in datotek za Linux</translation>
+<translation id="3238192140106069382">Vzpostavljanje povezave in preverjanje</translation>
 <translation id="3239373508713281971">Časovna omejitev je odstranjena za aplikacijo <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Izberite korenski imenik razširitve, ki jo želite zapakirati. Če želite posodobiti razširitev, izberite tudi datoteko z zasebnim ključem, ki jo želite znova uporabiti.</translation>
 <translation id="3244294424315804309">Zvok naj bo še naprej izklopljen</translation>
@@ -2588,7 +2590,6 @@
 <translation id="3882165008614329320">Obstoječi videoposnetek iz fotoaparata ali datoteke</translation>
 <translation id="3884152383786131369">Za spletno vsebino, ki je na voljo v več jezikih, bo uporabljen prvi podprti jezik s tega seznama. Te nastavitve se sinhronizirajo z nastavitvami brskalnika. <ph name="BEGIN_LINK_LEARN_MORE" />Več o tem<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Vaša zahteva za dostop do tega mesta je poslana uporabniku <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Izklopljeno. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Ustvarjanje zapiskov z aplikacijo <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Vklopite sinhronizacijo za Chrome, če želite uporabljati sinhronizacijo poverilnic za Wi-Fi</translation>
 <translation id="3892414795099177503">Dodaj OpenVPN/L2TP ...</translation>
@@ -2672,7 +2673,6 @@
 <translation id="3958088479270651626">Uvoz zaznamkov in nastavitev</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Izklop mobilnega omrežja</translation>
-<translation id="3965730875470565266">Vklopljeno, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">S/z</translation>
 <translation id="3965965397408324205">Zapri <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Izberite drugo mapo ...</translation>
@@ -4224,7 +4224,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Neznano</translation>
 <translation id="5833397272224757657">Uporablja vsebino na spletnih mestih, ki jih obiščete, ter dejavnost v brskalniku in interakcijo zaradi prilagajanja</translation>
-<translation id="5833551944249825624">Vaš Chromebook bo 5 minut viden vsem v bližini</translation>
 <translation id="5833726373896279253">Te nastavitve lahko spreminja samo lastnik:</translation>
 <translation id="5834581999798853053">Še približno <ph name="TIME" /> min</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – snemanje fotoaparata ali mikrofona</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 8f426ee..f822a08d9 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">Kopjo URL-në</translation>
 <translation id="2155772377859296191">Duket si <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Punonjësi i shërbimit: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Ekzekuto përsëri kontrollin e sigurisë</translation>
 <translation id="2157474325782140681">Për të marrë veçori shtesë, përdor një stacion lidhjeje Dell të projektuar për të funksionuar me këtë Chromebook.</translation>
 <translation id="215753907730220065">Dil nga ekrani i plotë</translation>
 <translation id="2157875535253991059">Kjo faqe tani është në ekran të plotë</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Nënshkrimi me kod</translation>
 <translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3233271424239923319">Rezervo aplikacionet dhe skedarët Linux</translation>
+<translation id="3238192140106069382">Po lidh dhe po verifikon</translation>
 <translation id="3239373508713281971">Kufiri kohor u hoq për <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Përzgjidh direktorinë kryesore të shtesës prej nga do të krijosh paketën. Për të përditësuar një shtesë, përzgjidh gjithashtu skedarin e çelësit privat për ripërdorim.</translation>
 <translation id="3244294424315804309">Vazhdo ta çaktivizosh tingullin</translation>
@@ -2582,7 +2584,6 @@
 <translation id="3882165008614329320">Video ekzistuese nga kamera ose skedari</translation>
 <translation id="3884152383786131369">Përmbajtja e uebit që ofrohet në shumë gjuhë do të përdorë gjuhën e parë të mbështetur nga kjo listë. Këto preferenca sinkronizohen me cilësimet e shfletuesit tënd. <ph name="BEGIN_LINK_LEARN_MORE" />Mëso më shumë<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Kërkesa jote për qasje te ky sajt është dërguar te <ph name="NAME" />.</translation>
-<translation id="3888364689515978571">Joaktiv. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Marrja e shënimeve me <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Aktivizo "Sinkronizimin e Chrome" për të përdorur "Sinkronizimin e Wi-Fi"</translation>
 <translation id="3892414795099177503">Shto OpenVPN / L2TP...</translation>
@@ -2666,7 +2667,6 @@
 <translation id="3958088479270651626">Importo faqeshënuesit dhe cilësimet</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Çaktivizo "Rrjetin celular"</translation>
-<translation id="3965730875470565266">Aktive, <ph name="MINUTES" /> min.</translation>
 <translation id="3965811923470826124">Me</translation>
 <translation id="3965965397408324205">Dil nga <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Zgjidh një dosje tjetër...</translation>
@@ -4215,7 +4215,6 @@
 <translation id="5832813618714645810">Profilet</translation>
 <translation id="583281660410589416">E panjohur</translation>
 <translation id="5833397272224757657">Përdor për personalizim përmbajtjen e faqeve që ti viziton, si dhe aktivitetin dhe bashkëveprimet nga shfletuesi</translation>
-<translation id="5833551944249825624">Pajisja jote Chromebook do të jetë e dukshme për të gjithë në afërsi për 5 minuta</translation>
 <translation id="5833726373896279253">Këto cilësime mund të modifikohen vetëm nga zotëruesi:</translation>
 <translation id="5834581999798853053">Rreth <ph name="TIME" /> minuta të mbetura</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - kamera ose mikrofoni po regjistron</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 6326a40b..7a8c7f5 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1044,6 +1044,7 @@
 <translation id="2154710561487035718">Kopiranje URL adrese</translation>
 <translation id="2155772377859296191">Izgleda da je u pitanju <ph name="WIDTH" />×<ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Serviser: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Ponovo pokreni bezbednosnu proveru</translation>
 <translation id="2157474325782140681">Da biste koristili dodatne funkcije, koristite Dell baznu stanicu kompatibilnu sa ovim Chromebook-om.</translation>
 <translation id="215753907730220065">Izađi iz režima celog ekrana</translation>
 <translation id="2157875535253991059">Ova stranica je sada u režimu celog ekrana.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">Potpisivanje koda</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Napravite rezervne kopije Linux aplikacija i datoteka</translation>
+<translation id="3238192140106069382">Povezuje se i verifikuje</translation>
 <translation id="3239373508713281971">Vremensko ograničenje je uklonjeno za aplikaciju <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Izaberite osnovni direktorijum dodatka za pakovanje. Da biste ažurirali dodatak, izaberite i datoteku privatnog ključa koja će se ponovo koristiti.</translation>
 <translation id="3244294424315804309">Ne uključuj zvuk</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">Postojeći video iz kamere ili datoteke</translation>
 <translation id="3884152383786131369">Veb-sadržaj koji je dostupan na više jezika koristi prvi podržani jezik sa ove liste. Ova podešavanja se sinhronizuju sa podešavanjima pregledača. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Zahtev za pristup ovom sajtu je poslat korisniku <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Isključeno je. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Pravljenje beležaka pomoću aplikacije <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Uključite Chrome sinhronizaciju da biste koristili WiFi sinhronizaciju</translation>
 <translation id="3892414795099177503">Dodaj OpenVPN/L2TP...</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">Uvezite obeleživače i podešavanja</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Isključi mobilnu mrežu</translation>
-<translation id="3965730875470565266">Uključeno je, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Sa razrešivačem</translation>
 <translation id="3965965397408324205">Zatvori <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Odaberi drugi direktorijum...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profili</translation>
 <translation id="583281660410589416">Nepoznato</translation>
 <translation id="5833397272224757657">Koristi sadržaj na sajtovima koje posećujete, kao i aktivnosti i interakcije u pregledaču radi personalizacije</translation>
-<translation id="5833551944249825624">Chromebook će 5 min biti vidljiv svima u blizini</translation>
 <translation id="5833726373896279253">Ova podešavanja može da izmeni samo vlasnik:</translation>
 <translation id="5834581999798853053">Ostalo je oko <ph name="TIME" /> minuta</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera ili mikrofon snimaju</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index bc005bad..e80c370 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1044,6 +1044,7 @@
 <translation id="2154710561487035718">Копирање URL адресе</translation>
 <translation id="2155772377859296191">Изгледа да је у питању <ph name="WIDTH" />×<ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Сервисер: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Поново покрени безбедносну проверу</translation>
 <translation id="2157474325782140681">Да бисте користили додатне функције, користите Dell базну станицу компатибилну са овим Chromebook-ом.</translation>
 <translation id="215753907730220065">Изађи из режима целог екрана</translation>
 <translation id="2157875535253991059">Ова страница је сада у режиму целог екрана.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">Потписивање кода</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3233271424239923319">Направите резервне копије Linux апликација и датотека</translation>
+<translation id="3238192140106069382">Повезује се и верификује</translation>
 <translation id="3239373508713281971">Временско ограничење је уклоњено за апликацију <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Изаберите основни директоријум додатка за паковање. Да бисте ажурирали додатак, изаберите и датотеку приватног кључа која ће се поново користити.</translation>
 <translation id="3244294424315804309">Не укључуј звук</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">Постојећи видео из камере или датотеке</translation>
 <translation id="3884152383786131369">Веб-садржај који је доступан на више језика користи први подржани језик са ове листе. Ова подешавања се синхронизују са подешавањима прегледача. <ph name="BEGIN_LINK_LEARN_MORE" />Сазнајте више<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Захтев за приступ овом сајту је послат кориснику <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Искључено је. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Прављење бележака помоћу апликације <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Укључите Chrome синхронизацију да бисте користили WiFi синхронизацију</translation>
 <translation id="3892414795099177503">Додај OpenVPN/L2TP...</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">Увезите обележиваче и подешавања</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Искључи мобилну мрежу</translation>
-<translation id="3965730875470565266">Укључено је, <ph name="MINUTES" /> мин</translation>
 <translation id="3965811923470826124">Са разрешивачем</translation>
 <translation id="3965965397408324205">Затвори <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Одабери други директоријум...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Профили</translation>
 <translation id="583281660410589416">Непознато</translation>
 <translation id="5833397272224757657">Користи садржај на сајтовима које посећујете, као и активности и интеракције у прегледачу ради персонализације</translation>
-<translation id="5833551944249825624">Chromebook ће 5 мин бити видљив свима у близини</translation>
 <translation id="5833726373896279253">Ова подешавања може да измени само власник:</translation>
 <translation id="5834581999798853053">Остало је око <ph name="TIME" /> минута</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Камера или микрофон снимају</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 6c64f61..f1cf2a0 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Kopiera webbadress</translation>
 <translation id="2155772377859296191">Ser ut som <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Tjänstefunktion: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Kontrollera säkerheten igen</translation>
 <translation id="2157474325782140681">Använd en dockningsstation som är gjord för att användas med denna Chromebook om du vill ha tillgång till ytterligare funktioner.</translation>
 <translation id="215753907730220065">Avsluta helskärmsläge</translation>
 <translation id="2157875535253991059">Denna sida visas nu i helskärm.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Kodsignering</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Säkerhetskopiera Linux-appar och Linux-filer</translation>
+<translation id="3238192140106069382">Ansluter och verifierar</translation>
 <translation id="3239373508713281971">Tidsgränsen för <ph name="APP_NAME" /> har tagits bort</translation>
 <translation id="3241680850019875542">Välj rotkatalogen för tillägget som ska paketeras. Om du vill uppdatera ett tillägg väljer du också den privata nyckel som ska återanvändas.</translation>
 <translation id="3244294424315804309">Ljud fortsatt av</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Befintlig video från kamera eller fil</translation>
 <translation id="3884152383786131369">Det första språk som stöds i den här listan kommer att användas för webbinnehåll som är tillgängligt på flera språk. Dessa inställningar synkroniseras med inställningarna för webbläsaren. <ph name="BEGIN_LINK_LEARN_MORE" />Läs mer<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Din begäran om att få tillgång till denna webbplats har skickats till <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Av. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Anteckna med <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Aktivera Chrome Sync om du vill använda Wi-Fi-synkronisering</translation>
 <translation id="3892414795099177503">Lägg till OpenVPN/L2TP …</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Importera bokmärken och inställningar</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Inaktivera mobilnätverk</translation>
-<translation id="3965730875470565266">På, <ph name="MINUTES" /> min</translation>
 <translation id="3965811923470826124">Med</translation>
 <translation id="3965965397408324205">Stäng <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Välj en annan mapp...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Profiler</translation>
 <translation id="583281660410589416">Okänd</translation>
 <translation id="5833397272224757657">Använder innehåll på webbplatser du besöker, samt aktivitet i och interaktion med webbläsaren, i anpassningssyfte</translation>
-<translation id="5833551944249825624">Din Chromebook är synlig för alla i närheten i 5 min</translation>
 <translation id="5833726373896279253">Inställningarna kan bara ändras av ägaren:</translation>
 <translation id="5834581999798853053">Ca <ph name="TIME" /> minuter kvar</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kameran eller mikrofonen spelar in</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 5accc8b..dc9aadd 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1042,6 +1042,7 @@
 <translation id="2154710561487035718">Nakili UR:</translation>
 <translation id="2155772377859296191">Inaonekana kama <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Mhudumu: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Tekeleza ukaguzi wa usalama tena</translation>
 <translation id="2157474325782140681">Ili upate vipengele vya ziada, tumia kituo cha Dell cha kuambatisha kinachoweza kutumiwa na Chromebook hii.</translation>
 <translation id="215753907730220065">Ondoka kwenye Skrini Kamili</translation>
 <translation id="2157875535253991059">Ukurasa huu sasa umejaa.</translation>
@@ -1986,6 +1987,7 @@
 <translation id="3225319735946384299">Utiaji Sahihi wa Misimbo</translation>
 <translation id="3227137524299004712">Maikrofoni</translation>
 <translation id="3233271424239923319">Hifadhi nakala za programu na faili za Linux</translation>
+<translation id="3238192140106069382">Inaunganisha na kuthibitisha</translation>
 <translation id="3239373508713281971">Kikomo cha muda kimeondolewa kwenye <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Chagua saraka msingi ya kiendelezi ya kuweka kwenye furushi. Kusasisha kiendelezi, chagua pia ufunguo wa kibinafsi wa kutumia tena.</translation>
 <translation id="3244294424315804309">Endelea kuzima sauti</translation>
@@ -2582,7 +2584,6 @@
 <translation id="3882165008614329320">Video iliyopo kutoka kwenye kamera au faili</translation>
 <translation id="3884152383786131369">Maudhui ya wavuti yanayopatikana katika lugha nyingi yatatumia lugha ya kwanza inayoweza kutumika kwenye orodha hii. Mapendeleo haya husawazishwa na mipangilio ya kivinjari chako. <ph name="BEGIN_LINK_LEARN_MORE" />Pata maelezo zaidi<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Ombi lako la kufikia tovuti hii limetumwa kwa <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Imezimwa. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Madokezo yanachukuliwa na <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Washa kipengele cha Usawazishaji wa Chrome ili uweze kutumia kipengele cha Usawazishaji Wi-Fi</translation>
 <translation id="3892414795099177503">Ongeza OpenVPN / L2TP...</translation>
@@ -2666,7 +2667,6 @@
 <translation id="3958088479270651626">Leta alamisho na mipangilio</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Zima Mtandao wa Simu</translation>
-<translation id="3965730875470565266">Imewashwa, dakika <ph name="MINUTES" /></translation>
 <translation id="3965811923470826124">Ukitumia</translation>
 <translation id="3965965397408324205">Funga <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Chagua folda nyingine...</translation>
@@ -4214,7 +4214,6 @@
 <translation id="5832813618714645810">Wasifu</translation>
 <translation id="583281660410589416">Haijulikani</translation>
 <translation id="5833397272224757657">Hutumia maudhui kwenye tovuti unazotembelea pamoja na shughuli na vitendo vya kivinjari ili kuweka mapendeleo</translation>
-<translation id="5833551944249825624">Chromebook yako itaonekana na kila mtu aliye karibu, kwa dakika tano</translation>
 <translation id="5833726373896279253">Mipangilio hii inaweza tu kurekebishwa na mmiliki.</translation>
 <translation id="5834581999798853053">Zimesalia karibu dakika <ph name="TIME" /></translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Kurekodi kwa kamera au maikrofoni</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index cec20ec..003e71e 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">சேவைப் பணியாளர்கள்</translation>
 <translation id="1235458158152011030">தெரிந்த நெட்வொர்க்குகள்autof</translation>
 <translation id="123578888592755962">வட்டு நிறைந்துவிட்டது</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{உரை}other{# உரைகள்}}</translation>
 <translation id="1239594683407221485">சாதனத்தின் உள்ளடத்தை Files ஆப்ஸில் பாருங்கள்.</translation>
 <translation id="124116460088058876">மேலும் மொழிகள்</translation>
 <translation id="1241753985463165747">அனுமதித்தால், தற்போதைய இணையதளத்தில் உங்கள் எல்லாத் தரவையும் படிக்கும், மாற்றும்</translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">கடவுச்சொற்களைத் தேடு</translation>
 <translation id="1487335504823219454">இயக்கத்தில் - பிரத்தியேக அமைப்புகள்</translation>
 <translation id="1489664337021920575">வேறொரு விருப்பத்தைத் தேர்வுசெய்யவும்</translation>
+<translation id="1490491397986065675">உங்கள் நிர்வாகி இவ்வாறு கூறுகிறார்: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1492417797159476138">இந்தத் தளத்தில் இந்தப் பயனர்பெயரை ஏற்கெனவே சேமித்துள்ளீர்கள்</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> க்காக காத்திருக்கிறது...</translation>
 <translation id="1495677929897281669">தாவலுக்குத் திரும்பு</translation>
@@ -811,6 +813,7 @@
 <translation id="1879000426787380528">உள்நுழையும் கணக்கு</translation>
 <translation id="1880905663253319515">"<ph name="CERTIFICATE_NAME" />" சான்றிதழை நீக்கவா?</translation>
 <translation id="1881445033931614352">கீபோர்டு தளவமைப்பு</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{கோப்பு}other{# கோப்புகள்}}</translation>
 <translation id="1884013283844450420">நெட்வொர்க்: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, இணை</translation>
 <translation id="1884340228047885921">தற்போதைய தெரிவுநிலை அமைப்பு: சில தொடர்புகள்</translation>
 <translation id="1884705339276589024">Linux டிஸ்க்கின் அளவை மாற்று</translation>
@@ -989,6 +992,7 @@
 <translation id="2099686503067610784">சேவையக சான்றிதழ் "<ph name="CERTIFICATE_NAME" />" ஐ நீக்கவா?</translation>
 <translation id="2100273922101894616">தானாக உள்நுழையவும்</translation>
 <translation id="2101225219012730419">பதிப்பு:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{ஃபோன் எண்}other{# ஃபோன் எண்கள்}}</translation>
 <translation id="211144231511833662">வகைகளை அழி</translation>
 <translation id="2111670510994270194">வலதுபக்கத்தில் புதிய தாவல்</translation>
 <translation id="21133533946938348">தாவலைப் பொருத்து</translation>
@@ -1285,6 +1289,7 @@
 <translation id="2435457462613246316">கடவுச்சொல்லைக் காண்பி</translation>
 <translation id="2435579801172349831">எல்லாவற்றையும் (<ph name="URL_COUNT" />) மறைநிலைச் சாளரத்தில் திறக்கும்</translation>
 <translation id="2436186046335138073">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{ஆப்ஸ்}other{# ஆப்ஸ்}}</translation>
 <translation id="2440604414813129000">ஆ&amp;தாரத்தைக் காண்பி</translation>
 <translation id="244231003699905658">தவறான முகவரி. முகவரியைச் சரிபார்த்துவிட்டு மீண்டும் முயலவும்.</translation>
 <translation id="2442916515643169563">டெக்ஸ்ட் ஷேடோ</translation>
@@ -1433,6 +1438,7 @@
 <translation id="2604255671529671813">நெட்வொர்க் இணைப்புப் பிழை</translation>
 <translation id="2606246518223360146">தரவை இணை</translation>
 <translation id="2606454609872547359">வேண்டாம். ChromeVox இல்லாமல் தொடர்க</translation>
+<translation id="2606568927909309675">ஆங்கில ஆடியோ மற்றும் வீடியோவிற்கான வசனங்கள் தானாகவே உருவாக்கப்படும். ஆடியோவும் வசனங்களும் யாருக்கும் பகிரப்படாது.</translation>
 <translation id="2607101320794533334">தலைப்பு பொதுவானவை தகவல்</translation>
 <translation id="2609896558069604090">குறுக்குவழிகளை உருவாக்கு...</translation>
 <translation id="2609980095400624569">இணைப்பை ஏற்படுத்த இயலவில்லை</translation>
@@ -1697,6 +1703,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">இதைக் கொண்டு இணைப்பைத் திற...</translation>
 <translation id="2889925978073739256">சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தொடர்ந்து தடு</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" /> இல் உள்நுழைய உங்கள் சாதனத்தைப் பயன்படுத்த விரும்புகிறீர்களா?</translation>
 <translation id="2893168226686371498">இயல்புநிலை உலாவி</translation>
 <translation id="2894757982205307093">குழுவில் புதிய தாவல்</translation>
 <translation id="289644616180464099">சிம் கார்டு பூட்டப்பட்டுள்ளது</translation>
@@ -2008,6 +2015,7 @@
 <translation id="3269069891205016797">நீங்கள் வெளியேறியதும், சாதனத்திலிருந்து உங்கள் தகவல் அகற்றப்படும்.</translation>
 <translation id="3269093882174072735">படத்தை ஏற்று</translation>
 <translation id="3269612321104318480">வெளிர் பசும் நீலம் &amp; வெள்ளை</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{கோப்பு}other{# கோப்புகள்}}</translation>
 <translation id="326999365752735949">வேறுபாட்டைப் பதிவிறக்குகிறது</translation>
 <translation id="3270965368676314374">உங்கள் கம்ப்யூட்டரிலிருந்து படங்கள், இசை மற்றும் பிற மீடியாவைப் படிக்கலாம், மாற்றலாம் மேலும் நீக்கலாம்</translation>
 <translation id="327147043223061465">எல்லாக் குக்கீகளையும் தளத்தின் தரவையும் காட்டு</translation>
@@ -2303,6 +2311,7 @@
 <translation id="3600792891314830896">ஒலியை இயக்கும் தளங்களில் ஒலியடக்கு</translation>
 <translation id="360180734785106144">புதிய அம்சங்கள் கிடைக்கும்போது அவற்றை வழங்கும்</translation>
 <translation id="3602290021589620013">மாதிரிக்காட்சி</translation>
+<translation id="3602870520245633055">பிரிண்ட் &amp; ஸ்கேன்</translation>
 <translation id="3603622770190368340">நெட்வொர்க் சான்றிதழ் பெறுதல்</translation>
 <translation id="3604193429970465812">இரண்டாம் நிலைக் கணக்குகள்</translation>
 <translation id="3604713164406837697">வால்பேப்பரை மாற்று</translation>
@@ -2318,6 +2327,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> ஸ்கேன் செய்யப்படுகிறது.</translation>
 <translation id="3616741288025931835">உலாவிய தரவை &amp;சுத்தமாக்கு...</translation>
 <translation id="3617891479562106823">பின்னணிகள் கிடைக்கவில்லை. பின்னர் மீண்டும் முயலவும்.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{வீடியோ}other{# வீடியோக்கள்}}</translation>
 <translation id="3619115746895587757">காப்பச்சினோ</translation>
 <translation id="362333465072914957">CAயிடமிருந்து சான்றிதழ் பெறுவதற்காகக் காத்திருக்கிறது</translation>
 <translation id="3624567683873126087">ஃபோனைத் திறந்து, Google கணக்கில் உள்நுழை</translation>
@@ -2575,7 +2585,6 @@
 <translation id="3882165008614329320">கேமரா அல்லது கோப்பிலிருக்கும் வீடியோ</translation>
 <translation id="3884152383786131369">பல மொழிகளில் கிடைக்கும் இணைய உள்ளடக்கம், இந்தப் பட்டியலில் முதலில் உள்ள ஆதரிக்கப்படும் மொழியைப் பயன்படுத்தும். இந்த விருப்பத்தேர்வுகள் உங்கள் உலாவி அமைப்புகளுடன் ஒத்திசைக்கப்படும். <ph name="BEGIN_LINK_LEARN_MORE" />மேலும் அறிக<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">இந்தத் தளத்தை அணுகுவதற்கான உங்கள் கோரிக்கை <ph name="NAME" />க்கு அனுப்பப்பட்டது</translation>
-<translation id="3888364689515978571">ஆஃப். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> மூலம் குறிப்புகளை எடுத்தல்</translation>
 <translation id="3890064827463908288">Wi-Fi ஒத்திசைவைப் பயன்படுத்த Chrome ஒத்திசைவை இயக்க வேண்டும்</translation>
 <translation id="3892414795099177503">OpenVPN / L2TPஐச் சேர்...</translation>
@@ -2659,7 +2668,6 @@
 <translation id="3958088479270651626">புக்மார்க்குகளையும் அமைப்புகளையும் இறக்குமதி செய்</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">செல்லுலார் நெட்வொர்க்கை முடக்கு</translation>
-<translation id="3965730875470565266">ஆன், <ph name="MINUTES" /> நிமி</translation>
 <translation id="3965811923470826124">இதனுடன்</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" />ஐ மூடு</translation>
 <translation id="3966072572894326936">வேறு கோப்புறையைத் தேர்வு செய்க...</translation>
@@ -2729,6 +2737,7 @@
 <translation id="4047726037116394521">முகப்புக்குச் செல்</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# தொடர்பு கிடைக்கவில்லை. ‘அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தை இந்தத் தொடர்புடன் சேர்ந்து பயன்படுத்த, அவரது Google கணக்குடன் இணைக்கப்பட்டுள்ள மின்னஞ்சல் முகவரியை உங்கள் தொடர்புகளில் சேர்க்கவும்.}other{# தொடர்புகள் கிடைக்கவில்லை. ‘அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தை இந்தத் தொடர்புகளுடன் சேர்ந்து பயன்படுத்த, அவர்களின் Google கணக்குகளுடன் இணைக்கப்பட்டுள்ள மின்னஞ்சல் முகவரிகளை உங்கள் தொடர்புகளில் சேர்க்கவும்.}}</translation>
 <translation id="4050225813016893843">அங்கீகார முறை</translation>
+<translation id="4050534976465737778">இரண்டு சாதனங்களும் அன்லாக் செய்யப்பட்டிருப்பதையும் அருகருகே இருப்பதையும் அவற்றில் புளூடூத் ஆன் செய்யப்பட்டிருப்பதையும் உறுதிசெய்துகொள்ளவும். உங்கள் தொடர்புகளில் இல்லாத Chromebookகுடன் பகிர்கிறீர்கள் எனில் அதில் 'அருகில் பகிர்தல்' தெரிவுநிலை ஆன் செய்யப்பட்டிருப்பதை உறுதிசெய்துகொள்ளவும் (நிலைப் பகுதியைத் திறந்து 'அருகில் பகிர்தல்' தெரிவுநிலையை ஆன் செய்யவும்). <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">சிறிய</translation>
 <translation id="4054070260844648638">அனைவருக்கும் காட்டப்படும்</translation>
 <translation id="4056908315660577142"><ph name="APP_NAME" /> Chrome ஆப்ஸைப் பயன்படுத்த உங்கள் பெற்றோர் அமைத்த நேர வரம்பை அடைந்துவிட்டீர்கள். நாளை <ph name="TIME_LIMIT" /> பயன்படுத்திக் கொள்ளலாம்.</translation>
@@ -2963,6 +2972,7 @@
 <translation id="4364327530094270451">முலாம்பழம்</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> சாளரத்தைப் பகிர்கிறது.</translation>
 <translation id="4364830672918311045">அறிவிப்புகளைக் காட்டலாம்</translation>
+<translation id="4366138410738374926">அச்சிடுதல் தொடங்கப்பட்டது</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> குறித்த உதவிக்குறிப்புகள், சலுகைகள், அறிவிப்புகள் ஆகியவற்றைப் பெறலாம், கருத்தைப் பகிரலாம். எப்போது வேண்டுமானாலும் குழுவிலகலாம்.</translation>
 <translation id="4370425812909262207">கார்ட்டுகள் மறைக்கப்பட்டுள்ளன. நீங்கள் மாற்றங்களைச் செய்யும்போது அவை மீண்டும் காட்டப்படும்.</translation>
 <translation id="4370975561335139969">உள்ளிட்ட மின்னஞ்சலும், கடவுச்சொல்லும் பொருந்தவில்லை.</translation>
@@ -3150,6 +3160,7 @@
 <translation id="4568025708905928793">பாதுகாப்பு விசை ஒன்று கோரப்படுகிறது</translation>
 <translation id="4568213207643490790">இந்தச் சாதனத்தில் Google கணக்குகள் அனுமதிக்கப்படவில்லை.</translation>
 <translation id="4569747168316751899">செயல்படாத நிலையில் இருக்கும்போது</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{முகவரி}other{# முகவரிகள்}}</translation>
 <translation id="4570387585180509432">முகவரிகள், ஃபோன் எண்கள் மற்றும் பல</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" உடன் இணைக்கும்போது அங்கீகரிப்பு ரத்தானது.</translation>
 <translation id="4572779512957829735">உங்கள் பாதுகாப்பு விசைக்கான பின்னை உள்ளிடவும்</translation>
@@ -3209,6 +3220,7 @@
 <translation id="4635444580397524003">Linux காப்புப் பிரதி மீட்டெடுக்கப்பட்டது.</translation>
 <translation id="4636930964841734540">தகவல்</translation>
 <translation id="4637083375689622795">கூடுதல் செயல்கள், <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{உரை}other{# உரைகள்}}</translation>
 <translation id="4638930039313743000">ADB பிழைதிருத்தத்தை இயக்கு</translation>
 <translation id="4641539339823703554">Chrome ஆல் கணினி நேரத்தை அமைக்க முடியவில்லை. கீழே நேரத்தைச் சரிபார்த்து, தேவைப்பட்டால் சரிசெய்யவும்.</translation>
 <translation id="4642769377300286600">மொபைல் சுயவிவரத்தை நிறுவுகிறது: நெட்வொர்க் <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3224,10 +3236,12 @@
 <translation id="4651484272688821107">டெமோ பயன்முறை ஆதாரங்கள் மூலம் ஆன்லைன் காம்பொனெண்ட்டை ஏற்ற முடியவில்லை.</translation>
 <translation id="4652935475563630866">கேமரா அமைப்பில் செய்த மாற்றத்தைச் செயல்படுத்த Parallels Desktopபை மீண்டும் தொடங்க வேண்டும். தொடர Parallels Desktopபை மீண்டும் தொடங்கவும்.</translation>
 <translation id="4653405415038586100">Linuxஸை உள்ளமைக்கும்போது பிழை</translation>
+<translation id="4654236001025007561">உங்களுக்கு அருகிலுள்ள Chromebookகளிலும் Android சாதனங்களிலும் கோப்புகளைப் பகிரலாம்</translation>
 <translation id="4657914796247705218">TrackPoint வேகம்</translation>
 <translation id="465878909996028221">HTTP, HTTPS மற்றும் கோப்பு நெறிமுறைகள் மட்டுமே உலாவி திசைதிருப்புதல் செய்யலாம்.</translation>
 <translation id="4659077111144409915">முதன்மைக் கணக்கு</translation>
 <translation id="4659126640776004816">உங்கள் Google கணக்கில் உள்நுழையும்போது இந்த அம்சம் இயக்கப்படும்.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{படம்}other{# படங்கள்}}</translation>
 <translation id="4660476621274971848">எதிர்பார்க்கப்பட்ட பதிப்பு "<ph name="EXPECTED_VERSION" />", ஆனால் இருப்பது "<ph name="NEW_ID" />" பதிப்பு ஆகும்</translation>
 <translation id="4660540330091848931">அளவு மாற்றப்படுகிறது</translation>
 <translation id="4661407454952063730">ஆப்ஸ் தரவு என்பது தொடர்புகள், செய்திகள், படங்கள் போன்ற தரவு உட்பட ஆப்ஸ் சேமித்த (டெவெலப்பர் அமைப்புகளின் அடிப்படையில்) எந்தத் தரவாகவும் இருக்கலாம்.</translation>
@@ -3328,6 +3342,7 @@
 <translation id="4794810983896241342">புதுப்பிப்புகள் <ph name="BEGIN_LINK" />உங்கள் நிர்வாகியால்<ph name="END_LINK" /> நிர்வகிக்கப்படுகின்றன</translation>
 <translation id="479536056609751218">வலைப்பக்கம், HTML மட்டும்</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />புளூடூத் பதிவுகளை<ph name="END_LINK" /> இணை (Google அகப் பயன்பாட்டிற்காக)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{கோப்பு}other{# கோப்புகள்}}</translation>
 <translation id="4801448226354548035">கணக்குகளை மறை</translation>
 <translation id="4801512016965057443">மொபைல் டேட்டா ரோமிங்கை அனுமதி</translation>
 <translation id="4804818685124855865">தொடர்பைத் துண்டி</translation>
@@ -3758,6 +3773,7 @@
 <translation id="531118851858162334">Google சேவைகளைப் பயன்படுத்தி நீங்கள் மேற்கொண்ட முந்தைய செயல்பாட்டின் அடிப்படையில் இந்தத் தயாரிப்புக் காட்டப்படுகிறது. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற தளத்திற்குச் சென்று உங்கள் தரவைப் பார்க்கலாம் நீக்கலாம், அத்துடன் அமைப்புகளையும் மாற்றலாம்.</translation>
 <translation id="5311304534597152726">பின்வரும் முகவரி மூலம் உள்நுழைகிறீர்கள்:</translation>
 <translation id="5311565231560644461">விர்ச்சுவல் ரியாலிட்டி சாதனங்களையும் தரவையும் தளங்கள் பயன்படுத்த அனுமதிக்காதே</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{படம்}other{# படங்கள்}}</translation>
 <translation id="5314381603623123224">மார்ச் 31 அன்று Chromeமின் சேவை விதிமுறைகள் மாறவுள்ளன</translation>
 <translation id="5315738755890845852">கூடுதல் நெளி அடைப்புக்குறி: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">சேமி</translation>
@@ -3823,6 +3839,7 @@
 <translation id="5390677308841849479">அடர் சிவப்பு &amp; ஆரஞ்சு</translation>
 <translation id="5390743329570580756">இதற்காக அனுப்பு:</translation>
 <translation id="5392192690789334093">அறிவிப்புகளை அனுப்ப அனுமதிக்கப்பட்டவை</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{இணைப்பு}other{# இணைப்புகள்}}</translation>
 <translation id="5397794290049113714">நீங்கள்</translation>
 <translation id="5398497406011404839">மறைத்த புக்மார்க்குகள்</translation>
 <translation id="5398572795982417028">பக்க வரம்பை மீறிவிட்டது, அதிகபட்ச வரம்பு <ph name="MAXIMUM_PAGE" /></translation>
@@ -4201,7 +4218,6 @@
 <translation id="5832813618714645810">சுயவிவரங்கள்</translation>
 <translation id="583281660410589416">தெரியாதது</translation>
 <translation id="5833397272224757657">தனிப்பயனாக்குவதற்காக, நீங்கள் பார்வையிடும் தளங்களின் உள்ளடக்கத்தையும், உலாவல் செயல்பாடு மற்றும் தகவல் பரிமாற்றங்களையும் பயன்படுத்தும்</translation>
-<translation id="5833551944249825624">அருகிலுள்ள அனைவருக்கும் 5 நிமிடங்களுக்கு உங்கள் Chromebook காட்டப்படும்</translation>
 <translation id="5833726373896279253">இந்த அமைப்புகளை உரிமையாளர் மட்டுமே திருத்த முடியும்:</translation>
 <translation id="5834581999798853053"><ph name="TIME" /> நிமிடங்கள் உள்ளன</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - கேமரா அல்லது மைக்ரோஃபோன் ரெக்கார்டு செய்கிறது</translation>
@@ -4352,6 +4368,7 @@
 <translation id="6011074160056912900">ஈத்தர்நெட் நெட்வொர்க்</translation>
 <translation id="6011193465932186973">கைரேகை</translation>
 <translation id="6011449291337289699">தளத் தரவை அழி</translation>
+<translation id="6013027779243312217">உங்கள் ஆடியோவிற்கும் வீடியோவிற்கும் வசனங்களைக் பெறலாம்</translation>
 <translation id="6015796118275082299">ஆண்டு</translation>
 <translation id="6016178549409952427">கூடுதல் உள்ளடக்கத்திற்குச் செல்லும் (<ph name="CURRENT_ELEMENT" />/<ph name="TOTAL_ELEMENTS" />)</translation>
 <translation id="6016551720757758985">முந்தைய பதிப்பிற்கு மாற, பவர்வாஷை உறுதிப்படுத்தவும்</translation>
@@ -4861,6 +4878,7 @@
 <translation id="6605847144724004692">இதுவரை எந்தப் பயனராலும் மதிப்பிடப்படவில்லை.</translation>
 <translation id="6607831829715835317">மேலும் கருவி&amp;கள்</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> ஏற்கெனவே <ph name="DOMAIN" /> மூலம் நிர்வகிக்கப்படுகிறது. வேறொரு Google கணக்கில் பெற்றோர் கட்டுப்பாடுகளைப் பயன்படுத்துவதற்கு, அமைவை நிறைவு செய்ததும் உள்நுழைந்துள்ள கணக்கிலிருந்து வெளியேறி, பின்னர் உள்நுழைவதற்கான திரையில் “கணக்கைச் சேர்” என்பதைத் தேர்ந்தெடுக்கவும்.</translation>
+<translation id="6609478180749378879">மறைநிலைப் பயன்முறையை விட்டு வெளியேறிய பிறகு உள்நுழைவுத் தரவு இந்தச் சாதனத்தில் சேமிக்கப்படும். இந்தச் சாதனத்தைப் பயன்படுத்தி இந்த இணையதளத்தில் உங்களால் மீண்டும் உள்நுழைய முடியும்.</translation>
 <translation id="6611972847767394631">உங்கள் தாவல்களை இங்கே காணலாம்</translation>
 <translation id="6612358246767739896">பாதுகாக்கப்பட்ட உள்ளடக்கம்</translation>
 <translation id="6615455863669487791">எனக்கு காண்பி</translation>
@@ -4879,6 +4897,7 @@
 <translation id="6628328486509726751">பதிவேற்றப்பட்ட நேரம் <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">USB சாதனங்களைத் தேடுகிறது...</translation>
 <translation id="6630752851777525409">உங்கள் சார்பாகத் தன்னை அங்கீகரித்துக் கொள்ள ஒரு சான்றிதழுக்கான நிரந்தர அணுகலை <ph name="EXTENSION_NAME" /> கோருகிறது.</translation>
+<translation id="6635362468090274700">மற்றவர்கள் உங்களுடன் பகிர உங்கள் சாதனம் அவர்களுக்குத் தெரியும் வகையில் அமைக்க வேண்டும்.<ph name="BR" /><ph name="BR" />தற்காலிகமாகக் காட்டப்படுவதற்கு நிலைப் பகுதியைத் திறந்து ‘அருகில் பகிர்தல்’ அம்சத்தை ஆன் செய்யவும்.</translation>
 <translation id="6635944431854494329">"அமைப்புகள் &gt; மேம்பட்டவை &gt; கண்டறிதல் தரவையும் உபயோகத் தரவையும் தானாக Googleளுக்கு அனுப்பு" என்பதற்குச் சென்று இந்த அம்சத்தை உரிமையாளர் கட்டுப்படுத்தலாம்.</translation>
 <translation id="6635956300022133031">உரையிலிருந்து பேச்சுக்கான குரல்களைத் தேர்ந்தெடுக்கலாம், தனிப்பயனாக்கலாம்</translation>
 <translation id="6636588250634969791">தொடர்வதற்கு முன் SIMமைச் செருகவும்</translation>
@@ -5030,6 +5049,7 @@
 <translation id="6811332638216701903">DHCP ஹோஸ்ட்பெயர்</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ஐ மூலமாக இயக்க முடியாது.</translation>
 <translation id="6812841287760418429">மாற்றங்களை வைத்திரு</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{கோப்பு}other{# கோப்புகள்}}</translation>
 <translation id="6817174620439930047">MIDI சாதனங்களை அணுகுவதற்காக ஒரு தளம் சாதனத்துக்குப் பிரத்தியேகமான செய்திகளைப் பயன்படுத்த விரும்பும் போது கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="6818198425579322765">மொழியாக்கம் செய்யப்பட வேண்டிய பக்கத்தின் மொழி</translation>
 <translation id="6818802132960437751">உள்ளமைந்த வைரஸ் தடுப்பு</translation>
@@ -5050,6 +5070,7 @@
 <translation id="6835762382653651563">உங்கள் <ph name="DEVICE_TYPE" />ஐப் புதுப்பிக்க இணையத்துடன் இணையவும்.</translation>
 <translation id="6838034009068684089">எனது திரைகளில் சாளரங்களைத் திறந்து வைக்க ஒரு தளம் விரும்பும்போது அனுமதி கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="6838694093138907871">தவறான குறியீடு, மீண்டும் முயலவும்.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{ஃபோன் எண்}other{# ஃபோன் எண்கள்}}</translation>
 <translation id="6839225236531462745">சான்றிதழ் நீக்குதல் பிழை</translation>
 <translation id="6839916869147598086">உள்நுழையும் முறை மாறியுள்ளது</translation>
 <translation id="6840155290835956714">அனுப்பும் முன் கேள்</translation>
@@ -5155,6 +5176,7 @@
 <translation id="6955446738988643816">பாப்அப் கண்காணிப்பு</translation>
 <translation id="6955535239952325894">நிர்வகிக்கப்பட்ட உலாவிகளில் இந்த அமைப்பு முடக்கப்பட்டுள்ளது</translation>
 <translation id="6957044667612803194">இந்தப் பாதுகாப்பு விசை பின்களை ஆதரிக்கவில்லை</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{இணைப்பு}other{# இணைப்புகள்}}</translation>
 <translation id="6960507406838246615">Linuxஸைப் புதுப்பிக்க வேண்டும்</translation>
 <translation id="696103774840402661">இந்த <ph name="DEVICE_TYPE" /> சாதனத்தில் உள்ள அனைத்துக் கோப்புகளும் அதில் சேமிக்கப்பட்டுள்ள அனைத்துப் பயனர்களின் தரவும் நிரந்தரமாக நீக்கப்பட்டன.</translation>
 <translation id="6964390816189577014">நாயகன்</translation>
@@ -6064,6 +6086,7 @@
 <translation id="797394244396603170">கோப்புகளைப் பகிர விரும்பும் சாதனத்தைத் தேர்ந்தெடுங்கள்</translation>
 <translation id="7973962044839454485">தவறான பயனர்பெயர் அல்லது கடவுச்சொல் காரணமாக PPP அங்கீகாரம் தோல்வியடைந்தது</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" />ஐப் பயன்படுத்த முயற்சி</translation>
+<translation id="7974713334845253259">இயல்பு வண்ணம்</translation>
 <translation id="7974936243149753750">ஓவர்ஸ்கேன்</translation>
 <translation id="7975504106303186033">இந்த Chrome Education சாதனத்தை நீங்கள் கல்விக் கணக்கில் பதிவுசெய்ய வேண்டும். புதிய கணக்கிற்குப் பதிவு செய்ய, g.co/workspace/edusignup என்ற தளத்திற்குச் செல்லவும்.</translation>
 <translation id="7978412674231730200">தனிப்பட்ட விசை</translation>
@@ -6230,6 +6253,7 @@
 <translation id="8157704005178149728">கண்காணிப்பை அமைக்கிறது</translation>
 <translation id="8158117992543756526"><ph name="MONTH_AND_YEAR" /> முதல் இந்த சாதனத்திற்கான தானியங்கு மென்பொருள் மற்றும் பாதுகாப்பு புதுப்பிப்புகள் நிறுத்தப்பட்டுவிட்டன. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">சான்றிதழ் நம்பிக்கையை அமைப்பதில் பிழை</translation>
+<translation id="8160775796528709999">அமைப்புகளில் ’உடனடி வசனம்’ அம்சத்தை இயக்குவதன் மூலம் உங்கள் ஆடியோவிற்கும் வீடியோவிற்கும் வசனங்களைப் பெறலாம்</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">இணையப் பக்கங்களுக்கான படித்தல் பயன்முறை</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{தாவலைப் புதிய சாளரத்திற்கு நகர்த்து}other{தாவல்களைப் புதிய சாளரத்திற்கு நகர்த்து}}</translation>
@@ -6354,6 +6378,7 @@
 <translation id="8300011035382349091">இந்தத் தாவலுக்கான புக்மார்க்கைத் திருத்தும்</translation>
 <translation id="8300374739238450534">நள்ளிரவு நீலம்</translation>
 <translation id="8300849813060516376">OTASP தோல்வியுற்றது</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{முகவரி}other{# முகவரிகள்}}</translation>
 <translation id="8304383784961451596">இந்தச் சாதனத்தைப் பயன்படுத்த உங்களுக்கு அனுமதியில்லை. உள்நுழைவு அனுமதியைப் பெற நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது Family Link மூலம் கண்காணிக்கப்படும் Google கணக்கில் உள்நுழையவும்.</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> உங்கள் கேமராவை அணுக விரும்புகிறதா எனக் கேட்கவும்</translation>
 <translation id="830868413617744215">பீட்டா</translation>
@@ -6652,6 +6677,7 @@
 <translation id="867085395664725367">சேவையகத்தில் தற்காலிகப் பிழை ஏற்பட்டது.</translation>
 <translation id="8673026256276578048">வலையில் தேடு...</translation>
 <translation id="8673383193459449849">சேவையகச் சிக்கல்</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{வீடியோ}other{# வீடியோக்கள்}}</translation>
 <translation id="8676374126336081632">உள்ளீட்டை அழி</translation>
 <translation id="8676770494376880701">குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="8677212948402625567">அனைத்தையும் சுருக்கு...</translation>
@@ -7077,6 +7103,7 @@
 <translation id="9128870381267983090">நெட்வொர்க்குடன் இணையவும்</translation>
 <translation id="9130015405878219958">செல்லாத பயன்முறை உள்ளிடப்பட்டது. </translation>
 <translation id="9131487537093447019">புளூடூத் சாதனங்களுக்குச் செய்திகளை அனுப்புதல் மற்றும் அதிலிருந்து செய்திகளைப் பெறுதல்.</translation>
+<translation id="9134119143784876218">ஆங்கில ஆடியோ மற்றும் வீடியோவிற்கான வசனங்கள் தானாகவே உருவாக்கப்படும் (தற்போது இந்த அம்சம் Chrome உலாவியில் மட்டுமே கிடைக்கிறது). ஆடியோவும் வசனங்களும் யாருக்கும் பகிரப்படாது.</translation>
 <translation id="9137013805542155359">அசலைக் காண்பி</translation>
 <translation id="9137157311132182254">பரிந்துரைக்கப்படும் தேடல் இன்ஜின்</translation>
 <translation id="9137248913990643158">இந்தப் பயன்பாட்டைப் பயன்படுத்தும் முன், Chromeஐத் தொடங்கி உள்நுழையவும்.</translation>
@@ -7124,6 +7151,7 @@
 <translation id="9179524979050048593">உள்நுழைவுத் திரையிலுள்ள பயனர்பெயர்</translation>
 <translation id="9180281769944411366">இதற்குச் சில நிமிடங்கள் ஆகலாம். Linux கண்டெய்னரைத் தொடங்குகிறது.</translation>
 <translation id="9180380851667544951">தளத்தால் உங்கள் திரையைப் பகிர முடியும்</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{ஆப்ஸ்}other{# ஆப்ஸ்}}</translation>
 <translation id="9186963452600581158">பிள்ளையின் Google கணக்கு மூலம் உள்நுழைக</translation>
 <translation id="9188732951356337132">உபயோகம் &amp; கண்டறிதல் தரவை அனுப்புக. கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை இந்தச் சாதனம் தற்போது Googleளுக்குத் தானாக அனுப்புகிறது. இது உங்கள் பிள்ளையை அடையாளம் கண்டறியப் பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவுகள், Google ஆப்ஸ் மற்றும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் &amp; ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">Android மொபைலைப் பாதுகாப்பு விசையாகப் பயன்படுத்துதல்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index fa6f73d..3ea7e0e 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -218,6 +218,7 @@
 <translation id="1234808891666923653">సర్వీస్ వర్కర్‌లు</translation>
 <translation id="1235458158152011030">తెలిసిన నెట్‌వర్క్‌లు</translation>
 <translation id="123578888592755962">డిస్క్ నిండింది</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{టెక్స్ట్}other{# టెక్స్ట్‌లు}}</translation>
 <translation id="1239594683407221485">ఈ పరికర కంటెంట్‌ను 'ఫైల్స్' యాప్‌లో అన్వేషించండి.</translation>
 <translation id="124116460088058876">మరిన్ని భాషలు</translation>
 <translation id="1241753985463165747">అభ్యర్థించినప్పుడు ప్రస్తుత వెబ్‌సైట్‌లో మీ మొత్తం డేటాను చదవండి మరియు మార్చండి</translation>
@@ -440,6 +441,7 @@
 <translation id="1486096554574027028">పాస్‌వర్డ్‌లను వెతుకు</translation>
 <translation id="1487335504823219454">ఆన్ - అనుకూల సెట్టింగ్‌లు</translation>
 <translation id="1489664337021920575">మరొక ఎంపికను ఎంచుకోండి</translation>
+<translation id="1490491397986065675">మీ అడ్మినిస్ట్రేటర్ "<ph name="CUSTOM_MESSAGE" />" అని అన్నారు.</translation>
 <translation id="1492417797159476138">మీరు ఇప్పటికే ఈ సైట్ కోసం ఈ యూజర్‌నేమ్‌ను సేవ్ చేశారు</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> కోసం వేచి ఉంది...</translation>
 <translation id="1495677929897281669">తిరిగి ట్యాబ్‌కు వెళ్లు</translation>
@@ -811,6 +813,7 @@
 <translation id="1879000426787380528">ఇలా సైన్ ఇన్ చేయండి</translation>
 <translation id="1880905663253319515">ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />"ను తొలగించాలా?</translation>
 <translation id="1881445033931614352">కీబోర్డ్ లేఅవుట్</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{ఐటెమ్}other{# ఐటెమ్‌లు}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_COUNT" />లో <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, కనెక్ట్ చేయండి</translation>
 <translation id="1884340228047885921">ప్రస్తుత విజిబిలిటీ సెట్టింగ్, 'కొన్ని కాంటాక్ట్'‌లకు సెట్ చేయబడింది</translation>
 <translation id="1884705339276589024">Linux డిస్క్ పరిమాణాన్ని మార్చండి</translation>
@@ -989,6 +992,7 @@
 <translation id="2099686503067610784">సర్వర్ ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />" తొలగించాలా?</translation>
 <translation id="2100273922101894616">ఆటోమేటిక్ సైన్-ఇన్</translation>
 <translation id="2101225219012730419">వెర్షన్:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{ఫోన్ నంబర్}other{# ఫోన్ నంబర్‌లు}}</translation>
 <translation id="211144231511833662">రకాలను క్లియర్ చేయి</translation>
 <translation id="2111670510994270194">కుడివైపున కొత్త ట్యాబ్</translation>
 <translation id="21133533946938348">టాబ్‌ను పిన్ చేయి</translation>
@@ -1285,6 +1289,7 @@
 <translation id="2435457462613246316">పాస్‌వర్డ్‌ను చూపించు</translation>
 <translation id="2435579801172349831">అన్నింటినీ (<ph name="URL_COUNT" />) అజ్ఞాత విండోలో తెరవండి</translation>
 <translation id="2436186046335138073">అన్ని <ph name="PROTOCOL" /> లింక్‌లను తెరవడానికి <ph name="HANDLER_HOSTNAME" />ను అనుమతించాలా?</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{యాప్}other{# యాప్‌లు}}</translation>
 <translation id="2440604414813129000">&amp;సోర్స్‌ను చూడండి</translation>
 <translation id="244231003699905658">చిరునామా చెల్లదు. దయచేసి చిరునామాను తనిఖీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="2442916515643169563">వచన నీడ</translation>
@@ -1433,6 +1438,7 @@
 <translation id="2604255671529671813">నెట్‌వర్క్ కనెక్షన్ ఎర్రర్</translation>
 <translation id="2606246518223360146">డేటాను లింక్ చేయి</translation>
 <translation id="2606454609872547359">వద్దు, ChromeVox లేకుండా కొనసాగించు</translation>
+<translation id="2606568927909309675">ఇంగ్లీష్ ఆడియో, వీడియో కోసం క్యాప్షన్‌లను ఆటోమేటిక్‌గా క్రియేట్ చేస్తుంది. ఆడియో, క్యాప్షన్‌లు ఎప్పటికీ మీ పరికరంలోనే ఉంటాయి.</translation>
 <translation id="2607101320794533334">విషయం పబ్లిక్ కీ సమాచారం</translation>
 <translation id="2609896558069604090">సత్వరమార్గాలను సృష్టించండి...</translation>
 <translation id="2609980095400624569">కనెక్షన్‌ను ఏర్పాటు చేయడం సాధ్యపడలేదు</translation>
@@ -1697,6 +1703,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">దీనితో లింక్ తెరువు...</translation>
 <translation id="2889925978073739256">శాండ్‌బాక్స్ చేయని ప్లగిన్‌లను బ్లాక్ చేయడం కొనసాగించు</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" />కు సైన్ ఇన్ చేయడానికి మీ పరికరాన్ని ఉపయోగించాలా?</translation>
 <translation id="2893168226686371498">ఆటోమేటిక్ బ్రౌజర్</translation>
 <translation id="2894757982205307093">సమూహంలో కొత్త ట్యాబ్</translation>
 <translation id="289644616180464099">SIM కార్డ్ లాక్ అయింది</translation>
@@ -2008,6 +2015,7 @@
 <translation id="3269069891205016797">మీరు సైన్ అవుట్ చేసినప్పుడు పరికరం నుండి మీ సమాచారం తీసివేయబడుతుంది.</translation>
 <translation id="3269093882174072735">చిత్రాన్ని లోడ్ చేయి</translation>
 <translation id="3269612321104318480">లేత నీలి ఆకుపచ్చ రంగు మరియు తెలుపు</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{ఫైల్}other{# ఫైల్‌లు}}</translation>
 <translation id="326999365752735949">డిఫ్‌ను డౌన్‌లోడ్ చేస్తోంది</translation>
 <translation id="3270965368676314374">మీ కంప్యూటర్‌లోని ఫోటోలు, సంగీతం మరియు ఇతర మీడియాని చదవడం, మార్చడం మరియు తొలగించడం</translation>
 <translation id="327147043223061465">మొత్తం కుక్కీలు మరియు సైట్ డేటాను చూడండి</translation>
@@ -2303,6 +2311,7 @@
 <translation id="3600792891314830896">ధ్వనిని ప్లే చేసే సైట్‌లను మ్యూట్ చేస్తుంది</translation>
 <translation id="360180734785106144">కొత్త ఫీచర్‌లు అందుబాటులోకి వస్తే వాటిని అందించడం</translation>
 <translation id="3602290021589620013">ప్రివ్యూ</translation>
+<translation id="3602870520245633055">ప్రింట్ చేయండి, స్కాన్ చేయండి</translation>
 <translation id="3603622770190368340">నెట్‌వర్క్ ప్రమాణపత్రాన్ని పొందండి</translation>
 <translation id="3604193429970465812">ప్రత్యామ్నాయ ఖాతాలు</translation>
 <translation id="3604713164406837697">వాల్‌పేపర్‌ను మార్చండి</translation>
@@ -2318,6 +2327,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> స్కాన్ అవుతోంది.</translation>
 <translation id="3616741288025931835">బ్రౌజింగ్ డేటాను &amp;క్లియర్ చేయి...</translation>
 <translation id="3617891479562106823">నేపథ్యాలు అందుబాటులో లేవు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{వీడియో}other{# వీడియోలు}}</translation>
 <translation id="3619115746895587757">కాపుచినో</translation>
 <translation id="362333465072914957">CA, సర్టిఫికెట్‌ను జారీ చేయడం కోసం వేచి ఉంది</translation>
 <translation id="3624567683873126087">పరికరాన్ని అన్‌లాక్ చేసి, Google ఖాతాలోకి సైన్-ఇన్ చేయండి</translation>
@@ -2575,7 +2585,6 @@
 <translation id="3882165008614329320">కెమెరా లేదా ఫైల్‌లో ఇప్పటికే ఉన్న వీడియో</translation>
 <translation id="3884152383786131369">అనేక భాషలలో అందుబాటులో ఉన్న వెబ్ కంటెంట్, ఈ లిస్ట్‌లోని మొదటి సపోర్ట్ చేసే భాషను ఉపయోగిస్తుంది. ఈ ప్రాధాన్యతలు మీ బ్రౌజర్ సెట్టింగ్‌లతో సింక్ చేయబడతాయి. <ph name="BEGIN_LINK_LEARN_MORE" />మరింత తెలుసుకోండి<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">మీరు ఈ సైట్‌ను యాక్సెస్ చేయడానికి చేసిన అభ్యర్థన <ph name="NAME" />కు పంపబడింది</translation>
-<translation id="3888364689515978571">ఆఫ్‌లో ఉంది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />తో గమనికలు రూపొందిస్తున్నారు</translation>
 <translation id="3890064827463908288">Wi-Fi సింక్‌ను ఉపయోగించడానికి Chrome సింక్‌ను ఆన్ చేయండి</translation>
 <translation id="3892414795099177503">OpenVPN / L2TPని జోడించు...</translation>
@@ -2659,7 +2668,6 @@
 <translation id="3958088479270651626">బుక్‌మార్క్‌లను మరియు సెట్టింగ్‌లను దిగుమతి చేయి</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">సెల్యూలార్ నెట్‌వర్క్‌ను ఆఫ్ చేయడం</translation>
-<translation id="3965730875470565266">ఆన్‌లో ఉంది, <ph name="MINUTES" /> నిమిషాలు</translation>
 <translation id="3965811923470826124">దీనితో</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> నుండి నిష్క్రమించు</translation>
 <translation id="3966072572894326936">మరొక ఫోల్డర్‌ను ఎంచుకోండి...</translation>
@@ -2729,6 +2737,7 @@
 <translation id="4047726037116394521">హోమ్‌కు వెళ్లు</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{# కాంటాక్ట్ అందుబాటులో లేదు. వారితో సమీప షేరింగ్‌ను ఉపయోగించడానికి, వారి Google ఖాతాతో అనుబంధించబడిన ఇమెయిల్ అడ్రస్‌ను మీ కాంటాక్ట్‌లకు జోడించండి.}other{# కాంటాక్ట్‌లు అందుబాటులో లేవు. వారితో సమీప షేరింగ్‌ను ఉపయోగించడానికి, వారి Google ఖాతాలతో అనుబంధించబడిన ఇమెయిల్ అడ్రస్‌లను మీ కాంటాక్ట్‌లకు జోడించండి.}}</translation>
 <translation id="4050225813016893843">ప్రామాణీకరణ పద్ధతి</translation>
+<translation id="4050534976465737778">రెండు పరికరాలూ అన్‌లాక్ అయి, దగ్గరగా ఉన్నాయని, వాటిలో బ్లూటూత్ ఆన్ చేసి ఉందని నిర్ధారించుకోండి. మీరు మీ కాంటాక్ట్‌లలో లేని Chromebookతో షేర్ చేస్తుంటే, దానిలో సమీప విజిబిలిటీ ఫీచర్ ఆన్‌లో ఉందని నిర్ధారించుకోండి (స్టేటస్ ప్రాంతాన్ని తెరిచి, ఆపై సమీప విజిబిలిటీని ఆన్ చేయండి). <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">చిన్న</translation>
 <translation id="4054070260844648638">ప్రతిఒక్కరికీ కనిపిస్తుంది</translation>
 <translation id="4056908315660577142"><ph name="APP_NAME" /> Chrome యాప్‌కు మీ తల్లి/తండ్రి సెట్ చేసిన సమయ పరిమితిని మీరు చేరుకున్నారు. మీరు రేపు దానిని <ph name="TIME_LIMIT" /> సమయం ఉపయోగించవచ్చు.</translation>
@@ -2963,6 +2972,7 @@
 <translation id="4364327530094270451">ఖర్బూజాపండు</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ఒక విండోను షేర్ చేస్తోంది.</translation>
 <translation id="4364830672918311045">నోటిఫికేషన్‌లను ప్రదర్శించడం</translation>
+<translation id="4366138410738374926">ప్రింట్ చేయడం ప్రారంభమైంది</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> చిట్కాలు, ఆఫర్‌లతో పాటు అప్‌డేట్‌లను పొందండి, ఫీడ్‌బ్యాక్‌ను షేర్ చేయండి. ఏ సమయంలో అయినా సభ్యత్వాన్ని తీసివేయండి.</translation>
 <translation id="4370425812909262207">కార్ట్‌లు దాచబడ్డాయి. మీరు మార్పులు చేసినప్పుడు అవి తిరిగి కనిపిస్తాయి.</translation>
 <translation id="4370975561335139969">మీరు నమోదు చేసిన ఇమెయిల్, పాస్‌వర్డ్ సరిపోలలేదు</translation>
@@ -3150,6 +3160,7 @@
 <translation id="4568025708905928793">సెక్యూరిటీ కీ అభ్యర్థించబడుతోంది</translation>
 <translation id="4568213207643490790">క్షమించండి, ఈ పరికరంలో Google ఖాతాలకు అనుమతి లేదు.</translation>
 <translation id="4569747168316751899">నిష్క్రియంగా ఉన్నప్పుడు</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{అడ్రస్}other{# అడ్రస్‌లు}}</translation>
 <translation id="4570387585180509432">చిరునామాలు, ఫోన్ నంబర్‌లు మరియు మరిన్ని</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />"కు కనెక్ట్ చేస్తున్నప్పుడు ప్రామాణీకరణ రద్దు చేయబడింది.</translation>
 <translation id="4572779512957829735">మీ సెక్యూరిటీ కీ కోసం పిన్‌ని నమోదు చేయండి</translation>
@@ -3209,6 +3220,7 @@
 <translation id="4635444580397524003">Linux బ్యాకప్ విజయవంతంగా రీస్టోర్ చేయబడింది.</translation>
 <translation id="4636930964841734540">సమాచారం</translation>
 <translation id="4637083375689622795">మరిన్ని చర్యలు, <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{టెక్స్ట్}other{# టెక్స్ట్‌లు}}</translation>
 <translation id="4638930039313743000">ADB డీబగ్గింగ్‌ను ఎనేబుల్ చేయండి</translation>
 <translation id="4641539339823703554">Chrome సిస్టమ్ సమయాన్ని సెట్ చేయలేకపోయింది. దయచేసి దిగువ సమయాన్ని తనిఖీ చేసి, అవసరమైతే సరిదిద్దండి.</translation>
 <translation id="4642769377300286600"><ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> నుండి <ph name="NETWORK_COUNT" />లో <ph name="NETWORK_INDEX" />వ నెట్‌వర్క్ మొబైల్ ప్రొఫైల్‌ను ఇన్‌స్టాల్ చేస్తోంది</translation>
@@ -3224,10 +3236,12 @@
 <translation id="4651484272688821107">డెమో మోడ్ వనరులతో ఆన్‌లైన్ అంతర్భాగాన్ని లోడ్ చేయడం సాధ్యపడలేదు.</translation>
 <translation id="4652935475563630866">కెమెరా సెట్టింగ్‌లో మార్చడానికి పారలల్స్ డెస్క్‌టాప్‌ను మళ్లీ ప్రారంభించవలసి ఉంటుంది. కొనసాగించడానికి పారలల్స్ డెస్క్‌టాప్‌ను మళ్లీ ప్రారంభించండి.</translation>
 <translation id="4653405415038586100">Linuxను కాన్ఫిగర్ చేయడంలో ఎర్రర్</translation>
+<translation id="4654236001025007561">మీ చుట్టూ ఉన్న Chromebookలు, అలాగే Android పరికరాలతో ఫైల్‌లను షేర్ చేయండి</translation>
 <translation id="4657914796247705218">TrackPoint వేగం</translation>
 <translation id="465878909996028221">కేవలం http, https, ఫైల్ ప్రోటోకాల్‌లు మాత్రమే బ్రౌజర్ మళ్లింపులకు మద్దతిస్తాయి.</translation>
 <translation id="4659077111144409915">ప్రాథమిక ఖాతా</translation>
 <translation id="4659126640776004816">మీ Google ఖాతాకు మీరు సైన్ ఇన్ చేసినప్పుడు, ఈ ఫీచర్ ఆన్ చేయబడుతుంది.</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{ఇమేజ్}other{# ఇమేజ్‌లు}}</translation>
 <translation id="4660476621274971848">ఆశించిన వెర్షన్ "<ph name="EXPECTED_VERSION" />", కానీ ఉన్న వెర్షన్ "<ph name="NEW_ID" />"</translation>
 <translation id="4660540330091848931">పరిమాణాన్ని మారుస్తోంది</translation>
 <translation id="4661407454952063730">కాంటాక్ట్‌లు, మెసేజ్‌లు, ఫోటోలు లాంటి డేటాతో సహా యాప్ సేవ్ చేసిన (డెవలపర్ సెట్టింగ్‌ల ఆధారంగా) ఎలాంటి డేటా అయినా యాప్ డేటా లాగా పరిగణించబడుతుంది.</translation>
@@ -3328,6 +3342,7 @@
 <translation id="4794810983896241342">అప్‌డేట్‌లను <ph name="BEGIN_LINK" />మీ అడ్మినిస్ట్రేటర్<ph name="END_LINK" /> మేనేజ్ చేస్తారు</translation>
 <translation id="479536056609751218">వెబ్‌పేజీ, HTML మాత్రమే</translation>
 <translation id="4798236378408895261"><ph name="BEGIN_LINK" />బ్లూటూత్ లాగ్‌లు<ph name="END_LINK" />ని జోడించు (Google అంతర్గతం)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{ఐటెమ్}other{# ఐటెమ్‌లు}}</translation>
 <translation id="4801448226354548035">ఖాతాలను దాచు</translation>
 <translation id="4801512016965057443">మొబైల్ డేటా రోమింగ్‌ను అనుమతించు</translation>
 <translation id="4804818685124855865">డిస్‌కనెక్ట్ చేయి</translation>
@@ -3758,6 +3773,7 @@
 <translation id="531118851858162334">Google సర్వీస్‌లను ఉపయోగించిన మీ మునుపటి యాక్టివిటీ ఆధారంగా మీరు ఈ ఐటెమ్‌ను చూస్తున్నారు. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో మీరు మీ డేటాను చూడవచ్చు, తొలగించవచ్చు, మీ సెట్టింగ్‌లను మార్చవచ్చు.</translation>
 <translation id="5311304534597152726">ఇలా సైన్ ఇన్ చేస్తున్నారు</translation>
 <translation id="5311565231560644461">మీ వర్చువల్ రియాలిటీ పరికరాలను, డేటాను ఉపయోగించడానికి సైట్‌లను అనుమతించవద్దు</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{ఇమేజ్}other{# ఇమేజ్‌లు}}</translation>
 <translation id="5314381603623123224">Chrome యొక్క సేవా నిబంధనలు మార్చి 31న మారుతున్నాయి</translation>
 <translation id="5315738755890845852">అదనపు వంకర కలుపు: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">సేవ్ చేయి</translation>
@@ -3823,6 +3839,7 @@
 <translation id="5390677308841849479">ముదురు ఎరుపు మరియు నారింజ రంగు</translation>
 <translation id="5390743329570580756">దీని కోసం పంపు</translation>
 <translation id="5392192690789334093">నోటిఫికేషన్‌లను పంపడానికి అనుమతి ఉన్న సైట్‌లు</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{లింక్}other{# లింక్‌లు}}</translation>
 <translation id="5397794290049113714">మీరు</translation>
 <translation id="5398497406011404839">దాచబడిన బుక్‌మార్క్‌లు</translation>
 <translation id="5398572795982417028">పేజీ సూచన పరిమితిని దాటిపోయారు, పరిమితి <ph name="MAXIMUM_PAGE" /></translation>
@@ -4200,7 +4217,6 @@
 <translation id="5832813618714645810">ప్రొఫైల్‌లు</translation>
 <translation id="583281660410589416">తెలియని</translation>
 <translation id="5833397272224757657">మీరు సందర్శించే సైట్‌లలోని కంటెంట్‌ను, దీనితో పాటు బ్రౌజర్ కార్యకలాపం అలాగే పరస్పర చర్యలను మీ అభిరుచికి తగిన విధంగా సెట్ చేయడంలో ఉపయోగిస్తుంది</translation>
-<translation id="5833551944249825624">సమీపంలో ఉన్న ప్రతిఒక్కరికీ మీ Chromebook 5 నిమిషాల పాటు కనిపిస్తుంది</translation>
 <translation id="5833726373896279253">ఈ సెట్టింగ్‌లు మీ యజమాని ద్వారా మాత్రమే సవరించబడతాయి:</translation>
 <translation id="5834581999798853053">సుమారు <ph name="TIME" /> నిమిషాలు మిగిలి ఉన్నాయి</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - కెమెరా లేదా మైక్రోఫోన్ రికార్డ్ చేస్తోంది</translation>
@@ -4351,6 +4367,7 @@
 <translation id="6011074160056912900">ఈథర్‌నెట్ నెట్‌వర్క్</translation>
 <translation id="6011193465932186973">వేలిముద్ర</translation>
 <translation id="6011449291337289699">సైట్ డేటాను తీసివేయండి</translation>
+<translation id="6013027779243312217">మీ ఆడియో, వీడియోకు క్యాప్షన్‌లను పొందండి</translation>
 <translation id="6015796118275082299">సంవత్సరం</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" />లో <ph name="CURRENT_ELEMENT" />వ అదనపు కంటెంట్‌కు నావిగేట్ చేయండి</translation>
 <translation id="6016551720757758985">మునుపటి వెర్షన్‌కు తిరిగి మార్చేలా చేసే పవర్‌వాష్‌ను నిర్ధారించండి</translation>
@@ -4860,6 +4877,7 @@
 <translation id="6605847144724004692">ఇంకా ఏ వినియోగదారులు రేట్ చేయలేదు.</translation>
 <translation id="6607831829715835317">మరిన్ని సాధనా&amp;లు</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" />ను ఇప్పటికే <ph name="DOMAIN" /> మేనేజ్ చేస్తోంది. వేరొక Google ఖాతాతో తల్లిదండ్రుల నియంత్రణలను ఉపయోగించడానికి, సెటప్‌ను పూర్తి చేశాక సైన్ అవుట్ చేసి, ఆపై సైన్ ఇన్ స్క్రీన్‌పై ఉన్న "వ్యక్తిని జోడించు"ను ఎంచుకోండి.</translation>
+<translation id="6609478180749378879">మీరు అజ్ఞాత మోడ్ నుండి నిష్క్రమించిన తర్వాత సైన్-ఇన్ డేటా ఈ పరికరంలో స్టోర్ చేయబడుతుంది. మీ పరికరం ద్వారా తర్వాత మళ్లీ ఈ వెబ్‌సైట్‌కు మీరు సైన్ ఇన్ చేయగలరు.</translation>
 <translation id="6611972847767394631">మీ ట్యాబ్‌లను ఇక్కడ కనుగొనండి</translation>
 <translation id="6612358246767739896">రక్షిత కంటెంట్</translation>
 <translation id="6615455863669487791">నాకు చూపించు</translation>
@@ -4878,6 +4896,7 @@
 <translation id="6628328486509726751">అప్‌లోడ్ చేయబడినది <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">USB పరికరాలను కనుగొంటోంది...</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> మీ తరపున దానికదే ప్రామాణీకరించుకోవడం కోసం ఒక ప్రమాణపత్రానికి శాశ్వత యాక్సెస్ కోరుతోంది.</translation>
+<translation id="6635362468090274700">మీరు మీ సమీప షేరింగ్ విజిబిలిటీ సెట్టింగ్‌ను 'కనిపించు'కు సెట్ చేసేంత వరకు మీతో ఎవరూ షేర్ చేయలేరు.<ph name="BR" /><ph name="BR" />మీ సెట్టింగ్‌ను తాత్కాలికంగా 'కనిపించు'గా ఉంచడానికి స్టేటస్ ప్రాంతాన్ని తెరిచి, ఆపై సమీప విజిబిలిటీని ఆన్ చేయండి.</translation>
 <translation id="6635944431854494329">యజమాని ఈ ఫీచర్‌ను, సెట్టింగ్‌లు &gt; అధునాతనం &gt; సమస్య విశ్లేషణ, వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపు ఎంపిక ద్వారా నియంత్రించవచ్చు.</translation>
 <translation id="6635956300022133031">వచనం-నుండి-ప్రసంగం వాయిస్‌లను ఎంచుకోండి మరియు అనుకూలీకరించండి</translation>
 <translation id="6636588250634969791">కొనసాగడానికి ముందు సిమ్‌ను ఇన్‌సర్ట్ చేయండి</translation>
@@ -5029,6 +5048,7 @@
 <translation id="6811332638216701903">DHCP హోస్ట్‌పేరు</translation>
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> రూట్‌గా రన్ చేయలేదు.</translation>
 <translation id="6812841287760418429">మార్పులను ఉంచు</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{ఫైల్}other{# ఫైల్‌లు}}</translation>
 <translation id="6817174620439930047">MIDI పరికరాలను యాక్సెస్ చేయడానికి సిస్టమ్ విశిష్ట సందేశాలను సైట్ ఉపయోగించాలనుకున్నప్పుడు అడుగు (సిఫార్సు చేయబడింది)</translation>
 <translation id="6818198425579322765">పేజీని అనువదించాల్సిన భాష</translation>
 <translation id="6818802132960437751">అంతర్నిర్మిత వైరస్ రక్షణ</translation>
@@ -5049,6 +5069,7 @@
 <translation id="6835762382653651563">దయచేసి మీ <ph name="DEVICE_TYPE" />ని అప్‌డేట్ చేయడానికి ఇంటర్నెట్‌కి కనెక్ట్ చేయండి.</translation>
 <translation id="6838034009068684089">సైట్ మీ స్క్రీన్‌లలో విండోలను తెరిచి, ఉంచాలనుకున్నప్పుడు అనుమతి అడగాలి (సిఫార్సు చేయబడినది)</translation>
 <translation id="6838694093138907871">చెల్లని కోడ్, దయచేసి మళ్లీ ట్రై చేయండి.</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{ఫోన్ నంబర్}other{# ఫోన్ నంబర్‌లు}}</translation>
 <translation id="6839225236531462745">ప్రమాణపత్రం తొలగింపు లోపం</translation>
 <translation id="6839916869147598086">సైన్-ఇన్ మార్చబడింది</translation>
 <translation id="6840155290835956714">పంపే ముందు అడగాలి</translation>
@@ -5154,6 +5175,7 @@
 <translation id="6955446738988643816">పాప్‌అప్‌ను పరిశీలించు</translation>
 <translation id="6955535239952325894">మేనేజ్ అవుతోన్న బ్రౌజర్‌లలో ఈ సెట్టింగ్ డిజేబుల్ చేయబడింది.</translation>
 <translation id="6957044667612803194">ఈ సెక్యూరిటీ కీ, పిన్‌లకు మద్దతు ఇవ్వడం లేదు</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{లింక్}other{# లింక్‌లు}}</translation>
 <translation id="6960507406838246615">Linux అప్‌డేట్ అవసరం</translation>
 <translation id="696103774840402661">ఈ <ph name="DEVICE_TYPE" />లో యూజర్‌లందరికీ సంబంధించిన అన్ని ఫైల్‌లు, లోకల్ డేటా శాశ్వతంగా తొలగించబడ్డాయి.</translation>
 <translation id="6964390816189577014">వీరుడు</translation>
@@ -6062,6 +6084,7 @@
 <translation id="797394244396603170">మీరు ఫైల్‌లను షేర్ చేయాలనుకుంటున్న పరికరాన్ని ఎంచుకోండి</translation>
 <translation id="7973962044839454485">వినియోగదారు పేరు లేదా పాస్‌వర్డ్ తప్పు అయినందున PPP ప్రామాణీకరణ విఫలమైంది</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" />ని ఉపయోగించి మళ్లీ ప్రయత్నించు</translation>
+<translation id="7974713334845253259">డిఫాల్ట్ రంగు</translation>
 <translation id="7974936243149753750">ఓవర్‌స్కాన్ సర్దుబాటు</translation>
 <translation id="7975504106303186033">మీరు ఈ Chrome Education పరికరాన్ని ఎడ్యుకేషన్ ఖాతాలో తప్పనిసరిగా ఎన్‌రోల్ చేయాలి. కొత్త ఖాతా కోసం సైన్ అప్ చేయడానికి, దయచేసి g.co/workspace/edusignupను సందర్శించండి.</translation>
 <translation id="7978412674231730200">వ్యక్తిగత కీ</translation>
@@ -6225,6 +6248,7 @@
 <translation id="8157704005178149728">పర్యవేక్షణను సెటప్ చేస్తోంది</translation>
 <translation id="8158117992543756526">ఈ పరికరానికి <ph name="MONTH_AND_YEAR" />లో ఆటోమేటిక్ సాఫ్ట్‌వేర్ మరియు భద్రతాపరమైన అప్‌డేట్ రావడం ఆగిపోయింది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">లోపం సెట్టింగ్ ప్రమాణపత్ర నమ్మకం</translation>
+<translation id="8160775796528709999">సెట్టింగ్‌లలో లైవ్ క్యాప్షన్‌ను ఎనేబుల్ చేయడం ద్వారా మీ ఆడియో, వీడియోకు క్యాప్షన్‌లను పొందండి</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">వెబ్ పేజీల కోసం రీడర్ మోడ్</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ట్యాబ్‌ను కొత్త విండోకు తరలించు}other{ట్యాబ్‌లను కొత్త విండోకు తరలించు}}</translation>
@@ -6349,6 +6373,7 @@
 <translation id="8300011035382349091">ఈ ట్యాబ్‌కు సేవ్ చేసిన బుక్‌మార్క్‌ను సవరించండి</translation>
 <translation id="8300374739238450534">మిడ్‌నైట్ బ్లూ</translation>
 <translation id="8300849813060516376">OTASP విఫలమైంది</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{అడ్రస్}other{# అడ్రస్‌లు}}</translation>
 <translation id="8304383784961451596">ఈ పరికరాన్ని ఉపయోగించడానికి మీకు అనుమతిలేదు. సైన్ ఇన్ అనుమతి కోసం దయచేసి అడ్మినిస్ట్రేటర్‌ను కాంటాక్ట్ చేయండి లేదా Family Link ద్వారా పర్యవేక్షించబడే Google ఖాతాతో సైన్ ఇన్ చేయండి.</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> మీ కెమెరాను యాక్సెస్ చేయాలనుకుంటే నాకు తెలియజేయి</translation>
 <translation id="830868413617744215">బీటా</translation>
@@ -6647,6 +6672,7 @@
 <translation id="867085395664725367">తాత్కాలిక సర్వర్ ఎర్రర్ ఏర్పడింది.</translation>
 <translation id="8673026256276578048">వెబ్‌లో శోధించండి...</translation>
 <translation id="8673383193459449849">సర్వర్ సమస్య</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{వీడియో}other{# వీడియోలు}}</translation>
 <translation id="8676374126336081632">ఇన్‌పుట్‌ను తీసివేయండి</translation>
 <translation id="8676770494376880701">తక్కువ-పవర్ గల ఛార్జర్ కనెక్ట్ చేయబడింది</translation>
 <translation id="8677212948402625567">అన్నీ కుదించు...</translation>
@@ -7072,6 +7098,7 @@
 <translation id="9128870381267983090">నెట్‌వర్క్‌కి కనెక్ట్ చేయి</translation>
 <translation id="9130015405878219958">చెల్లని మోడ్ ఎంటర్ చేయ‌బడింది.</translation>
 <translation id="9131487537093447019">బ్లూటూత్ పరికరాలకు సందేశాలను పంపడానికి మరియు వాటి నుండి స్వీకరించడానికి అనుమతి.</translation>
+<translation id="9134119143784876218">ఇంగ్లీష్‌లో ఆడియో, వీడియో కోసం క్యాప్షన్‌లను ఆటోమేటిక్‌గా క్రియేట్ చేస్తుంది (ప్రస్తుతం Chrome బ్రౌజర్‌లో మాత్రమే అందుబాటులో ఉంది). ఆడియో, క్యాప్షన్‌లు ఎప్పటికీ మీ పరికరంలోనే ఉంటాయి.</translation>
 <translation id="9137013805542155359">అసలును చూపించు</translation>
 <translation id="9137157311132182254">ప్రాధాన్య శోధన ఇంజిన్</translation>
 <translation id="9137248913990643158">ఈ యాప్‌ను ఉపయోగించే ముందు, దయచేసి Chromeను ప్రారంభించి, దానికి సైన్ ఇన్ చేయండి.</translation>
@@ -7119,6 +7146,7 @@
 <translation id="9179524979050048593">సైన్ ఇన్ స్క్రీన్ యూజర్‌నేమ్</translation>
 <translation id="9180281769944411366">ఈ ప్రాసెస్‌కు కొన్ని నిమిషాలు పట్టవచ్చు. Linux కంటైనర్ ప్రారంభం అవుతోంది.</translation>
 <translation id="9180380851667544951">సైట్ మీ స్క్రీన్‌ను షేర్ చేయవచ్చు</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{యాప్}other{# యాప్‌లు}}</translation>
 <translation id="9186963452600581158">చిన్నారి Google ఖాతాతో సైన్ ఇన్ చేయండి</translation>
 <translation id="9188732951356337132">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ, అలాగే పరికర, యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకి పంపుతుంది. ఇది మీ చిన్నారి గురించి గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, అలాగే ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత సముదాయ డేటా కూడా Google యాప్‌లకు, అలాగే Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ కార్యకలాపం సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">మీ Android ఫోన్‌ను సెక్యూరిటీ కీగా ఉపయోగించండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 08b3f7a0..25c5f8b 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2577,7 +2577,6 @@
 <translation id="3882165008614329320">วิดีโอที่มีอยู่จากกล้องหรือไฟล์</translation>
 <translation id="3884152383786131369">เนื้อหาเว็บที่มีหลายภาษาจะใช้ภาษาแรกที่รองรับจากรายการนี้ ระบบจะซิงค์ค่ากำหนดเหล่านี้กับการตั้งค่าเบราว์เซอร์ <ph name="BEGIN_LINK_LEARN_MORE" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">ระบบส่งคำขอเข้าถึงเว็บไซต์นี้ของคุณให้ <ph name="NAME" /> แล้ว</translation>
-<translation id="3888364689515978571">ปิด <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">จดโน้ตด้วย <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">เปิดการซิงค์ของ Chrome เพื่อใช้การซิงค์ Wi-Fi</translation>
 <translation id="3892414795099177503">เพิ่ม OpenVPN/L2TP...</translation>
@@ -2661,7 +2660,6 @@
 <translation id="3958088479270651626">นำเข้าบุ๊กมาร์กและการตั้งค่า</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">ปิดเครือข่ายมือถือ</translation>
-<translation id="3965730875470565266">เปิด <ph name="MINUTES" /> นาที</translation>
 <translation id="3965811923470826124">ด้วย</translation>
 <translation id="3965965397408324205">ออกจาก <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">เลือกโฟลเดอร์อื่น...</translation>
@@ -4202,7 +4200,6 @@
 <translation id="5832813618714645810">โปรไฟล์</translation>
 <translation id="583281660410589416">ไม่รู้จัก</translation>
 <translation id="5833397272224757657">ใช้เนื้อหาในเว็บไซต์ที่คุณเข้าชม รวมถึงกิจกรรมและการโต้ตอบในเบราว์เซอร์เพื่อการปรับเปลี่ยนในแบบของคุณ</translation>
-<translation id="5833551944249825624">ทุกคนที่อยู่ใกล้เคียงจะมองเห็น Chromebook เป็นเวลา 5 นาที</translation>
 <translation id="5833726373896279253">เจ้าของเท่านั้นที่สามารถปรับการตั้งค่าเหล่านี้ได้:</translation>
 <translation id="5834581999798853053">เหลือเวลาอีกประมาณ <ph name="TIME" /> นาที</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - กำลังบันทึกด้วยกล้องหรือไมโครโฟน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index b9fae23..39517f6 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">URL'yi Kopyala</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> şeklinde görünür</translation>
 <translation id="2156294658807918600">Hizmet Çalışanı: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Güvenlik kontrolünü tekrar çalıştır</translation>
 <translation id="2157474325782140681">Ek özelliklerden yararlanmak için bu Chromebook ile uyumlu olacak şekilde tasarlanmış bir Dell yuva istasyonu kullanın.</translation>
 <translation id="215753907730220065">Tam Ekrandan Çık</translation>
 <translation id="2157875535253991059">Bu sayfa artık tam ekran.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Kod İmzalama</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Linux uygulamalarını ve dosyalarını yedekleme</translation>
+<translation id="3238192140106069382">Bağlanıyor ve doğrulanıyor</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> için zaman sınırlaması kaldırıldı</translation>
 <translation id="3241680850019875542">Paketlenecek uzantının kök dizinini seçin. Bir uzantıyı güncellemek için tekrar kullanılacak özel anahtar dosyasını da seçin.</translation>
 <translation id="3244294424315804309">Sesi kapatmaya devam et</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Kameradan veya dosyadan mevcut video</translation>
 <translation id="3884152383786131369">Birden fazla dilde sunulan web içeriği bu listedeki desteklenen ilk dili kullanır. Bu tercihler, tarayıcı ayarlarınızla senkronize edilir. <ph name="BEGIN_LINK_LEARN_MORE" />Daha fazla bilgi<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Bu siteye erişim isteğiniz şu kişiye gönderildi: <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Kapalı. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ile not alınıyor</translation>
 <translation id="3890064827463908288">Wi-Fi Senkronizasyonu'nu kullanmak için Chrome Senkronizasyonu'nu açın</translation>
 <translation id="3892414795099177503">OpenVPN / L2TP Ekle...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Yer işaretlerini ve ayarları içe aktar</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Hücresel ağı kapat</translation>
-<translation id="3965730875470565266">Açık, <ph name="MINUTES" /> dk.</translation>
 <translation id="3965811923470826124">ile</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> profilinden çık</translation>
 <translation id="3966072572894326936">Başka bir klasör seçin...</translation>
@@ -4220,7 +4220,6 @@
 <translation id="5832813618714645810">Profiller</translation>
 <translation id="583281660410589416">Bilinmiyor</translation>
 <translation id="5833397272224757657">Kişiselleştirme için ziyaret ettiğiniz sitelerin içeriğinin yanı sıra tarayıcı etkinliğini ve etkileşimlerini kullanır</translation>
-<translation id="5833551944249825624">Chromebook'unuz 5 dakika boyunca yakındaki herkese görünür olacak</translation>
 <translation id="5833726373896279253">Bu ayarlar yalnızca sahibi tarafından değiştirilebilir:</translation>
 <translation id="5834581999798853053">Yaklaşık <ph name="TIME" /> dakika kaldı</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Kamera veya mikrofon kaydediyor</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 1cea7a0..eecea0a 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1048,6 +1048,7 @@
 <translation id="2154710561487035718">Копіювати URL-адресу</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" />x<ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Синтаксис Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Запустити перевірку безпеки знову</translation>
 <translation id="2157474325782140681">Щоб отримати додаткові функції, використовуйте док-станцію Dell, розроблену для цього комп'ютера Chromebook.</translation>
 <translation id="215753907730220065">Вийти з повноекранного режиму</translation>
 <translation id="2157875535253991059">Ця сторінка зараз у повноекранному режимі.</translation>
@@ -1992,6 +1993,7 @@
 <translation id="3225319735946384299">Підписування коду</translation>
 <translation id="3227137524299004712">Мікрофон</translation>
 <translation id="3233271424239923319">Створити резервну копію додатків і файлів Linux</translation>
+<translation id="3238192140106069382">Триває підключення та перевірка</translation>
 <translation id="3239373508713281971">Для додатка <ph name="APP_NAME" /> скасовано ліміт часу</translation>
 <translation id="3241680850019875542">Виберіть кореневий каталог для пакування розширення. Щоб оновити розширення, також виберіть файл секретного ключа для повторного використання.</translation>
 <translation id="3244294424315804309">Не вмикати звук</translation>
@@ -2588,7 +2590,6 @@
 <translation id="3882165008614329320">Наявні відео з камери або файлу</translation>
 <translation id="3884152383786131369">Для веб-контенту, доступного багатьма мовами, використовуватиметься перший доступний варіант зі списку нижче. Ці параметри синхронізуються з налаштуваннями веб-переглядача. <ph name="BEGIN_LINK_LEARN_MORE" />Докладніше<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Запит на доступ до цього сайту надіслано користувачу <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Вимкнено. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Створення нотаток за допомогою додатка <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Щоб користуватися синхронізацією Wi-Fi, потрібно ввімкнути Синхронізацію Chrome</translation>
 <translation id="3892414795099177503">Додати OpenVPN або L2TP…</translation>
@@ -2672,7 +2673,6 @@
 <translation id="3958088479270651626">Імпорт закладок і налаштувань</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Вимкнути мобільну мережу</translation>
-<translation id="3965730875470565266">Увімкнено, <ph name="MINUTES" /> хв</translation>
 <translation id="3965811923470826124">За допомогою</translation>
 <translation id="3965965397408324205">Вийти з профілю <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Вибрати іншу папку...</translation>
@@ -4222,7 +4222,6 @@
 <translation id="5832813618714645810">Профілі</translation>
 <translation id="583281660410589416">Невідомий</translation>
 <translation id="5833397272224757657">Використовує вміст відвіданих сайтів, активність у веб-переглядачі та взаємодії для персоналізації</translation>
-<translation id="5833551944249825624">Ваш комп'ютер Chromebook зможуть бачити всі користувачі неподалік упродовж 5 хвилин</translation>
 <translation id="5833726373896279253">Лише власник може змінювати ці налаштування:</translation>
 <translation id="5834581999798853053">Залишилося приблизно <ph name="TIME" /> хв.</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – запис на камері або мікрофоні ввімкнено</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 8458fbb2..e2c1c06 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -219,6 +219,7 @@
 <translation id="1234808891666923653">سروس ورکرز</translation>
 <translation id="1235458158152011030">معلوم نیٹ ورکس</translation>
 <translation id="123578888592755962">ڈسک بھری ہوئی ہے</translation>
+<translation id="1235924639474699896">{COUNT,plural, =1{ٹیکسٹ}other{# ٹیکسٹس}}</translation>
 <translation id="1239594683407221485">فائلز ایپ میں آلے کے مواد کا پتہ لگائیں۔</translation>
 <translation id="124116460088058876">مزید زبانیں</translation>
 <translation id="1241753985463165747">موجودہ ویب سائٹ پر موجود اپنے سبھی ڈیٹا کو چلائے جانے پر پڑھیں اور انہیں تبدیل کریں</translation>
@@ -441,6 +442,7 @@
 <translation id="1486096554574027028">پاس ورڈز تلاش کریں</translation>
 <translation id="1487335504823219454">آن - حسب ضرورت ترتیبات</translation>
 <translation id="1489664337021920575">دوسرے اختیار کا انتخاب کریں</translation>
+<translation id="1490491397986065675">آپ کے منتظم کے مطابق، "<ph name="CUSTOM_MESSAGE" />"۔</translation>
 <translation id="1492417797159476138">آپ نے پہلے ہی اس سائٹ کے لئے یہ صارف نام محفوظ کر لیا ہے</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> کیلئے منتظر…</translation>
 <translation id="1495677929897281669">ٹیب پر واپس جائیں</translation>
@@ -812,6 +814,7 @@
 <translation id="1879000426787380528">سائن ان کریں بطور</translation>
 <translation id="1880905663253319515">سرٹیفکیٹ "<ph name="CERTIFICATE_NAME" />" حذف کریں؟</translation>
 <translation id="1881445033931614352">کی بورڈ لے آؤٹ</translation>
+<translation id="1881577802939775675">{COUNT,plural, =1{آئٹم}other{# آئٹمز}}</translation>
 <translation id="1884013283844450420"><ph name="NETWORK_COUNT" /> میں سے نیٹ ورک <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" />، منسلک کریں</translation>
 <translation id="1884340228047885921">موجودہ نظر آنے کی ترتیب کچھ رابطے ہیں</translation>
 <translation id="1884705339276589024">‏Linux ڈسک کا سائز تبدیل کریں</translation>
@@ -990,6 +993,7 @@
 <translation id="2099686503067610784">سرور سرٹیفیکیٹ "<ph name="CERTIFICATE_NAME" />" حذف کریں؟</translation>
 <translation id="2100273922101894616">خودکار سائن ان</translation>
 <translation id="2101225219012730419">ورژن:</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{فون نمبر}other{# فون نمبرز}}</translation>
 <translation id="211144231511833662">اقسام صاف کریں</translation>
 <translation id="2111670510994270194">دائیں طرف نیا ٹیب</translation>
 <translation id="21133533946938348">ٹیب کو پن کریں</translation>
@@ -1286,6 +1290,7 @@
 <translation id="2435457462613246316">پاس ورڈ دکھائیں</translation>
 <translation id="2435579801172349831">سبھی (<ph name="URL_COUNT" />) کو پوشیدگی ونڈو میں کھولیں</translation>
 <translation id="2436186046335138073"><ph name="HANDLER_HOSTNAME" /> کو سبھی <ph name="PROTOCOL" /> لنکس کھولنے کی اجازت دیں؟</translation>
+<translation id="2440366609912234507">{COUNT,plural, =1{ایپ}other{# ایپس}}</translation>
 <translation id="2440604414813129000">ما&amp;خذ دیکھیں</translation>
 <translation id="244231003699905658">غلط پتہ۔ براہ کرم پتہ چیک کریں اور دوبارہ کوشش کریں۔</translation>
 <translation id="2442916515643169563">متنی سایہ</translation>
@@ -1434,6 +1439,7 @@
 <translation id="2604255671529671813">نیٹ ورک کنکشن میں خرابی</translation>
 <translation id="2606246518223360146">ڈیٹا کو لنک کریں</translation>
 <translation id="2606454609872547359">‏نہیں، بغیر ChromeVox کے جاری رکھیں</translation>
+<translation id="2606568927909309675">یہ خصوصیت انگریزی آڈیو اور ویڈیو کیلئے خودکار طور پر کیپشنز تخلیق کرتی ہے۔ آڈیو اور کیپشنز ہمیشہ آلے پر ہی رہتے ہیں۔</translation>
 <translation id="2607101320794533334">موضوع عوامی کلید معلومات</translation>
 <translation id="2609896558069604090">شارٹ کٹس بنائیں…</translation>
 <translation id="2609980095400624569">کنکشن قائم نہیں کیا جا سکا</translation>
@@ -1698,6 +1704,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">اس کے ساتھ لنک کھولیں…</translation>
 <translation id="2889925978073739256">سینڈ باکس سے نکالے ہوئے پلگ انز کو مسدود کرنا جاری رکھیں</translation>
+<translation id="2891922230654533301"><ph name="APP_NAME" /> میں سائن ان کرنے کیلئے آپ کے آلے کا استعمال کریں؟</translation>
 <translation id="2893168226686371498">ڈیفالٹ براؤزر</translation>
 <translation id="2894757982205307093">گروپ میں نیا ٹیب</translation>
 <translation id="289644616180464099">‏SIM کارڈ مقفل ہے</translation>
@@ -2009,6 +2016,7 @@
 <translation id="3269069891205016797">آپ کے سائن آؤٹ ہونے پر آپ کی معلومات آلہ سے ہٹا دی جائے گی۔</translation>
 <translation id="3269093882174072735">تصویر لوڈ کریں</translation>
 <translation id="3269612321104318480">ہلکا نیلگوں سبز اور سفید</translation>
+<translation id="3269689705184377744">{COUNT,plural, =1{فائل}other{# فائلز}}</translation>
 <translation id="326999365752735949">ڈف ڈاؤن لوڈ ہو رہا ہے</translation>
 <translation id="3270965368676314374">اپنے کمپیوٹر سے تصاویر، موسیقی اور دیگر میڈیا پڑھیں، تبدیل اور حذف کریں</translation>
 <translation id="327147043223061465">سبھی کوکیز اور سائٹ کا ڈیٹا دیکھیں</translation>
@@ -2304,6 +2312,7 @@
 <translation id="3600792891314830896">آواز چلانے والی سائٹس کی آواز بند کریں</translation>
 <translation id="360180734785106144">نئی خصوصیات کے دستیاب ہوتے ہی انہیں فراہم کریں</translation>
 <translation id="3602290021589620013">پیش منظر</translation>
+<translation id="3602870520245633055">پرنٹ اور اسکین کریں</translation>
 <translation id="3603622770190368340">نیٹ ورک سرٹیفیکیٹ حاصل کریں</translation>
 <translation id="3604193429970465812">ثانوی اکاؤنٹس</translation>
 <translation id="3604713164406837697">وال پیپر تبدیل کریں</translation>
@@ -2319,6 +2328,7 @@
 <translation id="3615579745882581859"><ph name="FILE_NAME" /> اسکین کیا جا رہا ہے۔</translation>
 <translation id="3616741288025931835">براؤزنگ ڈیٹا &amp;صاف کریں…</translation>
 <translation id="3617891479562106823">پس منظر غیر دستیاب ہیں۔ بعد میں دوبارہ کوشش کریں۔</translation>
+<translation id="3618800144880386250">{COUNT,plural, =1{ویڈیو}other{# ویڈیوز}}</translation>
 <translation id="3619115746895587757">کیپو چینو</translation>
 <translation id="362333465072914957">‏سرٹیفیکیٹ جاری کرنے کے لیے CA کا انتظار</translation>
 <translation id="3624567683873126087">‏آلہ کو غیر مقفل کریں اور Google اکاؤنٹ میں سائن ان کریں</translation>
@@ -2576,7 +2586,6 @@
 <translation id="3882165008614329320">کیمرے یا فائل سے لی گئی موجودہ ویڈیو</translation>
 <translation id="3884152383786131369">متعدد زبانوں میں دستیاب ویب مواد اس فہرست سے پہلی سپورٹ کی جانے والی زبان استعمال کرے گا۔ یہ ترجیحات آپ کے براؤزر کی ترتیبات کے ساتھ مطابقت پذیر ہیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">اس سائٹ تک رسائی حاصل کرنے کی آپ کی درخواست <ph name="NAME" /> کو بھیج دی گئی ہے</translation>
-<translation id="3888364689515978571">آف ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> کے ساتھ نوٹس لیے جا رہے ہیں</translation>
 <translation id="3890064827463908288">‏Wi-Fi سِنک استعمال کرنے کے لئے Chrome Sync کو آن کریں</translation>
 <translation id="3892414795099177503">‏OpenVPN / L2TP شامل کریں…</translation>
@@ -2660,7 +2669,6 @@
 <translation id="3958088479270651626">بُک مارکس اور ترتیبات درآمد کریں</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">سیلولر نیٹ ورک کو آف کریں</translation>
-<translation id="3965730875470565266">آن ہے، <ph name="MINUTES" /> منٹ</translation>
 <translation id="3965811923470826124">اس کے ساتھ</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> سے باہر نکلیں</translation>
 <translation id="3966072572894326936">دوسرا فولڈر منتخب کریں…</translation>
@@ -2730,6 +2738,7 @@
 <translation id="4047726037116394521">ہوم پر جائیں</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{‏# رابطہ دستیاب نہیں ہے۔ اس کے ساتھ 'قریبی اشتراک' کا استعمال کرنے کیلئے، اس کے Google اکاؤنٹ سے وابستہ ای میل پتے کو اپنے رابطوں میں شامل کریں۔}other{‏# رابطے دستیاب نہیں ہیں۔ ان کے ساتھ 'قریبی اشتراک' کا استعمال کرنے کیلئے، ان کے Google اکاؤنٹس سے وابستہ ای میل پتوں کو اپنے رابطوں میں شامل کریں۔}}</translation>
 <translation id="4050225813016893843">تصدیق کا طریقہ</translation>
+<translation id="4050534976465737778">‏یہ یقینی بنائیں کہ دونوں آلات غیر مقفل ہیں، وہ ایک دوسرے کے قریب ہیں اور ان کے بلوٹوتھ آن ہیں۔ اگر آپ کسی ایسے Chromebook کے ساتھ اشتراک کر رہے ہیں جو آپ کے رابطوں میں نہیں ہے تو یہ یقینی بنائیں کہ اس میں قریبی آلات کی مرئیت آن ہے (اسٹیٹس ایریا کھولیں، پھر قریبی آلات کی مرئیت کا انتخاب کریں)۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">چھوٹا</translation>
 <translation id="4054070260844648638">ہر کسی کیلئے مرئی</translation>
 <translation id="4056908315660577142">‏<ph name="APP_NAME" /> Chrome ایپ کے لیے آپ کے والدین کی سیٹ کی ہوئی آپ کی وقت کی حد پوری ہو گئی۔ اب آپ اسے <ph name="TIME_LIMIT" /> تک کل استعمال کر سکتے ہیں۔</translation>
@@ -2964,6 +2973,7 @@
 <translation id="4364327530094270451">خربوزہ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ایک ونڈو کا اشتراک کر رہی ہے۔</translation>
 <translation id="4364830672918311045">اطلاعات ڈسپلے کریں</translation>
+<translation id="4366138410738374926">پرنٹنگ شروع ہو گئی ہے</translation>
 <translation id="437004882363131692"><ph name="DEVICE_TYPE" /> کی تجاویز، پیشکشیں اور اپ ڈیٹس حاصل کریں اور تاثرات کا اشتراک کریں۔ کسی بھی وقت اَن سبسکرائب کریں۔</translation>
 <translation id="4370425812909262207">کارٹس چھپا دئے گئے۔ آپ کے تبدیلیاں کرنے پر وہ دوبارہ دکھائی دیں گے۔</translation>
 <translation id="4370975561335139969">آپ کی جانب سے درج کردہ ای میل اور پاس ورڈ مماثل نہیں ہیں</translation>
@@ -3151,6 +3161,7 @@
 <translation id="4568025708905928793">سیکیورٹی کلید کی درخواست کی جا رہی ہے</translation>
 <translation id="4568213207643490790">‏معذرت، Google اکاؤنٹس اس آلہ پر اجازت یافتہ نہیں ہیں۔</translation>
 <translation id="4569747168316751899">جب معطل ہو</translation>
+<translation id="4569830245132310845">{COUNT,plural, =1{پتہ}other{# پتے}}</translation>
 <translation id="4570387585180509432">پتے، فون نمبرز اور مزید بہت کچھ</translation>
 <translation id="4572659312570518089">"<ph name="DEVICE_NAME" />" سے منسلک کیے جانے کے وقت توثیق منسوخ کر دی گئی۔</translation>
 <translation id="4572779512957829735">‏اپنی سیکورٹی کلید کے لئے PIN درج کریں</translation>
@@ -3210,6 +3221,7 @@
 <translation id="4635444580397524003">‏Linux بیک اپ کامیابی کے ساتھ بحال کر دیا گیا ہے۔</translation>
 <translation id="4636930964841734540">معلومات</translation>
 <translation id="4637083375689622795">مزید کارروائیاں، <ph name="EMAIL" /></translation>
+<translation id="4637252186848840278">{COUNT,plural, =1{ٹیکسٹ}other{# ٹیکسٹس}}</translation>
 <translation id="4638930039313743000">‏ADB ڈیبگنگ فعال کریں</translation>
 <translation id="4641539339823703554">‏Chrome سسٹم کا وقت سیٹ کرنے سے قاصر تھا۔ براہ کرم ذيل میں وقت کو چیک کریں اور ضرورت پڑنے پر اسے درست کریں۔</translation>
 <translation id="4642769377300286600">موبائل کی پروفائل انسٹال ہو رہی ہے، نیٹ ورک <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="NETWORK_PROVIDER_NAME" /></translation>
@@ -3225,10 +3237,12 @@
 <translation id="4651484272688821107">ڈیمو موڈ کے وسائل کے ساتھ آن لائن جزو کو لوڈ نہیں کیا جا سکا۔</translation>
 <translation id="4652935475563630866">‏کیمرے کی ترتیب میں تبدیلی کے لیے، Parallels ڈیسک ٹاپ کو بند کر کے دوبارہ چلانے کی ضرورت ہے۔ آگے بڑھنے کے لیے Parallels ڈیسک ٹاپ کو بند کر کے دوبارہ چلائیں۔</translation>
 <translation id="4653405415038586100">‏Linux کو کنفیگر کرنے میں خرابی</translation>
+<translation id="4654236001025007561">‏اپنے اطراف موجود Chromebooks اور Android آلات کے ساتھ فائلز کا اشتراک کریں</translation>
 <translation id="4657914796247705218">‏TrackPoint کی رفتار</translation>
 <translation id="465878909996028221">‏صرف http، ‏https اور فائل پروٹوکولز ہی براؤزر کے ری ڈائریکٹس کے لئے تعاون یافتہ ہیں۔</translation>
 <translation id="4659077111144409915">بنیادی اکاؤنٹ</translation>
 <translation id="4659126640776004816">‏جب آپ اپنے Google اکاؤنٹ میں سائن ان کرتے ہیں، تو یہ خصوصیت آن ہو جاتی ہے۔</translation>
+<translation id="4660465405448977105">{COUNT,plural, =1{تصویر}other{# تصاویر}}</translation>
 <translation id="4660476621274971848">متوقع ورژن "<ph name="EXPECTED_VERSION" />"، لیکن ورژن تھا "<ph name="NEW_ID" />"</translation>
 <translation id="4660540330091848931">سائز تبدیل ہو رہا ہے</translation>
 <translation id="4661407454952063730">ایپ ڈیٹا رابطے، پیغامات اور تصاویر سمیت کوئی بھی ایسا ڈیٹا ہو سکتا ہے جسے کسی ایپ نے (ڈویلپر کی ترتیبات کی بنیاد پر) محفوظ کیا ہو۔</translation>
@@ -3329,6 +3343,7 @@
 <translation id="4794810983896241342">اپ ڈیٹس <ph name="BEGIN_LINK" />آپ کے منتظم<ph name="END_LINK" /> کے زیر انتظام ہیں۔</translation>
 <translation id="479536056609751218">‏ویب صفحہ، صرف HTML</translation>
 <translation id="4798236378408895261">‏<ph name="BEGIN_LINK" />بلوٹوتھ لاگز<ph name="END_LINK" /> منسلک کریں (Google داخلی)</translation>
+<translation id="4798543057539040565">{COUNT,plural, =1{آئٹم}other{# آئٹمز}}</translation>
 <translation id="4801448226354548035">اکاؤنٹس چھپائیں</translation>
 <translation id="4801512016965057443">موبائل ڈیٹا رومنگ کی اجازت دیں</translation>
 <translation id="4804818685124855865">منقطع کریں</translation>
@@ -3759,6 +3774,7 @@
 <translation id="531118851858162334">‏Google سروسز کا استعمال کر کے اپنی گزشتہ سرگرمی کی بنیاد پر آپ اس آئٹم کو دیکھ رہے ہیں۔ آپ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> پر اپنا ڈیٹا دیکھ، حذف اور اپنی ترتیبات کو تبدیل کر سکتے ہیں۔</translation>
 <translation id="5311304534597152726">اس کے بطور سائن ان کرنا</translation>
 <translation id="5311565231560644461">سائٹس کو اپنے ورچوئل رئیلٹی آلات اور ڈیٹا استعمال کرنے کی اجازت نہ دیں</translation>
+<translation id="5312876166662946389">{COUNT,plural, =1{تصویر}other{# تصاویر}}</translation>
 <translation id="5314381603623123224">‏Chrome کی سروس کی شرائط 31 مارچ کو بدل رہی ہیں</translation>
 <translation id="5315738755890845852">اضافی خمیدہ قوسین: <ph name="ERROR_LINE" /></translation>
 <translation id="5317780077021120954">محفوظ کریں</translation>
@@ -3824,6 +3840,7 @@
 <translation id="5390677308841849479">گہرا سرخ اور نارنجی</translation>
 <translation id="5390743329570580756">بھیجیں برائے</translation>
 <translation id="5392192690789334093">اطلاعات بھیجنے کی اجازت ہے</translation>
+<translation id="5393761864111565424">{COUNT,plural, =1{لنک}other{# لنکس}}</translation>
 <translation id="5397794290049113714">آپ</translation>
 <translation id="5398497406011404839">چھپے ہوئے بُک مارکس</translation>
 <translation id="5398572795982417028">صفحہ کے حوالہ کی حدوں سے باہر، حد <ph name="MAXIMUM_PAGE" /> ہے</translation>
@@ -4200,7 +4217,6 @@
 <translation id="5832813618714645810">پروفائلز</translation>
 <translation id="583281660410589416">نامعلوم</translation>
 <translation id="5833397272224757657">ذاتی نوعیت سازی کے لیے آپ کی ملاحظہ کی جانے والی سائٹوں، نیز براؤزر کی سرگرمی اور تعاملات پر موجود مواد استعمال کرتی ہے</translation>
-<translation id="5833551944249825624">‏آپ کا Chromebook قریب میں موجود سبھی لوگ 5 منٹ کے لئے دیکھ سکیں گے</translation>
 <translation id="5833726373896279253">ان ترتیبات میں صرف مالک ترمیم کر سکتا ہے:</translation>
 <translation id="5834581999798853053">تقریباً <ph name="TIME" /> منٹ باقی</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - کیمرا یا مائیکروفون ریکارڈ کر رہا ہے</translation>
@@ -4351,6 +4367,7 @@
 <translation id="6011074160056912900">ایتھرنیٹ نیٹ ورک</translation>
 <translation id="6011193465932186973">فنگر پرنٹ</translation>
 <translation id="6011449291337289699">سائٹ کا ڈیٹا صاف کریں</translation>
+<translation id="6013027779243312217">اپنی آڈیو اور ویڈیو کیلئے کیپشنز حاصل کریں</translation>
 <translation id="6015796118275082299">سال</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" /> میں سے اضافی مواد <ph name="CURRENT_ELEMENT" /> پر جائیں</translation>
 <translation id="6016551720757758985">پچھلے ورژن پر واپسی کے ساتھ پاور واش کی توثیق کریں</translation>
@@ -4860,6 +4877,7 @@
 <translation id="6605847144724004692">ابھی تک کسی صارف نے درجہ بندی نہیں کی۔</translation>
 <translation id="6607831829715835317">مزید &amp;ٹولز</translation>
 <translation id="6607890859198268021">‏<ph name="USER_EMAIL" /> پہلے سے ہی <ph name="DOMAIN" /> کے زیر انتظام ہے۔ مختلف Google اکاؤنٹ سے پیرنٹل کنٹرولز کو استعمال کرنے کے لیے، سیٹ اپ کے بعد سائن آؤٹ کریں، پھر سائن ان اسکرین پر "شخص شامل کریں" کو منتخب کریں۔</translation>
+<translation id="6609478180749378879">آپ کے پوشیدگی وضع سے باہر نکلنے کے بعد، سائن ان ڈیٹا اس آلے پر اسٹور کیا جائے گا۔ بعد میں، آپ اپنے آلے کی مدد سے اس ویب سائٹ پر دوبارہ سائن ان کر سکیں گے۔</translation>
 <translation id="6611972847767394631">یہاں اپنے ٹیبز تلاش کریں</translation>
 <translation id="6612358246767739896">تحفظ یافتہ مواد</translation>
 <translation id="6615455863669487791">مجھے دکھائیں</translation>
@@ -4878,6 +4896,7 @@
 <translation id="6628328486509726751">اپ لوڈ کرنے کا وقت <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">‏USB آلات تلاش کئے جا رہے ہیں...</translation>
 <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> آپ کی جانب سے خود کی توثیق کرنے کیلئے ایک سرٹیفکیٹ پر مستقل رسائی چاہتا ہے۔</translation>
+<translation id="6635362468090274700">جب تک آپ خود کو مرئی نہیں بنائیں گے، تب تک کوئی بھی آپ کے ساتھ اشتراک نہیں کر سکتا۔<ph name="BR" /><ph name="BR" />خود کو عارضی طور پر مرئی بنانے کیلئے، اسٹیٹس ایریا کھولیں، پھر قریبی آلات کی مرئیت کا انتخاب کریں۔</translation>
 <translation id="6635944431854494329">‏مالک ترتیبات &gt; اعلی &gt; Google کو خودکار طور پر ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجیں سے اس خصوصیت کو کنٹرول کر سکتا ہے۔</translation>
 <translation id="6635956300022133031">ٹیکسٹ ٹو اسپیچ آوازیں منتخب کریں اور حسب ضرورت بنائیں</translation>
 <translation id="6636588250634969791">‏آگے بڑھنے سے پہلے SIM کارڈ داخل کریں</translation>
@@ -5029,6 +5048,7 @@
 <translation id="6811332638216701903">‏DHCP میزبان کا نام</translation>
 <translation id="6812349420832218321">‏<ph name="PRODUCT_NAME" /> کو root کے بطور نہیں چلایا جا سکتا ہے۔</translation>
 <translation id="6812841287760418429">تبدیلیاں برقرار رکھیں</translation>
+<translation id="681584224457905309">{COUNT,plural, =1{فائل}other{# فائلز}}</translation>
 <translation id="6817174620439930047">‏جب کوئی سائٹ MIDI آلات تک رسائی کیلئے سسٹم کے جامع پیغامات استعمال کرنا چاہے تو پوچھیں (تجویز کردہ)</translation>
 <translation id="6818198425579322765">ترجمہ کرنے کے لیے صفحے کی زبان</translation>
 <translation id="6818802132960437751">پہلے سے شامل وائرس سے تحفظ</translation>
@@ -5049,6 +5069,7 @@
 <translation id="6835762382653651563">براہ کرم اپنا <ph name="DEVICE_TYPE" /> اپ ڈیٹ کرنے کیلئے انٹرنیٹ سے منسلک ہوں۔</translation>
 <translation id="6838034009068684089">جب کوئی سائٹ ونڈوز کھولنا اور آپ کی اسکرین پر رکھنا چاہے تو پوچھیں (تجاویز کردہ)</translation>
 <translation id="6838694093138907871">غلط کوڈ، براہ کرم دوبارہ کوشش کریں۔</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{فون نمبر}other{# فون نمبرز}}</translation>
 <translation id="6839225236531462745">سرٹیفکیٹ حذف کرنے میں خرابی</translation>
 <translation id="6839916869147598086">سائن ان تبدیل ہو چکا ہے</translation>
 <translation id="6840155290835956714">بھیجنے سے پہلے پوچھیں</translation>
@@ -5154,6 +5175,7 @@
 <translation id="6955446738988643816">پاپ اپ کا معائنہ کریں</translation>
 <translation id="6955535239952325894">یہ ترتیب نظم کردہ براؤزرز پر غیر فعال ہے</translation>
 <translation id="6957044667612803194">‏یہ سیکیورٹی کلید PINs کو سپورٹ نہیں کرتی</translation>
+<translation id="6957914043905853560">{COUNT,plural, =1{لنک}other{# لنکس}}</translation>
 <translation id="6960507406838246615">‏Linux کا اپ ڈیٹ درکار ہے</translation>
 <translation id="696103774840402661">اس <ph name="DEVICE_TYPE" /> پر موجود سبھی صارفین کے لیے تمام فائلز اور مقامی ڈیٹا کو مستقل طور پر حذف کر دیا گیا ہے۔</translation>
 <translation id="6964390816189577014">ہیرو</translation>
@@ -6064,6 +6086,7 @@
 <translation id="797394244396603170">وہ آلہ منتخب کریں جس کے ساتھ آپ فائلز کا اشتراک کرنا چاہتے ہیں</translation>
 <translation id="7973962044839454485">‏ایک غلط صارف نام یا پاس ورڈ کی وجہ سے PPP کی توثیق ناکام ہو گئی</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" /> کو دوبارہ استعمال کرنے کی کوشش کریں</translation>
+<translation id="7974713334845253259">ڈیفالٹ رنگ</translation>
 <translation id="7974936243149753750">اوور سکین</translation>
 <translation id="7975504106303186033">‏آپ کو اس Chrome Education آلے کا اندراج ایک تعلیمی اکاؤنٹ میں کرنا ہوگا۔ نئے اکاؤنٹ کی خاطر سائن اپ کرنے کے لئے، براہ کرم g.co/workspace/edusignup ملاحظہ کریں۔</translation>
 <translation id="7978412674231730200">نجی کلید</translation>
@@ -6229,6 +6252,7 @@
 <translation id="8157704005178149728">نگرانی ترتیب دی جا رہی ہے</translation>
 <translation id="8158117992543756526">اس آلہ نے <ph name="MONTH_AND_YEAR" /> میں خود کار سوفٹ ویئر اور سیکیورٹی اپ ڈیٹ حاصل کرنا بند کر دیا۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">سرٹیفیکیٹ ٹرسٹ کو ترتیب دینے میں خرابی</translation>
+<translation id="8160775796528709999">ترتیبات میں لائیو کیپشن فعال کر کے اپنی آڈیو اور ویڈیو کیلئے کیپشنز حاصل کریں</translation>
 <translation id="816095449251911490">‎<ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />، <ph name="TIME_REMAINING" />‎</translation>
 <translation id="8161293209665121583">ویب صفحات کے لیے ریڈر وضع</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{ٹیب کو نئی ونڈو میں منتقل کریں}other{ٹیبز کو نئی ونڈو میں منتقل کریں}}</translation>
@@ -6353,6 +6377,7 @@
 <translation id="8300011035382349091">اس ٹیب کے لیے بک مارک میں ترمیم کریں</translation>
 <translation id="8300374739238450534">نصف شب نیلا</translation>
 <translation id="8300849813060516376">‏OTASP ناکام ہوگیا</translation>
+<translation id="8303616404642252802">{COUNT,plural, =1{پتہ}other{# پتے}}</translation>
 <translation id="8304383784961451596">‏آپ کے پاس یہ آلہ استعمال کرنے کی اجازت نہیں ہے۔ براہ کرم سائن ان کی اجازت کے لئے منتظم سے رابطہ کریں یا Family Link کے زیر نگرانی Google اکاؤنٹ کے ساتھ سائن ان کریں۔</translation>
 <translation id="8308179586020895837">پوچھیں کہ آیا <ph name="HOST" /> آپ کے کیمرے تک رسائی حاصل کرنا چاہتا ہے</translation>
 <translation id="830868413617744215">بی ٹا</translation>
@@ -6651,6 +6676,7 @@
 <translation id="867085395664725367">سرور کی عارضی خرابی پیش آگئی۔</translation>
 <translation id="8673026256276578048">ویب پر تلاش کریں…</translation>
 <translation id="8673383193459449849">سرور کا مسئلہ</translation>
+<translation id="8676152597179121671">{COUNT,plural, =1{ویڈیو}other{# ویڈیوز}}</translation>
 <translation id="8676374126336081632">ان پٹ صاف کریں</translation>
 <translation id="8676770494376880701">کم پاور چارجر منسلک ہوگیا</translation>
 <translation id="8677212948402625567">سبھی کو سکیڑیں…</translation>
@@ -7076,6 +7102,7 @@
 <translation id="9128870381267983090">نیٹ ورک سے منسلک ہوں</translation>
 <translation id="9130015405878219958">غلط وضع درج کر دی گئی۔</translation>
 <translation id="9131487537093447019">بلوٹوتھ آلات پر پیغامات بھیجیں اور ان سے پیغامات موصول کریں۔</translation>
+<translation id="9134119143784876218">‏یہ خصوصیت انگریزی آڈیو اور ویڈیو کیلئے خودکار طور پر کیپشنز تخلیق کرتی ہے (فی الحال صرف Chrome براؤزر میں دستیاب ہے)۔ آڈیو اور کیپشنز ہمیشہ آلے پر ہی رہتے ہیں۔</translation>
 <translation id="9137013805542155359">اصل دکھائیں</translation>
 <translation id="9137157311132182254">ترجیحی سرچ انجن</translation>
 <translation id="9137248913990643158">‏براہ کرم شروع کریں اور اس ایپ کا استعمال کرنے سے پہلے Chrome میں سائن ان کریں۔</translation>
@@ -7123,6 +7150,7 @@
 <translation id="9179524979050048593">سائن ان اسکرین کے لیے صارف کا نام</translation>
 <translation id="9180281769944411366">‏اس کارروائی میں کچھ منٹ لگ سکتے ہيں۔ Linux کنٹینر شروع ہو رہا ہے۔</translation>
 <translation id="9180380851667544951">سائٹ آپ کی اسکرین کا اشتراک کر سکتی ہے</translation>
+<translation id="918352324374649435">{COUNT,plural, =1{ایپ}other{# ایپس}}</translation>
 <translation id="9186963452600581158">‏بچے کے Google اکاؤنٹ سے سائن ان کریں</translation>
 <translation id="9188732951356337132">‏استعمال اور ڈائیگناسٹک کا ڈیٹا بھیجیں۔ فی الوقت یہ آلہ خود کار طور پر ڈائیگناسٹک، آلے اور ایپ کے استعمال کا ڈیٹا Google کو بھیج رہا ہے۔ اس کا استعمال آپ کے بچے کی شناخت کیلئے نہیں کیا جائے گا اور اس سے سسٹم اور ایپ کے استحکام اور دیگر بہتریوں میں مدد ملے گی۔ کچھ مجموعی ڈیٹا Google ایپس اور پارٹنرز، جیسے Android ڈیولپرز، کی مدد بھی کرے گا۔ اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ <ph name="BEGIN_LINK2" />مزید جانیں<ph name="END_LINK2" /></translation>
 <translation id="9198090666959937775">‏اپنے Android فون کو سیکورٹی کلید کے طور پر استعمال کریں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 662dc183..32e25b52 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1043,6 +1043,7 @@
 <translation id="2154710561487035718">URL manzilni nusxalash</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> kabi</translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Yana xavfsizlik tekshiruvini ishga tushirish</translation>
 <translation id="2157474325782140681">Qoʻshimcha funksiyalardan foydalanish uchun bu Chromebook bilan sinalgan Dell dok stansiyasini ishlating.</translation>
 <translation id="215753907730220065">To‘liq ekran rejimidan chiqish</translation>
 <translation id="2157875535253991059">Ushbu sahifa hozir to‘liq ekran rejimida.</translation>
@@ -1987,6 +1988,7 @@
 <translation id="3225319735946384299">Kodni imzolash</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3233271424239923319">Linux ilova va fayllarini zaxiralash</translation>
+<translation id="3238192140106069382">Ulanmoqda va tekshirmoqda</translation>
 <translation id="3239373508713281971"><ph name="APP_NAME" /> uchun vaqt cheklovi olib tashlandi</translation>
 <translation id="3241680850019875542">To‘plamga qo‘shilayotgan kengaytmaning ildiz jildini tanlang. Kengaytmani yangilash uchun esa xususiy kalitni ko‘rsating.</translation>
 <translation id="3244294424315804309">Ovoz o‘chirib qo‘yilsin</translation>
@@ -2583,7 +2585,6 @@
 <translation id="3882165008614329320">Kamera yoki galereyadan olingan video</translation>
 <translation id="3884152383786131369">Bir nechta tilda chiqadigan veb kontent shu roʻyxatdagi birinchi mos tilni ishlatadi. Bu parametrlar brauzeringiz sozlamalari bilan sinxronlanadi. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Bu saytni ochishga ruxsat so‘rovi <ph name="NAME" />ga yuborildi</translation>
-<translation id="3888364689515978571">Oʻchiq. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Qaydlar <ph name="LOCK_SCREEN_APP_NAME" /> dasturida yoziladi</translation>
 <translation id="3890064827463908288">Wi-Fi Sync ishlatish uchun Chrome Sync funksiyasini yoqing</translation>
 <translation id="3892414795099177503">OpenVPN yoki L2TP qo‘shish...</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">Xatcho‘plar va sozlamalarni import qilish</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Mobil tarmoqni faolsizlantirish</translation>
-<translation id="3965730875470565266">Yoniq, <ph name="MINUTES" /> daq</translation>
 <translation id="3965811923470826124">Bu bilan:</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> profilidan chiqish</translation>
 <translation id="3966072572894326936">Boshqa jildni tanlang...</translation>
@@ -4216,7 +4216,6 @@
 <translation id="5832813618714645810">Profillar</translation>
 <translation id="583281660410589416">Noma’lum</translation>
 <translation id="5833397272224757657">Moslashtirish uchun brauzerdagi faoliyatingiz, siz kirgan sahifalar va brauzerda amalga oshirilgan ishlardan foydalanadi.</translation>
-<translation id="5833551944249825624">Chromebook qurilmangiz 5 daqiqa davomida atrofdagi hammaga koʻrinadi</translation>
 <translation id="5833726373896279253">Bu sozlashlarni faqat egasi o‘zgartirishi mumkin.</translation>
 <translation id="5834581999798853053">Taxminan <ph name="TIME" /> daqiqa qoldi</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – kamera yoki mikrofon yozib olmoqda</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 5d7900e..9b8a6e7d 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">Sao chép URL</translation>
 <translation id="2155772377859296191">Có vẻ như là <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Trình chạy dịch vụ: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Chạy lại tính năng kiểm tra an toàn</translation>
 <translation id="2157474325782140681">Để có thêm tính năng, hãy sử dụng đế sạc Dell tương thích với Chromebook này.</translation>
 <translation id="215753907730220065">Thoát khỏi Chế độ Toàn màn hình</translation>
 <translation id="2157875535253991059">Trang này hiện ở chế độ toàn màn hình.</translation>
@@ -1989,6 +1990,7 @@
 <translation id="3225319735946384299">Ký Mã</translation>
 <translation id="3227137524299004712">Micrô</translation>
 <translation id="3233271424239923319">Sao lưu các ứng dụng và tệp Linux</translation>
+<translation id="3238192140106069382">Đang kết nối và xác minh</translation>
 <translation id="3239373508713281971">Đã xóa giới hạn thời gian đối với <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Chọn thư mục gốc của tiện ích để đóng gói. Để cập nhật tiện ích, bạn cũng chọn tệp khóa cá nhân để sử dụng lại.</translation>
 <translation id="3244294424315804309">Tiếp tục tắt tiếng</translation>
@@ -2585,7 +2587,6 @@
 <translation id="3882165008614329320">Video hiện có từ camera hoặc tệp</translation>
 <translation id="3884152383786131369">Nội dung web có nhiều phiên bản ngôn ngữ sẽ dùng ngôn ngữ đầu tiên được hỗ trợ trong danh sách này. Những tùy chọn này được đồng bộ hóa với tùy chọn cài đặt của trình duyệt. <ph name="BEGIN_LINK_LEARN_MORE" />Tìm hiểu thêm<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Yêu cầu truy cập trang web này của bạn đã được gửi tới <ph name="NAME" /></translation>
-<translation id="3888364689515978571">Tắt. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Ghi chú bằng <ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Bật Chrome Sync để dùng tính năng Đồng bộ hóa Wi-Fi</translation>
 <translation id="3892414795099177503">Thêm OpenVPN / L2TP...</translation>
@@ -2669,7 +2670,6 @@
 <translation id="3958088479270651626">Nhập dấu trang và các mục cài đặt</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Tắt Mạng di động</translation>
-<translation id="3965730875470565266">Bật, <ph name="MINUTES" /> phút</translation>
 <translation id="3965811923470826124">Với</translation>
 <translation id="3965965397408324205">Thoát khỏi <ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Chọn một thư mục khác...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Hồ sơ</translation>
 <translation id="583281660410589416">Không xác định</translation>
 <translation id="5833397272224757657">Dùng nội dung trên trang web bạn truy cập cũng như các tương tác và hoạt động trên trình duyệt để cá nhân hóa</translation>
-<translation id="5833551944249825624">Tất cả những người ở gần có thể nhìn thấy Chromebook của bạn trong vòng 5 phút</translation>
 <translation id="5833726373896279253">Chỉ chủ sở hữu mới có thể sửa đổi các tùy chọn cài đặt này:</translation>
 <translation id="5834581999798853053">Còn khoảng <ph name="TIME" /> phút</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Đang ghi âm hoặc quay phim</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 12292938..b18f897e 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -117,7 +117,7 @@
 <translation id="1128109161498068552">禁止任何网站使用系统专有消息访问 MIDI 设备</translation>
 <translation id="1128591060186966949">修改搜索引擎</translation>
 <translation id="1129850422003387628">管理应用</translation>
-<translation id="113050636487300043">欢迎选择名字和颜色主题,以便区分各份个人资料</translation>
+<translation id="113050636487300043">欢迎选择名字和颜色主题,以便区分个人资料</translation>
 <translation id="1130589222747246278"><ph name="WINDOW_TITLE" /> - 属于“<ph name="GROUP_NAME" />”群组</translation>
 <translation id="1134009406053225289">在无痕式窗口中打开</translation>
 <translation id="1136179794690960030"><ph name="EMOJI_NAME" />。第 <ph name="EMOJI_INDEX" /> 个,共 <ph name="EMOJI_COUNT" /> 个。</translation>
@@ -2571,7 +2571,6 @@
 <translation id="3882165008614329320">来自摄像头或文件的现有视频</translation>
 <translation id="3884152383786131369">能以多种语言显示的网页内容将会使用此列表中第一项受支持的语言。这些偏好设置会与您的浏览器设置同步。<ph name="BEGIN_LINK_LEARN_MORE" />了解详情<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">系统已将您想访问此网站的请求发送给<ph name="NAME" /></translation>
-<translation id="3888364689515978571">已关闭。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">使用“<ph name="LOCK_SCREEN_APP_NAME" />”创建记事</translation>
 <translation id="3890064827463908288">您需要开启 Chrome 同步才能使用 Wi-Fi 同步功能</translation>
 <translation id="3892414795099177503">添加 OpenVPN / L2TP…</translation>
@@ -2654,7 +2653,6 @@
 <translation id="3958088479270651626">导入书签和设置</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">关闭移动网络</translation>
-<translation id="3965730875470565266">已开启,<ph name="MINUTES" /> 分钟后关闭</translation>
 <translation id="3965811923470826124">使用</translation>
 <translation id="3965965397408324205">退出<ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">选择其他文件夹...</translation>
@@ -4195,7 +4193,6 @@
 <translation id="5832813618714645810">个人资料</translation>
 <translation id="583281660410589416">未知</translation>
 <translation id="5833397272224757657">根据您访问的网站上的内容以及您在浏览器中的活动和互动行为,提供个性化的使用体验</translation>
-<translation id="5833551944249825624">您的 Chromebook 将会对附近所有人可见,时长为 5 分钟</translation>
 <translation id="5833726373896279253">这些设置的修改权仅限于所有者:</translation>
 <translation id="5834581999798853053">约剩 <ph name="TIME" /> 分钟</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - 摄像头或麦克风正在录制/录音</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index c64d7c44..b604e8d 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -992,7 +992,7 @@
 <translation id="2099686503067610784">要刪除伺服器憑證「<ph name="CERTIFICATE_NAME" />」嗎?</translation>
 <translation id="2100273922101894616">自動登入</translation>
 <translation id="2101225219012730419">版本:</translation>
-<translation id="2108349519800154983">{COUNT,plural, =1{電話號碼}other{# 組電話號碼}}</translation>
+<translation id="2108349519800154983">{COUNT,plural, =1{電話號碼}other{# 個電話號碼}}</translation>
 <translation id="211144231511833662">清除類型</translation>
 <translation id="2111670510994270194">在右側新增分頁</translation>
 <translation id="21133533946938348">固定分頁</translation>
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">複製網址</translation>
 <translation id="2155772377859296191">解像度:<ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker:<ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">再次執行安全檢查</translation>
 <translation id="2157474325782140681">如要取得其他功能,請使用此 Chromebook 的專用插座。</translation>
 <translation id="215753907730220065">結束全螢幕</translation>
 <translation id="2157875535253991059">這個頁面已顯示為全螢幕。</translation>
@@ -1437,7 +1438,7 @@
 <translation id="2604255671529671813">網絡連線錯誤</translation>
 <translation id="2606246518223360146">連結資料</translation>
 <translation id="2606454609872547359">否,不啟動 ChromeVox 並繼續操作</translation>
-<translation id="2606568927909309675">自動建立英文音訊和視訊的字幕。音訊和字幕絕不會外洩。</translation>
+<translation id="2606568927909309675">自動建立英文音訊和影片字幕。音訊和字幕絕不會外洩。</translation>
 <translation id="2607101320794533334">主體公開金鑰資料</translation>
 <translation id="2609896558069604090">建立捷徑…</translation>
 <translation id="2609980095400624569">無法建立連線</translation>
@@ -1702,7 +1703,7 @@
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="2889064240420137087">使用其他程式開啟連結…</translation>
 <translation id="2889925978073739256">繼續封鎖無沙箱防護的外掛程式</translation>
-<translation id="2891922230654533301">要從這部裝置登入「<ph name="APP_NAME" />」嗎?</translation>
+<translation id="2891922230654533301">要使用裝置登入 <ph name="APP_NAME" /> 嗎?</translation>
 <translation id="2893168226686371498">預設瀏覽器</translation>
 <translation id="2894757982205307093">在群組中新增分頁</translation>
 <translation id="289644616180464099">SIM 卡已鎖定</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">代碼簽名</translation>
 <translation id="3227137524299004712">麥克風</translation>
 <translation id="3233271424239923319">備份 Linux 應用程式和檔案</translation>
+<translation id="3238192140106069382">正在連線及驗證</translation>
 <translation id="3239373508713281971">已移除 <ph name="APP_NAME" /> 的時間限制</translation>
 <translation id="3241680850019875542">請選取要封裝的擴充功能根目錄。如要更新擴充功能,請一併選取要重複使用的私密金鑰。</translation>
 <translation id="3244294424315804309">繼續保持靜音</translation>
@@ -2310,7 +2312,7 @@
 <translation id="3600792891314830896">將播放音效的網站設為靜音</translation>
 <translation id="360180734785106144">即時提供可用的新功能</translation>
 <translation id="3602290021589620013">預覽</translation>
-<translation id="3602870520245633055">列印及掃描</translation>
+<translation id="3602870520245633055">列印並掃瞄</translation>
 <translation id="3603622770190368340">取得網絡憑證</translation>
 <translation id="3604193429970465812">次要帳戶</translation>
 <translation id="3604713164406837697">變更桌布</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">相機或檔案中的現有影片</translation>
 <translation id="3884152383786131369">支援多種語言的網站內容會使用此清單上的第一個支援語言。這些偏好設定會與您的瀏覽器設定同步。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">您想存取此網站的要求已傳送至<ph name="NAME" /></translation>
-<translation id="3888364689515978571">已關閉。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">正在使用「<ph name="LOCK_SCREEN_APP_NAME" />」寫筆記</translation>
 <translation id="3890064827463908288">開啟 Chrome 同步功能以使用 Wi-Fi Sync</translation>
 <translation id="3892414795099177503">新增 OpenVPN/L2TP…</translation>
@@ -2668,7 +2669,6 @@
 <translation id="3958088479270651626">匯入書籤和設定</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">關閉流動網絡</translation>
-<translation id="3965730875470565266">已開啟,剩餘 <ph name="MINUTES" /> 分鐘</translation>
 <translation id="3965811923470826124">包含</translation>
 <translation id="3965965397408324205">退出「<ph name="PROFILE_NAME" />」</translation>
 <translation id="3966072572894326936">選擇其他資料夾…</translation>
@@ -2738,7 +2738,7 @@
 <translation id="4047726037116394521">前往主畫面</translation>
 <translation id="4049783682480068824">{COUNT,plural, =1{無法連接 # 個聯絡人。如要與他們使用「咫尺共享」,請將他們的 Google 帳戶電郵地址加入您的通訊錄。}other{無法連接 # 個聯絡人。如要與他們使用「咫尺共享」,請將其 Google 帳戶電郵地址加入您的通訊錄。}}</translation>
 <translation id="4050225813016893843">驗證方法</translation>
-<translation id="4050534976465737778">請確認兩部裝置都已解鎖且彼此相鄰,並已開啟藍牙功能。如果要與未設為聯絡人的 Chromebook 分享內容,請確認該裝置已啟用鄰近分享瀏覽權限 (開啟狀態區,再啟用鄰近分享瀏覽權限)。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
+<translation id="4050534976465737778">請確保兩部裝置都已解鎖並放在一起,確保藍牙功能已開啟。如果要與未設定為聯絡人的 Chromebook 分享內容,請確認該裝置已啟用「咫尺共享」分享設定 (開啟狀態區,然後啟動「咫尺共享」分享設定)。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="4052120076834320548">最小</translation>
 <translation id="4054070260844648638">向所有人顯示</translation>
 <translation id="4056908315660577142">您已達到家長為「<ph name="APP_NAME" />」Chrome 應用程式設定的使用時間限制。明天可以使用 <ph name="TIME_LIMIT" />。</translation>
@@ -3237,7 +3237,7 @@
 <translation id="4651484272688821107">無法使用示範模式的資源載入網上組件。</translation>
 <translation id="4652935475563630866">Parallels Desktop 需要重新啟動,相機設定的變更才會生效。重新啟動 Parallels Desktop 即可繼續。</translation>
 <translation id="4653405415038586100">設定 Linux 時發生錯誤</translation>
-<translation id="4654236001025007561">將檔案分享給附近的 Chromebook 和 Android 裝置</translation>
+<translation id="4654236001025007561">與附近的 Chromebook 和 Android 裝置分享檔案</translation>
 <translation id="4657914796247705218">TrackPoint 速度</translation>
 <translation id="465878909996028221">瀏覽器重新導向僅支援 http、https 和 file 通訊協定。</translation>
 <translation id="4659077111144409915">主要帳戶</translation>
@@ -4218,7 +4218,6 @@
 <translation id="5832813618714645810">設定檔</translation>
 <translation id="583281660410589416">不明</translation>
 <translation id="5833397272224757657">使用您瀏覽的網站內容、瀏覽器活動及互動記錄,以提供個人化使用體驗</translation>
-<translation id="5833551944249825624">您的 Chromebook 將會向附近所有人顯示 5 分鐘</translation>
 <translation id="5833726373896279253">只有擁有者才能修改這些設定:</translation>
 <translation id="5834581999798853053">還有大約 <ph name="TIME" /> 分鐘</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - 相機或麥克風錄製中</translation>
@@ -4369,7 +4368,7 @@
 <translation id="6011074160056912900">以太網絡</translation>
 <translation id="6011193465932186973">指紋</translation>
 <translation id="6011449291337289699">清除網站資料</translation>
-<translation id="6013027779243312217">取得音訊和視訊的字幕</translation>
+<translation id="6013027779243312217">取得音訊和影片的字幕</translation>
 <translation id="6015796118275082299">年</translation>
 <translation id="6016178549409952427">導覽第 <ph name="CURRENT_ELEMENT" /> 個額外內容,共 <ph name="TOTAL_ELEMENTS" /> 個</translation>
 <translation id="6016551720757758985">確認執行 Powerwash 以重設為上個版本</translation>
@@ -4879,7 +4878,7 @@
 <translation id="6605847144724004692">尚未有使用者評分。</translation>
 <translation id="6607831829715835317">更多工具(&amp;L)</translation>
 <translation id="6607890859198268021"><ph name="USER_EMAIL" /> 目前已由 <ph name="DOMAIN" /> 管理。如要以其他 Google 帳戶使用家長監護功能,請在設定後登出,然後在登入畫面上選取「新增使用者」。</translation>
-<translation id="6609478180749378879">系統會在無痕模式結束後將登入資料儲存在這部裝置上。你可以再次透過這部裝置登入這個網站。</translation>
+<translation id="6609478180749378879">離開無痕模式後,登入資料會儲存在此裝置中。您可在日後透過裝置再次登入此網站。</translation>
 <translation id="6611972847767394631">您的分頁會在這裡顯示</translation>
 <translation id="6612358246767739896">受保護內容</translation>
 <translation id="6615455863669487791">顯示</translation>
@@ -4898,7 +4897,7 @@
 <translation id="6628328486509726751">上載時間:<ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation>
 <translation id="6630043285902923878">正在尋找 USB 裝置…</translation>
 <translation id="6630752851777525409">「<ph name="EXTENSION_NAME" />」要求憑證的永久存取權,以便代替您自我驗證。</translation>
-<translation id="6635362468090274700">你必須讓其他裝置可以偵測到這部裝置,其他人才能與你分享內容。<ph name="BR" /><ph name="BR" />如要暫時讓其他裝置可以偵測到這部裝置,請開啟狀態區,再啟用鄰近分享瀏覽權限。</translation>
+<translation id="6635362468090274700">您需要將自己的狀態設定為顯示,其他人才能與您分享內容。<ph name="BR" /><ph name="BR" />如要將狀態設定為暫時顯示,請開啟狀態區,再啟用「咫尺共享」分享設定。</translation>
 <translation id="6635944431854494329">擁有者可前往「設定」&gt;「進階」&gt;「自動將診斷和使用情況資料傳送給 Google」,以控制此功能。</translation>
 <translation id="6635956300022133031">選取及自訂文字轉語音的聲音</translation>
 <translation id="6636588250634969791">請先插入 SIM 卡再繼續</translation>
@@ -5071,7 +5070,7 @@
 <translation id="6835762382653651563">請連接互聯網以更新 <ph name="DEVICE_TYPE" />。</translation>
 <translation id="6838034009068684089">在網站要求在您的螢幕上開啟並放置視窗時詢問您 (建議)</translation>
 <translation id="6838694093138907871">代碼無效,請再試一次。</translation>
-<translation id="6838860780238890144">{COUNT,plural, =1{電話號碼}other{# 組電話號碼}}</translation>
+<translation id="6838860780238890144">{COUNT,plural, =1{電話號碼}other{# 個電話號碼}}</translation>
 <translation id="6839225236531462745">憑證刪除錯誤</translation>
 <translation id="6839916869147598086">登入方式已變更</translation>
 <translation id="6840155290835956714">傳送前先詢問</translation>
@@ -6253,7 +6252,7 @@
 <translation id="8157704005178149728">正在設定監控功能</translation>
 <translation id="8158117992543756526">此裝置已在 <ph name="MONTH_AND_YEAR" />停止自動更新軟件和安全性。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="816055135686411707">憑證信任設定錯誤</translation>
-<translation id="8160775796528709999">只要在設定中啟用即時字幕功能,即可取得音訊和視訊的字幕</translation>
+<translation id="8160775796528709999">透過啟用設定入面嘅即時字幕,為您嘅音訊同影片產生字幕</translation>
 <translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />,<ph name="TIME_REMAINING" /></translation>
 <translation id="8161293209665121583">使用閱讀器模式查看網頁</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{將分頁移至新視窗}other{將分頁移至新視窗}}</translation>
@@ -7102,7 +7101,7 @@
 <translation id="9128870381267983090">連線至網路</translation>
 <translation id="9130015405878219958">輸入的模式無效。</translation>
 <translation id="9131487537093447019">透過藍牙裝置傳送及接收訊息。</translation>
-<translation id="9134119143784876218">自動建立英文音訊和視訊的字幕 (目前僅支援 Chrome 瀏覽器)。音訊和字幕絕不會外洩。</translation>
+<translation id="9134119143784876218">自動建立英文音訊和影片字幕 (目前僅支援 Chrome 瀏覽器)。音訊和字幕絕不會外洩。</translation>
 <translation id="9137013805542155359">顯示原文</translation>
 <translation id="9137157311132182254">偏好的搜尋引擎</translation>
 <translation id="9137248913990643158">使用此應用程式前,請先啟動 Chrome 並登入帳戶。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 720c49b..7e91684 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1045,6 +1045,7 @@
 <translation id="2154710561487035718">複製網址</translation>
 <translation id="2155772377859296191">螢幕解析度:<ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker:<ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">再次執行安全檢查</translation>
 <translation id="2157474325782140681">如要取得其他功能,請使用這部 Chromebook 的專用座架。</translation>
 <translation id="215753907730220065">結束全螢幕</translation>
 <translation id="2157875535253991059">這個頁面已顯示為全螢幕。</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">程式碼簽署</translation>
 <translation id="3227137524299004712">麥克風</translation>
 <translation id="3233271424239923319">備份 Linux 應用程式和檔案</translation>
+<translation id="3238192140106069382">正在連線及驗證</translation>
 <translation id="3239373508713281971">已解除「<ph name="APP_NAME" />」的時間限制</translation>
 <translation id="3241680850019875542">請選取要封裝的擴充功能根目錄。如要更新擴充功能,請一併選取要重複使用的秘密金鑰。</translation>
 <translation id="3244294424315804309">繼續維持靜音</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">相機或檔案中的現有影片</translation>
 <translation id="3884152383786131369">支援多種語言的網站內容會使用這個清單上第一個支援的語言。這些偏好設定會與你的瀏覽器設定同步。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">你想存取這個網站的要求已傳送給<ph name="NAME" /></translation>
-<translation id="3888364689515978571">已關閉。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">使用「<ph name="LOCK_SCREEN_APP_NAME" />」寫筆記</translation>
 <translation id="3890064827463908288">開啟 Chrome 同步功能以使用 Wi-Fi 同步功能</translation>
 <translation id="3892414795099177503">新增 OpenVPN/L2TP...</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">匯入書籤和設定</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">關閉行動數據網路</translation>
-<translation id="3965730875470565266">已開啟,剩餘 <ph name="MINUTES" /> 分鐘</translation>
 <translation id="3965811923470826124">包含</translation>
 <translation id="3965965397408324205">離開<ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">選擇其他資料夾...</translation>
@@ -4217,7 +4217,6 @@
 <translation id="5832813618714645810">設定檔</translation>
 <translation id="583281660410589416">未知</translation>
 <translation id="5833397272224757657">使用你所造訪網站的內容、瀏覽器活動和瀏覽器互動行為,提供個人化的使用體驗</translation>
-<translation id="5833551944249825624">你的 Chromebook 會向附近的所有人顯示 5 分鐘</translation>
 <translation id="5833726373896279253">你必須是擁有者,才能修改這些設定:</translation>
 <translation id="5834581999798853053">剩下 <ph name="TIME" /> 分鐘</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - 攝影機或麥克風錄影/錄音中</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 9d3074b..8a51a35 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1044,6 +1044,7 @@
 <translation id="2154710561487035718">Kopisa i-URL</translation>
 <translation id="2155772377859296191">Kubukeka njenge-<ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Umsebenzi wesevisi: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156877321344104010">Qalisa ukuhlola ukuphepha futhi</translation>
 <translation id="2157474325782140681">Ukuze uthole izici ezingeziwe, sebenzisa isiteshi sedokhu se-Dell esidizayinelwe ukusebenza nale Chromebook.</translation>
 <translation id="215753907730220065">Phuma kusikrini esigcwele</translation>
 <translation id="2157875535253991059">Leli khasi manje seliyisikrini esigcwele.</translation>
@@ -1988,6 +1989,7 @@
 <translation id="3225319735946384299">Ukusayina kwekhodi</translation>
 <translation id="3227137524299004712">Imakrofoni</translation>
 <translation id="3233271424239923319">Yenza isipele izinhlelo zokusebenza namafayela e-Linux</translation>
+<translation id="3238192140106069382">Iyaxhuma futhi iyaqinisekisa</translation>
 <translation id="3239373508713281971">Umkhawulo wesikhathi ususelwe i-<ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Khetha impande yohlu lombhalo wesandiso ukuze upakishe. Ukuze ubuyekeze isandiso, phinda ukhethe ifayela lokhiye oyimfihlo ukuze uphinde usebenzise.</translation>
 <translation id="3244294424315804309">Qhubeka uthulise umsindo</translation>
@@ -2584,7 +2586,6 @@
 <translation id="3882165008614329320">Ividiyo ekhona kusuka kukhamera noma ifayela</translation>
 <translation id="3884152383786131369">Okuqukethwe kwewebhu okutholakala ngezilimi eziningi kuzosebenzisa ulimi lokuqala olusekelwe kusuka kulolu hlu. Lokhu okuncanyelwayo kuvunyelaniswa namasethingi wesiphequluli sakho. <ph name="BEGIN_LINK_LEARN_MORE" />Funda kabanzi<ph name="END_LINK_LEARN_MORE" /></translation>
 <translation id="3886446263141354045">Isicelo sakho sokufinyelela kule sayithi sithunyelwe ku-<ph name="NAME" /></translation>
-<translation id="3888364689515978571">Valiwe. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation>
 <translation id="3888550877729210209">Ukuthatha amanothi nge-<ph name="LOCK_SCREEN_APP_NAME" /></translation>
 <translation id="3890064827463908288">Vula ukuvumelanisa kwe-Chrome ukuze usebenzise Ukuxhumana ne-Wi-Fi</translation>
 <translation id="3892414795099177503">Engeza i-OpenVPN / L2TP...</translation>
@@ -2667,7 +2668,6 @@
 <translation id="3958088479270651626">Ngenisa amabhukhimakhi nezilungiselelo</translation>
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3964480518399667971">Vala inethiwekhi yeselula</translation>
-<translation id="3965730875470565266">Kuvuliwe, iminithi elingu-<ph name="MINUTES" /></translation>
 <translation id="3965811923470826124">Nge-</translation>
 <translation id="3965965397408324205">Phuma ku-<ph name="PROFILE_NAME" /></translation>
 <translation id="3966072572894326936">Khetha enye ifolda...</translation>
@@ -4219,7 +4219,6 @@
 <translation id="5832813618714645810">Amaphrofayela</translation>
 <translation id="583281660410589416">Akwaziwa</translation>
 <translation id="5833397272224757657">Isebenzisa okuqukethwe kumasayithi owavakashelayo, nomsebenzi wokuphequlula nokuhlanganyela, ukuze kwenziwe kube ngokwakho</translation>
-<translation id="5833551944249825624">I-Chromebook izobonakala kuwo wonke umuntu oseduze ngamaminithi ama-5</translation>
 <translation id="5833726373896279253">Lezi zilungiselelo zingashintshwa kuphela ngumnikazi:</translation>
 <translation id="5834581999798853053">Kusele okungenani amaminithi angu-<ph name="TIME" /></translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Ikhamera noma ukurekhoda kwemakrofoni</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index 042748c..b185506 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -58,7 +58,7 @@
 <translation id="2467438592969358367">Google Chrome 想导出您的密码。请输入您的 Windows 密码以允许此操作。</translation>
 <translation id="2485422356828889247">卸载</translation>
 <translation id="2534507159460261402">Google Pay(已复制到 Chrome)</translation>
-<translation id="2574930892358684005"><ph name="EXISTING_USER" />已登录这份 Chrome 个人资料。Chrome 可为您创建一份专属的个人资料,以将您的浏览数据与该用户的浏览数据分隔开来。</translation>
+<translation id="2574930892358684005"><ph name="EXISTING_USER" />已登录此 Chrome 个人资料。Chrome 可为您创建一份专属的个人资料,以将您的浏览数据与该用户的浏览数据分隔开来。</translation>
 <translation id="2580411288591421699">无法安装与当前运行版本相同的 Google Chrome 浏览器。请关闭 Google Chrome 浏览器,然后重试。</translation>
 <translation id="2586406160782125153">这会从这台设备上删除您的浏览数据。如果日后想要检索您的数据,届时请以 <ph name="USER_EMAIL" /> 的身份登录 Chrome。</translation>
 <translation id="2588634262982826227">如果这样设置,Chrome 操作系统便总能在重新启动后自动恢复您的应用和网页,无需每次都询问。</translation>
diff --git a/chrome/app/shared_settings_strings.grdp b/chrome/app/shared_settings_strings.grdp
index b2f7d4e..ddcd0690 100644
--- a/chrome/app/shared_settings_strings.grdp
+++ b/chrome/app/shared_settings_strings.grdp
@@ -141,6 +141,9 @@
   <message name="IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_DESCRIPTION" desc="Description of the mobile data usage setting where Wi-Fi or cell data may be used for transfers for the Nearby Share feature.">
     May incur mobile data charges
   </message>
+  <message name="IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP" desc="Explanation of when the mobile data usage setting applies. When selected, Mobile data means that Wi-Fi or cell data may be used for transfers for the Nearby Share feature.">
+    This option applies to Chromebooks with a data plan or mobile network dongle, or when tethering to a portable hotspot
+  </message>
   <message name="IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_OFFLINE_LABEL" desc="Label for the data usage setting where transfers will only take place offline for the Nearby Share feature.">
     Without internet
   </message>
diff --git a/chrome/app/shared_settings_strings_grdp/IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP.png.sha1 b/chrome/app/shared_settings_strings_grdp/IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP.png.sha1
new file mode 100644
index 0000000..75be5ddc
--- /dev/null
+++ b/chrome/app/shared_settings_strings_grdp/IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP.png.sha1
@@ -0,0 +1 @@
+08702b4a133ecd08e916d48e23e8e35a5fcd8730
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 9661797..68eacfba 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -182,12 +182,6 @@
     "background_sync/periodic_background_sync_permission_context.h",
     "bad_message.cc",
     "bad_message.h",
-    "banners/app_banner_manager.cc",
-    "banners/app_banner_manager.h",
-    "banners/app_banner_metrics.cc",
-    "banners/app_banner_metrics.h",
-    "banners/app_banner_settings_helper.cc",
-    "banners/app_banner_settings_helper.h",
     "battery/battery_metrics.cc",
     "battery/battery_metrics.h",
     "bitmap_fetcher/bitmap_fetcher.cc",
@@ -2307,6 +2301,7 @@
     "//media/mojo/services",
     "//media/webrtc",
     "//mojo/core/embedder",
+    "//mojo/core/embedder:features",
     "//mojo/public/cpp/bindings",
     "//net",
     "//net:extras",
@@ -2822,11 +2817,6 @@
       "android/oom_intervention/oom_intervention_tab_helper.h",
       "android/partner_browser_customizations.cc",
       "android/partner_browser_customizations.h",
-      "android/password_edit_delegate.h",
-      "android/password_edit_delegate_settings_impl.cc",
-      "android/password_edit_delegate_settings_impl.h",
-      "android/password_editing_bridge.cc",
-      "android/password_editing_bridge.h",
       "android/password_ui_view_android.cc",
       "android/password_ui_view_android.h",
       "android/permissions/permission_settings_bridge.cc",
@@ -3753,7 +3743,7 @@
       "metrics/incognito_observer_desktop.cc",
       "metrics/tab_stats_data_store.cc",
       "metrics/tab_stats_data_store.h",
-      "metrics/tab_stats_handler.h",
+      "metrics/tab_stats_observer.h",
       "metrics/tab_stats_tracker.cc",
       "metrics/tab_stats_tracker.h",
       "metrics/tab_stats_tracker_delegate.h",
@@ -4436,6 +4426,8 @@
       "nearby_sharing/payload_tracker.h",
       "nearby_sharing/power_client.cc",
       "nearby_sharing/power_client.h",
+      "nearby_sharing/power_client_chromeos.cc",
+      "nearby_sharing/power_client_chromeos.h",
       "nearby_sharing/share_target_discovered_callback.h",
       "nearby_sharing/share_target_info.cc",
       "nearby_sharing/share_target_info.h",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index fe96531..912a11e 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -528,4 +528,7 @@
   "chrome_content_browser_client\.cc" : [
     "+content/public/browser/tts_controller.h",
   ],
+  "about_flags\.cc" : [
+    "+mojo/core/embedder/features.h",
+  ]
 }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 269962c..2d7995a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -157,6 +157,7 @@
 #include "media/media_buildflags.h"
 #include "media/midi/midi_switches.h"
 #include "media/webrtc/webrtc_switches.h"
+#include "mojo/core/embedder/features.h"
 #include "net/base/features.h"
 #include "net/net_buildflags.h"
 #include "net/nqe/effective_connection_type.h"
@@ -3232,6 +3233,13 @@
      FEATURE_VALUE_TYPE(performance_manager::features::kDynamicTcmallocTuning)},
 #endif  // BUILDFLAG(USE_TCMALLOC)
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#if (defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_ANDROID)) && \
+    !defined(OS_NACL)
+    {"mojo-linux-sharedmem", flag_descriptions::kMojoLinuxChannelSharedMemName,
+     flag_descriptions::kMojoLinuxChannelSharedMemDescription,
+     kOsCrOS | kOsLinux | kOsAndroid,
+     FEATURE_VALUE_TYPE(mojo::core::kMojoLinuxChannelSharedMem)},
+#endif
 #if defined(OS_ANDROID)
     {"enable-site-isolation-for-password-sites",
      flag_descriptions::kSiteIsolationForPasswordSitesName,
@@ -6313,10 +6321,6 @@
      flag_descriptions::kEnhancedClipboardNudgeSessionResetDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(
          chromeos::features::kClipboardHistoryNudgeSessionReset)},
-    {"enhanced_clipboard_simple_render",
-     flag_descriptions::kEnhancedClipboardSimpleRenderName,
-     flag_descriptions::kEnhancedClipboardSimpleRenderDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kClipboardHistorySimpleRender)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if defined(OS_WIN)
diff --git a/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java b/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
index 0085f2dfa..7090972 100644
--- a/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
+++ b/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
@@ -8,6 +8,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.AnyThread;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
@@ -84,6 +85,11 @@
         private static CipherFactory sInstance = new CipherFactory();
     }
 
+    @VisibleForTesting
+    public static void resetInstanceForTesting() {
+        LazyHolder.sInstance = new CipherFactory();
+    }
+
     /**
      * Synchronization primitive to prevent thrashing the cipher parameters between threads
      * attempting to restore previous parameters and generate new ones.
diff --git a/chrome/browser/android/instantapps/instant_apps_settings.cc b/chrome/browser/android/instantapps/instant_apps_settings.cc
index 50a942f..63b5433b 100644
--- a/chrome/browser/android/instantapps/instant_apps_settings.cc
+++ b/chrome/browser/android/instantapps/instant_apps_settings.cc
@@ -10,7 +10,7 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chrome/android/chrome_jni_headers/InstantAppsSettings_jni.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "content/public/browser/web_contents.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/android/metrics/launch_metrics.cc b/chrome/browser/android/metrics/launch_metrics.cc
index 53f1f480..6abb8b8 100644
--- a/chrome/browser/android/metrics/launch_metrics.cc
+++ b/chrome/browser/android/metrics/launch_metrics.cc
@@ -6,11 +6,11 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 #include "chrome/android/chrome_jni_headers/LaunchMetrics_jni.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/prefs/pref_metrics_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/site_engagement/content/site_engagement_service.h"
 #include "components/webapps/browser/android/shortcut_info.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/android/password_edit_delegate_settings_impl.cc b/chrome/browser/android/password_edit_delegate_settings_impl.cc
deleted file mode 100644
index 52e0991..0000000
--- a/chrome/browser/android/password_edit_delegate_settings_impl.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "chrome/browser/android/password_edit_delegate_settings_impl.h"
-
-#include "base/containers/contains.h"
-#include "chrome/browser/password_manager/password_store_factory.h"
-#include "chrome/browser/password_manager/password_store_utils.h"
-#include "components/password_manager/core/browser/password_store.h"
-
-PasswordEditDelegateSettingsImpl::PasswordEditDelegateSettingsImpl(
-    Profile* profile,
-    base::span<const std::unique_ptr<password_manager::PasswordForm>>
-        forms_to_change,
-    std::vector<base::string16> existing_usernames)
-    : profile_(profile), existing_usernames_(std::move(existing_usernames)) {
-  DCHECK(!forms_to_change.empty());
-
-  // Deep copy is needed because the forms need to be persisted  and owned by
-  // the delegate after the PasswordManagerPresenter stops existing.
-  forms_to_change_.reserve(forms_to_change.size());
-  for (const auto& password_form : forms_to_change) {
-    forms_to_change_.push_back(
-        std::make_unique<password_manager::PasswordForm>(*password_form));
-  }
-}
-
-PasswordEditDelegateSettingsImpl::~PasswordEditDelegateSettingsImpl() = default;
-
-void PasswordEditDelegateSettingsImpl::EditSavedPassword(
-    const base::string16& new_username,
-    const base::string16& new_password) {
-  DCHECK(!new_password.empty()) << "The password is empty.";
-
-  const bool username_changed =
-      forms_to_change_[0]->username_value != new_username;
-
-  // In case the username changed, make sure that there exists no other
-  // credential with the same signon_realm and username.
-  if (username_changed && base::Contains(existing_usernames_, new_username)) {
-    // TODO(crbug.com/1002021): We shouldn't fail silently.
-    DLOG(ERROR) << "A credential with the same signon_realm and username "
-                   "already exists.";
-    return;
-  }
-
-  EditSavedPasswords(profile_, forms_to_change_, new_username, new_password);
-}
diff --git a/chrome/browser/android/password_edit_delegate_settings_impl.h b/chrome/browser/android/password_edit_delegate_settings_impl.h
deleted file mode 100644
index c87600ca..0000000
--- a/chrome/browser/android/password_edit_delegate_settings_impl.h
+++ /dev/null
@@ -1,44 +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.
-
-#ifndef CHROME_BROWSER_ANDROID_PASSWORD_EDIT_DELEGATE_SETTINGS_IMPL_H_
-#define CHROME_BROWSER_ANDROID_PASSWORD_EDIT_DELEGATE_SETTINGS_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/strings/string16.h"
-#include "chrome/browser/android/password_edit_delegate.h"
-#include "chrome/browser/android/password_editing_bridge.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "components/password_manager/core/browser/password_store_consumer.h"
-
-class Profile;
-
-// This is created and destroyed together with the bridge and holds
-// all the information about the password form that was loaded and edited in the
-// PasswordEntryEditor.
-class PasswordEditDelegateSettingsImpl : public PasswordEditDelegate {
- public:
-  // |forms_to_change| contains all the password forms that share a sort key
-  // with the form that will be edited. |existing_usernames| belong to other
-  // saved credentials for the same site and are used to check if the edited
-  // username conflicts with any previously existing ones.
-  PasswordEditDelegateSettingsImpl(
-      Profile* profile,
-      base::span<const std::unique_ptr<password_manager::PasswordForm>>
-          forms_to_change,
-      std::vector<base::string16> existing_usernames);
-  ~PasswordEditDelegateSettingsImpl() override;
-
-  void EditSavedPassword(const base::string16& new_username,
-                         const base::string16& new_password) override;
-
- private:
-  Profile* profile_ = nullptr;
-  std::vector<base::string16> existing_usernames_;
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change_;
-};
-
-#endif  // CHROME_BROWSER_ANDROID_PASSWORD_EDIT_DELEGATE_SETTINGS_IMPL_H_
diff --git a/chrome/browser/android/password_edit_delegate_settings_impl_unittest.cc b/chrome/browser/android/password_edit_delegate_settings_impl_unittest.cc
deleted file mode 100644
index 19f9ce34..0000000
--- a/chrome/browser/android/password_edit_delegate_settings_impl_unittest.cc
+++ /dev/null
@@ -1,334 +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.
-
-#include "chrome/browser/android/password_edit_delegate_settings_impl.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/memory/scoped_refptr.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece_forward.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/android/password_edit_delegate_settings_impl.h"
-#include "chrome/browser/password_manager/password_store_factory.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "components/password_manager/core/browser/password_list_sorter.h"
-#include "components/password_manager/core/browser/password_manager_test_utils.h"
-#include "components/password_manager/core/browser/test_password_store.h"
-#include "content/public/test/browser_task_environment.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-using testing::ElementsAre;
-using testing::Pair;
-using testing::UnorderedElementsAre;
-
-namespace {
-
-constexpr char kExampleCom[] = "https://example.com/";
-constexpr char kExampleOrg[] = "https://example.org/";
-constexpr char kNewPassword[] = "new_pass";
-constexpr char kNewUser[] = "new_user";
-constexpr char kPassword1[] = "pass";
-constexpr char kPassword2[] = "pass2";
-constexpr char kUsername1[] = "user";
-constexpr char kUsername2[] = "user2";
-
-std::vector<std::pair<std::string, std::string>> GetUsernamesAndPasswords(
-    const std::vector<password_manager::PasswordForm>& forms) {
-  std::vector<std::pair<std::string, std::string>> result;
-  result.reserve(forms.size());
-  for (const auto& form : forms) {
-    result.emplace_back(base::UTF16ToUTF8(form.username_value),
-                        base::UTF16ToUTF8(form.password_value));
-  }
-
-  return result;
-}
-
-password_manager::PasswordForm MakeSavedForm(const GURL& origin,
-                                             base::StringPiece username,
-                                             base::StringPiece password) {
-  password_manager::PasswordForm form;
-  form.url = origin;
-  form.signon_realm = origin.GetOrigin().spec();
-  form.username_element = base::ASCIIToUTF16("Email");
-  form.username_value = base::ASCIIToUTF16(username);
-  form.password_element = base::ASCIIToUTF16("Passwd");
-  form.password_value = base::ASCIIToUTF16(password);
-  return form;
-}
-
-std::vector<std::unique_ptr<password_manager::PasswordForm>>
-ExtractEquivalentForms(
-    const password_manager::PasswordForm& edited_form,
-    const std::vector<password_manager::PasswordForm>& saved_forms) {
-  std::string sort_key = password_manager::CreateSortKey(edited_form);
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> equivalent_forms;
-  for (const password_manager::PasswordForm& form : saved_forms) {
-    if (password_manager::CreateSortKey(form) == sort_key) {
-      equivalent_forms.push_back(
-          std::make_unique<password_manager::PasswordForm>(form));
-    }
-  }
-  return equivalent_forms;
-}
-
-std::vector<base::string16> ExtractUsernamesSameUrl(
-    const GURL& url,
-    const std::vector<password_manager::PasswordForm>& saved_forms) {
-  std::vector<base::string16> existing_usernames;
-  for (const auto& form : saved_forms) {
-    if (form.url == url) {
-      existing_usernames.push_back(form.username_value);
-    }
-  }
-  return existing_usernames;
-}
-
-}  // namespace
-
-class PasswordEditDelegateSettingsImplTest : public testing::Test {
- protected:
-  PasswordEditDelegateSettingsImplTest() = default;
-
-  ~PasswordEditDelegateSettingsImplTest() override {
-    store_->ShutdownOnUIThread();
-    task_environment_.RunUntilIdle();
-  }
-
-  password_manager::TestPasswordStore* GetStore() { return store_.get(); }
-
-  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> CreateTestDelegate(
-      const std::vector<std::unique_ptr<password_manager::PasswordForm>>& forms,
-      std::vector<base::string16> existing_usernames);
-
-  const std::vector<password_manager::PasswordForm>& GetStoredPasswordsForRealm(
-      base::StringPiece signon_realm);
-
-  void InitializeStoreWithForms(
-      const std::vector<password_manager::PasswordForm>& saved_forms);
-
- private:
-  content::BrowserTaskEnvironment task_environment_;
-  TestingProfile profile_;
-  scoped_refptr<password_manager::TestPasswordStore> store_ =
-      base::WrapRefCounted(static_cast<password_manager::TestPasswordStore*>(
-          PasswordStoreFactory::GetInstance()
-              ->SetTestingFactoryAndUse(
-                  &profile_,
-                  base::BindRepeating(&password_manager::BuildPasswordStore<
-                                      content::BrowserContext,
-                                      password_manager::TestPasswordStore>))
-              .get()));
-};
-
-std::unique_ptr<PasswordEditDelegateSettingsImpl>
-PasswordEditDelegateSettingsImplTest::CreateTestDelegate(
-    const std::vector<std::unique_ptr<password_manager::PasswordForm>>& forms,
-    std::vector<base::string16> existing_usernames) {
-  return std::make_unique<PasswordEditDelegateSettingsImpl>(
-      &profile_, forms, std::move(existing_usernames));
-}
-
-const std::vector<password_manager::PasswordForm>&
-PasswordEditDelegateSettingsImplTest::GetStoredPasswordsForRealm(
-    base::StringPiece signon_realm) {
-  const auto& stored_passwords = GetStore()->stored_passwords();
-  auto for_realm_it = stored_passwords.find(signon_realm);
-  return for_realm_it->second;
-}
-
-void PasswordEditDelegateSettingsImplTest::InitializeStoreWithForms(
-    const std::vector<password_manager::PasswordForm>& saved_forms) {
-  for (const auto& form : saved_forms) {
-    GetStore()->AddLogin(form);
-  }
-  RunUntilIdle();
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest, EditPassword) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-  std::vector<password_manager::PasswordForm> saved_forms = {edited_form};
-  InitializeStoreWithForms(saved_forms);
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kUsername1),
-                                            base::ASCIIToUTF16(kNewPassword));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              ElementsAre(Pair(kUsername1, kNewPassword)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest, EditUsername) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-
-  std::vector<password_manager::PasswordForm> saved_forms = {edited_form};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kNewUser),
-                                            base::ASCIIToUTF16(kPassword1));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              ElementsAre(Pair(kNewUser, kPassword1)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest, EditUsernameAndPassword) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-
-  std::vector<password_manager::PasswordForm> saved_forms = {edited_form};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kNewUser),
-                                            base::ASCIIToUTF16(kNewPassword));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              ElementsAre(Pair(kNewUser, kNewPassword)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest, RejectSameUsernameForSameRealm) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername2, kPassword2);
-  std::vector<password_manager::PasswordForm> saved_forms = {edited_form,
-                                                             other_form};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kUsername2),
-                                            base::ASCIIToUTF16(kPassword1));
-  RunUntilIdle();
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              UnorderedElementsAre(Pair(kUsername1, kPassword1),
-                                   Pair(kUsername2, kPassword2)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest, UpdateDuplicates) {
-  password_manager::PasswordForm edited_form = MakeSavedForm(
-      GURL(base::StrCat({kExampleCom, "pathA"})), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form = MakeSavedForm(
-      GURL(base::StrCat({kExampleCom, "pathB"})), kUsername1, kPassword1);
-  std::vector<password_manager::PasswordForm> saved_forms = {edited_form,
-                                                             other_form};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kNewUser),
-                                            base::ASCIIToUTF16(kNewPassword));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              UnorderedElementsAre(Pair(kNewUser, kNewPassword),
-                                   Pair(kNewUser, kNewPassword)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest,
-       EditUsernameForTheRightCredential) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form1 =
-      MakeSavedForm(GURL(kExampleCom), kUsername2, kPassword2);
-  password_manager::PasswordForm other_form2 =
-      MakeSavedForm(GURL(kExampleOrg), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form3 =
-      MakeSavedForm(GURL(kExampleOrg), kUsername2, kPassword2);
-  std::vector<password_manager::PasswordForm> saved_forms = {
-      edited_form, other_form1, other_form2, other_form3};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kNewUser),
-                                            base::ASCIIToUTF16(kPassword1));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              UnorderedElementsAre(Pair(kNewUser, kPassword1),
-                                   Pair(kUsername2, kPassword2)));
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleOrg)),
-              UnorderedElementsAre(Pair(kUsername1, kPassword1),
-                                   Pair(kUsername2, kPassword2)));
-}
-
-TEST_F(PasswordEditDelegateSettingsImplTest,
-       EditPasswordForTheRightCredential) {
-  password_manager::PasswordForm edited_form =
-      MakeSavedForm(GURL(kExampleCom), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form1 =
-      MakeSavedForm(GURL(kExampleCom), kUsername2, kPassword2);
-  password_manager::PasswordForm other_form2 =
-      MakeSavedForm(GURL(kExampleOrg), kUsername1, kPassword1);
-  password_manager::PasswordForm other_form3 =
-      MakeSavedForm(GURL(kExampleOrg), kUsername2, kPassword2);
-  std::vector<password_manager::PasswordForm> saved_forms = {
-      edited_form, other_form1, other_form2, other_form3};
-  InitializeStoreWithForms(saved_forms);
-
-  std::vector<std::unique_ptr<password_manager::PasswordForm>> forms_to_change =
-      ExtractEquivalentForms(edited_form, saved_forms);
-  std::vector<base::string16> existing_usernames =
-      ExtractUsernamesSameUrl(edited_form.url, saved_forms);
-
-  std::unique_ptr<PasswordEditDelegateSettingsImpl> password_edit_delegate =
-      CreateTestDelegate(forms_to_change, std::move(existing_usernames));
-  password_edit_delegate->EditSavedPassword(base::ASCIIToUTF16(kUsername1),
-                                            base::ASCIIToUTF16(kNewPassword));
-  RunUntilIdle();
-
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleCom)),
-              UnorderedElementsAre(Pair(kUsername1, kNewPassword),
-                                   Pair(kUsername2, kPassword2)));
-  EXPECT_THAT(GetUsernamesAndPasswords(GetStoredPasswordsForRealm(kExampleOrg)),
-              UnorderedElementsAre(Pair(kUsername1, kPassword1),
-                                   Pair(kUsername2, kPassword2)));
-}
diff --git a/chrome/browser/android/password_editing_bridge.cc b/chrome/browser/android/password_editing_bridge.cc
deleted file mode 100644
index 03968c77..0000000
--- a/chrome/browser/android/password_editing_bridge.cc
+++ /dev/null
@@ -1,68 +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.
-
-#include "chrome/browser/android/password_editing_bridge.h"
-
-#include <memory>
-
-#include "base/android/jni_string.h"
-#include "chrome/android/chrome_jni_headers/PasswordEditingBridge_jni.h"
-#include "chrome/browser/android/password_edit_delegate_settings_impl.h"
-
-using base::android::ConvertUTF16ToJavaString;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::JavaParamRef;
-
-void PasswordEditingBridge::Destroy(JNIEnv* env,
-                                    const JavaParamRef<jobject>& obj) {
-  delete this;
-}
-
-void PasswordEditingBridge::LaunchPasswordEntryEditor(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& context,
-    Profile* profile,
-    base::span<const std::unique_ptr<password_manager::PasswordForm>>
-        forms_to_change,
-    std::vector<base::string16> existing_usernames) {
-  // |forms_to_change| is built in
-  // |PasswordManagerPresnter::TryGetPasswordForms|, which under certain
-  // circumstances can return an empty array (e.g. when the index for
-  // the requested forms entry in the forms map is out of bounds because the
-  // entry was removed in the meantime).
-  if (forms_to_change.empty())
-    return;
-
-  // PasswordEditingBridge will destroy itself when the UI is gone on the Java
-  // side.
-  PasswordEditingBridge* password_editing_bridge = new PasswordEditingBridge(
-      std::make_unique<PasswordEditDelegateSettingsImpl>(
-          profile, forms_to_change, std::move(existing_usernames)));
-
-  Java_PasswordEditingBridge_showEditingUI(
-      base::android::AttachCurrentThread(),
-      password_editing_bridge->java_object_, context,
-      ConvertUTF8ToJavaString(env, forms_to_change[0]->signon_realm),
-      ConvertUTF16ToJavaString(env, forms_to_change[0]->username_value),
-      ConvertUTF16ToJavaString(env, forms_to_change[0]->password_value));
-}
-
-void PasswordEditingBridge::HandleEditSavedPasswordEntry(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& object,
-    const JavaParamRef<jstring>& new_username,
-    const JavaParamRef<jstring>& new_password) {
-  password_edit_delegate_->EditSavedPassword(
-      ConvertJavaStringToUTF16(env, new_username),
-      ConvertJavaStringToUTF16(env, new_password));
-}
-
-PasswordEditingBridge::PasswordEditingBridge(
-    std::unique_ptr<PasswordEditDelegate> password_edit_delegate)
-    : password_edit_delegate_(std::move(password_edit_delegate)) {
-  java_object_.Reset(Java_PasswordEditingBridge_create(
-      base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this)));
-}
-
-PasswordEditingBridge::~PasswordEditingBridge() = default;
diff --git a/chrome/browser/android/password_editing_bridge.h b/chrome/browser/android/password_editing_bridge.h
deleted file mode 100644
index 6c50f94..0000000
--- a/chrome/browser/android/password_editing_bridge.h
+++ /dev/null
@@ -1,66 +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.
-
-#ifndef CHROME_BROWSER_ANDROID_PASSWORD_EDITING_BRIDGE_H_
-#define CHROME_BROWSER_ANDROID_PASSWORD_EDITING_BRIDGE_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/android/jni_weak_ref.h"
-#include "base/macros.h"
-#include "components/password_manager/core/browser/password_store.h"
-
-class PasswordEditDelegate;
-class Profile;
-
-namespace password_manager {
-struct PasswordForm;
-}  // namespace password_manager
-
-// A bridge that allows communication between Android UI and the native
-// side. It can be used to launch the password editing activity from the
-// native side or when the credential change made in the UI needs to
-// arrive to the native side to be saved.
-class PasswordEditingBridge {
- public:
-  // This is must be called when the view is destroyed, as it's the only way to
-  // destroy the bridge and the delegate with it.
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
-
-  // Creates a new PasswordEditingBridge and connects it with a new delegate.
-  // |forms_to_change| contains all the password forms that share a sort key
-  // with the form that will be edited. |existing_usernames| belong to other
-  // saved credentials for the same site and are used to check if the edited
-  // username conflicts with any previously existing ones.
-  static void LaunchPasswordEntryEditor(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& context,
-      Profile* profile,
-      base::span<const std::unique_ptr<password_manager::PasswordForm>>
-          forms_to_change,
-      std::vector<base::string16> existing_usernames);
-
-  void HandleEditSavedPasswordEntry(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& java_object,
-      const base::android::JavaParamRef<jstring>& new_username,
-      const base::android::JavaParamRef<jstring>& new_password);
-
- private:
-  explicit PasswordEditingBridge(
-      std::unique_ptr<PasswordEditDelegate> password_edit_delegate);
-  ~PasswordEditingBridge();
-
-  // The corresponding java object.
-  base::android::ScopedJavaGlobalRef<jobject> java_object_;
-
-  // The delegate belonging to the bridge.
-  std::unique_ptr<PasswordEditDelegate> password_edit_delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordEditingBridge);
-};
-
-#endif  // CHROME_BROWSER_ANDROID_PASSWORD_EDITING_BRIDGE_H_
diff --git a/chrome/browser/android/password_ui_view_android.cc b/chrome/browser/android/password_ui_view_android.cc
index 273e0fd..11e071a 100644
--- a/chrome/browser/android/password_ui_view_android.cc
+++ b/chrome/browser/android/password_ui_view_android.cc
@@ -25,7 +25,6 @@
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "chrome/android/chrome_jni_headers/PasswordUIView_jni.h"
-#include "chrome/browser/android/password_editing_bridge.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -212,10 +211,7 @@
     const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& context,
     int index) {
-  PasswordEditingBridge::LaunchPasswordEntryEditor(
-      env, context, GetProfile(),
-      password_manager_presenter_.GetPasswords(index),
-      password_manager_presenter_.GetUsernamesForRealm(index));
+  // TODO(crbug.com/1141409): Wire the new editing module here.
 }
 
 ScopedJavaLocalRef<jstring> JNI_PasswordUIView_GetAccountDashboardURL(
diff --git a/chrome/browser/android/vr/gvr_graphics_delegate.cc b/chrome/browser/android/vr/gvr_graphics_delegate.cc
index c29b1df..ab2facb 100644
--- a/chrome/browser/android/vr/gvr_graphics_delegate.cc
+++ b/chrome/browser/android/vr/gvr_graphics_delegate.cc
@@ -160,20 +160,12 @@
 
 void GvrGraphicsDelegate::InitializeGl(gfx::AcceleratedWidget window,
                                        bool start_in_webxr_mode) {
-  // We can only share native GL resources with GVR, and GVR doesn't support
-  // ANGLE, so disable it.
-  // TODO(crbug.com/1170580): support ANGLE with cardboard?
-  gl::init::DisableANGLE();
-
   if (gl::GetGLImplementation() == gl::kGLImplementationNone &&
       !gl::init::InitializeGLOneOff()) {
     LOG(ERROR) << "gl::init::InitializeGLOneOff failed";
     browser_->ForceExitVr();
     return;
   }
-
-  DCHECK(gl::GetGLImplementation() != gl::kGLImplementationEGLANGLE);
-
   scoped_refptr<gl::GLSurface> surface;
   if (window) {
     DCHECK(!surfaceless_rendering_);
diff --git a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc b/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc
index e4bbffc..390d364 100644
--- a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc
+++ b/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_installer.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_mediator.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "components/webapps/browser/android/add_to_homescreen_params.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 
 namespace webapps {
 
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc
index f1b3cb3..567c20f 100644
--- a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc
+++ b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc
@@ -11,12 +11,12 @@
 #include "chrome/android/chrome_jni_headers/AddToHomescreenMediator_jni.h"
 #include "chrome/browser/android/webapk/webapk_metrics.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_installer.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/banners/app_banner_manager_android.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "components/url_formatter/elide_url.h"
 #include "components/webapps/browser/android/add_to_homescreen_params.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "components/webapps/browser/webapps_client.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.h b/chrome/browser/android/webapps/add_to_homescreen_mediator.h
index 6fb6c26..4745edd 100644
--- a/chrome/browser/android/webapps/add_to_homescreen_mediator.h
+++ b/chrome/browser/android/webapps/add_to_homescreen_mediator.h
@@ -12,9 +12,9 @@
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_installer.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "components/webapps/browser/android/add_to_homescreen_data_fetcher.h"
 #include "components/webapps/browser/android/add_to_homescreen_params.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "url/gurl.h"
 
diff --git a/chrome/browser/apps/app_service/browser_app_launcher.cc b/chrome/browser/apps/app_service/browser_app_launcher.cc
index 641a4180..2c784ca7 100644
--- a/chrome/browser/apps/app_service/browser_app_launcher.cc
+++ b/chrome/browser/apps/app_service/browser_app_launcher.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/apps/app_service/browser_app_launcher.h"
 
+#include <utility>
+
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
@@ -72,6 +74,25 @@
       extension && extension->from_bookmark()) {
     web_app::RecordAppWindowLaunch(profile_, params.app_id);
   }
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // If the restore id is available, save the launch parameters to the full
+  // restore file.
+  if (SessionID::IsValidValue(params.restore_id)) {
+    AppLaunchParams params_for_restore(
+        params.app_id, params.container, params.disposition, params.source,
+        params.display_id, params.launch_files, params.intent);
+
+    auto launch_info = std::make_unique<full_restore::AppLaunchInfo>(
+        params_for_restore.app_id, params_for_restore.container,
+        params_for_restore.disposition, params_for_restore.display_id,
+        std::move(params_for_restore.launch_files),
+        std::move(params_for_restore.intent));
+    full_restore::SaveAppLaunchInfo(profile_->GetPath(),
+                                    std::move(launch_info));
+  }
+#endif
+
   return ::OpenApplication(profile_, std::move(params));
 }
 
diff --git a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
index 4c74c64..d752c49 100644
--- a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
+++ b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -764,13 +764,12 @@
                 toolbar.findViewById(PwaInstallBottomSheetView.getAppOriginViewIdForTesting());
         TextView description =
                 content.findViewById(PwaInstallBottomSheetView.getDescViewIdForTesting());
-        TextView categories =
-                content.findViewById(PwaInstallBottomSheetView.getCategoriesViewIdForTesting());
 
         Assert.assertEquals("PWA Bottom Sheet", appName.getText());
         Assert.assertTrue(appOrigin.getText().toString().startsWith("http://127.0.0.1:"));
-        Assert.assertEquals("App description", description.getText());
-        Assert.assertEquals("Categories: cats, memes.", categories.getText());
+        Assert.assertEquals("Lorem ipsum dolor sit amet, consectetur adipiscing elit, "
+                        + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
+                description.getText());
 
         // Collapse the bottom sheet.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
diff --git a/chrome/browser/banners/app_banner_manager_android.cc b/chrome/browser/banners/app_banner_manager_android.cc
index 18b541c..f9705ca 100644
--- a/chrome/browser/banners/app_banner_manager_android.cc
+++ b/chrome/browser/banners/app_banner_manager_android.cc
@@ -18,8 +18,6 @@
 #include "chrome/browser/android/webapps/add_to_homescreen_coordinator.h"
 #include "chrome/browser/banners/android/jni_headers/AppBannerInProductHelpControllerProvider_jni.h"
 #include "chrome/browser/banners/android/jni_headers/AppBannerManager_jni.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/webapps/android/features.h"
@@ -36,6 +34,8 @@
 #include "components/webapps/browser/android/shortcut_info.h"
 #include "components/webapps/browser/android/webapps_icon_utils.h"
 #include "components/webapps/browser/android/webapps_utils.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_data.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "components/webapps/browser/webapps_client.h"
@@ -527,7 +527,7 @@
     PwaBottomSheetController::MaybeCreateAndShow(
         weak_factory_.GetWeakPtr(), web_contents(), GetAppName(), primary_icon_,
         has_maskable_primary_icon_, manifest_.start_url, screenshots_,
-        manifest_.description.value_or(base::string16()), manifest_.categories,
+        manifest_.description.value_or(base::string16()),
         /* show_expaned= */ false);
   }
 }
@@ -577,12 +577,6 @@
 }
 
 // static
-AppBannerManager* AppBannerManager::FromWebContents(
-    content::WebContents* web_contents) {
-  return AppBannerManagerAndroid::FromWebContents(web_contents);
-}
-
-// static
 base::android::ScopedJavaLocalRef<jobject>
 JNI_AppBannerManager_GetJavaBannerManagerForWebContents(
     JNIEnv* env,
diff --git a/chrome/browser/banners/app_banner_manager_android.h b/chrome/browser/banners/app_banner_manager_android.h
index 3975111e..52f374cf 100644
--- a/chrome/browser/banners/app_banner_manager_android.h
+++ b/chrome/browser/banners/app_banner_manager_android.h
@@ -14,8 +14,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
 #include "chrome/browser/android/webapps/add_to_homescreen_installer.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "components/webapps/browser/android/installable/installable_ambient_badge_infobar_delegate.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/banners/app_banner_manager_browsertest.cc b/chrome/browser/banners/app_banner_manager_browsertest.cc
index c601dd0..0fdbc50 100644
--- a/chrome/browser/banners/app_banner_manager_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_browsertest.cc
@@ -14,17 +14,17 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/banners/app_banner_manager_browsertest_base.h"
 #include "chrome/browser/banners/app_banner_manager_desktop.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/site_engagement/content/site_engagement_score.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_manager.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
diff --git a/chrome/browser/banners/app_banner_manager_desktop.cc b/chrome/browser/banners/app_banner_manager_desktop.cc
index 748a63b..807eeac 100644
--- a/chrome/browser/banners/app_banner_manager_desktop.cc
+++ b/chrome/browser/banners/app_banner_manager_desktop.cc
@@ -13,14 +13,14 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/extensions/bookmark_app_util.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/constants.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
@@ -67,12 +67,6 @@
       base::WrapUnique(new AppBannerManagerDesktop(web_contents)));
 }
 
-// static
-AppBannerManager* AppBannerManager::FromWebContents(
-    content::WebContents* web_contents) {
-  return AppBannerManagerDesktop::FromWebContents(web_contents);
-}
-
 void AppBannerManagerDesktop::DisableTriggeringForTesting() {
   gDisableTriggeringForTesting = true;
 }
diff --git a/chrome/browser/banners/app_banner_manager_desktop.h b/chrome/browser/banners/app_banner_manager_desktop.h
index dd52866..6ece0e4a 100644
--- a/chrome/browser/banners/app_banner_manager_desktop.h
+++ b/chrome/browser/banners/app_banner_manager_desktop.h
@@ -10,10 +10,10 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/app_registrar_observer.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/web_contents_user_data.h"
 
 namespace extensions {
diff --git a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
index 46e8405..e2d4ad6 100644
--- a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
@@ -16,8 +16,6 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/banners/app_banner_manager_browsertest_base.h"
 #include "chrome/browser/banners/app_banner_manager_desktop.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/banners/test_app_banner_manager_desktop.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -34,6 +32,8 @@
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index b5b36ed..ffc3aae 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -44,7 +44,7 @@
 
 // Enables notification muting during screen share sessions.
 const base::Feature kMuteNotificationsDuringScreenShare{
-    "MuteNotificationsDuringScreenShare", base::FEATURE_DISABLED_BY_DEFAULT};
+    "MuteNotificationsDuringScreenShare", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // When enabled, keepalive requests can block browser shutdown for a short
 // period of time.
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 3a415e26..9d0b370f 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -19,7 +19,6 @@
         <structure name="IDR_GUEST_TAB_HTML" file="resources\ntp4\guest_tab.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_EPHEMERAL_GUEST_TAB_HTML" file="resources\ntp4\ephemeral_guest_tab.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_EPHEMERAL_GUEST_TAB_CSS" file="resources\ntp4\ephemeral_guest_tab.css" flattenhtml="true" type="chrome_html" />
-        <structure name="IDR_NEW_TAB_4_HTML" file="resources\ntp4\new_tab.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_NEW_TAB_4_THEME_CSS" file="resources\ntp4\new_tab_theme.css" flattenhtml="true" type="chrome_html" />
 
       </if>
@@ -45,6 +44,8 @@
         <structure name="IDR_OOBE_COMPONENTS_I18N_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_i18n_behavior/oobe_i18n_behavior.js" type="chrome_html" />
         <structure name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_focus_behavior/oobe_focus_behavior.html" type="chrome_html" />
         <structure name="IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_focus_behavior/oobe_focus_behavior.js" type="chrome_html" />
+        <structure name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_HTML" file="resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.html" type="chrome_html" />
+        <structure name="IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_JS" file="resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.js" type="chrome_html" />
 
         <!-- OOBE CSS Vars -->
         <structure name="IDR_OOBE_COMPONENTS_OOBE_CUSTOM_VARS_OLD_CSS_HTML" file="resources/chromeos/login/components/oobe_vars/oobe_custom_vars_old_css.html" type="chrome_html" />
diff --git a/chrome/browser/cart/cart_handler.cc b/chrome/browser/cart/cart_handler.cc
index 4d72a8a..72c86dd 100644
--- a/chrome/browser/cart/cart_handler.cc
+++ b/chrome/browser/cart/cart_handler.cc
@@ -75,10 +75,19 @@
     cart->merchant = std::move(proto_pair.second.merchant());
     cart->cart_url = GURL(std::move(proto_pair.second.merchant_cart_url()));
     std::vector<std::string> image_urls;
-    for (std::string image_url : proto_pair.second.product_image_urls()) {
-      cart->product_image_urls.emplace_back(std::move(image_url));
+    // Not show product images when showing welcome surface.
+    if (!cart_service_->ShouldShowWelcomSurface()) {
+      for (std::string image_url : proto_pair.second.product_image_urls()) {
+        cart->product_image_urls.emplace_back(std::move(image_url));
+      }
     }
     carts.push_back(std::move(cart));
   }
   std::move(callback).Run(std::move(carts));
+  cart_service_->IncreaseWelcomeSurfaceCounter();
+}
+
+void CartHandler::GetWarmWelcomeVisible(
+    GetWarmWelcomeVisibleCallback callback) {
+  std::move(callback).Run(cart_service_->ShouldShowWelcomSurface());
 }
diff --git a/chrome/browser/cart/cart_handler.h b/chrome/browser/cart/cart_handler.h
index 8f6d82b..ea4c8e8 100644
--- a/chrome/browser/cart/cart_handler.h
+++ b/chrome/browser/cart/cart_handler.h
@@ -31,6 +31,7 @@
   void RemoveCart(const GURL& cart_url, RemoveCartCallback callback) override;
   void RestoreRemovedCart(const GURL& cart_url,
                           RestoreRemovedCartCallback callback) override;
+  void GetWarmWelcomeVisible(GetWarmWelcomeVisibleCallback callback) override;
 
  private:
   void GetCartDataCallback(GetMerchantCartsCallback callback,
diff --git a/chrome/browser/cart/cart_handler_unittest.cc b/chrome/browser/cart/cart_handler_unittest.cc
index 7b4650f..d01c8d6 100644
--- a/chrome/browser/cart/cart_handler_unittest.cc
+++ b/chrome/browser/cart/cart_handler_unittest.cc
@@ -21,6 +21,12 @@
   for (size_t i = 0; i < expected.size(); i++) {
     ASSERT_EQ(expected[i]->merchant, found[i]->merchant);
     ASSERT_EQ(expected[i]->cart_url, found[i]->cart_url);
+    ASSERT_EQ(expected[i]->product_image_urls.size(),
+              found[i]->product_image_urls.size());
+    for (size_t j = 0; j < expected[i]->product_image_urls.size(); j++) {
+      ASSERT_EQ(expected[i]->product_image_urls[i],
+                found[i]->product_image_urls[i]);
+    }
   }
   std::move(closure).Run();
 }
@@ -98,6 +104,13 @@
     std::move(closure).Run();
   }
 
+  void GetEvaluationShouldShowWelcomSurface(base::OnceClosure closure,
+                                            bool expected_show,
+                                            bool actual_show) {
+    EXPECT_EQ(expected_show, actual_show);
+    std::move(closure).Run();
+  }
+
   void TearDown() override {}
 
  protected:
@@ -255,3 +268,59 @@
                      base::Unretained(this), run_loop[5].QuitClosure(), false));
   run_loop[5].Run();
 }
+
+// Tests show welcome surface for first three appearances of cart module.
+TEST_F(CartHandlerTest, TestShowWelcomeSurface) {
+  base::RunLoop run_loop[11];
+  base::test::ScopedFeatureList features;
+  features.InitAndEnableFeature(ntp_features::kNtpChromeCartModule);
+
+  // Add a cart with product image.
+  CartDB* cart_db_ = service_->GetDB();
+  const char image_url[] = "www.image1.com";
+  cart_db::ChromeCartContentProto merchant_proto =
+      BuildProto(kMockMerchantBKey, kMockMerchantB, kMockMerchantURLB);
+  merchant_proto.add_product_image_urls(image_url);
+  cart_db_->AddCart(
+      kMockMerchantBKey, merchant_proto,
+      base::BindOnce(&CartHandlerTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), true));
+  run_loop[0].Run();
+
+  // Show welcome surface for the first three appearances.
+  for (int i = 0; i < CartService::kWelcomSurfaceShowLimit; i++) {
+    // Build a callback result without product image.
+    auto dummy_cart1 = chrome_cart::mojom::MerchantCart::New();
+    dummy_cart1->merchant = kMockMerchantB;
+    dummy_cart1->cart_url = GURL(kMockMerchantURLB);
+    std::vector<chrome_cart::mojom::MerchantCartPtr> carts_without_product;
+    carts_without_product.push_back(std::move(dummy_cart1));
+
+    handler_->GetWarmWelcomeVisible(base::BindOnce(
+        &CartHandlerTest::GetEvaluationShouldShowWelcomSurface,
+        base::Unretained(this), run_loop[2 * i + 1].QuitClosure(), true));
+    run_loop[2 * i + 1].Run();
+    handler_->GetMerchantCarts(base::BindOnce(
+        &GetEvaluationMerchantCarts, run_loop[2 * (i + 1)].QuitClosure(),
+        std::move(carts_without_product)));
+    run_loop[2 * (i + 1)].Run();
+  }
+
+  // Build a callback result with product image.
+  auto dummy_cart2 = chrome_cart::mojom::MerchantCart::New();
+  dummy_cart2->merchant = kMockMerchantB;
+  dummy_cart2->cart_url = GURL(kMockMerchantURLB);
+  dummy_cart2->product_image_urls.emplace_back(image_url);
+  std::vector<chrome_cart::mojom::MerchantCartPtr> carts_with_product;
+  carts_with_product.push_back(std::move(dummy_cart2));
+
+  // Not show welcome surface afterwards.
+  handler_->GetWarmWelcomeVisible(
+      base::BindOnce(&CartHandlerTest::GetEvaluationShouldShowWelcomSurface,
+                     base::Unretained(this), run_loop[9].QuitClosure(), false));
+  run_loop[9].Run();
+  handler_->GetMerchantCarts(base::BindOnce(&GetEvaluationMerchantCarts,
+                                            run_loop[10].QuitClosure(),
+                                            std::move(carts_with_product)));
+  run_loop[10].Run();
+}
diff --git a/chrome/browser/cart/cart_service.cc b/chrome/browser/cart/cart_service.cc
index 6aa79bf..35b0c33 100644
--- a/chrome/browser/cart/cart_service.cc
+++ b/chrome/browser/cart/cart_service.cc
@@ -52,6 +52,7 @@
 void CartService::RegisterProfilePrefs(PrefRegistrySimple* registry) {
   registry->RegisterBooleanPref(prefs::kCartModuleHidden, false);
   registry->RegisterBooleanPref(prefs::kCartModuleRemoved, false);
+  registry->RegisterIntegerPref(prefs::kCartModuleWelcomeSurfaceShownTimes, 0);
 }
 
 void CartService::Hide() {
@@ -133,6 +134,21 @@
                                     std::move(callback)));
 }
 
+void CartService::IncreaseWelcomeSurfaceCounter() {
+  if (!ShouldShowWelcomSurface())
+    return;
+  int times = profile_->GetPrefs()->GetInteger(
+      prefs::kCartModuleWelcomeSurfaceShownTimes);
+  profile_->GetPrefs()->SetInteger(prefs::kCartModuleWelcomeSurfaceShownTimes,
+                                   times + 1);
+}
+
+bool CartService::ShouldShowWelcomSurface() {
+  return profile_->GetPrefs()->GetInteger(
+             prefs::kCartModuleWelcomeSurfaceShownTimes) <
+         kWelcomSurfaceShowLimit;
+}
+
 void CartService::LoadCartsWithFakeData(CartDB::LoadCallback callback) {
   cart_db_->LoadCartsWithPrefix(
       kFakeDataPrefix,
diff --git a/chrome/browser/cart/cart_service.h b/chrome/browser/cart/cart_service.h
index bdcf16c3..e28985e 100644
--- a/chrome/browser/cart/cart_service.h
+++ b/chrome/browser/cart/cart_service.h
@@ -20,6 +20,9 @@
 class CartService : public history::HistoryServiceObserver,
                     public KeyedService {
  public:
+  // The maximum number of times that cart welcome surface shows.
+  static constexpr int kWelcomSurfaceShowLimit = 3;
+
   CartService(const CartService&) = delete;
   CartService& operator=(const CartService&) = delete;
   ~CartService() override;
@@ -60,6 +63,12 @@
   // Gets called when restoring the permanently removed single cart.
   void RestoreRemovedCart(const GURL& cart_url,
                           CartDB::OperationCallback callback);
+  // Gets called when module shows welcome surface and increases the counter by
+  // one.
+  void IncreaseWelcomeSurfaceCounter();
+  // Returns whether to show the welcome surface in module. It is related to how
+  // many times the welcome surface has shown.
+  bool ShouldShowWelcomSurface();
   // history::HistoryServiceObserver:
   void OnURLsDeleted(history::HistoryService* history_service,
                      const history::DeletionInfo& deletion_info) override;
diff --git a/chrome/browser/cart/cart_service_unittest.cc b/chrome/browser/cart/cart_service_unittest.cc
index 063ec57..01c4c98 100644
--- a/chrome/browser/cart/cart_service_unittest.cc
+++ b/chrome/browser/cart/cart_service_unittest.cc
@@ -8,7 +8,9 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db.h"
 #include "chrome/browser/persisted_state_db/profile_proto_db_factory.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/prefs/pref_service.h"
 #include "components/search/ntp_features.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -433,3 +435,17 @@
       run_loop[4].QuitClosure(), kEmptyExpected));
   run_loop[4].Run();
 }
+
+// Tests whether to show the welcome surface is correctly controlled.
+TEST_F(CartServiceTest, TestControlShowWelcomeSurface) {
+  const int limit = CartService::kWelcomSurfaceShowLimit;
+  for (int i = 0; i < limit; i++) {
+    EXPECT_EQ(i, profile_.GetPrefs()->GetInteger(
+                     prefs::kCartModuleWelcomeSurfaceShownTimes));
+    EXPECT_TRUE(service_->ShouldShowWelcomSurface());
+    service_->IncreaseWelcomeSurfaceCounter();
+  }
+  EXPECT_FALSE(service_->ShouldShowWelcomSurface());
+  EXPECT_EQ(limit, profile_.GetPrefs()->GetInteger(
+                       prefs::kCartModuleWelcomeSurfaceShownTimes));
+}
diff --git a/chrome/browser/cart/chrome_cart.mojom b/chrome/browser/cart/chrome_cart.mojom
index 15c18be..f200d23 100644
--- a/chrome/browser/cart/chrome_cart.mojom
+++ b/chrome/browser/cart/chrome_cart.mojom
@@ -40,4 +40,6 @@
   // Restores removed cart for certain domain
   // and returns if the operation is successful.
   RestoreRemovedCart(url.mojom.Url cart_url) => (bool success);
+  // Returns whether to show welcome surface in the module.
+  GetWarmWelcomeVisible() => (bool visible);
 };
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm
index b088155..cc2a51e 100644
--- a/chrome/browser/chrome_browser_application_mac.mm
+++ b/chrome/browser/chrome_browser_application_mac.mm
@@ -60,14 +60,24 @@
     case NSEventTypeKeyDown:
     case NSEventTypeKeyUp: {
       // Some NSEvents return a string with NUL in event.characters, see
-      // <https://crbug.com/826908>.
-      std::string characters = base::SysNSStringToUTF8([event.characters
-          stringByReplacingOccurrencesOfString:@"\0"
-                                    withString:@"\\x00"]);
-      std::string unmodified_characters =
-          base::SysNSStringToUTF8([event.charactersIgnoringModifiers
-              stringByReplacingOccurrencesOfString:@"\0"
-                                        withString:@"\\x00"]);
+      // <https://crbug.com/826908>. To make matters worse, in rare cases,
+      // NSEvent.characters or NSEvent.charactersIgnoringModifiers can throw an
+      // NSException complaining that "TSMProcessRawKeyCode failed". Since we're
+      // trying to gather a crash key here, if that exception happens, just
+      // remark that it happened and continue rather than crashing the browser.
+      std::string characters, unmodified_characters;
+      @try {
+        characters = base::SysNSStringToUTF8([event.characters
+            stringByReplacingOccurrencesOfString:@"\0"
+                                      withString:@"\\x00"]);
+        unmodified_characters =
+            base::SysNSStringToUTF8([event.charactersIgnoringModifiers
+                stringByReplacingOccurrencesOfString:@"\0"
+                                          withString:@"\\x00"]);
+      } @catch (id exception) {
+        characters = "(exception)";
+        unmodified_characters = "(exception)";
+      }
       desc += base::StringPrintf(
           " keyCode=0x%d ARepeat=%d characters='%s' unmodifiedCharacters='%s'",
           event.keyCode, event.ARepeat, characters.c_str(),
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 695804cb..17824f9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5060,8 +5060,7 @@
     mojo::PendingReceiver<network::mojom::RestrictedCookieManager>* receiver) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  DCHECK(isolation_info.frame_origin());
-  if (isolation_info.frame_origin()->scheme() == extensions::kExtensionScheme) {
+  if (origin.scheme() == extensions::kExtensionScheme) {
     DCHECK_EQ(network::mojom::RestrictedCookieManagerRole::SCRIPT, role);
     extensions::ChromeExtensionCookies::Get(browser_context)
         ->CreateRestrictedCookieManager(origin, isolation_info,
@@ -6071,9 +6070,9 @@
 
 bool ChromeContentBrowserClient::ShouldAllowInsecurePrivateNetworkRequests(
     content::BrowserContext* browser_context,
-    const GURL& url) {
+    const url::Origin& origin) {
   return content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      HostContentSettingsMapFactory::GetForProfile(browser_context), url);
+      HostContentSettingsMapFactory::GetForProfile(browser_context), origin);
 }
 
 ukm::UkmService* ChromeContentBrowserClient::GetUkmService() {
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 9a2d37a2..362cbe10 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -719,7 +719,7 @@
       const GURL& url) override;
   bool ShouldAllowInsecurePrivateNetworkRequests(
       content::BrowserContext* browser_context,
-      const GURL& url) override;
+      const url::Origin& origin) override;
   ukm::UkmService* GetUkmService() override;
 
   void OnKeepaliveRequestStarted() override;
diff --git a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
index 040c0fa..ca84ec1 100644
--- a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
@@ -31,6 +31,7 @@
 #include "chromeos/network/onc/onc_utils.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
 #include "components/arc/arc_prefs.h"
+#include "components/arc/enterprise/arc_data_snapshotd_manager.h"
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/onc/onc_constants.h"
 #include "components/policy/core/common/policy_map.h"
@@ -291,6 +292,25 @@
     }
   }
 
+  // Disable all required/force-installed apps when ARC data snapshot update is
+  // in progress.
+  if (arc::data_snapshotd::ArcDataSnapshotdManager::Get() &&
+      arc::data_snapshotd::ArcDataSnapshotdManager::Get()
+          ->IsSnapshotInProgress()) {
+    base::Value* applications_value =
+        filtered_policies.FindListKey("applications");
+    if (applications_value) {
+      base::Value::ListView list_view = applications_value->GetList();
+      for (base::Value& entry : list_view) {
+        auto* installType = entry.FindStringKey("installType");
+        if (installType &&
+            (*installType == "REQUIRED" || *installType == "FORCE_INSTALLED")) {
+          entry.SetBoolKey("disabled", true);
+        }
+      }
+    }
+  }
+
   if (profile->IsSupervised() &&
       chromeos::ProfileHelper::Get()->IsPrimaryProfile(profile) &&
       arc::IsSecondaryAccountForChildEnabled()) {
diff --git a/chrome/browser/chromeos/arc/policy/arc_policy_bridge_unittest.cc b/chrome/browser/chromeos/arc/policy/arc_policy_bridge_unittest.cc
index 8a2da49..61c9d83 100644
--- a/chrome/browser/chromeos/arc/policy/arc_policy_bridge_unittest.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_policy_bridge_unittest.cc
@@ -14,18 +14,27 @@
 #include "base/strings/strcat.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
+#include "chrome/browser/chromeos/arc/enterprise/arc_data_snapshotd_delegate.h"
+#include "chrome/browser/chromeos/arc/enterprise/arc_force_installed_apps_tracker.h"
 #include "chrome/browser/chromeos/arc/enterprise/cert_store/cert_store_service.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/supervised_user/supervised_user_constants.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/upstart/fake_upstart_client.h"
 #include "components/arc/arc_features.h"
 #include "components/arc/arc_prefs.h"
+#include "components/arc/enterprise/arc_data_snapshotd_manager.h"
 #include "components/arc/session/arc_bridge_service.h"
+#include "components/arc/session/arc_session_runner.h"
 #include "components/arc/test/connection_holder_util.h"
+#include "components/arc/test/fake_arc_session.h"
 #include "components/arc/test/fake_policy_instance.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -708,6 +717,69 @@
   GetPoliciesAndVerifyResult(expected_policy_result);
 }
 
+// Test that required and force-installed apps get disabled during ARC data
+// snapshot update.
+TEST_F(ArcPolicyBridgeTest, DisableAppsInSnapshot) {
+  constexpr char kDisabledApplicationsPolicyFormat[] =
+      "\"applications\":["
+      "{"
+      "\"disabled\":%s,"
+      "\"installType\":\"REQUIRED\","
+      "\"packageName\":\"com.android.vending\""
+      "},"
+      "{"
+      "\"disabled\":%s,"
+      "\"installType\":\"FORCE_INSTALLED\","
+      "\"packageName\":\"com.force.installed\""
+      "},"
+      "{"
+      "\"disabled\":%s,"
+      "\"installType\":\"OPTIONAL\","
+      "\"packageName\":\"com.optional\""
+      "}],"
+      "\"defaultPermissionPolicy\":\"GRANT\"";
+
+  constexpr char kFalse[] = "false";
+  constexpr char kTrue[] = "true";
+
+  chromeos::DBusThreadManager::Initialize();
+
+  auto upstart_client = std::make_unique<chromeos::FakeUpstartClient>();
+  arc::prefs::RegisterLocalStatePrefs(
+      profile()->GetTestingPrefService()->registry());
+  auto arc_session_manager =
+      CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
+          base::BindRepeating(FakeArcSession::Create)));
+
+  auto manager = std::make_unique<arc::data_snapshotd::ArcDataSnapshotdManager>(
+      profile()->GetTestingPrefService(),
+      std::make_unique<arc::data_snapshotd::ArcDataSnapshotdDelegate>(),
+      std::make_unique<arc::data_snapshotd::ArcForceInstalledAppsTracker>(),
+      base::DoNothing());
+  EXPECT_TRUE(arc::data_snapshotd::ArcDataSnapshotdManager::Get());
+  manager->set_state_for_testing(
+      arc::data_snapshotd::ArcDataSnapshotdManager::State::kMgsLaunched);
+  EXPECT_TRUE(manager->IsSnapshotInProgress());
+  policy_map().Set(policy::key::kArcPolicy, policy::POLICY_LEVEL_MANDATORY,
+                   policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
+                   base::Value(base::StrCat(
+                       {"{",
+                        base::StringPrintf(kDisabledApplicationsPolicyFormat,
+                                           kFalse, kFalse, kFalse),
+                        "}"})),
+                   nullptr);
+  GetPoliciesAndVerifyResult(
+      base::StrCat({"{\"apkCacheEnabled\":true,",
+                    base::StringPrintf(kDisabledApplicationsPolicyFormat, kTrue,
+                                       kTrue, kFalse),
+                    ",\"guid\":\"", instance_guid(), "\"}"}));
+
+  manager.reset();
+  upstart_client.reset();
+  arc_session_manager.reset();
+  chromeos::DBusThreadManager::Shutdown();
+}
+
 TEST_P(ArcPolicyBridgeAffiliatedTest, ApkCacheEnabledTest) {
   const std::string expected_apk_cache_enabled_result(
       "{\"apkCacheEnabled\":true,\"guid\":\"" + instance_guid() + "\"}");
diff --git a/chrome/browser/chromeos/arc/tracing/arc_tracing_model.cc b/chrome/browser/chromeos/arc/tracing/arc_tracing_model.cc
index 7acbf1e..b49f98aa 100644
--- a/chrome/browser/chromeos/arc/tracing/arc_tracing_model.cc
+++ b/chrome/browser/chromeos/arc/tracing/arc_tracing_model.cc
@@ -500,6 +500,31 @@
 
   GraphicsEventsContext graphics_events_context;
 
+  // Trace events have the following format depending on whether TGID is used.
+  // TGID support can be added to trace_options as an optional param (see
+  // /src/third_party/kernel/<version>/kernel/trace/trace.c for details).
+  // Without TGID:
+  //                               _-----=> irqs-off
+  //                              / _----=> need-resched
+  //                             | / _---=> hardirq/softirq
+  //                             || / _--=> preempt-depth
+  //                             ||| /      delay
+  //            TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
+  //               | |       |   ||||       |         |
+  //           <...>-32043 [000] ...1 14196.099290: tracing_mark_write
+  //
+  // With TGID (max digits allowed may vary depending on kernel version):
+  //                                       _-----=> irqs-off
+  //                                      / _----=> need-resched
+  //                                     | / _---=> hardirq/softirq
+  //                                     || / _--=> preempt-depth
+  //                                     ||| /      delay
+  //            TASK-PID    TGID   CPU#  ||||    TIMESTAMP  FUNCTION
+  //               | |        |      |   ||||       |         |
+  //           <...>-32043 (-----) [000] ...1 14196.099290: tracing_mark_write
+  constexpr int kPidPosition = 16;
+  size_t cpu_pos = 0;
+  bool cpu_pos_found = false;
   while (true) {
     // Get end of line.
     size_t end_line_pos = sys_traces.find('\n', new_line_pos);
@@ -510,23 +535,31 @@
         sys_traces.substr(new_line_pos, end_line_pos - new_line_pos);
     new_line_pos = end_line_pos + 1;
 
-    // Skip comments and empty lines
+    // Skip comments and empty lines.
     if (line.empty() || line[0] == '#')
       continue;
 
-    // Trace event has following format.
-    //            TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-    //               | |       |   ||||       |         |
-    // Until TIMESTAMP we have fixed position for elements.
-    if (line.length() < 35 || line[16] != '-' || line[22] != ' ' ||
-        line[23] != '[' || line[27] != ']' || line[28] != ' ' ||
-        line[33] != ' ') {
+    // Spacing between TASK-PID and CPU# can vary between kernel versions
+    // and depending on whether TGID option is enabled in trace_options.
+    if (!cpu_pos_found) {
+      cpu_pos = line.find('[', kPidPosition + 1);
+      if (cpu_pos == std::string::npos) {
+        LOG(ERROR) << "Cannot find CPU id in trace event: " << line;
+        return false;
+      }
+      cpu_pos_found = true;
+    }
+
+    // From CPU# to the TIMESTAMP marker, we have fixed positions for elements.
+    if (line.length() < (cpu_pos + 12) || line[kPidPosition] != '-' ||
+        line[cpu_pos - 1] != ' ' || line[cpu_pos + 4] != ']' ||
+        line[cpu_pos + 5] != ' ' || line[cpu_pos + 10] != ' ') {
       LOG(ERROR) << "Cannot recognize trace event: " << line;
       return false;
     }
 
     uint32_t tid;
-    if (ParseUint32(line, 17, ' ', &tid) == std::string::npos) {
+    if (ParseUint32(line, kPidPosition + 1, ' ', &tid) == std::string::npos) {
       LOG(ERROR) << "Cannot parse tid in trace event: " << line;
       return false;
     }
@@ -538,18 +571,19 @@
         ++thread_name_start;
       system_model_.thread_map()[tid] = ArcSystemModel::ThreadInfo(
           ArcSystemModel::kUnknownPid,
-          line.substr(thread_name_start, 16 - thread_name_start));
+          line.substr(thread_name_start, kPidPosition - thread_name_start));
     }
 
     uint32_t cpu_id;
-    if (ParseUint32(line, 24, ']', &cpu_id) == std::string::npos) {
+    if (ParseUint32(line, cpu_pos + 1, ']', &cpu_id) == std::string::npos) {
       LOG(ERROR) << "Cannot parse CPU id in trace event: " << line;
       return false;
     }
 
     uint32_t timestamp_high;
     uint32_t timestamp_low;
-    const size_t pos_dot = ParseUint32(line, 34, '.', &timestamp_high);
+    const size_t pos_dot =
+        ParseUint32(line, cpu_pos + 11, '.', &timestamp_high);
     if (pos_dot == std::string::npos) {
       LOG(ERROR) << "Cannot parse timestamp in trace event: " << line;
       return false;
diff --git a/chrome/browser/chromeos/child_accounts/family_features.cc b/chrome/browser/chromeos/child_accounts/family_features.cc
index ff19cf5e..3466d3f 100644
--- a/chrome/browser/chromeos/child_accounts/family_features.cc
+++ b/chrome/browser/chromeos/child_accounts/family_features.cc
@@ -12,4 +12,11 @@
 const base::Feature kFamilyLinkUserMetricsProvider{
     "FamilyLinkUserMetricsProvider", base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kFamilyLinkOobeHandoff{"FamilyLinkOobeHandoff",
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsFamilyLinkOobeHandoffEnabled() {
+  return base::FeatureList::IsEnabled(kFamilyLinkOobeHandoff);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/family_features.h b/chrome/browser/chromeos/child_accounts/family_features.h
index 74262f9..751818e 100644
--- a/chrome/browser/chromeos/child_accounts/family_features.h
+++ b/chrome/browser/chromeos/child_accounts/family_features.h
@@ -17,6 +17,11 @@
 // Filters family link user metrics into one of three types.
 extern const base::Feature kFamilyLinkUserMetricsProvider;
 
+// Enables showing handoff screen to Family Link user during OOBE.
+extern const base::Feature kFamilyLinkOobeHandoff;
+
+bool IsFamilyLinkOobeHandoffEnabled();
+
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_FAMILY_FEATURES_H_
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index ecc72cf..b3405bdb 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -58,7 +58,6 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/banners/app_banner_manager_desktop.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
@@ -130,6 +129,7 @@
 #include "components/policy/core/common/policy_service.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "components/user_manager/user_manager.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/tracing_controller.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 52545be4..96d3066 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -409,7 +409,7 @@
           file_system_url.mount_type() != storage::kFileSystemTypeExternal) {
         continue;
       }
-      backend->GrantFileAccessToExtension(extension_->id(),
+      backend->GrantFileAccessToExtension(extension_id(),
                                           file_system_url.virtual_path());
       content::ChildProcessSecurityPolicy::GetInstance()
           ->GrantCreateReadWriteFile(render_frame_host()->GetProcess()->GetID(),
@@ -1063,8 +1063,8 @@
     FileDefinition file_definition;
     const bool result =
         file_manager::util::ConvertAbsoluteFilePathToRelativeFileSystemPath(
-            chrome_details.GetProfile(), extension_->id(),
-            file_system_url.path(), &file_definition.virtual_path);
+            chrome_details.GetProfile(), extension_id(), file_system_url.path(),
+            &file_definition.virtual_path);
     if (!result)
       continue;
     // The API only supports isolated files. It still works for directories,
@@ -1074,7 +1074,7 @@
   }
 
   file_manager::util::ConvertFileDefinitionListToEntryDefinitionList(
-      chrome_details.GetProfile(), extension_->id(),
+      chrome_details.GetProfile(), extension_id(),
       file_definition_list,  // Safe, since copied internally.
       base::BindOnce(
           &FileManagerPrivateInternalResolveIsolatedEntriesFunction::
diff --git a/chrome/browser/chromeos/full_restore/app_launch_handler.cc b/chrome/browser/chromeos/full_restore/app_launch_handler.cc
index 9867a1a..5530db2 100644
--- a/chrome/browser/chromeos/full_restore/app_launch_handler.cc
+++ b/chrome/browser/chromeos/full_restore/app_launch_handler.cc
@@ -176,10 +176,8 @@
       // TODO(crbug.com/1146900): Handle ARC apps
       break;
     case apps::mojom::AppType::kExtension:
-      // TODO(crbug.com/1146900): Handle Chrome apps
-      break;
     case apps::mojom::AppType::kWeb:
-      LaunchSystemWebApp(app_id, it->second);
+      LaunchSystemWebAppOrChromeApp(app_id, it->second);
       break;
     case apps::mojom::AppType::kBuiltIn:
     case apps::mojom::AppType::kCrostini:
@@ -195,7 +193,7 @@
   restore_data_->RemoveApp(app_id);
 }
 
-void AppLaunchHandler::LaunchSystemWebApp(
+void AppLaunchHandler::LaunchSystemWebAppOrChromeApp(
     const std::string& app_id,
     const ::full_restore::RestoreData::LaunchList& launch_list) {
   auto* launcher = apps::AppServiceProxyFactory::GetForProfile(profile_)
diff --git a/chrome/browser/chromeos/full_restore/app_launch_handler.h b/chrome/browser/chromeos/full_restore/app_launch_handler.h
index 2a6be1f..d0fb8b7 100644
--- a/chrome/browser/chromeos/full_restore/app_launch_handler.h
+++ b/chrome/browser/chromeos/full_restore/app_launch_handler.h
@@ -65,7 +65,7 @@
 
   void LaunchApp(apps::mojom::AppType app_type, const std::string& app_id);
 
-  void LaunchSystemWebApp(
+  void LaunchSystemWebAppOrChromeApp(
       const std::string& app_id,
       const ::full_restore::RestoreData::LaunchList& launch_list);
 
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index 5ef4afe..629524a 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -145,6 +145,7 @@
 
 void WaitForGaiaSignInScreen(bool arc_available) {
   OobeScreenWaiter(GaiaView::kScreenId).Wait();
+  test::OobeJS().CreateFocusWaiter({"gaia-signin", "signin-frame"})->Wait();
 
   // Arc terms of service content gets preloaded when GAIA screen is shown,
   // wait for the preload to finish before proceeding - requesting reload
diff --git a/chrome/browser/chromeos/login/screens/parental_handoff_screen.cc b/chrome/browser/chromeos/login/screens/parental_handoff_screen.cc
index 0489c98..bbc9b422 100644
--- a/chrome/browser/chromeos/login/screens/parental_handoff_screen.cc
+++ b/chrome/browser/chromeos/login/screens/parental_handoff_screen.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/strings/string16.h"
+#include "chrome/browser/chromeos/child_accounts/family_features.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -68,13 +69,23 @@
 }
 
 bool ParentalHandoffScreen::MaybeSkip(WizardContext* context) {
-  Profile* profile = ProfileManager::GetActiveUserProfile();
-  if (profile->IsChild() && supervised_users::IsEduCoexistenceFlowV2Enabled()) {
-    return false;
+  if (!IsFamilyLinkOobeHandoffEnabled()) {
+    exit_callback_.Run(Result::SKIPPED);
+    return true;
   }
 
-  exit_callback_.Run(Result::SKIPPED);
-  return true;
+  if (!supervised_users::IsEduCoexistenceFlowV2Enabled()) {
+    exit_callback_.Run(Result::SKIPPED);
+    return true;
+  }
+
+  const Profile* profile = ProfileManager::GetActiveUserProfile();
+  if (!profile->IsChild()) {
+    exit_callback_.Run(Result::SKIPPED);
+    return true;
+  }
+
+  return false;
 }
 
 void ParentalHandoffScreen::ShowImpl() {
diff --git a/chrome/browser/chromeos/login/screens/parental_handoff_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/parental_handoff_screen_browsertest.cc
index 2a21f1ce..37299765 100644
--- a/chrome/browser/chromeos/login/screens/parental_handoff_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/parental_handoff_screen_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chromeos/child_accounts/family_features.h"
 #include "chrome/browser/chromeos/login/screens/assistant_optin_flow_screen.h"
 #include "chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h"
 #include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
@@ -103,7 +104,9 @@
 };
 
 ParentalHandoffScreenBrowserTest::ParentalHandoffScreenBrowserTest() {
-  feature_list_.InitAndEnableFeature(supervised_users::kEduCoexistenceFlowV2);
+  feature_list_.InitWithFeatures(
+      {supervised_users::kEduCoexistenceFlowV2, kFamilyLinkOobeHandoff},
+      {} /*disable_features*/);
 }
 
 void ParentalHandoffScreenBrowserTest::SetUpOnMainThread() {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc
new file mode 100644
index 0000000..99fd4d75
--- /dev/null
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc
@@ -0,0 +1,87 @@
+// 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/chromeos/policy/dlp/dlp_content_tab_helper.h"
+
+#include "base/path_service.h"
+#include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
+#include "chrome/browser/chromeos/policy/dlp/mock_dlp_content_manager.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
+#include "extensions/test/extension_test_message_listener.h"
+
+namespace policy {
+
+using testing::_;
+using testing::Return;
+
+namespace {
+
+const DlpContentRestrictionSet kEmptyRestrictionSet;
+const DlpContentRestrictionSet kScreenshotRestrictionSet(
+    DlpContentRestriction::kScreenshot);
+
+}  // namespace
+
+class DlpContentTabHelperBrowserTest
+    : public extensions::PlatformAppBrowserTest {
+ protected:
+  void SetUp() override {
+    DlpContentManager::SetDlpContentManagerForTesting(
+        &mock_dlp_content_manager_);
+    extensions::PlatformAppBrowserTest::SetUp();
+  }
+
+  void TearDown() override {
+    DlpContentManager::ResetDlpContentManagerForTesting();
+    extensions::PlatformAppBrowserTest::TearDown();
+  }
+
+  MockDlpContentManager mock_dlp_content_manager_;
+};
+
+IN_PROC_BROWSER_TEST_F(DlpContentTabHelperBrowserTest, PlatformApp) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  ExtensionTestMessageListener launched_listener("Launched", false);
+
+  // Install Platform App
+  content::WindowedNotificationObserver app_loaded_observer(
+      content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
+      content::NotificationService::AllSources());
+  const extensions::Extension* extension = InstallPlatformApp("dlp_test");
+  ASSERT_TRUE(extension);
+
+  // Restrict screenshot for Platform App
+  GURL kUrl = GURL("chrome-extension://" + extension->id() + "/index.html");
+  EXPECT_CALL(mock_dlp_content_manager_, GetRestrictionSetForURL(GURL()))
+      .Times(1)
+      .WillOnce(Return(kEmptyRestrictionSet));
+  EXPECT_CALL(mock_dlp_content_manager_, GetRestrictionSetForURL(kUrl))
+      .Times(1)
+      .WillOnce(Return(kScreenshotRestrictionSet));
+  EXPECT_CALL(mock_dlp_content_manager_,
+              OnConfidentialityChanged(_, kScreenshotRestrictionSet))
+      .Times(1);
+  EXPECT_CALL(mock_dlp_content_manager_, OnVisibilityChanged(_)).Times(1);
+
+  // Launch Platform App
+  LaunchPlatformApp(extension);
+  app_loaded_observer.Wait();
+  ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
+
+  content::WebContents* web_contents = GetFirstAppWindowWebContents();
+  EXPECT_TRUE(web_contents);
+  EXPECT_NE(nullptr,
+            policy::DlpContentTabHelper::FromWebContents(web_contents));
+  EXPECT_CALL(mock_dlp_content_manager_,
+              OnConfidentialityChanged(_, kEmptyRestrictionSet))
+      .Times(1);
+  EXPECT_CALL(mock_dlp_content_manager_, OnWebContentsDestroyed(_)).Times(2);
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_impl.cc b/chrome/browser/chromeos/remote_apps/remote_apps_impl.cc
index cb7fa26..4c6b8992 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_impl.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_impl.cc
@@ -75,17 +75,19 @@
 }
 
 void RemoteAppsImpl::AddFolder(const std::string& name,
+                               bool add_to_front,
                                AddFolderCallback callback) {
-  const std::string& folder_id = manager_->AddFolder(name);
+  const std::string& folder_id = manager_->AddFolder(name, add_to_front);
   std::move(callback).Run(folder_id, base::nullopt);
 }
 
 void RemoteAppsImpl::AddApp(const std::string& name,
                             const std::string& folder_id,
                             const GURL& icon_url,
+                            bool add_to_front,
                             AddAppCallback callback) {
   manager_->AddApp(
-      name, folder_id, icon_url,
+      name, folder_id, icon_url, add_to_front,
       base::BindOnce(&RemoteAppsImpl::OnAppAdded, weak_factory_.GetWeakPtr(),
                      std::move(callback)));
 }
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_impl.h b/chrome/browser/chromeos/remote_apps/remote_apps_impl.h
index 3102800..8fb85e8 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_impl.h
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_impl.h
@@ -50,10 +50,13 @@
           pending_observer);
 
   // remote_apps::mojom::RemoteApps:
-  void AddFolder(const std::string& name, AddFolderCallback callback) override;
+  void AddFolder(const std::string& name,
+                 bool add_to_front,
+                 AddFolderCallback callback) override;
   void AddApp(const std::string& name,
               const std::string& folder_id,
               const GURL& icon_url,
+              bool add_to_front,
               AddAppCallback callback) override;
 
   void OnAppLaunched(const std::string& id);
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_impl_browsertest.cc b/chrome/browser/chromeos/remote_apps/remote_apps_impl_browsertest.cc
index 58a7e522..020a91fb 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_impl_browsertest.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_impl_browsertest.cc
@@ -9,6 +9,7 @@
 
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/app_list/model/app_list_item.h"
+#include "ash/app_list/model/app_list_item_list.h"
 #include "ash/app_list/model/app_list_model.h"
 #include "ash/shell.h"
 #include "base/files/file_path.h"
@@ -137,6 +138,19 @@
     return model->FindItem(id);
   }
 
+  bool IsAppListItemInFront(const std::string& id) {
+    ash::AppListControllerImpl* controller =
+        ash::Shell::Get()->app_list_controller();
+    ash::AppListModel* model = controller->GetModel();
+    ash::AppListItemList* item_list = model->top_level_item_list();
+
+    size_t index;
+    if (!item_list->FindItemIndex(id, &index))
+      return false;
+
+    return index == 0;
+  }
+
  private:
   base::DictionaryValue config_;
   chromeos::LocalPolicyTestServerMixin local_policy_mixin_{&mixin_host_};
@@ -152,6 +166,15 @@
   EXPECT_EQ("App 1", app->name());
 }
 
+IN_PROC_BROWSER_TEST_F(RemoteAppsImplBrowsertest, AddAppToFront) {
+  extensions::ResultCatcher catcher;
+  LoadExtensionAndRunTest("AddAppToFront");
+  ASSERT_TRUE(catcher.GetNextResult());
+
+  // Check that App 2 is in front.
+  EXPECT_TRUE(IsAppListItemInFront(kId2));
+}
+
 IN_PROC_BROWSER_TEST_F(RemoteAppsImplBrowsertest, AddFolderAndApps) {
   extensions::ResultCatcher catcher;
   LoadExtensionAndRunTest("AddFolderAndApps");
@@ -171,6 +194,15 @@
   EXPECT_EQ(kId1, app2->folder_id());
 }
 
+IN_PROC_BROWSER_TEST_F(RemoteAppsImplBrowsertest, AddFolderToFront) {
+  extensions::ResultCatcher catcher;
+  LoadExtensionAndRunTest("AddFolderToFront");
+  ASSERT_TRUE(catcher.GetNextResult());
+
+  // Check that folder is in front.
+  EXPECT_TRUE(IsAppListItemInFront(kId2));
+}
+
 IN_PROC_BROWSER_TEST_F(RemoteAppsImplBrowsertest, OnRemoteAppLaunched) {
   extensions::ResultCatcher catcher;
   ExtensionTestMessageListener listener("Remote app added",
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_manager.cc b/chrome/browser/chromeos/remote_apps/remote_apps_manager.cc
index d379d397..9743a789 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_manager.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_manager.cc
@@ -150,6 +150,7 @@
 void RemoteAppsManager::AddApp(const std::string& name,
                                const std::string& folder_id,
                                const GURL& icon_url,
+                               bool add_to_front,
                                AddAppCallback callback) {
   if (!is_initialized_) {
     std::move(callback).Run(std::string(), RemoteAppsError::kNotReady);
@@ -162,8 +163,12 @@
     return;
   }
 
+  // Disable |add_to_front| if app has a parent folder.
+  if (!folder_id.empty())
+    add_to_front = false;
+
   const RemoteAppsModel::AppInfo& info =
-      model_->AddApp(name, icon_url, folder_id);
+      model_->AddApp(name, icon_url, folder_id, add_to_front);
   add_app_callback_map_.insert({info.id, std::move(callback)});
   remote_apps_->AddApp(info);
 }
@@ -179,9 +184,10 @@
   return RemoteAppsError::kNone;
 }
 
-std::string RemoteAppsManager::AddFolder(const std::string& folder_name) {
+std::string RemoteAppsManager::AddFolder(const std::string& folder_name,
+                                         bool add_to_front) {
   const RemoteAppsModel::FolderInfo& folder_info =
-      model_->AddFolder(folder_name);
+      model_->AddFolder(folder_name, add_to_front);
   return folder_info.id;
 }
 
@@ -197,6 +203,16 @@
   return RemoteAppsError::kNone;
 }
 
+bool RemoteAppsManager::ShouldAddToFront(const std::string& id) const {
+  if (model_->HasApp(id))
+    return model_->GetAppInfo(id).add_to_front;
+
+  if (model_->HasFolder(id))
+    return model_->GetFolderInfo(id).add_to_front;
+
+  return false;
+}
+
 void RemoteAppsManager::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
 }
@@ -311,7 +327,12 @@
       DCHECK(item) << "Missing folder item for folder_id: " << folder_id;
       item->SetName(folder_info.name);
       item->SetIsPersistent(true);
-      item->SetPosition(model_updater_->GetFirstAvailablePosition());
+
+      if (folder_info.add_to_front) {
+        item->SetPosition(model_updater_->GetPositionBeforeFirstItem());
+      } else {
+        item->SetPosition(model_updater_->GetFirstAvailablePosition());
+      }
     }
   }
 
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_manager.h b/chrome/browser/chromeos/remote_apps/remote_apps_manager.h
index 81f2a817..d726226 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_manager.h
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_manager.h
@@ -85,7 +85,8 @@
   // added to the folder with the given ID. The icon of the app is an image
   // retrieved from |icon_url| and is retrieved asynchronously. If the icon has
   // not been downloaded, or there is an error in downloading the icon, a
-  // placeholder icon will be used.
+  // placeholder icon will be used. If |add_to_front| is true and the app has
+  // no parent folder, the app will be added to the front of the app item list.
   // The callback will be run with the ID of the added app, or an error if
   // there is one.
   // Adding to a non-existent folder will result in an error.
@@ -93,21 +94,27 @@
   void AddApp(const std::string& name,
               const std::string& folder_id,
               const GURL& icon_url,
+              bool add_to_front,
               AddAppCallback callback);
 
   // Deletes the app with id |id|.
   // Deleting a non-existent app will result in an error.
   RemoteAppsError DeleteApp(const std::string& id);
 
-  // Adds a folder with |folder_name|. Note that empty folders are not
-  // shown in the launcher. Returns the ID for the added folder.
-  std::string AddFolder(const std::string& folder_name);
+  // Adds a folder with |folder_name|. Note that empty folders are not shown in
+  // the launcher. Returns the ID for the added folder. If |add_to_front| is
+  // true, the folder will be added to the front of the app item list.
+  std::string AddFolder(const std::string& folder_name, bool add_to_front);
 
   // Deletes the folder with id |folder_id|. All items in the folder are moved
   // to the top-level in the launcher.
   // Deleting a non-existent folder will result in an error.
   RemoteAppsError DeleteFolder(const std::string& folder_id);
 
+  // Returns true if the app or folder with |id| should be added to the front
+  // of the app item list.
+  bool ShouldAddToFront(const std::string& id) const;
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/chromeos/remote_apps/remote_apps_manager_browsertest.cc
index f5164776..84268c2 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_manager_browsertest.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_manager_browsertest.cc
@@ -210,10 +210,11 @@
 
   std::string AddApp(const std::string& name,
                      const std::string& folder_id,
-                     const GURL& icon_url) {
+                     const GURL& icon_url,
+                     bool add_to_front) {
     base::RunLoop run_loop;
     std::string id;
-    manager_->AddApp(name, folder_id, icon_url,
+    manager_->AddApp(name, folder_id, icon_url, add_to_front,
                      base::BindOnce(
                          [](base::RepeatingClosure closure, std::string* id_arg,
                             const std::string& id, RemoteAppsError error) {
@@ -250,20 +251,22 @@
                                   const std::string& name,
                                   const std::string& folder_id,
                                   const GURL& icon_url,
-                                  const gfx::ImageSkia& icon) {
+                                  const gfx::ImageSkia& icon,
+                                  bool add_to_front) {
     ExpectImageDownloaderDownload(icon_url, icon);
     AppUpdateWaiter waiter(profile_, id, AppUpdateWaiter::IconChanged());
-    AddApp(name, folder_id, icon_url);
+    AddApp(name, folder_id, icon_url, add_to_front);
     waiter.Wait();
   }
 
   void AddAppAssertError(RemoteAppsError error,
                          const std::string& name,
                          const std::string& folder_id,
-                         const GURL& icon_url) {
+                         const GURL& icon_url,
+                         bool add_to_front) {
     base::RunLoop run_loop;
     manager_->AddApp(
-        name, folder_id, icon_url,
+        name, folder_id, icon_url, add_to_front,
         base::BindOnce(
             [](base::RepeatingClosure closure, RemoteAppsError expected_error,
                const std::string& id, RemoteAppsError error) {
@@ -287,7 +290,8 @@
   gfx::ImageSkia icon = CreateTestIcon(32, SK_ColorRED);
 
   // App has id kId1.
-  AddAppAndWaitForIconChange(kId1, name, std::string(), icon_url, icon);
+  AddAppAndWaitForIconChange(kId1, name, std::string(), icon_url, icon,
+                             /*add_to_front=*/false);
 
   ash::AppListItem* item = GetAppListItem(kId1);
   EXPECT_FALSE(item->is_folder());
@@ -307,7 +311,7 @@
   gfx::ImageSkia icon = CreateTestIcon(32, SK_ColorRED);
 
   AddAppAssertError(RemoteAppsError::kFolderIdDoesNotExist, name, kMissingId,
-                    icon_url);
+                    icon_url, /*add_to_front=*/false);
 }
 
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddAppErrorNotReady) {
@@ -316,13 +320,15 @@
   gfx::ImageSkia icon = CreateTestIcon(32, SK_ColorRED);
 
   manager_->SetIsInitializedForTesting(false);
-  AddAppAssertError(RemoteAppsError::kNotReady, name, std::string(), icon_url);
+  AddAppAssertError(RemoteAppsError::kNotReady, name, std::string(), icon_url,
+                    /*add_to_front=*/false);
 }
 
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, DeleteApp) {
   // App has id kId1.
   AddAppAndWaitForIconChange(kId1, "name", std::string(), GURL("icon_url"),
-                             CreateTestIcon(32, SK_ColorRED));
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/false);
 
   RemoteAppsError error = DeleteApp(kId1);
   base::RunLoop().RunUntilIdle();
@@ -335,7 +341,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddAndDeleteFolder) {
-  manager_->AddFolder("folder_name");
+  manager_->AddFolder("folder_name", /*add_to_front=*/false);
   // Empty folder has no AppListItem.
   EXPECT_FALSE(GetAppListItem(kId1));
 
@@ -349,13 +355,14 @@
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddFolderAndApp) {
   std::string folder_name = "folder_name";
   // Folder has id kId1.
-  manager_->AddFolder(folder_name);
+  manager_->AddFolder(folder_name, /*add_to_front=*/false);
   // Empty folder has no item.
   EXPECT_FALSE(GetAppListItem(kId1));
 
   // App has id kId2.
   AddAppAndWaitForIconChange(kId2, "name", kId1, GURL("icon_url"),
-                             CreateTestIcon(32, SK_ColorRED));
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/false);
 
   // Folder item was created.
   ash::AppListItem* folder_item = GetAppListItem(kId1);
@@ -371,14 +378,16 @@
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest,
                        AddFolderWithMultipleApps) {
   // Folder has id kId1.
-  manager_->AddFolder("folder_name");
+  manager_->AddFolder("folder_name", /*add_to_front=*/false);
 
   // App has id kId2.
   AddAppAndWaitForIconChange(kId2, "name", kId1, GURL("icon_url"),
-                             CreateTestIcon(32, SK_ColorRED));
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/false);
   // App has id kId3.
   AddAppAndWaitForIconChange(kId3, "name2", kId1, GURL("icon_url2"),
-                             CreateTestIcon(32, SK_ColorBLUE));
+                             CreateTestIcon(32, SK_ColorBLUE),
+                             /*add_to_front=*/false);
 
   ash::AppListItem* folder_item = GetAppListItem(kId1);
   EXPECT_EQ(2u, folder_item->ChildItemCount());
@@ -396,7 +405,8 @@
 
   // App has id kId4.
   AddAppAndWaitForIconChange(kId4, "name3", kId1, GURL("icon_url3"),
-                             CreateTestIcon(32, SK_ColorGREEN));
+                             CreateTestIcon(32, SK_ColorGREEN),
+                             /*add_to_front=*/false);
 
   // Folder is re-created.
   folder_item = GetAppListItem(kId1);
@@ -407,14 +417,16 @@
 IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest,
                        DeleteFolderWithMultipleApps) {
   // Folder has id kId1.
-  manager_->AddFolder("folder_name");
+  manager_->AddFolder("folder_name", /*add_to_front=*/false);
 
   // App has id kId2.
   AddAppAndWaitForIconChange(kId2, "name", kId1, GURL("icon_url"),
-                             CreateTestIcon(32, SK_ColorRED));
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/false);
   // App has id kId3.
   AddAppAndWaitForIconChange(kId3, "name2", kId1, GURL("icon_url2"),
-                             CreateTestIcon(32, SK_ColorBLUE));
+                             CreateTestIcon(32, SK_ColorBLUE),
+                             /*add_to_front=*/false);
 
   DeleteFolder(kId1);
   // Folder is removed.
@@ -427,4 +439,29 @@
   EXPECT_EQ(std::string(), item2->folder_id());
 }
 
+IN_PROC_BROWSER_TEST_F(RemoteAppsManagerBrowsertest, AddToFront) {
+  // Folder has id kId1.
+  manager_->AddFolder("folder_name", /*add_to_front=*/false);
+
+  // App has id kId2.
+  AddAppAndWaitForIconChange(kId2, "name", std::string(), GURL("icon_url"),
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/false);
+
+  EXPECT_FALSE(manager_->ShouldAddToFront(kId1));
+  EXPECT_FALSE(manager_->ShouldAddToFront(kId2));
+
+  // Folder has id kId3.
+  manager_->AddFolder("folder_name2", /*add_to_front=*/true);
+
+  // App has id kId4.
+  AddAppAndWaitForIconChange(kId4, "name2", kId3, GURL("icon_url"),
+                             CreateTestIcon(32, SK_ColorRED),
+                             /*add_to_front=*/true);
+
+  EXPECT_TRUE(manager_->ShouldAddToFront(kId3));
+  // |add_to_front| disabled since app has a parent folder.
+  EXPECT_FALSE(manager_->ShouldAddToFront(kId4));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_model.cc b/chrome/browser/chromeos/remote_apps/remote_apps_model.cc
index 9816c72..f6e710c 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_model.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_model.cc
@@ -9,20 +9,23 @@
 RemoteAppsModel::AppInfo::AppInfo(const std::string& id,
                                   const std::string& name,
                                   const GURL& icon_url,
-                                  std::string folder_id)
+                                  std::string folder_id,
+                                  bool add_to_front)
     : id(id),
       name(name),
       icon_url(icon_url),
       folder_id(folder_id),
-      icon(gfx::ImageSkia()) {}
+      icon(gfx::ImageSkia()),
+      add_to_front(add_to_front) {}
 
 RemoteAppsModel::AppInfo::AppInfo(const AppInfo& other) = default;
 
 RemoteAppsModel::AppInfo::~AppInfo() = default;
 
 RemoteAppsModel::FolderInfo::FolderInfo(const std::string& id,
-                                        const std::string& name)
-    : id(id), name(name) {}
+                                        const std::string& name,
+                                        bool add_to_front)
+    : id(id), name(name), add_to_front(add_to_front) {}
 
 RemoteAppsModel::FolderInfo::FolderInfo(const FolderInfo& other) = default;
 
@@ -33,12 +36,12 @@
 
 RemoteAppsModel::~RemoteAppsModel() = default;
 
-RemoteAppsModel::AppInfo& RemoteAppsModel::AddApp(
-    const std::string& name,
-    const GURL& icon_url,
-    const std::string& folder_id) {
+RemoteAppsModel::AppInfo& RemoteAppsModel::AddApp(const std::string& name,
+                                                  const GURL& icon_url,
+                                                  const std::string& folder_id,
+                                                  bool add_to_front) {
   std::string id = id_generator_->GenerateId();
-  app_map_.insert({id, AppInfo(id, name, icon_url, folder_id)});
+  app_map_.insert({id, AppInfo(id, name, icon_url, folder_id, add_to_front)});
 
   if (!folder_id.empty()) {
     DCHECK(folder_map_.find(folder_id) != folder_map_.end());
@@ -64,10 +67,12 @@
 }
 
 RemoteAppsModel::FolderInfo& RemoteAppsModel::AddFolder(
-    const std::string& folder_name) {
+    const std::string& folder_name,
+    bool add_to_front) {
   std::string folder_id = id_generator_->GenerateId();
-  auto it = folder_map_.insert(folder_map_.begin(),
-                               {folder_id, FolderInfo(folder_id, folder_name)});
+  auto it = folder_map_.insert(
+      folder_map_.begin(),
+      {folder_id, FolderInfo(folder_id, folder_name, add_to_front)});
   return it->second;
 }
 
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_model.h b/chrome/browser/chromeos/remote_apps/remote_apps_model.h
index bd044b8..02eeb22 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_model.h
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_model.h
@@ -27,7 +27,8 @@
     AppInfo(const std::string& id,
             const std::string& name,
             const GURL& icon_url,
-            std::string folder_id);
+            std::string folder_id,
+            bool add_to_front);
     AppInfo(const AppInfo& other);
     ~AppInfo();
 
@@ -36,15 +37,19 @@
     const GURL icon_url;
     std::string folder_id;
     gfx::ImageSkia icon;
+    const bool add_to_front;
   };
 
   struct FolderInfo {
-    FolderInfo(const std::string& id, const std::string& name);
+    FolderInfo(const std::string& id,
+               const std::string& name,
+               bool add_to_front);
     FolderInfo(const FolderInfo& other);
     ~FolderInfo();
 
     const std::string id;
     const std::string name;
+    const bool add_to_front;
     std::set<std::string> items;
   };
 
@@ -58,7 +63,8 @@
   // corresponding folder.
   RemoteAppsModel::AppInfo& AddApp(const std::string& name,
                                    const GURL& icon_url,
-                                   const std::string& folder_id);
+                                   const std::string& folder_id,
+                                   bool add_to_front);
 
   // Returns true if an app with ID |id| exists in the model.
   bool HasApp(const std::string& id) const;
@@ -71,7 +77,8 @@
   const std::map<std::string, AppInfo>& GetAllAppInfo() const;
 
   // Adds a folder.
-  RemoteAppsModel::FolderInfo& AddFolder(const std::string& folder_name);
+  RemoteAppsModel::FolderInfo& AddFolder(const std::string& folder_name,
+                                         bool add_to_front);
 
   // Returns true if a folder with ID |folder_id| exists.
   bool HasFolder(const std::string& folder_id) const;
diff --git a/chrome/browser/chromeos/remote_apps/remote_apps_model_unittest.cc b/chrome/browser/chromeos/remote_apps/remote_apps_model_unittest.cc
index 29abe42f..af3bdcc 100644
--- a/chrome/browser/chromeos/remote_apps/remote_apps_model_unittest.cc
+++ b/chrome/browser/chromeos/remote_apps/remote_apps_model_unittest.cc
@@ -33,11 +33,12 @@
 
   std::unique_ptr<RemoteAppsModel> model = SetUpModel();
   const RemoteAppsModel::AppInfo& info =
-      model->AddApp(name, icon_url, std::string());
+      model->AddApp(name, icon_url, std::string(), /*add_to_front=*/true);
   EXPECT_EQ(kId1, info.id);
   EXPECT_EQ(name, info.name);
   EXPECT_EQ(icon_url, info.icon_url);
   EXPECT_EQ(std::string(), info.folder_id);
+  EXPECT_TRUE(info.add_to_front);
   EXPECT_TRUE(model->HasApp(info.id));
 
   // Check |GetAppInfo()|.
@@ -46,6 +47,7 @@
   EXPECT_EQ(name, info2.name);
   EXPECT_EQ(icon_url, info2.icon_url);
   EXPECT_EQ(std::string(), info2.folder_id);
+  EXPECT_TRUE(info.add_to_front);
 
   model->DeleteApp(info.id);
   EXPECT_FALSE(model->HasApp(info.id));
@@ -58,8 +60,8 @@
   const GURL icon_url2 = GURL("icon_url2");
 
   std::unique_ptr<RemoteAppsModel> model = SetUpModel();
-  model->AddApp(name, icon_url, std::string());
-  model->AddApp(name2, icon_url2, std::string());
+  model->AddApp(name, icon_url, std::string(), /*add_to_front=*/false);
+  model->AddApp(name2, icon_url2, std::string(), /*add_to_front=*/true);
 
   const std::map<std::string, RemoteAppsModel::AppInfo>& infos =
       model->GetAllAppInfo();
@@ -69,11 +71,13 @@
   EXPECT_EQ(kId1, info.id);
   EXPECT_EQ(name, info.name);
   EXPECT_EQ(icon_url, info.icon_url);
+  EXPECT_FALSE(info.add_to_front);
 
   const RemoteAppsModel::AppInfo& info2 = infos.at(kId2);
   EXPECT_EQ(kId2, info2.id);
   EXPECT_EQ(name2, info2.name);
   EXPECT_EQ(icon_url2, info2.icon_url);
+  EXPECT_TRUE(info2.add_to_front);
 }
 
 TEST_F(RemoteAppsModelUnittest, AddFolder) {
@@ -83,11 +87,12 @@
 
   std::unique_ptr<RemoteAppsModel> model = SetUpModel();
   const RemoteAppsModel::FolderInfo& folder_info =
-      model->AddFolder(folder_name);
+      model->AddFolder(folder_name, /*add_to_front=*/true);
   const std::string folder_id = folder_info.id;
   EXPECT_EQ(kId1, folder_id);
   EXPECT_EQ(folder_name, folder_info.name);
   EXPECT_EQ(0u, folder_info.items.size());
+  EXPECT_TRUE(folder_info.add_to_front);
 
   // Check |GetFolderInfo()|.
   const RemoteAppsModel::FolderInfo& folder_info2 =
@@ -95,6 +100,7 @@
   EXPECT_EQ(kId1, folder_id);
   EXPECT_EQ(folder_name, folder_info2.name);
   EXPECT_EQ(0u, folder_info2.items.size());
+  EXPECT_TRUE(folder_info2.add_to_front);
 
   model->DeleteFolder(folder_id);
   EXPECT_FALSE(model->HasFolder(folder_id));
@@ -107,7 +113,7 @@
 
   std::unique_ptr<RemoteAppsModel> model = SetUpModel();
   const RemoteAppsModel::FolderInfo& folder_info =
-      model->AddFolder(folder_name);
+      model->AddFolder(folder_name, /*add_to_front=*/false);
   std::string folder_id = folder_info.id;
   EXPECT_EQ(kId1, folder_info.id);
   EXPECT_EQ(folder_name, folder_info.name);
@@ -115,7 +121,7 @@
   EXPECT_TRUE(model->HasFolder(folder_id));
 
   const RemoteAppsModel::AppInfo& info =
-      model->AddApp(name, icon_url, folder_id);
+      model->AddApp(name, icon_url, folder_id, /*add_to_front=*/false);
   EXPECT_EQ(kId2, info.id);
   EXPECT_EQ(folder_id, info.folder_id);
   EXPECT_EQ(1u, folder_info.items.size());
@@ -123,7 +129,7 @@
 
   // Add second app.
   const RemoteAppsModel::AppInfo& info2 =
-      model->AddApp(name, icon_url, folder_id);
+      model->AddApp(name, icon_url, folder_id, /*add_to_front=*/false);
   EXPECT_EQ(kId3, info2.id);
   EXPECT_EQ(2u, folder_info.items.size());
   EXPECT_EQ(1u, folder_info.items.count(info2.id));
diff --git a/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/BackNavigationTabObserver.java b/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/BackNavigationTabObserver.java
index 8d64db0..12a8e59e 100644
--- a/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/BackNavigationTabObserver.java
+++ b/chrome/browser/continuous_search/internal/android/java/src/org/chromium/chrome/browser/continuous_search/BackNavigationTabObserver.java
@@ -4,12 +4,15 @@
 
 package org.chromium.chrome.browser.continuous_search;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabHidingType;
 import org.chromium.content_public.browser.NavigationEntry;
 import org.chromium.content_public.browser.NavigationHistory;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
 
 /**
@@ -77,6 +80,11 @@
         tab.removeObserver(this);
     }
 
+    @Override
+    public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+        // Intentionally do nothing to prevent automatic observer removal on detachment.
+    }
+
     private void recordMetricAndClearCache() {
         if (mLastSrpUrl != null) {
             RecordHistogram.recordCount100Histogram(
diff --git a/chrome/browser/device_identity/device_identity_provider.cc b/chrome/browser/device_identity/device_identity_provider.cc
index 5806e57c..ed6420e 100644
--- a/chrome/browser/device_identity/device_identity_provider.cc
+++ b/chrome/browser/device_identity/device_identity_provider.cc
@@ -103,23 +103,6 @@
   return token_service_->GetRobotAccountId();
 }
 
-void DeviceIdentityProvider::SetActiveAccountId(
-    const CoreAccountId& account_id) {
-  // On ChromeOs, the account shouldn't change during runtime, so no need to
-  // alert observers here.
-  if (!account_id.empty()) {
-    auto robot_account_id = token_service_->GetRobotAccountId();
-    // When |account_id| and |robot_account_id| mismatch, it means that sync is
-    // using a different account than the one that's registered for
-    // invalidations. Given that we're in Kiosk mode, sync shouldn't be running
-    // anyways. Therefore, this shouldn't be a problem in practice.
-    // TODO(crbug.com/919788): Change the sync code to only call this method
-    // when sync is actually running.
-    LOG_IF(WARNING, account_id != robot_account_id) << "Account ids mismatch.";
-  }
-  return;
-}
-
 bool DeviceIdentityProvider::IsActiveAccountWithRefreshToken() {
   if (GetActiveAccountId().empty() || !token_service_ ||
       !token_service_->RefreshTokenIsAvailable())
diff --git a/chrome/browser/device_identity/device_identity_provider.h b/chrome/browser/device_identity/device_identity_provider.h
index 4660cbe..dde3f51 100644
--- a/chrome/browser/device_identity/device_identity_provider.h
+++ b/chrome/browser/device_identity/device_identity_provider.h
@@ -26,7 +26,6 @@
       invalidation::ActiveAccountAccessTokenCallback callback) override;
   void InvalidateAccessToken(const OAuth2AccessTokenManager::ScopeSet& scopes,
                              const std::string& access_token) override;
-  void SetActiveAccountId(const CoreAccountId& account_id) override;
 
  private:
   void OnRefreshTokenAvailable();
diff --git a/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java b/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java
index a3a1a11..4f3505e 100644
--- a/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java
+++ b/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/MimeUtilsTest.java
@@ -10,6 +10,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 
@@ -17,6 +18,7 @@
  * Tests for MimeUtils class.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class MimeUtilsTest {
     @Test
     @SmallTest
diff --git a/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/StringUtilsTest.java b/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/StringUtilsTest.java
index 9ca3655..303df1c4 100644
--- a/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/StringUtilsTest.java
+++ b/chrome/browser/download/android/javatests/src/org/chromium/chrome/browser/download/StringUtilsTest.java
@@ -14,6 +14,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -27,6 +28,7 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @Features.DisableFeatures(ChromeFeatureList.DOWNLOAD_FILE_PROVIDER)
+@Batch(Batch.UNIT_TESTS)
 public class StringUtilsTest {
     @Test
     @SmallTest
diff --git a/chrome/browser/engagement/important_sites_util.cc b/chrome/browser/engagement/important_sites_util.cc
index ff8a55e..990d94f 100644
--- a/chrome/browser/engagement/important_sites_util.cc
+++ b/chrome/browser/engagement/important_sites_util.cc
@@ -15,7 +15,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/installable/installable_utils.h"
@@ -31,6 +30,7 @@
 #include "components/site_engagement/content/site_engagement_score.h"
 #include "components/site_engagement/content/site_engagement_service.h"
 #include "components/site_engagement/core/mojom/site_engagement_details.mojom.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/engagement/site_engagement_service_unittest.cc b/chrome/browser/engagement/site_engagement_service_unittest.cc
index d5970b96..e634173f 100644
--- a/chrome/browser/engagement/site_engagement_service_unittest.cc
+++ b/chrome/browser/engagement/site_engagement_service_unittest.cc
@@ -26,7 +26,6 @@
 #include "chrome/browser/engagement/site_engagement_service_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/content_settings_observer.h"
@@ -41,6 +40,7 @@
 #include "components/site_engagement/content/site_engagement_metrics.h"
 #include "components/site_engagement/content/site_engagement_observer.h"
 #include "components/site_engagement/content/site_engagement_score.h"
+#include "components/site_engagement/core/pref_names.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_entry.h"
diff --git a/chrome/browser/extensions/activity_log/activity_log_unittest.cc b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
index 220ed6a..fbec527 100644
--- a/chrome/browser/extensions/activity_log/activity_log_unittest.cc
+++ b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
@@ -24,8 +24,8 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/mock_render_process_host.h"
@@ -86,6 +86,8 @@
   void SetSystemFont(const std::string& font_family,
                      const std::string& font_size) override {}
   void SetWebViewPartitionID(const std::string& partition_id) override {}
+  void SetScriptingAllowlist(
+      const std::vector<std::string>& extension_ids) override {}
 
   mojo::AssociatedReceiverSet<mojom::Renderer> receivers_;
 };
@@ -295,7 +297,7 @@
       prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(profile());
 
   const gfx::Size kSize(640, 480);
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle(
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager->AddPrerenderFromOmnibox(
           url,
           web_contents()->GetController().GetDefaultSessionStorageNamespace(),
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 74e88bc..ed13891 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -359,8 +359,8 @@
   // callback on destruction.
   pref_change_registrar_.Add(
       prefs::kExtensionsUIDeveloperMode,
-      base::Bind(&DeveloperPrivateEventRouter::OnProfilePrefChanged,
-                 base::Unretained(this)));
+      base::BindRepeating(&DeveloperPrivateEventRouter::OnProfilePrefChanged,
+                          base::Unretained(this)));
   notification_registrar_.Add(
       this, extensions::NOTIFICATION_EXTENSION_PERMISSIONS_UPDATED,
       content::Source<Profile>(profile_));
@@ -555,9 +555,10 @@
   ExtensionInfoGenerator* info_generator_weak = info_generator.get();
   info_generator_weak->CreateExtensionInfo(
       extension_id,
-      base::Bind(&DeveloperPrivateEventRouter::BroadcastItemStateChangedHelper,
-                 weak_factory_.GetWeakPtr(), event_type, extension_id,
-                 base::Passed(std::move(info_generator))));
+      base::BindOnce(
+          &DeveloperPrivateEventRouter::BroadcastItemStateChangedHelper,
+          weak_factory_.GetWeakPtr(), event_type, extension_id,
+          base::Passed(std::move(info_generator))));
 }
 
 void DeveloperPrivateEventRouter::BroadcastItemStateChangedHelper(
@@ -742,8 +743,9 @@
   info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
   info_generator_->CreateExtensionsInfo(
       include_disabled, include_terminated,
-      base::Bind(&DeveloperPrivateGetExtensionsInfoFunction::OnInfosGenerated,
-                 base::RetainedRef(this)));
+      base::BindOnce(
+          &DeveloperPrivateGetExtensionsInfoFunction::OnInfosGenerated,
+          base::RetainedRef(this)));
 
   return RespondLater();
 }
@@ -770,8 +772,9 @@
   info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
   info_generator_->CreateExtensionInfo(
       params->id,
-      base::Bind(&DeveloperPrivateGetExtensionInfoFunction::OnInfosGenerated,
-                 base::RetainedRef(this)));
+      base::BindOnce(
+          &DeveloperPrivateGetExtensionInfoFunction::OnInfosGenerated,
+          base::RetainedRef(this)));
 
   return RespondLater();
 }
@@ -825,8 +828,8 @@
   info_generator_.reset(new ExtensionInfoGenerator(browser_context()));
   info_generator_->CreateExtensionsInfo(
       params->include_disabled, params->include_terminated,
-      base::Bind(&DeveloperPrivateGetItemsInfoFunction::OnInfosGenerated,
-                 base::RetainedRef(this)));
+      base::BindOnce(&DeveloperPrivateGetItemsInfoFunction::OnInfosGenerated,
+                     base::RetainedRef(this)));
 
   return RespondLater();
 }
@@ -1066,11 +1069,10 @@
     return RespondNow(Error(kCouldNotFindWebContentsError));
 
   ShowPermissionsDialogHelper::Show(
-      browser_context(),
-      web_contents,
-      target_extension,
+      browser_context(), web_contents, target_extension,
       source_context_type() == Feature::WEBUI_CONTEXT,
-      base::Bind(&DeveloperPrivateShowPermissionsDialogFunction::Finish, this));
+      base::BindOnce(&DeveloperPrivateShowPermissionsDialogFunction::Finish,
+                     this));
   return RespondLater();
 }
 
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index b900e63..7a48c1a0 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -138,7 +138,7 @@
   const Extension* LoadSimpleExtension();
 
   // Tests modifying the extension's configuration.
-  void TestExtensionPrefSetting(const base::Callback<bool()>& has_pref,
+  void TestExtensionPrefSetting(const base::RepeatingCallback<bool()>& has_pref,
                                 const std::string& key,
                                 const std::string& extension_id);
 
@@ -231,7 +231,7 @@
 }
 
 void DeveloperPrivateApiUnitTest::TestExtensionPrefSetting(
-    const base::Callback<bool()>& has_pref,
+    const base::RepeatingCallback<bool()>& has_pref,
     const std::string& key,
     const std::string& extension_id) {
   scoped_refptr<ExtensionFunction> function(
@@ -394,10 +394,12 @@
       .SetWithholdHostPermissions(true);
 
   TestExtensionPrefSetting(
-      base::Bind(&HasPrefsPermission, &util::IsIncognitoEnabled, profile(), id),
+      base::BindRepeating(&HasPrefsPermission, &util::IsIncognitoEnabled,
+                          profile(), id),
       "incognitoAccess", id);
   TestExtensionPrefSetting(
-      base::Bind(&HasPrefsPermission, &util::AllowFileAccess, profile(), id),
+      base::BindRepeating(&HasPrefsPermission, &util::AllowFileAccess,
+                          profile(), id),
       "fileAccess", id);
 }
 
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index b00dc45e..6ea8182 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -421,7 +421,7 @@
 
 void ExtensionInfoGenerator::CreateExtensionInfo(
     const std::string& id,
-    const ExtensionInfosCallback& callback) {
+    ExtensionInfosCallback callback) {
   DCHECK(callback_.is_null() && list_.empty()) <<
       "Only a single generation can be running at a time!";
   ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
@@ -441,17 +441,17 @@
   if (pending_image_loads_ == 0) {
     // Don't call the callback re-entrantly.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(callback, std::move(list_)));
+        FROM_HERE, base::BindOnce(std::move(callback), std::move(list_)));
     list_.clear();
   } else {
-    callback_ = callback;
+    callback_ = std::move(callback);
   }
 }
 
 void ExtensionInfoGenerator::CreateExtensionsInfo(
     bool include_disabled,
     bool include_terminated,
-    const ExtensionInfosCallback& callback) {
+    ExtensionInfosCallback callback) {
   auto add_to_list = [this](const ExtensionSet& extensions,
                             developer::ExtensionState state) {
     for (const scoped_refptr<const Extension>& extension : extensions) {
@@ -478,10 +478,10 @@
   if (pending_image_loads_ == 0) {
     // Don't call the callback re-entrantly.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(callback, std::move(list_)));
+        FROM_HERE, base::BindOnce(std::move(callback), std::move(list_)));
     list_.clear();
   } else {
-    callback_ = callback;
+    callback_ = std::move(callback);
   }
 }
 
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.h b/chrome/browser/extensions/api/developer_private/extension_info_generator.h
index dfc139c4..812128f 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.h
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.h
@@ -43,7 +43,7 @@
  public:
   using ExtensionInfoList = std::vector<api::developer_private::ExtensionInfo>;
 
-  using ExtensionInfosCallback = base::Callback<void(ExtensionInfoList)>;
+  using ExtensionInfosCallback = base::OnceCallback<void(ExtensionInfoList)>;
 
   explicit ExtensionInfoGenerator(content::BrowserContext* context);
   ~ExtensionInfoGenerator();
@@ -52,13 +52,13 @@
   // |extension_id|, if the extension can be found.
   // If the extension cannot be found, an empty vector is passed to |callback|.
   void CreateExtensionInfo(const std::string& id,
-                           const ExtensionInfosCallback& callback);
+                           ExtensionInfosCallback callback);
 
   // Creates and asynchronously returns a collection of ExtensionInfos,
   // optionally including disabled and terminated.
   void CreateExtensionsInfo(bool include_disabled,
                             bool include_terminated,
-                            const ExtensionInfosCallback& callback);
+                            ExtensionInfosCallback callback);
 
  private:
   // Creates an ExtensionInfo for the given |extension| and |state|, and
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
index 2189008..ce60a3f 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -131,8 +131,8 @@
         new ExtensionInfoGenerator(browser_context()));
     generator->CreateExtensionInfo(
         extension_id,
-        base::Bind(&ExtensionInfoGeneratorUnitTest::OnInfoGenerated,
-                   base::Unretained(this), base::Unretained(&info)));
+        base::BindOnce(&ExtensionInfoGeneratorUnitTest::OnInfoGenerated,
+                       base::Unretained(this), base::Unretained(&info)));
     run_loop.Run();
     return info;
   }
@@ -151,8 +151,8 @@
     generator.CreateExtensionsInfo(
         true, /* include_disabled */
         true, /* include_terminated */
-        base::Bind(&ExtensionInfoGeneratorUnitTest::OnInfosGenerated,
-                   base::Unretained(this), base::Unretained(&result)));
+        base::BindOnce(&ExtensionInfoGeneratorUnitTest::OnInfosGenerated,
+                       base::Unretained(this), base::Unretained(&result)));
     run_loop.Run();
     return result;
   }
diff --git a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
index a81a067..bb38ed5 100644
--- a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
+++ b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.cc
@@ -22,20 +22,17 @@
 
 ShowPermissionsDialogHelper::ShowPermissionsDialogHelper(
     Profile* profile,
-    const base::Closure& on_complete)
-    : profile_(profile),
-      on_complete_(on_complete) {
-}
+    base::OnceClosure on_complete)
+    : profile_(profile), on_complete_(std::move(on_complete)) {}
 
-ShowPermissionsDialogHelper::~ShowPermissionsDialogHelper() {
-}
+ShowPermissionsDialogHelper::~ShowPermissionsDialogHelper() = default;
 
 // static
 void ShowPermissionsDialogHelper::Show(content::BrowserContext* browser_context,
                                        content::WebContents* web_contents,
                                        const Extension* extension,
                                        bool from_webui,
-                                       const base::Closure& on_complete) {
+                                       base::OnceClosure on_complete) {
   Profile* profile = Profile::FromBrowserContext(browser_context);
 
   // Show the new-style extensions dialog when it is available. It is currently
@@ -47,14 +44,15 @@
                                 AppInfoLaunchSource::NUM_LAUNCH_SOURCES);
     }
 
-    ShowAppInfoInNativeDialog(web_contents, profile, extension, on_complete);
+    ShowAppInfoInNativeDialog(web_contents, profile, extension,
+                              std::move(on_complete));
 
     return;  // All done.
   }
 
   // ShowPermissionsDialogHelper manages its own lifetime.
   ShowPermissionsDialogHelper* helper =
-      new ShowPermissionsDialogHelper(profile, on_complete);
+      new ShowPermissionsDialogHelper(profile, std::move(on_complete));
   helper->ShowPermissionsDialog(web_contents, extension);
 }
 
@@ -86,8 +84,8 @@
   // Unretained() is safe because this class manages its own lifetime and
   // deletes itself in OnInstallPromptDone().
   prompt_->ShowDialog(
-      base::Bind(&ShowPermissionsDialogHelper::OnInstallPromptDone,
-                 base::Unretained(this)),
+      base::BindOnce(&ShowPermissionsDialogHelper::OnInstallPromptDone,
+                     base::Unretained(this)),
       extension, nullptr, std::move(prompt),
       ExtensionInstallPrompt::GetDefaultShowDialogCallback());
 }
@@ -106,7 +104,7 @@
         ->RestartApplicationIfRunning(extension_id_);
   }
 
-  on_complete_.Run();
+  std::move(on_complete_).Run();
   delete this;
 }
 
diff --git a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h
index 140348f..154ccaf 100644
--- a/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h
+++ b/chrome/browser/extensions/api/developer_private/show_permissions_dialog_helper.h
@@ -30,11 +30,10 @@
                    content::WebContents* web_contents,
                    const Extension* extension,
                    bool from_webui,
-                   const base::Closure& on_complete);
+                   base::OnceClosure on_complete);
 
  private:
-  ShowPermissionsDialogHelper(Profile* profile,
-                              const base::Closure& on_complete);
+  ShowPermissionsDialogHelper(Profile* profile, base::OnceClosure on_complete);
   ~ShowPermissionsDialogHelper();  // Manages its own lifetime.
 
   // Shows the old-style (not AppInfo) permissions dialog.
@@ -47,7 +46,7 @@
 
   Profile* profile_;
 
-  base::Closure on_complete_;
+  base::OnceClosure on_complete_;
 
   std::string extension_id_;
 
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc b/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
index 1b220ce..2c0e638 100644
--- a/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
+++ b/chrome/browser/extensions/api/platform_keys/platform_keys_api_ash.cc
@@ -222,9 +222,9 @@
   service->SelectClientCertificates(
       request, std::move(client_certs), params->details.interactive,
       extension_id(),
-      base::Bind(&PlatformKeysInternalSelectClientCertificatesFunction::
-                     OnSelectedCertificates,
-                 this),
+      base::BindOnce(&PlatformKeysInternalSelectClientCertificatesFunction::
+                         OnSelectedCertificates,
+                     this),
       web_contents);
   return RespondLater();
 }
@@ -302,7 +302,7 @@
         std::string(params->data.begin(), params->data.end()),
         std::string(params->public_key.begin(), params->public_key.end()),
         extension_id(),
-        base::Bind(&PlatformKeysInternalSignFunction::OnSigned, this));
+        base::BindOnce(&PlatformKeysInternalSignFunction::OnSigned, this));
   } else {
     chromeos::platform_keys::HashAlgorithm hash_algorithm;
     if (params->hash_algorithm_name == "SHA-1") {
@@ -333,7 +333,7 @@
         std::string(params->data.begin(), params->data.end()),
         std::string(params->public_key.begin(), params->public_key.end()),
         key_type, hash_algorithm, extension_id(),
-        base::Bind(&PlatformKeysInternalSignFunction::OnSigned, this));
+        base::BindOnce(&PlatformKeysInternalSignFunction::OnSigned, this));
   }
 
   return RespondLater();
@@ -365,9 +365,9 @@
   VerifyTrustAPI::GetFactoryInstance()
       ->Get(browser_context())
       ->Verify(std::move(params), extension_id(),
-               base::Bind(&PlatformKeysVerifyTLSServerCertificateFunction::
-                              FinishedVerification,
-                          this));
+               base::BindOnce(&PlatformKeysVerifyTLSServerCertificateFunction::
+                                  FinishedVerification,
+                              this));
 
   return RespondLater();
 }
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc b/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
index 581fc8a..503de727 100644
--- a/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
+++ b/chrome/browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc
@@ -170,14 +170,14 @@
   void OnKeyRegisteredForCorporateUsage(
       std::unique_ptr<chromeos::platform_keys::ExtensionKeyPermissionsService>
           extension_key_permissions_service,
-      const base::Closure& done_callback,
+      base::OnceClosure done_callback,
       chromeos::platform_keys::Status status) {
     ASSERT_EQ(status, chromeos::platform_keys::Status::kSuccess);
-    done_callback.Run();
+    std::move(done_callback).Run();
   }
 
   void GotPermissionsForExtension(
-      const base::Closure& done_callback,
+      base::OnceClosure done_callback,
       std::unique_ptr<chromeos::platform_keys::ExtensionKeyPermissionsService>
           extension_key_permissions_service) {
     auto* extension_key_permissions_service_unowned =
@@ -189,14 +189,14 @@
         base::BindOnce(&PlatformKeysTest::OnKeyRegisteredForCorporateUsage,
                        base::Unretained(this),
                        std::move(extension_key_permissions_service),
-                       done_callback));
+                       std::move(done_callback)));
   }
 
-  void SetupTestCerts(const base::Closure& done_callback,
+  void SetupTestCerts(base::OnceClosure done_callback,
                       net::NSSCertDatabase* cert_db) {
     SetupTestClientCerts(cert_db);
     SetupTestCACerts();
-    done_callback.Run();
+    std::move(done_callback).Run();
   }
 
   void SetupTestClientCerts(net::NSSCertDatabase* cert_db) {
diff --git a/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc b/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
index 1daf379..5a04b1d 100644
--- a/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
+++ b/chrome/browser/extensions/api/platform_keys/verify_trust_api.cc
@@ -47,7 +47,7 @@
   // extension is deleted (see OnExtensionUnloaded).
   void Verify(std::unique_ptr<Params> params,
               const std::string& extension_id,
-              const VerifyCallback& callback);
+              VerifyCallback callback);
 
   // Must be called when the extension with id |extension_id| is unloaded.
   // Deletes the verifier for |extension_id| and cancels all pending
@@ -65,7 +65,7 @@
   };
 
   // Calls back |callback| with the result and no error.
-  void CallBackWithResult(const VerifyCallback& callback,
+  void CallBackWithResult(VerifyCallback callback,
                           std::unique_ptr<net::CertVerifyResult> verify_result,
                           RequestState* request_state,
                           int return_value);
@@ -102,20 +102,22 @@
 
 void VerifyTrustAPI::Verify(std::unique_ptr<Params> params,
                             const std::string& extension_id,
-                            const VerifyCallback& ui_callback) {
+                            VerifyCallback ui_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   // Call back through the VerifyTrustAPI object on the UIThread. Because of the
   // WeakPtr usage, this will ensure that |ui_callback| is not called after the
   // API is destroyed.
-  VerifyCallback finish_callback(base::Bind(
-      &CallBackOnUI, base::Bind(&VerifyTrustAPI::FinishedVerificationOnUI,
-                                weak_factory_.GetWeakPtr(), ui_callback)));
+  VerifyCallback finish_callback(base::BindOnce(
+      &CallBackOnUI,
+      base::BindOnce(&VerifyTrustAPI::FinishedVerificationOnUI,
+                     weak_factory_.GetWeakPtr(), std::move(ui_callback))));
 
   content::GetIOThreadTaskRunner({})->PostTask(
       FROM_HERE,
       base::BindOnce(&IOPart::Verify, base::Unretained(io_part_.get()),
-                     std::move(params), extension_id, finish_callback));
+                     std::move(params), extension_id,
+                     std::move(finish_callback)));
 }
 
 void VerifyTrustAPI::OnExtensionUnloaded(
@@ -128,22 +130,23 @@
                      base::Unretained(io_part_.get()), extension->id()));
 }
 
-void VerifyTrustAPI::FinishedVerificationOnUI(const VerifyCallback& ui_callback,
+void VerifyTrustAPI::FinishedVerificationOnUI(VerifyCallback ui_callback,
                                               const std::string& error,
                                               int return_value,
                                               int cert_status) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  ui_callback.Run(error, return_value, cert_status);
+  std::move(ui_callback).Run(error, return_value, cert_status);
 }
 
 // static
-void VerifyTrustAPI::CallBackOnUI(const VerifyCallback& ui_callback,
+void VerifyTrustAPI::CallBackOnUI(VerifyCallback ui_callback,
                                   const std::string& error,
                                   int return_value,
                                   int cert_status) {
   content::GetUIThreadTaskRunner({})->PostTask(
-      FROM_HERE, base::BindOnce(ui_callback, error, return_value, cert_status));
+      FROM_HERE,
+      base::BindOnce(std::move(ui_callback), error, return_value, cert_status));
 }
 
 VerifyTrustAPI::IOPart::~IOPart() {
@@ -152,13 +155,13 @@
 
 void VerifyTrustAPI::IOPart::Verify(std::unique_ptr<Params> params,
                                     const std::string& extension_id,
-                                    const VerifyCallback& callback) {
+                                    VerifyCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
   const api::platform_keys::VerificationDetails& details = params->details;
 
   if (details.server_certificate_chain.empty()) {
-    callback.Run(kErrorEmptyCertificateChain, 0, 0);
+    std::move(callback).Run(kErrorEmptyCertificateChain, 0, 0);
     return;
   }
 
@@ -166,7 +169,7 @@
   for (const std::vector<uint8_t>& cert_der :
        details.server_certificate_chain) {
     if (cert_der.empty()) {
-      callback.Run(platform_keys::kErrorInvalidX509Cert, 0, 0);
+      std::move(callback).Run(platform_keys::kErrorInvalidX509Cert, 0, 0);
       return;
     }
     der_cert_chain.push_back(base::StringPiece(
@@ -175,7 +178,7 @@
   scoped_refptr<net::X509Certificate> cert_chain(
       net::X509Certificate::CreateFromDERCertChain(der_cert_chain));
   if (!cert_chain) {
-    callback.Run(platform_keys::kErrorInvalidX509Cert, 0, 0);
+    std::move(callback).Run(platform_keys::kErrorInvalidX509Cert, 0, 0);
     return;
   }
 
@@ -195,9 +198,17 @@
   net::CertVerifyResult* const verify_result_ptr = verify_result.get();
 
   RequestState* request_state = new RequestState();
-  base::Callback<void(int)> bound_callback(
-      base::Bind(&IOPart::CallBackWithResult, base::Unretained(this), callback,
-                 base::Passed(&verify_result), base::Owned(request_state)));
+  // Using AdaptCallbackForRepeating() is safe here, because |bound_callback|
+  // can be called only once (at the end of this function or by |verifier|,
+  // depending on whether Verify() can be completed synchronously).
+  // TODO(crbug.com/730593): AdaptCallbackForRepeating() is being deprecated and
+  // should be avoided. In this case it's caused by "sometimes asynchronous" API
+  // issue which is common in net code (see crbug.com/730593#c12).
+  base::RepeatingCallback<void(int)> bound_callback =
+      base::AdaptCallbackForRepeating(
+          base::BindOnce(&IOPart::CallBackWithResult, base::Unretained(this),
+                         std::move(callback), base::Passed(&verify_result),
+                         base::Owned(request_state)));
 
   const int return_value = verifier->Verify(
       net::CertVerifier::RequestParams(std::move(cert_chain), details.hostname,
@@ -216,14 +227,14 @@
 }
 
 void VerifyTrustAPI::IOPart::CallBackWithResult(
-    const VerifyCallback& callback,
+    VerifyCallback callback,
     std::unique_ptr<net::CertVerifyResult> verify_result,
     RequestState* request_state,
     int return_value) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  callback.Run(std::string() /* no error message */, return_value,
-               verify_result->cert_status);
+  std::move(callback).Run(std::string() /* no error message */, return_value,
+                          verify_result->cert_status);
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/platform_keys/verify_trust_api.h b/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
index f3b21ee..29e6df1d 100644
--- a/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
+++ b/chrome/browser/extensions/api/platform_keys/verify_trust_api.h
@@ -42,7 +42,7 @@
   // |cert_status| to the bitwise-OR of CertStatus flags. If an error occured
   // during processing the parameters, |error| is set to an english error
   // message and |return_value| and |cert_status| must be ignored.
-  using VerifyCallback = base::Callback<
+  using VerifyCallback = base::OnceCallback<
       void(const std::string& error, int return_value, int cert_status)>;
   using Params = api::platform_keys::VerifyTLSServerCertificate::Params;
 
@@ -59,7 +59,7 @@
   // will NOT be called.
   void Verify(std::unique_ptr<Params> params,
               const std::string& extension_id,
-              const VerifyCallback& callback);
+              VerifyCallback callback);
 
   // ExtensionRegistryObserver:
   void OnExtensionUnloaded(content::BrowserContext* browser_context,
@@ -79,13 +79,13 @@
   friend class BrowserContextKeyedAPIFactory<VerifyTrustAPI>;
 
   // Calls |ui_callback| with the given parameters.
-  void FinishedVerificationOnUI(const VerifyCallback& ui_callback,
+  void FinishedVerificationOnUI(VerifyCallback ui_callback,
                                 const std::string& error,
                                 int return_value,
                                 int cert_status);
 
   // Calls |ui_callback| on the UIThread with the given arguments.
-  static void CallBackOnUI(const VerifyCallback& ui_callback,
+  static void CallBackOnUI(VerifyCallback ui_callback,
                            const std::string& error,
                            int return_value,
                            int cert_status);
diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc
index 91d63910..7f629e16 100644
--- a/chrome/browser/extensions/extension_util.cc
+++ b/chrome/browser/extensions/extension_util.cc
@@ -13,7 +13,6 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_sync_service.h"
 #include "chrome/browser/extensions/launch_util.h"
@@ -28,6 +27,7 @@
 #include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h"
 #include "chrome/common/extensions/sync_helper.h"
 #include "components/variations/variations_associated_data.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/site_instance.h"
 #include "extensions/browser/disable_reason.h"
 #include "extensions/browser/extension_prefs.h"
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
index 442f182..217e35ac 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
@@ -491,9 +491,6 @@
     case blink::mojom::CommonDirectory::kDirDownloads:
       key = chrome::DIR_DEFAULT_DOWNLOADS;
       break;
-    case blink::mojom::CommonDirectory::kDirHome:
-      key = base::DIR_HOME;
-      break;
     case blink::mojom::CommonDirectory::kDirMusic:
       key = chrome::DIR_USER_MUSIC;
       break;
diff --git a/chrome/browser/first_run/first_run_internal_lacros.cc b/chrome/browser/first_run/first_run_internal_lacros.cc
index fc4b99d..69ea860 100644
--- a/chrome/browser/first_run/first_run_internal_lacros.cc
+++ b/chrome/browser/first_run/first_run_internal_lacros.cc
@@ -4,29 +4,11 @@
 
 #include "chrome/browser/first_run/first_run_internal.h"
 
-#include "chrome/browser/metrics/metrics_reporting_state.h"
-#include "chromeos/crosapi/mojom/crosapi.mojom.h"
-#include "chromeos/lacros/lacros_chrome_service_impl.h"
-
 namespace first_run {
 namespace internal {
 
 void DoPostImportPlatformSpecificTasks(Profile* profile) {
-  auto* lacros_service = chromeos::LacrosChromeServiceImpl::Get();
-
-  // The code below is only needed for legacy ash where the metrics reporting
-  // API is not available.
-  // TODO(https://crbug.com/1155751): Remove this check and the code below when
-  // all lacros clients are on OS 89 or later.
-  if (lacros_service->IsMetricsReportingAvailable())
-    return;
-
-  // Lacros skips the first run dialog because Chrome is the default browser on
-  // Chrome OS and metrics consent is chosen during the Chrome OS out of box
-  // setup experience. Lacros inherits first-run metrics consent from ash over
-  // mojo. After first-run lacros handles metrics consent via settings.
-  ChangeMetricsReportingState(
-      lacros_service->init_params()->ash_metrics_enabled);
+  // Nothing to do.
 }
 
 bool ShowPostInstallEULAIfNeeded(installer::InitialPreferences* install_prefs) {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 98a5626..3a78f5d 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -3018,8 +3018,8 @@
   },
   {
     "name": "impulse-scroll-animations",
-    "owners": [ "dlibby@microsoft.com", "sarsha@microsoft.com" ],
-    "expiry_milestone": 89
+    "owners": [ "arakeri@microsoft.com", "gerchiko@microsoft.com" ],
+    "expiry_milestone": 100
   },
   {
     "name": "in-product-help-demo-mode-choice",
@@ -3416,6 +3416,11 @@
     "expiry_milestone": 92
   },
   {
+    "name": "mojo-linux-sharedmem",
+    "owners": ["bgeffon", "rockot"],
+    "expiry_milestone": 99
+  },
+  {
     "name": "mouse-subframe-no-implicit-capture",
     "owners": [ "eirage", "nzolghadr", "input-dev" ],
     "expiry_milestone": 84
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 898ebe7..dca21e2 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1433,6 +1433,12 @@
 const char kMobilePwaInstallUseBottomSheetDescription[] =
     "Enables use of a rich bottom sheet when offering mobile PWA installation.";
 
+const char kMojoLinuxChannelSharedMemName[] =
+    "Enable Mojo Shared Memory Channel";
+const char kMojoLinuxChannelSharedMemDescription[] =
+    "If enabled Mojo on Linux based platforms can use shared memory as an "
+    "alternate channel for most messages.";
+
 const char kMouseSubframeNoImplicitCaptureName[] =
     "Disable mouse implicit capture for iframe";
 const char kMouseSubframeNoImplicitCaptureDescription[] =
@@ -4105,12 +4111,6 @@
     "When enabled, this will reset the clipboard nudge shown data on every new "
     "user session, allowing the nudge to be shown again.";
 
-const char kEnhancedClipboardSimpleRenderName[] =
-    "Only renders html in the Enhanced Clipboard if there are img or table "
-    "tags";
-const char kEnhancedClipboardSimpleRenderDescription[] =
-    "This will result in less HTML rendering in the Enhanced Clipboard menu.";
-
 const char kEnableCrOSActionRecorderName[] = "Enable CrOS action recorder";
 const char kEnableCrOSActionRecorderDescription[] =
     "When enabled, each app launching, file opening, setting change, and url "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 74dc1414..364017db 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -847,6 +847,9 @@
 extern const char kMobilePwaInstallUseBottomSheetName[];
 extern const char kMobilePwaInstallUseBottomSheetDescription[];
 
+extern const char kMojoLinuxChannelSharedMemName[];
+extern const char kMojoLinuxChannelSharedMemDescription[];
+
 extern const char kMouseSubframeNoImplicitCaptureName[];
 extern const char kMouseSubframeNoImplicitCaptureDescription[];
 
@@ -2378,9 +2381,6 @@
 extern const char kEnhancedClipboardNudgeSessionResetName[];
 extern const char kEnhancedClipboardNudgeSessionResetDescription[];
 
-extern const char kEnhancedClipboardSimpleRenderName[];
-extern const char kEnhancedClipboardSimpleRenderDescription[];
-
 extern const char kEnableCrOSActionRecorderName[];
 extern const char kEnableCrOSActionRecorderDescription[];
 
diff --git a/chrome/browser/history/profile_based_browsing_history_driver.cc b/chrome/browser/history/profile_based_browsing_history_driver.cc
index 5ab0b88..308a55c 100644
--- a/chrome/browser/history/profile_based_browsing_history_driver.cc
+++ b/chrome/browser/history/profile_based_browsing_history_driver.cc
@@ -6,13 +6,13 @@
 
 #include <utility>
 
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/history/history_utils.h"
 #include "chrome/browser/history/web_history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "components/browsing_data/core/history_notice_utils.h"
 #include "components/prefs/pref_service.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "extensions/buildflags/buildflags.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/media/media_engagement_browsertest.cc b/chrome/browser/media/media_engagement_browsertest.cc
index 54823ff..eab7f175 100644
--- a/chrome/browser/media/media_engagement_browsertest.cc
+++ b/chrome/browser/media/media_engagement_browsertest.cc
@@ -36,8 +36,8 @@
 #include "components/component_updater/component_updater_service.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/common/prerender_final_status.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/browser_test.h"
@@ -761,11 +761,11 @@
       no_state_prefetch_contents_factory->ExpectNoStatePrefetchContents(
           prerender::FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
 
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle =
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle =
       no_state_prefetch_manager->AddPrerenderFromOmnibox(url, storage_namespace,
                                                          gfx::Size(640, 480));
 
-  ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
+  ASSERT_EQ(no_state_prefetch_handle->contents(), test_prerender->contents());
 
   EXPECT_EQ(nullptr, GetService()->GetContentsObserverFor(
                          test_prerender->contents()->web_contents()));
diff --git a/chrome/browser/metrics/tab_stats_data_store.cc b/chrome/browser/metrics/tab_stats_data_store.cc
index 0640105..95fdb2e 100644
--- a/chrome/browser/metrics/tab_stats_data_store.cc
+++ b/chrome/browser/metrics/tab_stats_data_store.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents.h"
 
 namespace metrics {
@@ -116,8 +117,11 @@
   OnTabAudibleOrVisible(web_contents);
 }
 
-void TabStatsDataStore::OnTabVisible(content::WebContents* web_contents) {
-  OnTabAudibleOrVisible(web_contents);
+void TabStatsDataStore::OnTabVisibilityChanged(
+    content::WebContents* web_contents,
+    content::Visibility visibility) {
+  if (visibility == content::Visibility::VISIBLE)
+    OnTabAudibleOrVisible(web_contents);
 }
 
 void TabStatsDataStore::UpdateMaxTabsPerWindowIfNeeded(size_t value) {
diff --git a/chrome/browser/metrics/tab_stats_data_store.h b/chrome/browser/metrics/tab_stats_data_store.h
index 659b6d72..50433e4a 100644
--- a/chrome/browser/metrics/tab_stats_data_store.h
+++ b/chrome/browser/metrics/tab_stats_data_store.h
@@ -12,8 +12,9 @@
 #include "base/gtest_prod_util.h"
 #include "base/optional.h"
 #include "base/sequence_checker.h"
-#include "chrome/browser/metrics/tab_stats_handler.h"
+#include "chrome/browser/metrics/tab_stats_observer.h"
 #include "chrome/browser/resource_coordinator/lifecycle_unit_state.mojom.h"
+#include "content/public/browser/visibility.h"
 
 using mojom::LifecycleUnitDiscardReason;
 
@@ -30,7 +31,7 @@
 
 // Keeps track of all the information needed by TabStatsTracker. Stats are
 // stored internally to be retrieved at a later point.
-class TabStatsDataStore : public TabStatsHandler {
+class TabStatsDataStore : public TabStatsObserver {
  public:
   // Houses all of the statistics gathered by the TabStatsTracker.
   struct TabsStats {
@@ -81,9 +82,9 @@
       base::flat_map<TabID, TabStateDuringInterval>;
 
   explicit TabStatsDataStore(PrefService* pref_service);
-  virtual ~TabStatsDataStore();
+  ~TabStatsDataStore() override;
 
-  // TabStatsHandler:
+  // TabStatsObserver:
   void OnWindowAdded() override;
   void OnWindowRemoved() override;
   void OnTabAdded(content::WebContents* web_contents) override;
@@ -92,7 +93,8 @@
                      content::WebContents* new_contents) override;
   void OnTabInteraction(content::WebContents* web_contents) override;
   void OnTabAudible(content::WebContents* web_contents) override;
-  void OnTabVisible(content::WebContents* web_contents) override;
+  void OnTabVisibilityChanged(content::WebContents* web_contents,
+                              content::Visibility visibility) override;
 
   // Update the maximum number of tabs in a single window if |value| exceeds
   // this.
diff --git a/chrome/browser/metrics/tab_stats_data_store_unittest.cc b/chrome/browser/metrics/tab_stats_data_store_unittest.cc
index aae6b28..bfa8c29b 100644
--- a/chrome/browser/metrics/tab_stats_data_store_unittest.cc
+++ b/chrome/browser/metrics/tab_stats_data_store_unittest.cc
@@ -9,6 +9,7 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -127,7 +128,8 @@
 
   // Make the first WebContents visible.
   web_contents_vec[0].get()->WasShown();
-  data_store_->OnTabVisible(web_contents_vec[0].get());
+  data_store_->OnTabVisibilityChanged(web_contents_vec[0].get(),
+                                      content::Visibility::VISIBLE);
   EXPECT_TRUE(interval_map->find(web_contents_id_vec[0])
                   ->second.visible_or_audible_during_interval);
   EXPECT_FALSE(interval_map->find(web_contents_id_vec[1])
diff --git a/chrome/browser/metrics/tab_stats_handler.h b/chrome/browser/metrics/tab_stats_observer.h
similarity index 72%
rename from chrome/browser/metrics/tab_stats_handler.h
rename to chrome/browser/metrics/tab_stats_observer.h
index c828cad..e5c2db7c 100644
--- a/chrome/browser/metrics/tab_stats_handler.h
+++ b/chrome/browser/metrics/tab_stats_observer.h
@@ -2,8 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_METRICS_TAB_STATS_HANDLER_H_
-#define CHROME_BROWSER_METRICS_TAB_STATS_HANDLER_H_
+#ifndef CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_
+#define CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_
+
+#include "base/observer_list_types.h"
+#include "content/public/browser/visibility.h"
 
 namespace content {
 class WebContents;
@@ -15,7 +18,7 @@
 // Handling the events can be either storing them for logging purposes,
 // forwarding them to another class or taking reactive measures when certain
 // criteria are met.
-class TabStatsHandler {
+class TabStatsObserver : public base::CheckedObserver {
  public:
   // Functions used to update the window/tab count.
   virtual void OnWindowAdded() = 0;
@@ -34,10 +37,11 @@
   // Records that a tab became audible.
   virtual void OnTabAudible(content::WebContents* web_contents) = 0;
 
-  // Records that a tab became visible.
-  virtual void OnTabVisible(content::WebContents* web_contents) = 0;
+  // Records that a tab's visibility changed.
+  virtual void OnTabVisibilityChanged(content::WebContents* web_contents,
+                                      content::Visibility visibility) = 0;
 };
 
 }  // namespace metrics
 
-#endif  // CHROME_BROWSER_METRICS_TAB_STATS_HANDLER_H_
+#endif  // CHROME_BROWSER_METRICS_TAB_STATS_OBSERVER_H_
diff --git a/chrome/browser/metrics/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats_tracker.cc
index c16e545..fbe9cd2 100644
--- a/chrome/browser/metrics/tab_stats_tracker.cc
+++ b/chrome/browser/metrics/tab_stats_tracker.cc
@@ -31,6 +31,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/ukm/content/source_url_recorder.h"
+#include "content/public/browser/visibility.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/gfx/geometry/rect.h"
@@ -128,6 +129,9 @@
                                        ::prefs::kTabStatsDailySample,
                                        kTabStatsDailyEventHistogramName)) {
   DCHECK(pref_service);
+
+  tab_stats_observers_.AddObserver(tab_stats_data_store_.get());
+
   // Get the list of existing windows/tabs. There shouldn't be any if this is
   // initialized at startup but this will ensure that the counts stay accurate
   // if the initialization gets moved to after the creation of the first tab.
@@ -143,8 +147,10 @@
   browser_list->AddObserver(this);
   base::PowerMonitor::AddObserver(this);
 
+  // Setup daily reporting of the stats aggregated in |tab_stats_data_store|.
   daily_event_->AddObserver(std::make_unique<TabStatsDailyObserver>(
       reporting_delegate_.get(), tab_stats_data_store_.get()));
+
   // Call the CheckInterval method to see if the data need to be immediately
   // reported.
   daily_event_->CheckInterval();
@@ -152,6 +158,8 @@
                            daily_event_.get(), &DailyEvent::CheckInterval);
 
   // Initialize the interval maps and timers associated with them.
+  // Only |tab_stats_data_store_| (and not other observers) is registered for
+  // callbacks since only it computes intervals.
   for (base::TimeDelta interval : kTabUsageReportingIntervals) {
     TabStatsDataStore::TabsStateDuringIntervalMap* interval_map =
         tab_stats_data_store_->AddInterval();
@@ -227,8 +235,10 @@
       content::NavigationHandle* navigation_handle) override {
     // Treat browser-initiated navigations as user interactions.
     if (!navigation_handle->IsRendererInitiated()) {
-      tab_stats_tracker_->tab_stats_data_store()->OnTabInteraction(
-          web_contents());
+      for (TabStatsObserver& tab_stats_observer :
+           tab_stats_tracker_->tab_stats_observers_) {
+        tab_stats_observer.OnTabInteraction(web_contents());
+      }
     }
   }
 
@@ -246,13 +256,17 @@
   }
 
   void DidGetUserInteraction(const blink::WebInputEvent& event) override {
-    tab_stats_tracker_->tab_stats_data_store()->OnTabInteraction(
-        web_contents());
+    for (TabStatsObserver& tab_stats_observer :
+         tab_stats_tracker_->tab_stats_observers_) {
+      tab_stats_observer.OnTabInteraction(web_contents());
+    }
   }
 
   void OnVisibilityChanged(content::Visibility visibility) override {
-    if (visibility == content::Visibility::VISIBLE)
-      tab_stats_tracker_->tab_stats_data_store()->OnTabVisible(web_contents());
+    for (TabStatsObserver& tab_stats_observer :
+         tab_stats_tracker_->tab_stats_observers_) {
+      tab_stats_observer.OnTabVisibilityChanged(web_contents(), visibility);
+    }
   }
 
   void WebContentsDestroyed() override {
@@ -280,13 +294,17 @@
 
 void TabStatsTracker::OnBrowserAdded(Browser* browser) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  tab_stats_data_store_->OnWindowAdded();
+  for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+    tab_stats_observer.OnWindowAdded();
+  }
   browser->tab_strip_model()->AddObserver(this);
 }
 
 void TabStatsTracker::OnBrowserRemoved(Browser* browser) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  tab_stats_data_store_->OnWindowRemoved();
+  for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+    tab_stats_observer.OnWindowRemoved();
+  }
   browser->tab_strip_model()->RemoveObserver(this);
 }
 
@@ -307,8 +325,10 @@
 
   if (change.type() == TabStripModelChange::kReplaced) {
     auto* replace = change.GetReplace();
-    tab_stats_data_store_->OnTabReplaced(replace->old_contents,
-                                         replace->new_contents);
+    for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+      tab_stats_observer.OnTabReplaced(replace->old_contents,
+                                       replace->new_contents);
+    }
     web_contents_usage_observers_.insert(std::make_pair(
         replace->new_contents, std::make_unique<WebContentsUsageObserver>(
                                    replace->new_contents, this)));
@@ -323,8 +343,11 @@
   // Ignore 'loading' and 'title' changes, we're only interested in audio here.
   if (change_type != TabChangeType::kAll)
     return;
-  if (web_contents->IsCurrentlyAudible())
-    tab_stats_data_store_->OnTabAudible(web_contents);
+  if (web_contents->IsCurrentlyAudible()) {
+    for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+      tab_stats_observer.OnTabAudible(web_contents);
+    }
+  }
 }
 
 void TabStatsTracker::OnResume() {
@@ -339,7 +362,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(interval_map);
   reporting_delegate_->ReportUsageDuringInterval(*interval_map, interval);
-  // Reset the interval data.
+
+  // Only |tab_stats_data_store_| (and not other obsevers) resets since only it
+  // computes intervals.
   tab_stats_data_store_->ResetIntervalData(interval_map);
 }
 
@@ -350,7 +375,9 @@
   // it's already tracked and it's being dragged into a new window, there's
   // nothing to do here.
   if (!base::Contains(web_contents_usage_observers_, web_contents)) {
-    tab_stats_data_store_->OnTabAdded(web_contents);
+    for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+      tab_stats_observer.OnTabAdded(web_contents);
+    }
     web_contents_usage_observers_.insert(std::make_pair(
         web_contents,
         std::make_unique<WebContentsUsageObserver>(web_contents, this)));
@@ -363,7 +390,9 @@
   DCHECK(base::Contains(web_contents_usage_observers_, web_contents));
   web_contents_usage_observers_.erase(
       web_contents_usage_observers_.find(web_contents));
-  tab_stats_data_store_->OnTabRemoved(web_contents);
+  for (TabStatsObserver& tab_stats_observer : tab_stats_observers_) {
+    tab_stats_observer.OnTabRemoved(web_contents);
+  }
 }
 
 void TabStatsTracker::OnHeartbeatEvent() {
diff --git a/chrome/browser/metrics/tab_stats_tracker.h b/chrome/browser/metrics/tab_stats_tracker.h
index b065a3a..8dd7857b 100644
--- a/chrome/browser/metrics/tab_stats_tracker.h
+++ b/chrome/browser/metrics/tab_stats_tracker.h
@@ -14,6 +14,7 @@
 #include "base/containers/flat_set.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "base/power_monitor/power_observer.h"
 #include "base/sequence_checker.h"
 #include "base/timer/timer.h"
@@ -174,6 +175,9 @@
   // when it's about to be destroyed.
   class WebContentsUsageObserver;
 
+  // For access to |tab_stats_observers_|
+  friend class WebContentsUsageObserver;
+
   // The delegate that reports the events.
   std::unique_ptr<UmaStatsReportingDelegate> reporting_delegate_;
 
@@ -186,6 +190,9 @@
   // A daily event for collecting metrics once a day.
   std::unique_ptr<DailyEvent> daily_event_;
 
+  // The list of registered observers.
+  base::ObserverList<TabStatsObserver> tab_stats_observers_;
+
   // The timer used to periodically check if the daily event should be
   // triggered.
   base::RepeatingTimer daily_event_timer_;
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc
index 16a9ce90..becdb8a 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -217,9 +217,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Observe(nullptr);
 
-  if (prerender_handle_) {
-    prerender_handle_->SetObserver(nullptr);
-    prerender_handle_->OnNavigateAway();
+  if (no_state_prefetch_handle_) {
+    no_state_prefetch_handle_->SetObserver(nullptr);
+    no_state_prefetch_handle_->OnNavigateAway();
   }
 }
 
@@ -348,10 +348,10 @@
       visibility != content::Visibility::VISIBLE) {
     current_visibility_ = visibility;
 
-    if (prerender_handle_) {
-      prerender_handle_->SetObserver(nullptr);
-      prerender_handle_->OnNavigateAway();
-      prerender_handle_.reset();
+    if (no_state_prefetch_handle_) {
+      no_state_prefetch_handle_->SetObserver(nullptr);
+      no_state_prefetch_handle_->OnNavigateAway();
+      no_state_prefetch_handle_.reset();
       partial_prerfetches_.emplace(prefetch_url_.value());
       prefetch_url_ = base::nullopt;
     }
@@ -386,13 +386,13 @@
   if (navigation_handle->GetURL() == prefetch_url_.value())
     return;
 
-  if (!prerender_handle_)
+  if (!no_state_prefetch_handle_)
     return;
 
   // Stop prerender to reduce network contention during main frame fetch.
-  prerender_handle_->SetObserver(nullptr);
-  prerender_handle_->OnNavigateAway();
-  prerender_handle_.reset();
+  no_state_prefetch_handle_->SetObserver(nullptr);
+  no_state_prefetch_handle_->OnNavigateAway();
+  no_state_prefetch_handle_.reset();
   partial_prerfetches_.emplace(prefetch_url_.value());
   prefetch_url_ = base::nullopt;
 }
@@ -927,7 +927,7 @@
 void NavigationPredictor::Prefetch(
     prerender::NoStatePrefetchManager* no_state_prefetch_manager,
     const GURL& url_to_prefetch) {
-  DCHECK(!prerender_handle_);
+  DCHECK(!no_state_prefetch_handle_);
   DCHECK(!prefetch_url_);
 
   // It is possible for this class to still exist while its WebContents and
@@ -941,12 +941,12 @@
       web_contents()->GetController().GetDefaultSessionStorageNamespace();
   gfx::Size size = web_contents()->GetContainerBounds().size();
 
-  prerender_handle_ =
+  no_state_prefetch_handle_ =
       no_state_prefetch_manager->AddPrerenderFromNavigationPredictor(
           url_to_prefetch, session_storage_namespace, size);
 
-  // Prerender was prevented for some reason, try next URL.
-  if (!prerender_handle_) {
+  // Prefetch was prevented for some reason, try next URL.
+  if (!no_state_prefetch_handle_) {
     MaybePrefetch();
     return;
   }
@@ -954,12 +954,13 @@
   prefetch_url_ = url_to_prefetch;
   urls_prefetched_.emplace(url_to_prefetch);
 
-  prerender_handle_->SetObserver(this);
+  no_state_prefetch_handle_->SetObserver(this);
 }
 
-void NavigationPredictor::OnPrerenderStop(prerender::PrerenderHandle* handle) {
-  DCHECK_EQ(prerender_handle_.get(), handle);
-  prerender_handle_.reset();
+void NavigationPredictor::OnPrefetchStop(
+    prerender::NoStatePrefetchHandle* handle) {
+  DCHECK_EQ(no_state_prefetch_handle_.get(), handle);
+  no_state_prefetch_handle_.reset();
   prefetch_url_ = base::nullopt;
 
   MaybePrefetch();
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.h b/chrome/browser/navigation_predictor/navigation_predictor.h
index af4aaf2..d54c857 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor.h
@@ -15,7 +15,7 @@
 #include "base/optional.h"
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -42,7 +42,7 @@
 // are the most likely anchor elements that the user will click.
 class NavigationPredictor : public blink::mojom::AnchorElementMetricsHost,
                             public content::WebContentsObserver,
-                            public prerender::PrerenderHandle::Observer {
+                            public prerender::NoStatePrefetchHandle::Observer {
  public:
   explicit NavigationPredictor(content::WebContents* web_contents);
   ~NavigationPredictor() override;
@@ -112,10 +112,10 @@
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
 
-  // prerender::PrerenderHandle::Observer:
-  void OnPrerenderStop(prerender::PrerenderHandle* handle) override;
-  void OnPrerenderNetworkBytesChanged(
-      prerender::PrerenderHandle* handle) override {}
+  // prerender::NoStatePrefetchHandle::Observer:
+  void OnPrefetchStop(prerender::NoStatePrefetchHandle* handle) override;
+  void OnPrefetchNetworkBytesChanged(
+      prerender::NoStatePrefetchHandle* handle) override {}
 
   // Returns true if the anchor element metric from the renderer process is
   // valid.
@@ -290,8 +290,8 @@
   // Current visibility state of the web contents.
   content::Visibility current_visibility_;
 
-  // Current prerender handle.
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle_;
+  // Current prefetch handle.
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle_;
 
   // URL that we decided to prefetch, and are currently prefetching.
   base::Optional<GURL> prefetch_url_;
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc
index 5de9cb6..556a4da1 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/nearby_sharing/nearby_connections_manager_impl.h"
 #include "chrome/browser/nearby_sharing/nearby_process_manager.h"
 #include "chrome/browser/nearby_sharing/nearby_sharing_service_impl.h"
-#include "chrome/browser/nearby_sharing/power_client.h"
 #include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -30,6 +29,9 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/nearby_sharing/power_client_chromeos.h"
+#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/nearby_sharing/power_client.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 namespace {
@@ -99,7 +101,11 @@
   return new NearbySharingServiceImpl(
       pref_service, notification_display_service, profile,
       std::move(nearby_connections_manager), &process_manager,
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      std::make_unique<PowerClientChromeos>());
+#else   // !BUILDFLAG(IS_CHROMEOS_ASH)
       std::make_unique<PowerClient>());
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 content::BrowserContext* NearbySharingServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
index 605efc9..8e60c5b 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
@@ -1074,11 +1074,6 @@
   InvalidateSurfaceState();
 }
 
-void NearbySharingServiceImpl::ScreenStateChanged(bool is_screen_on) {
-  NS_LOG(VERBOSE) << __func__ << ": " << is_screen_on;
-  InvalidateSurfaceState();
-}
-
 base::ObserverList<TransferUpdateCallback>&
 NearbySharingServiceImpl::GetReceiveCallbacksFromState(
     ReceiveSurfaceState state) {
@@ -1402,13 +1397,6 @@
     return;
   }
 
-  if (!power_client_->IsScreenOn()) {
-    StopScanning();
-    NS_LOG(VERBOSE) << __func__
-                    << ": Stopping discovery because the screen is off.";
-    return;
-  }
-
   if (!process_manager_->IsActiveProfile(profile_)) {
     NS_LOG(VERBOSE) << __func__
                     << ": Stopping discovery because profile was not active";
@@ -1479,14 +1467,6 @@
     return;
   }
 
-  if (!power_client_->IsScreenOn()) {
-    StopFastInitiationAdvertising();
-    NS_LOG(VERBOSE)
-        << __func__
-        << ": Stopping fast init advertising because the screen is off.";
-    return;
-  }
-
   if (!process_manager_->IsActiveProfile(profile_)) {
     StopFastInitiationAdvertising();
     NS_LOG(VERBOSE)
@@ -1557,13 +1537,6 @@
     return;
   }
 
-  if (!power_client_->IsScreenOn()) {
-    StopAdvertising();
-    NS_LOG(VERBOSE) << __func__
-                    << ": Stopping advertising because the screen is off.";
-    return;
-  }
-
   if (!process_manager_->IsActiveProfile(profile_)) {
     NS_LOG(VERBOSE) << __func__
                     << ": Stopping advertising because profile was not active";
@@ -1734,7 +1707,6 @@
 void NearbySharingServiceImpl::StartScanning() {
   DCHECK(profile_);
   DCHECK(!power_client_->IsSuspended());
-  DCHECK(power_client_->IsScreenOn());
   DCHECK(settings_.GetEnabled());
   DCHECK(!is_screen_locked_);
   DCHECK(HasAvailableConnectionMediums());
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
index b0828f6..5b9ceeba 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
@@ -163,7 +163,6 @@
   // PowerClient::Observer:
   void SuspendImminent() override;
   void SuspendDone() override;
-  void ScreenStateChanged(bool is_screen_on) override;
 
   base::ObserverList<TransferUpdateCallback>& GetReceiveCallbacksFromState(
       ReceiveSurfaceState state);
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
index 303cc483..552d4cb3 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
@@ -187,8 +187,7 @@
 
 class FakePowerClient : public PowerClient {
  public:
-  // Make setters public for testing.
-  using PowerClient::SetScreenOn;
+  // Make SetSuspended() public for testing.
   using PowerClient::SetSuspended;
 };
 
@@ -1714,34 +1713,6 @@
 }
 
 TEST_F(NearbySharingServiceImplTest,
-       ScreenOffRegisterReceiveSurfaceNotAdvertising) {
-  power_client_->SetScreenOn(false);
-  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
-  MockTransferUpdateCallback callback;
-  NearbySharingService::StatusCodes result = service_->RegisterReceiveSurface(
-      &callback, NearbySharingService::ReceiveSurfaceState::kForeground);
-  EXPECT_EQ(result, NearbySharingService::StatusCodes::kOk);
-  EXPECT_FALSE(fake_nearby_connections_manager_->IsAdvertising());
-  EXPECT_FALSE(fake_nearby_connections_manager_->is_shutdown());
-}
-
-TEST_F(NearbySharingServiceImplTest, SetScreenOffDuringAdvertising) {
-  SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
-  MockTransferUpdateCallback transfer_callback;
-  MockShareTargetDiscoveredCallback discovery_callback;
-  EXPECT_EQ(
-      NearbySharingService::StatusCodes::kOk,
-      service_->RegisterSendSurface(&transfer_callback, &discovery_callback,
-                                    SendSurfaceState::kForeground));
-  EXPECT_TRUE(fake_nearby_connections_manager_->IsDiscovering());
-
-  power_client_->SetScreenOn(false);
-  EXPECT_FALSE(fake_nearby_connections_manager_->IsDiscovering());
-  power_client_->SetScreenOn(true);
-  EXPECT_TRUE(fake_nearby_connections_manager_->IsDiscovering());
-}
-
-TEST_F(NearbySharingServiceImplTest,
        DataUsageChangedRegisterReceiveSurfaceRestartsAdvertising) {
   SetConnectionType(net::NetworkChangeNotifier::CONNECTION_WIFI);
 
diff --git a/chrome/browser/nearby_sharing/power_client.cc b/chrome/browser/nearby_sharing/power_client.cc
index 016a5f4c..f8c6469 100644
--- a/chrome/browser/nearby_sharing/power_client.cc
+++ b/chrome/browser/nearby_sharing/power_client.cc
@@ -4,15 +4,9 @@
 
 #include "chrome/browser/nearby_sharing/power_client.h"
 
-PowerClient::PowerClient() {
-  if (chromeos::PowerManagerClient::Get())
-    chromeos::PowerManagerClient::Get()->AddObserver(this);
-}
+PowerClient::PowerClient() = default;
 
-PowerClient::~PowerClient() {
-  if (chromeos::PowerManagerClient::Get())
-    chromeos::PowerManagerClient::Get()->RemoveObserver(this);
-}
+PowerClient::~PowerClient() = default;
 
 void PowerClient::AddObserver(PowerClient::Observer* observer) {
   observers_.AddObserver(observer);
@@ -26,10 +20,6 @@
   return is_suspended_;
 }
 
-bool PowerClient::IsScreenOn() {
-  return is_screen_on_;
-}
-
 void PowerClient::SetSuspended(bool is_suspended) {
   is_suspended_ = is_suspended;
   for (auto& observer : observers_) {
@@ -39,33 +29,3 @@
       observer.SuspendDone();
   }
 }
-
-void PowerClient::SetScreenOn(bool is_screen_on) {
-  is_screen_on_ = is_screen_on;
-  screen_state_notify_timer_.Stop();
-  for (auto& observer : observers_) {
-    observer.ScreenStateChanged(is_screen_on_);
-  }
-}
-
-void PowerClient::SuspendImminent(
-    power_manager::SuspendImminent::Reason reason) {
-  SetSuspended(true);
-}
-
-void PowerClient::SuspendDone(base::TimeDelta sleep_duration) {
-  SetSuspended(false);
-}
-
-void PowerClient::ScreenIdleStateChanged(
-    const power_manager::ScreenIdleState& state) {
-  bool new_state_on = !state.off();
-  if (is_screen_on_ && !new_state_on) {
-    screen_state_notify_timer_.Start(
-        FROM_HERE, base::TimeDelta::FromMinutes(1),
-        base::BindOnce(&PowerClient::SetScreenOn, base::Unretained(this),
-                       new_state_on));
-  } else if (!is_screen_on_ && new_state_on) {
-    SetScreenOn(new_state_on);
-  }
-}
diff --git a/chrome/browser/nearby_sharing/power_client.h b/chrome/browser/nearby_sharing/power_client.h
index 06fcd50..9a2c0d4 100644
--- a/chrome/browser/nearby_sharing/power_client.h
+++ b/chrome/browser/nearby_sharing/power_client.h
@@ -8,42 +8,28 @@
 #include <memory>
 
 #include "base/observer_list.h"
-#include "base/timer/timer.h"
-#include "chromeos/dbus/power/power_manager_client.h"
-#include "chromeos/dbus/power_manager/idle.pb.h"
 
-class PowerClient : public chromeos::PowerManagerClient::Observer {
+class PowerClient {
  public:
   class Observer : public base::CheckedObserver {
    public:
     virtual void SuspendImminent() {}
     virtual void SuspendDone() {}
-    virtual void ScreenStateChanged(bool is_screen_on) {}
   };
 
   PowerClient();
-  ~PowerClient() override;
+  virtual ~PowerClient();
 
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-  bool IsSuspended();
-  bool IsScreenOn();
+  virtual void AddObserver(Observer* observer);
+  virtual void RemoveObserver(Observer* observer);
+  virtual bool IsSuspended();
 
  protected:
-  void SetSuspended(bool is_suspended);
-  void SetScreenOn(bool is_screen_on);
+  void SetSuspended(bool suspended);
 
  private:
-  // chromeos::PowerManagerClient::Observer:
-  void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
-  void SuspendDone(base::TimeDelta sleep_duration) override;
-  void ScreenIdleStateChanged(
-      const power_manager::ScreenIdleState& state) override;
-
   base::ObserverList<Observer> observers_;
-  base::OneShotTimer screen_state_notify_timer_;
   bool is_suspended_ = false;
-  bool is_screen_on_ = true;
 };
 
 #endif  // CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_H_
diff --git a/chrome/browser/nearby_sharing/power_client_chromeos.cc b/chrome/browser/nearby_sharing/power_client_chromeos.cc
new file mode 100644
index 0000000..e5ca06e
--- /dev/null
+++ b/chrome/browser/nearby_sharing/power_client_chromeos.cc
@@ -0,0 +1,24 @@
+// Copyright 2020 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/nearby_sharing/power_client_chromeos.h"
+
+PowerClientChromeos::PowerClientChromeos() {
+  if (chromeos::PowerManagerClient::Get())
+    chromeos::PowerManagerClient::Get()->AddObserver(this);
+}
+
+PowerClientChromeos::~PowerClientChromeos() {
+  if (chromeos::PowerManagerClient::Get())
+    chromeos::PowerManagerClient::Get()->RemoveObserver(this);
+}
+
+void PowerClientChromeos::SuspendImminent(
+    power_manager::SuspendImminent::Reason reason) {
+  SetSuspended(true);
+}
+
+void PowerClientChromeos::SuspendDone(base::TimeDelta sleep_duration) {
+  SetSuspended(false);
+}
diff --git a/chrome/browser/nearby_sharing/power_client_chromeos.h b/chrome/browser/nearby_sharing/power_client_chromeos.h
new file mode 100644
index 0000000..d9095e33
--- /dev/null
+++ b/chrome/browser/nearby_sharing/power_client_chromeos.h
@@ -0,0 +1,24 @@
+// Copyright 2020 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_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
+#define CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
+
+#include "chrome/browser/nearby_sharing/power_client.h"
+
+#include "chromeos/dbus/power/power_manager_client.h"
+
+class PowerClientChromeos : public PowerClient,
+                            public chromeos::PowerManagerClient::Observer {
+ public:
+  PowerClientChromeos();
+  ~PowerClientChromeos() override;
+
+ private:
+  // chromeos::PowerManagerClient::Observer:
+  void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
+  void SuspendDone(base::TimeDelta sleep_duration) override;
+};
+
+#endif  // CHROME_BROWSER_NEARBY_SHARING_POWER_CLIENT_CHROMEOS_H_
diff --git a/chrome/browser/net/private_network_request_browsertest.cc b/chrome/browser/net/private_network_request_browsertest.cc
index 4776491..e5eba16 100644
--- a/chrome/browser/net/private_network_request_browsertest.cc
+++ b/chrome/browser/net/private_network_request_browsertest.cc
@@ -233,11 +233,11 @@
 
   EXPECT_TRUE(
       content::NavigateToURL(web_contents(), PublicNonSecureURL(*server)));
-  EXPECT_TRUE(content::ExecJs(web_contents(), R"(
+  EXPECT_EQ(true, content::EvalJs(web_contents(), R"(
     new Promise(resolve => {
       const child = document.createElement("iframe");
       child.src = "about:blank";
-      child.onload = resolve;
+      child.onload = () => { resolve(true); };
       document.body.appendChild(child);
     })
   )"));
@@ -261,13 +261,14 @@
     new Promise(resolve => {
       const child = document.createElement("iframe");
       child.src = $1;
-      child.onload = resolve;
+      child.onload = () => { resolve(true); };
       document.body.appendChild(child);
     })
   )";
-  EXPECT_TRUE(content::ExecJs(
-      web_contents(),
-      content::JsReplace(script_template, LocalNonSecureURL(*server))));
+  EXPECT_EQ(true,
+            content::EvalJs(web_contents(),
+                            content::JsReplace(script_template,
+                                               LocalNonSecureURL(*server))));
   EXPECT_TRUE(NavigateAndFlushHistograms());
 
   EXPECT_THAT(
@@ -300,10 +301,12 @@
 
     addChildFrame(document, "about:blank")
       .then(child => addChildFrame(child.contentDocument, $1))
+      .then(grandchild =>  true);
   )";
-  EXPECT_TRUE(content::ExecJs(
-      web_contents(),
-      content::JsReplace(script_template, LocalNonSecureURL(*server))));
+  EXPECT_EQ(true,
+            content::EvalJs(web_contents(),
+                            content::JsReplace(script_template,
+                                               LocalNonSecureURL(*server))));
   EXPECT_TRUE(NavigateAndFlushHistograms());
 
   EXPECT_THAT(
diff --git a/chrome/browser/page_annotations/DIR_METADATA b/chrome/browser/page_annotations/DIR_METADATA
new file mode 100644
index 0000000..a05e831
--- /dev/null
+++ b/chrome/browser/page_annotations/DIR_METADATA
@@ -0,0 +1,4 @@
+monorail {
+  component: "UI>Browser>Shopping"
+}
+os: ANDROID
diff --git a/chrome/browser/page_annotations/OWNERS b/chrome/browser/page_annotations/OWNERS
new file mode 100644
index 0000000..03269c6
--- /dev/null
+++ b/chrome/browser/page_annotations/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/persisted_state_db/OWNERS
\ No newline at end of file
diff --git a/chrome/browser/page_annotations/README b/chrome/browser/page_annotations/README
new file mode 100644
index 0000000..8ce6eb94
--- /dev/null
+++ b/chrome/browser/page_annotations/README
@@ -0,0 +1,6 @@
+This directory stores files related to Chrome's Page Annotations Service.
+
+Page Annotations Service is a URL-to-metadata mapping service where the metadata
+(aka annotations) can be generated on either the client or the server side. The
+service abstracts the details of the data acquisition and maintenance and
+exposes a simple URL lookup interface for consumers.
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index c3df0620..723d500 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -55,8 +55,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/browser/prerender_histograms.h"
 #include "components/no_state_prefetch/common/prerender_origin.h"
 #include "components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.h"
@@ -220,10 +220,10 @@
         no_state_prefetch_contents_factory->ExpectNoStatePrefetchContents(
             prerender::FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
 
-    std::unique_ptr<prerender::PrerenderHandle> prerender_handle =
+    std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle =
         no_state_prefetch_manager->AddPrerenderFromOmnibox(
             url, storage_namespace, gfx::Size(640, 480));
-    ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
+    ASSERT_EQ(no_state_prefetch_handle->contents(), test_prerender->contents());
 
     // The final status may be either  FINAL_STATUS_NOSTATE_PREFETCH_FINISHED or
     // FINAL_STATUS_RECENTLY_VISITED.
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreview.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreview.java
index a4864633..43fe59b 100644
--- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreview.java
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreview.java
@@ -10,6 +10,7 @@
 import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Callback;
@@ -24,6 +25,7 @@
 import org.chromium.chrome.browser.tab.TabViewProvider;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.paintpreview.player.PlayerManager;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.util.TokenHolder;
 
 /**
@@ -75,6 +77,11 @@
                 showToolbarPersistent();
                 setProgressPreventionNeeded(true);
             }
+
+            @Override
+            public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+                // Intentionally do nothing to prevent automatic observer removal on detachment.
+            }
         };
         mTab.addObserver(mTabObserver);
     }
diff --git a/chrome/browser/permissions/abusive_origin_permission_revocation_request.cc b/chrome/browser/permissions/abusive_origin_permission_revocation_request.cc
index a229fa2e..46fe4f9 100644
--- a/chrome/browser/permissions/abusive_origin_permission_revocation_request.cc
+++ b/chrome/browser/permissions/abusive_origin_permission_revocation_request.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/permissions/abusive_origin_notifications_permission_revocation_config.h"
-#include "chrome/browser/permissions/crowd_deny_preload_data.h"
 #include "chrome/browser/permissions/permission_manager_factory.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -109,58 +108,12 @@
 AbusiveOriginPermissionRevocationRequest::
     ~AbusiveOriginPermissionRevocationRequest() = default;
 
-void AbusiveOriginPermissionRevocationRequest::CheckAndRevokeIfAbusive() {
-  DCHECK(profile_);
-  DCHECK(callback_);
-
-  if (!AbusiveOriginNotificationsPermissionRevocationConfig::IsEnabled() ||
-      !safe_browsing::IsSafeBrowsingEnabled(*profile_->GetPrefs()) ||
-      IsOriginExemptedFromFutureRevocations(profile_, origin_)) {
-    std::move(callback_).Run(Outcome::PERMISSION_NOT_REVOKED);
-    return;
-  }
-
-  CrowdDenyPreloadData* crowd_deny = CrowdDenyPreloadData::GetInstance();
-  permissions::PermissionUmaUtil::RecordCrowdDenyIsLoadedAtAbuseCheckTime(
-      crowd_deny->is_loaded_from_disk());
-  permissions::PermissionUmaUtil::RecordCrowdDenyVersionAtAbuseCheckTime(
-      crowd_deny->version_on_disk());
-
-  const CrowdDenyPreloadData::SiteReputation* site_reputation =
-      crowd_deny->GetReputationDataForSite(url::Origin::Create(origin_));
-  if (site_reputation && !site_reputation->warning_only() &&
-      (site_reputation->notification_ux_quality() ==
-           CrowdDenyPreloadData::SiteReputation::ABUSIVE_PROMPTS ||
-       site_reputation->notification_ux_quality() ==
-           CrowdDenyPreloadData::SiteReputation::ABUSIVE_CONTENT)) {
-    DCHECK(g_browser_process->safe_browsing_service());
-
-    if (g_browser_process->safe_browsing_service()) {
-      safe_browsing_request_.emplace(
-          g_browser_process->safe_browsing_service()->database_manager(),
-          base::DefaultClock::GetInstance(), url::Origin::Create(origin_),
-          base::BindOnce(&AbusiveOriginPermissionRevocationRequest::
-                             OnSafeBrowsingVerdictReceived,
-                         weak_factory_.GetWeakPtr()));
-      return;
-    }
-  }
-
-  std::move(callback_).Run(Outcome::PERMISSION_NOT_REVOKED);
-}
-
-void AbusiveOriginPermissionRevocationRequest::OnSafeBrowsingVerdictReceived(
-    CrowdDenySafeBrowsingRequest::Verdict verdict) {
-  DCHECK(safe_browsing_request_);
-  DCHECK(profile_);
-  DCHECK(callback_);
-
-  if (verdict == CrowdDenySafeBrowsingRequest::Verdict::kUnacceptable) {
-    RevokePermission(origin_, profile_);
-    std::move(callback_).Run(Outcome::PERMISSION_REVOKED_DUE_TO_ABUSE);
-  } else {
-    std::move(callback_).Run(Outcome::PERMISSION_NOT_REVOKED);
-  }
+// static
+void AbusiveOriginPermissionRevocationRequest::
+    ExemptOriginFromFutureRevocations(Profile* profile, const GURL& origin) {
+  OriginStatus status = GetOriginStatus(profile, origin);
+  status.is_exempt_from_future_revocations = true;
+  SetOriginStatus(profile, origin, status);
 }
 
 // static
@@ -179,10 +132,82 @@
   return status.has_been_previously_revoked;
 }
 
-// static
-void AbusiveOriginPermissionRevocationRequest::
-    ExemptOriginFromFutureRevocations(Profile* profile, const GURL& origin) {
-  OriginStatus status = GetOriginStatus(profile, origin);
-  status.is_exempt_from_future_revocations = true;
-  SetOriginStatus(profile, origin, status);
+void AbusiveOriginPermissionRevocationRequest::CheckAndRevokeIfAbusive() {
+  DCHECK(profile_);
+  DCHECK(callback_);
+
+  if (!AbusiveOriginNotificationsPermissionRevocationConfig::IsEnabled() ||
+      !safe_browsing::IsSafeBrowsingEnabled(*profile_->GetPrefs()) ||
+      IsOriginExemptedFromFutureRevocations(profile_, origin_)) {
+    NotifyCallback(Outcome::PERMISSION_NOT_REVOKED);
+    return;
+  }
+
+  CrowdDenyPreloadData* crowd_deny = CrowdDenyPreloadData::GetInstance();
+  permissions::PermissionUmaUtil::RecordCrowdDenyVersionAtAbuseCheckTime(
+      crowd_deny->version_on_disk());
+
+  // Empty |version_on_disk| means the CrowdDeny component has not yet been
+  // loaded from a disk.
+  if (!crowd_deny->version_on_disk().has_value())
+    crowd_deny_request_start_time_ = base::TimeTicks::Now();
+
+  crowd_deny->GetReputationDataForSiteAsync(
+      url::Origin::Create(origin_),
+      base::BindOnce(
+          &AbusiveOriginPermissionRevocationRequest::OnSiteReputationReady,
+          weak_factory_.GetWeakPtr()));
+}
+
+void AbusiveOriginPermissionRevocationRequest::OnSiteReputationReady(
+    const CrowdDenyPreloadData::SiteReputation* site_reputation) {
+  if (site_reputation && !site_reputation->warning_only() &&
+      (site_reputation->notification_ux_quality() ==
+           CrowdDenyPreloadData::SiteReputation::ABUSIVE_PROMPTS ||
+       site_reputation->notification_ux_quality() ==
+           CrowdDenyPreloadData::SiteReputation::ABUSIVE_CONTENT)) {
+    DCHECK(g_browser_process->safe_browsing_service());
+
+    if (crowd_deny_request_start_time_.has_value()) {
+      crowd_deny_request_duration_ =
+          base::TimeTicks::Now() - crowd_deny_request_start_time_.value();
+    }
+
+    if (g_browser_process->safe_browsing_service()) {
+      safe_browsing_request_.emplace(
+          g_browser_process->safe_browsing_service()->database_manager(),
+          base::DefaultClock::GetInstance(), url::Origin::Create(origin_),
+          base::BindOnce(&AbusiveOriginPermissionRevocationRequest::
+                             OnSafeBrowsingVerdictReceived,
+                         weak_factory_.GetWeakPtr()));
+      return;
+    }
+  }
+
+  crowd_deny_request_start_time_.reset();
+  NotifyCallback(Outcome::PERMISSION_NOT_REVOKED);
+}
+
+void AbusiveOriginPermissionRevocationRequest::OnSafeBrowsingVerdictReceived(
+    CrowdDenySafeBrowsingRequest::Verdict verdict) {
+  DCHECK(safe_browsing_request_);
+  DCHECK(profile_);
+  DCHECK(callback_);
+
+  if (verdict == CrowdDenySafeBrowsingRequest::Verdict::kUnacceptable) {
+    RevokePermission(origin_, profile_);
+    NotifyCallback(Outcome::PERMISSION_REVOKED_DUE_TO_ABUSE);
+  } else {
+    NotifyCallback(Outcome::PERMISSION_NOT_REVOKED);
+  }
+}
+
+void AbusiveOriginPermissionRevocationRequest::NotifyCallback(Outcome outcome) {
+  if (outcome == Outcome::PERMISSION_NOT_REVOKED &&
+      crowd_deny_request_duration_.has_value()) {
+    permissions::PermissionUmaUtil::RecordCrowdDenyDelayedPushNotification(
+        crowd_deny_request_duration_.value());
+  }
+
+  std::move(callback_).Run(outcome);
 }
diff --git a/chrome/browser/permissions/abusive_origin_permission_revocation_request.h b/chrome/browser/permissions/abusive_origin_permission_revocation_request.h
index 18aeb4b..be61d52 100644
--- a/chrome/browser/permissions/abusive_origin_permission_revocation_request.h
+++ b/chrome/browser/permissions/abusive_origin_permission_revocation_request.h
@@ -7,7 +7,7 @@
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
-#include "base/optional.h"
+#include "chrome/browser/permissions/crowd_deny_preload_data.h"
 #include "chrome/browser/permissions/crowd_deny_safe_browsing_request.h"
 #include "url/gurl.h"
 
@@ -57,13 +57,20 @@
   // yes, the notifications permission will be revoked. |callback_| will be
   // synchronously called with the result.
   void CheckAndRevokeIfAbusive();
+  void OnSiteReputationReady(
+      const CrowdDenyPreloadData::SiteReputation* reputation);
   void OnSafeBrowsingVerdictReceived(
       CrowdDenySafeBrowsingRequest::Verdict verdict);
+  void NotifyCallback(Outcome outcome);
 
   base::Optional<CrowdDenySafeBrowsingRequest> safe_browsing_request_;
   Profile* profile_;
   const GURL origin_;
   OutcomeCallback callback_;
+  // The time when the Crowd Deny request starts.
+  base::Optional<base::TimeTicks> crowd_deny_request_start_time_;
+  // The Crowd Deny component load duration.
+  base::Optional<base::TimeDelta> crowd_deny_request_duration_;
   base::WeakPtrFactory<AbusiveOriginPermissionRevocationRequest> weak_factory_{
       this};
 };
diff --git a/chrome/browser/permissions/abusive_origin_permission_revocation_request_unittests.cc b/chrome/browser/permissions/abusive_origin_permission_revocation_request_unittests.cc
index 4ad9276..6417173d 100644
--- a/chrome/browser/permissions/abusive_origin_permission_revocation_request_unittests.cc
+++ b/chrome/browser/permissions/abusive_origin_permission_revocation_request_unittests.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/permissions/abusive_origin_permission_revocation_request.h"
 
 #include "base/files/scoped_temp_dir.h"
+#include "base/run_loop.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -81,12 +82,14 @@
   void QueryAndExpectDecisionForUrl(const GURL& origin,
                                     Outcome expected_result) {
     base::MockOnceCallback<void(Outcome)> mock_callback_receiver;
-    permission_revocation_ =
+    base::RunLoop run_loop;
+    auto permission_revocation =
         std::make_unique<AbusiveOriginPermissionRevocationRequest>(
             testing_profile_.get(), origin, mock_callback_receiver.Get());
-    EXPECT_CALL(mock_callback_receiver, Run(expected_result));
-    task_environment_.RunUntilIdle();
-    permission_revocation_.reset();
+    EXPECT_CALL(mock_callback_receiver, Run(expected_result))
+        .WillOnce(
+            testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+    run_loop.Run();
   }
 
   void SetPermission(const GURL& origin, const ContentSetting value) {
@@ -114,8 +117,6 @@
   content::BrowserTaskEnvironment task_environment_;
   testing::ScopedCrowdDenyPreloadDataOverride testing_preload_data_;
   std::unique_ptr<TestingProfile> testing_profile_;
-  std::unique_ptr<AbusiveOriginPermissionRevocationRequest>
-      permission_revocation_;
   scoped_refptr<CrowdDenyFakeSafeBrowsingDatabaseManager>
       fake_database_manager_;
   std::unique_ptr<safe_browsing::TestSafeBrowsingServiceFactory>
@@ -231,6 +232,52 @@
   QueryAndExpectDecisionForUrl(unknown_origin, Outcome::PERMISSION_NOT_REVOKED);
 }
 
+TEST_F(AbusiveOriginPermissionRevocationRequestTest, PreloadDataTest_Async) {
+  auto* instance = CrowdDenyPreloadData::GetInstance();
+  // From this point on CrowdDenyPreloadData is not usable for origins
+  // verification.
+  instance->set_is_ready_to_use_for_testing(false);
+
+  const GURL abusive_content_origin_to_revoke =
+      GURL("https://abusive-content.com/");
+  base::MockOnceCallback<void(Outcome)> mock_callback_receiver_1;
+  auto permission_revocation_1 =
+      std::make_unique<AbusiveOriginPermissionRevocationRequest>(
+          GetTestingProfile(), abusive_content_origin_to_revoke,
+          mock_callback_receiver_1.Get());
+
+  const GURL abusive_prompts_origin_to_revoke =
+      GURL("https://abusive-prompts.com/");
+  base::MockOnceCallback<void(Outcome)> mock_callback_receiver_2;
+  auto permission_revocation_2 =
+      std::make_unique<AbusiveOriginPermissionRevocationRequest>(
+          GetTestingProfile(), abusive_prompts_origin_to_revoke,
+          mock_callback_receiver_2.Get());
+
+  base::RunLoop run_loop;
+  EXPECT_CALL(mock_callback_receiver_1,
+              Run(Outcome::PERMISSION_REVOKED_DUE_TO_ABUSE));
+
+  EXPECT_CALL(mock_callback_receiver_2,
+              Run(Outcome::PERMISSION_REVOKED_DUE_TO_ABUSE))
+      .WillOnce(testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
+
+  SetPermission(abusive_content_origin_to_revoke, CONTENT_SETTING_ALLOW);
+  SetPermission(abusive_prompts_origin_to_revoke, CONTENT_SETTING_ALLOW);
+
+  AddToSafeBrowsingBlocklist(abusive_content_origin_to_revoke);
+  AddToSafeBrowsingBlocklist(abusive_prompts_origin_to_revoke);
+
+  // At this point CrowdDenyPreloadData will be reactivated by a new data set.
+  AddToPreloadDataBlocklist(abusive_content_origin_to_revoke,
+                            SiteReputation::ABUSIVE_CONTENT,
+                            /*has_warning=*/false);
+  AddToPreloadDataBlocklist(abusive_prompts_origin_to_revoke,
+                            SiteReputation::ABUSIVE_PROMPTS,
+                            /*has_warning=*/false);
+  run_loop.Run();
+}
+
 TEST_F(AbusiveOriginPermissionRevocationRequestTest,
        PreloadDataTestWithWarning) {
   const GURL abusive_content_origin_to_revoke =
diff --git a/chrome/browser/permissions/contextual_notification_permission_ui_selector.cc b/chrome/browser/permissions/contextual_notification_permission_ui_selector.cc
index f0e06da..97ceabe 100644
--- a/chrome/browser/permissions/contextual_notification_permission_ui_selector.cc
+++ b/chrome/browser/permissions/contextual_notification_permission_ui_selector.cc
@@ -15,7 +15,6 @@
 #include "base/task/post_task.h"
 #include "base/time/default_clock.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/permissions/crowd_deny_preload_data.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_config.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -161,8 +160,18 @@
 
 void ContextualNotificationPermissionUiSelector::EvaluatePerSiteTriggers(
     const url::Origin& origin) {
-  base::Optional<Decision> decision = GetDecisionBasedOnSiteReputation(
-      CrowdDenyPreloadData::GetInstance()->GetReputationDataForSite(origin));
+  CrowdDenyPreloadData::GetInstance()->GetReputationDataForSiteAsync(
+      origin,
+      base::BindOnce(
+          &ContextualNotificationPermissionUiSelector::OnSiteReputationReady,
+          weak_factory_.GetWeakPtr(), origin));
+}
+
+void ContextualNotificationPermissionUiSelector::OnSiteReputationReady(
+    const url::Origin& origin,
+    const CrowdDenyPreloadData::SiteReputation* reputation) {
+  base::Optional<Decision> decision =
+      GetDecisionBasedOnSiteReputation(reputation);
 
   // If the PreloadData suggests this is an unacceptable site, ping Safe
   // Browsing to verify; but do not ping if it is not warranted.
diff --git a/chrome/browser/permissions/contextual_notification_permission_ui_selector.h b/chrome/browser/permissions/contextual_notification_permission_ui_selector.h
index abbf37f6..a940831 100644
--- a/chrome/browser/permissions/contextual_notification_permission_ui_selector.h
+++ b/chrome/browser/permissions/contextual_notification_permission_ui_selector.h
@@ -7,6 +7,7 @@
 
 #include "base/callback.h"
 #include "base/optional.h"
+#include "chrome/browser/permissions/crowd_deny_preload_data.h"
 #include "chrome/browser/permissions/crowd_deny_safe_browsing_request.h"
 #include "components/permissions/notification_permission_ui_selector.h"
 
@@ -51,8 +52,14 @@
       CrowdDenySafeBrowsingRequest::Verdict verdict);
   void Notify(const Decision& decision);
 
+  void OnSiteReputationReady(
+      const url::Origin& origin,
+      const CrowdDenyPreloadData::SiteReputation* reputation);
+
   base::Optional<CrowdDenySafeBrowsingRequest> safe_browsing_request_;
   DecisionMadeCallback callback_;
+  base::WeakPtrFactory<ContextualNotificationPermissionUiSelector>
+      weak_factory_{this};
 };
 
 #endif  // CHROME_BROWSER_PERMISSIONS_CONTEXTUAL_NOTIFICATION_PERMISSION_UI_SELECTOR_H_
diff --git a/chrome/browser/permissions/crowd_deny_preload_data.cc b/chrome/browser/permissions/crowd_deny_preload_data.cc
index 9ec06ba..112b687 100644
--- a/chrome/browser/permissions/crowd_deny_preload_data.cc
+++ b/chrome/browser/permissions/crowd_deny_preload_data.cc
@@ -48,6 +48,13 @@
   return DomainToReputationMap(std::move(domain_reputation_pairs));
 }
 
+PendingOrigin::PendingOrigin(
+    url::Origin origin,
+    base::OnceCallback<void(const chrome_browser_crowd_deny::SiteReputation*)>
+        callback)
+    : origin(std::move(origin)), callback(std::move(callback)) {}
+PendingOrigin::~PendingOrigin() = default;
+
 }  // namespace
 
 CrowdDenyPreloadData::CrowdDenyPreloadData() {
@@ -63,6 +70,30 @@
   return instance.get();
 }
 
+void CrowdDenyPreloadData::GetReputationDataForSiteAsync(
+    const url::Origin& origin,
+    SiteReputationCallback callback) {
+  if (is_ready_to_use_) {
+    std::move(callback).Run(GetReputationDataForSite(origin));
+  } else {
+    origins_pending_verification_.emplace(origin, std::move(callback));
+  }
+}
+
+void CrowdDenyPreloadData::LoadFromDisk(const base::FilePath& proto_path,
+                                        const base::Version& version) {
+  version_on_disk_ = version;
+  is_ready_to_use_ = false;
+  // On failure, LoadAndParseAndIndexPreloadDataFromDisk will return an empty
+  // map. Replace the in-memory state with that regardless, so that the stale
+  // old data will no longer be used.
+  base::PostTaskAndReplyWithResult(
+      loading_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&LoadAndParseAndIndexPreloadDataFromDisk, proto_path),
+      base::BindOnce(&CrowdDenyPreloadData::SetSiteReputations,
+                     base::Unretained(this)));
+}
+
 const CrowdDenyPreloadData::SiteReputation*
 CrowdDenyPreloadData::GetReputationDataForSite(
     const url::Origin& origin) const {
@@ -86,17 +117,24 @@
   return nullptr;
 }
 
-void CrowdDenyPreloadData::LoadFromDisk(const base::FilePath& proto_path,
-                                        const base::Version& version) {
-  version_on_disk_ = version;
-  // On failure, LoadAndParseAndIndexPreloadDataFromDisk will return an empty
-  // map. Replace the in-memory state with that regardless, so that the stale
-  // old data will no longer be used.
-  base::PostTaskAndReplyWithResult(
-      loading_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&LoadAndParseAndIndexPreloadDataFromDisk, proto_path),
-      base::BindOnce(&CrowdDenyPreloadData::set_site_reputations,
-                     base::Unretained(this)));
+void CrowdDenyPreloadData::SetSiteReputations(DomainToReputationMap map) {
+  domain_to_reputation_map_ = std::move(map);
+  is_ready_to_use_ = true;
+
+  CheckOriginsPendingVerification();
+}
+
+void CrowdDenyPreloadData::CheckOriginsPendingVerification() {
+  if (origins_pending_verification_.empty())
+    return;
+
+  GetReputationDataForSiteAsync(
+      origins_pending_verification_.front().origin,
+      std::move(origins_pending_verification_.front().callback));
+  origins_pending_verification_.pop();
+  // The |origins_pending_verification_| might not be empty, check the next
+  // item.
+  CheckOriginsPendingVerification();
 }
 
 CrowdDenyPreloadData::DomainToReputationMap
@@ -113,8 +151,7 @@
 }
 
 ScopedCrowdDenyPreloadDataOverride::~ScopedCrowdDenyPreloadDataOverride() {
-  CrowdDenyPreloadData::GetInstance()->set_site_reputations(
-      std::move(old_map_));
+  CrowdDenyPreloadData::GetInstance()->SetSiteReputations(std::move(old_map_));
 }
 
 void ScopedCrowdDenyPreloadDataOverride::SetOriginReputation(
@@ -123,7 +160,7 @@
   auto* instance = CrowdDenyPreloadData::GetInstance();
   DomainToReputationMap testing_map = instance->TakeSiteReputations();
   testing_map[origin.host()] = std::move(site_reputation);
-  instance->set_site_reputations(std::move(testing_map));
+  instance->SetSiteReputations(std::move(testing_map));
 }
 
 void ScopedCrowdDenyPreloadDataOverride::ClearAllReputations() {
diff --git a/chrome/browser/permissions/crowd_deny_preload_data.h b/chrome/browser/permissions/crowd_deny_preload_data.h
index 2ea5fd2..28be5dd 100644
--- a/chrome/browser/permissions/crowd_deny_preload_data.h
+++ b/chrome/browser/permissions/crowd_deny_preload_data.h
@@ -6,11 +6,14 @@
 #define CHROME_BROWSER_PERMISSIONS_CROWD_DENY_PRELOAD_DATA_H_
 
 #include <memory>
+#include <queue>
 #include <utility>
 
+#include "base/callback.h"
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/optional.h"
 #include "base/version.h"
 #include "chrome/browser/permissions/crowd_deny.pb.h"
 #include "url/origin.h"
@@ -24,6 +27,20 @@
 class ScopedCrowdDenyPreloadDataOverride;
 }
 
+namespace {
+struct PendingOrigin {
+  PendingOrigin(
+      url::Origin origin,
+      base::OnceCallback<void(const chrome_browser_crowd_deny::SiteReputation*)>
+          callback);
+  ~PendingOrigin();
+
+  url::Origin origin;
+  base::OnceCallback<void(const chrome_browser_crowd_deny::SiteReputation*)>
+      callback;
+};
+}  // namespace
+
 // Stores information relevant for making permission decision on popular sites.
 //
 // The preloaded list contains reputation data for popular sites, and is
@@ -35,43 +52,51 @@
   using DomainToReputationMap = base::flat_map<std::string, SiteReputation>;
   using PreloadData = chrome_browser_crowd_deny::PreloadData;
 
+  using SiteReputationCallback =
+      base::OnceCallback<void(const SiteReputation*)>;
+
   CrowdDenyPreloadData();
   ~CrowdDenyPreloadData();
 
   static CrowdDenyPreloadData* GetInstance();
 
-  // Returns preloaded site reputation data for |origin| if available, or
-  // nullptr otherwise.
+  // Delivers preloaded site reputation data for |origin| via |callback|.
   //
   // Because there is no way to establish the identity of insecure origins,
   // reputation data is only ever provided if |origin| has HTTPS scheme. The
   // port of |origin| is ignored.
-  const SiteReputation* GetReputationDataForSite(
-      const url::Origin& origin) const;
+  void GetReputationDataForSiteAsync(const url::Origin& origin,
+                                     SiteReputationCallback callback);
 
   // Parses a single instance of chrome_browser_crowd_deny::PreloadData message
   // in binary wire format from the file at |preload_data_path|.
   void LoadFromDisk(const base::FilePath& preload_data_path,
                     const base::Version& version);
 
-  inline bool is_loaded_from_disk() { return is_loaded_from_disk_; }
   inline const base::Optional<base::Version>& version_on_disk() {
     return version_on_disk_;
   }
 
- private:
-  friend class testing::ScopedCrowdDenyPreloadDataOverride;
-
-  void set_site_reputations(DomainToReputationMap map) {
-    domain_to_reputation_map_ = std::move(map);
-    is_loaded_from_disk_ = true;
+  inline void set_is_ready_to_use_for_testing(bool is_ready) {
+    is_ready_to_use_ = is_ready;
   }
 
+ private:
+  friend class testing::ScopedCrowdDenyPreloadDataOverride;
+  friend class CrowdDenyPreloadDataTest;
+
+  const SiteReputation* GetReputationDataForSite(
+      const url::Origin& origin) const;
+  void SetSiteReputations(DomainToReputationMap map);
+  void CheckOriginsPendingVerification();
   DomainToReputationMap TakeSiteReputations();
-  bool is_loaded_from_disk_ = false;
+  // The only moment when CrowdDenyPreloadData is not ready to use is during
+  // loading from disk.
+  bool is_ready_to_use_ = true;
   DomainToReputationMap domain_to_reputation_map_;
   scoped_refptr<base::SequencedTaskRunner> loading_task_runner_;
   base::Optional<base::Version> version_on_disk_;
+  std::queue<PendingOrigin> origins_pending_verification_;
 
   DISALLOW_COPY_AND_ASSIGN(CrowdDenyPreloadData);
 };
diff --git a/chrome/browser/permissions/crowd_deny_preload_data_unittest.cc b/chrome/browser/permissions/crowd_deny_preload_data_unittest.cc
index 7795204..a491de302 100644
--- a/chrome/browser/permissions/crowd_deny_preload_data_unittest.cc
+++ b/chrome/browser/permissions/crowd_deny_preload_data_unittest.cc
@@ -131,6 +131,10 @@
     }
   }
 
+  const SiteReputation* GetReputationDataForSite(const url::Origin& origin) {
+    return preload_data()->GetReputationDataForSite(origin);
+  }
+
  private:
   base::test::TaskEnvironment task_environment_;
   base::ScopedTempDir scoped_temp_dir_;
@@ -167,24 +171,22 @@
 TEST_F(CrowdDenyPreloadDataTest, DataIntegrityAndDefaults) {
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadCannedTestData());
 
-  const auto* data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginAlpha)));
+  const auto* data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginAlpha)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainAlpha, data->domain());
   EXPECT_EQ(SiteReputation::UNKNOWN, data->notification_ux_quality());
   EXPECT_FALSE(data->include_subdomains());
   EXPECT_FALSE(data->warning_only());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginBeta)));
+  data = GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginBeta)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainBeta, data->domain());
   EXPECT_EQ(SiteReputation::ACCEPTABLE, data->notification_ux_quality());
   EXPECT_FALSE(data->include_subdomains());
   EXPECT_FALSE(data->warning_only());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginGamma)));
+  data = GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginGamma)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainGamma, data->domain());
   EXPECT_EQ(SiteReputation::UNSOLICITED_PROMPTS,
@@ -192,24 +194,22 @@
   EXPECT_FALSE(data->include_subdomains());
   EXPECT_FALSE(data->warning_only());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginDelta)));
+  data = GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginDelta)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
   EXPECT_EQ(SiteReputation::ABUSIVE_PROMPTS, data->notification_ux_quality());
   EXPECT_TRUE(data->include_subdomains());
   EXPECT_TRUE(data->warning_only());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginEpsilon)));
+  data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginEpsilon)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainEpsilon, data->domain());
   EXPECT_EQ(SiteReputation::UNKNOWN, data->notification_ux_quality());
   EXPECT_FALSE(data->include_subdomains());
   EXPECT_FALSE(data->warning_only());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginZeta)));
+  data = GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginZeta)));
   EXPECT_FALSE(data);
 }
 
@@ -222,56 +222,55 @@
   };
 
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadCannedTestData());
-  EXPECT_TRUE(preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginAlpha))));
+  EXPECT_TRUE(
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginAlpha))));
 
   for (const char* non_https_origin : kNonHttpsOrigins) {
     SCOPED_TRACE(non_https_origin);
-    EXPECT_FALSE(preload_data()->GetReputationDataForSite(
-        url::Origin::Create(GURL(non_https_origin))));
+    EXPECT_FALSE(
+        GetReputationDataForSite(url::Origin::Create(GURL(non_https_origin))));
   }
 }
 
 TEST_F(CrowdDenyPreloadDataTest, GetReputationIgnoresPort) {
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadCannedTestData());
 
-  EXPECT_TRUE(preload_data()->GetReputationDataForSite(
+  EXPECT_TRUE(GetReputationDataForSite(
       url::Origin::Create(GURL("https://alpha.com:443"))));
-  EXPECT_TRUE(preload_data()->GetReputationDataForSite(
+  EXPECT_TRUE(GetReputationDataForSite(
       url::Origin::Create(GURL("https://alpha.com:1234"))));
 }
 
 TEST_F(CrowdDenyPreloadDataTest, GetReputationWithSubdomainMatching) {
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadCannedTestData());
 
-  const auto* data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginDelta)));
+  const auto* data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginDelta)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
   ASSERT_TRUE(data->include_subdomains());
 
-  data = preload_data()->GetReputationDataForSite(
+  data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginSubdomainOfDelta1)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
 
-  data = preload_data()->GetReputationDataForSite(
+  data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginSubdomainOfDelta2)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
 
-  data = preload_data()->GetReputationDataForSite(
+  data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginNotSubdomainOfDelta)));
   EXPECT_FALSE(data);
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginAlpha)));
+  data = GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginAlpha)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainAlpha, data->domain());
   ASSERT_FALSE(data->include_subdomains());
 
   // Should not return `alpha.com` because |include_subdomains| is not set.
-  data = preload_data()->GetReputationDataForSite(
+  data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginSubdomainOfAlpha)));
   EXPECT_FALSE(data);
 }
@@ -293,13 +292,13 @@
 
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadTestData(std::move(test_data)));
 
-  const auto* data = preload_data()->GetReputationDataForSite(
+  const auto* data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginSubdomainOfDelta1)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestSubdomainOfDelta1, data->domain());
   EXPECT_EQ(SiteReputation::ACCEPTABLE, data->notification_ux_quality());
 
-  data = preload_data()->GetReputationDataForSite(
+  data = GetReputationDataForSite(
       url::Origin::Create(GURL(kTestOriginSubdomainOfDelta2)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
@@ -327,22 +326,22 @@
   ASSERT_NO_FATAL_FAILURE(SerializeAndLoadTestData(std::move(test_data_v2)));
 
   // Check that the updated preload data is visible.
-  EXPECT_FALSE(preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginAlpha))));
-  EXPECT_FALSE(preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginBeta))));
-  EXPECT_FALSE(preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginGamma))));
+  EXPECT_FALSE(
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginAlpha))));
+  EXPECT_FALSE(
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginBeta))));
+  EXPECT_FALSE(
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginGamma))));
 
-  const auto* data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginDelta)));
+  const auto* data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginDelta)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainDelta, data->domain());
   EXPECT_EQ(SiteReputation::UNSOLICITED_PROMPTS,
             data->notification_ux_quality());
 
-  data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginEpsilon)));
+  data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginEpsilon)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainEpsilon, data->domain());
   EXPECT_EQ(SiteReputation::ACCEPTABLE, data->notification_ux_quality());
@@ -410,12 +409,12 @@
   task_environment()->RunUntilIdle();
 
   // Expect the new version to have become visible.
-  const auto* data = preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginEpsilon)));
+  const auto* data =
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginEpsilon)));
   ASSERT_TRUE(data);
   EXPECT_EQ(kTestDomainEpsilon, data->domain());
   EXPECT_EQ(SiteReputation::ACCEPTABLE, data->notification_ux_quality());
 
-  EXPECT_FALSE(preload_data()->GetReputationDataForSite(
-      url::Origin::Create(GURL(kTestOriginDelta))));
+  EXPECT_FALSE(
+      GetReputationDataForSite(url::Origin::Create(GURL(kTestOriginDelta))));
 }
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
index 03a63250..6b29a57 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -371,9 +371,16 @@
   std::unique_ptr<SkBitmap> result_bitmap_;
 };
 
+// This is disabled due to flakiness: https://crbug.com/1171245.
+#if defined(OS_MAC)
+#define MAYBE_VideoPlay DISABLED_VideoPlay
+#else
+#define MAYBE_VideoPlay VideoPlay
+#endif
 // Plays a video and then trigger Picture-in-Picture. Grabs a screenshot of
 // Picture-in-Picture window and verifies it's as expected.
-IN_PROC_BROWSER_TEST_F(PictureInPicturePixelComparisonBrowserTest, VideoPlay) {
+IN_PROC_BROWSER_TEST_F(PictureInPicturePixelComparisonBrowserTest,
+                       MAYBE_VideoPlay) {
   base::ScopedAllowBlockingForTesting allow_blocking;
   LoadTabAndEnterPictureInPicture(
       browser(), base::FilePath(FILE_PATH_LITERAL(
@@ -407,10 +414,16 @@
   EXPECT_TRUE(CompareImages(GetResultBitmap(), expected_image));
 }
 
+// This is disabled due to flakiness: https://crbug.com/1171245.
+#if defined(OS_MAC)
+#define MAYBE_PlayAndPauseControls DISABLED_PlayAndPauseControls
+#else
+#define MAYBE_PlayAndPauseControls PlayAndPauseControls
+#endif
 // Plays a video in PiP. Trigger the play and pause control in PiP by using a
 // mouse move. Capture the images and verift they are expected.
 IN_PROC_BROWSER_TEST_F(PictureInPicturePixelComparisonBrowserTest,
-                       PlayAndPauseControls) {
+                       MAYBE_PlayAndPauseControls) {
   base::ScopedAllowBlockingForTesting allow_blocking;
   LoadTabAndEnterPictureInPicture(
       browser(), base::FilePath(FILE_PATH_LITERAL(
diff --git a/chrome/browser/policy/content_settings_policy_browsertest.cc b/chrome/browser/policy/content_settings_policy_browsertest.cc
index c1a4299..8dc95c4 100644
--- a/chrome/browser/policy/content_settings_policy_browsertest.cc
+++ b/chrome/browser/policy/content_settings_policy_browsertest.cc
@@ -279,7 +279,7 @@
 
   // By default, we should block requests.
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://bleep.com")));
+      settings_map, url::Origin::Create(GURL("http://bleep.com"))));
 
   PolicyMap policies;
   SetPolicy(&policies, key::kInsecurePrivateNetworkRequestsAllowed,
@@ -288,7 +288,7 @@
 
   // Explicitly-disallowing is the same as not setting the policy.
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://bleep.com")));
+      settings_map, url::Origin::Create(GURL("http://bleep.com"))));
 
   base::Value allowlist(base::Value::Type::LIST);
   allowlist.Append(base::Value("http://bleep.com"));
@@ -297,20 +297,31 @@
             std::move(allowlist));
   UpdateProviderPolicy(policies);
 
+  // Domain is not the in allowlist.
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://default.com")));
+      settings_map, url::Origin::Create(GURL("http://default.com"))));
 
+  // Path does not matter, only the origin.
   EXPECT_TRUE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://bleep.com/heyo")));
+      settings_map, url::Origin::Create(GURL("http://bleep.com/heyo"))));
 
+  // Scheme matters: https is not http.
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("https://bleep.com")));
+      settings_map, url::Origin::Create(GURL("https://bleep.com"))));
 
+  // Port is checked too.
   EXPECT_TRUE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://woohoo.com:1234/index.html")));
+      settings_map,
+      url::Origin::Create(GURL("http://woohoo.com:1234/index.html"))));
 
+  // The wrong port does not match (default is 80).
   EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
-      settings_map, GURL("http://woohoo.com/index.html")));
+      settings_map, url::Origin::Create(GURL("http://woohoo.com/index.html"))));
+
+  // Opaque origins never match the allowlist.
+  EXPECT_FALSE(content_settings::ShouldAllowInsecurePrivateNetworkRequests(
+      settings_map,
+      url::Origin::Create(GURL("http://bleep.com")).DeriveNewOpaqueOrigin()));
 }
 
 class ScrollToTextFragmentPolicyTest
diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc
index dc7e6736..ca1562bd 100644
--- a/chrome/browser/predictors/autocomplete_action_predictor.cc
+++ b/chrome/browser/predictors/autocomplete_action_predictor.cc
@@ -23,8 +23,8 @@
 #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/history/core/browser/in_memory_database.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/browser/omnibox_log.h"
@@ -106,8 +106,8 @@
     main_profile_predictor_->incognito_predictor_ = nullptr;
   else if (incognito_predictor_)
     incognito_predictor_->main_profile_predictor_ = nullptr;
-  if (prerender_handle_.get())
-    prerender_handle_->OnCancel();
+  if (no_state_prefetch_handle_.get())
+    no_state_prefetch_handle_->OnCancel();
 }
 
 void AutocompleteActionPredictor::RegisterTransitionalMatches(
@@ -150,11 +150,11 @@
 }
 
 void AutocompleteActionPredictor::CancelPrerender() {
-  // If the prerender has already been abandoned, leave it to its own timeout;
+  // If the prefetch has already been abandoned, leave it to its own timeout;
   // this normally gets called immediately after OnOmniboxOpenedUrl.
-  if (prerender_handle_ && !prerender_handle_->IsAbandoned()) {
-    prerender_handle_->OnCancel();
-    prerender_handle_.reset();
+  if (no_state_prefetch_handle_ && !no_state_prefetch_handle_->IsAbandoned()) {
+    no_state_prefetch_handle_->OnCancel();
+    no_state_prefetch_handle_.reset();
   }
 }
 
@@ -162,18 +162,19 @@
     const GURL& url,
     content::SessionStorageNamespace* session_storage_namespace,
     const gfx::Size& size) {
-  // Only cancel the old prerender after starting the new one, so if the URLs
-  // are the same, the underlying prerender will be reused.
-  std::unique_ptr<prerender::PrerenderHandle> old_prerender_handle =
-      std::move(prerender_handle_);
+  // Only cancel the old prefetch after starting the new one, so if the URLs
+  // are the same, the underlying prefetcher will be reused.
+  std::unique_ptr<prerender::NoStatePrefetchHandle>
+      old_no_state_prefetch_handle = std::move(no_state_prefetch_handle_);
   prerender::NoStatePrefetchManager* no_state_prefetch_manager =
       prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(profile_);
   if (no_state_prefetch_manager) {
-    prerender_handle_ = no_state_prefetch_manager->AddPrerenderFromOmnibox(
-        url, session_storage_namespace, size);
+    no_state_prefetch_handle_ =
+        no_state_prefetch_manager->AddPrerenderFromOmnibox(
+            url, session_storage_namespace, size);
   }
-  if (old_prerender_handle)
-    old_prerender_handle->OnCancel();
+  if (old_no_state_prefetch_handle)
+    old_no_state_prefetch_handle->OnCancel();
 }
 
 AutocompleteActionPredictor::Action
@@ -203,7 +204,7 @@
     }
   }
 
-  // Downgrade prerender to preconnect if this is a search match.
+  // Downgrade prefetch to preconnect if this is a search match.
   if (action == ACTION_PRERENDER && AutocompleteMatch::IsSearchType(match.type))
     action = ACTION_PRECONNECT;
 
@@ -217,7 +218,7 @@
 }
 
 bool AutocompleteActionPredictor::IsPrerenderAbandonedForTesting() {
-  return prerender_handle_ && prerender_handle_->IsAbandoned();
+  return no_state_prefetch_handle_ && no_state_prefetch_handle_->IsAbandoned();
 }
 
 void AutocompleteActionPredictor::OnOmniboxOpenedUrl(const OmniboxLog& log) {
@@ -242,12 +243,12 @@
   if (!log.is_popup_open || log.is_paste_and_go)
     return;
 
-  // Abandon the current prerender. If it is to be used, it will be used very
+  // Abandon the current prefetch. If it is to be used, it will be used very
   // soon, so use the lower timeout.
-  if (prerender_handle_) {
-    prerender_handle_->OnNavigateAway();
-    // Don't release |prerender_handle_| so it is canceled if it survives to the
-    // next StartPrerendering call.
+  if (no_state_prefetch_handle_) {
+    no_state_prefetch_handle_->OnNavigateAway();
+    // Don't release |no_state_prefetch_handle_| so it is canceled if it
+    // survives to the next StartPrerendering call.
   }
 
   const AutocompleteMatch& match = log.result.match_at(log.selected_index);
diff --git a/chrome/browser/predictors/autocomplete_action_predictor.h b/chrome/browser/predictors/autocomplete_action_predictor.h
index dc51f3b3..52d98bb 100644
--- a/chrome/browser/predictors/autocomplete_action_predictor.h
+++ b/chrome/browser/predictors/autocomplete_action_predictor.h
@@ -45,7 +45,7 @@
 }
 
 namespace prerender {
-class PrerenderHandle;
+class NoStatePrefetchHandle;
 }
 
 namespace predictors {
@@ -266,7 +266,7 @@
   // This is used to limit the maximum size of |transitional_matches_|.
   size_t transitional_matches_size_ = 0;
 
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle_;
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle_;
 
   // This allows us to predict the effect of confidence threshold changes on
   // accuracy.  This is cleared after every omnibox navigation.
diff --git a/chrome/browser/predictors/loading_predictor_browsertest.cc b/chrome/browser/predictors/loading_predictor_browsertest.cc
index fd92e29a..d9054a7 100644
--- a/chrome/browser/predictors/loading_predictor_browsertest.cc
+++ b/chrome/browser/predictors/loading_predictor_browsertest.cc
@@ -39,8 +39,8 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -788,20 +788,21 @@
 }
 
 namespace {
-class TestPrerenderStopObserver : public prerender::PrerenderHandle::Observer {
+class TestPrerenderStopObserver
+    : public prerender::NoStatePrefetchHandle::Observer {
  public:
   explicit TestPrerenderStopObserver(base::OnceClosure on_stop_closure)
       : on_stop_closure_(std::move(on_stop_closure)) {}
   ~TestPrerenderStopObserver() override = default;
 
-  void OnPrerenderStop(prerender::PrerenderHandle* contents) override {
+  void OnPrefetchStop(prerender::NoStatePrefetchHandle* contents) override {
     if (on_stop_closure_) {
       std::move(on_stop_closure_).Run();
     }
   }
 
-  void OnPrerenderNetworkBytesChanged(
-      prerender::PrerenderHandle* handle) override {}
+  void OnPrefetchNetworkBytesChanged(
+      prerender::NoStatePrefetchHandle* handle) override {}
 
  private:
   base::OnceClosure on_stop_closure_;
@@ -820,7 +821,7 @@
       prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(
           browser()->profile());
 
-  std::unique_ptr<prerender::PrerenderHandle> handle =
+  std::unique_ptr<prerender::NoStatePrefetchHandle> handle =
       no_state_prefetch_manager->AddPrerenderFromNavigationPredictor(
           url,
           browser()
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 79783e23..c29db9b8 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
@@ -39,8 +39,8 @@
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/embedder_support/switches.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/omnibox/browser/omnibox_view.h"
 #include "components/prefs/pref_service.h"
@@ -1307,11 +1307,11 @@
       no_state_prefetch_contents_factory()->ExpectNoStatePrefetchContents(
           FINAL_STATUS_RENDERER_CRASHED);
   content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes;
-  std::unique_ptr<PrerenderHandle> prerender_handle(
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle(
       GetNoStatePrefetchManager()->AddPrerenderFromExternalRequest(
           GURL(content::kChromeUICrashURL), content::Referrer(),
           storage_namespace, gfx::Rect(kSize)));
-  ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
+  ASSERT_EQ(no_state_prefetch_handle->contents(), test_prerender->contents());
   test_prerender->WaitForStop();
 }
 
diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.cc b/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.cc
index 0b072cb0..c82b008 100644
--- a/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.cc
+++ b/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.cc
@@ -258,7 +258,7 @@
 
 DestructionWaiter::DestructionMarker::~DestructionMarker() {}
 
-void DestructionWaiter::DestructionMarker::OnPrerenderStop(
+void DestructionWaiter::DestructionMarker::OnPrefetchStop(
     NoStatePrefetchContents* contents) {
   waiter_->MarkDestruction(contents->final_status());
 }
@@ -313,25 +313,26 @@
   EXPECT_LE(expected_number_of_loads, number_of_loads_);
 }
 
-void TestPrerender::OnPrerenderCreated(TestNoStatePrefetchContents* contents) {
+void TestPrerender::OnPrefetchContentsCreated(
+    TestNoStatePrefetchContents* contents) {
   DCHECK(!contents_);
   contents_ = contents;
   contents_->AddObserver(this);
   create_loop_.Quit();
 }
 
-void TestPrerender::OnPrerenderStart(NoStatePrefetchContents* contents) {
+void TestPrerender::OnPrefetchStart(NoStatePrefetchContents* contents) {
   started_ = true;
   start_loop_.Quit();
 }
 
-void TestPrerender::OnPrerenderStopLoading(NoStatePrefetchContents* contents) {
+void TestPrerender::OnPrefetchStopLoading(NoStatePrefetchContents* contents) {
   number_of_loads_++;
   if (load_waiter_ && number_of_loads_ >= expected_number_of_loads_)
     load_waiter_->Quit();
 }
 
-void TestPrerender::OnPrerenderStop(NoStatePrefetchContents* contents) {
+void TestPrerender::OnPrefetchStop(NoStatePrefetchContents* contents) {
   DCHECK(contents_);
   contents_ = nullptr;
   final_status_ = contents->final_status();
@@ -408,7 +409,7 @@
       no_state_prefetch_manager, browser_context, url, referrer,
       initiator_origin, origin, expected.final_status, expected.ignore);
   if (expected.handle)
-    expected.handle->OnPrerenderCreated(contents);
+    expected.handle->OnPrefetchContentsCreated(contents);
   return contents;
 }
 
diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.h b/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.h
index 60956cc..748cfa6 100644
--- a/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.h
+++ b/chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.h
@@ -159,14 +159,14 @@
   // caller must do it instead.
   void WaitForLoads(int expected_number_of_loads);
 
-  void OnPrerenderCreated(TestNoStatePrefetchContents* contents);
+  void OnPrefetchContentsCreated(TestNoStatePrefetchContents* contents);
 
   // NoStatePrefetchContents::Observer implementation:
-  void OnPrerenderStart(NoStatePrefetchContents* contents) override;
+  void OnPrefetchStart(NoStatePrefetchContents* contents) override;
 
-  void OnPrerenderStopLoading(NoStatePrefetchContents* contents) override;
+  void OnPrefetchStopLoading(NoStatePrefetchContents* contents) override;
 
-  void OnPrerenderStop(NoStatePrefetchContents* contents) override;
+  void OnPrefetchStop(NoStatePrefetchContents* contents) override;
 
  private:
   TestNoStatePrefetchContents* contents_;
@@ -213,7 +213,7 @@
 
     ~DestructionMarker() override;
 
-    void OnPrerenderStop(NoStatePrefetchContents* contents) override;
+    void OnPrefetchStop(NoStatePrefetchContents* contents) override;
 
    private:
     DestructionWaiter* waiter_;
diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc b/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc
index fd4dae3..8b6eaf19 100644
--- a/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc
+++ b/chrome/browser/prefetch/no_state_prefetch/prerender_unittest.cc
@@ -37,9 +37,9 @@
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_contents.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
 #include "components/no_state_prefetch/browser/prerender_field_trial.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/browser/prerender_link_manager.h"
 #include "components/no_state_prefetch/common/prerender_origin.h"
 #include "components/no_state_prefetch/common/prerender_util.h"
@@ -98,14 +98,15 @@
 };
 
 class TestNetworkBytesChangedObserver
-    : public prerender::PrerenderHandle::Observer {
+    : public prerender::NoStatePrefetchHandle::Observer {
  public:
   TestNetworkBytesChangedObserver() : network_bytes_changed_(false) {}
 
-  // prerender::PrerenderHandle::Observer
-  void OnPrerenderStop(PrerenderHandle* prerender_handle) override {}
-  void OnPrerenderNetworkBytesChanged(
-      PrerenderHandle* prerender_handle) override {
+  // prerender::NoStatePrefetchHandle::Observer
+  void OnPrefetchStop(
+      NoStatePrefetchHandle* no_state_prefetch_handle) override {}
+  void OnPrefetchNetworkBytesChanged(
+      NoStatePrefetchHandle* no_state_prefetch_handle) override {
     network_bytes_changed_ = true;
   }
 
@@ -340,7 +341,7 @@
   prerendering_has_started_ = true;
   test_no_state_prefetch_manager_->DummyNoStatePrefetchContentsStarted(
       -1, route_id_, this);
-  NotifyPrerenderStart();
+  NotifyPrefetchStart();
 }
 
 class PrerenderTest : public testing::Test {
@@ -1277,10 +1278,10 @@
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST,
           FINAL_STATUS_PROFILE_DESTROYED);
-  std::unique_ptr<PrerenderHandle> prerender_handle(
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager()->AddPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize)));
-  EXPECT_TRUE(prerender_handle);
+  EXPECT_TRUE(no_state_prefetch_handle);
   EXPECT_TRUE(no_state_prefetch_contents->prerendering_has_started());
   histogram_tester().ExpectTotalCount("Prerender.FinalStatus", 0);
 }
@@ -1301,10 +1302,10 @@
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST,
           FINAL_STATUS_PROFILE_DESTROYED);
-  std::unique_ptr<PrerenderHandle> prerender_handle(
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager()->AddPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize)));
-  EXPECT_TRUE(prerender_handle);
+  EXPECT_TRUE(no_state_prefetch_handle);
   EXPECT_TRUE(no_state_prefetch_contents->prerendering_has_started());
   histogram_tester().ExpectTotalCount("Prerender.FinalStatus", 0);
 }
@@ -1325,10 +1326,10 @@
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST,
           FINAL_STATUS_PROFILE_DESTROYED);
-  std::unique_ptr<PrerenderHandle> prerender_handle(
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager()->AddPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize)));
-  EXPECT_TRUE(prerender_handle);
+  EXPECT_TRUE(no_state_prefetch_handle);
   EXPECT_TRUE(no_state_prefetch_contents->prerendering_has_started());
   histogram_tester().ExpectTotalCount("Prerender.FinalStatus", 0);
 }
@@ -1351,12 +1352,12 @@
   DummyNoStatePrefetchContents* no_state_prefetch_contents =
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST, FINAL_STATUS_USED);
-  std::unique_ptr<PrerenderHandle> prerender_handle(
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager()->AddPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize)));
-  EXPECT_TRUE(prerender_handle);
+  EXPECT_TRUE(no_state_prefetch_handle);
   EXPECT_TRUE(no_state_prefetch_contents->prerendering_has_started());
-  EXPECT_EQ(no_state_prefetch_contents, prerender_handle->contents());
+  EXPECT_EQ(no_state_prefetch_contents, no_state_prefetch_handle->contents());
   std::unique_ptr<NoStatePrefetchContents> entry =
       no_state_prefetch_manager()->FindAndUseEntry(url);
   ASSERT_EQ(no_state_prefetch_contents, entry.get());
@@ -1370,20 +1371,20 @@
       net::NetworkChangeNotifier::GetConnectionType()));
   GURL url("http://www.google.com/");
   DummyNoStatePrefetchContents* no_state_prefetch_contents = nullptr;
-  std::unique_ptr<PrerenderHandle> prerender_handle;
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle;
   no_state_prefetch_contents =
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER,
           FINAL_STATUS_USED);
-  prerender_handle =
+  no_state_prefetch_handle =
       no_state_prefetch_manager()->AddForcedPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize));
-  EXPECT_TRUE(prerender_handle);
-  EXPECT_TRUE(prerender_handle->IsPrerendering());
+  EXPECT_TRUE(no_state_prefetch_handle);
+  EXPECT_TRUE(no_state_prefetch_handle->IsPrefetching());
   EXPECT_TRUE(no_state_prefetch_contents->prerendering_has_started());
-  EXPECT_EQ(no_state_prefetch_contents, prerender_handle->contents());
+  EXPECT_EQ(no_state_prefetch_contents, no_state_prefetch_handle->contents());
   EXPECT_EQ(ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER,
-            prerender_handle->contents()->origin());
+            no_state_prefetch_handle->contents()->origin());
   std::unique_ptr<NoStatePrefetchContents> entry =
       no_state_prefetch_manager()->FindAndUseEntry(url);
   ASSERT_EQ(no_state_prefetch_contents, entry.get());
@@ -1759,12 +1760,12 @@
       no_state_prefetch_manager()->CreateNextNoStatePrefetchContents(
           url, base::nullopt, ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER,
           FINAL_STATUS_PROFILE_DESTROYED);
-  std::unique_ptr<PrerenderHandle> prerender_handle =
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle =
       no_state_prefetch_manager()->AddForcedPrerenderFromExternalRequest(
           url, content::Referrer(), nullptr, gfx::Rect(kDefaultViewSize));
 
   TestNetworkBytesChangedObserver observer;
-  prerender_handle->SetObserver(&observer);
+  no_state_prefetch_handle->SetObserver(&observer);
 
   no_state_prefetch_contents->AddNetworkBytes(12);
   EXPECT_TRUE(observer.network_bytes_changed());
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
index 02949435..e4e4514 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -60,8 +60,8 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/language/core/browser/pref_names.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/common/prerender_final_status.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_service.h"
@@ -420,7 +420,7 @@
 
 class PrefetchProxyBrowserTest
     : public InProcessBrowserTest,
-      public prerender::PrerenderHandle::Observer,
+      public prerender::NoStatePrefetchHandle::Observer,
       public net::test_server::EmbeddedTestServerConnectionListener {
  public:
   PrefetchProxyBrowserTest() {
@@ -521,7 +521,8 @@
             predicted_urls);
   }
 
-  std::unique_ptr<prerender::PrerenderHandle> StartPrerender(const GURL& url) {
+  std::unique_ptr<prerender::NoStatePrefetchHandle> StartPrerender(
+      const GURL& url) {
     prerender::NoStatePrefetchManager* no_state_prefetch_manager =
         prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(
             browser()->profile());
@@ -881,10 +882,10 @@
                       language::prefs::kAcceptLanguages)));
   }
 
-  // prerender::PrerenderHandle::Observer:
-  void OnPrerenderNetworkBytesChanged(
-      prerender::PrerenderHandle* handle) override {}
-  void OnPrerenderStop(prerender::PrerenderHandle* handle) override {}
+  // prerender::NoStatePrefetchHandle::Observer:
+  void OnPrefetchNetworkBytesChanged(
+      prerender::NoStatePrefetchHandle* handle) override {}
+  void OnPrefetchStop(prerender::NoStatePrefetchHandle* handle) override {}
 
   // net::test_server::EmbeddedTestServerConnectionListener:
   void ReadFromSocket(const net::StreamSocket& socket, int rv) override {}
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc
index a7e167f..be0448d 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc
@@ -27,7 +27,7 @@
 }
 
 void PrefetchProxySubresourceManager::ManageNoStatePrefetch(
-    std::unique_ptr<prerender::PrerenderHandle> handle,
+    std::unique_ptr<prerender::NoStatePrefetchHandle> handle,
     base::OnceClosure on_nsp_done_callback) {
   on_nsp_done_callback_ = std::move(on_nsp_done_callback);
   nsp_handle_ = std::move(handle);
@@ -48,14 +48,14 @@
   DCHECK(create_isolated_loader_factory_callback_);
   // We're navigating so take the extra work off the CPU.
   if (nsp_handle_) {
-    OnPrerenderStop(nsp_handle_.get());
+    OnPrefetchStop(nsp_handle_.get());
   }
 
   was_navigated_to_after_srp_ = true;
 }
 
-void PrefetchProxySubresourceManager::OnPrerenderStop(
-    prerender::PrerenderHandle* handle) {
+void PrefetchProxySubresourceManager::OnPrefetchStop(
+    prerender::NoStatePrefetchHandle* handle) {
   DCHECK_EQ(nsp_handle_.get(), handle);
 
   if (on_nsp_done_callback_) {
@@ -83,7 +83,7 @@
       nsp_handle_->contents()->no_state_prefetch_contents();
   if (!web_contents) {
     // This shouldn't happen, so abort the prerender just to be safe.
-    OnPrerenderStop(nsp_handle_.get());
+    OnPrefetchStop(nsp_handle_.get());
     NOTREACHED();
     return false;
   }
@@ -98,7 +98,7 @@
     // This also shouldn't happen, and would imply that there is a bug in the
     // code where a prerender was triggered without having an isolated URL
     // Loader Factory callback to use. Abort the prerender just to be safe.
-    OnPrerenderStop(nsp_handle_.get());
+    OnPrefetchStop(nsp_handle_.get());
     NOTREACHED();
     return false;
   }
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h
index 5bf8967..bcd3d040 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h
@@ -14,7 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "content/public/browser/content_browser_client.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -29,7 +29,7 @@
 }
 
 namespace prerender {
-class PrerenderHandle;
+class NoStatePrefetchHandle;
 }
 
 class PrefetchedMainframeResponseContainer;
@@ -38,7 +38,7 @@
 
 // This class manages the prefetch proxy of a page and its subresources.
 class PrefetchProxySubresourceManager
-    : public prerender::PrerenderHandle::Observer,
+    : public prerender::NoStatePrefetchHandle::Observer,
       public PrefetchProxyProxyingURLLoaderFactory::ResourceMetricsObserver {
  public:
   // A callback to create new URL Loader Factories for subresources.
@@ -55,8 +55,9 @@
 
   // Passes ownership of |handle| to |this|, calling |on_nsp_done_callback| when
   // the NSP is done.
-  void ManageNoStatePrefetch(std::unique_ptr<prerender::PrerenderHandle> handle,
-                             base::OnceClosure on_nsp_done_callback);
+  void ManageNoStatePrefetch(
+      std::unique_ptr<prerender::NoStatePrefetchHandle> handle,
+      base::OnceClosure on_nsp_done_callback);
 
   bool has_nsp_handle() const { return !!nsp_handle_; }
 
@@ -94,10 +95,10 @@
   // prefetched subresources should be loaded from cache.
   void NotifyProbeFailed();
 
-  // prerender::PrerenderHandle::Observer:
-  void OnPrerenderStop(prerender::PrerenderHandle* handle) override;
-  void OnPrerenderNetworkBytesChanged(
-      prerender::PrerenderHandle* handle) override {}
+  // prerender::NoStatePrefetchHandle::Observer:
+  void OnPrefetchStop(prerender::NoStatePrefetchHandle* handle) override;
+  void OnPrefetchNetworkBytesChanged(
+      prerender::NoStatePrefetchHandle* handle) override {}
 
   // PrefetchProxyProxyingURLLoaderFactory::ResourceMetricsObserver:
   void OnResourceFetchComplete(
@@ -160,7 +161,7 @@
   // State for managing the NoStatePrerender when it is running. If
   // |nsp_handle_| is set, then |on_nsp_done_callback_| is also set and vise
   // versa.
-  std::unique_ptr<prerender::PrerenderHandle> nsp_handle_;
+  std::unique_ptr<prerender::NoStatePrefetchHandle> nsp_handle_;
   base::OnceClosure on_nsp_done_callback_;
 
   // All owned proxying URL Loader Factories.
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
index 6c5b6f8..7d7f4e4 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -984,7 +984,7 @@
       web_contents()->GetController().GetDefaultSessionStorageNamespace();
   gfx::Size size = web_contents()->GetContainerBounds().size();
 
-  std::unique_ptr<prerender::PrerenderHandle> handle =
+  std::unique_ptr<prerender::NoStatePrefetchHandle> handle =
       no_state_prefetch_manager->AddIsolatedPrerender(
           url, session_storage_namespace, size);
 
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc
index 3b7975a..725bad6 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
@@ -85,7 +85,8 @@
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
-  std::unique_ptr<prerender::PrerenderHandle> StartPrerender(const GURL& url) {
+  std::unique_ptr<prerender::NoStatePrefetchHandle> StartPrerender(
+      const GURL& url) {
     prerender::NoStatePrefetchManager* no_state_prefetch_manager =
         prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(
             profile());
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index c0ea21c..6788f985 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -142,6 +142,7 @@
 #include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h"
 #include "components/sessions/core/session_id_generator.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/site_engagement/content/site_engagement_service.h"
 #include "components/subresource_filter/content/browser/ruleset_service.h"
 #include "components/sync/base/sync_prefs.h"
 #include "components/sync_device_info/device_info_prefs.h"
@@ -901,6 +902,7 @@
       registry);
   SessionStartupPref::RegisterProfilePrefs(registry);
   SharingSyncPreference::RegisterProfilePrefs(registry);
+  site_engagement::SiteEngagementService::RegisterProfilePrefs(registry);
   sync_sessions::SessionSyncPrefs::RegisterProfilePrefs(registry);
   syncer::DeviceInfoPrefs::RegisterProfilePrefs(registry);
   syncer::SyncPrefs::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/previews/lazyload_browsertest.cc b/chrome/browser/previews/lazyload_browsertest.cc
index a7cacec..ceea4978 100644
--- a/chrome/browser/previews/lazyload_browsertest.cc
+++ b/chrome/browser/previews/lazyload_browsertest.cc
@@ -17,8 +17,8 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/common/prerender_final_status.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/web_contents.h"
@@ -383,12 +383,12 @@
       no_state_prefetch_contents_factory()->ExpectNoStatePrefetchContents(
           prerender::FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
 
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle =
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle =
       GetNoStatePrefetchManager()->AddPrerenderFromOmnibox(
           src_server()->GetURL("/lazyload/img.html"),
           GetSessionStorageNamespace(), gfx::Size(640, 480));
 
-  ASSERT_EQ(prerender_handle->contents(), test_prerender->contents());
+  ASSERT_EQ(no_state_prefetch_handle->contents(), test_prerender->contents());
 
   test_prerender->WaitForStop();
   for (const auto* url :
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc
index 2a61e90..2462361 100644
--- a/chrome/browser/printing/print_browsertest.cc
+++ b/chrome/browser/printing/print_browsertest.cc
@@ -33,7 +33,6 @@
 #include "components/printing/browser/print_manager_utils.h"
 #include "components/printing/common/print.mojom-test-utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 9e10219..02c8d81 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -31,7 +31,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/browser/plugin_service.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc b/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
index 01881f3..faf9ee55 100644
--- a/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
+++ b/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
@@ -41,7 +41,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_message_handler.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index cbba47f..26271f66 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/printing/print_preview_dialog_controller.h"
 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
 #include "chrome/common/chrome_content_client.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/plugin_service.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index 2875a1f..ce47c91 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -36,7 +36,6 @@
 #include "components/printing/browser/print_composite_client.h"
 #include "components/printing/browser/print_manager_utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "components/services/print_compositor/public/cpp/print_service_mojo_types.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/printing/print_view_manager_basic_unittest.cc b/chrome/browser/printing/print_view_manager_basic_unittest.cc
index 77ef83d..ef6b28d 100644
--- a/chrome/browser/printing/print_view_manager_basic_unittest.cc
+++ b/chrome/browser/printing/print_view_manager_basic_unittest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/printing/printer_query.h"
 #include "chrome/browser/printing/printing_init.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/render_process_host.h"
 
 namespace printing {
diff --git a/chrome/browser/privacy_budget/README.md b/chrome/browser/privacy_budget/README.md
index f97ecca..94a1ce3 100644
--- a/chrome/browser/privacy_budget/README.md
+++ b/chrome/browser/privacy_budget/README.md
@@ -1,5 +1,5 @@
 # Privacy Budget: Persistent Study State and Reporting
 
 See [Privacy Budget: Code
-Locations](../../../docs/privacy_budget_code_locations.md) for
+Locations](../../../docs/privacy_budget/privacy_budget_code_locations.md) for
 details.
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index 8c27e6c244..2e5022d9 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -256,8 +256,6 @@
 #endif  // defined(OS_ANDROID)
   registry->RegisterBooleanPref(prefs::kSessionExitedCleanly, true);
   registry->RegisterStringPref(prefs::kSessionExitType, std::string());
-  registry->RegisterInt64Pref(prefs::kSiteEngagementLastUpdateTime, 0,
-                              PrefRegistry::LOSSY_PREF);
   registry->RegisterBooleanPref(prefs::kDisableExtensions, false);
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   registry->RegisterBooleanPref(extensions::pref_names::kAlertsInitialized,
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index c0ae839..cefeba95 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -599,7 +599,7 @@
       extension_items_(browser_context_,
                        this,
                        &menu_model_,
-                       base::Bind(MenuItemMatchesParams, params_)),
+                       base::BindRepeating(MenuItemMatchesParams, params_)),
       profile_link_submenu_model_(this),
       multiple_profiles_open_(false),
       protocol_handler_submenu_model_(this),
@@ -2872,8 +2872,8 @@
   base::FilePath profile_path = profile_link_paths_[profile_index];
   profiles::SwitchToProfile(
       profile_path, false,
-      base::Bind(OnProfileCreated, params_.link_url,
-                 CreateReferrer(params_.link_url, params_)));
+      base::BindRepeating(OnProfileCreated, params_.link_url,
+                          CreateReferrer(params_.link_url, params_)));
 }
 
 void RenderViewContextMenu::ExecInspectElement() {
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 396ba05..a69ed12b 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -252,13 +252,13 @@
     auto callback =
         [](std::vector<uint8_t>* response_image_data,
            gfx::Size* response_original_size,
-           std::string* response_file_extension, const base::Closure& quit,
+           std::string* response_file_extension, base::OnceClosure quit,
            const std::vector<uint8_t>& image_data,
            const gfx::Size& original_size, const std::string& file_extension) {
           *response_image_data = image_data;
           *response_original_size = original_size;
           *response_file_extension = file_extension;
-          quit.Run();
+          std::move(quit).Run();
         };
 
     base::RunLoop run_loop;
@@ -267,8 +267,8 @@
     std::string response_file_extension;
     chrome_render_frame->RequestImageForContextNode(
         0, request_size, request_image_format,
-        base::Bind(callback, &response_image_data, &response_original_size,
-                   &response_file_extension, run_loop.QuitClosure()));
+        base::BindOnce(callback, &response_image_data, &response_original_size,
+                       &response_file_extension, run_loop.QuitClosure()));
     run_loop.Run();
 
     ASSERT_EQ(expected_original_size.width(), response_original_size.width());
@@ -356,7 +356,7 @@
         browser()->tab_strip_model()->GetActiveWebContents();
     // Prepare to load a pdf plugin inside.
     test_guest_view_manager_->RegisterTestGuestViewType<MimeHandlerViewGuest>(
-        base::Bind(&TestMimeHandlerViewGuest::Create));
+        base::BindRepeating(&TestMimeHandlerViewGuest::Create));
     ASSERT_TRUE(
         content::ExecuteScript(web_contents,
                                "var l = document.getElementById('link1');"
@@ -1415,12 +1415,12 @@
       ->GetRemoteAssociatedInterfaces()
       ->GetInterface(&chrome_render_frame);
 
-  auto callback = [](bool* response_received, const base::Closure& quit,
+  auto callback = [](bool* response_received, base::OnceClosure quit,
                      const std::vector<uint8_t>& thumbnail_data,
                      const gfx::Size& original_size,
                      const std::string& file_extension) {
     *response_received = true;
-    quit.Run();
+    std::move(quit).Run();
   };
 
   base::RunLoop run_loop;
diff --git a/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc b/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
index 8eb6527..1a36083d 100644
--- a/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
@@ -13,8 +13,8 @@
 #include "chrome/browser/prefetch/no_state_prefetch/prerender_test_utils.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/navigation_simulator.h"
@@ -346,11 +346,11 @@
       prerender::NoStatePrefetchManagerFactory::GetForBrowserContext(profile());
   GURL url("http://www.example.com");
   const gfx::Size kSize(640, 480);
-  std::unique_ptr<prerender::PrerenderHandle> prerender_handle(
+  std::unique_ptr<prerender::NoStatePrefetchHandle> no_state_prefetch_handle(
       no_state_prefetch_manager->AddPrerenderFromOmnibox(
           url, contents1()->GetController().GetDefaultSessionStorageNamespace(),
           kSize));
-  EXPECT_NE(nullptr, prerender_handle);
+  EXPECT_NE(nullptr, no_state_prefetch_handle);
   const std::vector<content::WebContents*> contentses =
       no_state_prefetch_manager->GetAllNoStatePrefetchingContentsForTesting();
   ASSERT_EQ(1U, contentses.size());
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 8d33f32..d5e45ef5 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -56,6 +56,7 @@
 
   if (!is_android && !is_chromeos_ash) {
     public_deps += [
+      "ntp4:apps_resources",
       "signin/profile_picker:resources",
       "welcome:resources",
     ]
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index fc885f22..c1bc4eb0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -154,6 +154,7 @@
     ":chromevox_phonetic_dictionaries_js",
     ":i_tutorial",
     ":tutorial_lesson",
+    ":tutorial_lesson_menu",
     ":tutorial_main_menu",
     ":tutorial_navigation_buttons",
     "//chrome/browser/resources/chromeos/accessibility/braille_ime:braille_ime_manifest",
@@ -516,6 +517,16 @@
   ]
 }
 
+copy("tutorial_lesson_menu") {
+  sources = [ "$chromevox_gen_dir/i_tutorial/components/lesson_menu.js" ]
+  outputs = [ "$chromevox_out_dir/i_tutorial/components/lesson_menu.js" ]
+
+  deps = [
+    "i_tutorial/components:closure_compile",
+    "i_tutorial/components:components",
+  ]
+}
+
 copy("tutorial_navigation_buttons") {
   sources = [ "$chromevox_gen_dir/i_tutorial/components/navigation_buttons.js" ]
   outputs = [ "$chromevox_out_dir/i_tutorial/components/navigation_buttons.js" ]
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js
index 9230ff1f..10ba2a0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/download_handler_test.js
@@ -79,7 +79,7 @@
 
 TEST_F('ChromeVoxDownloadTest', 'DownloadStartedTest', function() {
   localStorage['announceDownloadNotifications'] = 'true';
-  this.addFakeApi();
+  this.addFakeApi('hours');
   const mockFeedback = this.createMockFeedback();
   DownloadHandler.init();
   // Simulate download started.
@@ -96,7 +96,7 @@
 
 TEST_F('ChromeVoxDownloadTest', 'DownloadCompletedTest', function() {
   localStorage['announceDownloadNotifications'] = 'true';
-  this.addFakeApi();
+  this.addFakeApi('hours');
   const mockFeedback = this.createMockFeedback();
   DownloadHandler.init();
   // Simulate download started.
@@ -123,7 +123,7 @@
 
 TEST_F('ChromeVoxDownloadTest', 'DownloadInterruptedTest', function() {
   localStorage['announceDownloadNotifications'] = 'true';
-  this.addFakeApi();
+  this.addFakeApi('hours');
   const mockFeedback = this.createMockFeedback();
   DownloadHandler.init();
   // Simulate download started.
@@ -149,7 +149,7 @@
 
 TEST_F('ChromeVoxDownloadTest', 'DownloadPausedTest', function() {
   localStorage['announceDownloadNotifications'] = 'true';
-  this.addFakeApi();
+  this.addFakeApi('hours');
   const mockFeedback = this.createMockFeedback();
   DownloadHandler.init();
   // Simulate download started.
@@ -174,7 +174,7 @@
 
 TEST_F('ChromeVoxDownloadTest', 'DownloadResumedTest', function() {
   localStorage['announceDownloadNotifications'] = 'true';
-  this.addFakeApi();
+  this.addFakeApi('hours');
   const mockFeedback = this.createMockFeedback();
   DownloadHandler.init();
   // Simulate download started.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis_test.js
index 03f44e2..b627d27 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis_test.js
@@ -21,6 +21,9 @@
     liblouis.getTranslator(tableNames, this.newCallback(callback));
   }
 };
+// TODO(accessibility): The native LibLouis wasm emits errors.
+// See https://crbug.com/1170991.
+ChromeVoxE2ETest.prototype.failOnConsoleError = false;
 
 
 function assertEqualsUint8Array(expected, actual) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/BUILD.gn
index 1f07413..58d1e6f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/BUILD.gn
@@ -11,6 +11,7 @@
     "i_tutorial.js",
     "navigation_buttons.js",
     "main_menu.js",
+    "lesson_menu.js",
   ]
 }
 
@@ -19,6 +20,7 @@
   deps = [
     ":constants",
     ":i_tutorial",
+    ":lesson_menu",
     ":main_menu",
     ":navigation_buttons",
     ":tutorial_common",
@@ -47,6 +49,12 @@
   ]
 }
 
+js_library("lesson_menu") {
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+  ]
+}
+
 js_library("i_tutorial") {
   deps = [
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/constants.js b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/constants.js
index 74a71bcf..0c06538a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/constants.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/constants.js
@@ -21,6 +21,16 @@
 };
 
 /**
+ * The user’s interaction medium. Influences tutorial content.
+ * @enum {string}
+ */
+export const InteractionMedium = {
+  KEYBOARD: 'keyboard',
+  TOUCH: 'touch',
+  BRAILLE: 'braille',
+};
+
+/**
  * The various screens within the tutorial.
  * @enum {string}
  */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.html b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.html
index a9bea157..45a79ee2 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.html
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.html
@@ -14,49 +14,12 @@
   top: 0;
 }
 
-#lessonMenu,
 #lessonContainer {
   margin: auto;
   text-align: start;
   width: 800px;
 }
 
-#lessonShortcuts {
-  background: #FFF;
-  border-radius: 4px;
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 2px 6px rgba(0, 0, 0, 0.15);
-  font-size: 22px;
-}
-
-#lessonShortcuts {
-  max-height: 400px;
-  overflow: scroll;
-}
-
-cr-button,
-cr-link-row {
-  font-family: 'Roboto';
-  font-weight: medium;
-}
-
-h1 {
-  font-family: 'Google Sans', 'Roboto';
-  font-size: 32px;
-  font-weight: medium;
-  line-height: 40px;
-  margin-bottom: 32px;
-}
-
-cr-button {
-  font-size: 16px;
-  font-style: normal;
-  line-height: 24px;
-  margin-bottom: 40px;
-  margin-inline-end: 8px;
-  margin-inline-start: 8px;
-  margin-top: 40px;
-}
-
 </style>
 
 <div id="tutorial">
@@ -69,17 +32,14 @@
     on-button-clicked="onMainMenuButtonClicked_">
 </main-menu>
 
-<div id="lessonMenu"
-    hidden$="[[ shouldHideLessonMenu(activeScreen) ]]">
-  <h1 id="lessonMenuHeader"
-      tabindex="-1" aria-describedby="lessonMenuHeaderHint">
-    [[ computeLessonMenuHeader(curriculum) ]]
-  </h1>
-  <div id="lessonMenuHeaderHint" hidden>
-    [[ getMsg('tutorial_lesson_menu_header_description') ]]
-  </div>
-  <div id="lessonShortcuts"></div>
-</div>
+<lesson-menu
+    curriculum="[[ curriculum ]]"
+    num-lessons="[[ numLessons ]]"
+    header-description_="tutorial_lesson_menu_header_description"
+    button-data_="[[ computeLessonMenuButtonData_() ]]"
+    active-screen="[[ activeScreen ]]"
+    on-button-clicked="onLessonMenuButtonClicked_">
+</lesson-menu>
 
 <div id="lessonContainer"
     hidden$="[[ shouldHideLessonContainer(activeScreen) ]]">
@@ -88,7 +48,7 @@
   <template id="lessonTemplate" is="dom-repeat" items="[[ lessonData ]]"
       as="lesson" index-as="index">
     <tutorial-lesson
-    lesson-num="[[ index ]]"
+    lesson-id="[[ index ]]"
     title="[[ lesson.title ]]"
     content="[[ lesson.content ]]"
     medium="[[ lesson.medium ]]"
@@ -100,7 +60,7 @@
     events="[[ lesson.events ]]"
     actions="[[ lesson.actions ]]"
     auto-interactive="[[ lesson.autoInteractive ]]"
-    active-lesson-num="[[ activeLessonNum ]]">
+    active-lesson-id="[[ activeLessonId ]]">
     </tutorial-lesson>
   </template>
 </div>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.js b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.js
index 2fefbf4..c54c77b 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/i_tutorial.js
@@ -15,23 +15,14 @@
 
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {Curriculum, Screen} from './constants.js';
+import {Curriculum, InteractionMedium, Screen} from './constants.js';
+import {LessonMenu} from './lesson_menu.js';
 import {MainMenu} from './main_menu.js';
 import {NavigationButtons} from './navigation_buttons.js';
 import {TutorialCommon} from './tutorial_common.js';
 import {TutorialLesson} from './tutorial_lesson.js';
 
 /**
- * The user’s interaction medium. Influences tutorial content.
- * @enum {string}
- */
-const InteractionMedium = {
-  KEYBOARD: 'keyboard',
-  TOUCH: 'touch',
-  BRAILLE: 'braille',
-};
-
-/**
  * The types of nudges given by the tutorial.
  * General nudges: announce the current item three times, then give two general
  * hints about how to navigate with ChromeVox, then a final nudge about how to
@@ -75,7 +66,8 @@
     // An index into |includedLessons|.
     activeLessonIndex: {type: Number, value: -1},
 
-    activeLessonNum: {type: Number, value: -1},
+    /** @type {number} */
+    activeLessonId: {type: Number, value: -1},
 
     numLessons: {type: Number, value: 0},
 
@@ -386,6 +378,20 @@
     this.showLessonMenu();
   },
 
+  /**
+   * @param {!MouseEvent} evt
+   * @private
+   */
+  onLessonMenuButtonClicked_(evt) {
+    const detail =
+        /**
+           @type {!{title: string, curriculums: Array<Curriculum>, lessonId:
+               number}}
+         */
+        (evt.detail);
+    this.showLessonFromId_(detail.lessonId);
+  },
+
   showNextLesson() {
     this.showLesson(this.activeLessonIndex + 1);
   },
@@ -401,7 +407,20 @@
   },
 
   /**
-   * @param {number} index
+   * @param {number} lessonId
+   * @private
+   */
+  showLessonFromId_(lessonId) {
+    for (let i = 0; i < this.includedLessons.length; ++i) {
+      const lesson = this.includedLessons[i];
+      if (lessonId === lesson.lessonId) {
+        this.showLesson(i);
+      }
+    }
+  },
+
+  /**
+   * @param {number} index An index into |this.includedLessons|.
    * @private
    */
   showLesson(index) {
@@ -415,9 +434,9 @@
 
     this.activeLessonIndex = index;
 
-    // Lessons observe activeLessonNum. When updated, lessons automatically
+    // Lessons observe activeLessonId. When updated, lessons automatically
     // update their visibility.
-    this.activeLessonNum = this.includedLessons[index].lessonNum;
+    this.activeLessonId = this.includedLessons[index].lessonId;
 
     const lesson = this.getCurrentLesson();
     if (lesson.autoInteractive) {
@@ -448,8 +467,6 @@
       this.activeScreen = Screen.LESSON;
     } else {
       this.activeScreen = Screen.LESSON_MENU;
-      this.createLessonShortcuts();
-      this.$.lessonMenuHeader.focus();
     }
   },
 
@@ -461,7 +478,7 @@
   /** @private */
   updateIncludedLessons() {
     this.includedLessons = [];
-    this.activeLessonNum = -1;
+    this.activeLessonId = -1;
     this.activeLessonIndex = -1;
     this.numLessons = 0;
     const lessons = this.$.lessonContainer.children;
@@ -477,7 +494,6 @@
       }
     }
     this.numLessons = this.includedLessons.length;
-    this.createLessonShortcuts();
   },
 
   /** @private */
@@ -487,28 +503,26 @@
     }
   },
 
-  /** @private */
-  createLessonShortcuts() {
-    // Clear previous lesson shortcuts, as the user may have chosen a new
-    // curriculum or medium for the tutorial.
-    this.$.lessonShortcuts.innerHTML = '';
-
-    // Create shortcuts for each included lesson.
-    let count = 1;
-    for (const lesson of this.includedLessons) {
-      const shortcut = document.createElement('cr-link-row');
-      shortcut.addEventListener('click', this.showLesson.bind(this, count - 1));
-      shortcut.label = this.getMsg(lesson.title);
-      shortcut.classList.add('hr');
-      this.$.lessonShortcuts.appendChild(shortcut);
-      count += 1;
-    }
-  },
-
-
   // Methods for computing attributes and properties.
 
   /**
+   * @return {Array<!{title: string, curriculums: !Array<!Curriculum>, lessonId:
+   *     number}>}
+   * @private
+   */
+  computeLessonMenuButtonData_() {
+    const data = [];
+    for (let i = 0; i < this.lessonData.length; ++i) {
+      data.push({
+        title: this.lessonData[i].title,
+        curriculums: this.lessonData[i].curriculums,
+        lessonId: i
+      });
+    }
+    return data;
+  },
+
+  /**
    * @param {Screen} activeScreen
    * @return {boolean}
    * @private
@@ -517,37 +531,6 @@
     return activeScreen !== Screen.LESSON;
   },
 
-  /**
-   * @param {Screen} activeScreen
-   * @return {boolean}
-   * @private
-   */
-  shouldHideLessonMenu(activeScreen) {
-    return activeScreen !== Screen.LESSON_MENU;
-  },
-
-  /**
-   * @param {Curriculum} curriculum
-   * @return {string}
-   * @private
-   */
-  computeLessonMenuHeader(curriculum) {
-    let numLessons = 0;
-    for (let i = 0; i < this.lessonData.length; ++i) {
-      if (this.lessonData[i].curriculums.includes(curriculum)) {
-        numLessons += 1;
-      }
-    }
-    // Remove underscores and capitalize the first letter of each word.
-    const words = curriculum.split('_');
-    for (let i = 0; i < words.length; ++i) {
-      words[i] = words[i][0].toUpperCase() + words[i].substring(1);
-    }
-    const curriculumCopy = words.join(' ');
-    return this.getMsg(
-        'tutorial_lesson_menu_header', [curriculumCopy, numLessons]);
-  },
-
   /** @private */
   exit() {
     this.stopNudges();
@@ -642,7 +625,7 @@
     if (type === NudgeType.PRACTICE_AREA) {
       // Convert hint strings into functions that will request speech for those
       // strings.
-      const hints = this.lessonData[this.activeLessonNum].hints;
+      const hints = this.lessonData[this.activeLessonId].hints;
       for (const hint of hints) {
         this.nudgeArray.push(
             this.requestSpeech.bind(this, hint, QueueMode.INTERJECT));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.html b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.html
new file mode 100644
index 0000000..a0c0de5
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.html
@@ -0,0 +1,52 @@
+<!-- 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. -->
+<style include="cr-shared-style">
+
+#lessonMenu {
+  margin: auto;
+  text-align: start;
+  width: 800px;
+}
+
+#lessonShortcuts {
+  background: #FFF;
+  border-radius: 4px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 2px 6px rgba(0, 0, 0, 0.15);
+  font-size: 22px;
+  max-height: 400px;
+  overflow: scroll;
+}
+
+h1 {
+  font-family: 'Google Sans', 'Roboto';
+  font-size: 32px;
+  font-weight: medium;
+  line-height: 40px;
+  margin-bottom: 32px;
+}
+
+cr-link-row {
+  font-family: 'Roboto';
+  font-weight: medium;
+}
+
+</style>
+
+<div id="lessonMenu"
+    hidden$="[[ shouldHideLessonMenu_(activeScreen) ]]">
+  <h1 id="lessonMenuHeader"
+      tabindex="-1" aria-describedby="lessonMenuHeaderHint">
+    [[ computeLessonMenuHeader_(curriculum, numLessons) ]]
+  </h1>
+  <div id="lessonMenuHeaderHint" hidden>[[ getMsg(headerDescription_) ]]</div>
+  <div id="lessonShortcuts">
+    <template id="lessonMenuButtonTemplate" is="dom-repeat"
+        items="[[ buttonData_ ]]" as="data">
+      <cr-link-row class="hr" on-click="onButtonClicked_"
+          label="[[ getMsg(data.title) ]]"
+          hidden$="[[shouldHideLessonButton_(data.curriculums, curriculum) ]]">
+      </cr-link-row>
+    </template>
+  </div>
+</div>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.js b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.js
new file mode 100644
index 0000000..4edb8b6
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/lesson_menu.js
@@ -0,0 +1,99 @@
+// 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.
+
+/**
+ * @fileoverview Defines a custom Polymer component for the lesson menu in the
+ * tutorial.
+ */
+
+import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {Curriculum, Screen} from './constants.js';
+import {TutorialCommon} from './tutorial_common.js';
+
+export const LessonMenu = Polymer({
+  is: 'lesson-menu',
+
+  _template: html`{__html_template__}`,
+
+  behaviors: [TutorialCommon],
+
+  properties: {
+    /** @private {string} */
+    headerDescription_: {type: String},
+
+    /** @private {Array<!{title: string, curriculums: !Array<Curriculum>}>} */
+    buttonData_: {type: Array},
+
+    // Observed properties.
+
+    /** @type {Screen} */
+    activeScreen: {type: String, observer: 'maybeFocusHeader_'},
+
+    /** @type {Curriculum} */
+    curriculum: {
+      type: String,
+      value: Curriculum.NONE,
+    },
+
+    /** @type {number} */
+    numLessons: {type: Number},
+  },
+
+  /** @private */
+  maybeFocusHeader_() {
+    if (this.activeScreen === Screen.LESSON_MENU) {
+      this.$.lessonMenuHeader.focus();
+    }
+  },
+
+  /**
+   * @param {Screen} activeScreen
+   * @return {boolean}
+   * @private
+   */
+  shouldHideLessonMenu_(activeScreen) {
+    return activeScreen !== Screen.LESSON_MENU;
+  },
+
+  /**
+   * @param {Curriculum} curriculum
+   * @return {string}
+   * @private
+   */
+  computeLessonMenuHeader_(curriculum) {
+    // Remove underscores and capitalize the first letter of each word.
+    const words = curriculum.split('_');
+    for (let i = 0; i < words.length; ++i) {
+      words[i] = words[i][0].toUpperCase() + words[i].substring(1);
+    }
+    const curriculumCopy = words.join(' ');
+    return this.getMsg(
+        'tutorial_lesson_menu_header', [curriculumCopy, this.numLessons]);
+  },
+
+  /**
+   * @param {!MouseEvent} evt
+   * @private
+   */
+  onButtonClicked_(evt) {
+    // Fires an event with button data attached to |evt.detail|.
+    this.fire('button-clicked', evt.model.data);
+  },
+
+  /**
+   * @param {Array<Curriculum>} validCurriculums
+   * @param {Curriculum} curriculum
+   * @return {boolean}
+   * @private
+   */
+  shouldHideLessonButton_(validCurriculums, curriculum) {
+    return !validCurriculums.includes(curriculum);
+  }
+});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/tutorial_lesson.js b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/tutorial_lesson.js
index a77bea8b..4f33156 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/tutorial_lesson.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/i_tutorial/components/tutorial_lesson.js
@@ -24,7 +24,7 @@
   behaviors: [TutorialCommon],
 
   properties: {
-    lessonNum: {type: Number},
+    lessonId: {type: Number},
 
     title: {type: String},
 
@@ -51,8 +51,8 @@
     autoInteractive: {type: Boolean, value: false},
 
     // Observed properties.
-
-    activeLessonNum: {type: Number, observer: 'setVisibility'},
+    /** @type {number} */
+    activeLessonId: {type: Number, observer: 'setVisibility'},
   },
 
   /** @override */
@@ -88,7 +88,7 @@
    * @private
    */
   setVisibility() {
-    if (this.lessonNum === this.activeLessonNum) {
+    if (this.lessonId === this.activeLessonId) {
       this.show();
     } else {
       this.hide();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
index 95dc5e7..8b8bf4bc 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
@@ -20,19 +20,23 @@
   }
 
   runOnLearnModePage(callback) {
+    callback = this.newCallback(callback);
     const mockFeedback = this.createMockFeedback();
     chrome.automation.getDesktop((desktop) => {
-      desktop.addEventListener(
-          chrome.automation.EventType.LOAD_COMPLETE, (evt) => {
-            if (evt.target.docUrl.indexOf('learn_mode/kbexplorer.html') ===
-                    -1 ||
-                !evt.target.docLoaded) {
-              return;
-            }
+      function listener(evt) {
+        if (evt.target.docUrl.indexOf('learn_mode/kbexplorer.html') === -1 ||
+            !evt.target.docLoaded) {
+          return;
+        }
+        desktop.removeEventListener(
+            chrome.automation.EventType.LOAD_COMPLETE, listener);
 
-            mockFeedback.expectSpeech(/Press a qwerty key/);
-            callback(mockFeedback, evt);
-          });
+        mockFeedback.expectSpeech(/Press a qwerty key/);
+        callback(mockFeedback, evt);
+      }
+
+      desktop.addEventListener(
+          chrome.automation.EventType.LOAD_COMPLETE, listener);
       CommandHandler.onCommand('showKbExplorerPage');
     });
   }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
index 62d085c..5a1ec92 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
@@ -115,8 +115,8 @@
         .call(doCmd('forceClickOnCurrentItem'))
         .expectSpeech(/Quick Orientation Tutorial, [0-9]+ Lessons/)
         .expectSpeech(
-            ' Press Search + Right Arrow, or Search + Left Arrow to browse ' +
-            'lessons for this topic ')
+            'Press Search + Right Arrow, or Search + Left Arrow to browse ' +
+            'lessons for this topic')
         .call(doCmd('nextObject'))
         .expectSpeech('Welcome to ChromeVox!')
         .call(() => {
@@ -488,18 +488,18 @@
         .call(doCmd('forceClickOnCurrentItem'))
         .expectSpeech(/Welcome to the ChromeVox tutorial./)
         .call(() => {
-          assertEquals(0, tutorial.activeLessonNum);
+          assertEquals(0, tutorial.activeLessonId);
           firstLessonNode = getRangeStartNode();
         })
         .call(simulateKeyPress.bind(this, KeyCode.RIGHT, {searchKeyHeld: true}))
         .call(() => {
           assertEquals(firstLessonNode, getRangeStartNode());
-          assertEquals(0, tutorial.activeLessonNum);
+          assertEquals(0, tutorial.activeLessonId);
         })
         .call(simulateKeyPress.bind(this, KeyCode.LEFT, {searchKeyHeld: true}))
         .call(() => {
           assertEquals(firstLessonNode, getRangeStartNode());
-          assertEquals(0, tutorial.activeLessonNum);
+          assertEquals(0, tutorial.activeLessonId);
         })
         // Pressing space, which is the desired key sequence, should move us to
         // the next lesson.
@@ -507,7 +507,7 @@
         .expectSpeech('Essential Keys: Control')
         .expectSpeech(/Let's start with a few keys you'll use regularly./)
         .call(() => {
-          assertEquals(1, tutorial.activeLessonNum);
+          assertEquals(1, tutorial.activeLessonId);
           assertNotEquals(firstLessonNode, getRangeStartNode());
         })
         // Pressing control, which is the desired key sequence, should move us
@@ -515,7 +515,7 @@
         .call(simulateKeyPress.bind(this, KeyCode.CONTROL, {}))
         .expectSpeech('Essential Keys: Shift')
         .call(() => {
-          assertEquals(2, tutorial.activeLessonNum);
+          assertEquals(2, tutorial.activeLessonId);
         })
         .replay();
   });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js
index f4dbfd9..9b57e7c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js
@@ -38,8 +38,9 @@
             base::Unretained(AccessibilityManager::Get()),
             true);
       `);
-    // TODO(accessibility): fix errors and enable fail on console errors.
+
     super.testGenPreambleCommon(
-        'kChromeVoxExtensionId', false /* don't fail on console error */);
+        'kChromeVoxExtensionId', ChromeVoxE2ETest.prototype.failOnConsoleError);
   }
 };
+ChromeVoxE2ETest.prototype.failOnConsoleError = true;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
index 1b3e0454..4803ef4 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
@@ -109,7 +109,7 @@
    * to collect feedback.
    */
   install() {
-    assertFalse(this.replaying_);
+    assertFalse(this.replaying_, 'install: Should not already be replaying.');
 
     const MockTts = function() {};
     MockTts.prototype = {
@@ -160,7 +160,8 @@
    * @return {MockFeedback} |this| for chaining
    */
   expectSpeech() {
-    assertFalse(this.replaying_);
+    assertFalse(
+        this.replaying_, 'expectSpeech: Should not already be replaying.');
     Array.prototype.forEach.call(arguments, function(text) {
       this.pendingActions_.push({
         perform: function() {
@@ -232,7 +233,9 @@
    * @return {MockFeedback} |this| for chaining
    */
   expectSpeechWithProperties(expectedProps, ...rest) {
-    assertFalse(this.replaying_);
+    assertFalse(
+        this.replaying_,
+        'expectSpeechWithProperties: Should not already be replaying.');
     Array.prototype.forEach.call(rest, function(text) {
       this.pendingActions_.push({
         perform: function() {
@@ -261,7 +264,9 @@
    * @return {MockFeedback} |this| for chaining
    */
   expectNextSpeechUtteranceIsNot() {
-    assertFalse(this.replaying_);
+    assertFalse(
+        this.replaying_,
+        'expectNextSpeechUtteranceIsNot: Should not already be replaying.');
     Array.prototype.forEach.call(arguments, function(text) {
       this.pendingActions_.push({
         perform: function() {
@@ -290,7 +295,8 @@
    * @return {MockFeedback} |this| for chaining
    */
   expectBraille(text, opt_props) {
-    assertFalse(this.replaying_);
+    assertFalse(
+        this.replaying_, 'expectBraille: Should not already be replaying.');
     const props = opt_props || {};
     this.pendingActions_.push({
       perform: function() {
@@ -314,7 +320,8 @@
    * @return {MockFeedback} |this| for chaining
    */
   expectEarcon(earconName, opt_props) {
-    assertFalse(this.replaying_);
+    assertFalse(
+        this.replaying_, 'expectEarcon: Should not already be replaying.');
     this.pendingActions_.push({
       perform: function() {
         const match =
@@ -336,7 +343,7 @@
    * @return {MockFeedback} |this| for chaining
    */
   call(callback) {
-    assertFalse(this.replaying_);
+    assertFalse(this.replaying_, 'call: Should not already be replaying.');
     this.pendingActions_.push({
       perform() {
         callback();
@@ -374,7 +381,7 @@
    * @return {!Promise} Mandatory to await on if used in async functions.
    */
   replay() {
-    assertFalse(this.replaying_);
+    assertFalse(this.replaying_, 'replay: Should not already be replaying.');
     this.replaying_ = true;
 
     const promise = new Promise((resolve, reject) => {
@@ -394,7 +401,8 @@
    * @type {NavBraille}
    */
   get lastMatchedBraille() {
-    assertTrue(this.replaying_);
+    assertTrue(
+        this.replaying_, 'Should already be replaying when getting braille.');
     return this.lastMatchedBraille_;
   }
 
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn
index 48d43c8a..681a88c 100644
--- a/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -12,6 +12,7 @@
     "oobe_carousel:closure_compile",
     "oobe_focus_behavior:closure_compile",
     "oobe_i18n_behavior:closure_compile",
+    "oobe_scrollable_behavior:closure_compile",
     "oobe_slide:closure_compile",
     "progress_list_item:closure_compile",
     "throbber_notice:closure_compile",
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
index 27a8d6d9..6e2b7400 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
@@ -67,8 +67,6 @@
         border-color: var(--oobe-button-border-color);
         border-radius: var(--oobe-button-radius);
         margin: 0 4px;
-        padding-inline-end: var(--oobe-button-padding-inline-end);
-        padding-inline-start: var(--oobe-button-padding-inline-start);
       }
       :host ::slotted(*),
       .fallback {
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn
index 48fbb25..3f2d9c0 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/oobe_dialog/BUILD.gn
@@ -12,6 +12,7 @@
   deps = [
     "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
     "../oobe_i18n_behavior:oobe_i18n_behavior",
+    "../oobe_scrollable_behavior:oobe_scrollable_behavior",
   ]
   externs_list = [ "$externs_path/pending.js" ]
 }
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html b/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html
index 4492636..3ac4c37 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.html
@@ -10,6 +10,7 @@
 
 <link rel="import" href="/components/common_styles.html">
 <link rel="import" href="/components/oobe_i18n_behavior.html">
+<link rel="import" href="/components/oobe_scrollable_behavior.html">
 
 <!--
   Simple OOBE dialog which should be used for OOBE UI elements.
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js b/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js
index beda40f52..7fb1209 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_dialog/oobe_dialog.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'oobe-dialog',
 
-  behaviors: [OobeI18nBehavior],
+  behaviors: [OobeI18nBehavior, OobeScrollableBehavior],
 
   properties: {
     /**
@@ -72,41 +72,6 @@
     },
   },
 
-  /**
-   * Creates a ResizeObserver and attaches it to the relevant containers
-   * to be observed on size changes and scroll position.
-   */
-  observeScrolling_() {
-    if (this.resizeObserver_) {  // Already observing
-      return;
-    }
-
-    var scrollContainer = this.$$('#topScrollContainer');
-    var footerContainer = this.$$('#footerContainer');
-    if (!scrollContainer || !footerContainer) {
-      return;
-    }
-
-    scrollContainer.addEventListener(
-        'scroll', this.applyScrollClassTags_.bind(this));
-    this.resizeObserver_ =
-        new ResizeObserver(this.applyScrollClassTags_.bind(this));
-    this.resizeObserver_.observe(scrollContainer);
-    this.resizeObserver_.observe(footerContainer);
-  },
-
-  /**
-   * Applies the class tags to topScrollContainer that control the shadows.
-   */
-  applyScrollClassTags_() {
-    var el = this.$$('#topScrollContainer');
-    el.classList.toggle('can-scroll', el.clientHeight < el.scrollHeight);
-    el.classList.toggle('is-scrolled', el.scrollTop > 0);
-    el.classList.toggle(
-        'scrolled-to-bottom',
-        el.scrollTop + el.clientHeight >= el.scrollHeight);
-  },
-
   focus() {
     /* When Network Selection Dialog is shown because user pressed "Back"
        button on EULA screen, display_manager does not inform this dialog that
@@ -120,7 +85,12 @@
   onBeforeShow() {
     document.documentElement.removeAttribute('new-layout');
     this.$$('#lazy').get();
-    this.observeScrolling_();
+    var footerContainer = this.$$('#footerContainer');
+    var scrollContainer = this.$$('#topScrollContainer');
+    if (!scrollContainer || !footerContainer) {
+      return;
+    }
+    this.initScrollableObservers(scrollContainer, footerContainer);
   },
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/BUILD.gn
new file mode 100644
index 0000000..6cebce11
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/BUILD.gn
@@ -0,0 +1,12 @@
+# 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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+  deps = [ ":oobe_scrollable_behavior" ]
+}
+
+js_library("oobe_scrollable_behavior") {
+}
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.html b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.html
new file mode 100644
index 0000000..1009090
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.html
@@ -0,0 +1 @@
+<script src="oobe_scrollable_behavior.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.js b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.js
new file mode 100644
index 0000000..9b77ad7
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/components/oobe_scrollable_behavior/oobe_scrollable_behavior.js
@@ -0,0 +1,50 @@
+// 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.
+
+/**
+ * @fileoverview
+ * 'OobeScrollableBehavior' is a special behavior which helps to update classes
+ * on the scrollable element on size change.
+ */
+
+/** @polymerBehavior */
+const OobeScrollableBehavior = {
+  /**
+   * Init observers to keep track of the scrollable element size changes.
+   */
+  initScrollableObservers(scrollableElement, ...sizeChangeObservableElemenets) {
+    if (!scrollableElement) {
+      return;
+    }
+    this.scrollableElement_ = scrollableElement;
+    this.resizeObserver_ =
+        new ResizeObserver(this.applyScrollClassTags_.bind(this));
+    this.scrollableElement_.addEventListener(
+      'scroll', this.applyScrollClassTags_.bind(this));
+    this.resizeObserver_.observe(this.scrollableElement_);
+    for (var i = 0; i < sizeChangeObservableElemenets.length; ++i) {
+      this.resizeObserver_.observe(sizeChangeObservableElemenets[i]);
+    }
+  },
+
+  /**
+   * Applies the class tags to topScrollContainer that control the shadows.
+   */
+  applyScrollClassTags_() {
+    var el = this.scrollableElement_;
+    el.classList.toggle('can-scroll', el.clientHeight < el.scrollHeight);
+    el.classList.toggle('is-scrolled', el.scrollTop > 0);
+    el.classList.toggle(
+        'scrolled-to-bottom',
+        el.scrollTop + el.clientHeight >= el.scrollHeight);
+  },
+};
+
+/**
+ * TODO: Replace with an interface. b/24294625
+ * @typedef {{
+ *   initScrollableObservers: function()
+ * }}
+ */
+OobeScrollableBehavior.Proto;
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/module.html b/chrome/browser/resources/new_tab_page/modules/cart/module.html
index 4b2051f..73695c3 100644
--- a/chrome/browser/resources/new_tab_page/modules/cart/module.html
+++ b/chrome/browser/resources/new_tab_page/modules/cart/module.html
@@ -192,7 +192,8 @@
   }
 </style>
 <ntp-module-header
-    chip-text="$i18n{modulesCartHeaderNew}"
+    chip-text="[[headerChipText]]" 
+    description-text="[[headerDescriptionText]]"
     show-menu-button on-menu-button-click="onModuleMenuButtonClick_">
   $i18n{modulesCartTitle}
 </ntp-module-header>
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/module.js b/chrome/browser/resources/new_tab_page/modules/cart/module.js
index dc93a3da..e8844a1 100644
--- a/chrome/browser/resources/new_tab_page/modules/cart/module.js
+++ b/chrome/browser/resources/new_tab_page/modules/cart/module.js
@@ -35,6 +35,12 @@
       /** @type {!Array<!chromeCart.mojom.MerchantCart>} */
       cartItems: Array,
 
+      /** @type {string} */
+      headerChipText: String,
+
+      /** @type {string} */
+      headerDescriptionText: String,
+
       /** @private {boolean} */
       showLeftScrollButton_: Boolean,
 
@@ -317,12 +323,19 @@
 
 /** @return {!Promise<?HTMLElement>} */
 async function createCartElement() {
+  const {visible} =
+      await ChromeCartProxy.getInstance().handler.getWarmWelcomeVisible();
   const {carts} =
       await ChromeCartProxy.getInstance().handler.getMerchantCarts();
   if (carts.length === 0) {
     return null;
   }
   const element = new ChromeCartModuleElement();
+  if (visible) {
+    element.headerChipText = loadTimeData.getString('modulesCartHeaderNew');
+    element.headerDescriptionText =
+        loadTimeData.getString('modulesCartWarmWelcome');
+  }
   element.cartItems = carts;
   return element;
 }
@@ -330,4 +343,4 @@
 /** @type {!ModuleDescriptor} */
 export const chromeCartDescriptor = new ModuleDescriptor(
     /*id=*/ 'chrome_cart',
-    /*heightPx=*/ 230, createCartElement);
+    /*heightPx=*/ 238, createCartElement);
diff --git a/chrome/browser/resources/new_tab_page/modules/module_header.html b/chrome/browser/resources/new_tab_page/modules/module_header.html
index 1e37989..eb19b7b 100644
--- a/chrome/browser/resources/new_tab_page/modules/module_header.html
+++ b/chrome/browser/resources/new_tab_page/modules/module_header.html
@@ -1,9 +1,14 @@
 <style include="cr-icons">
   :host {
+    display: flex;
+    flex-direction: column;
+    margin: 16px;
+  }
+
+  #titleContainer {
     align-items: center;
     display: flex;
     height: 22px;
-    margin: 16px;
   }
 
   #title {
@@ -16,6 +21,7 @@
     border-radius: 4px;
     color: var(--ntp-chip-text-color);
     font-size: 10px;
+    height: 12px;
     margin-inline-start: 10px;
     padding: 2px 6px;
   }
@@ -31,24 +37,36 @@
   #dismissButton {
     --cr-icon-button-margin-start: 4px;
   }
+
+  #description {
+    color: var(--cr-secondary-text-color);
+    font-size: 12px;
+    height: 12px;
+    margin-top: 3px;
+  }
 </style>
-<span id="title"><slot></slot></span>
-<template is="dom-if" if="[[chipText]]">
-  <div id="chip">[[chipText]]</div>
-</template>
-<div id="headerSpacer"></div>
-<template is="dom-if" if="[[showInfoButton]]">
-  <cr-icon-button id="infoButton" title="$i18n{moduleInfoButtonTitle}"
-      on-click="onInfoButtonClick_">
-  </cr-icon-button>
-</template>
-<template is="dom-if" if="[[showDismissButton]]">
-  <cr-icon-button id="dismissButton" title="$i18n{moduleDismissButtonTitle}"
-      class="icon-clear" on-click="onDismissButtonClick_">
-  </cr-icon-button>
-</template>
-<template is="dom-if" if="[[showMenuButton]]">
-  <cr-icon-button id="menuButton" title="$i18n{moreActions}"
-      class="icon-more-vert" on-click="onMenuButtonClick_">
-  </cr-icon-button>
+<div id="titleContainer">
+  <span id="title"><slot></slot></span>
+  <template is="dom-if" if="[[chipText]]">
+    <div id="chip">[[chipText]]</div>
+  </template>
+  <div id="headerSpacer"></div>
+  <template is="dom-if" if="[[showInfoButton]]">
+    <cr-icon-button id="infoButton" title="$i18n{moduleInfoButtonTitle}"
+        on-click="onInfoButtonClick_">
+    </cr-icon-button>
+  </template>
+  <template is="dom-if" if="[[showDismissButton]]">
+    <cr-icon-button id="dismissButton" title="$i18n{moduleDismissButtonTitle}"
+        class="icon-clear" on-click="onDismissButtonClick_">
+    </cr-icon-button>
+  </template>
+  <template is="dom-if" if="[[showMenuButton]]">
+    <cr-icon-button id="menuButton" title="$i18n{moreActions}"
+        class="icon-more-vert" on-click="onMenuButtonClick_">
+    </cr-icon-button>
+  </template>
+</div>
+<template is="dom-if" if="[[descriptionText]]">
+  <span id="description">[[descriptionText]]</span>
 </template>
diff --git a/chrome/browser/resources/new_tab_page/modules/module_header.js b/chrome/browser/resources/new_tab_page/modules/module_header.js
index 8843bfd..85cf783 100644
--- a/chrome/browser/resources/new_tab_page/modules/module_header.js
+++ b/chrome/browser/resources/new_tab_page/modules/module_header.js
@@ -30,6 +30,12 @@
       chipText: String,
 
       /**
+       * The description text showing in the header.
+       * @type {string}
+       */
+      descriptionText: String,
+
+      /**
        * True if the header should display an info button.
        * @type {boolean}
        */
diff --git a/chrome/browser/resources/ntp4/BUILD.gn b/chrome/browser/resources/ntp4/BUILD.gn
index d6459b3d..3f7c0a29 100644
--- a/chrome/browser/resources/ntp4/BUILD.gn
+++ b/chrome/browser/resources/ntp4/BUILD.gn
@@ -2,7 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//chrome/common/features.gni")
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
 
 js_type_check("closure_compile") {
   deps = [ ":apps_page" ]
@@ -51,3 +54,45 @@
     "$externs_path/chrome_send.js",
   ]
 }
+
+grit("apps_resources") {
+  defines = chrome_grit_defines
+
+  # These arguments are needed since the grd is generated at build time.
+  enable_input_discovery_for_gn_analyze = false
+  source = "$target_gen_dir/apps_resources.grd"
+  deps = [ ":build_apps_grd" ]
+
+  outputs = [
+    "grit/apps_resources.h",
+    "grit/apps_resources_map.cc",
+    "grit/apps_resources_map.h",
+    "apps_resources.pak",
+  ]
+  output_dir = "$root_gen_dir/chrome"
+}
+
+generate_grd("build_apps_grd") {
+  grd_prefix = "apps"
+  out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
+  input_files = [
+    "apps_page.css",
+    "apps_page.js",
+    "card_slider.js",
+    "dot_list.js",
+    "images/trash.png",
+    "nav_dot.css",
+    "nav_dot.js",
+    "new_tab.css",
+    "new_tab.html",
+    "new_tab.js",
+    "page_list_view.js",
+    "page_switcher.js",
+    "tile_page.css",
+    "tile_page.js",
+    "touch_handler.js",
+    "trash.css",
+    "trash.js",
+  ]
+  input_files_base_dir = rebase_path(".", "//")
+}
diff --git a/chrome/browser/resources/ntp4/new_tab.html b/chrome/browser/resources/ntp4/new_tab.html
index 9198dcf..cf557cfe 100644
--- a/chrome/browser/resources/ntp4/new_tab.html
+++ b/chrome/browser/resources/ntp4/new_tab.html
@@ -14,40 +14,38 @@
       content="user-scalable=no, width=device-width, maximum-scale=1.0">
 
 <link id="themecss" rel="stylesheet">
-<script src="../../../../ui/webui/resources/js/assert.js"></script>
-<script src="../../../../ui/webui/resources/js/util.js"></script>
-<script src="../../../../ui/webui/resources/js/load_time_data.js"></script>
+<script src="chrome://resources/js/assert.js"></script>
+<script src="chrome://resources/js/util.js"></script>
+<script src="chrome://resources/js/load_time_data.js"></script>
 <script src="chrome://apps/strings.js"></script>
 <script>
 // Until themes can clear the cache, force-reload the theme stylesheet.
 $('themecss').href = 'chrome://theme/css/new_tab_theme.css?' + Date.now();
 </script>
 <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
-<link rel="stylesheet" href="../../../../ui/webui/resources/css/bubble.css">
-<link rel="stylesheet" href="../../../../ui/webui/resources/css/menu.css">
-<link rel="stylesheet" href="../../../../ui/webui/resources/css/menu_button.css">
-<link rel="stylesheet" href="../../../../ui/webui/resources/css/widgets.css">
+<link rel="stylesheet" href="chrome://resources/css/menu.css">
+<link rel="stylesheet" href="chrome://resources/css/menu_button.css">
+<link rel="stylesheet" href="chrome://resources/css/widgets.css">
 <link rel="stylesheet" href="apps_page.css">
 <link rel="stylesheet" href="nav_dot.css">
 <link rel="stylesheet" href="new_tab.css">
 <link rel="stylesheet" href="tile_page.css">
 <link rel="stylesheet" href="trash.css">
-<script src="../../../../ui/webui/resources/js/action_link.js"></script>
-<script src="../../../../ui/webui/resources/js/event_tracker.js"></script>
-<script src="../../../../ui/webui/resources/js/parse_html_subset.js"></script>
+<script src="chrome://resources/js/action_link.js"></script>
+<script src="chrome://resources/js/event_tracker.js"></script>
+<script src="chrome://resources/js/parse_html_subset.js"></script>
 
-<script src="../../../../ui/webui/resources/js/cr.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/event_target.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/bubble.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/context_menu_handler.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/drag_wrapper.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/focus_manager.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/menu_item.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/menu.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/position_util.js"></script>
-<script src="../../../../ui/webui/resources/js/cr/ui/menu_button.js"></script>
-<script src="../../../../ui/webui/resources/js/icon.js"></script>
+<script src="chrome://resources/js/cr.js"></script>
+<script src="chrome://resources/js/cr/event_target.js"></script>
+<script src="chrome://resources/js/cr/ui.js"></script>
+<script src="chrome://resources/js/cr/ui/context_menu_handler.js"></script>
+<script src="chrome://resources/js/cr/ui/drag_wrapper.js"></script>
+<script src="chrome://resources/js/cr/ui/focus_manager.js"></script>
+<script src="chrome://resources/js/cr/ui/menu_item.js"></script>
+<script src="chrome://resources/js/cr/ui/menu.js"></script>
+<script src="chrome://resources/js/cr/ui/position_util.js"></script>
+<script src="chrome://resources/js/cr/ui/menu_button.js"></script>
+<script src="chrome://resources/js/icon.js"></script>
 
 <script src="tile_page.js"></script>
 <script src="apps_page.js"></script>
diff --git a/chrome/browser/resources/print_preview/ui/more_settings.html b/chrome/browser/resources/print_preview/ui/more_settings.html
index b9dd2c7a..d1bda1ab 100644
--- a/chrome/browser/resources/print_preview/ui/more_settings.html
+++ b/chrome/browser/resources/print_preview/ui/more_settings.html
@@ -32,7 +32,7 @@
   }
 </style>
 <div on-click="toggleExpandButton_" actionable>
-  <cr-expand-button alt="$i18n{moreOptionsLabel}"
+  <cr-expand-button aria-label="$i18n{moreOptionsLabel}"
       expanded="{{settingsExpandedByUser}}" disabled="[[disabled]]">
     <div id="label">$i18n{moreOptionsLabel}</div>
   </cr-expand-button>
diff --git a/chrome/browser/resources/read_later/BUILD.gn b/chrome/browser/resources/read_later/BUILD.gn
index 3e34f3e1..0319a5cd 100644
--- a/chrome/browser/resources/read_later/BUILD.gn
+++ b/chrome/browser/resources/read_later/BUILD.gn
@@ -93,7 +93,9 @@
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
     "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js:util.m",
   ]
+  externs_list = [ "$externs_path/metrics_private.js" ]
 }
 
 js_library("read_later_api_proxy") {
diff --git a/chrome/browser/resources/read_later/app.html b/chrome/browser/resources/read_later/app.html
index e379eb8..04e1d2b 100644
--- a/chrome/browser/resources/read_later/app.html
+++ b/chrome/browser/resources/read_later/app.html
@@ -78,7 +78,7 @@
       title="$i18n{tooltipClose}">
   </cr-icon-button>
 </div>
-<div id="read-later-list">
+<div id="readLaterList">
   <iron-selector id="selector" on-keydown="onItemKeyDown_"
       attr-for-selected="data-url" selectable="read-later-item">
     <div hidden="[[!unreadItems_.length]]" class="sub-heading">
diff --git a/chrome/browser/resources/read_later/app.js b/chrome/browser/resources/read_later/app.js
index bf0e62a..9ccdb132 100644
--- a/chrome/browser/resources/read_later/app.js
+++ b/chrome/browser/resources/read_later/app.js
@@ -11,6 +11,7 @@
 import './read_later_shared_style.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {listenOnce} from 'chrome://resources/js/util.m.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ReadLaterApiProxy, ReadLaterApiProxyImpl} from './read_later_api_proxy.js';
@@ -50,13 +51,21 @@
   /** @override */
   ready() {
     super.ready();
+
+    listenOnce(this.$.readLaterList, 'dom-change', () => {
+      // Push ShowUI() callback to the event queue to allow deferred rendering
+      // to take place.
+      setTimeout(() => {
+        this.apiProxy_.showUI();
+
+        // Record the first time it takes for the initial list of entries to
+        // render.
+        chrome.metricsPrivate.recordTime(
+            'ReadingList.WebUI.InitialEntriesRenderTime',
+            Math.round(window.performance.now()));
+      }, 0);
+    });
     this.updateItems_();
-    // Push ShowUI() callback to the event queue to allow deferred rendering to
-    // take place.
-    // TODO(corising): Determine the ideal place to make this call.
-    setTimeout(() => {
-      this.apiProxy_.showUI();
-    }, 0);
   }
 
   /** @override */
@@ -77,7 +86,12 @@
 
   /** @private */
   updateItems_() {
+    const getEntriesStartTimestamp = Date.now();
     this.apiProxy_.getReadLaterEntries().then(({entries}) => {
+      chrome.metricsPrivate.recordTime(
+          'ReadingList.WebUI.ReadingListDataReceived',
+          Math.round(Date.now() - getEntriesStartTimestamp));
+
       this.unreadItems_ = entries.unreadEntries;
       this.readItems_ = entries.readEntries;
     });
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.html b/chrome/browser/resources/settings/autofill_page/passwords_device_section.html
index a57cf75a..ecb39158 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.html
+++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.html
@@ -26,7 +26,7 @@
 </style>
 <div id="moveMultiplePasswordsBanner" on-click="onMoveMultiplePasswordsTap_"
     class="cr-row two-line"
-    hidden$="[[!movingMultiplePasswordsToAccountFeatureEnabled_]]">
+    hidden$="[[!shouldShowMoveMultiplePasswordsBanner_]]">
   <img id="googleGIcon" alt=""
   src="chrome://settings/images/googleg_standard_clr_32px.svg">
   <div class="flex cr-padded-text">
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_device_section.js b/chrome/browser/resources/settings/autofill_page/passwords_device_section.js
index dd9356b..1fe49b73 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_device_section.js
+++ b/chrome/browser/resources/settings/autofill_page/passwords_device_section.js
@@ -124,6 +124,20 @@
       observer: 'onAllDevicePasswordsChanged_',
     },
 
+    /**
+     * Whether the entry point leading to the dialog to move multiple passwords
+     * to the Google Account should be shown. It's shown only where there is at
+     * least one password store on device.
+     * @private
+     */
+    shouldShowMoveMultiplePasswordsBanner_: {
+      type: Boolean,
+      value: false,
+      computed: 'computeShouldShowMoveMultiplePasswordsBanner_(' +
+          'allDevicePasswords_)',
+    },
+
+
     /** @private {!MultiStorePasswordUiEntry} */
     lastFocused_: Object,
 
@@ -183,14 +197,6 @@
       value: '',
     },
 
-    /** @private */
-    movingMultiplePasswordsToAccountFeatureEnabled_: {
-      type: Boolean,
-      value() {
-        return loadTimeData.getBoolean(
-            'enableMovingMultiplePasswordsToAccount');
-      }
-    },
   },
 
   keyBindings: {
@@ -271,6 +277,15 @@
 
   /**
    * @private
+   * @return {boolean}
+   */
+  computeShouldShowMoveMultiplePasswordsBanner_() {
+    return loadTimeData.getBoolean('enableMovingMultiplePasswordsToAccount') &&
+        (this.allDevicePasswords_.length > 0);
+  },
+
+  /**
+   * @private
    */
   async onAllDevicePasswordsChanged_() {
     this.devicePasswordsLabel_ =
diff --git a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html
index 3038432..dcf56121 100644
--- a/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html
+++ b/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.html
@@ -52,7 +52,7 @@
       </settings-checkbox>
     </div>
     <cr-expand-button
-        alt="[[showItemsLinkLabel_]]"
+        aria-label="[[showItemsLinkLabel_]]"
         class="cr-row"
         expanded="{{itemsToRemoveSectionExpanded_}}"
         hidden="[[!showItemsToRemove_]]"
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html
index 4bd7d285..8d30a475 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html
@@ -293,7 +293,7 @@
                                  propertiesReceived_, showMeteredToggle_)]]">
         <!-- Advanced toggle. -->
         <cr-expand-button
-            alt="$i18n{networkSectionAdvancedA11yLabel}"
+            aria-label="$i18n{networkSectionAdvancedA11yLabel}"
             class="settings-box"
             expanded="{{advancedExpanded_}}">
           $i18n{networkSectionAdvanced}
@@ -346,7 +346,7 @@
           globalPolicy, managedNetworkAvailable)]]">
         <!-- Network toggle -->
         <cr-expand-button
-            alt="$i18n{networkSectionNetworkExpandA11yLabel}"
+            aria-label="$i18n{networkSectionNetworkExpandA11yLabel}"
             class="settings-box"
             expanded="{{networkExpanded_}}">
           <div class="settings-row">
@@ -403,7 +403,7 @@
           globalPolicy, managedNetworkAvailable)]]">
         <!-- Proxy toggle -->
         <cr-expand-button
-            alt="$i18n{networkSectionProxyExpandA11yLabel}"
+            aria-label="$i18n{networkSectionProxyExpandA11yLabel}"
             class="settings-box"
             expanded="{{proxyExpanded_}}">
           $i18n{networkSectionProxy}
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
index b8e4fca..040828a 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
@@ -51,7 +51,7 @@
         <template is="dom-if" if="[[allowAddConnection_(globalPolicy_,
             managedNetworkAvailable)]]">
           <cr-expand-button
-              alt="$i18n{internetAddConnectionExpandA11yLabel}"
+              aria-label="$i18n{internetAddConnectionExpandA11yLabel}"
               class="settings-box two-line"
               expanded="{{addConnectionExpanded_}}"
               id="expandAddConnections">
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.html b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.html
index 5b8fa85..c35e0ea 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.html
@@ -17,6 +17,7 @@
   <template>
     <style>
       h1.title {
+        font-family: 'Google Sans';
         font-weight: bold;
         margin: 0;
         padding-block-end: 0;
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.html b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.html
index 09f51f4..3e411f9 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.html
@@ -17,6 +17,7 @@
       }
 
       h1 {
+        font-family: 'Google Sans';
         font-size: 16px;
         font-weight: bold;
         line-height: 24px;
@@ -34,6 +35,27 @@
         font-weight: 600;
         padding-block-start: 20px;
       }
+
+      #dataUsageDataIcon {
+        --iron-icon-fill-color: var(--google-grey-600);
+        height: 16px;
+        padding-bottom: 2px;
+        width: 16px;
+      }
+
+      #dataUsageDataTooltip {
+        --paper-tooltip-background: var(--google-grey-900);
+        --paper-tooltip-opacity: 0.8;
+        --paper-tooltip: {
+          margin-inline-end: 6px;
+        };
+      }
+
+      #dataUsageDataTooltipText {
+        font-size: 12px;
+        font-weight: normal;
+        line-height: 18px;
+      }
     </style>
     <cr-dialog id="dialog">
       <h1 slot="title">
@@ -42,6 +64,32 @@
       <div slot="body">
         <cr-radio-group selected="[[selectedDataUsage_(
             prefs.nearby_sharing.data_usage.value)]]">
+          <cr-radio-button id="dataUsageDataButton"
+              name="[[NearbyShareDataUsage.ONLINE]]"
+              aria-labelledby="dataUsageDataLabel"
+              aria-describedby="dataUsageDataDescription
+                  dataUsageDataTooltipText">
+            <div id="dataUsageDataLabel" class="data-usage-name"
+                aria-hidden="true">
+              $i18n{nearbyShareDataUsageDataLabel}
+              <iron-icon id="dataUsageDataIcon"
+                  icon="cr:info-outline"
+                  aria-hidden="true">
+              </iron-icon>
+              <paper-tooltip id="dataUsageDataTooltip"
+                  for="dataUsageDataIcon"
+                  offset="8"
+                  position="right"
+                  fit-to-visible-bounds>
+                <span id="dataUsageDataTooltipText">
+                  $i18n{nearbyShareDataUsageDataTooltip}
+                </span>
+              </paper-tooltip>
+            </div>
+            <div id="dataUsageDataDescription" aria-hidden="true">
+              $i18n{nearbyShareDataUsageDataDescription}
+            </div>
+          </cr-radio-button>
           <cr-radio-button id="dataUsageWifiOnlyButton"
               name="[[NearbyShareDataUsage.WIFI_ONLY]]"
               aria-labelledby="dataUsageWifiOnlyLabel"
@@ -54,18 +102,6 @@
               $i18n{nearbyShareDataUsageWifiOnlyDescription}
             </div>
           </cr-radio-button>
-          <cr-radio-button id="dataUsageDataButton"
-              name="[[NearbyShareDataUsage.ONLINE]]"
-              aria-labelledby="dataUsageDataLabel"
-              aria-describedby="dataUsageDataDescription">
-            <div id="dataUsageDataLabel" class="data-usage-name"
-                aria-hidden="true">
-              $i18n{nearbyShareDataUsageDataLabel}
-            </div>
-            <div id="dataUsageDataDescription" aria-hidden="true">
-              $i18n{nearbyShareDataUsageDataDescription}
-            </div>
-          </cr-radio-button>
           <cr-radio-button id="dataUsageOfflineButton"
               name="[[NearbyShareDataUsage.OFFLINE]]"
               aria-labelledby="dataUsageOfflineLabel"
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.html b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.html
index 4cb899e8..cd4f32e7 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.html
@@ -15,6 +15,7 @@
       }
 
       h1 {
+        font-family: 'Google Sans';
         font-size: 16px;
         font-weight: bold;
         line-height: 24px;
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.html
index 87532bb5..e29ec6dd 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.html
@@ -135,7 +135,7 @@
       </div>
     </template>
     <cr-expand-button
-        alt="$i18n{textToSpeechMoreLanguages}"
+        aria-label="$i18n{textToSpeechMoreLanguages}"
         class="settings-box continuation"
         expanded="{{languagesOpened}}"
         hidden="[[!hasVoices]]">
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html
index 10c2a50d..5c9409e 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.html
+++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -152,7 +152,7 @@
         <template is="dom-if" if="[[!isChromeOSLanguagesSettingsUpdate_]]">
 </if> <!-- chromeos -->
           <cr-expand-button
-              alt="$i18n{languagesExpandA11yLabel}"
+              aria-label="$i18n{languagesExpandA11yLabel}"
               class="cr-row first"
               expanded="{{languagesOpened_}}">
             <div>$i18n{languagesListTitle}</div>
diff --git a/chrome/browser/resources/settings/people_page/manage_profile.html b/chrome/browser/resources/settings/people_page/manage_profile.html
index 91e7f05..948cf6a 100644
--- a/chrome/browser/resources/settings/people_page/manage_profile.html
+++ b/chrome/browser/resources/settings/people_page/manage_profile.html
@@ -121,7 +121,7 @@
         <cr-toggle id="hasShortcutToggle"
             checked="{{hasProfileShortcut_}}"
             on-change="onHasProfileShortcutChange_"
-            aria-labelledby="showShortcutLabel">
+            aria-labelledby="labelWrapper">
         </cr-toggle>
       </div>
       <div class="hr"></div>
diff --git a/chrome/browser/resources/settings/people_page/signout_dialog.html b/chrome/browser/resources/settings/people_page/signout_dialog.html
index 8c1e18aa..deb8c305 100644
--- a/chrome/browser/resources/settings/people_page/signout_dialog.html
+++ b/chrome/browser/resources/settings/people_page/signout_dialog.html
@@ -67,7 +67,7 @@
               $i18n{syncDisconnectDeleteProfile}
             </cr-checkbox>
             <cr-expand-button expanded="{{deleteProfileWarningVisible_}}"
-                alt="$i18n{deleteProfileWarningExpandA11yLabel}">
+                aria-label="$i18n{deleteProfileWarningExpandA11yLabel}">
             </cr-expand-button>
           </div>
           <iron-collapse opened="[[deleteProfileWarningVisible_]]">
diff --git a/chrome/browser/resources/settings/privacy_page/collapse_radio_button.html b/chrome/browser/resources/settings/privacy_page/collapse_radio_button.html
index 86cc781..83bde4cd 100644
--- a/chrome/browser/resources/settings/privacy_page/collapse_radio_button.html
+++ b/chrome/browser/resources/settings/privacy_page/collapse_radio_button.html
@@ -87,7 +87,7 @@
           </cr-policy-pref-indicator>
         </template>
         <div hidden$="[[noCollapse]]" class="separator"></div>
-        <cr-expand-button alt="[[expandButtonAlt]]"
+        <cr-expand-button aria-label="[[expandAriaLabel]]"
               hidden$="[[noCollapse]]" expanded="{{expanded}}"
               on-click="onExpandClicked_">
         </cr-expand-button>
diff --git a/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js b/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js
index d10d15bb..054d823 100644
--- a/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js
+++ b/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js
@@ -59,10 +59,10 @@
     },
 
     /*
-     * The alt text attribute associated with the expand button. Used by screen
-     * readers when announcing the expand button.
+     * The aria-label attribute associated with the expand button. Used by
+     * screen readers when announcing the expand button.
      */
-    expandButtonAlt: String,
+    expandAriaLabel: String,
   },
 
   observers: [
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html
index 3252689cf..21152841 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.html
+++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -60,7 +60,7 @@
             pref="[[prefs.generated.safe_browsing]]"
             label="$i18n{safeBrowsingEnhanced}"
             sub-label="$i18n{safeBrowsingEnhancedDesc}"
-            expand-button-alt="$i18n{safeBrowsingEnhancedExpandA11yLabel}"
+            expand-aria-label="$i18n{safeBrowsingEnhancedExpandA11yLabel}"
             hidden="[[!safeBrowsingEnhancedEnabled_]]"
             on-expand-clicked="onEnhancedProtectionExpandButtonClicked_"
             no-automatic-collapse>
@@ -102,7 +102,7 @@
             pref="[[prefs.generated.safe_browsing]]"
             label="$i18n{safeBrowsingStandard}"
             sub-label="$i18n{safeBrowsingStandardDesc}"
-            expand-button-alt="$i18n{safeBrowsingStandardExpandA11yLabel}"
+            expand-aria-label="$i18n{safeBrowsingStandardExpandA11yLabel}"
             info-opened="{{infoOpened_}}"
             on-expand-clicked="onStandardProtectionExpandButtonClicked_"
             no-automatic-collapse>
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
index 1d9a8329..45e7e0b 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
@@ -130,7 +130,8 @@
   </div>
 
   <cr-input id="nameInput" pattern=".*\\S.*" value="{{profileName_}}"
-    auto-validate required spellcheck="false">
+    aria-label="$i18n{profileCustomizationInputLabel}" auto-validate
+    required spellcheck="false">
   </cr-input>
 
   <div id="lineSeparator"></div>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_card.html b/chrome/browser/resources/signin/profile_picker/profile_card.html
index 576ba7b1..9c38239 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_card.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_card.html
@@ -146,6 +146,7 @@
   </cr-button>
   <div id="profileNameInputWrapper">
     <cr-input class="profile-card-info prominent-text" id="nameInput"
+        aria-label="$i18n{profileCardInputLabel}"
         value="[[profileState.localProfileName]]"
         on-change="onProfileNameChanged_" on-keydown="onProfileNameKeydown_"
         on-blur="onProfileNameInputBlur_" pattern="[[pattern_]]"
diff --git a/chrome/browser/resources/signin/profile_picker/profile_card_menu.html b/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
index f20c618..ace58a6 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_card_menu.html
@@ -1,4 +1,4 @@
-<style include="cr-icons profile-picker-shared cr-hidden-style">
+<style include="profile-picker-shared cr-hidden-style">
   #moreActionsButton {
     --cr-icon-button-icon-size: 14px;
     --cr-icon-button-margin-end: 0;
@@ -14,12 +14,14 @@
   }
 
   #actionMenu iron-icon {
+    --iron-icon-fill-color: var(--google-grey-700);
     padding-inline-end: 14px;
   }
 
   #actionMenu button {
     --iron-icon-height: 16px;
     --iron-icon-width: 16px;
+    color: var(--google-grey-800);
     padding-inline-start: 14px;
   }
 
@@ -106,6 +108,14 @@
 
 
   @media (prefers-color-scheme: dark) {
+    #actionMenu button {
+      color: var(--google-grey-300);
+    }
+
+    #actionMenu iron-icon {
+      --iron-icon-fill-color: var(--google-grey-500);
+    }
+
     .warning-message {
       color: var(--google-grey-500);
     }
@@ -123,7 +133,7 @@
   }
 </style>
 
-<cr-icon-button class="icon-more-vert" id="moreActionsButton"
+<cr-icon-button iron-icon="cr:more-vert" id="moreActionsButton"
     on-click="onMoreActionsButtonClicked_" title="$i18n{profileMenuName}"
     aria-label="$i18n{profileMenuName}">
 </cr-icon-button>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_card_menu.js b/chrome/browser/resources/signin/profile_picker/profile_card_menu.js
index 197782fe..c8313ffc 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_card_menu.js
+++ b/chrome/browser/resources/signin/profile_picker/profile_card_menu.js
@@ -5,7 +5,6 @@
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
 import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.m.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import 'chrome://resources/cr_elements/cr_icons_css.m.js';
 import 'chrome://resources/cr_elements/hidden_style_css.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
 import './profile_picker_shared_css.js';
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
index 0071a2b..429b10a 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
@@ -173,7 +173,7 @@
             --theme-text-color:[[profileThemeInfo.themeFrameTextColor]];
             --theme-shape-color:[[profileThemeInfo.themeShapeColor]]">
   <iron-icon class="banner" icon="profiles:customize-banner"></iron-icon>
-  <cr-icon-button id="backButton" class="icon-arrow-back"
+  <cr-icon-button id="backButton" iron-icon="cr:arrow-back"
       on-click="onClickBack_" aria-label="$i18n{backButtonLabel}">
   </cr-icon-button>
   <h2 id="title">$i18n{localProfileCreationTitle}</h2>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
index e7ec052f..ef26052 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
@@ -42,7 +42,7 @@
 <div id="headerContainer"
     style$="--theme-frame-color:[[profileThemeInfo.themeFrameColor]];
             --theme-text-color:[[profileThemeInfo.themeFrameTextColor]];">
-  <cr-icon-button id="backButton" class="icon-arrow-back"
+  <cr-icon-button id="backButton" iron-icon="cr:arrow-back"
       on-click="onClickBack_" aria-label="$i18n{backButtonLabel}"
       disabled="[[loadSigninInProgess_]]">
   </cr-icon-button>
diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc
index 2dead3f..eabbbb2 100644
--- a/chrome/browser/signin/chrome_signin_client.cc
+++ b/chrome/browser/signin/chrome_signin_client.cc
@@ -184,10 +184,10 @@
     } else {
       BrowserList::CloseAllBrowsersWithProfile(
           profile_,
-          base::Bind(&ChromeSigninClient::OnCloseBrowsersSuccess,
-                     base::Unretained(this), signout_source_metric),
-          base::Bind(&ChromeSigninClient::OnCloseBrowsersAborted,
-                     base::Unretained(this)),
+          base::BindRepeating(&ChromeSigninClient::OnCloseBrowsersSuccess,
+                              base::Unretained(this), signout_source_metric),
+          base::BindRepeating(&ChromeSigninClient::OnCloseBrowsersAborted,
+                              base::Unretained(this)),
           signout_source_metric == signin_metrics::ABORT_SIGNIN ||
               signout_source_metric ==
                   signin_metrics::AUTHENTICATION_FAILED_WITH_FORCE_SIGNIN ||
diff --git a/chrome/browser/signin/dice_signed_in_profile_creator.cc b/chrome/browser/signin/dice_signed_in_profile_creator.cc
index 0401f2d..adaf556 100644
--- a/chrome/browser/signin/dice_signed_in_profile_creator.cc
+++ b/chrome/browser/signin/dice_signed_in_profile_creator.cc
@@ -128,8 +128,8 @@
   shutdown_subscription_ =
       DiceSignedInProfileCreatorShutdownNotifierFactory::GetInstance()
           ->Get(profile)
-          ->Subscribe(base::Bind(&TokensLoadedCallbackRunner::OnShutdown,
-                                 base::Unretained(this)));
+          ->Subscribe(base::BindRepeating(
+              &TokensLoadedCallbackRunner::OnShutdown, base::Unretained(this)));
   scoped_identity_manager_observer_.Add(identity_manager_);
 }
 
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
index d31a1f8..0e90403b 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
@@ -249,9 +249,9 @@
     create_services_subscription_ =
         BrowserContextDependencyManager::GetInstance()
             ->RegisterCreateServicesCallbackForTesting(
-                base::Bind(&DiceWebSigninInterceptorBrowserTest::
-                               OnWillCreateBrowserContextServices,
-                           base::Unretained(this)));
+                base::BindRepeating(&DiceWebSigninInterceptorBrowserTest::
+                                        OnWillCreateBrowserContextServices,
+                                    base::Unretained(this)));
   }
 
   void OnWillCreateBrowserContextServices(content::BrowserContext* context) {
diff --git a/chrome/browser/sync/profile_sync_service_factory.cc b/chrome/browser/sync/profile_sync_service_factory.cc
index 84da1682..39f723c 100644
--- a/chrome/browser/sync/profile_sync_service_factory.cc
+++ b/chrome/browser/sync/profile_sync_service_factory.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/favicon/favicon_service_factory.h"
 #include "chrome/browser/gcm/gcm_profile_service_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h"
 #include "chrome/browser/password_manager/account_password_store_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
@@ -49,8 +48,6 @@
 #include "chrome/common/buildflags.h"
 #include "chrome/common/channel_info.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/invalidation/impl/profile_identity_provider.h"
-#include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/network_time/network_time_tracker.h"
 #include "components/sync/driver/profile_sync_service.h"
@@ -152,7 +149,6 @@
   DependsOn(gcm::GCMProfileServiceFactory::GetInstance());
   DependsOn(HistoryServiceFactory::GetInstance());
   DependsOn(IdentityManagerFactory::GetInstance());
-  DependsOn(invalidation::ProfileInvalidationProviderFactory::GetInstance());
   DependsOn(SyncInvalidationsServiceFactory::GetInstance());
   DependsOn(ModelTypeStoreServiceFactory::GetInstance());
   DependsOn(PasswordStoreFactory::GetInstance());
@@ -251,14 +247,6 @@
     init_params.identity_manager =
         IdentityManagerFactory::GetForProfile(profile);
 
-    auto* fcm_invalidation_provider =
-        invalidation::ProfileInvalidationProviderFactory::GetForProfile(
-            profile);
-    if (fcm_invalidation_provider) {
-      init_params.invalidations_identity_provider =
-          fcm_invalidation_provider->GetIdentityProvider();
-    }
-
     // TODO(tim): Currently, AUTO/MANUAL settings refer to the *first* time sync
     // is set up and *not* a browser restart for a manual-start platform (where
     // sync has already been set up, and should be able to start without user
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index 9f0d624..f6bc10e 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -78,7 +78,7 @@
 
   // Returns the collection of default datatypes.
   std::vector<syncer::ModelType> DefaultDatatypes() {
-    static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+    static_assert(39 == syncer::ModelType::NUM_ENTRIES,
                   "When adding a new type, you probably want to add it here as "
                   "well (assuming it is already enabled).");
 
diff --git a/chrome/browser/sync/test/integration/enable_disable_test.cc b/chrome/browser/sync/test/integration/enable_disable_test.cc
index d18a78e..76f032d 100644
--- a/chrome/browser/sync/test/integration/enable_disable_test.cc
+++ b/chrome/browser/sync/test/integration/enable_disable_test.cc
@@ -31,7 +31,6 @@
 using syncer::ModelTypeSet;
 using syncer::ModelTypeToString;
 using syncer::ProxyTypes;
-using syncer::SyncPrefs;
 using syncer::SyncUserSettings;
 using syncer::UserSelectableType;
 using syncer::UserSelectableTypeSet;
@@ -429,7 +428,7 @@
 IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, ResetsPrefsIfClearData) {
   SetupTest(/*all_types_enabled=*/true);
 
-  SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   const std::string first_cache_guid = prefs.GetCacheGuid();
   ASSERT_NE("", first_cache_guid);
 
@@ -443,7 +442,7 @@
                        DoesNotClearPrefsWithKeepData) {
   SetupTest(/*all_types_enabled=*/true);
 
-  SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   const std::string cache_guid = prefs.GetCacheGuid();
   ASSERT_NE("", cache_guid);
 
@@ -476,7 +475,7 @@
 
   SetupTest(/*all_types_enabled=*/true);
 
-  SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   EXPECT_EQ(bag_of_chips.SerializeAsString(), prefs.GetBagOfChips());
 
   sync_pb::ClientToServerMessage message = TriggerGetUpdatesCycleAndWait();
@@ -487,7 +486,7 @@
 IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientSelfNotifyTest,
                        ResendsBagOfChips) {
   ASSERT_TRUE(SetupClients());
-  SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   ASSERT_NE("", prefs.GetBagOfChips());
   ASSERT_TRUE(GetClient(0)->AwaitSyncSetupCompletion());
 
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
index 05d9dcd33..3835837 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -219,7 +219,7 @@
 }
 
 void ProfileSyncServiceHarness::ResetSyncForPrimaryAccount() {
-  syncer::SyncPrefs sync_prefs(profile_->GetPrefs());
+  syncer::SyncTransportDataPrefs transport_data_prefs(profile_->GetPrefs());
   // Generate the https url.
   // CLEAR_SERVER_DATA isn't enabled on the prod Sync server,
   // so --sync-url-clear-server-data can be used to specify an
@@ -231,13 +231,14 @@
       << "Missing switch " << kSyncUrlClearServerDataKey;
   GURL base_url(cmd_line->GetSwitchValueASCII(kSyncUrlClearServerDataKey) +
                 "/command/?");
-  GURL url = syncer::AppendSyncQueryString(base_url, sync_prefs.GetCacheGuid());
+  GURL url = syncer::AppendSyncQueryString(base_url,
+                                           transport_data_prefs.GetCacheGuid());
 
   // Call sync server to clear sync data.
   std::string access_token = service()->GetAccessTokenForTest();
   DCHECK(access_token.size()) << "Access token is not available.";
   ResetAccount(profile_->GetURLLoaderFactory().get(), access_token, url,
-               username_, sync_prefs.GetBirthday());
+               username_, transport_data_prefs.GetBirthday());
 }
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc
index 9af51e72..ad949a2 100644
--- a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc
@@ -76,7 +76,7 @@
   ~SingleClientDeviceInfoSyncTest() override {}
 
   std::string GetLocalCacheGuid() {
-    syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
+    syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
     return prefs.GetCacheGuid();
   }
 
diff --git a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
index e82967d..fd67d2877 100644
--- a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
@@ -24,7 +24,6 @@
 using testing::Le;
 using sessions_helper::CheckInitialState;
 using sessions_helper::OpenTab;
-using syncer::SyncPrefs;
 
 namespace {
 
@@ -42,14 +41,16 @@
 IN_PROC_BROWSER_TEST_F(SingleClientPollingSyncTest, ShouldInitializePollPrefs) {
   // Setup clients and verify no poll interval is present yet.
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
-  SyncPrefs sync_prefs(GetProfile(0)->GetPrefs());
-  EXPECT_TRUE(sync_prefs.GetPollInterval().is_zero());
-  ASSERT_TRUE(sync_prefs.GetLastPollTime().is_null());
+  syncer::SyncTransportDataPrefs transport_data_prefs(
+      GetProfile(0)->GetPrefs());
+  EXPECT_TRUE(transport_data_prefs.GetPollInterval().is_zero());
+  ASSERT_TRUE(transport_data_prefs.GetLastPollTime().is_null());
 
   // Execute a sync cycle and verify the client set up (and persisted) the
   // default value.
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  EXPECT_THAT(sync_prefs.GetPollInterval(), Eq(syncer::kDefaultPollInterval));
+  EXPECT_THAT(transport_data_prefs.GetPollInterval(),
+              Eq(syncer::kDefaultPollInterval));
 }
 
 // This test verifies that updates of the poll interval get persisted
@@ -72,8 +73,9 @@
       GetSyncService(0), GetFakeServer());
   ASSERT_TRUE(checker.Wait());
 
-  SyncPrefs sync_prefs(GetProfile(0)->GetPrefs());
-  EXPECT_THAT(sync_prefs.GetPollInterval().InSeconds(), Eq(67));
+  syncer::SyncTransportDataPrefs transport_data_prefs(
+      GetProfile(0)->GetPrefs());
+  EXPECT_THAT(transport_data_prefs.GetPollInterval().InSeconds(), Eq(67));
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientPollingSyncTest,
@@ -98,7 +100,7 @@
 
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
 
-  SyncPrefs remote_prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs remote_prefs(GetProfile(0)->GetPrefs());
   // Set small polling interval to make random delays introduced in
   // SyncSchedulerImpl::ComputeLastPollOnStart() negligible, but big enough to
   // avoid periodic polls during a test run.
@@ -134,7 +136,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   ASSERT_TRUE(GetClient(0)->AwaitEngineInitialization());
 
-  SyncPrefs remote_prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs remote_prefs(GetProfile(0)->GetPrefs());
   ASSERT_FALSE(remote_prefs.GetLastPollTime().is_null());
 
   // After restart, the last sync cycle snapshot should be empty.
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
index ad4da8f..ecf5cd2 100644
--- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -176,7 +176,7 @@
   ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->IsFirstSetupComplete());
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
 
-  syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   const std::string cache_guid = prefs.GetCacheGuid();
   ASSERT_FALSE(cache_guid.empty());
 
@@ -202,7 +202,7 @@
   ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->IsFirstSetupComplete());
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
 
-  syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
+  syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
   ASSERT_FALSE(prefs.GetCacheGuid().empty());
 
   std::string old_cache_guid;
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
index 5f711b8..3ef7486c 100644
--- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -30,7 +30,7 @@
 namespace {
 
 syncer::ModelTypeSet AllowedTypesInStandaloneTransportMode() {
-  static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+  static_assert(39 == syncer::ModelType::NUM_ENTRIES,
                 "Add new types below if they run in transport mode");
   // Only some special whitelisted types (and control types) are allowed in
   // standalone transport mode.
@@ -235,8 +235,9 @@
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
-  syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
-  const std::string cache_guid = prefs.GetCacheGuid();
+  syncer::SyncTransportDataPrefs transport_data_prefs(
+      GetProfile(0)->GetPrefs());
+  const std::string cache_guid = transport_data_prefs.GetCacheGuid();
   ASSERT_FALSE(cache_guid.empty());
 
   // Save the cache GUID to file to remember after restart, for test
@@ -264,8 +265,9 @@
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
-  syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
-  ASSERT_FALSE(prefs.GetCacheGuid().empty());
+  syncer::SyncTransportDataPrefs transport_data_prefs(
+      GetProfile(0)->GetPrefs());
+  ASSERT_FALSE(transport_data_prefs.GetCacheGuid().empty());
 
   std::string old_cache_guid;
   base::ScopedAllowBlockingForTesting allow_blocking;
@@ -273,7 +275,7 @@
       base::ReadFileToString(GetTestFilePathForCacheGuid(), &old_cache_guid));
   ASSERT_FALSE(old_cache_guid.empty());
 
-  EXPECT_EQ(old_cache_guid, prefs.GetCacheGuid());
+  EXPECT_EQ(old_cache_guid, transport_data_prefs.GetCacheGuid());
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc b/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc
index de4c4b00..38a44ae 100644
--- a/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc
@@ -399,7 +399,7 @@
   }
 
   std::string GetLocalCacheGuid() {
-    syncer::SyncPrefs prefs(GetProfile(0)->GetPrefs());
+    syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs());
     return prefs.GetCacheGuid();
   }
 
diff --git a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
index 277831aa5..8b39a510 100644
--- a/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_polling_sync_test.cc
@@ -116,19 +116,20 @@
   // start-up) and verify it receives the latest changes and the poll cycle
   // updated the last-poll-time.
   // All data is already there, so we can get it in the first poll.
-  SyncPrefs remote_prefs(GetProfile(1)->GetPrefs());
+  syncer::SyncTransportDataPrefs remote_transport_data_prefs(
+      GetProfile(1)->GetPrefs());
   // Note: SyncSchedulerImpl delays a poll on startup by up to 1% of the poll
   // interval. 1% of 4 hours (the default poll interval) is still a while, so
   // set a shorter poll interval here.
   base::TimeDelta poll_interval = base::TimeDelta::FromMinutes(2);
-  remote_prefs.SetPollInterval(poll_interval);
+  remote_transport_data_prefs.SetPollInterval(poll_interval);
   base::Time remote_start = base::Time::Now();
   base::Time new_last_poll_time =
       remote_start - poll_interval - base::TimeDelta::FromMilliseconds(100);
-  remote_prefs.SetLastPollTime(new_last_poll_time);
+  remote_transport_data_prefs.SetLastPollTime(new_last_poll_time);
   ASSERT_TRUE(GetClient(1)->StartSyncService()) << "SetupSync() failed.";
   GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1));
-  EXPECT_THAT(remote_prefs.GetLastPollTime(), Gt(remote_start));
+  EXPECT_THAT(remote_transport_data_prefs.GetLastPollTime(), Gt(remote_start));
 }
 
 }  // namespace
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
index 31983d2..8b17913 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -264,9 +264,14 @@
 
     /**
      * Called when the Tab is attached or detached from an {@code Activity}. By default, this will
-     * automatically unregister the tab observer if the Tab is detached from the window. To
-     * customize this behavior, override this method. When overriding this, keep in mind that tabs
-     * can outlive the activity in some cases (change of theme, changing from phone/tablet, etc).
+     * automatically unregister the tab observer if the Tab is detached from the window.
+     *
+     * TabObservers that are scoped to the Tab itself (either by direct ownership or through
+     * UserData) will need to override this behavior. To do so, ensure there's a functional hook to
+     * unregister the TabObserver to prevent leaking. When overriding this, keep in mind that tabs
+     * can outlive the activity in some cases (change of theme, changing from phone/tablet,
+     * multi-window, etc).
+     *
      * @param tab The notifying {@link Tab}.
      * @param window {@link WindowAndroid} which the Tab is being associated with. {@code null} if
      *         the tab is being detached.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
index 88fef0f6..da779394 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
@@ -4,8 +4,11 @@
 
 package org.chromium.chrome.browser.tab;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.UserData;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * UserData for a {@link Tab}. Used for a {@link WebContents} while it stays
@@ -28,6 +31,11 @@
             public void onDestroyed(Tab tab) {
                 tab.removeObserver(this);
             }
+
+            @Override
+            public void onActivityAttachmentChanged(Tab tab, @Nullable WindowAndroid window) {
+                // Intentionally do nothing to prevent automatic observer removal on detachment.
+            }
         });
     }
 
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index ebf2ba9..e2c7b86 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -618,9 +618,6 @@
       <message name="IDS_PASSWORD_EXPORT_SET_LOCK_SCREEN" desc="Text prompting user to set device lock in order to be able to export passwords">
         Turn on screen lock in Settings to export your passwords from this device
       </message>
-      <message name="IDS_PASSWORD_ENTRY_VIEW_SET_SCREEN_LOCK" desc="Text prompting the user to set up a screen lock on their device in order to be able to view passwords">
-        To view passwords, first set a screen lock on your device
-      </message>
       <message name="IDS_PASSWORD_GENERATION_POPUP_CONTENT_DESCRIPTION" desc="The text announced by the screen reader when the password generation popup is shown.">
         Showing password generation popup
       </message>
@@ -2230,9 +2227,6 @@
       <message name="IDS_PWA_INSTALL_BOTTOM_SHEET_ACCESSIBILITY" desc="The content description for the bottom sheet install UI.">
         Install this app
       </message>
-      <message name="IDS_PWA_INSTALL_BOTTOM_SHEET_CATEGORIES" desc="The content description for the bottom sheet install UI.">
-        Categories: <ph name="COMMA_SEPERATED_CATEGORY_LIST">%1$s<ex>cats, memes</ex></ph>.
-      </message>
 
       <!-- Page info popup -->
       <message name="IDS_PAGE_INFO_CONNECTION_OFFLINE" desc="Message to display in the page info bubble when viewing and offline page.">
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_ENTRY_VIEW_SET_SCREEN_LOCK.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_ENTRY_VIEW_SET_SCREEN_LOCK.png.sha1
deleted file mode 100644
index 88a4507a6..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_ENTRY_VIEW_SET_SCREEN_LOCK.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-b27c3ad1798e549dae05a354a659bf6466fbfd55
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PWA_INSTALL_BOTTOM_SHEET_CATEGORIES.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PWA_INSTALL_BOTTOM_SHEET_CATEGORIES.png.sha1
deleted file mode 100644
index 8ea66a9..0000000
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PWA_INSTALL_BOTTOM_SHEET_CATEGORIES.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-45fda9e16a97dcf1a388a98b7717aed9ccb2b8c8
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index 0ce954e..e52bcabd 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -1100,7 +1100,7 @@
 <translation id="8583805026567836021">የመለያ ውሂብን በማጽዳት ላይ</translation>
 <translation id="8587585930972369234">ለመፈለግ ነክተው ይያዙ</translation>
 <translation id="860043288473659153">የካርድ ያዢ ስም</translation>
-<translation id="860282621117673749">የዋጋ ቅናሽ ማንቂያዎች</translation>
+<translation id="860282621117673749">የዋጋ ቅነሳ ማንቂያዎች</translation>
 <translation id="8616006591992756292">የእርስዎ Google መለያ <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> ላይ ሌሎች የአሰሳ ታሪክ ዓይነቶች ሊኖረው ይችላል።</translation>
 <translation id="8617240290563765734">በወረደው ይዘት ላይ የተጠቆመው ዩአርኤል ይከፈት?</translation>
 <translation id="8636825310635137004">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ስምረትን ያብሩ።</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index 124d896..374334a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -237,7 +237,7 @@
 <translation id="2650751991977523696">Fitxategia berriro deskargatu nahi duzu?</translation>
 <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio-fitxategi}other{# audio-fitxategi}}</translation>
 <translation id="2656405586795711023">Sareko aplikazioak</translation>
-<translation id="2689830683995595741">Chrome erabiltzen baduzu, onartu egingo dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Family Link aplikazioaren bidez kudeatutako Google-ko kontuen Pribatutasun-oharra<ph name="END_LINK3" /> aplikatzen da ere.</translation>
+<translation id="2689830683995595741">Chrome erabiltzen baduzu, onartuko dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Family Link aplikazioaren bidez kudeatutako Google-ko kontuen Pribatutasun-oharra<ph name="END_LINK3" /> aplikatzen da ere.</translation>
 <translation id="2704606927547763573">Kopiatuta</translation>
 <translation id="2707726405694321444">Freskatu orria</translation>
 <translation id="2709516037105925701">Betetze automatikoa</translation>
@@ -414,7 +414,7 @@
 <translation id="3963007978381181125">Pasaesaldi bidezko enkriptatzeak ez ditu hartzen barne Google Pay-ko ordainketa-metodoak eta helbideak. Pasaesaldia dutenek soilik irakur ditzakete enkriptatutako datuak. Pasaesaldia ez da bidaltzen Google-ra, ezta bertan gordetzen ere. Pasaesaldia ahazten bazaizu edo ezarpena aldatu nahi baduzu, sinkronizazioa berrezarri beharko duzu. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation>
 <translation id="3967822245660637423">Deskargatzen amaitu da</translation>
 <translation id="3969142555815019568">Chrome-k ezin ditu egiaztatu pasahitzak</translation>
-<translation id="3974987681202239636">Chrome-n irekiko da <ph name="APP_NAME" />. Aurrera egiten baduzu, onartu egingo dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Family Link aplikazioaren bidez kudeatutako Google-ko kontuen Pribatutasun-oharra<ph name="END_LINK3" /> aplikatzen da ere.</translation>
+<translation id="3974987681202239636">Chrome-n irekiko da <ph name="APP_NAME" />. Aurrera egiten baduzu, onartuko dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Family Link aplikazioaren bidez kudeatutako Google-ko kontuen Pribatutasun-oharra<ph name="END_LINK3" /> aplikatzen da ere.</translation>
 <translation id="397583555483684758">Gelditu egin da sinkronizazioa</translation>
 <translation id="3976396876660209797">Kendu eta sortu berriro lasterbide hau</translation>
 <translation id="3985215325736559418"><ph name="FILE_NAME" /> berriro deskargatu nahi duzu?</translation>
@@ -749,7 +749,7 @@
 <translation id="6266591733731644292">Pribatutasunaren proben eremuak eginbide mugatuak dauzka oraindik. Probaldiak dirauen bitartean:\n<ph name="BEGIN_LIST_ITEM1" />Webgune- eta aplikazio-garatzaileek zerbitzu egokiak sortzeko aukera proba dezakete modu esklusiboan identifikatzen zaituen informazioa atzitu gabe.<ph name="END_LIST_ITEM1" />\n<ph name="BEGIN_LIST_ITEM2" />Erabiltzaileek probaldia ez erabiltzea aukera dezakete orri honetako kontrolatzeko aukerak baliatuta.<ph name="END_LIST_ITEM2" /></translation>
 <translation id="6277522088822131679">Arazo bat izan da orria inprimatzean. Saiatu berriro.</translation>
 <translation id="6278428485366576908">Gaia</translation>
-<translation id="6292420053234093573">Chrome erabiltzen baduzu, onartu egingo dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />.</translation>
+<translation id="6292420053234093573">Chrome erabiltzen baduzu, onartuko dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />.</translation>
 <translation id="629730747756840877">Kontua</translation>
 <translation id="6297765934698848803">Gailua kudeatzen duen erakundeak kamera desaktibatu du.</translation>
 <translation id="6301525844455696527">Ekin zain daukazun irakurketa-zerrendari</translation>
@@ -765,7 +765,7 @@
 <translation id="6345878117466430440">Markatu irakurritako gisa</translation>
 <translation id="6364438453358674297">Iradokizuna historiatik ezabatu nahi duzu?</translation>
 <translation id="6378173571450987352">Xehetasunak: erabilitako datu kopuruaren arabera ordenatuta</translation>
-<translation id="6379829913050047669">Chrome-n irekiko da <ph name="APP_NAME" />. Aurrera egiten baduzu, onartu egingo dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />.</translation>
+<translation id="6379829913050047669">Chrome-n irekiko da <ph name="APP_NAME" />. Aurrera egiten baduzu, onartuko dituzu <ph name="BEGIN_LINK1" />Google-ren Zerbitzu-baldintzak<ph name="END_LINK1" /> eta <ph name="BEGIN_LINK2" />Google Chrome-ren eta Chrome OS-en Zerbitzu-baldintza gehigarriak<ph name="END_LINK2" />.</translation>
 <translation id="6381421346744604172">Ilundu webguneak</translation>
 <translation id="6395288395575013217">ESTEKA</translation>
 <translation id="6397616442223433927">Konektatu zara berriro</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
index f7eb291..869276a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -1100,7 +1100,7 @@
 <translation id="8583805026567836021">Suppression des données du compte</translation>
 <translation id="8587585930972369234">Appui prolongé pour rechercher</translation>
 <translation id="860043288473659153">Nom du titulaire de la carte</translation>
-<translation id="860282621117673749">Alertes de baisse de prix</translation>
+<translation id="860282621117673749">Alertes de prix en baisse</translation>
 <translation id="8616006591992756292">Votre compte Google conserve peut-être d'autres formes d'historique de navigation sur la page <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="8617240290563765734">Ouvrir l'URL suggérée indiquée dans le contenu téléchargé ?</translation>
 <translation id="8636825310635137004">Activez la synchronisation pour accéder à vos onglets sur vos autres appareils.</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 e191918..6cee97c6 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
@@ -1100,7 +1100,7 @@
 <translation id="8583805026567836021">ანგარიშის მონაცემების გასუფთავება</translation>
 <translation id="8587585930972369234">ძიებისთვის შეეხეთ ხანგრძლივად</translation>
 <translation id="860043288473659153">ბარათის მფლობელის სახელი</translation>
-<translation id="860282621117673749">გაფრთხილებები ფასის დაწევის შესახებ</translation>
+<translation id="860282621117673749">გაფრთხილებები ფასის დაწევაზე</translation>
 <translation id="8616006591992756292">თქვენს Google ანგარიშში შეიძლება ინახებოდეს სხვა ტიპის დათვალიერების ისტორიაც, რომელიც ხელმისაწვდომია მისამართზე: <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="8617240290563765734">გაიხსნას ჩამოტვირთულ შემცველობაში რეკომენდირებული URL?</translation>
 <translation id="8636825310635137004">თქვენს სხვა მოწყობილობებზე არსებულ ჩანართებზე წვდომის მისაღებად, ჩართეთ სინქრონიზაცია.</translation>
diff --git a/chrome/browser/ui/app_list/app_list_model_updater.h b/chrome/browser/ui/app_list/app_list_model_updater.h
index bf9eb22..04276aa 100644
--- a/chrome/browser/ui/app_list/app_list_model_updater.h
+++ b/chrome/browser/ui/app_list/app_list_model_updater.h
@@ -79,6 +79,8 @@
   virtual void SetItemIsPersistent(const std::string& id, bool is_persistent) {}
   virtual void SetItemFolderId(const std::string& id,
                                const std::string& folder_id) {}
+  virtual void SetNotificationBadgeColor(const std::string& id,
+                                         const SkColor color) {}
 
   virtual void SetSearchResultMetadata(
       const std::string& id,
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
index 887d084..38f9ff2 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
@@ -14,6 +14,8 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
+#include "chrome/browser/chromeos/remote_apps/remote_apps_manager.h"
+#include "chrome/browser/chromeos/remote_apps/remote_apps_manager_factory.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/app_service/app_service_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
@@ -33,6 +35,15 @@
   OnAppUpdate(app_update, true);
   if (sync_item && sync_item->item_ordinal.IsValid()) {
     UpdateFromSync(sync_item);
+  } else if (app_type_ == apps::mojom::AppType::kRemote) {
+    chromeos::RemoteAppsManager* remote_apps_manager =
+        chromeos::RemoteAppsManagerFactory::GetForProfile(profile);
+
+    if (remote_apps_manager->ShouldAddToFront(app_update.AppId())) {
+      SetPosition(model_updater->GetPositionBeforeFirstItem());
+    } else {
+      SetDefaultPositionIfApplicable(model_updater);
+    }
   } else {
     SetDefaultPositionIfApplicable(model_updater);
 
diff --git a/chrome/browser/ui/app_list/chrome_app_list_item.cc b/chrome/browser/ui/app_list/chrome_app_list_item.cc
index 926c539b..1352d56 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_item.cc
+++ b/chrome/browser/ui/app_list/chrome_app_list_item.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
 #include "chrome/browser/ui/app_list/chrome_app_list_model_updater.h"
+#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "extensions/browser/app_sorting.h"
 #include "extensions/browser/extension_system.h"
 #include "ui/gfx/color_utils.h"
@@ -171,6 +172,17 @@
   AppListModelUpdater* updater = model_updater();
   if (updater)
     updater->SetItemIcon(id(), metadata_->icon);
+
+  // Calculate and set the notification badge color.
+  ChromeLauncherController* chrome_launcher_controller =
+      ChromeLauncherController::instance();
+  if (chrome_launcher_controller) {
+    SkColor current_badge_color =
+        chrome_launcher_controller->CalculateNotificationBadgeColorForApp(id(),
+                                                                          icon);
+    if (updater)
+      updater->SetNotificationBadgeColor(id(), current_badge_color);
+  }
 }
 
 void ChromeAppListItem::SetName(const std::string& name) {
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
index c566f3d..d7b9bdc 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
+++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
@@ -264,6 +264,13 @@
   app_list_controller_->SetItemMetadata(id, std::move(data));
 }
 
+void ChromeAppListModelUpdater::SetNotificationBadgeColor(const std::string& id,
+                                                          const SkColor color) {
+  if (!app_list_controller_)
+    return;
+  app_list_controller_->SetItemNotificationBadgeColor(id, color);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Methods only used by ChromeSearchResult that talk to ash directly.
 
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater.h b/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
index 0e05498..d1d21f886 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
+++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
@@ -58,6 +58,8 @@
   void SetItemIsPersistent(const std::string& id, bool is_persistent) override;
   void SetItemFolderId(const std::string& id,
                        const std::string& folder_id) override;
+  void SetNotificationBadgeColor(const std::string& id,
+                                 const SkColor color) override;
 
   // Methods only used by ChromeSearchResult that talk to ash directly.
   void SetSearchResultMetadata(
diff --git a/chrome/browser/ui/apps/app_info_dialog.h b/chrome/browser/ui/apps/app_info_dialog.h
index 288e664..205648e 100644
--- a/chrome/browser/ui/apps/app_info_dialog.h
+++ b/chrome/browser/ui/apps/app_info_dialog.h
@@ -57,6 +57,6 @@
 void ShowAppInfoInNativeDialog(content::WebContents* web_contents,
                                Profile* profile,
                                const extensions::Extension* app,
-                               base::RepeatingClosure close_callback);
+                               base::OnceClosure close_callback);
 
 #endif  // CHROME_BROWSER_UI_APPS_APP_INFO_DIALOG_H_
diff --git a/chrome/browser/ui/apps/chrome_app_delegate.cc b/chrome/browser/ui/apps/chrome_app_delegate.cc
index 7117c6e..6d1b23f0 100644
--- a/chrome/browser/ui/apps/chrome_app_delegate.cc
+++ b/chrome/browser/ui/apps/chrome_app_delegate.cc
@@ -52,6 +52,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/chromeos/lock_screen_apps/state_controller.h"
+#include "chrome/browser/chromeos/policy/dlp/dlp_content_tab_helper.h"
 #endif
 
 #if BUILDFLAG(ENABLE_PRINTING)
@@ -216,6 +217,10 @@
 
   apps::AudioFocusWebContentsObserver::CreateForWebContents(web_contents);
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  policy::DlpContentTabHelper::CreateForWebContents(web_contents);
+#endif
+
   zoom::ZoomController::CreateForWebContents(web_contents);
 }
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 822f5f3..8eae90b 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -99,6 +99,7 @@
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/display/types/display_constants.h"
+#include "ui/gfx/color_analysis.h"
 #include "ui/resources/grit/ui_resources.h"
 
 using extension_misc::kChromeAppId;
@@ -131,6 +132,32 @@
   return app_id_opt.value_or("");
 }
 
+// Uses the icon image to calculate the light vibrant color to be used for
+// the notification indicator.
+base::Optional<SkColor> CalculateNotificationBadgeColor(gfx::ImageSkia image) {
+  const SkBitmap* source = image.bitmap();
+  if (!source || source->empty() || source->isNull())
+    return base::nullopt;
+
+  std::vector<color_utils::ColorProfile> color_profiles;
+  color_profiles.push_back(color_utils::ColorProfile(
+      color_utils::LumaRange::LIGHT, color_utils::SaturationRange::VIBRANT));
+
+  std::vector<color_utils::Swatch> best_swatches =
+      color_utils::CalculateProminentColorsOfBitmap(
+          *source, color_profiles, nullptr /* bitmap region */,
+          color_utils::ColorSwatchFilter());
+
+  // If the best swatch color is transparent, then
+  // CalculateProminentColorsOfBitmap() failed to find a suitable color.
+  if (best_swatches.empty() || best_swatches[0].color == SK_ColorTRANSPARENT)
+    return base::nullopt;
+
+  return best_swatches[0].color;
+}
+
+constexpr SkColor kDefaultIndicatorColor = SK_ColorWHITE;
+
 }  // namespace
 
 // A class to get events from ChromeOS when a user gets changed or added.
@@ -453,6 +480,8 @@
   if (const auto* item = GetItem(shelf_id)) {
     ash::ShelfItem new_item = *item;
     new_item.image = image;
+    new_item.notification_badge_color =
+        CalculateNotificationBadgeColorForApp(new_item.id.app_id, image);
     model_->Set(model_->ItemIndexByID(shelf_id), new_item);
   }
 }
@@ -837,6 +866,19 @@
   }
 }
 
+SkColor ChromeLauncherController::CalculateNotificationBadgeColorForApp(
+    const std::string& app_id,
+    const gfx::ImageSkia& icon) {
+  AppIdBadgeColor::const_iterator it = app_id_badge_color_map_.find(app_id);
+  if (it != app_id_badge_color_map_.end())
+    return it->second;
+
+  SkColor notification_color =
+      CalculateNotificationBadgeColor(icon).value_or(kDefaultIndicatorColor);
+  app_id_badge_color_map_[app_id] = notification_color;
+  return notification_color;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // LauncherAppUpdater::Delegate:
 
@@ -944,6 +986,8 @@
     item.image =
         is_standard_icon ? image : apps::CreateStandardIconImage(image);
     shelf_spinner_controller_->MaybeApplySpinningEffect(app_id, &item.image);
+    item.notification_badge_color =
+        CalculateNotificationBadgeColorForApp(app_id, image);
     model_->Set(index, item);
     // It's possible we're waiting on more than one item, so don't break.
   }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
index 15ef18f09..e7faf53 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
@@ -266,6 +266,9 @@
   // CanDoShowAppInfoFlow() returns true.
   void DoShowAppInfoFlow(Profile* profile, const std::string& app_id);
 
+  SkColor CalculateNotificationBadgeColorForApp(const std::string& app_id,
+                                                const gfx::ImageSkia& icon);
+
   // LauncherAppUpdater::Delegate:
   void OnAppInstalled(content::BrowserContext* browser_context,
                       const std::string& app_id) override;
@@ -448,6 +451,9 @@
   using RunningAppListIdMap = std::map<std::string, RunningAppListIds>;
   RunningAppListIdMap last_used_running_application_order_;
 
+  using AppIdBadgeColor = std::map<std::string, SkColor>;
+  AppIdBadgeColor app_id_badge_color_map_;
+
   base::WeakPtrFactory<ChromeLauncherController> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ChromeLauncherController);
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 4ca8d0f6..9ba5808 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -5182,6 +5182,37 @@
   EXPECT_EQ(ash::AppStatus::kReady, model_->items()[1].app_status);
 }
 
+TEST_F(ChromeLauncherControllerTest, NotificationBadgeColorTest) {
+  InitLauncherController();
+  const int width = 64;
+  const int height = 64;
+
+  SkBitmap all_black_icon;
+  all_black_icon.allocN32Pixels(width, height);
+  all_black_icon.eraseColor(SK_ColorBLACK);
+
+  SkColor test_color =
+      launcher_controller_->CalculateNotificationBadgeColorForApp(
+          "app_id1", gfx::ImageSkia::CreateFrom1xBitmap(all_black_icon));
+
+  // For an all black icon, a white notification badge is expected, since there
+  // is no other light vibrant color to get from the icon.
+  EXPECT_EQ(test_color, SK_ColorWHITE);
+
+  // Create an icon that is half kGoogleRed300 and half kGoogleRed600.
+  SkBitmap red_icon;
+  red_icon.allocN32Pixels(width, height);
+  red_icon.eraseColor(gfx::kGoogleRed300);
+  red_icon.erase(gfx::kGoogleRed600, {0, 0, width, height / 2});
+
+  test_color = launcher_controller_->CalculateNotificationBadgeColorForApp(
+      "app_id2", gfx::ImageSkia::CreateFrom1xBitmap(red_icon));
+
+  // For the red icon, the notification badge should calculate and use the
+  // kGoogleRed300 color as the light vibrant color taken from the icon.
+  EXPECT_EQ(gfx::kGoogleRed300, test_color);
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          ChromeLauncherControllerPlayStoreAvailabilityTest,
                          ::testing::Values(false, true));
diff --git a/chrome/browser/ui/browser_navigator_browsertest.cc b/chrome/browser/ui/browser_navigator_browsertest.cc
index 9949e00c..027153e 100644
--- a/chrome/browser/ui/browser_navigator_browsertest.cc
+++ b/chrome/browser/ui/browser_navigator_browsertest.cc
@@ -1514,8 +1514,9 @@
             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
 }
 
+// TODO(crbug.com/1171245): This is disabled for Mac OS due to flakiness.
 // TODO(1024166): Timing out on linux-chromeos-dbg.
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_MAC)
 #define MAYBE_NavigateFromNTPToOptionsPageInSameTab \
   DISABLED_NavigateFromNTPToOptionsPageInSameTab
 #else
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.h b/chrome/browser/ui/cocoa/history_menu_bridge.h
index 8c281f96..a2315f2 100644
--- a/chrome/browser/ui/cocoa/history_menu_bridge.h
+++ b/chrome/browser/ui/cocoa/history_menu_bridge.h
@@ -216,6 +216,7 @@
   void OnURLsDeleted(history::HistoryService* history_service,
                      const history::DeletionInfo& deletion_info) override;
   void OnHistoryServiceLoaded(history::HistoryService* service) override;
+  void HistoryServiceBeingDeleted(history::HistoryService* service) override;
 
   base::scoped_nsobject<HistoryMenuCocoaController> controller_;  // strong
 
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.mm b/chrome/browser/ui/cocoa/history_menu_bridge.mm
index 552a528a..bee326b 100644
--- a/chrome/browser/ui/cocoa/history_menu_bridge.mm
+++ b/chrome/browser/ui/cocoa/history_menu_bridge.mm
@@ -326,13 +326,13 @@
 void HistoryMenuBridge::CreateMenu() {
   // If we're currently running CreateMenu(), wait until it finishes.
   // If the menu is currently open, wait until it closes.
-  if (create_in_progress_ || is_menu_open_)
+  // If the history service got torn down while our async task was queued, don't
+  // do anything - the browser is exiting anyway.
+  if (create_in_progress_ || is_menu_open_ || !history_service_)
     return;
   create_in_progress_ = true;
   need_recreate_ = false;
 
-  DCHECK(history_service_);
-
   history::QueryOptions options;
   options.max_count = kVisitedCount;
   options.SetRecentDayRange(kVisitedScope);
@@ -457,3 +457,9 @@
   history_service_ = history_service;
   Init();
 }
+
+void HistoryMenuBridge::HistoryServiceBeingDeleted(
+    history::HistoryService* history_service) {
+  if (history_service_ == history_service)
+    history_service_ = nullptr;
+}
diff --git a/chrome/browser/ui/search/omnibox_utils.cc b/chrome/browser/ui/search/omnibox_utils.cc
index 615db75..43296a8 100644
--- a/chrome/browser/ui/search/omnibox_utils.cc
+++ b/chrome/browser/ui/search/omnibox_utils.cc
@@ -32,7 +32,7 @@
     return;
 
   if (focus) {
-    // This is an invisible focus to support "realbox" implementations on NTPs
+    // This is an invisible focus to support "fakebox" implementations on NTPs
     // (including other search providers). We shouldn't consider it as the user
     // explicitly focusing the omnibox.
     omnibox_view->SetFocus(/*is_user_initiated=*/false);
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index 79a697b..548fba03 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -22,7 +22,6 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/media/router/media_router_feature.h"
@@ -65,6 +64,7 @@
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "components/zoom/zoom_controller.h"
 #include "components/zoom/zoom_event_manager.h"
 #include "content/public/browser/host_zoom_map.h"
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
index 33e3749a..64b9581 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
@@ -74,49 +74,18 @@
 };
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-// Base container for modal dialogs. Encases a content view in a modal dialog
-// with an accelerator to close on escape.
-class BaseDialogContainer : public views::DialogDelegateView {
- public:
-  METADATA_HEADER(BaseDialogContainer);
-  BaseDialogContainer(std::unique_ptr<views::View> dialog_body,
-                      base::RepeatingClosure close_callback)
-      : dialog_body_(AddChildView(std::move(dialog_body))),
-        close_callback_(close_callback) {
-    SetButtons(ui::DIALOG_BUTTON_NONE);
-    SetModalType(kModalType);
-  }
-  BaseDialogContainer(const BaseDialogContainer&) = delete;
-  BaseDialogContainer& operator=(const BaseDialogContainer&) = delete;
-  ~BaseDialogContainer() override = default;
-
- protected:
-  views::View* dialog_body() { return dialog_body_; }
-
- private:
-  // Overridden from views::WidgetDelegate:
-  void WindowClosing() override {
-    if (!close_callback_.is_null())
-      close_callback_.Run();
-  }
-
-  views::View* dialog_body_;
-  const base::RepeatingClosure close_callback_;
-};
-
-BEGIN_METADATA(BaseDialogContainer, views::DialogDelegateView)
-END_METADATA
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 
 // The contents view for an App List Dialog, which covers the entire app list
 // and adds a close button.
-class AppListDialogContainer : public BaseDialogContainer {
+class AppListDialogContainer : public views::DialogDelegateView {
  public:
   METADATA_HEADER(AppListDialogContainer);
-  explicit AppListDialogContainer(std::unique_ptr<views::View> dialog_body)
-      : BaseDialogContainer(std::move(dialog_body), base::RepeatingClosure()) {
+  explicit AppListDialogContainer(std::unique_ptr<views::View> dialog_body) {
+    SetButtons(ui::DIALOG_BUTTON_NONE);
+    SetModalType(kModalType);
     SetBackground(std::make_unique<AppListOverlayBackground>());
+    dialog_body_ = AddChildView(std::move(dialog_body));
     close_button_ = AddChildView(
         views::BubbleFrameView::CreateCloseButton(base::BindRepeating(
             [](AppListDialogContainer* container) {
@@ -139,7 +108,7 @@
         gfx::Point(width() - close_button_->width() - kCloseButtonDialogMargin,
                    kCloseButtonDialogMargin));
 
-    dialog_body()->SetBoundsRect(GetContentsBounds());
+    dialog_body_->SetBoundsRect(GetContentsBounds());
     views::DialogDelegateView::Layout();
   }
 
@@ -149,10 +118,11 @@
     return std::make_unique<views::NativeFrameView>(widget);
   }
 
+  views::View* dialog_body_;
   views::Button* close_button_;
 };
 
-BEGIN_METADATA(AppListDialogContainer, BaseDialogContainer)
+BEGIN_METADATA(AppListDialogContainer, views::DialogDelegateView)
 END_METADATA
 
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -195,13 +165,16 @@
 END_METADATA
 
 // A container view for a native dialog, which sizes to the given fixed |size|.
-class NativeDialogContainer : public BaseDialogContainer {
+class NativeDialogContainer : public views::DialogDelegateView {
  public:
   METADATA_HEADER(NativeDialogContainer);
   NativeDialogContainer(std::unique_ptr<views::View> dialog_body,
                         const gfx::Size& size,
-                        base::RepeatingClosure close_callback)
-      : BaseDialogContainer(std::move(dialog_body), close_callback) {
+                        base::OnceClosure close_callback) {
+    SetButtons(ui::DIALOG_BUTTON_NONE);
+    SetModalType(kModalType);
+    AddChildView(std::move(dialog_body));
+    RegisterWindowClosingCallback(std::move(close_callback));
     SetLayoutManager(std::make_unique<views::FillLayout>());
     chrome::RecordDialogCreation(chrome::DialogIdentifier::NATIVE_CONTAINER);
     SetPreferredSize(size);
@@ -223,7 +196,7 @@
   }
 };
 
-BEGIN_METADATA(NativeDialogContainer, BaseDialogContainer)
+BEGIN_METADATA(NativeDialogContainer, views::DialogDelegateView)
 END_METADATA
 
 }  // namespace
@@ -238,6 +211,7 @@
 views::DialogDelegateView* CreateDialogContainerForView(
     std::unique_ptr<views::View> view,
     const gfx::Size& size,
-    base::RepeatingClosure close_callback) {
-  return new NativeDialogContainer(std::move(view), size, close_callback);
+    base::OnceClosure close_callback) {
+  return new NativeDialogContainer(std::move(view), size,
+                                   std::move(close_callback));
 }
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.h b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.h
index 1a023bb..c5f039a 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.h
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.h
@@ -30,6 +30,6 @@
 views::DialogDelegateView* CreateDialogContainerForView(
     std::unique_ptr<views::View> view,
     const gfx::Size& size,
-    base::RepeatingClosure close_callback);
+    base::OnceClosure close_callback);
 
 #endif  // CHROME_BROWSER_UI_VIEWS_APPS_APP_INFO_DIALOG_APP_INFO_DIALOG_CONTAINER_H_
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
index 32453d4..0398bbe 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc
@@ -113,10 +113,10 @@
 void ShowAppInfoInNativeDialog(content::WebContents* web_contents,
                                Profile* profile,
                                const extensions::Extension* app,
-                               base::RepeatingClosure close_callback) {
+                               base::OnceClosure close_callback) {
   views::DialogDelegate* dialog = CreateDialogContainerForView(
       std::make_unique<AppInfoDialog>(profile, app), kDialogSize,
-      close_callback);
+      std::move(close_callback));
   views::Widget* dialog_widget;
   if (dialog->GetModalType() == ui::MODAL_TYPE_CHILD) {
     dialog_widget =
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 4b8c86021..9f34242 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -33,7 +33,6 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/browser_extension_window_controller.h"
@@ -162,6 +161,7 @@
 #include "components/translate/core/browser/translate_manager.h"
 #include "components/version_info/channel.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/browser/keyboard_event_processing_result.h"
 #include "content/public/browser/notification_service.h"
@@ -1147,8 +1147,11 @@
   infobar_container_->ChangeInfoBarManager(
       InfoBarService::FromWebContents(new_contents));
 
-  ObserveAppBannerManager(
-      webapps::AppBannerManager::FromWebContents(new_contents));
+  auto* app_banner_manager =
+      webapps::AppBannerManager::FromWebContents(new_contents);
+  // May be null in unit tests.
+  if (app_banner_manager)
+    ObserveAppBannerManager(app_banner_manager);
 
   UpdateUIForContents(new_contents);
   RevealTabStripIfNeeded();
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 98679835..08944d2 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -20,7 +20,6 @@
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/extension_commands_global_registry.h"
 #include "chrome/browser/extensions/extension_keybinding_registry.h"
@@ -43,6 +42,7 @@
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/common/buildflags.h"
 #include "components/infobars/core/infobar_container.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/models/simple_menu_model.h"
 #include "ui/base/pointer/touch_ui_controller.h"
diff --git a/chrome/browser/ui/views/page_action/pwa_install_view.cc b/chrome/browser/ui/views/page_action/pwa_install_view.cc
index a73038f0..971b9dd 100644
--- a/chrome/browser/ui/views/page_action/pwa_install_view.cc
+++ b/chrome/browser/ui/views/page_action/pwa_install_view.cc
@@ -13,7 +13,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/user_education/feature_promo_controller.h"
 #include "chrome/browser/ui/user_education/feature_promo_text_replacements.h"
@@ -28,6 +27,7 @@
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/omnibox/browser/vector_icons.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
diff --git a/chrome/browser/ui/views/read_later/read_later_button.cc b/chrome/browser/ui/views/read_later/read_later_button.cc
index fee1e12..6b1018c7 100644
--- a/chrome/browser/ui/views/read_later/read_later_button.cc
+++ b/chrome/browser/ui/views/read_later/read_later_button.cc
@@ -86,7 +86,8 @@
           IDS_READ_LATER_TITLE,
           this,
           browser->profile(),
-          GURL(chrome::kChromeUIReadLaterURL))),
+          GURL(chrome::kChromeUIReadLaterURL),
+          true)),
       widget_open_timer_(base::BindRepeating([](base::TimeDelta time_elapsed) {
         base::UmaHistogramMediumTimes("ReadingList.WindowDisplayedDuration",
                                       time_elapsed);
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc
index 1af6f03..2434ce1 100644
--- a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc
+++ b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc
@@ -6,12 +6,16 @@
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.h"
 #include "chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.h"
+#include "chrome/grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/button/button_controller.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
 
 ChromeLabsButton::ChromeLabsButton()
     : ToolbarButton(base::BindRepeating(&ChromeLabsButton::ButtonPressed,
                                         base::Unretained(this))) {
+  SetAccessibleName(l10n_util::GetStringUTF16(IDS_TOOLTIP_CHROMELABS_BUTTON));
+  SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_CHROMELABS_BUTTON));
   button_controller()->set_notify_action(
       views::ButtonController::NotifyAction::kOnPress);
 }
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
index 37653229..e89273e4 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -12,7 +12,6 @@
 #include "base/callback_helpers.h"
 #include "base/feature_list.h"
 #include "base/no_destructor.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
@@ -23,6 +22,7 @@
 #include "chrome/browser/web_applications/components/web_app_utils.h"
 #include "chrome/browser/web_applications/components/web_application_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/browser/navigation_entry.h"
 
diff --git a/chrome/browser/ui/web_applications/web_app_launch_manager.cc b/chrome/browser/ui/web_applications/web_app_launch_manager.cc
index 3b13e0a..b481533 100644
--- a/chrome/browser/ui/web_applications/web_app_launch_manager.cc
+++ b/chrome/browser/ui/web_applications/web_app_launch_manager.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/app_mode/app_mode_utils.h"
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/apps/app_service/launch_utils.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -41,6 +40,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "content/public/browser/page_navigator.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/web_applications/web_app_metrics.cc b/chrome/browser/ui/web_applications/web_app_metrics.cc
index 7ebac4f..9a971de7 100644
--- a/chrome/browser/ui/web_applications/web_app_metrics.cc
+++ b/chrome/browser/ui/web_applications/web_app_metrics.cc
@@ -311,7 +311,9 @@
     return;
   auto* app_banner_manager =
       webapps::AppBannerManager::FromWebContents(web_contents);
-  DCHECK(app_banner_manager);
+  // May be null in unit tests.
+  if (!app_banner_manager)
+    return;
   WebAppProvider* provider = WebAppProvider::Get(profile_);
   // WebAppProvider not available in kiosk mode.
   if (!provider)
@@ -389,8 +391,9 @@
   if (web_contents) {
     auto* app_banner_manager =
         webapps::AppBannerManager::FromWebContents(web_contents);
-    DCHECK(app_banner_manager);
-    app_banner_manager_observer_.Observe(app_banner_manager);
+    // May be null in unit tests.
+    if (app_banner_manager)
+      app_banner_manager_observer_.Observe(app_banner_manager);
   }
 }
 
diff --git a/chrome/browser/ui/web_applications/web_app_metrics.h b/chrome/browser/ui/web_applications/web_app_metrics.h
index d481f3d..255dd48 100644
--- a/chrome/browser/ui/web_applications/web_app_metrics.h
+++ b/chrome/browser/ui/web_applications/web_app_metrics.h
@@ -8,12 +8,12 @@
 #include "base/memory/weak_ptr.h"
 #include "base/power_monitor/power_observer.h"
 #include "base/scoped_observation.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/ui/browser_tab_strip_tracker.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/site_engagement/content/site_engagement_observer.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 #include "content/public/browser/web_contents_observer.h"
 
 class Profile;
diff --git a/chrome/browser/ui/webui/app_launcher_page_ui.cc b/chrome/browser/ui/webui/app_launcher_page_ui.cc
index d8d2f96..0cb92fe 100644
--- a/chrome/browser/ui/webui/app_launcher_page_ui.cc
+++ b/chrome/browser/ui/webui/app_launcher_page_ui.cc
@@ -24,7 +24,8 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/apps_resources.h"
+#include "chrome/grit/apps_resources_map.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
@@ -83,7 +84,10 @@
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUIAppLauncherPageHost);
   content::WebUIDataSource::Add(GetProfile(), source);
-  source->SetDefaultResource(IDR_NEW_TAB_4_HTML);
+
+  webui::AddResourcePathsBulk(
+      source, base::make_span(kAppsResources, kAppsResourcesSize));
+  source->SetDefaultResource(IDR_APPS_NEW_TAB_HTML);
   source->UseStringsJs();
 
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
@@ -170,7 +174,7 @@
       "'unsafe-inline';");
   source->OverrideContentSecurityPolicy(
       network::mojom::CSPDirectiveName::ImgSrc,
-      "img-src chrome://extension-icon chrome://app-icon chrome://theme "
+      "img-src 'self' chrome://extension-icon chrome://app-icon chrome://theme "
       "chrome://resources data:;");
   source->OverrideContentSecurityPolicy(
       network::mojom::CSPDirectiveName::TrustedTypes,
diff --git a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
index 0f4dfbd1..c9b58c2 100644
--- a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -272,8 +272,8 @@
   switch (mode) {
     case ArcGraphicsTracingMode::kFull: {
       base::trace_event::TraceConfig config(
-          "-*,exo,viz,toplevel,gpu,cc,blink,disabled-by-default-android "
-          "gfx,disabled-by-default-android view",
+          "-*,exo,viz,toplevel,gpu,cc,blink,disabled-by-default-android gfx,"
+          "disabled-by-default-android view",
           base::trace_event::RECORD_CONTINUOUSLY);
       config.EnableSystrace();
       // By default, systracing starts pre-defined set of categories with
@@ -478,8 +478,8 @@
   tracing_active_ = true;
   if (jank_detector_)
     jank_detector_->Reset();
-  system_stat_colletor_ = std::make_unique<arc::ArcSystemStatCollector>();
-  system_stat_colletor_->Start(GetMaxInterval());
+  system_stat_collector_ = std::make_unique<arc::ArcSystemStatCollector>();
+  system_stat_collector_->Start(GetMaxInterval());
 
   // Timestamp and app information would be updated when |OnTracingStarted| is
   // called.
@@ -500,8 +500,8 @@
 
   tracing_time_max_ = TRACE_TIME_TICKS_NOW();
 
-  if (system_stat_colletor_)
-    system_stat_colletor_->Stop();
+  if (system_stat_collector_)
+    system_stat_collector_->Stop();
 
   content::TracingController* const controller =
       content::TracingController::GetInstance();
@@ -537,7 +537,7 @@
   tracing_time_min_ = TRACE_TIME_TICKS_NOW();
   if (mode_ == ArcGraphicsTracingMode::kOverview) {
     stop_tracing_timer_.Start(
-        FROM_HERE, system_stat_colletor_->max_interval(),
+        FROM_HERE, system_stat_collector_->max_interval(),
         base::BindOnce(&ArcGraphicsTracingHandler::StopTracingAndActivate,
                        base::Unretained(this)));
   }
@@ -558,7 +558,7 @@
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&BuildGraphicsModel, std::move(string_data), mode_,
                      active_task_title_, active_task_icon_png_, timestamp_,
-                     std::move(system_stat_colletor_), tracing_time_min_,
+                     std::move(system_stat_collector_), tracing_time_min_,
                      tracing_time_max_, model_path),
       base::BindOnce(&ArcGraphicsTracingHandler::OnGraphicsModelReady,
                      weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.h b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.h
index 53682da30..4e01039 100644
--- a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.h
+++ b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.h
@@ -130,7 +130,7 @@
   std::unique_ptr<arc::ArcGraphicsJankDetector> jank_detector_;
 
   // Collects system stat runtime.
-  std::unique_ptr<arc::ArcSystemStatCollector> system_stat_colletor_;
+  std::unique_ptr<arc::ArcSystemStatCollector> system_stat_collector_;
 
   // Information about active task, title and icon.
   std::string active_task_title_;
diff --git a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
index 21390425..dde15228 100644
--- a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
@@ -300,27 +300,27 @@
   throttling_events_.clear();
   throttling_events_.emplace_back(
       std::make_pair(tracing_time_min_, instance_throttle_->level()));
-  system_stat_colletor_ = std::make_unique<arc::ArcSystemStatCollector>();
-  system_stat_colletor_->Start(kMaxIntervalToDisplay);
-  stop_tracing_timer_.Start(FROM_HERE, system_stat_colletor_->max_interval(),
+  system_stat_collector_ = std::make_unique<arc::ArcSystemStatCollector>();
+  system_stat_collector_->Start(kMaxIntervalToDisplay);
+  stop_tracing_timer_.Start(FROM_HERE, system_stat_collector_->max_interval(),
                             base::BindOnce(&ArcPowerControlHandler::StopTracing,
                                            base::Unretained(this)));
 }
 
 void ArcPowerControlHandler::StopTracing() {
-  if (!system_stat_colletor_)
+  if (!system_stat_collector_)
     return;
 
   const base::TimeTicks tracing_time_max = TRACE_TIME_TICKS_NOW();
   stop_tracing_timer_.Stop();
-  system_stat_colletor_->Stop();
+  system_stat_collector_->Stop();
 
   SetTracingStatus("Building model...");
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&BuildTracingModel, timestamp_, tracing_time_min_,
-                     tracing_time_max, std::move(system_stat_colletor_),
+                     tracing_time_max, std::move(system_stat_collector_),
                      std::move(wakefulness_mode_events_),
                      std::move(throttling_events_)),
       base::BindOnce(&ArcPowerControlHandler::OnTracingModelReady,
diff --git a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.h b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.h
index 10af11c7..60c4ed6 100644
--- a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.h
+++ b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.h
@@ -73,7 +73,7 @@
   base::Time timestamp_;
   base::TimeTicks tracing_time_min_;
   base::OneShotTimer stop_tracing_timer_;
-  std::unique_ptr<arc::ArcSystemStatCollector> system_stat_colletor_;
+  std::unique_ptr<arc::ArcSystemStatCollector> system_stat_collector_;
 
   // It collects power mode and throttling events in case tracing is active.
   WakefulnessModeEvents wakefulness_mode_events_;
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index c4366190..4ccf98f 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -162,6 +162,10 @@
 constexpr char kI18nBehaviorJS[] = "components/oobe_i18n_behavior.js";
 constexpr char kFocusBehaviorHTML[] = "components/oobe_focus_behavior.html";
 constexpr char kFocusBehaviorJS[] = "components/oobe_focus_behavior.js";
+constexpr char kScrollableBehaviorHTML[] =
+    "components/oobe_scrollable_behavior.html";
+constexpr char kScrollableBehaviorJS[] =
+    "components/oobe_scrollable_behavior.js";
 constexpr char kHDIronIconHTML[] = "components/hd_iron_icon.html";
 constexpr char kHDIronIconJS[] = "components/hd_iron_icon.js";
 constexpr char kOobeAdaptiveDialogHTML[] =
@@ -677,6 +681,10 @@
                           IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_HTML);
   source->AddResourcePath(kFocusBehaviorJS,
                           IDR_OOBE_COMPONENTS_FOCUS_BEHAVIOR_JS);
+  source->AddResourcePath(kScrollableBehaviorHTML,
+                          IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_HTML);
+  source->AddResourcePath(kScrollableBehaviorJS,
+                          IDR_OOBE_COMPONENTS_SCROLLABLE_BEHAVIOR_JS);
 
   source->AddResourcePath(kCommonStylesHTML,
                           IDR_OOBE_COMPONENTS_COMMON_STYLES_HTML);
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index a164742..c917eb1 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -1049,7 +1049,7 @@
 
   ShowAppInfoInNativeDialog(web_ui()->GetWebContents(),
                             Profile::FromWebUI(web_ui()), extension,
-                            base::RepeatingClosure());
+                            base::OnceClosure());
 }
 
 void AppLauncherHandler::HandleReorderApps(const base::ListValue* args) {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index 0114c53c..5b87f180e 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -58,7 +58,6 @@
 #include "components/prefs/pref_service.h"
 #include "components/printing/browser/print_composite_client.h"
 #include "components/printing/browser/print_manager_utils.h"
-#include "components/printing/common/print_messages.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/browser_task_traits.h"
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
index 6b6a8b5d5..48c70b6 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui_unittest.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "components/prefs/pref_service.h"
-#include "components/printing/common/print_messages.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/plugin_service.h"
 #include "content/public/browser/site_instance.h"
diff --git a/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
index e24fdc6..fdbaadf 100644
--- a/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.cc
@@ -274,6 +274,8 @@
        IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_LABEL},
       {"nearbyShareDataUsageDataDescription",
        IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_DESCRIPTION},
+      {"nearbyShareDataUsageDataTooltip",
+       IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_MOBILE_DATA_TOOLTIP},
       {"nearbyShareDataUsageOfflineLabel",
        IDS_SETTINGS_NEARBY_SHARE_DATA_USAGE_OFFLINE_LABEL},
       {"nearbyShareDataUsageOfflineDescription",
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
index e6ca1bb..fcbe65b 100644
--- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -45,6 +45,7 @@
        IDS_PROFILE_CUSTOMIZATION_DONE_BUTTON_LABEL},
       {"profileCustomizationPickThemeTitle",
        IDS_PROFILE_CUSTOMIZATION_PICK_THEME_TITLE},
+      {"profileCustomizationInputLabel", IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL},
 
       // Color picker strings:
       {"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL},
diff --git a/chrome/browser/ui/webui/signin/profile_picker_ui.cc b/chrome/browser/ui/webui/signin/profile_picker_ui.cc
index e7c18975..30725f2b 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_picker_ui.cc
@@ -82,6 +82,7 @@
       {"needsSigninPrompt",
        IDS_PROFILE_PICKER_PROFILE_CARD_NEEDS_SIGNIN_PROMPT},
       {"profileCardButtonLabel", IDS_PROFILE_PICKER_PROFILE_CARD_LABEL},
+      {"profileCardInputLabel", IDS_PROFILE_PICKER_PROFILE_CARD_INPUT_LABEL},
       {"menu", IDS_MENU},
       {"cancel", IDS_CANCEL},
       {"profileMenuName", IDS_SETTINGS_MORE_ACTIONS},
diff --git a/chrome/browser/web_applications/components/web_app_install_utils.cc b/chrome/browser/web_applications/components/web_app_install_utils.cc
index bad539bc..162605e8e0e 100644
--- a/chrome/browser/web_applications/components/web_app_install_utils.cc
+++ b/chrome/browser/web_applications/components/web_app_install_utils.cc
@@ -14,14 +14,14 @@
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
-#include "chrome/browser/banners/app_banner_manager.h"
 #include "chrome/browser/banners/app_banner_manager_desktop.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_icon_generator.h"
 #include "chrome/browser/web_applications/components/web_application_info.h"
 #include "chrome/common/chrome_features.h"
 #include "components/services/app_service/public/cpp/share_target.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_data.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
diff --git a/chrome/browser/webapps/android/java/res/layout/pwa_install_bottom_sheet_content.xml b/chrome/browser/webapps/android/java/res/layout/pwa_install_bottom_sheet_content.xml
index 81f938b..cae4fb3 100644
--- a/chrome/browser/webapps/android/java/res/layout/pwa_install_bottom_sheet_content.xml
+++ b/chrome/browser/webapps/android/java/res/layout/pwa_install_bottom_sheet_content.xml
@@ -9,19 +9,12 @@
     android:layout_height="wrap_content"
     android:orientation="vertical">
     <TextView
-        android:id="@+id/categories"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
-        android:layout_marginTop="100dp" />
-    <TextView
         android:id="@+id/description"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginStart="20dp"
         android:layout_marginEnd="20dp"
-        android:layout_marginTop="10dp" />
+        android:layout_marginTop="100dp" />
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/screenshots_container"
         android:layout_width="match_parent"
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java
index 92b13f9..730e9c31 100644
--- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java
+++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java
@@ -19,8 +19,6 @@
             view.setTitle(model.get(AddToHomescreenProperties.TITLE));
         } else if (propertyKey.equals(AddToHomescreenProperties.URL)) {
             view.setUrl(model.get(AddToHomescreenProperties.URL));
-        } else if (propertyKey.equals(AddToHomescreenProperties.CATEGORIES)) {
-            view.setCategories(model.get(AddToHomescreenProperties.CATEGORIES));
         } else if (propertyKey.equals(AddToHomescreenProperties.DESCRIPTION)) {
             view.setDescription(model.get(AddToHomescreenProperties.DESCRIPTION));
         } else if (propertyKey.equals(AddToHomescreenProperties.ICON)) {
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java
index 9b04bff..7de4b240 100644
--- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java
+++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java
@@ -19,8 +19,6 @@
             new PropertyModel.WritableObjectPropertyKey<>();
     public static final PropertyModel.WritableObjectPropertyKey<String> URL =
             new PropertyModel.WritableObjectPropertyKey<>();
-    public static final PropertyModel.WritableObjectPropertyKey<String> CATEGORIES =
-            new PropertyModel.WritableObjectPropertyKey<>();
     public static final PropertyModel.WritableObjectPropertyKey<String> DESCRIPTION =
             new PropertyModel.WritableObjectPropertyKey<>();
     public static final PropertyModel.WritableObjectPropertyKey<Pair<Bitmap, Boolean>> ICON =
@@ -36,6 +34,6 @@
     public static final PropertyModel.WritableFloatPropertyKey NATIVE_APP_RATING =
             new PropertyModel.WritableFloatPropertyKey();
 
-    public static final PropertyKey[] ALL_KEYS = {TITLE, URL, CATEGORIES, DESCRIPTION, ICON, TYPE,
-            CAN_SUBMIT, CLICK_LISTENER, NATIVE_INSTALL_BUTTON_TEXT, NATIVE_APP_RATING};
+    public static final PropertyKey[] ALL_KEYS = {TITLE, URL, DESCRIPTION, ICON, TYPE, CAN_SUBMIT,
+            CLICK_LISTENER, NATIVE_INSTALL_BUTTON_TEXT, NATIVE_APP_RATING};
 }
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java
index 5144b54d..62bb7f9 100644
--- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java
+++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java
@@ -155,12 +155,10 @@
      * @param title The title of the app represented by the UI.
      * @param origin The origin of the PWA app.
      * @param description The app description.
-     * @param categories The categories this app falls under.
      */
     public void requestBottomSheetInstaller(long nativePwaBottomSheetController,
             WindowAndroid windowAndroid, WebContents webContents, boolean showExpanded, Bitmap icon,
-            boolean isAdaptiveIcon, String title, String origin, String description,
-            String categories) {
+            boolean isAdaptiveIcon, String title, String origin, String description) {
         mNativePwaBottomSheetController = nativePwaBottomSheetController;
         mWebContents = webContents;
 
@@ -179,7 +177,6 @@
                          .with(AddToHomescreenProperties.TITLE, title)
                          .with(AddToHomescreenProperties.URL, origin)
                          .with(AddToHomescreenProperties.DESCRIPTION, description)
-                         .with(AddToHomescreenProperties.CATEGORIES, categories)
                          .with(AddToHomescreenProperties.CAN_SUBMIT, true)
                          .with(AddToHomescreenProperties.CLICK_LISTENER, this)
                          .build();
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerProvider.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerProvider.java
index 7f3a3ea5..7aaa483c 100644
--- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerProvider.java
+++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerProvider.java
@@ -63,16 +63,15 @@
      * @param title The title of the app represented by the UI.
      * @param origin The origin of the PWA app.
      * @param description The app description.
-     * @param categories The categories this app falls under.
      */
     @CalledByNative
     private static void showPwaBottomSheetInstaller(long nativePwaBottomSheetController,
             WebContents webContents, boolean showExpanded, Bitmap icon, boolean isAdaptiveIcon,
-            String title, String origin, String description, String categories) {
+            String title, String origin, String description) {
         PwaBottomSheetController controller = fromWebContents(webContents);
         if (controller == null) return;
         controller.requestBottomSheetInstaller(nativePwaBottomSheetController,
                 webContents.getTopLevelNativeWindow(), webContents, showExpanded, icon,
-                isAdaptiveIcon, title, origin, description, categories);
+                isAdaptiveIcon, title, origin, description);
     }
 }
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetView.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetView.java
index 50f9c9c..b9b4dca 100644
--- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetView.java
+++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetView.java
@@ -83,14 +83,6 @@
         descriptionView.setVisibility(description.isEmpty() ? View.GONE : View.VISIBLE);
     }
 
-    void setCategories(String categories) {
-        TextView categoriesView = mContentView.findViewById(R.id.categories);
-        categoriesView.setText(
-                mContext.getString(R.string.pwa_install_bottom_sheet_categories, categories));
-
-        categoriesView.setVisibility(categories.isEmpty() ? View.GONE : View.VISIBLE);
-    }
-
     void setIcon(Bitmap icon, boolean isAdaptive) {
         ImageView imageView = mToolbarView.findViewById(R.id.app_icon);
         if (isAdaptive && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -127,7 +119,4 @@
     public static int getDescViewIdForTesting() {
         return R.id.description;
     }
-    public static int getCategoriesViewIdForTesting() {
-        return R.id.categories;
-    }
 }
diff --git a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc
index c442342b..07381d9 100644
--- a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc
+++ b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc
@@ -23,16 +23,31 @@
 
 namespace {
 
+// Keep in sync with DevTools frontend: front_end/resources/AppManifestView.js
+const int kDescriptionMinLength = 80;
+const int kDescriptionMaxLength = 324;
+
 bool CanShowBottomSheet(content::WebContents* web_contents,
                         const base::string16& description,
-                        const std::vector<base::string16>& categories,
                         const std::map<GURL, SkBitmap>& screenshots) {
   if (!base::FeatureList::IsEnabled(
-          webapps::features::kPwaInstallUseBottomSheet))
+          webapps::features::kPwaInstallUseBottomSheet)) {
     return false;
+  }
 
-  if (description.size() == 0 || categories.size() == 0 ||
-      screenshots.size() == 0)
+  if (description.length() < kDescriptionMinLength ||
+      description.length() > kDescriptionMaxLength || screenshots.size() == 0) {
+    return false;
+  }
+
+  bool all_screenshots_draw_nothing = true;
+  for (const auto& item : screenshots) {
+    if (!item.second.drawsNothing()) {
+      all_screenshots_draw_nothing = false;
+      break;
+    }
+  }
+  if (all_screenshots_draw_nothing)
     return false;
 
   JNIEnv* env = base::android::AttachCurrentThread();
@@ -61,7 +76,7 @@
       app_banner_manager->primary_icon(),
       app_banner_manager->has_maskable_primary_icon(),
       app_banner_manager->validated_url(), app_banner_manager->screenshots(),
-      manifest.description.value_or(base::string16()), manifest.categories,
+      manifest.description.value_or(base::string16()),
       /* show_expanded= */ true);
 }
 
@@ -75,15 +90,14 @@
     const GURL& start_url,
     const std::map<GURL, SkBitmap>& screenshots,
     const base::string16& description,
-    const std::vector<base::string16>& categories,
     bool show_expanded) {
-  if (CanShowBottomSheet(web_contents, description, categories, screenshots)) {
+  if (CanShowBottomSheet(web_contents, description, screenshots)) {
     // Lifetime of this object is managed by the Java counterpart, iff bottom
     // sheets can be shown (otherwise an infobar is used and this class is no
     // longer needed).
     PwaBottomSheetController* controller = new PwaBottomSheetController(
         app_name, primary_icon, is_primary_icon_maskable, start_url,
-        screenshots, description, categories, show_expanded);
+        screenshots, description, show_expanded);
     controller->ShowBottomSheetInstaller(web_contents);
     return;
   }
@@ -100,7 +114,6 @@
     const GURL& start_url,
     const std::map<GURL, SkBitmap>& screenshots,
     const base::string16& description,
-    const std::vector<base::string16>& categories,
     bool show_expanded)
     : app_name_(app_name),
       primary_icon_(primary_icon),
@@ -108,7 +121,6 @@
       start_url_(start_url),
       screenshots_(screenshots),
       description_(description),
-      categories_(categories),
       show_expanded_(show_expanded) {}
 
 void PwaBottomSheetController::Destroy(JNIEnv* env) {
@@ -143,18 +155,13 @@
   ScopedJavaLocalRef<jstring> j_description =
       ConvertUTF16ToJavaString(env, description_);
 
-  base::string16 category_list =
-      base::JoinString(categories_, ASCIIToUTF16(", "));
-  ScopedJavaLocalRef<jstring> j_categories =
-      ConvertUTF16ToJavaString(env, category_list);
-
   ScopedJavaLocalRef<jobject> j_bitmap =
       gfx::ConvertToJavaBitmap(primary_icon_);
 
   Java_PwaBottomSheetControllerProvider_showPwaBottomSheetInstaller(
       env, reinterpret_cast<intptr_t>(this), web_contents->GetJavaWebContents(),
       show_expanded_, j_bitmap, is_primary_icon_maskable_, j_user_title, j_url,
-      j_description, j_categories);
+      j_description);
 
   for (const auto& item : screenshots_) {
     if (!item.second.isNull())
diff --git a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.h b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.h
index 04e749a..4b8573e 100644
--- a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.h
+++ b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.h
@@ -40,7 +40,6 @@
       const GURL& start_url,
       const std::map<GURL, SkBitmap>& screenshots,
       const base::string16& description,
-      const std::vector<base::string16>& categories,
       bool show_expanded);
 
   virtual ~PwaBottomSheetController();
@@ -60,7 +59,6 @@
                            const GURL& start_url,
                            const std::map<GURL, SkBitmap>& screenshots,
                            const base::string16& description,
-                           const std::vector<base::string16>& categories,
                            bool show_expanded);
   PwaBottomSheetController(const PwaBottomSheetController&) = delete;
   PwaBottomSheetController& operator=(const PwaBottomSheetController&) = delete;
@@ -79,7 +77,6 @@
   const GURL& start_url_;
   const std::map<GURL, SkBitmap>& screenshots_;
   const base::string16 description_;
-  const std::vector<base::string16>& categories_;
   bool show_expanded_;
 };
 
diff --git a/chrome/browser/webapps/chrome_webapps_client.cc b/chrome/browser/webapps/chrome_webapps_client.cc
index a052af3..8d7a8fe 100644
--- a/chrome/browser/webapps/chrome_webapps_client.cc
+++ b/chrome/browser/webapps/chrome_webapps_client.cc
@@ -15,10 +15,13 @@
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/android/tab_web_contents_delegate_android.h"
 #include "chrome/browser/android/webapk/webapk_install_service.h"
+#include "chrome/browser/banners/app_banner_manager_android.h"
 #include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "components/feature_engagement/public/event_constants.h"
 #include "components/feature_engagement/public/tracker.h"
 #include "components/webapps/browser/android/add_to_homescreen_params.h"
+#else
+#include "chrome/browser/banners/app_banner_manager_desktop.h"
 #endif
 
 namespace webapps {
@@ -75,6 +78,15 @@
   return WebappInstallSource::COUNT;
 }
 
+AppBannerManager* ChromeWebappsClient::GetAppBannerManager(
+    content::WebContents* web_contents) {
+#if defined(OS_ANDROID)
+  return AppBannerManagerAndroid::FromWebContents(web_contents);
+#else
+  return AppBannerManagerDesktop::FromWebContents(web_contents);
+#endif
+}
+
 #if defined(OS_ANDROID)
 bool ChromeWebappsClient::IsInstallationInProgress(
     content::WebContents* web_contents,
diff --git a/chrome/browser/webapps/chrome_webapps_client.h b/chrome/browser/webapps/chrome_webapps_client.h
index ed9d0a3..7e5cabfb 100644
--- a/chrome/browser/webapps/chrome_webapps_client.h
+++ b/chrome/browser/webapps/chrome_webapps_client.h
@@ -25,6 +25,8 @@
       content::WebContents* web_contents) override;
   WebappInstallSource GetInstallSource(content::WebContents* web_contents,
                                        InstallTrigger trigger) override;
+  AppBannerManager* GetAppBannerManager(
+      content::WebContents* web_contents) override;
 #if defined(OS_ANDROID)
   bool IsInstallationInProgress(content::WebContents* web_contents,
                                 const GURL& manifest_url) override;
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 05f8344..244737af 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1611705352-b4310d98f6a9e41754d32cf62d0135ec32965b0a.profdata
+chrome-linux-master-1611748399-8c602722aac86e3037b25be1275ea9fcc69a7c79.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 7590dea..1a50abf 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1611705352-5a1bbf7737f00375ff9d7d8bab40f0ff61f8d0cd.profdata
+chrome-mac-master-1611748399-300bbb58fd40e0d7cd3ae6cd160a85b54eada693.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 75544b3..ee4741c 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1611705352-2ddcb993c57901da1a37bce7e00dada26ccc1af6.profdata
+chrome-win32-master-1611737947-867345d3e77476dc794c261a9f7655ee169aaffc.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index bbfd1aa..1dda102 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -245,10 +245,12 @@
     }
     if (!is_android && !is_chromeos_ash) {
       sources += [
+        "$root_gen_dir/chrome/apps_resources.pak",
         "$root_gen_dir/chrome/profile_picker_resources.pak",
         "$root_gen_dir/chrome/welcome_resources.pak",
       ]
       deps += [
+        "//chrome/browser/resources/ntp4:apps_resources",
         "//chrome/browser/resources/signin/profile_picker:resources",
         "//chrome/browser/resources/welcome:resources",
       ]
diff --git a/chrome/common/all_messages.h b/chrome/common/all_messages.h
index 211030e3..0b4173a0 100644
--- a/chrome/common/all_messages.h
+++ b/chrome/common/all_messages.h
@@ -16,13 +16,6 @@
 
 #include "chrome/common/common_message_generator.h"
 
-#if BUILDFLAG(ENABLE_PRINTING)
-// TODO(dgn) remove from here when all the code using these messages is removed
-// from /chrome. (crbug.com/311308, crbug.com/450822)
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#include "components/printing/common/print_messages.h"  // nogncheck
-#endif
-
 #if BUILDFLAG(ENABLE_NACL)
 #include "components/nacl/common/nacl_messages.h"
 #endif
diff --git a/chrome/common/chrome_utility_printing_messages.h b/chrome/common/chrome_utility_printing_messages.h
index ecf6a2d73..41dbe04 100644
--- a/chrome/common/chrome_utility_printing_messages.h
+++ b/chrome/common/chrome_utility_printing_messages.h
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "build/build_config.h"
-#include "components/printing/common/printing_param_traits_macros.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_param_traits.h"
 #include "printing/backend/print_backend.h"
@@ -35,6 +34,10 @@
   IPC_STRUCT_TRAITS_MEMBER(size_um)
 IPC_STRUCT_TRAITS_END()
 
+IPC_ENUM_TRAITS_MIN_MAX_VALUE(printing::mojom::DuplexMode,
+                              printing::mojom::DuplexMode::kUnknownDuplexMode,
+                              printing::mojom::DuplexMode::kShortEdge)
+
 IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults)
   IPC_STRUCT_TRAITS_MEMBER(collate_capable)
   IPC_STRUCT_TRAITS_MEMBER(collate_default)
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 0737367d..1a1f2ee 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -101,12 +101,6 @@
 // shutdown. Used to determine the exit type the last time the profile was open.
 const char kSessionExitType[] = "profile.exit_type";
 
-// The last time that the site engagement service recorded an engagement event
-// for this profile for any URL. Recorded only during shutdown. Used to prevent
-// the service from decaying engagement when a user does not use Chrome at all
-// for an extended period of time.
-const char kSiteEngagementLastUpdateTime[] = "profile.last_engagement_time";
-
 // An integer pref. Holds one of several values:
 // 0: unused, previously indicated to open the homepage on startup
 // 1: restore the last session.
@@ -3177,6 +3171,10 @@
 const char kCartModuleHidden[] = "cart_module_hidden";
 // Boolean pref indicating whether user has removed the cart module on NTP.
 const char kCartModuleRemoved[] = "cart_module_removed";
+// An integer that keeps track of how many times welcome surface has shown in
+// cart module.
+const char kCartModuleWelcomeSurfaceShownTimes[] =
+    "cart_module_welcome_surface_shown_times";
 #endif
 
 #if defined(OS_ANDROID)
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 6fd6f45..433621a 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -43,7 +43,6 @@
 extern const char kRestoreOnStartup[];
 extern const char kSessionExitedCleanly[];
 extern const char kSessionExitType[];
-extern const char kSiteEngagementLastUpdateTime[];
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS) && BUILDFLAG(ENABLE_EXTENSIONS)
 extern const char kSupervisedUserApprovedExtensions[];
 #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS) && BUILDFLAG(ENABLE_EXTENSIONS)
@@ -1112,6 +1111,7 @@
 #if !defined(OS_ANDROID)
 extern const char kCartModuleHidden[];
 extern const char kCartModuleRemoved[];
+extern const char kCartModuleWelcomeSurfaceShownTimes[];
 #endif
 
 #if defined(OS_ANDROID)
diff --git a/chrome/common/privacy_budget/README.md b/chrome/common/privacy_budget/README.md
index f58322e..42b3e70 100644
--- a/chrome/common/privacy_budget/README.md
+++ b/chrome/common/privacy_budget/README.md
@@ -1,6 +1,6 @@
 # Privacy Budget: Static Study Settings
 
 See [Privacy Budget: Code
-Locations](../../../docs/privacy_budget_code_locations.md) for
+Locations](../../../docs/privacy_budget/privacy_budget_code_locations.md) for
 details.
 
diff --git a/chrome/renderer/resources/extensions/remote_apps/remote_apps_bindings.js b/chrome/renderer/resources/extensions/remote_apps/remote_apps_bindings.js
index 4c5ee06..af58ae3 100644
--- a/chrome/renderer/resources/extensions/remote_apps/remote_apps_bindings.js
+++ b/chrome/renderer/resources/extensions/remote_apps/remote_apps_bindings.js
@@ -27,11 +27,13 @@
    * Adds a folder to the launcher. Note that empty folders are not shown in
    * the launcher.
    * @param {string} name name of the added folder
+   * @param {boolean} [add_to_front=false] true if the folder should be added
+   *     to the front of the app list. Defaults to false.
    * @return {!Promise<!{folderId: string, error: string}>} ID for the added
    *     folder
    */
-  addFolder(name) {
-    return this.remoteApps_.addFolder(name);
+  addFolder(name, add_to_front = false) {
+    return this.remoteApps_.addFolder(name, add_to_front);
   }
 
   /**
@@ -40,11 +42,15 @@
    * @param {string} folderId Id of the parent folder. An empty string
    *     indicates the app does not have a parent folder.
    * @param {string} iconUrl URL to an image representing the app's icon
+   * @param {boolean} [add_to_front=false] true if the app should be added to
+   *     the front of the app list. Defaults to false. Has no effect if the app
+   *     has a parent folder.
    * @return {!Promise<!{appId: string, error: string}>} ID for the
    *     added app.
    */
-  addApp(name, folderId, iconUrl) {
-    return this.remoteApps_.addApp(name, folderId, {url: iconUrl});
+  addApp(name, folderId, iconUrl, add_to_front = false) {
+    return this.remoteApps_.addApp(
+        name, folderId, {url: iconUrl}, add_to_front);
   }
 
   /**
diff --git a/chrome/services/sharing/nearby/platform/bluetooth_server_socket.cc b/chrome/services/sharing/nearby/platform/bluetooth_server_socket.cc
index 6b4840a..336290a 100644
--- a/chrome/services/sharing/nearby/platform/bluetooth_server_socket.cc
+++ b/chrome/services/sharing/nearby/platform/bluetooth_server_socket.cc
@@ -25,6 +25,14 @@
 }
 
 std::unique_ptr<api::BluetoothSocket> BluetoothServerSocket::Accept() {
+  // Check if Close() has already been called which can happen when quickly
+  // toggling between high-viz and contact based advertising.
+  if (!server_socket_) {
+    VLOG(1) << "BluetoothServerSocket::Accept() called but mojo remote was"
+            << " already closed.";
+    return nullptr;
+  }
+
   bluetooth::mojom::AcceptConnectionResultPtr result;
   bool success = server_socket_->Accept(&result);
 
diff --git a/chrome/services/sharing/nearby/platform/bluetooth_server_socket_unittest.cc b/chrome/services/sharing/nearby/platform/bluetooth_server_socket_unittest.cc
index 936de61..974948b0 100644
--- a/chrome/services/sharing/nearby/platform/bluetooth_server_socket_unittest.cc
+++ b/chrome/services/sharing/nearby/platform/bluetooth_server_socket_unittest.cc
@@ -169,6 +169,14 @@
   run_loop.Run();
 }
 
+TEST_F(BluetoothServerSocketTest, TestCloseThenAccept) {
+  base::RunLoop run_loop;
+  fake_server_socket_->SetOnDestroyCallback(run_loop.QuitClosure());
+  bluetooth_server_socket_->Close();
+  run_loop.Run();
+  ASSERT_FALSE(bluetooth_server_socket_->Accept());
+}
+
 TEST_F(BluetoothServerSocketTest, TestDestroy) {
   base::RunLoop run_loop;
   fake_server_socket_->SetOnDestroyCallback(run_loop.QuitClosure());
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 011c0c39..1e23abee 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2687,6 +2687,7 @@
         "../browser/chromeos/policy/display_rotation_default_handler_browsertest.cc",
         "../browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc",
+        "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc",
         "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc",
         "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h",
@@ -3425,7 +3426,6 @@
     "../browser/background_fetch/background_fetch_permission_context_unittest.cc",
     "../browser/background_sync/background_sync_controller_impl_unittest.cc",
     "../browser/background_sync/periodic_background_sync_permission_context_unittest.cc",
-    "../browser/banners/app_banner_settings_helper_unittest.cc",
     "../browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc",
     "../browser/bluetooth/bluetooth_chooser_context_unittest.cc",
     "../browser/bookmarks/managed_bookmark_service_unittest.cc",
@@ -3890,7 +3890,6 @@
       "../browser/android/metrics/background_task_memory_metrics_emitter_unittest.cc",
       "../browser/android/oom_intervention/near_oom_monitor_unittest.cc",
       "../browser/android/oom_intervention/oom_intervention_decider_unittest.cc",
-      "../browser/android/password_edit_delegate_settings_impl_unittest.cc",
       "../browser/android/password_ui_view_android_unittest.cc",
       "../browser/android/signin/signin_manager_android_unittest.cc",
       "../browser/android/signin/web_signin_bridge_unittest.cc",
diff --git a/chrome/test/data/banners/manifest_bottom_sheet_install.json b/chrome/test/data/banners/manifest_bottom_sheet_install.json
index f07b64e..7095b85 100644
--- a/chrome/test/data/banners/manifest_bottom_sheet_install.json
+++ b/chrome/test/data/banners/manifest_bottom_sheet_install.json
@@ -1,15 +1,14 @@
 {
   "name": "PWA Bottom Sheet",
-  "description": "App description",
-  "categories": ["cats", "memes"],
+  "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
   "screenshots": [
     {
-      "src": "/screenshot1.jpeg",
+      "src": "screenshot1.jpeg",
       "type": "image/jpeg",
       "sizes": "728x409"
     },
     {
-      "src": "/chonkscreenshot2.jpg",
+      "src": "screenshot2.jpeg",
       "type": "image/jpeg",
       "sizes": "551x541"
     }
diff --git a/chrome/test/data/banners/screenshot1.jpeg b/chrome/test/data/banners/screenshot1.jpeg
new file mode 100644
index 0000000..3d36aa0a
--- /dev/null
+++ b/chrome/test/data/banners/screenshot1.jpeg
Binary files differ
diff --git a/chrome/test/data/banners/screenshot2.jpeg b/chrome/test/data/banners/screenshot2.jpeg
new file mode 100644
index 0000000..83f9f85
--- /dev/null
+++ b/chrome/test/data/banners/screenshot2.jpeg
Binary files differ
diff --git a/chrome/test/data/extensions/platform_apps/dlp_test/background.js b/chrome/test/data/extensions/platform_apps/dlp_test/background.js
new file mode 100644
index 0000000..8555c5e
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/dlp_test/background.js
@@ -0,0 +1,7 @@
+// 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.
+
+chrome.app.runtime.onLaunched.addListener(function() {
+  chrome.app.window.create('index.html', {}, function () {});
+});
diff --git a/chrome/test/data/extensions/platform_apps/dlp_test/index.html b/chrome/test/data/extensions/platform_apps/dlp_test/index.html
new file mode 100644
index 0000000..a3e6ce7d
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/dlp_test/index.html
@@ -0,0 +1,7 @@
+<!--
+ * 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.
+-->
+<!DOCTYPE html>
+<script src="main.js"></script>
diff --git a/chrome/test/data/extensions/platform_apps/dlp_test/main.js b/chrome/test/data/extensions/platform_apps/dlp_test/main.js
new file mode 100644
index 0000000..14746409
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/dlp_test/main.js
@@ -0,0 +1,5 @@
+// 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.
+
+chrome.test.sendMessage('Launched');
diff --git a/chrome/test/data/extensions/platform_apps/dlp_test/manifest.json b/chrome/test/data/extensions/platform_apps/dlp_test/manifest.json
new file mode 100644
index 0000000..058fc99a
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/dlp_test/manifest.json
@@ -0,0 +1,11 @@
+{
+  "name": "DLP Test Extension",
+  "version": "1.0",
+  "manifest_version": 2,
+  "description": "An extension for testing the DLP policy for extension urls.",
+  "app": {
+    "background": {
+      "scripts": ["background.js"]
+    }
+  }
+}
diff --git a/chrome/test/data/extensions/remote_apps/extension/test.js b/chrome/test/data/extensions/remote_apps/extension/test.js
index ef350b7..293446c 100644
--- a/chrome/test/data/extensions/remote_apps/extension/test.js
+++ b/chrome/test/data/extensions/remote_apps/extension/test.js
@@ -6,6 +6,7 @@
 
 const testCases = [
   async function AddApp() {
+    // |add_to_front| omitted.
     const result1 = await api.addApp('App 1', '', '');
     chrome.test.assertFalse(!!result1.error);
     chrome.test.assertEq('Id 1', result1.appId);
@@ -15,7 +16,19 @@
 
     chrome.test.succeed();
   },
+  async function AddAppToFront() {
+    const result1 = await api.addApp('App 1', '', '', false);
+    chrome.test.assertFalse(!!result1.error);
+    chrome.test.assertEq('Id 1', result1.appId);
+
+    const result2 = await api.addApp('App 2', '', '', true);
+    chrome.test.assertFalse(!!result2.error);
+    chrome.test.assertEq('Id 2', result2.appId);
+
+    chrome.test.succeed();
+  },
   async function AddFolderAndApps() {
+    // |add_to_front| omitted.
     const result1 = await api.addFolder('Folder 1');
     const folderId = result1.folderId;
     chrome.test.assertFalse(!!result1.error);
@@ -31,6 +44,23 @@
 
     chrome.test.succeed();
   },
+  async function AddFolderToFront() {
+    const result1 = await api.addApp('App 1', '', '', false);
+    chrome.test.assertFalse(!!result1.error);
+    chrome.test.assertEq('Id 1', result1.appId);
+
+    const result2 = await api.addFolder('Folder 1', true);
+    const folderId = result2.folderId;
+    chrome.test.assertFalse(!!result2.error);
+    chrome.test.assertEq('Id 2', folderId);
+
+    // App is not added to front since it has a parent folder.
+    const result3 = await api.addApp('App 2', folderId, '', true);
+    chrome.test.assertFalse(!!result3.error);
+    chrome.test.assertEq('Id 3', result3.appId);
+
+    chrome.test.succeed();
+  },
   async function OnRemoteAppLaunched() {
     let actualId = '';
     await new Promise(async (resolve) => {
diff --git a/chrome/test/data/webui/cr_elements/cr_expand_button_tests.js b/chrome/test/data/webui/cr_elements/cr_expand_button_tests.js
index 7b92380..d75a99b 100644
--- a/chrome/test/data/webui/cr_elements/cr_expand_button_tests.js
+++ b/chrome/test/data/webui/cr_elements/cr_expand_button_tests.js
@@ -22,14 +22,14 @@
     icon = /** @type {!CrIconButtonElement} */ (button.$$('#icon'));
   });
 
-  test('setting |alt| label', () => {
-    assertFalse(!!button.alt);
+  test('setting |aria-label| label', () => {
+    assertFalse(!!button.ariaLabel);
     assertEquals('label', icon.getAttribute('aria-labelledby'));
     assertEquals(null, icon.getAttribute('aria-label'));
-    const altLabel = 'alt label';
-    button.alt = altLabel;
+    const ariaLabel = 'aria-label label';
+    button.ariaLabel = ariaLabel;
     assertEquals(null, icon.getAttribute('aria-labelledby'));
-    assertEquals('alt label', icon.getAttribute('aria-label'));
+    assertEquals(ariaLabel, icon.getAttribute('aria-label'));
   });
 
   test('changing |expanded|', () => {
diff --git a/chrome/test/data/webui/new_tab_page/modules/cart/module_test.js b/chrome/test/data/webui/new_tab_page/modules/cart/module_test.js
index b61ee041..c1361ba3 100644
--- a/chrome/test/data/webui/new_tab_page/modules/cart/module_test.js
+++ b/chrome/test/data/webui/new_tab_page/modules/cart/module_test.js
@@ -22,6 +22,9 @@
     testProxy.handler =
         TestBrowserProxy.fromClass(chromeCart.mojom.CartHandlerRemote);
     ChromeCartProxy.instance_ = testProxy;
+    // Not show welcome surface by default.
+    testProxy.handler.setResultFor(
+        'getWarmWelcomeVisible', Promise.resolve({visible: false}));
   });
 
   test('creates no module if no cart item', async () => {
@@ -124,34 +127,37 @@
     assertEquals(null, cartItems[1].querySelector('.thumbnail-fallback'));
   });
 
-  test('cart module header chip', async () => {
+  test('shows welcome surface in cart module', async () => {
     const carts = [
       {
-        merchant: 'Amazon',
-        cartUrl: {url: 'https://amazon.com'},
-        productImageUrls: [
-          {url: 'https://image1.com'}, {url: 'https://image2.com'},
-          {url: 'https://image3.com'}
-        ],
+        merchant: 'Foo',
+        cartUrl: {url: 'https://foo.com'},
+        productImageUrls: [],
       },
     ];
     testProxy.handler.setResultFor(
         'getMerchantCarts', Promise.resolve({carts}));
+    testProxy.handler.setResultFor(
+        'getWarmWelcomeVisible', Promise.resolve({visible: true}));
 
-    // Act.
+    // Arrange.
     await chromeCartDescriptor.initialize();
     const moduleElement = chromeCartDescriptor.element;
     document.body.append(moduleElement);
     moduleElement.$.cartItemRepeat.render();
 
     // Assert.
-    const cartItems = moduleElement.shadowRoot.querySelectorAll('.cart-item');
-    assertEquals(1, cartItems.length);
     const headerChip =
         moduleElement.shadowRoot.querySelector('ntp-module-header')
             .shadowRoot.querySelector('#chip');
+    const headerDescription =
+        moduleElement.shadowRoot.querySelector('ntp-module-header')
+            .shadowRoot.querySelector('#description');
     assertEquals(
         loadTimeData.getString('modulesCartHeaderNew'), headerChip.innerText);
+    assertEquals(
+        loadTimeData.getString('modulesCartWarmWelcome'),
+        headerDescription.innerText);
   });
 
   test('Backend is notified when module is dismissed or restored', async () => {
diff --git a/chrome/test/data/webui/settings/passwords_device_section_test.js b/chrome/test/data/webui/settings/passwords_device_section_test.js
index e5ae5e48..bb60178 100644
--- a/chrome/test/data/webui/settings/passwords_device_section_test.js
+++ b/chrome/test/data/webui/settings/passwords_device_section_test.js
@@ -365,4 +365,34 @@
     assertTrue(firstPasswordItem.$.moreActionsButton.hidden);
   });
 
+
+  test(
+      'moveMultiplePasswordsBannerHiddenWhenNoLocalPasswords',
+      async function() {
+        loadTimeData.overrideValues(
+            {enableMovingMultiplePasswordsToAccount: true});
+
+        const passwordsDeviceSection = await createPasswordsDeviceSection(
+            syncBrowserProxy, passwordManager, []);
+
+        assertTrue(passwordsDeviceSection.shadowRoot
+                       .querySelector('#moveMultiplePasswordsBanner')
+                       .hidden);
+      });
+
+  test(
+      'moveMultiplePasswordsBannerVisibleWhenLocalPasswords', async function() {
+        loadTimeData.overrideValues(
+            {enableMovingMultiplePasswordsToAccount: true});
+
+        const devicePassword = createPasswordEntry(
+            {username: 'device', id: 0, fromAccountStore: false});
+        const passwordsDeviceSection = await createPasswordsDeviceSection(
+            syncBrowserProxy, passwordManager, [devicePassword]);
+
+        assertFalse(passwordsDeviceSection.shadowRoot
+                        .querySelector('#moveMultiplePasswordsBanner')
+                        .hidden);
+      });
+
 });
diff --git a/chromecast/browser/metrics/cast_stability_metrics_provider.cc b/chromecast/browser/metrics/cast_stability_metrics_provider.cc
index ba4ded0c..a4bccec5 100644
--- a/chromecast/browser/metrics/cast_stability_metrics_provider.cc
+++ b/chromecast/browser/metrics/cast_stability_metrics_provider.cc
@@ -13,6 +13,7 @@
 #include "chromecast/base/pref_names.h"
 #include "chromecast/metrics/cast_metrics_service_client.h"
 #include "components/metrics/metrics_service.h"
+#include "components/metrics/stability_metrics_helper.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/child_process_data.h"
@@ -154,6 +155,8 @@
     const content::ChildProcessData& data,
     const content::ChildProcessTerminationInfo& info) {
   IncrementPrefValue(prefs::kStabilityChildProcessCrashCount);
+  ::metrics::StabilityMetricsHelper::RecordStabilityEvent(
+      ::metrics::StabilityEventType::kChildProcessCrash);
 }
 
 void CastStabilityMetricsProvider::LogRendererCrash(
@@ -163,6 +166,8 @@
   if (status == base::TERMINATION_STATUS_PROCESS_CRASHED ||
       status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) {
     IncrementPrefValue(prefs::kStabilityRendererCrashCount);
+    ::metrics::StabilityMetricsHelper::RecordStabilityEvent(
+        ::metrics::StabilityEventType::kRendererCrash);
 
     base::UmaHistogramSparse("CrashExitCodes.Renderer",
                              MapCrashExitCodeForHistogram(exit_code));
@@ -176,11 +181,15 @@
                               RENDERER_TYPE_RENDERER, RENDERER_TYPE_COUNT);
   } else if (status == base::TERMINATION_STATUS_LAUNCH_FAILED) {
     IncrementPrefValue(prefs::kStabilityRendererFailedLaunchCount);
+    ::metrics::StabilityMetricsHelper::RecordStabilityEvent(
+        ::metrics::StabilityEventType::kRendererFailedLaunch);
   }
 }
 
 void CastStabilityMetricsProvider::LogRendererHang() {
   IncrementPrefValue(prefs::kStabilityRendererHangCount);
+  ::metrics::StabilityMetricsHelper::RecordStabilityEvent(
+      ::metrics::StabilityEventType::kRendererHang);
 }
 
 void CastStabilityMetricsProvider::IncrementPrefValue(const char* path) {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index fb9e8da..0849da3 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -629,6 +629,12 @@
       <message name="IDS_DIAGNOSTICS_BATTERY_DISCHARGING" desc="The title of the diagnostics battery section which shows users' information about their computer battery.">
         <ph name="TIME_VALUE">$1<ex>2 hours and 18 minutes</ex></ph> left
       </message>
+      <message name="IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT" desc="Battery status text indicating transitionary state where battery values are being calculated.">
+        Calculating...
+      </message>
+      <message name="IDS_DIAGNOSTICS_BATTERY_FULL_TEXT" desc="Battery status text indicating the battery is fully charged.">
+        Battery full
+      </message>
       <message name="IDS_DIAGNOSTICS_CPU_TITLE" desc="The title of the diagnostics CPU section which shows users' information about their computer CPU usage.">
         CPU
       </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT.png.sha1
new file mode 100644
index 0000000..68bad1b
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT.png.sha1
@@ -0,0 +1 @@
+1bca9c2f9ebc2ff39188adf219f50aff2664e756
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_FULL_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_FULL_TEXT.png.sha1
new file mode 100644
index 0000000..bc4b58f
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_DIAGNOSTICS_BATTERY_FULL_TEXT.png.sha1
@@ -0,0 +1 @@
+259f0e49393a37fa1579c8b681e1b2050e902d53
\ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
index 4886873..7298cb0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Hulp</translation>
 <translation id="7658239707568436148">Kanselleer</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Wys beeldrol-, kantel- en zoemopsies</translation>
 <translation id="7983668134180549431">Teks is bespeur.</translation>
 <translation id="8067883171444229417">Speel video</translation>
 <translation id="8131740175452115882">Bevestig</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
index 1f2911e7..7f01163 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">እገዛ</translation>
 <translation id="7658239707568436148">ይቅር</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">የማንፏቀቂያ ዝንባሌ ማጉላት አማራጮችን አሳይ</translation>
 <translation id="7983668134180549431">ጽሑፍ ተገኝቷል።</translation>
 <translation id="8067883171444229417">ቪዲዮ አጫውት</translation>
 <translation id="8131740175452115882">አረጋግጥ</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
index 6a0ffb0e..456a178 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -81,6 +81,7 @@
 <translation id="7649070708921625228">مساعدة</translation>
 <translation id="7658239707568436148">إلغاء</translation>
 <translation id="7670511624014457267">60 لقطة في الثانية</translation>
+<translation id="7974782136796202581">عرض خيارات العرض الشامل والإمالة والتكبير/التصغير</translation>
 <translation id="7983668134180549431">تم رصد نص.</translation>
 <translation id="8067883171444229417">تشغيل الفيديو</translation>
 <translation id="8131740175452115882">التأكيد</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
index 623bc2e..902bf9f 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -78,6 +78,7 @@
 <translation id="7649070708921625228">Yardım</translation>
 <translation id="7658239707568436148">Ləğv edin</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Kənarları yığma/əymə/miqyası dəyişmə seçimlərini göstərin</translation>
 <translation id="7983668134180549431">Mətn aşkarlanıb.</translation>
 <translation id="8067883171444229417">Videonu oxudun</translation>
 <translation id="8131740175452115882">Təsdiq edin</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
index d57e685b..a0c5ced1 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Даведка</translation>
 <translation id="7658239707568436148">Скасаваць</translation>
 <translation id="7670511624014457267">60 кадраў у секунду</translation>
+<translation id="7974782136796202581">Паказаць параметры нахілу, панараміравання і прыбліжэння</translation>
 <translation id="7983668134180549431">Выяўлены тэкст.</translation>
 <translation id="8067883171444229417">Прайграць відэа</translation>
 <translation id="8131740175452115882">Пацвердзіць</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
index 2f803b9..78047b2 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bg.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Помощ</translation>
 <translation id="7658239707568436148">Отказ</translation>
 <translation id="7670511624014457267">60 кдр/сек</translation>
+<translation id="7974782136796202581">Показване на опциите за панорамно придвижване, наклон и промяна на мащаба</translation>
 <translation id="7983668134180549431">Разпознат е текст.</translation>
 <translation id="8067883171444229417">Възпроизвеждане на видеоклипа</translation>
 <translation id="8131740175452115882">Потвърждаване</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
index 12b379c..147988d3 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomoć</translation>
 <translation id="7658239707568436148">Otkaži</translation>
 <translation id="7670511624014457267">60 fps</translation>
+<translation id="7974782136796202581">Prikaži opcije pomicanja/naginjanja/zumiranja</translation>
 <translation id="7983668134180549431">Tekst je otkriven.</translation>
 <translation id="8067883171444229417">Reproduciraj videozapis</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
index 6615b1ad..7c926c2c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ajuda</translation>
 <translation id="7658239707568436148">Cancel·la</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Mostra les opcions de panoràmica, inclinació i zoom</translation>
 <translation id="7983668134180549431">Text detectat.</translation>
 <translation id="8067883171444229417">Reprodueix el vídeo</translation>
 <translation id="8131740175452115882">Confirma</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
index 44ac1726..a071792 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Nápověda</translation>
 <translation id="7658239707568436148">Zrušit</translation>
 <translation id="7670511624014457267">60 snímků/s</translation>
+<translation id="7974782136796202581">Zobrazit možnosti posunutí, náklonu a přiblížení</translation>
 <translation id="7983668134180549431">Byl zjištěn text.</translation>
 <translation id="8067883171444229417">Přehrát video</translation>
 <translation id="8131740175452115882">Potvrdit</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
index e8fe226..9e20ef5 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -81,6 +81,7 @@
 <translation id="7649070708921625228">Hjælp</translation>
 <translation id="7658239707568436148">Annuller</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Vis muligheder for panorering, tilpasning af horisont og zoom</translation>
 <translation id="7983668134180549431">Tekst er registreret.</translation>
 <translation id="8067883171444229417">Afspil video</translation>
 <translation id="8131740175452115882">Bekræft</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
index 5e5a167..a8f0f83 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Hilfe</translation>
 <translation id="7658239707568436148">Abbrechen</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Optionen zum Schwenken, Neigen und Zoomen anzeigen</translation>
 <translation id="7983668134180549431">Text erkannt.</translation>
 <translation id="8067883171444229417">Video ansehen</translation>
 <translation id="8131740175452115882">Bestätigen</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
index 0c0b8dbb..4490fbc 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Βοήθεια</translation>
 <translation id="7658239707568436148">Ακύρωση</translation>
 <translation id="7670511624014457267">60 καρέ ανά δευτερόλεπτο</translation>
+<translation id="7974782136796202581">Εμφάνιση επιλογών μετακίνησης, κλίσης, εστίασης</translation>
 <translation id="7983668134180549431">Εντοπίστηκε κείμενο.</translation>
 <translation id="8067883171444229417">Αναπαραγωγή βίντεο</translation>
 <translation id="8131740175452115882">Επιβεβαίωση</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
index dcd055d..13287530 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es-419.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Mostrar opciones de desplazamiento lateral, inclinación y zoom</translation>
 <translation id="7983668134180549431">Se detectó texto.</translation>
 <translation id="8067883171444229417">Reproducir video</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
index b445875..08c605c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_es.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Mostrar opciones de panorámica, inclinación y zoom</translation>
 <translation id="7983668134180549431">Texto detectado.</translation>
 <translation id="8067883171444229417">Reproducir vídeo</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
index 313043a..3e4075c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Laguntza</translation>
 <translation id="7658239707568436148">Utzi</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Erakutsi mugitzeko, okertzeko eta zooma aplikatzeko aukerak</translation>
 <translation id="7983668134180549431">Testua hauteman da.</translation>
 <translation id="8067883171444229417">Erreproduzitu bideoa</translation>
 <translation id="8131740175452115882">Berretsi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
index 323008f..12767de 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">راهنما</translation>
 <translation id="7658239707568436148">لغو</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">نمایش گزینه‌های حرکت دادن، کج کردن، بزرگ‌نمایی</translation>
 <translation id="7983668134180549431">نوشتار شناسایی شد.</translation>
 <translation id="8067883171444229417">پخش ویدیو</translation>
 <translation id="8131740175452115882">تأیید</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
index 090cdb1..e362d864 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ohje</translation>
 <translation id="7658239707568436148">Peruuta</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Näytä panorointi-, kallistus- ja zoomausvalinnat</translation>
 <translation id="7983668134180549431">Tekstiä havaittu.</translation>
 <translation id="8067883171444229417">Toista video</translation>
 <translation id="8131740175452115882">Vahvista</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
index 9fbbf757..58c8066c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_fr.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Aide</translation>
 <translation id="7658239707568436148">Annuler</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Afficher les options de panoramique, d'inclinaison et de zoom</translation>
 <translation id="7983668134180549431">Texte détecté.</translation>
 <translation id="8067883171444229417">Lire la vidéo</translation>
 <translation id="8131740175452115882">Confirmer</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
index 47b735a..13075f9 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_gl.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Axuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7670511624014457267">60 fps</translation>
+<translation id="7974782136796202581">Mostrar opcións de panorámica, inclinación e zoom</translation>
 <translation id="7983668134180549431">Detectouse texto.</translation>
 <translation id="8067883171444229417">Reproducir vídeo</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
index 252d5cd..0482fa66 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hi.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">सहायता</translation>
 <translation id="7658239707568436148">अभी नहीं</translation>
 <translation id="7670511624014457267">60 FPS (फ़्रेम प्रति सेकंड)</translation>
+<translation id="7974782136796202581">पैन करने, झुकाने, और ज़ूम करने के विकल्प दिखाएं</translation>
 <translation id="7983668134180549431">टेक्स्ट पहचाना गया.</translation>
 <translation id="8067883171444229417">वीडियो चलाएं</translation>
 <translation id="8131740175452115882">पुष्टि करें</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
index 1ef8bf43..60762d2 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomoć</translation>
 <translation id="7658239707568436148">Odustani</translation>
 <translation id="7670511624014457267">60 okv/s</translation>
+<translation id="7974782136796202581">Prikaži opcije za pomicanje/naginjanje/zumiranje</translation>
 <translation id="7983668134180549431">Tekst je prepoznat.</translation>
 <translation id="8067883171444229417">Reproduciraj videozapis</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
index f784b255..2728d0c 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hu.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Súgó</translation>
 <translation id="7658239707568436148">Mégse</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Pásztázás-billentés-nagyítás beállításainak megjelenítése</translation>
 <translation id="7983668134180549431">Szöveg észlelve.</translation>
 <translation id="8067883171444229417">Videó lejátszása</translation>
 <translation id="8131740175452115882">Megerősítés</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
index b0fae24..329a3c0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Օգնություն</translation>
 <translation id="7658239707568436148">Չեղարկել</translation>
 <translation id="7670511624014457267">60 կադր/վ</translation>
+<translation id="7974782136796202581">Ցուց տալ տեղաշարժման, թեքման և մասշտաբի փոփոխման ընտրանքները</translation>
 <translation id="7983668134180549431">Հայտնաբերվել է տեքստ։</translation>
 <translation id="8067883171444229417">Նվագարկել տեսանյութը</translation>
 <translation id="8131740175452115882">Հաստատել</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
index 64dc6d14..bfb6760 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Bantuan</translation>
 <translation id="7658239707568436148">Batal</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Tampilkan opsi geser miring zoom</translation>
 <translation id="7983668134180549431">Teks terdeteksi.</translation>
 <translation id="8067883171444229417">Putar video</translation>
 <translation id="8131740175452115882">Konfirmasi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
index 9d3e8f0..229427efc 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Hjálp</translation>
 <translation id="7658239707568436148">Hætta við</translation>
 <translation id="7670511624014457267">60 rammar/sek.</translation>
+<translation id="7974782136796202581">Sýna hliðrunar-, halla- og aðdráttarvalkosti</translation>
 <translation id="7983668134180549431">Texti greindist.</translation>
 <translation id="8067883171444229417">Spila myndskeið</translation>
 <translation id="8131740175452115882">Staðfesta</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
index 58e62d8..1d5491a9 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_it.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Guida</translation>
 <translation id="7658239707568436148">Annulla</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Mostra opzioni panoramica/inclinazione/zoom</translation>
 <translation id="7983668134180549431">Testo rilevato.</translation>
 <translation id="8067883171444229417">Guarda il video</translation>
 <translation id="8131740175452115882">Conferma</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
index 7afd26f8..21160192 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">עזרה</translation>
 <translation id="7658239707568436148">ביטול</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">הצגת האפשרויות להזזה, להטיה ולזום</translation>
 <translation id="7983668134180549431">זוהה טקסט.</translation>
 <translation id="8067883171444229417">הפעלת הסרטון</translation>
 <translation id="8131740175452115882">אישור</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
index 977f646..19e7e1d 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">დახმარება</translation>
 <translation id="7658239707568436148">გაუქმება</translation>
 <translation id="7670511624014457267">60 კადრი/წმ</translation>
+<translation id="7974782136796202581">პანირების/გადახრის/მასშტაბირების ვარიანტების ჩვენება</translation>
 <translation id="7983668134180549431">აღმოჩენილია ტექსტი.</translation>
 <translation id="8067883171444229417">ვიდეოს დაკვრა</translation>
 <translation id="8131740175452115882">დაადასტურება</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
index 01acda9..7b033410 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Анықтама</translation>
 <translation id="7658239707568436148">Бас тарту</translation>
 <translation id="7670511624014457267">60 кадр/сек</translation>
+<translation id="7974782136796202581">Панорама/еңкейту/масштабтау опцияларын көрсету</translation>
 <translation id="7983668134180549431">Мәтін анықталды.</translation>
 <translation id="8067883171444229417">Бейнені ойнату</translation>
 <translation id="8131740175452115882">Растау</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb
index 7707038..8b68216 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">ជំនួយ</translation>
 <translation id="7658239707568436148">បដិសេធ</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">បង្ហាញជម្រើសរំកិល/ផ្អៀង/ពង្រីកបង្រួម</translation>
 <translation id="7983668134180549431">បានរកឃើញ​អត្ថបទ។</translation>
 <translation id="8067883171444229417">ចាក់​វីដេអូ</translation>
 <translation id="8131740175452115882">អះអាង</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
index 133961d..bda873e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">도움말</translation>
 <translation id="7658239707568436148">취소</translation>
 <translation id="7670511624014457267">60FPS</translation>
+<translation id="7974782136796202581">이동, 기울이기, 확대/축소 옵션 보기</translation>
 <translation id="7983668134180549431">텍스트가 감지되었습니다.</translation>
 <translation id="8067883171444229417">동영상 재생</translation>
 <translation id="8131740175452115882">확인</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
index 4b38205d..a49cc1157 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Жардам</translation>
 <translation id="7658239707568436148">Жокко чыгаруу</translation>
 <translation id="7670511624014457267">60 кадр/сек</translation>
+<translation id="7974782136796202581">Жылдырып кароо, кыйшайтуу, чоңойтуп/кичирейтүү параметрлерин көрсөтүү</translation>
 <translation id="7983668134180549431">Текст аныкталды.</translation>
 <translation id="8067883171444229417">Видеону ойнотуу</translation>
 <translation id="8131740175452115882">Ырастоо</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
index 6b4e9ef..e126507e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pagalba</translation>
 <translation id="7658239707568436148">Atšaukti</translation>
 <translation id="7670511624014457267">60 KPS</translation>
+<translation id="7974782136796202581">Rodyti pastūmimo, pakreipimo ir mastelio keitimo parinktis</translation>
 <translation id="7983668134180549431">Aptiktas tekstas.</translation>
 <translation id="8067883171444229417">Leisti vaizdo įrašą</translation>
 <translation id="8131740175452115882">Patvirtinti</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
index 43e19e5..421d6b7 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_lv.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Palīdzība</translation>
 <translation id="7658239707568436148">Atcelt</translation>
 <translation id="7670511624014457267">60 kadri/s</translation>
+<translation id="7974782136796202581">Rādīt pārvietošanas/noliekšanas/tālummaiņas opcijas</translation>
 <translation id="7983668134180549431">Konstatēts teksts.</translation>
 <translation id="8067883171444229417">Atskaņot videoklipu</translation>
 <translation id="8131740175452115882">Apstiprināt</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
index d6df8d2b..373d039 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_mk.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Помош</translation>
 <translation id="7658239707568436148">Откажи</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Прикажувај ги опциите за движење, навалување и зумирање</translation>
 <translation id="7983668134180549431">Препознаен е текст.</translation>
 <translation id="8067883171444229417">Пушти го видеото</translation>
 <translation id="8131740175452115882">Потврди</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
index c75a24e..167f202 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Bantuan</translation>
 <translation id="7658239707568436148">Batal</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Tunjukkan pilihan sorot/condong/zum</translation>
 <translation id="7983668134180549431">Teks dikesan.</translation>
 <translation id="8067883171444229417">Mainkan video</translation>
 <translation id="8131740175452115882">Sahkan</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb
index f00d6c8..4c6eee90 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">အကူအညီ</translation>
 <translation id="7658239707568436148">မလုပ်တော့</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">ရွှေ့ကြည့်ရန်/စောင်းကြည့်ရန်/ဇူးမ်ဆွဲရန်အတွက် ရွေးစရာများ ပြရန်</translation>
 <translation id="7983668134180549431">စာသား တွေ့ရှိသည်။</translation>
 <translation id="8067883171444229417">ဗီဒီယို ဖွင့်ရန်</translation>
 <translation id="8131740175452115882">အတည်ပြုရန်</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
index 7154c6b..9bbe484 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Hjelp</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7670511624014457267">60 bilder per sekund</translation>
+<translation id="7974782136796202581">Vis alternativer for panorering, vipping og zooming</translation>
 <translation id="7983668134180549431">Oppdaget tekst.</translation>
 <translation id="8067883171444229417">Spill av videoen</translation>
 <translation id="8131740175452115882">Bekreft</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
index c089215..8ca0a2a 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomoc</translation>
 <translation id="7658239707568436148">Anuluj</translation>
 <translation id="7670511624014457267">60 kl./s</translation>
+<translation id="7974782136796202581">Pokaż opcje przesunięcia, przechylenia i powiększenia</translation>
 <translation id="7983668134180549431">Wykryto tekst.</translation>
 <translation id="8067883171444229417">Odtwórz film</translation>
 <translation id="8131740175452115882">Potwierdź</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
index b8b75af..59623e49 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ajuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Mostrar opções de deslocamento, inclinação e zoom</translation>
 <translation id="7983668134180549431">Texto detetado.</translation>
 <translation id="8067883171444229417">Reproduzir vídeo</translation>
 <translation id="8131740175452115882">Confirmar</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
index 7e8e6261..be087c9 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ajutor</translation>
 <translation id="7658239707568436148">Anulează</translation>
 <translation id="7670511624014457267">60 CPS</translation>
+<translation id="7974782136796202581">Afișează opțiunile de deplasare, înclinare și zoom</translation>
 <translation id="7983668134180549431">A fost detectat text.</translation>
 <translation id="8067883171444229417">Redă videoclipul</translation>
 <translation id="8131740175452115882">Confirmați</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
index abd9d079..eb6fb038 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Справка</translation>
 <translation id="7658239707568436148">Отмена</translation>
 <translation id="7670511624014457267">60 кадров/с</translation>
+<translation id="7974782136796202581">Показывать настройки масштаба, панорамирования и наклона камеры</translation>
 <translation id="7983668134180549431">Обнаружен текст.</translation>
 <translation id="8067883171444229417">Смотреть видео</translation>
 <translation id="8131740175452115882">Подтвердить</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
index 75368e5..055b4fd 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_si.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">උදවු</translation>
 <translation id="7658239707568436148">අවලංගු කරන්න</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">තිරස් සිරස් විශාලන විකල්ප පෙන්වන්න</translation>
 <translation id="7983668134180549431">පෙළ අනාවරණය කර ගන්නා ලදි.</translation>
 <translation id="8067883171444229417">වීඩියෝව ධාවන කරන්න</translation>
 <translation id="8131740175452115882">තහවුරු කරන්න</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
index 373a09c..e9e3f6a 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomocník</translation>
 <translation id="7658239707568436148">Zrušiť</translation>
 <translation id="7670511624014457267">60 sním./s</translation>
+<translation id="7974782136796202581">Zobraziť možnosti posunutia, naklonenia a priblíženia</translation>
 <translation id="7983668134180549431">Bol rozpoznaný text.</translation>
 <translation id="8067883171444229417">Prehrať video</translation>
 <translation id="8131740175452115882">Potvrdiť</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
index 38f75fd..f3f745d 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomoč</translation>
 <translation id="7658239707568436148">Prekliči</translation>
 <translation id="7670511624014457267">60 sličic/s</translation>
+<translation id="7974782136796202581">Prikaz možnosti za premikanje, nagibanje in povečanje/pomanjšanje</translation>
 <translation id="7983668134180549431">Zaznano je bilo besedilo.</translation>
 <translation id="8067883171444229417">Predvajanje videa</translation>
 <translation id="8131740175452115882">Potrdi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
index aad9bd67..bf238e128 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sq.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Ndihma</translation>
 <translation id="7658239707568436148">Anulo</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Shfaq opsionet e zmadhimit/animit/zgjerimit</translation>
 <translation id="7983668134180549431">U zbulua një tekst.</translation>
 <translation id="8067883171444229417">Luaj videon</translation>
 <translation id="8131740175452115882">Konfirmo</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
index f1de1f9..54a24947 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Pomoć</translation>
 <translation id="7658239707568436148">Otkaži</translation>
 <translation id="7670511624014457267">60 kadr/s</translation>
+<translation id="7974782136796202581">Prikaži opcije za pomeranje, naginjanje i zumiranje</translation>
 <translation id="7983668134180549431">Tekst je otkriven.</translation>
 <translation id="8067883171444229417">Pusti video</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
index ba565c2c..8032203 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Помоћ</translation>
 <translation id="7658239707568436148">Откажи</translation>
 <translation id="7670511624014457267">60 кадр/с</translation>
+<translation id="7974782136796202581">Прикажи опције за померање, нагињање и зумирање</translation>
 <translation id="7983668134180549431">Текст је откривен.</translation>
 <translation id="8067883171444229417">Пусти видео</translation>
 <translation id="8131740175452115882">Потврди</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
index dd4ca4cc..fb4cff7 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sv.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Hjälp</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Visa alternativ för panorering, lutning och zoom</translation>
 <translation id="7983668134180549431">Text har identifierats.</translation>
 <translation id="8067883171444229417">Spela upp video</translation>
 <translation id="8131740175452115882">Bekräfta</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
index 5ce2a7c..bfb856b9 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Usaidizi</translation>
 <translation id="7658239707568436148">Ghairi</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Onyesha chaguo za kugeuza upande, kuinamisha na kukuza</translation>
 <translation id="7983668134180549431">Maandishi yametambuliwa.</translation>
 <translation id="8067883171444229417">Cheza video</translation>
 <translation id="8131740175452115882">Thibitisha</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
index f643705..4763ddc5 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Yardım</translation>
 <translation id="7658239707568436148">İptal</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Kaydırma, eğme, yakınlaştırma seçeneklerini göster</translation>
 <translation id="7983668134180549431">Metin algılandı.</translation>
 <translation id="8067883171444229417">Videoyu oynat</translation>
 <translation id="8131740175452115882">Onayla</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
index b9bb97d..330ed52 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uk.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Довідка</translation>
 <translation id="7658239707568436148">Скасувати</translation>
 <translation id="7670511624014457267">60 кадрів/с</translation>
+<translation id="7974782136796202581">Показувати параметри панорамування, нахилу та масштабу</translation>
 <translation id="7983668134180549431">Виявлений текст.</translation>
 <translation id="8067883171444229417">Дивитися відео</translation>
 <translation id="8131740175452115882">Підтвердити</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb
index 0fc2304e..d419d9b 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Yordam</translation>
 <translation id="7658239707568436148">Bekor qilish</translation>
 <translation id="7670511624014457267">60 kadr/s</translation>
+<translation id="7974782136796202581">Panorama, kamerani qiyalatish va masshtab sozlamalarini chiqarish</translation>
 <translation id="7983668134180549431">Matn aniqlandi.</translation>
 <translation id="8067883171444229417">Videoni ijro qilish</translation>
 <translation id="8131740175452115882">Tasdiqlash</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb
index 5c316c1..2838ece 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Trợ giúp</translation>
 <translation id="7658239707568436148">Hủy</translation>
 <translation id="7670511624014457267">60 khung hình/giây</translation>
+<translation id="7974782136796202581">Hiển thị các tùy chọn xoay, nghiêng, thu phóng</translation>
 <translation id="7983668134180549431">Phát hiện thấy văn bản.</translation>
 <translation id="8067883171444229417">Phát video</translation>
 <translation id="8131740175452115882">Xác nhận</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
index 0b8de07..c7c6e26 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">說明</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="7670511624014457267">每秒畫格數:60</translation>
+<translation id="7974782136796202581">顯示平移傾斜縮放選項</translation>
 <translation id="7983668134180549431">已偵測到文字。</translation>
 <translation id="8067883171444229417">播放影片</translation>
 <translation id="8131740175452115882">確定</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
index c250e79b..7bb18e0 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">說明</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="7670511624014457267">每秒畫格數:60</translation>
+<translation id="7974782136796202581">顯示平移/傾斜/縮放選項</translation>
 <translation id="7983668134180549431">偵測到文字。</translation>
 <translation id="8067883171444229417">播放影片</translation>
 <translation id="8131740175452115882">確認</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
index 57b25ec..a064aa5e 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -80,6 +80,7 @@
 <translation id="7649070708921625228">Usizo</translation>
 <translation id="7658239707568436148">Khansela</translation>
 <translation id="7670511624014457267">60 FPS</translation>
+<translation id="7974782136796202581">Bonisa izinketho zokusondeza i-pan tilt</translation>
 <translation id="7983668134180549431">Umbhalo utholiwe.</translation>
 <translation id="8067883171444229417">Dlala ividiyo</translation>
 <translation id="8131740175452115882">Qinisekisa</translation>
diff --git a/chromeos/components/diagnostics_ui/diagnostics_ui.cc b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
index 1b9e0cd..31cab95 100644
--- a/chromeos/components/diagnostics_ui/diagnostics_ui.cc
+++ b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
@@ -34,12 +34,14 @@
 
 void AddDiagnosticsStrings(content::WebUIDataSource* html_source) {
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
+      {"batteryCalculatingText", IDS_DIAGNOSTICS_BATTERY_CALCULATING_TEXT},
       {"batteryChargeRoutineText", IDS_DIAGNOSTICS_BATTERY_CHARGE_ROUTINE_TEXT},
       {"batteryDischargeRoutineText",
        IDS_DIAGNOSTICS_BATTERY_DISCHARGE_ROUTINE_TEXT},
       {"batteryChargingStatusText", IDS_DIAGNOSTICS_BATTERY_CHARGING},
       {"batteryChipText", IDS_DIAGNOSTICS_BATTERY_CHIP_TEXT},
       {"batteryDischargingStatusText", IDS_DIAGNOSTICS_BATTERY_DISCHARGING},
+      {"batteryFullText", IDS_DIAGNOSTICS_BATTERY_FULL_TEXT},
       {"batteryHealthLabel", IDS_DIAGNOSTICS_BATTERY_HEALTH_LABEL},
       {"batteryHealthText", IDS_DIAGNOSTICS_BATTERY_HEALTH_TEXT},
       {"batteryHealthTooltipText", IDS_DIAGNOSTICS_BATTERY_HEALTH_TOOLTIP_TEXT},
diff --git a/chromeos/components/diagnostics_ui/resources/battery_status_card.js b/chromeos/components/diagnostics_ui/resources/battery_status_card.js
index 7c954ef..d490dc2 100644
--- a/chromeos/components/diagnostics_ui/resources/battery_status_card.js
+++ b/chromeos/components/diagnostics_ui/resources/battery_status_card.js
@@ -189,15 +189,20 @@
    * @protected
    */
   getPowerTimeString_() {
+    const fullyCharged = this.batteryChargeStatus_.batteryState ===
+        chromeos.diagnostics.mojom.BatteryState.kFull;
+    if (fullyCharged) {
+      return loadTimeData.getString('batteryFullText');
+    }
+
     const powerTimeStr = this.batteryChargeStatus_.powerTime;
     if (!powerTimeStr || powerTimeStr.data.length === 0) {
-      return '';
+      return loadTimeData.getString('batteryCalculatingText');
     }
 
     const timeValue = mojoString16ToString(powerTimeStr);
-    const charging = this.batteryChargeStatus_ &&
-        this.batteryChargeStatus_.powerAdapterStatus ===
-            chromeos.diagnostics.mojom.ExternalPowerSource.kAc;
+    const charging = this.batteryChargeStatus_.powerAdapterStatus ===
+        chromeos.diagnostics.mojom.ExternalPowerSource.kAc;
 
     return charging ?
         loadTimeData.getStringF('batteryChargingStatusText', timeValue) :
diff --git a/chromeos/components/remote_apps/mojom/remote_apps.mojom b/chromeos/components/remote_apps/mojom/remote_apps.mojom
index 594fffe..416e091 100644
--- a/chromeos/components/remote_apps/mojom/remote_apps.mojom
+++ b/chromeos/components/remote_apps/mojom/remote_apps.mojom
@@ -18,7 +18,10 @@
   // Output parameters:
   // - |folder_id|: the ID of the newly added folder.
   // - |error|: A string describing the error if any.
-  AddFolder(string name) => (string? folder_id, string? error);
+  // - |add_to_front|: true if the folder should be added to the front of the
+  //                   app list.
+  AddFolder(string name,
+            bool add_to_front) => (string? folder_id, string? error);
 
   // Adds a Remote Apps app to the launcher.
   //
@@ -27,12 +30,16 @@
   // - |folder_id|: the ID of the parent folder. An empty string indicates the
   //                app has no parent folder.
   // - |icon_url|: a URL pointing to an image which represents the app's icon.
+  // - |add_to_front|: true if the app should be added to the front of the app
+  //                   list. Has no effect if the app has a parent folder.
   //
   // Output parameters:
   // - |app_id|: the ID of the newly added app.
   // - |error|: A string describing the error if any.
-  AddApp(string name, string folder_id, url.mojom.Url icon_url) =>
-      (string? app_id, string? error);
+  AddApp(string name,
+         string folder_id,
+         url.mojom.Url icon_url,
+         bool add_to_front) => (string? app_id, string? error);
 };
 
 // Factory for creating an instance of RemoteApps.
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index aff1a46..27818e76 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -380,11 +380,6 @@
 const base::Feature kClipboardHistoryNudgeSessionReset{
     "ClipboardHistoryNudgeSessionReset", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables rendering html in Clipboard History only if an img or table tag is
-// present.
-const base::Feature kClipboardHistorySimpleRender{
-    "ClipboardHistorySimpleRender", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // If enabled, a blue new nudge will show on the context menu option for
 // clipboard history.
 const base::Feature kClipboardHistoryContextMenuNudge{
@@ -804,19 +799,13 @@
 }
 
 bool IsClipboardHistoryEnabled() {
-  return base::FeatureList::IsEnabled(kClipboardHistory) ||
-         base::FeatureList::IsEnabled(kClipboardHistorySimpleRender);
+  return base::FeatureList::IsEnabled(kClipboardHistory);
 }
 
 bool IsClipboardHistoryNudgeSessionResetEnabled() {
   return base::FeatureList::IsEnabled(kClipboardHistoryNudgeSessionReset);
 }
 
-bool IsClipboardHistorySimpleRenderEnabled() {
-  return base::FeatureList::IsEnabled(kClipboardHistory) ||
-         base::FeatureList::IsEnabled(kClipboardHistorySimpleRender);
-}
-
 bool IsClipboardHistoryContextMenuNudgeEnabled() {
   return base::FeatureList::IsEnabled(kClipboardHistoryContextMenuNudge);
 }
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 27bc5dc..6342333 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -170,8 +170,6 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kClipboardHistoryNudgeSessionReset;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
-extern const base::Feature kClipboardHistorySimpleRender;
-COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kClipboardHistoryContextMenuNudge;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kEnableFilesAppCopyImage;
@@ -355,8 +353,6 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 bool IsClipboardHistoryNudgeSessionResetEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
-bool IsClipboardHistorySimpleRenderEnabled();
-COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 bool IsClipboardHistoryContextMenuNudgeEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsOobeChromeVoxHintEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsOobeScreensPriorityEnabled();
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index d8aa7a5..f2df0b1 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-90-4384.0-1611574800-benchmark-90.0.4399.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-90-4384.0-1611574800-benchmark-90.0.4400.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 3c4bcad0..f0841eb 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-90-4384.0-1611571175-benchmark-90.0.4399.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-90-4384.0-1611571175-benchmark-90.0.4400.0-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index b3b4641..5b13ffbd9 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -330,7 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">Predeterminat</translation>
 <translation id="8798441408945964110">Nom del proveïdor</translation>
-<translation id="880791622116642296">Indica el nombre de vegades que has carregat la bateria completament</translation>
+<translation id="880791622116642296">Indica el nombre de vegades que la bateria s'ha carregat completament</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8845001906332463065">Obteniu ajuda</translation>
 <translation id="8881098542468797602">La prova s'ha superat</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 9696bc87..14ab2eb 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">Gateway</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">An Scanbereich anpassen</translation>
+<translation id="1387854245479784695">Alle Kerne zusammengerechnet</translation>
 <translation id="1397738625398125236">Gateway kann kontaktiert werden</translation>
 <translation id="1398634363027580500">Sehr hohe HTTPS-Latenz</translation>
 <translation id="1413240736185167732">Fehlgeschlagen – Filter funktioniert nicht</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">Fehlgeschlagen – Unbekannter Fehler</translation>
 <translation id="357889014807611375">Kostenpflichtiges WLAN</translation>
 <translation id="360565022852130722">Das WLAN ist mit dem schwachen Protokoll WEP 802.1x gesichert</translation>
+<translation id="3712633734921637892">Die CPU-Geschwindigkeit ist derzeit eingeschränkt, um den Akku zu schonen oder die Temperatur zu senken</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> Rezensionen)</translation>
 <translation id="3748026146096797577">Nicht verbunden</translation>
 <translation id="3749289110408117711">Dateiname</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">Geben Sie zum Schluss Ihr neues Passwort ein</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">Weitere Informationen</translation>
+<translation id="6189418609903030344">Die Akkukapazität sinkt mit fortschreitender Nutzung</translation>
 <translation id="6191293864534840972">Nameserver hat fehlerhaftes Format</translation>
 <translation id="6232017090690406397">Akku</translation>
 <translation id="6325525973963619867">Fehlgeschlagen</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">Standard</translation>
 <translation id="8798441408945964110">Name des Anbieters</translation>
+<translation id="880791622116642296">Wie oft der Akku vollständig aufgeladen wurde</translation>
 <translation id="8814190375133053267">WLAN</translation>
 <translation id="8845001906332463065">Hilfe aufrufen</translation>
 <translation id="8881098542468797602">Test abgeschlossen</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index 46beadd..e3435aa 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">Atebidea</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">Egokitu eskanea daitekeen eremura</translation>
+<translation id="1387854245479784695">Nukleo guztien multzokatze bat da hau</translation>
 <translation id="1397738625398125236">Ping egin dakioke atebideari</translation>
 <translation id="1398634363027580500">HTTPS eskaeren itxarote-denbora oso luzea</translation>
 <translation id="1413240736185167732">Hutsegitea - Iragazkiak huts egin du</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">Hutsegitea - Errore ezezaguna</translation>
 <translation id="357889014807611375">wifi neurtua</translation>
 <translation id="360565022852130722">WEP 802.1x protokolo ahulak babesten du wifi-sarea</translation>
+<translation id="3712633734921637892">PUZaren abiadura mugatuta dago une honetan, bateria aurrezteko edo tenperatura jaisteko</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> iritzi)</translation>
 <translation id="3748026146096797577">Konektatu gabe</translation>
 <translation id="3749289110408117711">Fitxategiaren izena</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">Amaitzeko, idatzi pasahitz berria</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">Lortu informazio gehiago</translation>
+<translation id="6189418609903030344">Erabili ahala, ahalmena galtzen joaten da bateria</translation>
 <translation id="6191293864534840972">Gaizki eratuta daude izenen zerbitzariak</translation>
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6325525973963619867">Huts egin du</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">Lehenetsia</translation>
 <translation id="8798441408945964110">Hornitzailearen izena</translation>
+<translation id="880791622116642296">Bateriak kargatze-ziklo osoa zenbat aldiz egin duen adierazten du zenbaki honek</translation>
 <translation id="8814190375133053267">Wi-Fi konexioa</translation>
 <translation id="8845001906332463065">Lortu laguntza</translation>
 <translation id="8881098542468797602">Gainditu da proba</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index 89a7427a31..de1d5de 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">Passerelle</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">Ajuster à la zone de numérisation</translation>
+<translation id="1387854245479784695">Tous cœurs confondus</translation>
 <translation id="1397738625398125236">Pinguer la passerelle</translation>
 <translation id="1398634363027580500">Latence très élevée des requêtes HTTPS</translation>
 <translation id="1413240736185167732">Échec – Problème au niveau du filtre</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">Échec – Erreur inconnue</translation>
 <translation id="357889014807611375">Wi-Fi facturé à l'usage</translation>
 <translation id="360565022852130722">Le réseau Wi-Fi est protégé par le protocole peu sécurisé WEP 802.1x</translation>
+<translation id="3712633734921637892">La vitesse du processeur est actuellement limitée afin de préserver la batterie ou baisser la température</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> avis)</translation>
 <translation id="3748026146096797577">Non connecté</translation>
 <translation id="3749289110408117711">Nom du fichier</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">Pour terminer, saisissez votre nouveau mot de passe</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">En savoir plus</translation>
+<translation id="6189418609903030344">L'autonomie de la batterie diminue au fur et à mesure de son utilisation</translation>
 <translation id="6191293864534840972">Serveurs de noms non valides</translation>
 <translation id="6232017090690406397">Batterie</translation>
 <translation id="6325525973963619867">Échec</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">Par défaut</translation>
 <translation id="8798441408945964110">Nom du fournisseur</translation>
+<translation id="880791622116642296">Nombre de cycles de charge complets effectués par votre batterie</translation>
 <translation id="8814190375133053267">Wi-Fi </translation>
 <translation id="8845001906332463065">Obtenir de l'aide</translation>
 <translation id="8881098542468797602">Test réussi</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index c1f842b..cdd14157 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">Pasarela</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">Axustar á zona de escaneo</translation>
+<translation id="1387854245479784695">Esta é a suma de todos os núcleos</translation>
 <translation id="1397738625398125236">Pódeselle facer ping á pasarela</translation>
 <translation id="1398634363027580500">Latencia de HTTPS moi alta</translation>
 <translation id="1413240736185167732">Produciuse un erro: fallo no filtro</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">Produciuse un erro descoñecido</translation>
 <translation id="357889014807611375">wifi de pago por consumo</translation>
 <translation id="360565022852130722">A rede wifi está protexida co protocolo WEP 802.1x, que non é moi seguro</translation>
+<translation id="3712633734921637892">Nestes momentos, a velocidade da CPU está limitada para aforrar batería ou baixar a temperatura</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> recensións)</translation>
 <translation id="3748026146096797577">Non conectado</translation>
 <translation id="3749289110408117711">Nome de ficheiro</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">Para finalizar, introduce o teu novo contrasinal</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">Máis información</translation>
+<translation id="6189418609903030344">A capacidade da batería diminúe co uso</translation>
 <translation id="6191293864534840972">Os servidores de nomes teñen un formato incorrecto</translation>
 <translation id="6232017090690406397">Batería</translation>
 <translation id="6325525973963619867">Produciuse un erro</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">Predeterminado</translation>
 <translation id="8798441408945964110">Nome do fornecedor</translation>
+<translation id="880791622116642296">Este é o número de veces que a batería se someteu a un ciclo de carga completo</translation>
 <translation id="8814190375133053267">Wifi</translation>
 <translation id="8845001906332463065">Obter axuda</translation>
 <translation id="8881098542468797602">Superouse a proba</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index 75c8520..d6182bf2 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">ഗേറ്റ്‌വേ</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">സ്‌കാൻ ഏരിയയ്‌ക്ക് അനുയോജ്യമാക്കുക</translation>
+<translation id="1387854245479784695">ഇത് എല്ലാ കോറുകളുടെയും സംഗ്രഹമാണ്</translation>
 <translation id="1397738625398125236">ഗേറ്റ്‌വേ പിംഗ് ചെയ്യാൻ കഴിയും</translation>
 <translation id="1398634363027580500">വളരെ ഉയർന്ന HTTPS പ്രതികരണ സമയം</translation>
 <translation id="1413240736185167732">പ്രിന്റ് ചെയ്യാനായില്ല - ഫിൽട്ടർ പ്രവർത്തിക്കുന്നില്ല</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">പ്രിന്റ് ചെയ്യാനായില്ല - അജ്ഞാതമായ പിശക്</translation>
 <translation id="357889014807611375">മീറ്റർ ചെയ്‌ത വൈഫൈ</translation>
 <translation id="360565022852130722">ദുർബലമായ WEP 802.1x പ്രോട്ടോക്കോൾ ഉപയോഗിച്ചാണ് വെെഫെെ നെറ്റ്‌വർക്ക് സുരക്ഷിതമാക്കിയിരിക്കുന്നത്</translation>
+<translation id="3712633734921637892">ബാറ്ററി സംരക്ഷിക്കാനോ താപനില കുറയ്‌ക്കാനോ CPU വേഗത നിലവിൽ പരിമിതപ്പെടുത്തിയിരിക്കുന്നു</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> റിവ്യൂകൾ)</translation>
 <translation id="3748026146096797577">കണക്റ്റുചെയ്‌തിട്ടില്ല</translation>
 <translation id="3749289110408117711">ഫയല്‍ നാമം</translation>
@@ -229,6 +231,7 @@
 <translation id="6146993107019042706">പൂർത്തിയാക്കാൻ നിങ്ങളുടെ പുതിയ പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">കൂടുതലറിയുക</translation>
+<translation id="6189418609903030344">ഉപയോഗത്തിനനുസരിച്ച് ബാറ്ററി ശേഷി കുറയുന്നു</translation>
 <translation id="6191293864534840972">തകരാറുള്ള നെയിം സെർവറുകൾ</translation>
 <translation id="6232017090690406397">ബാറ്ററി</translation>
 <translation id="6325525973963619867">പരാജയപ്പെട്ടു</translation>
@@ -326,6 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">ഡിഫോൾട്ട്</translation>
 <translation id="8798441408945964110">പ്രൊവൈഡറിന്റെ പേര്</translation>
+<translation id="880791622116642296">നിങ്ങളുടെ ബാറ്ററി പൂർണ്ണമായി ചാർജ് ചെയ്തതിന്റെ എണ്ണമാണിത്</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8845001906332463065">സഹായം നേടുക</translation>
 <translation id="8881098542468797602">ടെസ്റ്റ് പൂർത്തിയായി</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 81f1fc0..9f8259e 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -329,7 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">ပုံသေ</translation>
 <translation id="8798441408945964110">ပံ့ပိုးသူ အမည်</translation>
-<translation id="880791622116642296">ဤအရာသည် သင့်ဘက်ထရီကို အားအပြည့်သွင်းထားသည့် အကြိမ်အရေအတွက် ဖြစ်သည်</translation>
+<translation id="880791622116642296">သင့်ဘက်ထရီကို အားအပြည့်သွင်းထားသည့် အကြိမ်အရေအတွက် ဖြစ်သည်</translation>
 <translation id="8814190375133053267">ကြိုးမဲ့</translation>
 <translation id="8845001906332463065">အကူအညီရယူပါ</translation>
 <translation id="8881098542468797602">စစ်ဆေးမှု အောင်မြင်သည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index 5a4b605..1f84bca 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">गेटवे</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">स्क्यान गर्ने क्षेत्रमा मिलाउनुहोस्</translation>
+<translation id="1387854245479784695">यसमा सबै कोरहरूको डेटा समावेश हुन्छ</translation>
 <translation id="1397738625398125236">गेटवे पिङ गर्न सकिन्छ</translation>
 <translation id="1398634363027580500">HTTPS को विलम्बता अति धेरै छ</translation>
 <translation id="1413240736185167732">प्रिन्ट गर्न सकिएन - फिल्टरमा समस्या आयो</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">प्रिन्ट गर्न सकिएन - अज्ञात त्रुटि भयो</translation>
 <translation id="357889014807611375">मिटर चढ्ने Wi-Fi</translation>
 <translation id="360565022852130722">WiFi नेटवर्क WEP 802.1x नामक कमजोर प्रोटोकोल प्रयोग गरी सुरक्षित गरिएको छ</translation>
+<translation id="3712633734921637892">ब्याट्री लामो समयसम्म टिक्ने बनाउन वा यसको तापक्रम घटाउन CPU को गति हाल सीमित पारिएको छ</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> वटा समीक्षा)</translation>
 <translation id="3748026146096797577">जोडिएको छैन</translation>
 <translation id="3749289110408117711">फाइल नाम</translation>
@@ -229,6 +231,7 @@
 <translation id="6146993107019042706">यो कार्य पूरा गर्न आफ्नो नयाँ पासवर्ड प्रविष्टि गर्नुहोस्</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">थप जान्नुहोस्</translation>
+<translation id="6189418609903030344">प्रयोग गर्दै जाँदा ब्याट्री टिक्ने दर घट्दै जान्छ</translation>
 <translation id="6191293864534840972">डोमेन नेम सर्भरहरूको ढाँचा मिलेको छैन</translation>
 <translation id="6232017090690406397">ब्याटरी</translation>
 <translation id="6325525973963619867">चलाउन सकिएन</translation>
@@ -326,6 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">पूर्वनिर्धारित</translation>
 <translation id="8798441408945964110">प्रदायकको नाम</translation>
+<translation id="880791622116642296">चक्रको गिन्ती तपाईंको ब्याट्री कति पटक पूरा चार्ज भएको छ भन्ने तथ्याङ्क हो</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8845001906332463065">मद्दत प्राप्त गर्नुहोस्</translation>
 <translation id="8881098542468797602">परीक्षण सफल भयो</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 231afa6..e80b3bf6 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">ଗେଟ୍‌ୱେ</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">ସ୍କାନ୍ କ୍ଷେତ୍ର ଅନୁସାରେ ଫିଟ୍ କରନ୍ତୁ</translation>
+<translation id="1387854245479784695">ଏହା ସମସ୍ତ କୋରର ଏକ ଏକତ୍ରୀକରଣ ଅଟେ</translation>
 <translation id="1397738625398125236">ଗେଟୱେକୁ ପିଙ୍ଗ୍ କରାଯାଇପାରିବ</translation>
 <translation id="1398634363027580500">HTTPSର ଅଧିକ ଲାଟେନ୍ସି</translation>
 <translation id="1413240736185167732">ବିଫଳ ହୋଇଛି - ଫିଲ୍ଟର୍ ବିଫଳ ହୋଇଛି</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">ବିଫଳ ହୋଇଛି - ଅଜଣା ତ୍ରୁଟି</translation>
 <translation id="357889014807611375">ମିଟର୍ ହୋଇଥିବା ୱାଇ-ଫାଇ</translation>
 <translation id="360565022852130722">ଦୁର୍ବଳ ପ୍ରୋଟୋକଲ୍ WEP 802.1x ବ୍ୟବହାର କରି ୱାଇଫାଇ ନେଟୱାର୍କକୁ ସୁରକ୍ଷିତ କରାଯାଇଛି</translation>
+<translation id="3712633734921637892">ବ୍ୟାଟେରୀକୁ ସଂରକ୍ଷିତ ରଖିବା କିମ୍ବା ତାପମାତ୍ରାକୁ କମ୍ କରିବାକୁ ବର୍ତ୍ତମାନ CPUର ସ୍ପିଡ୍ ସୀମିତ କରାଯାଇଛି</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" />ଟି ସମୀକ୍ଷା)</translation>
 <translation id="3748026146096797577">ସଂଯୁକ୍ତ ହୋଇନାହିଁ</translation>
 <translation id="3749289110408117711">ଫାଇଲ୍ ନାମ</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">ସମ୍ପୂର୍ଣ୍ଣ କରିବା ପାଇଁ, ଆପଣଙ୍କର ନୂଆ ପାସ୍‍ୱାର୍ଡ ଲେଖନ୍ତୁ</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">ଅଧିକ ଜାଣନ୍ତୁ</translation>
+<translation id="6189418609903030344">ବ୍ୟବହାର ଯୋଗୁଁ ବ୍ୟାଟେରୀର କ୍ଷମତା ହ୍ରାସ ପାଏ</translation>
 <translation id="6191293864534840972">ତ୍ରୁଟିପୂର୍ଣ୍ଣ ନେମ୍ ସର୍ଭର୍</translation>
 <translation id="6232017090690406397">ବ୍ୟାଟେରୀ</translation>
 <translation id="6325525973963619867">ବିଫଳ ହୋଇଛି</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">ଡିଫଲ୍ଟ</translation>
 <translation id="8798441408945964110">ପ୍ରଦାତାଙ୍କ ନାମ</translation>
+<translation id="880791622116642296">ଏହା ହେଉଛି ଆପଣଙ୍କ ବ୍ୟାଟେରୀ କେତେ ଥର ଏକ ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜିଂ ସାଇକଲରେ ଗତି କରିଛି</translation>
 <translation id="8814190375133053267">ୱାଇ-ଫାଇ</translation>
 <translation id="8845001906332463065">ସାହାଯ୍ୟ ପାଆନ୍ତୁ</translation>
 <translation id="8881098542468797602">ଟେଷ୍ଟ ସଫଳ ହୋଇଛି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 187da58..7baf6e9 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">ਗੇਟਵੇ</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">ਸਕੈਨ ਕਰਨ ਯੋਗ ਖੇਤਰ ਵਿੱਚ ਫਿੱਟ ਕਰੋ</translation>
+<translation id="1387854245479784695">ਇਹ ਸਾਰੇ ਕੋਰ ਅੰਕੜਿਆਂ ਦਾ ਇਕੱਤਰੀਕਰਨ ਹੈ</translation>
 <translation id="1397738625398125236">ਗੇਟਵੇ ਨੂੰ ਪਿੰਗ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation>
 <translation id="1398634363027580500">ਬਹੁਤ ਜ਼ਿਆਦਾ HTTPS ਵਿਲੰਬਤਾ</translation>
 <translation id="1413240736185167732">ਅਸਫਲ ਰਹੀ - ਫਿਲਟਰ ਅਸਫਲ ਰਿਹਾ</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">ਅਸਫਲ ਰਹੀ - ਅਗਿਆਤ ਗੜਬੜ</translation>
 <translation id="357889014807611375">ਮੀਟਰਡ ਵਾਈ-ਫਾਈ</translation>
 <translation id="360565022852130722">ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਕਮਜ਼ੋਰ ਪ੍ਰੋਟੋਕੋਲ WEP 802.1x ਨਾਲ ਸੁਰੱਖਿਅਤ ਹੈ</translation>
+<translation id="3712633734921637892">ਬੈਟਰੀ ਬਚਾਉਣ ਜਾਂ ਤਾਪਮਾਨ ਘਟਾਉਣ ਲਈ CPU ਦੀ ਗਤੀ ਨੂੰ ਫ਼ਿਲਹਾਲ ਸੀਮਤ ਕੀਤਾ ਗਿਆ ਹੈ</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> ਸਮੀਖਿਆਵਾਂ)</translation>
 <translation id="3748026146096797577">ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ</translation>
 <translation id="3749289110408117711">ਫਾਈਲ ਨਾਮ</translation>
@@ -229,6 +231,7 @@
 <translation id="6146993107019042706">ਪੂਰਾ ਕਰਨ ਲਈ, ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">ਹੋਰ ਜਾਣੋ</translation>
+<translation id="6189418609903030344">ਵਰਤੋਂ ਨਾਲ ਬੈਟਰੀ ਦੀ ਸਮਰੱਥਾ ਵਿੱਚ ਕਮੀ ਆਉਂਦੀ ਹੈ</translation>
 <translation id="6191293864534840972">ਨੁਕਸਦਾਰ ਨਾਮ ਸਰਵਰ</translation>
 <translation id="6232017090690406397">ਬੈਟਰੀ</translation>
 <translation id="6325525973963619867">ਅਸਫਲ ਰਿਹਾ</translation>
@@ -326,6 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">ਪੂਰਵ-ਨਿਰਧਾਰਤ</translation>
 <translation id="8798441408945964110">ਪ੍ਰਦਾਨਕ ਦਾ ਨਾਮ</translation>
+<translation id="880791622116642296">ਇਹ ਤੁਹਾਡੀ ਬੈਟਰੀ ਵੱਲੋਂ ਚਾਰਜ ਹੋਣ ਦੇ ਚੱਕਰ ਨੂੰ ਪੂਰਾ ਕੀਤੇ ਜਾਣ ਦੀ ਗਿਣਤੀ ਹੈ</translation>
 <translation id="8814190375133053267">ਵਾਈ-ਫਾਈ</translation>
 <translation id="8845001906332463065">ਮਦਦ ਪ੍ਰਾਪਤ ਕਰੋ</translation>
 <translation id="8881098542468797602">ਟੈਸਟ ਸਫਲ ਰਿਹਾ</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index 452376f..8b6f234 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">கேட்வே</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">ஸ்கேன் செய்யும் பகுதிக்கு ஏற்பப் பொருத்து</translation>
+<translation id="1387854245479784695">அனைத்துக் கோர்களுக்குமானது</translation>
 <translation id="1397738625398125236">கேட்வேயிற்குப் பிங் செய்வது</translation>
 <translation id="1398634363027580500">HTTPS கோரிக்கைகள் மிகவும் அதிக நேரம் எடுக்கின்றன</translation>
 <translation id="1413240736185167732">ஃபில்டர் வேலை செய்யாததால் அச்சிட முடியவில்லை</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">அறியப்படாத பிழை காரணமாக அச்சிட முடியவில்லை</translation>
 <translation id="357889014807611375">கட்டண வைஃபை</translation>
 <translation id="360565022852130722">WEP 802.1x என்னும் வலுவற்ற நெறிமுறை மூலம் WiFi நெட்வொர்க் பாதுகாக்கப்படுகிறது</translation>
+<translation id="3712633734921637892">பேட்டரியைச் சேமிக்க/வெப்பநிலையைக் குறைக்க CPU வேகம் தற்சமயம் கட்டுப்படுத்தப்பட்டுள்ளது</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> மதிப்புரைகள்)</translation>
 <translation id="3748026146096797577">இணைக்கப்படவில்லை</translation>
 <translation id="3749289110408117711">கோப்பு பெயர்</translation>
@@ -230,6 +232,7 @@
 <translation id="6146993107019042706">நிறைவுசெய்ய புதிய கடவுச்சொல்லை உள்ளிடவும்</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">மேலும் அறிக</translation>
+<translation id="6189418609903030344">உபயோகத்தால் பேட்டரியின் திறன் குறைகிறது</translation>
 <translation id="6191293864534840972">பெயர் சேவையகங்கள் தவறானவை</translation>
 <translation id="6232017090690406397">பேட்டரி</translation>
 <translation id="6325525973963619867">தோல்வி</translation>
@@ -327,6 +330,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">இயல்புநிலை</translation>
 <translation id="8798441408945964110">வழங்குநர் பெயர்</translation>
+<translation id="880791622116642296">உங்கள் பேட்டரி முழுமையாகச் சார்ஜ் செய்யப்பட்ட எண்ணிக்கை</translation>
 <translation id="8814190375133053267">வைஃபை</translation>
 <translation id="8845001906332463065">உதவி பெறுக</translation>
 <translation id="8881098542468797602">சோதனை நிறைவடைந்தது</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 9465e88..2df586d 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">గేట్‌వే</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">స్కాన్ ఏరియాకు సెట్ చేయండి</translation>
+<translation id="1387854245479784695">ఇది అన్ని కోర్‌ల సముదాయం</translation>
 <translation id="1397738625398125236">గేట్‌వేను పింగ్ చేయవచ్చు</translation>
 <translation id="1398634363027580500">అత్యధిక HTTPS ప్రతిస్పందన సమయం</translation>
 <translation id="1413240736185167732">విఫలమైంది - ఫిల్టర్ విఫలమైంది</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">విఫలమైంది - తెలియని ఎర్రర్</translation>
 <translation id="357889014807611375">డేటా నియంత్రణ Wi-Fi</translation>
 <translation id="360565022852130722">బలహీనమైన ప్రోటోకాల్ WEP 802.1xతో Wi-Fi నెట్‌వర్క్ సురక్షితం చేయబడింది</translation>
+<translation id="3712633734921637892">బ్యాటరీ సామర్థ్యాన్ని ఆదా చేయడానికి లేదా ఉష్ణోగ్రతను తగ్గించడానికి CPU వేగం ప్రస్తుతం పరిమితం చేయబడింది</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> రివ్యూలు)</translation>
 <translation id="3748026146096797577">కనెక్ట్ కాలేదు</translation>
 <translation id="3749289110408117711">ఫైల్ పేరు</translation>
@@ -229,6 +231,7 @@
 <translation id="6146993107019042706">దీనిని ముగించడానికి, మీ కొత్త పాస్‌వర్డ్‌ను నమోదు చేయండి</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
+<translation id="6189418609903030344">వినియోగంతో బ్యాటరీ సామర్థ్యం క్షీణిస్తుంది</translation>
 <translation id="6191293864534840972">పేరు తప్పుగా ఉన్న సర్వర్లు</translation>
 <translation id="6232017090690406397">బ్యాటరీ</translation>
 <translation id="6325525973963619867">విఫలమైంది</translation>
@@ -326,6 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">డిఫాల్ట్</translation>
 <translation id="8798441408945964110">ప్రదాత పేరు</translation>
+<translation id="880791622116642296">ఇది మీ బ్యాటరీ పూర్తిగా ఛార్జ్ అయిన పర్యాయాల సంఖ్య.</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8845001906332463065">సహాయం పొందండి</translation>
 <translation id="8881098542468797602">పరీక్ష విజయవంతమైంది</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index d4b3f30..d894ec7 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -21,6 +21,7 @@
 <translation id="1327977588028644528">گیٹ وے</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">اسکین کرنے کی جگہ تک فٹ کریں</translation>
+<translation id="1387854245479784695">یہ سبھی کورز کا مجموعہ ہے</translation>
 <translation id="1397738625398125236">گیٹ وے کو پنگ کیا جا سکتا ہے</translation>
 <translation id="1398634363027580500">‏بہت زیادہ HTTPS تاخیر</translation>
 <translation id="1413240736185167732">ناکام ہو گیا - فلٹر ناکام ہو گیا</translation>
@@ -104,6 +105,7 @@
 <translation id="3527036260304016759">ناکام ہو گیا - نامعلوم خرابی</translation>
 <translation id="357889014807611375">‏میٹرڈ Wi-Fi</translation>
 <translation id="360565022852130722">‏WiFi نیٹ ورک کمزور پروٹوکول WEP 802.1x کے ساتھ محفوظ ہے</translation>
+<translation id="3712633734921637892">‏بیٹری بچانے یا درجۂ حرارت کم کرنے کیلئے، فی الوقت CPU کی رفتار محدود ہے</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> جائزے)</translation>
 <translation id="3748026146096797577">منسلک نہیں ہے</translation>
 <translation id="3749289110408117711">فائل کا نام</translation>
@@ -229,6 +231,7 @@
 <translation id="6146993107019042706">مکمل کرنے کے لئے اپنا نیا پاس ورڈ درج کریں</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">مزید جانیں</translation>
+<translation id="6189418609903030344">استعمال کے ساتھ بیٹری کی صلاحیت کم ہوتی ہے</translation>
 <translation id="6191293864534840972">نام سرورز غلط ہے</translation>
 <translation id="6232017090690406397">بیٹری</translation>
 <translation id="6325525973963619867">ناکام</translation>
@@ -326,6 +329,7 @@
 <translation id="877985182522063539">A4</translation>
 <translation id="8798099450830957504">ڈیفالٹ</translation>
 <translation id="8798441408945964110">فراہم کنندہ کا نام</translation>
+<translation id="880791622116642296">آپ کی بیٹری کے مکمل طور پر چارج ہونے کی تعداد</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8845001906332463065">مدد حاصل کریں</translation>
 <translation id="8881098542468797602">ٹیسٹ کامیاب ہو گیا</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 4e8c0ff..f68b5a2 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -21,7 +21,7 @@
 <translation id="1327977588028644528">閘道</translation>
 <translation id="1330426557709298164">JPG</translation>
 <translation id="1337912285145772892">依掃瞄區大小自動調整</translation>
-<translation id="1387854245479784695">這是所有核心的匯總值</translation>
+<translation id="1387854245479784695">這是所有核心的彙整資料</translation>
 <translation id="1397738625398125236">可連線偵測的閘道</translation>
 <translation id="1398634363027580500">HTTPS 延遲時間非常長</translation>
 <translation id="1413240736185167732">失敗 - 篩選器發生錯誤</translation>
@@ -105,7 +105,7 @@
 <translation id="3527036260304016759">失敗 - 不明錯誤</translation>
 <translation id="357889014807611375">按用量收費的 Wi-Fi</translation>
 <translation id="360565022852130722">已使用防護力較弱的通訊協定 WEP 802.1x 保護 Wi-Fi 網絡</translation>
-<translation id="3712633734921637892">目前 CPU 速度已受到限制,目的是節省電池電量或降低溫度</translation>
+<translation id="3712633734921637892">目前 CPU 速度已受限制,目的是節省用電量或降低溫度</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> 個評論)</translation>
 <translation id="3748026146096797577">尚未連線</translation>
 <translation id="3749289110408117711">檔案名稱</translation>
@@ -232,7 +232,7 @@
 <translation id="6146993107019042706">如要完成變更,請輸入您的新密碼</translation>
 <translation id="6147514244879357420">PNG</translation>
 <translation id="6165508094623778733">瞭解更多資料</translation>
-<translation id="6189418609903030344">電池電量會隨使用時間而減少</translation>
+<translation id="6189418609903030344">電池容量會隨使用時間增加而下降</translation>
 <translation id="6191293864534840972">域名伺服器格式錯誤</translation>
 <translation id="6232017090690406397">電池</translation>
 <translation id="6325525973963619867">失敗</translation>
diff --git a/components/BUILD.gn b/components/BUILD.gn
index fa2ce52c..03f6d95db 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -448,10 +448,7 @@
   }
 
   if (enable_basic_printing) {
-    deps += [
-      "//components/printing/common:unit_tests",
-      "//components/services/print_compositor:unit_tests",
-    ]
+    deps += [ "//components/services/print_compositor:unit_tests" ]
   }
   if (enable_print_preview) {
     deps += [ "//components/pwg_encoder:unit_tests" ]
diff --git a/components/arc/enterprise/arc_data_snapshotd_manager.cc b/components/arc/enterprise/arc_data_snapshotd_manager.cc
index 61ffc79..5576e1c 100644
--- a/components/arc/enterprise/arc_data_snapshotd_manager.cc
+++ b/components/arc/enterprise/arc_data_snapshotd_manager.cc
@@ -438,6 +438,9 @@
   }
 }
 
+bool ArcDataSnapshotdManager::IsSnapshotInProgress() {
+  return state_ == State::kMgsLaunched;
+}
 void ArcDataSnapshotdManager::OnSnapshotSessionStarted() {
   if (state_ != State::kMgsToLaunch)
     return;
diff --git a/components/arc/enterprise/arc_data_snapshotd_manager.h b/components/arc/enterprise/arc_data_snapshotd_manager.h
index 51487d0..a79fa28 100644
--- a/components/arc/enterprise/arc_data_snapshotd_manager.h
+++ b/components/arc/enterprise/arc_data_snapshotd_manager.h
@@ -239,6 +239,9 @@
   // waiting for the response from arc-data-snapshotd daemon.
   bool IsAutoLoginAllowed();
 
+  // Returns true if ARC data snapshot update is in progress.
+  bool IsSnapshotInProgress();
+
   // SnapshotSessionController::Observer overrides:
   void OnSnapshotSessionStarted() override;
   void OnSnapshotSessionStopped() override;
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index d9bb529..9cfeff2 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -587,6 +587,8 @@
     int32 experiment_id = 7;
     // The condition matches if the keyboard is hidden.
     Empty keyboard_hidden = 9;
+    // The condition describes a parameter value that must be set to trigger.
+    ScriptParameterMatchProto script_parameter_match = 10;
   }
 
   reserved 4;
diff --git a/components/autofill_assistant/browser/trigger_scripts/dynamic_trigger_conditions.cc b/components/autofill_assistant/browser/trigger_scripts/dynamic_trigger_conditions.cc
index 20ed26d..20f7dab86 100644
--- a/components/autofill_assistant/browser/trigger_scripts/dynamic_trigger_conditions.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/dynamic_trigger_conditions.cc
@@ -35,6 +35,7 @@
     case TriggerScriptConditionProto::kIsFirstTimeUser:
     case TriggerScriptConditionProto::kExperimentId:
     case TriggerScriptConditionProto::kKeyboardHidden:
+    case TriggerScriptConditionProto::kScriptParameterMatch:
     case TriggerScriptConditionProto::TYPE_NOT_SET:
       return;
     case TriggerScriptConditionProto::kSelector:
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc
index 4551e4a..72f576dd 100644
--- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc
@@ -54,6 +54,20 @@
   return has_results_;
 }
 
+bool StaticTriggerConditions::script_parameter_matches(
+    const ScriptParameterMatchProto& param) const {
+  auto opt_value = trigger_context_->GetParameter(param.name());
+  if (!param.exists()) {
+    return !opt_value;
+  }
+
+  if (!param.has_value_equals()) {
+    return opt_value.has_value();
+  }
+
+  return opt_value && param.value_equals() == opt_value.value();
+}
+
 void StaticTriggerConditions::OnGetLogins(
     std::vector<WebsiteLoginManager::Login> logins) {
   has_stored_login_credentials_ = !logins.empty();
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h
index 0721699..e8c877b5 100644
--- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h
+++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h
@@ -36,6 +36,8 @@
   virtual bool is_first_time_user() const;
   virtual bool has_stored_login_credentials() const;
   virtual bool is_in_experiment(int experiment_id) const;
+  virtual bool script_parameter_matches(
+      const ScriptParameterMatchProto& param) const;
 
   // If true, all values have been evaluated. They may be out-of-date by one
   // cycle in case an update is currently scheduled.
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc
index d016a22c..2f62167 100644
--- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc
@@ -74,5 +74,58 @@
   EXPECT_TRUE(static_trigger_conditions_.has_results());
 }
 
+TEST_F(StaticTriggerConditionsTest, ScriptParameterMatches) {
+  TriggerContextImpl trigger_context({{"must_exist_and_exists", "exists"},
+                                      {"must_not_exist_and_exists", "exists"},
+                                      {"must_match", "matching_value"},
+                                      {"must_match_empty", ""}},
+                                     /* exp = */ "");
+  static_trigger_conditions_.Init(
+      &mock_website_login_manager_, mock_is_first_time_user_callback_.Get(),
+      GURL(kFakeUrl), &trigger_context, mock_callback_.Get());
+
+  ScriptParameterMatchProto must_exist;
+  must_exist.set_name("must_exist_and_exists");
+  must_exist.set_exists(true);
+  EXPECT_TRUE(static_trigger_conditions_.script_parameter_matches(must_exist));
+
+  must_exist.set_name("must_exist_and_doesnt_exist");
+  EXPECT_FALSE(static_trigger_conditions_.script_parameter_matches(must_exist));
+
+  ScriptParameterMatchProto must_not_exist;
+  must_not_exist.set_name("must_not_exist_and_doesnt_exist");
+  must_not_exist.set_exists(false);
+  EXPECT_TRUE(
+      static_trigger_conditions_.script_parameter_matches(must_not_exist));
+
+  must_not_exist.set_name("must_not_exist_and_exists");
+  EXPECT_FALSE(
+      static_trigger_conditions_.script_parameter_matches(must_not_exist));
+
+  ScriptParameterMatchProto must_match;
+  must_match.set_name("must_match");
+  must_match.set_value_equals("matching_value");
+  EXPECT_TRUE(static_trigger_conditions_.script_parameter_matches(must_match));
+
+  must_match.set_value_equals("not_matching_value");
+  EXPECT_FALSE(static_trigger_conditions_.script_parameter_matches(must_match));
+
+  must_match.set_value_equals("");
+  EXPECT_FALSE(static_trigger_conditions_.script_parameter_matches(must_match));
+
+  must_match.set_name("must_match_doesnt_exist");
+  EXPECT_FALSE(static_trigger_conditions_.script_parameter_matches(must_match));
+
+  ScriptParameterMatchProto must_match_empty;
+  must_match_empty.set_name("must_match_empty");
+  must_match_empty.set_value_equals("");
+  EXPECT_TRUE(
+      static_trigger_conditions_.script_parameter_matches(must_match_empty));
+
+  must_match_empty.set_value_equals("not_empty");
+  EXPECT_FALSE(
+      static_trigger_conditions_.script_parameter_matches(must_match_empty));
+}
+
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script.cc
index dec651c..bf512ea 100644
--- a/components/autofill_assistant/browser/trigger_scripts/trigger_script.cc
+++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script.cc
@@ -54,6 +54,9 @@
       return static_trigger_conditions.is_in_experiment(proto.experiment_id());
     case TriggerScriptConditionProto::kKeyboardHidden:
       return !dynamic_trigger_conditions.GetKeyboardVisible();
+    case TriggerScriptConditionProto::kScriptParameterMatch:
+      return static_trigger_conditions.script_parameter_matches(
+          proto.script_parameter_match());
     case TriggerScriptConditionProto::TYPE_NOT_SET:
       return true;
   }
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index dab0f4408..7c88e73 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -415,13 +415,13 @@
     const std::string& name,
     invalidation::InvalidationService* invalidator,
     syncer::SyncInvalidationsService* sync_invalidation_service,
-    const base::WeakPtr<syncer::SyncPrefs>& sync_prefs) {
+    const base::WeakPtr<syncer::SyncTransportDataPrefs>& prefs) {
   return std::make_unique<syncer::SyncEngineImpl>(
       name, invalidator, sync_invalidation_service,
       std::make_unique<browser_sync::ActiveDevicesProviderImpl>(
           sync_client_->GetDeviceInfoSyncService()->GetDeviceInfoTracker(),
           base::DefaultClock::GetInstance()),
-      sync_prefs, sync_client_->GetModelTypeStoreService()->GetSyncDataPath(),
+      prefs, sync_client_->GetModelTypeStoreService()->GetSyncDataPath(),
       engines_and_directory_deletion_thread_);
 }
 
diff --git a/components/browser_sync/profile_sync_components_factory_impl.h b/components/browser_sync/profile_sync_components_factory_impl.h
index 66a4c16..75fd8282 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.h
+++ b/components/browser_sync/profile_sync_components_factory_impl.h
@@ -81,7 +81,7 @@
       const std::string& name,
       invalidation::InvalidationService* invalidator,
       syncer::SyncInvalidationsService* sync_invalidation_service,
-      const base::WeakPtr<syncer::SyncPrefs>& sync_prefs) override;
+      const base::WeakPtr<syncer::SyncTransportDataPrefs>& prefs) override;
   void DeleteLegacyDirectoryFilesAndNigoriStorage() override;
 
  private:
diff --git a/components/content_settings/core/browser/private_network_settings.cc b/components/content_settings/core/browser/private_network_settings.cc
index d29d6c42..f3f3a6d 100644
--- a/components/content_settings/core/browser/private_network_settings.cc
+++ b/components/content_settings/core/browser/private_network_settings.cc
@@ -7,11 +7,13 @@
 #include "base/logging.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content_settings {
 
 // There are two inputs that go into the INSECURE_PRIVATE_NETWORK content
-// setting for a URL:
+// setting for an origin:
 //
 //  - the blanket InsecurePrivateNetworkRequestsAllowed enterprise policy:
 //    - if this policy is set to true, then the content setting is always ALLOW
@@ -22,7 +24,15 @@
 //
 bool ShouldAllowInsecurePrivateNetworkRequests(
     const HostContentSettingsMap* map,
-    const GURL& url) {
+    const url::Origin& origin) {
+  // Derive the base URL from the origin, since HostContentSettingsMap is keyed
+  // by URL and not by origin. However, this setting is conceptually keyed by
+  // origin, hence its public API uses url::Origin.
+  //
+  // This returns the default-constructed GURL for opaque origins, which should
+  // not match any content settings.
+  const GURL url = origin.GetURL();
+
   const ContentSetting setting = map->GetContentSetting(
       url, url, ContentSettingsType::INSECURE_PRIVATE_NETWORK);
 
diff --git a/components/content_settings/core/browser/private_network_settings.h b/components/content_settings/core/browser/private_network_settings.h
index 9b58726..6c9eb10 100644
--- a/components/content_settings/core/browser/private_network_settings.h
+++ b/components/content_settings/core/browser/private_network_settings.h
@@ -5,19 +5,22 @@
 #ifndef COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_PRIVATE_NETWORK_SETTINGS_H_
 #define COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_PRIVATE_NETWORK_SETTINGS_H_
 
-class GURL;
 class HostContentSettingsMap;
 
+namespace url {
+class Origin;
+}  // namespace url
+
 namespace content_settings {
 
-// Returns whether |url| should be allowed to make insecure private network
+// Returns whether |origin| should be allowed to make insecure private network
 // requests, given the settings contained in |map|.
 //
 // |map| must not be nullptr. Caller retains ownership.
-// |url| should identify the frame initiating a request.
+// |origin| should identify the frame initiating a request.
 bool ShouldAllowInsecurePrivateNetworkRequests(
     const HostContentSettingsMap* map,
-    const GURL& url);
+    const url::Origin& origin);
 
 }  // namespace content_settings
 
diff --git a/components/feed/core/proto/v2/wire/capability.proto b/components/feed/core/proto/v2/wire/capability.proto
index ecd737fb..1e62cc9 100644
--- a/components/feed/core/proto/v2/wire/capability.proto
+++ b/components/feed/core/proto/v2/wire/capability.proto
@@ -30,5 +30,6 @@
   OPEN_IN_TAB = 27;
   DOWNLOAD_LINK = 28;
   LOTTIE_ANIMATIONS = 37;
+  LONG_PRESS_CARD_MENU = 38;
   PREFETCH_METADATA = 43;
 }
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc
index 23ea5dc..5a5a3c9 100644
--- a/components/feed/core/v2/proto_util.cc
+++ b/components/feed/core/v2/proto_util.cc
@@ -121,6 +121,8 @@
   feed_request.add_client_capability(feedwire::Capability::BASE_UI);
   feed_request.add_client_capability(feedwire::Capability::CARD_MENU);
   feed_request.add_client_capability(feedwire::Capability::LOTTIE_ANIMATIONS);
+  feed_request.add_client_capability(
+      feedwire::Capability::LONG_PRESS_CARD_MENU);
   // Add Share capability if sharing is turned on.
   if (base::FeatureList::IsEnabled(kFeedShare)) {
     feed_request.add_client_capability(feedwire::Capability::SHARE);
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc
index 42404ea..0050caf 100644
--- a/components/feed/core/v2/proto_util_unittest.cc
+++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -59,6 +59,7 @@
       testing::UnorderedElementsAre(
           feedwire::Capability::BASE_UI, feedwire::Capability::REQUEST_SCHEDULE,
           feedwire::Capability::LOTTIE_ANIMATIONS,
+          feedwire::Capability::LONG_PRESS_CARD_MENU,
           feedwire::Capability::OPEN_IN_TAB, feedwire::Capability::CARD_MENU,
           feedwire::Capability::DOWNLOAD_LINK,
           feedwire::Capability::INFINITE_FEED,
@@ -114,6 +115,7 @@
       testing::UnorderedElementsAre(
           feedwire::Capability::BASE_UI, feedwire::Capability::REQUEST_SCHEDULE,
           feedwire::Capability::LOTTIE_ANIMATIONS,
+          feedwire::Capability::LONG_PRESS_CARD_MENU,
           feedwire::Capability::OPEN_IN_TAB, feedwire::Capability::CARD_MENU,
           feedwire::Capability::DOWNLOAD_LINK,
           feedwire::Capability::DISMISS_COMMAND,
diff --git a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
index ac2fa582..ffafa132 100644
--- a/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_subscription_manager_unittest.cc
@@ -145,7 +145,6 @@
     identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
     identity_provider_ = std::make_unique<ProfileIdentityProvider>(
         identity_test_env_.identity_manager());
-    identity_provider_->SetActiveAccountId(account.account_id);
   }
 
   std::unique_ptr<PerUserTopicSubscriptionManager> BuildRegistrationManager(
diff --git a/components/invalidation/impl/profile_identity_provider.cc b/components/invalidation/impl/profile_identity_provider.cc
index ddf8e6c6..1778857cd 100644
--- a/components/invalidation/impl/profile_identity_provider.cc
+++ b/components/invalidation/impl/profile_identity_provider.cc
@@ -62,6 +62,9 @@
     signin::IdentityManager* identity_manager)
     : identity_manager_(identity_manager) {
   identity_manager_->AddObserver(this);
+
+  active_account_id_ = identity_manager_->GetPrimaryAccountId(
+      signin::ConsentLevel::kNotRequired);
 }
 
 ProfileIdentityProvider::~ProfileIdentityProvider() {
@@ -81,22 +84,6 @@
   return true;
 }
 
-void ProfileIdentityProvider::SetActiveAccountId(
-    const CoreAccountId& account_id) {
-  if (account_id == active_account_id_) {
-    return;
-  }
-
-  if (!active_account_id_.empty()) {
-    FireOnActiveAccountLogout();
-  }
-
-  active_account_id_ = account_id;
-  if (!active_account_id_.empty()) {
-    FireOnActiveAccountLogin();
-  }
-}
-
 std::unique_ptr<ActiveAccountAccessTokenFetcher>
 ProfileIdentityProvider::FetchAccessToken(
     const std::string& oauth_consumer_name,
@@ -114,6 +101,25 @@
                                                 access_token);
 }
 
+void ProfileIdentityProvider::OnPrimaryAccountChanged(
+    const signin::PrimaryAccountChangeEvent& event_details) {
+  CoreAccountId account_id =
+      event_details.GetCurrentState().primary_account.account_id;
+
+  if (account_id == active_account_id_) {
+    return;
+  }
+
+  if (!active_account_id_.empty()) {
+    FireOnActiveAccountLogout();
+  }
+
+  active_account_id_ = account_id;
+  if (!active_account_id_.empty()) {
+    FireOnActiveAccountLogin();
+  }
+}
+
 void ProfileIdentityProvider::OnRefreshTokenUpdatedForAccount(
     const CoreAccountInfo& account_info) {
   ProcessRefreshTokenUpdateForAccount(account_info.account_id);
diff --git a/components/invalidation/impl/profile_identity_provider.h b/components/invalidation/impl/profile_identity_provider.h
index 99f138b..24eda6e 100644
--- a/components/invalidation/impl/profile_identity_provider.h
+++ b/components/invalidation/impl/profile_identity_provider.h
@@ -30,9 +30,10 @@
       ActiveAccountAccessTokenCallback callback) override;
   void InvalidateAccessToken(const signin::ScopeSet& scopes,
                              const std::string& access_token) override;
-  void SetActiveAccountId(const CoreAccountId& account_id) override;
 
   // signin::IdentityManager::Observer:
+  void OnPrimaryAccountChanged(
+      const signin::PrimaryAccountChangeEvent& event_details) override;
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(
diff --git a/components/invalidation/public/identity_provider.h b/components/invalidation/public/identity_provider.h
index 816491b..b52eff4 100644
--- a/components/invalidation/public/identity_provider.h
+++ b/components/invalidation/public/identity_provider.h
@@ -87,9 +87,6 @@
       const OAuth2AccessTokenManager::ScopeSet& scopes,
       const std::string& access_token) = 0;
 
-  // Set the account id that should be registered for invalidations.
-  virtual void SetActiveAccountId(const CoreAccountId& account_id) = 0;
-
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
diff --git a/components/metrics/stability_metrics_helper.cc b/components/metrics/stability_metrics_helper.cc
index 0c39ac9..6fdea53 100644
--- a/components/metrics/stability_metrics_helper.cc
+++ b/components/metrics/stability_metrics_helper.cc
@@ -185,6 +185,7 @@
 
 void StabilityMetricsHelper::IncreaseGpuCrashCount() {
   IncrementPrefValue(prefs::kStabilityGpuCrashCount);
+  RecordStabilityEvent(StabilityEventType::kGpuCrash);
 }
 
 void StabilityMetricsHelper::BrowserUtilityProcessLaunched(
@@ -204,6 +205,7 @@
 
 void StabilityMetricsHelper::BrowserChildProcessCrashed() {
   IncrementPrefValue(prefs::kStabilityChildProcessCrashCount);
+  RecordStabilityEvent(StabilityEventType::kChildProcessCrash);
 }
 
 void StabilityMetricsHelper::LogLoadStarted() {
@@ -266,15 +268,14 @@
           RENDERER_TYPE_COUNT);
       break;
     case base::TERMINATION_STATUS_LAUNCH_FAILED:
+      // TODO(rkaplow): See if we can remove this histogram as we have
+      // Stability.Counts2 which has the same metrics.
       base::UmaHistogramEnumeration(
           "BrowserRenderProcessHost.ChildLaunchFailures", histogram_type,
           RENDERER_TYPE_COUNT);
       base::UmaHistogramSparse(
           "BrowserRenderProcessHost.ChildLaunchFailureCodes", exit_code);
-      if (was_extension_process)
-        IncrementPrefValue(prefs::kStabilityExtensionRendererFailedLaunchCount);
-      else
-        IncrementPrefValue(prefs::kStabilityRendererFailedLaunchCount);
+      LogRendererLaunchFailed(was_extension_process);
       break;
 #if defined(OS_WIN)
     case base::TERMINATION_STATUS_INTEGRITY_FAILURE:
@@ -290,10 +291,26 @@
 }
 
 void StabilityMetricsHelper::LogRendererLaunched(bool was_extension_process) {
-  if (was_extension_process)
-    IncrementPrefValue(prefs::kStabilityExtensionRendererLaunchCount);
-  else
-    IncrementPrefValue(prefs::kStabilityRendererLaunchCount);
+  auto metric = was_extension_process
+                    ? StabilityEventType::kExtensionRendererLaunch
+                    : StabilityEventType::kRendererLaunch;
+  auto* pref = was_extension_process
+                   ? prefs::kStabilityExtensionRendererLaunchCount
+                   : prefs::kStabilityRendererLaunchCount;
+  RecordStabilityEvent(metric);
+  IncrementPrefValue(pref);
+}
+
+void StabilityMetricsHelper::LogRendererLaunchFailed(
+    bool was_extension_process) {
+  auto metric = was_extension_process
+                    ? StabilityEventType::kExtensionRendererFailedLaunch
+                    : StabilityEventType::kRendererFailedLaunch;
+  auto* pref = was_extension_process
+                   ? prefs::kStabilityExtensionRendererFailedLaunchCount
+                   : prefs::kStabilityRendererFailedLaunchCount;
+  RecordStabilityEvent(metric);
+  IncrementPrefValue(pref);
 }
 
 void StabilityMetricsHelper::IncrementPrefValue(const char* path) {
@@ -320,12 +337,13 @@
       "ChildProcess.HungRendererAvailableMemoryMB",
       base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024);
   IncrementPrefValue(prefs::kStabilityRendererHangCount);
+  RecordStabilityEvent(StabilityEventType::kRendererHang);
 }
 
 // static
 void StabilityMetricsHelper::RecordStabilityEvent(
     StabilityEventType stability_event_type) {
-  UMA_STABILITY_HISTOGRAM_ENUMERATION("Stability.Experimental.Counts",
+  UMA_STABILITY_HISTOGRAM_ENUMERATION("Stability.Counts2",
                                       stability_event_type);
 }
 
diff --git a/components/metrics/stability_metrics_helper.h b/components/metrics/stability_metrics_helper.h
index ec568530..3c2d30d2 100644
--- a/components/metrics/stability_metrics_helper.h
+++ b/components/metrics/stability_metrics_helper.h
@@ -16,15 +16,23 @@
 namespace metrics {
 
 // The values here correspond to values in the Stability message in
-// system_profile.proto. It is intentional that we're only tracking a subset,
-// but more values can get added to this.
+// system_profile.proto.
 // This must stay 1-1 with the StabilityEventType enum in enums.xml.
 enum class StabilityEventType {
   kPageLoad = 2,
   kRendererCrash = 3,
+  kRendererHang = 4,
   kExtensionCrash = 5,
+  kChildProcessCrash = 6,
+  kLaunch = 15,
   kBrowserCrash = 16,
-  kMaxValue = kBrowserCrash
+  kIncompleteShutdown = 17,
+  kRendererFailedLaunch = 24,
+  kExtensionRendererFailedLaunch = 25,
+  kRendererLaunch = 26,
+  kExtensionRendererLaunch = 27,
+  kGpuCrash = 31,
+  kMaxValue = kGpuCrash
 };
 
 class SystemProfileProto;
@@ -88,6 +96,9 @@
   // Increments a 64-bit Integer pref value specified by |path|.
   void IncrementLongPrefsValue(const char* path);
 
+  // Records that a renderer launch failed.
+  void LogRendererLaunchFailed(bool was_extension_process);
+
   PrefService* local_state_;
 
   DISALLOW_COPY_AND_ASSIGN(StabilityMetricsHelper);
diff --git a/components/metrics/stability_metrics_helper_unittest.cc b/components/metrics/stability_metrics_helper_unittest.cc
index 6af3d67e..149a304 100644
--- a/components/metrics/stability_metrics_helper_unittest.cc
+++ b/components/metrics/stability_metrics_helper_unittest.cc
@@ -47,6 +47,7 @@
 
 TEST_F(StabilityMetricsHelperTest, BrowserChildProcessCrashed) {
   StabilityMetricsHelper helper(prefs());
+  base::HistogramTester histogram_tester;
 
   helper.BrowserChildProcessCrashed();
   helper.BrowserChildProcessCrashed();
@@ -62,6 +63,8 @@
       system_profile.stability();
 
   EXPECT_EQ(2, stability.child_process_crash_count());
+  histogram_tester.ExpectUniqueSample(
+      "Stability.Counts2", StabilityEventType::kChildProcessCrash, 2);
 }
 
 TEST_F(StabilityMetricsHelperTest, LogRendererCrash) {
@@ -97,6 +100,12 @@
   histogram_tester.ExpectUniqueSample("CrashExitCodes.Renderer", 1, 3);
   histogram_tester.ExpectBucketCount("BrowserRenderProcessHost.ChildCrashes",
                                      RENDERER_TYPE_RENDERER, 3);
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kRendererCrash, 3);
+  histogram_tester.ExpectBucketCount(
+      "Stability.Counts2", StabilityEventType::kRendererFailedLaunch, 1);
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kExtensionCrash, 0);
 
   // One launch failure each.
   histogram_tester.ExpectBucketCount(
@@ -131,9 +140,17 @@
   helper.ProvideStabilityMetrics(&system_profile);
 
   EXPECT_EQ(0, system_profile.stability().renderer_crash_count());
-  EXPECT_EQ(2, system_profile.stability().extension_renderer_crash_count());
   EXPECT_EQ(
       1, system_profile.stability().extension_renderer_failed_launch_count());
+  EXPECT_EQ(2, system_profile.stability().extension_renderer_crash_count());
+
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kRendererCrash, 0);
+  histogram_tester.ExpectBucketCount(
+      "Stability.Counts2", StabilityEventType::kExtensionRendererFailedLaunch,
+      1);
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kExtensionCrash, 2);
 
   histogram_tester.ExpectBucketCount(
       "BrowserRenderProcessHost.ChildLaunchFailureCodes", 1, 1);
diff --git a/components/metrics/stability_metrics_provider.cc b/components/metrics/stability_metrics_provider.cc
index c9ade4e..4efabb7 100644
--- a/components/metrics/stability_metrics_provider.cc
+++ b/components/metrics/stability_metrics_provider.cc
@@ -191,6 +191,8 @@
 void StabilityMetricsProvider::CheckLastSessionEndCompleted() {
   if (!local_state_->GetBoolean(prefs::kStabilitySessionEndCompleted)) {
     IncrementPrefValue(prefs::kStabilityIncompleteSessionEndCount);
+    StabilityMetricsHelper::RecordStabilityEvent(
+        StabilityEventType::kIncompleteShutdown);
     // This is marked false when we get a WM_ENDSESSION.
     MarkSessionEndCompleted(true);
   }
@@ -222,6 +224,7 @@
 
 void StabilityMetricsProvider::LogLaunch() {
   IncrementPrefValue(prefs::kStabilityLaunchCount);
+  StabilityMetricsHelper::RecordStabilityEvent(StabilityEventType::kLaunch);
 }
 
 #if defined(OS_WIN)
diff --git a/components/metrics/stability_metrics_provider_unittest.cc b/components/metrics/stability_metrics_provider_unittest.cc
index e0ba0ce..3114086 100644
--- a/components/metrics/stability_metrics_provider_unittest.cc
+++ b/components/metrics/stability_metrics_provider_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
+#include "components/metrics/stability_metrics_helper.h"
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/system_profile.pb.h"
@@ -28,6 +29,7 @@
 };
 
 TEST_F(StabilityMetricsProviderTest, ProvideStabilityMetrics) {
+  base::HistogramTester histogram_tester;
   StabilityMetricsProvider stability_provider(&prefs_);
   MetricsProvider* provider = &stability_provider;
   SystemProfileProto system_profile;
@@ -42,9 +44,17 @@
   EXPECT_FALSE(stability.has_breakpad_registration_failure_count());
   EXPECT_FALSE(stability.has_debugger_present_count());
   EXPECT_FALSE(stability.has_debugger_not_present_count());
+
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kLaunch, 0);
+  histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                     StabilityEventType::kBrowserCrash, 0);
+  histogram_tester.ExpectBucketCount(
+      "Stability.Counts2", StabilityEventType::kIncompleteShutdown, 0);
 }
 
 TEST_F(StabilityMetricsProviderTest, RecordStabilityMetrics) {
+  base::HistogramTester histogram_tester;
   {
     StabilityMetricsProvider recorder(&prefs_);
     recorder.LogLaunch();
@@ -72,6 +82,13 @@
     EXPECT_EQ(1, stability.breakpad_registration_failure_count());
     EXPECT_EQ(1, stability.debugger_present_count());
     EXPECT_EQ(1, stability.debugger_not_present_count());
+
+    histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                       StabilityEventType::kLaunch, 1);
+    histogram_tester.ExpectBucketCount("Stability.Counts2",
+                                       StabilityEventType::kBrowserCrash, 1);
+    histogram_tester.ExpectBucketCount(
+        "Stability.Counts2", StabilityEventType::kIncompleteShutdown, 1);
   }
 }
 
@@ -96,6 +113,7 @@
 }  // namespace
 
 TEST_F(StabilityMetricsProviderTest, RecordSystemCrashMetrics) {
+  base::HistogramTester histogram_tester;
   {
     base::Time unclean_time = base::Time::Now();
     TestingStabilityMetricsProvider recorder(&prefs_, unclean_time);
@@ -114,14 +132,14 @@
     MetricsProvider* provider = &stability_provider;
     SystemProfileProto system_profile;
 
-    base::HistogramTester histogram_tester;
-
     provider->ProvideStabilityMetrics(&system_profile);
 
     const SystemProfileProto_Stability& stability = system_profile.stability();
     // Two crashes, one system crash.
     EXPECT_EQ(2, stability.crash_count());
 
+    histogram_tester.ExpectUniqueSample("Stability.Counts2",
+                                        StabilityEventType::kBrowserCrash, 2);
     histogram_tester.ExpectTotalCount("Stability.Internals.SystemCrashCount",
                                       1);
   }
diff --git a/components/no_state_prefetch/browser/BUILD.gn b/components/no_state_prefetch/browser/BUILD.gn
index 6c0b921..f0686db 100644
--- a/components/no_state_prefetch/browser/BUILD.gn
+++ b/components/no_state_prefetch/browser/BUILD.gn
@@ -8,6 +8,8 @@
     "no_state_prefetch_contents.h",
     "no_state_prefetch_contents_delegate.cc",
     "no_state_prefetch_contents_delegate.h",
+    "no_state_prefetch_handle.cc",
+    "no_state_prefetch_handle.h",
     "no_state_prefetch_manager.cc",
     "no_state_prefetch_manager.h",
     "no_state_prefetch_manager_delegate.cc",
@@ -16,8 +18,6 @@
     "prerender_config.h",
     "prerender_field_trial.cc",
     "prerender_field_trial.h",
-    "prerender_handle.cc",
-    "prerender_handle.h",
     "prerender_histograms.cc",
     "prerender_histograms.h",
     "prerender_history.cc",
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_contents.cc b/components/no_state_prefetch/browser/no_state_prefetch_contents.cc
index 1ac71f1..1255d73 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_contents.cc
+++ b/components/no_state_prefetch/browser/no_state_prefetch_contents.cc
@@ -210,7 +210,7 @@
   no_state_prefetch_manager()->AddPrerenderProcessHost(
       GetRenderViewHost()->GetProcess());
 
-  NotifyPrerenderStart();
+  NotifyPrefetchStart();
 
   // Register to inform new RenderViews that we're prerendering.
   notification_registrar_.Add(
@@ -313,21 +313,21 @@
       session_storage_namespace_map);
 }
 
-void NoStatePrefetchContents::NotifyPrerenderStart() {
+void NoStatePrefetchContents::NotifyPrefetchStart() {
   DCHECK_EQ(FINAL_STATUS_UNKNOWN, final_status_);
   for (Observer& observer : observer_list_)
-    observer.OnPrerenderStart(this);
+    observer.OnPrefetchStart(this);
 }
 
-void NoStatePrefetchContents::NotifyPrerenderStopLoading() {
+void NoStatePrefetchContents::NotifyPrefetchStopLoading() {
   for (Observer& observer : observer_list_)
-    observer.OnPrerenderStopLoading(this);
+    observer.OnPrefetchStopLoading(this);
 }
 
-void NoStatePrefetchContents::NotifyPrerenderStop() {
+void NoStatePrefetchContents::NotifyPrefetchStop() {
   DCHECK_NE(FINAL_STATUS_UNKNOWN, final_status_);
   for (Observer& observer : observer_list_)
-    observer.OnPrerenderStop(this);
+    observer.OnPrefetchStop(this);
   observer_list_.Clear();
 }
 
@@ -388,7 +388,7 @@
 }
 
 void NoStatePrefetchContents::DidStopLoading() {
-  NotifyPrerenderStopLoading();
+  NotifyPrefetchStopLoading();
 }
 
 void NoStatePrefetchContents::DidStartNavigation(
@@ -470,7 +470,7 @@
   no_state_prefetch_manager_->MoveEntryToPendingDelete(this, final_status);
 
   if (prerendering_has_started())
-    NotifyPrerenderStop();
+    NotifyPrefetchStop();
 }
 
 void NoStatePrefetchContents::DestroyWhenUsingTooManyResources() {
@@ -557,7 +557,7 @@
 
 void NoStatePrefetchContents::MarkAsUsedForTesting() {
   SetFinalStatus(FINAL_STATUS_USED);
-  NotifyPrerenderStop();
+  NotifyPrefetchStop();
 }
 
 void NoStatePrefetchContents::CancelPrerenderForUnsupportedScheme() {
@@ -576,7 +576,7 @@
 void NoStatePrefetchContents::AddNetworkBytes(int64_t bytes) {
   network_bytes_ += bytes;
   for (Observer& observer : observer_list_)
-    observer.OnPrerenderNetworkBytesChanged(this);
+    observer.OnPrefetchNetworkBytesChanged(this);
 }
 
 }  // namespace prerender
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_contents.h b/components/no_state_prefetch/browser/no_state_prefetch_contents.h
index c94c62f..9ef5cc31 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_contents.h
+++ b/components/no_state_prefetch/browser/no_state_prefetch_contents.h
@@ -78,20 +78,20 @@
 
   class Observer {
    public:
-    // Signals that the prerender has started running.
-    virtual void OnPrerenderStart(NoStatePrefetchContents* contents) {}
+    // Signals that the prefetch has started running.
+    virtual void OnPrefetchStart(NoStatePrefetchContents* contents) {}
 
-    // Signals that the prerender has had its load event.
-    virtual void OnPrerenderStopLoading(NoStatePrefetchContents* contents) {}
+    // Signals that the prefetch has had its load event.
+    virtual void OnPrefetchStopLoading(NoStatePrefetchContents* contents) {}
 
-    // Signals that the prerender has stopped running. A NoStatePrefetchContents
-    // with an unset final status will always call OnPrerenderStop before being
-    // destroyed.
-    virtual void OnPrerenderStop(NoStatePrefetchContents* contents) {}
+    // Signals that the prefetch has stopped running.
+    // A NoStatePrefetchContents with an unset final status will always call
+    // OnPrefetchStop before being destroyed.
+    virtual void OnPrefetchStop(NoStatePrefetchContents* contents) {}
 
     // Signals that a resource finished loading and altered the running byte
     // count.
-    virtual void OnPrerenderNetworkBytesChanged(
+    virtual void OnPrefetchNetworkBytesChanged(
         NoStatePrefetchContents* contents) {}
 
    protected:
@@ -102,7 +102,7 @@
   ~NoStatePrefetchContents() override;
 
   // All observers of a NoStatePrefetchContents are removed after the
-  // OnPrerenderStop event is sent, so there is no need to call RemoveObserver()
+  // OnPrefetchStop event is sent, so there is no need to call RemoveObserver()
   // in the normal use case.
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
@@ -220,11 +220,10 @@
   void SetFinalStatus(FinalStatus final_status);
 
   // These call out to methods on our Observers, using our observer_list_. Note
-  // that NotifyPrerenderStop() also clears the observer list.
-  void NotifyPrerenderStart();
-  void NotifyPrerenderStopLoading();
-  void NotifyPrerenderDomContentLoaded();
-  void NotifyPrerenderStop();
+  // that NotifyPrefetchStop() also clears the observer list.
+  void NotifyPrefetchStart();
+  void NotifyPrefetchStopLoading();
+  void NotifyPrefetchStop();
 
   // Called whenever a RenderViewHost is created for prerendering.  Only called
   // once the RenderViewHost has a RenderView and RenderWidgetHostView.
diff --git a/components/no_state_prefetch/browser/prerender_handle.cc b/components/no_state_prefetch/browser/no_state_prefetch_handle.cc
similarity index 68%
rename from components/no_state_prefetch/browser/prerender_handle.cc
rename to components/no_state_prefetch/browser/no_state_prefetch_handle.cc
index 5bd4edc..771df17 100644
--- a/components/no_state_prefetch/browser/prerender_handle.cc
+++ b/components/no_state_prefetch/browser/no_state_prefetch_handle.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 "components/no_state_prefetch/browser/prerender_handle.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 
 #include <algorithm>
 
@@ -15,55 +15,55 @@
 
 namespace prerender {
 
-PrerenderHandle::Observer::Observer() {}
+NoStatePrefetchHandle::Observer::Observer() {}
 
-PrerenderHandle::Observer::~Observer() {}
+NoStatePrefetchHandle::Observer::~Observer() {}
 
-PrerenderHandle::~PrerenderHandle() {
+NoStatePrefetchHandle::~NoStatePrefetchHandle() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (prerender_data_) {
     prerender_data_->contents()->RemoveObserver(this);
   }
 }
 
-void PrerenderHandle::SetObserver(Observer* observer) {
+void NoStatePrefetchHandle::SetObserver(Observer* observer) {
   observer_ = observer;
 }
 
-void PrerenderHandle::OnNavigateAway() {
+void NoStatePrefetchHandle::OnNavigateAway() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (prerender_data_)
     prerender_data_->OnHandleNavigatedAway(this);
 }
 
-void PrerenderHandle::OnCancel() {
+void NoStatePrefetchHandle::OnCancel() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (prerender_data_)
     prerender_data_->OnHandleCanceled(this);
 }
 
-bool PrerenderHandle::IsPrerendering() const {
+bool NoStatePrefetchHandle::IsPrefetching() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return prerender_data_.get() != nullptr &&
          !prerender_data_->contents()->prerendering_has_been_cancelled();
 }
 
-bool PrerenderHandle::IsFinishedLoading() const {
+bool NoStatePrefetchHandle::IsFinishedLoading() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return prerender_data_ && prerender_data_->contents()->has_finished_loading();
 }
 
-bool PrerenderHandle::IsAbandoned() const {
+bool NoStatePrefetchHandle::IsAbandoned() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return prerender_data_ && !prerender_data_->abandon_time().is_null();
 }
 
-NoStatePrefetchContents* PrerenderHandle::contents() const {
+NoStatePrefetchContents* NoStatePrefetchHandle::contents() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return prerender_data_ ? prerender_data_->contents() : nullptr;
 }
 
-PrerenderHandle::PrerenderHandle(
+NoStatePrefetchHandle::NoStatePrefetchHandle(
     NoStatePrefetchManager::PrerenderData* prerender_data)
     : observer_(nullptr) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -73,22 +73,22 @@
   }
 }
 
-void PrerenderHandle::OnPrerenderStop(
+void NoStatePrefetchHandle::OnPrefetchStop(
     NoStatePrefetchContents* no_state_prefetch_contents) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (observer_)
-    observer_->OnPrerenderStop(this);
+    observer_->OnPrefetchStop(this);
 }
 
-void PrerenderHandle::OnPrerenderNetworkBytesChanged(
+void NoStatePrefetchHandle::OnPrefetchNetworkBytesChanged(
     NoStatePrefetchContents* no_state_prefetch_contents) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (observer_)
-    observer_->OnPrerenderNetworkBytesChanged(this);
+    observer_->OnPrefetchNetworkBytesChanged(this);
 }
 
-bool PrerenderHandle::RepresentingSamePrerenderAs(
-    PrerenderHandle* other) const {
+bool NoStatePrefetchHandle::RepresentingSamePrefetchAs(
+    NoStatePrefetchHandle* other) const {
   return other && other->prerender_data_ && prerender_data_ &&
          prerender_data_.get() == other->prerender_data_.get();
 }
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_handle.h b/components/no_state_prefetch/browser/no_state_prefetch_handle.h
new file mode 100644
index 0000000..8cd638f
--- /dev/null
+++ b/components/no_state_prefetch/browser/no_state_prefetch_handle.h
@@ -0,0 +1,96 @@
+// Copyright (c) 2012 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_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_HANDLE_H_
+#define COMPONENTS_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_HANDLE_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
+
+namespace prerender {
+
+class NoStatePrefetchContents;
+
+// A class representing a running prefetch to a client of the
+// NoStatePrefetchManager. Methods on NoStatePrefetchManager which start
+// prefetch return a caller-owned NoStatePrefetchHandle* to the client (or
+// NULL if they are unable to start prefetch). Calls on the handle of prefetch
+// that is not running at no-ops. Destroying a handle before prefetch starts
+// will prevent it from ever starting. Destroying a handle while prefetch is
+// running will stop the prefetch, without making any calls to the observer.
+class NoStatePrefetchHandle : public NoStatePrefetchContents::Observer {
+ public:
+  class Observer {
+   public:
+    // Signals that the prefetch has stopped running.
+    virtual void OnPrefetchStop(NoStatePrefetchHandle* handle) = 0;
+
+    // Signals that a resource finished loading and altered the running byte
+    // count.
+    virtual void OnPrefetchNetworkBytesChanged(
+        NoStatePrefetchHandle* handle) = 0;
+
+   protected:
+    Observer();
+    virtual ~Observer();
+  };
+
+  // Before calling the destructor, the caller must invalidate the handle by
+  // calling either OnNavigateAway or OnCancel.
+  ~NoStatePrefetchHandle() override;
+
+  void SetObserver(Observer* observer);
+
+  // The launcher is navigating away from the context that launched this
+  // prefetch. The prefetch will likely stay alive briefly though, in case
+  // we are going through a redirect chain that will target it.
+  void OnNavigateAway();
+
+  // The launcher has taken explicit action to remove this prefetch (for
+  // instance, removing a link element from a document). This call invalidates
+  // the handle. If the prefetch handle is already invalid, this call does
+  // nothing.
+  void OnCancel();
+
+  // True if this prefetch is currently active.
+  bool IsPrefetching() const;
+
+  // True if we started prefetch, and it has finished loading.
+  bool IsFinishedLoading() const;
+
+  // True if the prefetch is currently active, but is abandoned.
+  bool IsAbandoned() const;
+
+  NoStatePrefetchContents* contents() const;
+
+  // Returns whether this NoStatePrefetchHandle represents the same prefetch as
+  // the other NoStatePrefetchHandle object specified.
+  bool RepresentingSamePrefetchAs(NoStatePrefetchHandle* other) const;
+
+ private:
+  friend class NoStatePrefetchManager;
+
+  explicit NoStatePrefetchHandle(
+      NoStatePrefetchManager::PrerenderData* prerender_data);
+
+  // From NoStatePrefetchContents::Observer:
+  void OnPrefetchStop(
+      NoStatePrefetchContents* no_state_prefetch_contents) override;
+  void OnPrefetchNetworkBytesChanged(
+      NoStatePrefetchContents* no_state_prefetch_contents) override;
+
+  Observer* observer_;
+
+  base::WeakPtr<NoStatePrefetchManager::PrerenderData> prerender_data_;
+  base::WeakPtrFactory<NoStatePrefetchHandle> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(NoStatePrefetchHandle);
+};
+
+}  // namespace prerender
+
+#endif  // COMPONENTS_NO_STATE_PREFETCH_BROWSER_NO_STATE_PREFETCH_HANDLE_H_
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
index d8b8228..93173e18 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
+++ b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
@@ -34,9 +34,9 @@
 #include "base/values.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_contents.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager_delegate.h"
 #include "components/no_state_prefetch/browser/prerender_field_trial.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "components/no_state_prefetch/browser/prerender_histograms.h"
 #include "components/no_state_prefetch/browser/prerender_history.h"
 #include "components/no_state_prefetch/browser/prerender_util.h"
@@ -163,7 +163,7 @@
   DCHECK(active_prerenders_.empty());
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderFromLinkRelPrerender(
     int process_id,
     int route_id,
@@ -206,7 +206,7 @@
                                             session_storage_namespace);
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderFromOmnibox(
     const GURL& url,
     SessionStorageNamespace* session_storage_namespace,
@@ -216,7 +216,7 @@
       session_storage_namespace);
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderFromNavigationPredictor(
     const GURL& url,
     SessionStorageNamespace* session_storage_namespace,
@@ -226,7 +226,8 @@
       gfx::Rect(size), session_storage_namespace);
 }
 
-std::unique_ptr<PrerenderHandle> NoStatePrefetchManager::AddIsolatedPrerender(
+std::unique_ptr<NoStatePrefetchHandle>
+NoStatePrefetchManager::AddIsolatedPrerender(
     const GURL& url,
     SessionStorageNamespace* session_storage_namespace,
     const gfx::Size& size) {
@@ -236,7 +237,7 @@
       gfx::Rect(size), session_storage_namespace);
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderFromExternalRequest(
     const GURL& url,
     const content::Referrer& referrer,
@@ -247,7 +248,7 @@
                                             session_storage_namespace);
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddForcedPrerenderFromExternalRequest(
     const GURL& url,
     const content::Referrer& referrer,
@@ -407,14 +408,14 @@
 NoStatePrefetchManager::PrerenderData::~PrerenderData() = default;
 
 void NoStatePrefetchManager::PrerenderData::OnHandleCreated(
-    PrerenderHandle* handle) {
+    NoStatePrefetchHandle* handle) {
   DCHECK(contents_);
   ++handle_count_;
   contents_->AddObserver(handle);
 }
 
 void NoStatePrefetchManager::PrerenderData::OnHandleNavigatedAway(
-    PrerenderHandle* handle) {
+    NoStatePrefetchHandle* handle) {
   DCHECK_LT(0, handle_count_);
   DCHECK(contents_);
   if (abandon_time_.is_null())
@@ -425,7 +426,7 @@
 }
 
 void NoStatePrefetchManager::PrerenderData::OnHandleCanceled(
-    PrerenderHandle* handle) {
+    NoStatePrefetchHandle* handle) {
   DCHECK_LT(0, handle_count_);
   DCHECK(contents_);
 
@@ -487,7 +488,7 @@
   delegate_->MaybePreconnect(url_arg);
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderWithPreconnectFallback(
     Origin origin,
     const GURL& url_arg,
@@ -546,7 +547,8 @@
           FindPrerenderData(url, session_storage_namespace)) {
     SkipNoStatePrefetchContentsAndMaybePreconnect(url, origin,
                                                   FINAL_STATUS_DUPLICATE);
-    return base::WrapUnique(new PrerenderHandle(preexisting_prerender_data));
+    return base::WrapUnique(
+        new NoStatePrefetchHandle(preexisting_prerender_data));
   }
 
   base::TimeDelta prefetch_age;
@@ -632,8 +634,9 @@
 
   DCHECK(!no_state_prefetch_contents_ptr->prerendering_has_started());
 
-  std::unique_ptr<PrerenderHandle> prerender_handle =
-      base::WrapUnique(new PrerenderHandle(active_prerenders_.back().get()));
+  std::unique_ptr<NoStatePrefetchHandle> no_state_prefetch_handle =
+      base::WrapUnique(
+          new NoStatePrefetchHandle(active_prerenders_.back().get()));
   SortActivePrerenders();
 
   last_prerender_start_time_ = GetCurrentTimeTicks();
@@ -647,7 +650,7 @@
   DCHECK(no_state_prefetch_contents_ptr->prerendering_has_started());
 
   StartSchedulingPeriodicCleanups();
-  return prerender_handle;
+  return no_state_prefetch_handle;
 }
 
 void NoStatePrefetchManager::StartSchedulingPeriodicCleanups() {
@@ -1002,7 +1005,7 @@
   prefetches_.clear();
 }
 
-std::unique_ptr<PrerenderHandle>
+std::unique_ptr<NoStatePrefetchHandle>
 NoStatePrefetchManager::AddPrerenderWithPreconnectFallbackForTesting(
     Origin origin,
     const GURL& url,
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_manager.h b/components/no_state_prefetch/browser/no_state_prefetch_manager.h
index 3c30a696..ee9deb2e 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_manager.h
+++ b/components/no_state_prefetch/browser/no_state_prefetch_manager.h
@@ -56,7 +56,7 @@
 class PrerenderInProcessBrowserTest;
 }
 
-class PrerenderHandle;
+class NoStatePrefetchHandle;
 class PrerenderHistory;
 
 // Observer interface for NoStatePrefetchManager events.
@@ -95,10 +95,10 @@
 
   // Adds a prerender for |url| if valid. |process_id| and |route_id| identify
   // the RenderView that the prerender request came from. If |size| is empty, a
-  // default from the PrerenderConfig is used. Returns a PrerenderHandle if the
-  // URL was added, NULL if it was not. If the launching RenderView is itself
-  // prerendering, the prerender is added as a pending prerender.
-  std::unique_ptr<PrerenderHandle> AddPrerenderFromLinkRelPrerender(
+  // default from the PrerenderConfig is used. Returns a NoStatePrefetchHandle
+  // if the URL was added, NULL if it was not. If the launching RenderView is
+  // itself prerendering, the prerender is added as a pending prerender.
+  std::unique_ptr<NoStatePrefetchHandle> AddPrerenderFromLinkRelPrerender(
       int process_id,
       int route_id,
       const GURL& url,
@@ -112,9 +112,9 @@
   // child or route id, or a referrer. This method uses sensible values for
   // those. The |session_storage_namespace| matches the namespace of the active
   // tab at the time the prerender is generated from the omnibox. Returns a
-  // PrerenderHandle or NULL. If the prerender fails, the prerender manager may
-  // fallback and initiate a preconnect to |url|.
-  std::unique_ptr<PrerenderHandle> AddPrerenderFromOmnibox(
+  // NoStatePrefetchHandle or NULL. If the prerender fails, the prerender
+  // manager may fallback and initiate a preconnect to |url|.
+  std::unique_ptr<NoStatePrefetchHandle> AddPrerenderFromOmnibox(
       const GURL& url,
       content::SessionStorageNamespace* session_storage_namespace,
       const gfx::Size& size);
@@ -122,8 +122,8 @@
   // Adds a prerender for the prefetch url from NavigationPredictor on
   // page load, if NoStatePrefetch and prefetch_after_preconnect are true.
   // Uses the NavigationPredictor's browser context and the default
-  // SessionStorageNamespace. Returns a PrerenderHandle or NULL.
-  std::unique_ptr<PrerenderHandle> AddPrerenderFromNavigationPredictor(
+  // SessionStorageNamespace. Returns a NoStatePrefetchHandle or NULL.
+  std::unique_ptr<NoStatePrefetchHandle> AddPrerenderFromNavigationPredictor(
       const GURL& url,
       content::SessionStorageNamespace* session_storage_namespace,
       const gfx::Size& size);
@@ -131,14 +131,14 @@
   // Adds a prerender for the prefetch url from IsolatedPrerender on
   // page load, if NoStatePrefetch and prefetch_after_preconnect are true.
   // Uses the NavigationPredictor's browser context and the default
-  // SessionStorageNamespace. Returns a PrerenderHandle or nullptr. Does not
-  // fallback to preconnecting if the prerender isn't triggered.
-  std::unique_ptr<PrerenderHandle> AddIsolatedPrerender(
+  // SessionStorageNamespace. Returns a NoStatePrefetchHandle or nullptr. Does
+  // not fallback to preconnecting if the prerender isn't triggered.
+  std::unique_ptr<NoStatePrefetchHandle> AddIsolatedPrerender(
       const GURL& url,
       content::SessionStorageNamespace* session_storage_namespace,
       const gfx::Size& size);
 
-  std::unique_ptr<PrerenderHandle> AddPrerenderFromExternalRequest(
+  std::unique_ptr<NoStatePrefetchHandle> AddPrerenderFromExternalRequest(
       const GURL& url,
       const content::Referrer& referrer,
       content::SessionStorageNamespace* session_storage_namespace,
@@ -146,7 +146,7 @@
 
   // Adds a prerender from an external request that will prerender even on
   // cellular networks as long as the user setting for prerendering is ON.
-  std::unique_ptr<PrerenderHandle> AddForcedPrerenderFromExternalRequest(
+  std::unique_ptr<NoStatePrefetchHandle> AddForcedPrerenderFromExternalRequest(
       const GURL& url,
       const content::Referrer& referrer,
       content::SessionStorageNamespace* session_storage_namespace,
@@ -269,9 +269,10 @@
   bool HasRecentlyPrefetchedUrlForTesting(const GURL& url);
 
   // Adds a prerender for |url| from |initiator_origin|. The |origin| specifies
-  // how the prerender was added. Returns a PrerenderHandle or nullptr. Only for
-  // testing.
-  std::unique_ptr<PrerenderHandle> AddPrerenderWithPreconnectFallbackForTesting(
+  // how the prerender was added. Returns a NoStatePrefetchHandle or nullptr.
+  // Only for testing.
+  std::unique_ptr<NoStatePrefetchHandle>
+  AddPrerenderWithPreconnectFallbackForTesting(
       Origin origin,
       const GURL& url,
       const base::Optional<url::Origin>& initiator_origin);
@@ -287,19 +288,19 @@
 
     ~PrerenderData();
 
-    // A new PrerenderHandle has been created for this PrerenderData.
-    void OnHandleCreated(PrerenderHandle* prerender_handle);
+    // A new NoStatePrefetchHandle has been created for this PrerenderData.
+    void OnHandleCreated(NoStatePrefetchHandle* handle);
 
     // The launcher associated with a handle is navigating away from the context
     // that launched this prerender. If the prerender is active, it may stay
     // alive briefly though, in case we we going through a redirect chain that
     // will eventually land at it.
-    void OnHandleNavigatedAway(PrerenderHandle* prerender_handle);
+    void OnHandleNavigatedAway(NoStatePrefetchHandle* handle);
 
     // The launcher associated with a handle has taken explicit action to cancel
     // this prerender. We may well destroy the prerender in this case if no
     // other handles continue to track it.
-    void OnHandleCanceled(PrerenderHandle* prerender_handle);
+    void OnHandleCanceled(NoStatePrefetchHandle* handle);
 
     NoStatePrefetchContents* contents() { return contents_.get(); }
 
@@ -318,11 +319,12 @@
     NoStatePrefetchManager* const manager_;
     std::unique_ptr<NoStatePrefetchContents> contents_;
 
-    // The number of distinct PrerenderHandles created for |this|, including
-    // ones that have called PrerenderData::OnHandleNavigatedAway(), but not
-    // counting the ones that have called PrerenderData::OnHandleCanceled(). For
-    // pending prerenders, this will always be 1, since the
-    // NoStatePrefetchManager only merges handles of running prerenders.
+    // The number of distinct NoStatePrefetchHandles created for |this|,
+    // including ones that have called PrerenderData::OnHandleNavigatedAway(),
+    // but not counting the ones that have called
+    // PrerenderData::OnHandleCanceled(). For pending prerenders, this will
+    // always be 1, since the NoStatePrefetchManager only merges handles of
+    // running prerenders.
     int handle_count_ = 0;
 
     // The time when OnHandleNavigatedAway was called.
@@ -351,7 +353,7 @@
  private:
   friend class test_utils::PrerenderInProcessBrowserTest;
   friend class NoStatePrefetchContents;
-  friend class PrerenderHandle;
+  friend class NoStatePrefetchHandle;
   friend class UnitTestNoStatePrefetchManager;
 
   class OnCloseWebContentsDeleter;
@@ -367,8 +369,8 @@
   // Adds a prerender for |url| from |referrer|. The |origin| specifies how the
   // prerender was added. If |bounds| is empty, then
   // NoStatePrefetchContents::StartPrerendering will instead use a default from
-  // PrerenderConfig. Returns a PrerenderHandle or NULL.
-  std::unique_ptr<PrerenderHandle> AddPrerenderWithPreconnectFallback(
+  // PrerenderConfig. Returns a NoStatePrefetchHandle or NULL.
+  std::unique_ptr<NoStatePrefetchHandle> AddPrerenderWithPreconnectFallback(
       Origin origin,
       const GURL& url,
       const content::Referrer& referrer,
diff --git a/components/no_state_prefetch/browser/prerender_handle.h b/components/no_state_prefetch/browser/prerender_handle.h
deleted file mode 100644
index 831b520..0000000
--- a/components/no_state_prefetch/browser/prerender_handle.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2012 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_NO_STATE_PREFETCH_BROWSER_PRERENDER_HANDLE_H_
-#define COMPONENTS_NO_STATE_PREFETCH_BROWSER_PRERENDER_HANDLE_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-
-namespace prerender {
-
-class NoStatePrefetchContents;
-
-// A class representing a running prerender to a client of the
-// NoStatePrefetchManager. Methods on NoStatePrefetchManager which start
-// prerenders return a caller-owned PrerenderHandle* to the client (or NULL if
-// they are unable to start a prerender). Calls on the handle of a prerender
-// that is not running at no-ops. Destroying a handle before a prerender starts
-// will prevent it from ever starting. Destroying a handle while a prerendering
-// is running will stop the prerender, without making any calls to the observer.
-class PrerenderHandle : public NoStatePrefetchContents::Observer {
- public:
-  class Observer {
-   public:
-    // Signals that the prerender has stopped running.
-    virtual void OnPrerenderStop(PrerenderHandle* handle) = 0;
-
-    // Signals that a resource finished loading and altered the running byte
-    // count.
-    virtual void OnPrerenderNetworkBytesChanged(PrerenderHandle* handle) = 0;
-
-   protected:
-    Observer();
-    virtual ~Observer();
-  };
-
-  // Before calling the destructor, the caller must invalidate the handle by
-  // calling either OnNavigateAway or OnCancel.
-  ~PrerenderHandle() override;
-
-  void SetObserver(Observer* observer);
-
-  // The launcher is navigating away from the context that launched this
-  // prerender. The prerender will likely stay alive briefly though, in case we
-  // are going through a redirect chain that will target it.
-  void OnNavigateAway();
-
-  // The launcher has taken explicit action to remove this prerender (for
-  // instance, removing a link element from a document). This call invalidates
-  // the handle. If the prerender handle is already invalid, this call does
-  // nothing.
-  void OnCancel();
-
-  // True if this prerender is currently active.
-  bool IsPrerendering() const;
-
-  // True if we started a prerender, and it has finished loading.
-  bool IsFinishedLoading() const;
-
-  // True if the prerender is currently active, but is abandoned.
-  bool IsAbandoned() const;
-
-  NoStatePrefetchContents* contents() const;
-
-  // Returns whether this PrerenderHandle represents the same prerender as
-  // the other PrerenderHandle object specified.
-  bool RepresentingSamePrerenderAs(PrerenderHandle* other) const;
-
- private:
-  friend class NoStatePrefetchManager;
-
-  explicit PrerenderHandle(
-      NoStatePrefetchManager::PrerenderData* prerender_data);
-
-  // From NoStatePrefetchContents::Observer:
-  void OnPrerenderStop(
-      NoStatePrefetchContents* no_state_prefetch_contents) override;
-  void OnPrerenderNetworkBytesChanged(
-      NoStatePrefetchContents* no_state_prefetch_contents) override;
-
-  Observer* observer_;
-
-  base::WeakPtr<NoStatePrefetchManager::PrerenderData> prerender_data_;
-  base::WeakPtrFactory<PrerenderHandle> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(PrerenderHandle);
-};
-
-}  // namespace prerender
-
-#endif  // COMPONENTS_NO_STATE_PREFETCH_BROWSER_PRERENDER_HANDLE_H_
diff --git a/components/no_state_prefetch/browser/prerender_link_manager.cc b/components/no_state_prefetch/browser/prerender_link_manager.cc
index f1785cae..00fa089 100644
--- a/components/no_state_prefetch/browser/prerender_link_manager.cc
+++ b/components/no_state_prefetch/browser/prerender_link_manager.cc
@@ -15,8 +15,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "build/build_config.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_contents.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/session_storage_namespace.h"
@@ -69,7 +69,7 @@
 
 PrerenderLinkManager::LinkPrerender::~LinkPrerender() {
   DCHECK_EQ(nullptr, handle.get())
-      << "The PrerenderHandle should be destroyed before its Prerender.";
+      << "The NoStatePrefetchHandle should be destroyed before its Prerender.";
 }
 
 PrerenderLinkManager::PrerenderLinkManager(NoStatePrefetchManager* manager)
@@ -78,8 +78,8 @@
 PrerenderLinkManager::~PrerenderLinkManager() {
   for (auto& prerender : prerenders_) {
     if (prerender->handle) {
-      DCHECK(!prerender->handle->IsPrerendering())
-          << "All running prerenders should stop at the same time as the "
+      DCHECK(!prerender->handle->IsPrefetching())
+          << "All running prefetchers should stop at the same time as the "
           << "NoStatePrefetchManager.";
       prerender->handle.reset();
     }
@@ -157,10 +157,10 @@
   prerender->handle->OnNavigateAway();
   DCHECK(prerender->handle);
 
-  // If the prerender is not running, remove it from the list so it does not
+  // If the prefetcher is not running, remove it from the list so it does not
   // leak. If it is running, it will send a cancel event when it stops which
   // will remove it.
-  if (!prerender->handle->IsPrerendering())
+  if (!prerender->handle->IsPrefetching())
     RemovePrerender(prerender);
 }
 
@@ -177,7 +177,7 @@
   return std::count_if(prerenders_.begin(), prerenders_.end(),
                        [](const std::unique_ptr<LinkPrerender>& prerender) {
                          return prerender->handle &&
-                                prerender->handle->IsPrerendering();
+                                prerender->handle->IsPrefetching();
                        });
 }
 
@@ -261,7 +261,7 @@
       abandoned_prerenders.pop_front();
     }
 
-    std::unique_ptr<PrerenderHandle> handle =
+    std::unique_ptr<NoStatePrefetchHandle> handle =
         manager_->AddPrerenderFromLinkRelPrerender(
             pending_prerender->launcher_render_process_id,
             pending_prerender->launcher_render_view_id, pending_prerender->url,
@@ -273,8 +273,8 @@
       continue;
     }
 
-    if (handle->IsPrerendering()) {
-      // We have successfully started a new prerender.
+    if (handle->IsPrefetching()) {
+      // We have successfully started a new prefetcher.
       pending_prerender->handle = std::move(handle);
       ++total_started_prerender_count;
       pending_prerender->handle->SetObserver(this);
@@ -287,10 +287,11 @@
 }
 
 PrerenderLinkManager::LinkPrerender*
-PrerenderLinkManager::FindByPrerenderHandle(PrerenderHandle* prerender_handle) {
-  DCHECK(prerender_handle);
+PrerenderLinkManager::FindByNoStatePrefetchHandle(
+    NoStatePrefetchHandle* no_state_prefetch_handle) {
+  DCHECK(no_state_prefetch_handle);
   for (auto& prerender : prerenders_) {
-    if (prerender->handle.get() == prerender_handle)
+    if (prerender->handle.get() == no_state_prefetch_handle)
       return prerender.get();
   }
   return nullptr;
@@ -309,7 +310,7 @@
   for (auto it = prerenders_.begin(); it != prerenders_.end(); ++it) {
     LinkPrerender* current_prerender = it->get();
     if (current_prerender == prerender) {
-      std::unique_ptr<PrerenderHandle> own_handle =
+      std::unique_ptr<NoStatePrefetchHandle> own_handle =
           std::move(prerender->handle);
       prerenders_.erase(it);
       return;
@@ -322,7 +323,7 @@
   for (auto it = prerenders_.begin(); it != prerenders_.end(); ++it) {
     LinkPrerender* current_prerender = it->get();
     if (current_prerender == prerender) {
-      std::unique_ptr<PrerenderHandle> own_handle =
+      std::unique_ptr<NoStatePrefetchHandle> own_handle =
           std::move(prerender->handle);
       prerenders_.erase(it);
       if (own_handle)
@@ -337,15 +338,17 @@
   has_shutdown_ = true;
 }
 
-void PrerenderLinkManager::OnPrerenderStop(PrerenderHandle* prerender_handle) {
-  LinkPrerender* prerender = FindByPrerenderHandle(prerender_handle);
+void PrerenderLinkManager::OnPrefetchStop(
+    NoStatePrefetchHandle* no_state_prefetch_handle) {
+  LinkPrerender* prerender =
+      FindByNoStatePrefetchHandle(no_state_prefetch_handle);
   if (!prerender)
     return;
   RemovePrerender(prerender);
   StartPrerenders();
 }
 
-void PrerenderLinkManager::OnPrerenderNetworkBytesChanged(
-    PrerenderHandle* prerender_handle) {}
+void PrerenderLinkManager::OnPrefetchNetworkBytesChanged(
+    NoStatePrefetchHandle* no_state_prefetch_handle) {}
 
 }  // namespace prerender
diff --git a/components/no_state_prefetch/browser/prerender_link_manager.h b/components/no_state_prefetch/browser/prerender_link_manager.h
index ca2e5a04..c0064e6 100644
--- a/components/no_state_prefetch/browser/prerender_link_manager.h
+++ b/components/no_state_prefetch/browser/prerender_link_manager.h
@@ -16,7 +16,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -32,7 +32,7 @@
 // renderer indicating addition, cancelation and abandonment of link elements,
 // and controls the NoStatePrefetchManager accordingly.
 class PrerenderLinkManager : public KeyedService,
-                             public PrerenderHandle::Observer {
+                             public NoStatePrefetchHandle::Observer {
  public:
   explicit PrerenderLinkManager(NoStatePrefetchManager* manager);
   ~PrerenderLinkManager() override;
@@ -96,7 +96,7 @@
 
     // Initially null, |handle| is set once we start this prerender. It is owned
     // by this struct, and must be deleted before destructing this struct.
-    std::unique_ptr<PrerenderHandle> handle;
+    std::unique_ptr<NoStatePrefetchHandle> handle;
 
     // True if this prerender has been abandoned by its launcher.
     bool has_been_abandoned;
@@ -117,11 +117,12 @@
   // the system and per launcher.
   void StartPrerenders();
 
-  LinkPrerender* FindByPrerenderHandle(PrerenderHandle* prerender_handle);
+  LinkPrerender* FindByNoStatePrefetchHandle(
+      NoStatePrefetchHandle* no_state_prefetch_handle);
   LinkPrerender* FindByPrerenderId(int prerender_id);
 
   // Removes |prerender| from the the prerender link manager. Deletes the
-  // PrerenderHandle as needed.
+  // NoStatePrefetchHandle as needed.
   void RemovePrerender(LinkPrerender* prerender);
 
   // Cancels |prerender| and removes |prerender| from the prerender link
@@ -131,10 +132,10 @@
   // From KeyedService:
   void Shutdown() override;
 
-  // From PrerenderHandle::Observer:
-  void OnPrerenderStop(PrerenderHandle* prerender_handle) override;
-  void OnPrerenderNetworkBytesChanged(
-      PrerenderHandle* prerender_handle) override;
+  // From NoStatePrefetchHandle::Observer:
+  void OnPrefetchStop(NoStatePrefetchHandle* no_state_prefetch_handle) override;
+  void OnPrefetchNetworkBytesChanged(
+      NoStatePrefetchHandle* no_state_prefetch_handle) override;
 
   bool has_shutdown_;
 
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
index 830df3313..2dab7ef 100644
--- a/components/omnibox/browser/autocomplete_result.cc
+++ b/components/omnibox/browser/autocomplete_result.cc
@@ -171,6 +171,17 @@
     MergeMatchesByProvider(&pair.second, matches_per_provider[pair.first]);
   }
 
+  // Make sure previous matches adhere to |input.prevent_inline_autocomplete()|.
+  // Previous matches are demoted in |MergeMatchesByProvider()| anyways, making
+  // them unlikely to be default; however, without this safeguard, they may
+  // still be deduped with a higher-relevance yet not-allowed-to-be-default
+  // match later, resulting in a default match with autocompletion when
+  // |prevent_inline_autocomplete| is false.
+  for (auto& m : matches_) {
+    if (input.prevent_inline_autocomplete() && m.from_previous)
+      m.SetAllowedToBeDefault(input);
+  }
+
   SortAndCull(input, template_url_service);
 }
 
diff --git a/components/omnibox/browser/autocomplete_result_unittest.cc b/components/omnibox/browser/autocomplete_result_unittest.cc
index f064b3a..4a770516 100644
--- a/components/omnibox/browser/autocomplete_result_unittest.cc
+++ b/components/omnibox/browser/autocomplete_result_unittest.cc
@@ -122,6 +122,9 @@
 
     // Suggestion Group ID for this suggeston
     base::Optional<int> suggestion_group_id;
+
+    // Inline autocompletion.
+    std::string inline_autocompletion;
   };
 
   AutocompleteResultTest() {
@@ -169,6 +172,13 @@
                                  size_t current_size,
                                  const TestData* expected,
                                  size_t expected_size);
+  void RunTransferOldMatchesTest(const TestData* last,
+                                 size_t last_size,
+                                 const TestData* current,
+                                 size_t current_size,
+                                 const TestData* expected,
+                                 size_t expected_size,
+                                 AutocompleteInput input);
 
   void SortMatchesAndVerifyOrder(
       const std::string& input_text,
@@ -205,6 +215,7 @@
   match->allowed_to_be_default_match = data.allowed_to_be_default_match;
   match->duplicate_matches = data.duplicate_matches;
   match->suggestion_group_id = data.suggestion_group_id;
+  match->inline_autocompletion = base::UTF8ToUTF16(data.inline_autocompletion);
 }
 
 void AutocompleteResultTest::PopulateAutocompleteMatches(
@@ -240,6 +251,8 @@
       << i;
   EXPECT_EQ(expected_match.destination_url.spec(), match.destination_url.spec())
       << i;
+  EXPECT_EQ(expected_match.inline_autocompletion, match.inline_autocompletion)
+      << i;
 }
 
 void AutocompleteResultTest::RunTransferOldMatchesTest(const TestData* last,
@@ -251,7 +264,18 @@
   AutocompleteInput input(base::ASCIIToUTF16("a"),
                           metrics::OmniboxEventProto::OTHER,
                           TestSchemeClassifier());
+  RunTransferOldMatchesTest(last, last_size, current, current_size, expected,
+                            expected_size, input);
+}
 
+void AutocompleteResultTest::RunTransferOldMatchesTest(
+    const TestData* last,
+    size_t last_size,
+    const TestData* current,
+    size_t current_size,
+    const TestData* expected,
+    size_t expected_size,
+    AutocompleteInput input) {
   ACMatches last_matches;
   PopulateAutocompleteMatches(last, last_size, &last_matches);
   AutocompleteResult last_result;
@@ -438,6 +462,141 @@
       base::size(result)));
 }
 
+// Tests |TransferOldMatches()| with an |AutocompleteInput| with
+// |prevent_inline_autocomplete| set to true. Noteworthy, expect that resulting
+// matches must have effectively empty autocompletions; i.e. either empty
+// |inline_autocompletion|, or false |allowed_to_be_default|. Tests all 12
+// combinations of 1) last match has a lower or higher relevance than current
+// match, 2) last match was allowed to be default, 3) last match had
+// autocompletion (only possible if its allowed to be default), and 4) current
+// match is allowed to be default.
+TEST_F(AutocompleteResultTest,
+       TransferOldMatchesAllowedToBeDefaultWithPreventInlineAutocompletion) {
+  AutocompleteInput input(base::ASCIIToUTF16("a"),
+                          metrics::OmniboxEventProto::OTHER,
+                          TestSchemeClassifier());
+  input.set_prevent_inline_autocomplete(true);
+
+  {
+    SCOPED_TRACE(
+        "Current matches not allowed to be default and scored higher.");
+    // 1) |allowed_to_be_default| should be true only for |last| matches without
+    // autocompletion.
+    // 2) When |allowed_to_be_default| is false, |current| matches should be
+    // preferred as they're scored higher.
+    // clang-format off
+    TestData last[] = {
+        {0, 1, 1020, true, {}, AutocompleteMatchType::SEARCH_SUGGEST, {}, "autocompletion"},
+        {1, 1, 1010, true},
+        {2, 1, 1000, false},
+    };
+    TestData current[] = {
+        {0, 2, 1520, false},
+        {1, 2, 1510, false},
+        {2, 2, 1500, false},
+    };
+    TestData result[] = {
+        {1, 1, 1510, true},
+        {0, 2, 1520, false},
+        {2, 1, 1500, true},
+    };
+    // clang-format on
+
+    ASSERT_NO_FATAL_FAILURE(RunTransferOldMatchesTest(
+        last, base::size(last), current, base::size(current), result,
+        base::size(result), input));
+  }
+
+  {
+    SCOPED_TRACE("Current matches not allowed to be default and scored lower.");
+    // Similar to above, except |last| matches should be preferred in deduping
+    // as they're scored higher.
+    // clang-format off
+    TestData last[] = {
+        {0, 1, 1020, true, {}, AutocompleteMatchType::SEARCH_SUGGEST, {}, "autocompletion"},
+        {1, 1, 1010, true},
+        {2, 1, 1000, false},
+    };
+    TestData current[] = {
+        // Need a high-scoring current match to avoid demoting last matches.
+        {3, 2, 1500, false},
+        {0, 2, 520, false},
+        {1, 2, 510, false},
+        {2, 2, 500, false},
+    };
+    TestData result[] = {
+        {1, 1, 1010, true},
+        {3, 2, 1500, false},
+        {0, 1, 1020, false, {}, AutocompleteMatchType::SEARCH_SUGGEST, {}, "autocompletion"},
+        {2, 1, 1000, true},
+    };
+    // clang-format on
+
+    ASSERT_NO_FATAL_FAILURE(RunTransferOldMatchesTest(
+        last, base::size(last), current, base::size(current), result,
+        base::size(result), input));
+  }
+
+  {
+    SCOPED_TRACE("Current matches allowed to be default and scored higher.");
+    // Deduping should prefer the |current| matches as they're both allowed to
+    // be default and scored higher.
+    // clang-format off
+    TestData last[] = {
+        {0, 1, 1020, true, {}, AutocompleteMatchType::SEARCH_SUGGEST, {}, "autocompletion"},
+        {1, 1, 1010, true},
+        {2, 1, 1000, false},
+    };
+    TestData current[] = {
+        {0, 2, 1520, true},
+        {1, 2, 1510, true},
+        {2, 2, 1500, true},
+    };
+    TestData result[] = {
+        {0, 2, 1520, true},
+        {1, 2, 1510, true},
+        {2, 2, 1500, true},
+    };
+    // clang-format on
+
+    ASSERT_NO_FATAL_FAILURE(RunTransferOldMatchesTest(
+        last, base::size(last), current, base::size(current), result,
+        base::size(result), input));
+  }
+
+  {
+    SCOPED_TRACE("Current matches allowed to be default and scored lower.");
+    // |last| matches with empty autocompletion should be made allowed to be
+    // default and preferred in deduping as they're scored higher. Otherwise,
+    // |current| matches should be preferred in deduping as they're allowed to
+    // be default.
+    // clang-format off
+    TestData last[] = {
+        {0, 1, 1020, true, {}, AutocompleteMatchType::SEARCH_SUGGEST, {}, "autocompletion"},
+        {1, 1, 1010, true},
+        {2, 1, 1000, false},
+    };
+    TestData current[] = {
+        // Need a high-scoring current match to avoid demoting last matches.
+        {3, 2, 1500, true},
+        {0, 2, 520, true},
+        {1, 2, 510, true},
+        {2, 2, 500, true},
+    };
+    TestData result[] = {
+        {3, 2, 1500, true},
+        {0, 2, 1020, true},
+        {1, 1, 1010, true},
+        {2, 1, 1000, true},
+    };
+    // clang-format on
+
+    ASSERT_NO_FATAL_FAILURE(RunTransferOldMatchesTest(
+        last, base::size(last), current, base::size(current), result,
+        base::size(result), input));
+  }
+}
+
 // Tests that matches are copied correctly from two distinct providers.
 TEST_F(AutocompleteResultTest, TransferOldMatchesMultipleProviders) {
   TestData last[] = {
diff --git a/components/omnibox/browser/bookmark_provider.cc b/components/omnibox/browser/bookmark_provider.cc
index 4d962ea3..d0082a1 100644
--- a/components/omnibox/browser/bookmark_provider.cc
+++ b/components/omnibox/browser/bookmark_provider.cc
@@ -259,4 +259,4 @@
                           (url.spec().at(position.first - 1) == '?' ||
                            url.spec().at(position.first - 1) == '&'));
                 });
-}
\ No newline at end of file
+}
diff --git a/components/password_manager/core/browser/leak_detection/fuzzer/cipher_encrypt_fuzzer.cc b/components/password_manager/core/browser/leak_detection/fuzzer/cipher_encrypt_fuzzer.cc
index cd4ecba..7f45c23 100644
--- a/components/password_manager/core/browser/leak_detection/fuzzer/cipher_encrypt_fuzzer.cc
+++ b/components/password_manager/core/browser/leak_detection/fuzzer/cipher_encrypt_fuzzer.cc
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/optional.h"
 #include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 
 namespace password_manager {
@@ -14,7 +15,8 @@
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   std::string payload(reinterpret_cast<const char*>(data), size);
   std::string key;
-  std::string cipher = *password_manager::CipherEncrypt(payload, &key);
+  base::Optional<std::string> cipher =
+      password_manager::CipherEncrypt(payload, &key);
   return 0;
 }
 
diff --git a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_decrypt_fuzzer.cc b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_decrypt_fuzzer.cc
index cc582ed..7b06761 100644
--- a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_decrypt_fuzzer.cc
+++ b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_decrypt_fuzzer.cc
@@ -4,6 +4,7 @@
 
 #include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 
+#include "base/optional.h"
 #include "third_party/boringssl/src/include/openssl/nid.h"
 #include "third_party/private-join-and-compute/src/crypto/ec_commutative_cipher.h"
 
@@ -32,7 +33,8 @@
     return 0;
 
   std::string payload(reinterpret_cast<const char*>(data), size);
-  std::string result = *password_manager::CipherDecrypt(payload, key);
+  base::Optional<std::string> result =
+      password_manager::CipherDecrypt(payload, key);
   return 0;
 }
 
diff --git a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_encrypt_with_key_fuzzer.cc b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_encrypt_with_key_fuzzer.cc
index 05a0d09..19cd6c3 100644
--- a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_encrypt_with_key_fuzzer.cc
+++ b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_encrypt_with_key_fuzzer.cc
@@ -4,6 +4,7 @@
 
 #include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 
+#include "base/optional.h"
 #include "third_party/boringssl/src/include/openssl/nid.h"
 #include "third_party/private-join-and-compute/src/crypto/ec_commutative_cipher.h"
 
@@ -32,7 +33,8 @@
     return 0;
 
   std::string payload(reinterpret_cast<const char*>(data), size);
-  std::string result = *password_manager::CipherEncryptWithKey(payload, key);
+  base::Optional<std::string> result =
+      password_manager::CipherEncryptWithKey(payload, key);
   return 0;
 }
 
diff --git a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_reencrypt_fuzzer.cc b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_reencrypt_fuzzer.cc
index 0ea6d35..99c404700 100644
--- a/components/password_manager/core/browser/leak_detection/fuzzer/cypher_reencrypt_fuzzer.cc
+++ b/components/password_manager/core/browser/leak_detection/fuzzer/cypher_reencrypt_fuzzer.cc
@@ -4,12 +4,15 @@
 
 #include "components/password_manager/core/browser/leak_detection/encryption_utils.h"
 
+#include "base/optional.h"
+
 namespace password_manager {
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   std::string payload(reinterpret_cast<const char*>(data), size);
   std::string key;
-  std::string result = *password_manager::CipherEncrypt(payload, &key);
+  base::Optional<std::string> result =
+      password_manager::CipherEncrypt(payload, &key);
   return 0;
 }
 
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
index dc76a4a..9828119 100644
--- a/components/password_manager/core/browser/login_database.cc
+++ b/components/password_manager/core/browser/login_database.cc
@@ -1665,6 +1665,21 @@
   return StatementToForms(&s, nullptr, key_to_form_map);
 }
 
+FormRetrievalResult LoginDatabase::GetLoginsBySignonRealmAndUsername(
+    const std::string& signon_realm,
+    const base::string16& username,
+    PrimaryKeyToFormMap& key_to_form_map) {
+  TRACE_EVENT0("passwords", "LoginDatabase::GetLoginsBySignonRealmAndUsername");
+  key_to_form_map.clear();
+
+  sql::Statement s(
+      db_.GetCachedStatement(SQL_FROM_HERE, get_statement_username_.c_str()));
+  s.BindString(0, signon_realm);
+  s.BindString16(1, username);
+
+  return StatementToForms(&s, nullptr, &key_to_form_map);
+}
+
 std::vector<CompromisedCredentials> LoginDatabase::GetCompromisedCredentials(
     FormPrimaryKey parent_key) {
   TRACE_EVENT0("passwords", "LoginDatabase::GetCompromisedCredentials");
@@ -2128,6 +2143,8 @@
   DCHECK(get_statement_psl_federated_.empty());
   get_statement_psl_federated_ =
       get_statement_ + psl_statement + psl_federated_statement;
+  DCHECK(get_statement_username_.empty());
+  get_statement_username_ = get_statement_ + " AND username_value == ?";
   DCHECK(created_statement_.empty());
   created_statement_ =
       "SELECT " + all_column_names +
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h
index 96636f1..28e3d91 100644
--- a/components/password_manager/core/browser/login_database.h
+++ b/components/password_manager/core/browser/login_database.h
@@ -148,6 +148,12 @@
   FormRetrievalResult GetAllLogins(PrimaryKeyToFormMap* key_to_form_map)
       WARN_UNUSED_RESULT;
 
+  // Gets list of logins which match |signon_realm| and |username|.
+  FormRetrievalResult GetLoginsBySignonRealmAndUsername(
+      const std::string& signon_realm,
+      const base::string16& username,
+      PrimaryKeyToFormMap& key_to_form_map) WARN_UNUSED_RESULT;
+
   // Gets the complete list of all compromised credentials for the password form
   // with primary key `parent_key`.
   std::vector<CompromisedCredentials> GetCompromisedCredentials(
@@ -357,6 +363,7 @@
   std::string get_statement_psl_;
   std::string get_statement_federated_;
   std::string get_statement_psl_federated_;
+  std::string get_statement_username_;
   std::string created_statement_;
   std::string blocklisted_statement_;
   std::string encrypted_password_statement_by_id_;
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index 2a249a62..f25faf7 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -2626,6 +2626,50 @@
               testing::IsEmpty());
 }
 
+// Test retrieving password forms by supplied signon_realm and username.
+TEST_F(LoginDatabaseTest, GetLoginsBySignonRealmAndUsername) {
+  std::string signon_realm = "https://test.com";
+  base::string16 username1 = base::ASCIIToUTF16("username1");
+  base::string16 username2 = base::ASCIIToUTF16("username2");
+
+  // Insert first login.
+  PasswordForm form1;
+  GenerateExamplePasswordForm(&form1);
+  form1.signon_realm = signon_realm;
+  form1.username_value = username1;
+  ASSERT_EQ(AddChangeForForm(form1), db().AddLogin(form1));
+
+  PasswordForm form2;
+  GenerateExamplePasswordForm(&form2);
+  form2.signon_realm = signon_realm;
+  form2.username_value = username2;
+  ASSERT_EQ(AddChangeForForm(form2), db().AddLogin(form2));
+
+  PrimaryKeyToFormMap key_to_form_map;
+  // Check if there is exactly one form with this signon_realm & username1.
+  EXPECT_EQ(FormRetrievalResult::kSuccess,
+            db().GetLoginsBySignonRealmAndUsername(signon_realm, username1,
+                                                   key_to_form_map));
+  EXPECT_THAT(key_to_form_map,
+              testing::ElementsAre(testing::Pair(1, Pointee(form1))));
+
+  // Insert another form with the same username as form1.
+  PasswordForm form3;
+  GenerateExamplePasswordForm(&form3);
+  form3.signon_realm = signon_realm;
+  form3.username_value = username1;
+  form3.username_element = base::ASCIIToUTF16("another_element");
+  ASSERT_EQ(AddChangeForForm(form3), db().AddLogin(form3));
+
+  // Check if there are exactly two forms with given username and signon_realm.
+  EXPECT_EQ(FormRetrievalResult::kSuccess,
+            db().GetLoginsBySignonRealmAndUsername(signon_realm, username1,
+                                                   key_to_form_map));
+  EXPECT_THAT(key_to_form_map,
+              testing::ElementsAre(testing::Pair(1, Pointee(form1)),
+                                   testing::Pair(3, Pointee(form3))));
+}
+
 class LoginDatabaseForAccountStoreTest : public testing::Test {
  protected:
   void SetUp() override {
diff --git a/components/password_manager/core/browser/password_store_impl.cc b/components/password_manager/core/browser/password_store_impl.cc
index ad3f9877..99ff246 100644
--- a/components/password_manager/core/browser/password_store_impl.cc
+++ b/components/password_manager/core/browser/password_store_impl.cc
@@ -20,17 +20,12 @@
 
 // Generates PasswordStoreChangeList for affected signon_realm and username.
 PasswordStoreChangeList BuildPasswordChangeListForCompromisedCredentialUpdate(
-    PrimaryKeyToFormMap& key_to_form_map,
-    const std::string& signon_realm,
-    const base::string16& username) {
+    PrimaryKeyToFormMap key_to_form_map) {
   PasswordStoreChangeList changes;
-
+  changes.reserve(key_to_form_map.size());
   for (auto& pair : key_to_form_map) {
-    if (pair.second->username_value == username &&
-        pair.second->signon_realm == signon_realm) {
-      changes.emplace_back(PasswordStoreChange::UPDATE, std::move(*pair.second),
-                           pair.first);
-    }
+    changes.emplace_back(PasswordStoreChange::UPDATE, std::move(*pair.second),
+                         pair.first);
   }
   return changes;
 }
@@ -251,15 +246,14 @@
   }
 
   PrimaryKeyToFormMap key_to_form_map;
-  // TODO(vsemeneiuk): Replace with a function to obtain logins by signon_realm
-  // and username.
-  if (login_db_->GetAllLogins(&key_to_form_map) !=
+  if (login_db_->GetLoginsBySignonRealmAndUsername(
+          credentials.signon_realm, credentials.username, key_to_form_map) !=
       FormRetrievalResult::kSuccess) {
     return {};
   }
 
   return BuildPasswordChangeListForCompromisedCredentialUpdate(
-      key_to_form_map, credentials.signon_realm, credentials.username);
+      std::move(key_to_form_map));
 }
 
 PasswordStoreChangeList PasswordStoreImpl::RemoveCompromisedCredentialsImpl(
@@ -273,15 +267,14 @@
   }
 
   PrimaryKeyToFormMap key_to_form_map;
-  // TODO(vsemeneiuk): Replace with a function to obtain logins by signon_realm
-  // and username.
-  if (login_db_->GetAllLogins(&key_to_form_map) !=
+  if (login_db_->GetLoginsBySignonRealmAndUsername(signon_realm, username,
+                                                   key_to_form_map) !=
       FormRetrievalResult::kSuccess) {
     return {};
   }
 
   return BuildPasswordChangeListForCompromisedCredentialUpdate(
-      key_to_form_map, signon_realm, username);
+      std::move(key_to_form_map));
 }
 
 std::vector<CompromisedCredentials>
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/nfc/NfcSystemLevelSetting.java b/components/permissions/android/java/src/org/chromium/components/permissions/nfc/NfcSystemLevelSetting.java
index 4c316c3..9df6db1e3 100644
--- a/components/permissions/android/java/src/org/chromium/components/permissions/nfc/NfcSystemLevelSetting.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/nfc/NfcSystemLevelSetting.java
@@ -101,6 +101,13 @@
         sNfcSupportForTesting = enabled;
     }
 
+    /** Reset Android NFC support for testing use only. */
+    @VisibleForTesting
+    public static void resetNfcForTesting() {
+        sSystemNfcSettingForTesting = null;
+        sNfcSupportForTesting = null;
+    }
+
     @NativeMethods
     interface Natives {
         void onNfcSystemLevelPromptCompleted(long callback);
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc
index 68828c19..5f5c2d2 100644
--- a/components/permissions/permission_uma_util.cc
+++ b/components/permissions/permission_uma_util.cc
@@ -530,9 +530,10 @@
                             expanded);
 }
 
-void PermissionUmaUtil::RecordCrowdDenyIsLoadedAtAbuseCheckTime(bool loaded) {
-  base::UmaHistogramBoolean(
-      "Permissions.CrowdDeny.PreloadData.IsLoadedAtAbuseCheckTime", loaded);
+void PermissionUmaUtil::RecordCrowdDenyDelayedPushNotification(
+    base::TimeDelta delay) {
+  base::UmaHistogramTimes(
+      "Permissions.CrowdDeny.PreloadData.DelayedPushNotification", delay);
 }
 
 void PermissionUmaUtil::RecordCrowdDenyVersionAtAbuseCheckTime(
diff --git a/components/permissions/permission_uma_util.h b/components/permissions/permission_uma_util.h
index f2fe29c..9425ac7 100644
--- a/components/permissions/permission_uma_util.h
+++ b/components/permissions/permission_uma_util.h
@@ -248,7 +248,7 @@
 
   static void RecordInfobarDetailsExpanded(bool expanded);
 
-  static void RecordCrowdDenyIsLoadedAtAbuseCheckTime(bool loaded);
+  static void RecordCrowdDenyDelayedPushNotification(base::TimeDelta delay);
 
   static void RecordCrowdDenyVersionAtAbuseCheckTime(
       const base::Optional<base::Version>& version);
diff --git a/components/policy/android/BUILD.gn b/components/policy/android/BUILD.gn
index 2002798..301b826 100644
--- a/components/policy/android/BUILD.gn
+++ b/components/policy/android/BUILD.gn
@@ -41,6 +41,7 @@
     ":policy_java",
     "//base:base_java",
     "//base:base_java_test_support",
+    "//content/public/test/android:content_java_test_support",
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/junit",
   ]
diff --git a/components/policy/android/DEPS b/components/policy/android/DEPS
new file mode 100644
index 0000000..877e2a4
--- /dev/null
+++ b/components/policy/android/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+content/public/test/android",
+]
\ No newline at end of file
diff --git a/components/policy/android/java/src/org/chromium/components/policy/CombinedPolicyProvider.java b/components/policy/android/java/src/org/chromium/components/policy/CombinedPolicyProvider.java
index e66463f..56de96a 100644
--- a/components/policy/android/java/src/org/chromium/components/policy/CombinedPolicyProvider.java
+++ b/components/policy/android/java/src/org/chromium/components/policy/CombinedPolicyProvider.java
@@ -114,7 +114,7 @@
 
     @VisibleForTesting
     @CalledByNative
-    void refreshPolicies() {
+    public void refreshPolicies() {
         assert mPolicyProviders.size() == mCachedPolicies.size();
         for (int i = 0; i < mCachedPolicies.size(); ++i) {
             mCachedPolicies.set(i, null);
diff --git a/components/policy/android/javatests/src/org/chromium/components/policy/test/annotations/Policies.java b/components/policy/android/javatests/src/org/chromium/components/policy/test/annotations/Policies.java
index bfe25cb9..ffc0790 100644
--- a/components/policy/android/javatests/src/org/chromium/components/policy/test/annotations/Policies.java
+++ b/components/policy/android/javatests/src/org/chromium/components/policy/test/annotations/Policies.java
@@ -12,9 +12,12 @@
 import org.junit.Assert;
 import org.junit.runners.model.FrameworkMethod;
 
+import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.test.BaseJUnit4ClassRunner.TestHook;
 import org.chromium.components.policy.AbstractAppRestrictionsProvider;
+import org.chromium.components.policy.CombinedPolicyProvider;
 import org.chromium.components.policy.test.PolicyData;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
@@ -146,6 +149,11 @@
                 final Bundle policyBundle = PolicyData.asBundle(policyMap.values());
                 AbstractAppRestrictionsProvider.setTestRestrictions(policyBundle);
             }
+            if (LibraryLoader.getInstance().isInitialized()) {
+                // Policy refresh required to apply annotations for batched tests.
+                TestThreadUtils.runOnUiThreadBlocking(
+                        CombinedPolicyProvider.get()::refreshPolicies);
+            }
         }
     }
 }
diff --git a/components/policy/core/common/policy_map.cc b/components/policy/core/common/policy_map.cc
index f1001fc..29d270f 100644
--- a/components/policy/core/common/policy_map.cc
+++ b/components/policy/core/common/policy_map.cc
@@ -152,7 +152,7 @@
 void PolicyMap::Entry::ClearConflicts() {
   conflicts.clear();
   ClearMessage(MessageType::kInfo, IDS_POLICY_CONFLICT_SAME_VALUE);
-  ClearMessage(MessageType::kError, IDS_POLICY_CONFLICT_DIFF_VALUE);
+  ClearMessage(MessageType::kWarning, IDS_POLICY_CONFLICT_DIFF_VALUE);
 }
 
 base::string16 PolicyMap::Entry::GetLocalizedMessages(
diff --git a/components/policy/core/common/policy_service_impl_unittest.cc b/components/policy/core/common/policy_service_impl_unittest.cc
index bf6a731..1539b03 100644
--- a/components/policy/core/common/policy_service_impl_unittest.cc
+++ b/components/policy/core/common/policy_service_impl_unittest.cc
@@ -1163,8 +1163,6 @@
                           POLICY_SOURCE_MERGED, std::move(result), nullptr);
   merged.AddConflictingPolicy(entry_dict_1.DeepCopy());
   merged.AddConflictingPolicy(entry_dict_2.DeepCopy());
-  merged.AddMessage(PolicyMap::MessageType::kWarning,
-                    IDS_POLICY_CONFLICT_DIFF_VALUE);
   expected_chrome.Set(key::kExtensionSettings, std::move(merged));
 
   provider0_.UpdatePolicy(std::move(policy_bundle1));
@@ -1218,8 +1216,6 @@
                           POLICY_SOURCE_MERGED, std::move(result), nullptr);
   merged.AddConflictingPolicy(entry_list_2.DeepCopy());
   merged.AddConflictingPolicy(entry_list_1.DeepCopy());
-  merged.AddMessage(PolicyMap::MessageType::kWarning,
-                    IDS_POLICY_CONFLICT_DIFF_VALUE);
   expected_chrome.Set(key::kExtensionInstallForcelist, std::move(merged));
 
   provider0_.UpdatePolicy(std::move(policy_bundle1));
@@ -1283,8 +1279,6 @@
                           POLICY_SOURCE_MERGED, std::move(result), nullptr);
   merged.AddConflictingPolicy(entry_list_2.DeepCopy());
   merged.AddConflictingPolicy(entry_list_1.DeepCopy());
-  merged.AddMessage(PolicyMap::MessageType::kWarning,
-                    IDS_POLICY_CONFLICT_DIFF_VALUE);
   expected_chrome.Set(key::kExtensionInstallForcelist, merged.DeepCopy());
   expected_chrome.Set(key::kExtensionInstallBlocklist, std::move(merged));
   expected_chrome.Set(key::kExtensionInstallAllowlist, std::move(entry_list_3));
@@ -1352,8 +1346,6 @@
                           POLICY_SOURCE_MERGED, std::move(result), nullptr);
   merged.AddConflictingPolicy(entry_list_2.DeepCopy());
   merged.AddConflictingPolicy(entry_list_1.DeepCopy());
-  merged.AddMessage(PolicyMap::MessageType::kWarning,
-                    IDS_POLICY_CONFLICT_DIFF_VALUE);
   entry_list_3.SetIgnoredByPolicyAtomicGroup();
   expected_chrome.Set(key::kExtensionInstallForcelist, merged.DeepCopy());
   expected_chrome.Set(key::kExtensionInstallBlocklist, std::move(merged));
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index d1f037a..9e72bab 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1325,6 +1325,7 @@
 <translation id="2886969306951284125">Wenn Android-Apps laufen und die Richtlinie auf "True" gesetzt ist, werden über registrierte Geräte Android-Statusinformationen gemeldet.
 
       Ist die Richtlinie deaktiviert oder nicht konfiguriert, melden registrierte Geräte keine Android-Statusinformationen.</translation>
+<translation id="288923520817177650">Erstellen von <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-Sitzungen mit <ph name="WEBXR_API_NAME_SHORT" /> zulassen</translation>
 <translation id="2890645751406497668">Websites automatisch die Berechtigung erteilen, eine Verbindung zu USB-Geräten mit der angegebenen Anbieter-ID und Produkt-ID herzustellen.</translation>
 <translation id="2893546967669465276">Systemprotokolle an den Verwaltungsserver senden</translation>
 <translation id="2899002520262095963">Android-Apps können die über diese Richtlinie festgelegten Netzwerkkonfigurationen und CA-Zertifikate verwenden, haben jedoch keinen Zugriff auf bestimmte Konfigurationsoptionen.</translation>
@@ -1387,6 +1388,7 @@
 
       Genaue Informationen zu gültigen URL-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
 <translation id="2976429807269247880">Einstellungen für das Verhalten des alten „<ph name="ATTRIBUTE_SAMESITE_NAME" />“-Cookies</translation>
+<translation id="2981998788751314539">Fortfahren von SSL-Warnseiten auf bestimmten Websites erlauben</translation>
 <translation id="2985927503455169394">Standardmodus für das Einrichten von Assistant verwenden</translation>
 <translation id="2987155890997901449">ARC aktivieren</translation>
 <translation id="2987227569419001736">Verwendung der Web Bluetooth API steuern</translation>
@@ -1537,9 +1539,6 @@
 <translation id="3122082892722698079">Ausnahmen bei unsicheren Inhalten verwalten</translation>
 <translation id="3128072319047570212">Keygen-Einstellungen</translation>
 <translation id="3142410959002029864">Durch die Richtlinie wird der standardmäßige Duplexmodus überschrieben. Wenn der Modus nicht verfügbar ist, wird die Richtlinie ignoriert.</translation>
-<translation id="3143265893557969814">Wenn Sie diese Richtlinie konfigurieren, werden alle angegebenen Datentypen von der Synchronisierung ausgeschlossen. Dies gilt sowohl für Google Sync als auch für die Synchronisierung von Roaming-Profilen. Dadurch lässt sich die Größe von Roaming-Profilen reduzieren und Sie können einschränken, welche Arten von Daten auf die Google Sync-Server hochgeladen werden.
-
-      Aktuell werden folgende Datentypen unterstützt: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs" und "wifiConfigurations". Bei diesen Namen muss die Groß- und Kleinschreibung beachtet werden.</translation>
 <translation id="3144173889708944482">Wenn <ph name="PRINTERS_BLOCKLIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="DEVICE_PRINTERS_BLOCKLIST_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.</translation>
 <translation id="3152425128389603870">Unified Desktop verfügbar machen und standardmäßig aktivieren</translation>
 <translation id="3159375329008977062">Nutzer darf Crostini-Container über die Benutzeroberfläche exportieren/importieren</translation>
@@ -2032,6 +2031,13 @@
 <translation id="377044054160169374">Zwingende Maßnahmen bei irreführenden Inhalten</translation>
 <translation id="3778689139323007309">Widerrufsprüfung für Serverzertifikate durchführen, die erfolgreich bestätigt und von lokal installierten CA-Zertifikaten signiert wurden</translation>
 <translation id="3780152581321609624">Nicht-Standard-Port in Kerberos-SPN einschließen</translation>
+<translation id="378495749480642482">Über diese Richtlinie wird konfiguriert, ob vom Nutzer aufgerufene Websites immersive Augmented-Reality-Sitzungen mit der <ph name="WEBXR_API_NAME" /> erstellen dürfen.
+
+      Wenn die Richtlinie nicht konfiguriert oder aktiviert ist, akzeptiert die <ph name="WEBXR_API_NAME" /> <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> bei der Sitzungserstellung und ermöglicht Nutzern, Augmented-Reality-Angebote zu nutzen.
+
+      Ist diese Richtlinie deaktiviert, lehnt die <ph name="WEBXR_API_NAME" /> Anfragen zur Erstellung von Sitzungen, für die der Modus <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> festgelegt ist, ab. Bestehende <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-Sitzungen (falls vorhanden) werden nicht beendet.
+
+      Weitere Informationen zu <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-Sitzungen finden Sie in den Spezifikationen zur <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Einstellungen für die Energieverwaltung bei Inaktivität des Nutzers</translation>
 <translation id="3790085888761753785">Wenn diese Einstellung aktiviert ist, können Nutzer sich mit Smart Lock in Ihren Konten anmelden. Sie haben dann mehr Möglichkeiten als mit den üblichen Smart Lock-Einstellungen, mit denen sie lediglich ihre Bildschirme entsperren können.
 
@@ -4146,6 +4152,13 @@
       Hiermit werden die Parameter angegeben, die beim Starten von <ph name="PRODUCT_NAME" /> angewendet werden sollen. Sie gelten nur auf dem Anmeldebildschirm. Über diese Richtlinie festgelegte Parameter haben keine Auswirkungen auf Nutzersitzungen.</translation>
 <translation id="685769593149966548">Strikt eingeschränkten Modus auf YouTube erzwingen</translation>
 <translation id="686079137349561371">Microsoft Windows 7 oder höher</translation>
+<translation id="6877233375929006871">Wenn diese Richtlinie konfiguriert ist, können Sie eine Liste mit URL-Mustern erstellen, die angeben, auf welchen Seiten Nutzer Warnseiten schließen können, die in <ph name="PRODUCT_NAME" /> angezeigt werden, wenn Nutzer Websites mit SSL-Fehlern aufrufen. Auf Websites mit SSL-Fehlern, die nicht auf dieser Liste stehen, können Nutzer keine Warnseiten schließen.
+
+      Falls <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> deaktiviert ist, wird diese Richtlinie ignoriert.
+
+      Wenn die Richtlinie nicht konfiguriert ist, gilt <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> für alle Websites.
+
+      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="68818134518270542">Mit der Konfiguration der Richtlinie werden die Apps festgelegt, die Nutzer als Notizen-App auf dem Sperrbildschirm von <ph name="PRODUCT_OS_NAME" /> aktivieren können.
 
       Wenn die bevorzugte App für den Sperrbildschirm konfiguriert ist, erscheint ein UI-Element zum Starten der bevorzugten Notizen-App auf dem Bildschirm. Nach dem Starten der App wird über dem Sperrbildschirm ein Fenster eingeblendet, in das Notizen eingegeben werden können. Die App kann nach dem Entsperren Notizen in die Hauptsitzung importieren. Nur <ph name="PRODUCT_NAME" />-Notizen-Apps werden auf dem Sperrbildschirm unterstützt.
@@ -4213,6 +4226,7 @@
       Wenn die Richtlinie aktiviert ist, wird für jeden der benannten Ursprünge in einer durch Kommas getrennten Liste ein eigener Prozess ausgeführt. Dabei werden auch durch Subdomains benannte Ursprünge isoliert. Wenn Sie z. B. https://example.com/ angeben, wird auch https://foo.example.com/ als Teil der Website https://example.com/ isoliert.
       Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, werden für die Anmeldeseite die standardmäßigen Plattformeinstellungen für die Website-Isolierung verwendet.
       </translation>
+<translation id="6947587367703216074">Erstellen von <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />-Sitzungen mit <ph name="WEBXR_API_NAME_SHORT" /> verhindern</translation>
 <translation id="6949867264289339206">Wenn die Richtlinie festgelegt ist, werden Konfigurationen für gerätegebundene Unternehmensdrucker bereitgestellt. Das Format entspricht dem <ph name="PRINTERS_POLICY_NAME" />-Wörterbuch, erfordert jedoch zusätzlich ein „id“- oder „guid“-Feld pro Drucker für die Zulassungs- oder Sperrliste. Die Datei darf nicht größer als 5 MB sein und muss im JSON-Format vorliegen. Eine Datei mit ungefähr 21.000 Druckern ergibt nach dem Codieren eine Datei mit 5 MB. Die Integrität des Downloads wird anhand des kryptografischen Hashs verifiziert. Die Datei wird heruntergeladen, im Cache gespeichert und noch einmal heruntergeladen, sobald sich URL oder Hash ändern. <ph name="PRODUCT_OS_NAME" /> lädt die Datei für Druckerkonfigurationen herunter und sorgt dafür, dass die Drucker gemäß <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> und <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> verfügbar gemacht werden.
 
       Diese Richtlinie:
@@ -4453,7 +4467,7 @@
 <translation id="7234280155140786597">Namen der unzulässigen Hosts für natives Messaging (oder "*" für alle)</translation>
 <translation id="7246767840750730334">Aktivieren von Phone Hub-Benachrichtigungen zulassen.</translation>
 <translation id="7249828445670652637"><ph name="PRODUCT_OS_NAME" />-CA-Zertifikate für ARC-Apps aktivieren</translation>
-<translation id="7252681704926980614">Damit werden Nutzer- und Dateiname bei jedem Druckauftrag an den nativen Druckerserver gesendet. Standardmäßig werden die Namen nicht gesendet.
+<translation id="7252681704926980614">Damit werden Nutzer- und Dateiname bei jedem Druckauftrag an den nativen Druckserver gesendet. Standardmäßig werden die Namen nicht gesendet.
 
       Wenn diese Richtlinie auf "true" gesetzt ist, werden Drucker deaktiviert, die andere Protokolle als IPPS, USB oder IPP über USB verwenden. Dies liegt daran, dass Nutzername und Dateiname nicht offen über das Netzwerk gesendet werden sollten.</translation>
 <translation id="7257092058788772055">Ist die Richtlinie konfiguriert, wird die standardmäßige Startseiten-URL in <ph name="PRODUCT_NAME" /> festgelegt. Die Startseite wird über die Startbildschirmtaste geöffnet. Auf dem Computer werden die Seiten, die beim Hochfahren geöffnet werden, über die Richtlinien <ph name="RESTORE_ON_STARTUP_POLICY_NAME" /> gesteuert.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 81c5a81..42462b77 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1356,6 +1356,7 @@
 <translation id="2886969306951284125">Si habilitas el dispositivo para ejecutar apps para Android y estableces la política como verdadera, los dispositivos inscritos informarán sobre el estado de Android.
 
       Si inhabilitas la política o no la estableces, los dispositivos inscritos no informarán sobre el estado de Android.</translation>
+<translation id="288923520817177650">Permite crear sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Otorgar permiso automáticamente a estos sitios para conectarse a dispositivos USB con los ID de producto y proveedor correspondientes</translation>
 <translation id="2893546967669465276">Enviar registros del sistema al servidor de administración</translation>
 <translation id="2899002520262095963">A través de esta política, las apps de Android pueden usar la configuración de red y los Certificados de CA, pero no tienen acceso a algunas opciones de configuración.</translation>
@@ -1569,9 +1570,6 @@
 <translation id="3122082892722698079">Controla el uso de excepciones de contenido no seguro</translation>
 <translation id="3128072319047570212">Configuración de keygen</translation>
 <translation id="3142410959002029864">Si estableces la política, se anulará el modo predeterminado de impresión doble. Si el modo no está disponible, se ignorará esta política.</translation>
-<translation id="3143265893557969814">Si estableces esta política, se excluirán todos los tipos de datos especificados de la sincronización para Google Sync y de la sincronización de perfiles en roaming. Es política puede ayudar a reducir el tamaño del perfil en roaming o limitar los tipos de datos que se suben a los servidores de Google Sync.
-
-      Los tipos de datos actuales para esta política son los siguientes: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs" y "wifiConfigurations". Estos nombres distinguen entre mayúsculas y minúsculas.</translation>
 <translation id="3144173889708944482">Si eliges <ph name="PRINTERS_BLOCKLIST" /> para <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, la configuración de <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> especificará las impresoras que no podrán utilizar los usuarios. Los usuarios podrán acceder a todas las impresoras, excepto aquellas con los ID mencionados en esta política. Los ID deben coincidir con los valores de los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> en el archivo que se especifica en <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Habilitar el modo de escritorio unificado y activarlo de forma predeterminada</translation>
 <translation id="3159375329008977062">El usuario está habilitado para exportar o importar contenedores de Crostini mediante la IU</translation>
@@ -2061,6 +2059,13 @@
 <translation id="377044054160169374">Intervención ante experiencias abusivas</translation>
 <translation id="3778689139323007309">Comprueba la revocación de los certificados del servidor validados correctamente y firmados por certificados de CA instalados de manera local</translation>
 <translation id="3780152581321609624">Incluir puerto no estándar en el SPN de Kerberos</translation>
+<translation id="378495749480642482">Determina si los sitios que visita el usuario pueden crear sesiones de realidad aumentada inmersiva mediante la <ph name="WEBXR_API_NAME" />.
+
+      Si no estableces esta política o la habilitas, la <ph name="WEBXR_API_NAME" /> aceptará <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> durante la creación de sesiones. De esta manera, los usuarios podrán disfrutar de experiencias de realidad aumentada.
+
+      Si inhabilitas la política, la <ph name="WEBXR_API_NAME" /> rechazará las solicitudes para crear sesiones con el modo establecido en <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. No se finalizarán las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> existentes (en caso de haberlas).
+
+      Para obtener más información sobre las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la especificación de la <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Configuración de la administración de energía cuando el usuario está inactivo</translation>
 <translation id="3790085888761753785">Si se habilita esta configuración, los usuarios podrán acceder a sus cuentas mediante Smart Lock. Este método es más permisivo que el comportamiento normal de Smart Lock, que solo permite a los usuarios desbloquear las pantallas.
 
@@ -4245,6 +4250,7 @@
       Esta política se aplica a la pantalla de acceso. Consulta también la política <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, que se aplica a la sesión de usuario.
       Si habilitas la política, cada origen designado en una lista de elementos separados por comas se ejecutará en su propio proceso. Esta acción también aislará los orígenes designados mediante subdominios; p. ej., al especificar https://example.com/, también se aislará https://foo.example.com/ como parte del sitio https://example.com/.
       Si inhabilitas la política o no la estableces, se usará la configuración predeterminada de aislamiento de sitios de la plataforma para la pantalla de acceso.</translation>
+<translation id="6947587367703216074">Impide crear sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Si estableces la política, se proporcionan configuraciones para las impresoras empresariales vinculadas a dispositivos. Su formato coincide con el diccionario de <ph name="PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" obligatorio adicional para cada impresora para la lista de impresoras permitidas o bloqueadas. El tamaño del archivo no puede superar los 5 MB y está en formato JSON (un archivo de ese tamaño contiene aproximadamente 21,000 impresoras). El hash criptográfico permite verificar la integridad de la descarga. Cada vez que cambie la URL o el hash, se descargará el archivo, se almacenará en caché y se volverá a descargar. <ph name="PRODUCT_OS_NAME" /> descargará el archivo para las configuraciones de impresoras y hará que las impresoras estén disponibles junto con <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> y <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Esta política:
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 06e9b8f..d89fb2e20 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -1362,6 +1362,7 @@
 <translation id="2886969306951284125">Si se habilitan las aplicaciones Android y se asigna el valor "True" a esta política, los dispositivos registrados informarán sobre el estado de Android.
 
       Si se inhabilita la política o no se establece, los dispositivos registrados no informarán sobre el estado de Android.</translation>
+<translation id="288923520817177650">Permitir la creación de sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Conceder permiso automáticamente a estos sitios web para conectarse a dispositivos USB con los ID de proveedor y producto facilitados.</translation>
 <translation id="2893546967669465276">Enviar los registros del sistema al servidor de administración</translation>
 <translation id="2899002520262095963">Las aplicaciones para Android pueden utilizar los ajustes de red y los certificados de CA configurados mediante esta política, pero no tienen acceso a algunas opciones de configuración.</translation>
@@ -1575,9 +1576,6 @@
 <translation id="3122082892722698079">Permite controlar el uso de las excepciones de contenido no seguro</translation>
 <translation id="3128072319047570212">Configuración del generador de claves</translation>
 <translation id="3142410959002029864">Si se establece esta política, se anula el modo predeterminado de impresión por las dos caras. Si el modo no está disponible, se ignorará esta política.</translation>
-<translation id="3143265893557969814">Si se establece esta política, todos los tipos de datos especificados se excluirán de la sincronización de Google Sync y de la sincronización del perfil de itinerancia. Esto puede ser útil para reducir el tamaño del perfil de itinerancia o para limitar el tipo de datos que se suben a los servidores de Google Sync.
-
-      Los tipos de datos actuales para esta política son los siguientes: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs" y "wifiConfigurations". Estos nombres distinguen entre mayúsculas y minúsculas.</translation>
 <translation id="3144173889708944482">Si se utiliza <ph name="PRINTERS_BLOCKLIST" /> para la política <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, al establecer la política <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />, esta especifica qué impresoras no pueden utilizar los usuarios. Los usuarios podrán utilizar todas las impresoras, excepto aquellas con los ID indicados en la política. Los ID deben coincidir con los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del archivo definido en la política <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Habilitar el escritorio unificado y activarlo de forma predeterminada</translation>
 <translation id="3159375329008977062">El usuario tiene permiso para exportar e importar contenedores Crostini a través de la UI</translation>
@@ -2070,6 +2068,13 @@
 <translation id="377044054160169374">Aplicar intervención de experiencia abusiva</translation>
 <translation id="3778689139323007309">Realizar comprobaciones de revocación de los certificados del servidor validados correctamente y firmados por certificados AC instalados localmente</translation>
 <translation id="3780152581321609624">Incluir un puerto no estándar en SPN de Kerberos</translation>
+<translation id="378495749480642482">Configura si los sitios a los que accede el usuario tienen permiso para crear sesiones de realidad aumentada inmersiva usando <ph name="WEBXR_API_NAME" />.
+
+      Si se habilita esta política o no se le asigna ningún valor, <ph name="WEBXR_API_NAME" /> aceptará el valor <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> durante la creación de la sesión, lo que permitirá a los usuarios disfrutar de experiencias de realidad aumentada.
+
+      Si se inhabilita esta política, <ph name="WEBXR_API_NAME" /> rechazará las solicitudes para crear sesiones con el modo <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> ya creadas (si las hay) no finalizarán.
+
+      Para obtener más información sobre las sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la especificación de <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Configuración de la administración de energía cuando el usuario está inactivo</translation>
 <translation id="3790085888761753785">Si este ajuste está habilitado, los usuarios pueden iniciar sesión en su cuenta con Smart Lock. Es más permisivo que el funcionamiento habitual de Smart Lock, que solo permite a los usuarios desbloquear la pantalla.
 
@@ -4259,6 +4264,7 @@
       Si se habilita esta política, cada origen especificado en una lista separada por comas se ejecutará en un proceso propio. También se aislarán los orígenes de los subdominios correspondientes (por ejemplo, especificar https://example.com/ aísla https://foo.example.com/ como parte del sitio web https://example.com/).
       Si esta política no se configura o se inhabilita, se utilizarán los ajustes predeterminados de aislamiento de sitios web de la plataforma para la pantalla de inicio de sesión.
       </translation>
+<translation id="6947587367703216074">Evitar la creación de sesiones <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Si se establece esta política, proporciona opciones de configuración para impresoras de empresa vinculadas a dispositivos. Su formato es el mismo que el del diccionario <ph name="PRINTERS_POLICY_NAME" />, con un campo id o guid obligatorio por impresora para incluirla en una lista de permitidas o bloqueadas. El tamaño del archivo no debe exceder los 5 MB y debe estar en formato JSON. El tamaño de un archivo que contiene unas 21.000 impresoras es de 5 MB. El hash criptográfico ayuda a comprobar la integridad de la descarga. Si se cambia la URL o el hash, el archivo se descarga, se almacena en caché y se vuelve a descargar. <ph name="PRODUCT_OS_NAME" /> descarga el archivo con las configuraciones de las impresoras y estas están disponibles según lo especificado en las políticas <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> y <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Esta política tiene las siguientes características:
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 44699b7..3ab10d2 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1359,6 +1359,7 @@
 <translation id="2886969306951284125">Si les appareils enregistrés sont compatibles avec les applications Android et que cette règle est définie sur "True", ils communiquent des informations sur l'état d'Android.
 
       Si cette règle est désactivée ou qu'elle n'est pas configurée, les appareils enregistrés ne communiquent pas ces informations.</translation>
+<translation id="288923520817177650">Autoriser la création des sessions <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> de <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Autoriser automatiquement ces sites à se connecter à des appareils USB correspondant au fournisseur et aux ID de produit indiqués.</translation>
 <translation id="2893546967669465276">Envoyer des journaux système au serveur de gestion</translation>
 <translation id="2899002520262095963">Les applications Android peuvent utiliser les configurations réseau et les certificats CA définis par cette règle, mais elles n'ont pas accès à certaines options de configuration.</translation>
@@ -1421,6 +1422,7 @@
 
       Pour en savoir plus sur les formats d'URL valides, consultez cette page : https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation>
 <translation id="2976429807269247880">Paramètres du comportement vis-à-vis des anciens cookies <ph name="ATTRIBUTE_SAMESITE_NAME" /></translation>
+<translation id="2981998788751314539">Autoriser l'accès au site malgré l'affichage d'une page d'avertissement SSL</translation>
 <translation id="2985927503455169394">Utiliser le mode par défaut du processus de prise en main de l'Assistant</translation>
 <translation id="2987155890997901449">Activer ARC</translation>
 <translation id="2987227569419001736">Contrôler l'utilisation de l'API Web Bluetooth</translation>
@@ -1571,9 +1573,6 @@
 <translation id="3122082892722698079">Contrôler l'utilisation des exceptions liées au contenu non sécurisé</translation>
 <translation id="3128072319047570212">Paramètres de keygen</translation>
 <translation id="3142410959002029864">Lorsque cette règle est définie, le mode d'impression recto verso par défaut est ignoré. Si le mode est indisponible, cette règle est ignorée.</translation>
-<translation id="3143265893557969814">Si cette règle est configurée, tous les types de données spécifiés ne seront pas synchronisés avec Google Sync ni avec le profil itinérant. Cela peut permettre de réduire la taille du profil itinérant ou de limiter les types de données importés sur les serveurs Google Sync.
-
-      Les types de données actuels pour cette règle sont les suivants : "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs" et "wifiConfigurations". Ces noms sont sensibles à la casse.</translation>
 <translation id="3144173889708944482">Si <ph name="PRINTERS_BLOCKLIST" /> est choisi pour <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, le fait de définir <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> indique les imprimantes indisponibles pour les utilisateurs. Toutes les imprimantes sont proposées aux utilisateurs, sauf celles dont les ID sont répertoriés dans cette règle. Ces ID doivent correspondre à ceux indiqués dans les champs <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> du fichier spécifié dans la règle <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Rendre le mode bureau unifié disponible et l'activer par défaut</translation>
 <translation id="3159375329008977062">L'utilisateur est autorisé à exporter/importer des conteneurs Crostini via l'UI</translation>
@@ -2060,6 +2059,13 @@
 <translation id="377044054160169374">Application de l'intervention en cas d'expérience abusive</translation>
 <translation id="3778689139323007309">Procéder à des vérifications de la révocation des certificats de serveur qui sont validés et signés par des certificats CA installés localement</translation>
 <translation id="3780152581321609624">Inclure un port non standard dans le SPN Kerberos</translation>
+<translation id="378495749480642482">Configure si les sites auxquels l'utilisateur accède sont autorisés à créer des sessions de réalité augmentée immersive avec <ph name="WEBXR_API_NAME" />.
+
+      Si cette règle n'est pas configurée ou qu'elle est activée, <ph name="WEBXR_API_NAME" /> accepte <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> lors de la création de sessions. Ceci permet aux utilisateurs d'accéder aux expériences de réalité augmentée.
+
+      Si cette règle est désactivée, <ph name="WEBXR_API_NAME" /> refuse les demandes de création de sessions avec le mode défini sur <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Les sessions <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> (le cas échéant) ne prendront pas fin.
+
+      Pour en savoir plus sur les sessions <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, veuillez consulter la spécification<ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Paramètres de gestion de l'alimentation en cas d'inactivité de l'utilisateur</translation>
 <translation id="3790085888761753785">Si ce paramètre est activé, les utilisateurs seront autorisés à se connecter à leur compte avec Smart Lock. Ce paramètre est plus permissif que le comportement normal de Smart Lock qui permet seulement aux utilisateurs de déverrouiller leur écran.
 
@@ -4173,6 +4179,13 @@
       Spécifie les indicateurs à appliquer à <ph name="PRODUCT_NAME" /> au démarrage. Ceux-ci ne sont appliqués que sur l'écran de connexion. Les indicateurs définis par cette règle ne sont pas répercutés dans les sessions utilisateur.</translation>
 <translation id="685769593149966548">Appliquer le mode restreint strict sur YouTube</translation>
 <translation id="686079137349561371">Microsoft Windows 7 ou version ultérieure</translation>
+<translation id="6877233375929006871">Cette règle permet de dresser une liste de formats d'URL afin d'autoriser les utilisateurs qui arrivent sur les sites concernés à passer les pages d'avertissement affichées par <ph name="PRODUCT_NAME" /> en cas d'erreur SSL. Les utilisateurs ne pourront pas passer les pages d'avertissement SSL des sites qui ne figurent pas dans cette liste.
+
+      Si la règle <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> est désactivée, cette règle n'a aucun effet.
+
+      Si cette règle n'est pas configurée, la règle <ph name="SSL_ERROR_OVERRIDE_ALLOWED_POLICY_NAME" /> s'applique pour tous les sites.
+
+      Pour en savoir plus sur les formats <ph name="URL_LABEL" /> valides, consultez la page https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. La valeur <ph name="WILDCARD_VALUE" /> n'est pas acceptée pour cette règle.</translation>
 <translation id="68818134518270542">Permet de spécifier les applications que les utilisateurs peuvent activer comme applications de prise de notes sur l'écran de verrouillage <ph name="PRODUCT_OS_NAME" />.
 
       Si l'application de prise de notes préférée est activée sur l'écran de verrouillage, un élément d'interface utilisateur destiné à la lancer s'affiche à l'écran. Une fois démarrée, l'application peut ouvrir une fenêtre au-dessus de l'écran de verrouillage et créer des notes dans ce contexte. L'application peut importer les notes créées dans la session de l'utilisateur principal (lorsque la session est déverrouillée). Seules les applications de prise de notes <ph name="PRODUCT_NAME" /> sont acceptées sur l'écran de verrouillage.
@@ -4240,6 +4253,7 @@
       Si la présente règle est activée, chacune des origines identifiées figurant dans une liste d'éléments séparés par une virgule exécute son propre processus. Elle isole également ces origines par sous-domaines. Par exemple, si vous indiquez https://example.com/, https://foo.example.com/ est aussi isolé en tant que partie du site https://example.com/.
       Si cette règle n'est pas configurée ou si elle est désactivée, les paramètres par défaut d'isolation de sites de la plate-forme sont utilisés pour l'écran de connexion.
       </translation>
+<translation id="6947587367703216074">Empêcher la création de sessions <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">La définition de cette règle fournit les configurations des imprimantes d'entreprise associées à des appareils. Son format correspond au dictionnaire <ph name="PRINTERS_POLICY_NAME" />, avec un champ supplémentaire "id" ou "guid" obligatoire pour chaque imprimante à ajouter à la liste d'autorisation ou à la liste de refus. Le fichier est au format JSON et sa taille ne peut pas dépasser 5 Mo. Un fichier encodé de 5 Mo peut contenir environ 21 000 imprimantes. Le hachage cryptographique permet de valider l'intégrité du téléchargement. Le fichier est téléchargé, mis en cache, puis téléchargé à nouveau à chaque modification de l'URL ou du hachage. <ph name="PRODUCT_OS_NAME" /> télécharge le fichier des configurations d'imprimante et rend les imprimantes accessibles avec <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> et <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Cette règle :
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index e84ae5a..a7097ac9 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -1362,6 +1362,7 @@
 <translation id="2886969306951284125">Jika aplikasi Android aktif, menyetel kebijakan ke Benar (True) akan membuat perangkat yang terdaftar melaporkan informasi status Android.
 
       Jika kebijakan disetel ke Nonaktif atau tidak disetel, perangkat yang terdaftar tidak akan melaporkan informasi status Android</translation>
+<translation id="288923520817177650">Izinkan pembuatan sesi <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Otomatis berikan izin ke situs ini untuk terhubung ke perangkat USB dengan ID produk dan vendor yang ditentukan.</translation>
 <translation id="2893546967669465276">Mengirim log sistem ke server pengelolaan</translation>
 <translation id="2899002520262095963">Aplikasi Android dapat menggunakan konfigurasi jaringan dan sertifikat CA yang disetel melalui kebijakan ini, namun tidak memiliki akses ke beberapa opsi konfigurasi.</translation>
@@ -1575,9 +1576,6 @@
 <translation id="3122082892722698079">Mengontrol penggunaan pengecualian konten tidak aman</translation>
 <translation id="3128072319047570212">Setelan keygen</translation>
 <translation id="3142410959002029864">Jika kebijakan disetel, mode dupleks persentase cetakan default akan ditimpa. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan.</translation>
-<translation id="3143265893557969814">Jika kebijakan ini disetel, semua jenis data yang ditentukan akan dikecualikan dari sinkronisasi, baik untuk Google Sync maupun sinkronisasi profil roaming. Hal ini berguna untuk mengurangi ukuran profil roaming atau membatasi jenis data yang diupload ke Server Google Sync.
-
-      Jenis data saat ini untuk kebijakan ini adalah: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Nama-nama tersebut peka huruf besar atau kecil.</translation>
 <translation id="3144173889708944482">Jika <ph name="PRINTERS_BLOCKLIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, menyetel <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> akan menentukan printer yang tidak dapat digunakan oleh pengguna. Semua printer diberikan kepada pengguna kecuali ID yang tercantum dalam kebijakan ini. ID harus sesuai dengan kolom <ph name="ID_FIELD" /> atau <ph name="GUID_FIELD" /> dalam file yang ditentukan di <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Membuat Desktop Terpadu tersedia dan aktif secara default</translation>
 <translation id="3159375329008977062">Pengguna diaktifkan untuk mengekspor/mengimpor container Crostini melalui UI</translation>
@@ -2070,6 +2068,13 @@
 <translation id="377044054160169374">Penerapan Pencegahan Pengalaman yang Menyinggung</translation>
 <translation id="3778689139323007309">Lakukan pemeriksaan pembatalan sertifikat server yang berhasil divalidasi yang ditandatangani oleh sertifikat CA yang diinstal secara lokal</translation>
 <translation id="3780152581321609624">Sertakan port non-standar di SPN Kerberos</translation>
+<translation id="378495749480642482">Mengonfigurasi apakah situs yang dibuka pengguna akan diizinkan untuk membuat sesi Augmented Reality yang imersif menggunakan <ph name="WEBXR_API_NAME" />.
+
+      Jika kebijakan ini diaktifkan atau tidak disetel, <ph name="WEBXR_API_NAME" /> akan menerima <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> selama pembuatan sesi, sehingga memungkinkan pengguna merasakan pengalaman Augmented Reality.
+
+      Jika kebijakan dinonaktifkan, <ph name="WEBXR_API_NAME" /> akan menolak permintaan pembuatan sesi dengan mode yang disetel ke <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Sesi <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> yang sudah ada (jika ada) tidak akan dihentikan.
+
+      Untuk detail selengkapnya tentang sesi <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, lihat spesifikasi <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Setelan pengelolaan daya saat pengguna sedang menganggur</translation>
 <translation id="3790085888761753785">Jika setelan ini diaktifkan, pengguna akan diizinkan untuk login ke akunnya dengan Smart Lock. Setelan ini lebih longgar dibandingkan perilaku Smart Lock biasa yang hanya mengizinkan pengguna membuka kunci layarnya.
 
@@ -4259,6 +4264,7 @@
       Jika kebijakan diaktifkan, setiap asal bernama dalam daftar yang dipisahkan koma akan dijalankan dalam prosesnya sendiri. Hal ini juga akan mengisolasi asal yang diberi nama berdasarkan subdomain; mis. menentukan https://example.com/ juga akan menyebabkan https://foo.example.com/ diisolasi sebagai bagian dari situs https://example.com/.
       Jika kebijakan dinonaktifkan atau tidak dikonfigurasi, setelan isolasi situs default platform akan digunakan untuk layar login.
       </translation>
+<translation id="6947587367703216074">Cegah pembuatan sesi <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Jika kebijakan disetel, konfigurasi untuk printer perusahaan yang terikat ke perangkat akan tersedia. Jika formatnya cocok dengan kamus <ph name="PRINTERS_POLICY_NAME" />, dengan tambahan kolom "id" atau "guid" yang diperlukan agar setiap printer dapat mengizinkan atau menolak daftar. Ukuran file tidak boleh lebih dari 5 MB dan dalam format JSON. File yang berisi sekitar 21.000 printer dienkode sebagai file 5 MB. Hash kriptografi membantu memverifikasi integritas download. File didownload, disimpan dalam cache, dan didownload ulang ketika URL atau hash berubah. <ph name="PRODUCT_OS_NAME" /> mendownload file untuk konfigurasi printer dan menyediakan printer beserta <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />, dan <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Kebijakan ini:
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 9eb112f..c23c6d65 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -1344,6 +1344,7 @@
 <translation id="2886969306951284125">Se le app Android sono attive e il criterio viene impostato su Vero, i dispositivi registrati segnalano informazioni sullo stato di Android.
 
       Se il criterio viene impostato su Disattivato o se non viene configurato, i dispositivi registrati non segnalano informazioni sullo stato di Android.</translation>
+<translation id="288923520817177650">È consentita la creazione di sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> di <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Concede automaticamente a questi siti l'autorizzazione a connettersi a dispositivi USB usando gli ID fornitore e prodotto forniti.</translation>
 <translation id="2893546967669465276">Consente di inviare log di sistema al server di gestione</translation>
 <translation id="2899002520262095963">Le app Android possono utilizzare le configurazioni di rete e i certificati CA impostati tramite questa norma ma non hanno accesso ad alcune opzioni di configurazione.</translation>
@@ -1557,9 +1558,6 @@
 <translation id="3122082892722698079">Controlla l'utilizzo delle eccezioni per i contenuti non sicuri</translation>
 <translation id="3128072319047570212">Impostazioni keygen</translation>
 <translation id="3142410959002029864">La configurazione di questo criterio consente di sostituire la modalità di stampa fronte/retro predefinita. Se la modalità non è disponibile, questo criterio viene ignorato.</translation>
-<translation id="3143265893557969814">Se questo criterio viene impostato, tutti i tipi di dati specificati verranno esclusi dalla sincronizzazione sia per Google Sync sia per la sincronizzazione del profilo di roaming. Questa operazione può essere utile per ridurre le dimensioni del profilo di roaming o per limitare il tipo di dati caricati sui server di Google Sync.
-
-      Attualmente i tipi di dati per questo criterio sono: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Per tali nomi viene fatta distinzione tra maiuscole e minuscole.</translation>
 <translation id="3144173889708944482">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLOCKLIST" />, la configurazione del criterio <ph name="DEVICE_PRINTERS_BLOCKLIST_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" />.</translation>
 <translation id="3152425128389603870">Rendi disponibile la modalità Desktop unificato e attivala per impostazione predefinita</translation>
 <translation id="3159375329008977062">L'utente è abilitato a importare/esportare contenitori Crostini tramite l'interfaccia</translation>
@@ -2049,6 +2047,13 @@
 <translation id="377044054160169374">Applicazione dell'intervento in caso di esperienza intrusiva</translation>
 <translation id="3778689139323007309">Esegui i controlli delle revoche per i certificati dei server che vengono convalidati correttamente e firmati tramite certificati CA installati localmente</translation>
 <translation id="3780152581321609624">Includi porta non standard in Kerberos SPN</translation>
+<translation id="378495749480642482">Consente di stabilire se i siti visitati dagli utenti possono creare sessioni di realtà aumentata immersive usando <ph name="WEBXR_API_NAME" />.
+
+      Se questo criterio non viene configurato o se viene attivato, <ph name="WEBXR_API_NAME" /> accetterà <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> durante la creazione delle sessioni, consentendo così agli utenti di vivere esperienze di realtà aumentata.
+
+      Se questo criterio viene disattivato, <ph name="WEBXR_API_NAME" /> rifiuterà le richieste di creazione di sessioni con la modalità <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Le sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> esistenti (se presenti) non verranno chiuse.
+
+      Per ulteriori informazioni sulle sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, consulta la specifica <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Impostazioni di gestione dell'alimentazione quando l'utente diventa inattivo</translation>
 <translation id="3790085888761753785">Se questa impostazione viene attivata, gli utenti potranno accedere ai propri account con Smart Lock. Questa impostazione è più permissiva rispetto al normale comportamento di Smart Lock che consente agli utenti soltanto di sbloccare lo schermo.
 
@@ -4238,6 +4243,7 @@
       Se il criterio è attivato, ciascuna delle origini denominate all'interno di un elenco separato da virgole viene eseguita nel proprio processo. In questo modo, si isolano anche le origini indicate dai sottodomini; ad esempio specificando https://example.com/ si isola anche https://foo.example.com/, perché fa parte del sito https://example.com/.
       Se il criterio non è configurato o è disattivato, per la schermata di accesso vengono utilizzate le impostazioni di isolamento dei siti predefinite della piattaforma.
       </translation>
+<translation id="6947587367703216074">Non è consentita la creazione di sessioni <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> di <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">La configurazione del criterio consente di specificare le configurazioni delle stampanti aziendali associate ai dispositivi. Il formato corrisponde a quello del dizionario <ph name="PRINTERS_POLICY_NAME" />, con un campo "id" o "guid" aggiuntivo obbligatorio per ogni stampante ai fini dell'inserimento in una lista consentita o in una lista bloccata. Le dimensioni del file non possono superare i 5 MB e il formato deve essere JSON. Un file con circa 21.000 stampanti viene codificato come file di 5 MB. L'hash di crittografia consente di verificare l'integrità del download. Il file viene scaricato, memorizzato nella cache e riscaricato ogni volta che l'URL o l'hash cambiano. <ph name="PRODUCT_OS_NAME" /> scarica il file per le configurazioni delle stampanti e rende disponibili le stampanti in base ai criteri <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> e <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Questo criterio:
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index b1af070..67b9873 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1544,9 +1544,6 @@
 <translation id="3122082892722698079">安全でないコンテンツの例外の使用を管理する</translation>
 <translation id="3128072319047570212">keygen の設定</translation>
 <translation id="3142410959002029864">このポリシーでは、デフォルトの両面印刷モードをオーバーライドできます。このモードを使用できない場合、このポリシーは無視されます。</translation>
-<translation id="3143265893557969814">このポリシーを設定した場合、指定したすべてのデータタイプが Google Sync とローミング プロファイルの同期から除外されます。これにより、ローミング プロファイルのサイズを抑えたり、Google Sync サーバーにアップロードされるデータのタイプを制限したりできます。
-
-      現在、このポリシーで指定できるデータタイプは次のとおりです("bookmarks"、"preferences"、"passwords"、"autofill"、"themes"、"typedUrls"、"extensions"、"apps"、"tabs"、"wifiConfigurations")。データタイプの名前では大文字と小文字が区別されます。</translation>
 <translation id="3144173889708944482"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> の値に <ph name="PRINTERS_BLOCKLIST" /> が選択されている場合、<ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> でユーザーが使用できないプリンタを指定できます。ユーザーは、このポリシーで指定されている ID 以外のすべてのプリンタを使用できます。この ID は、<ph name="DEVICE_PRINTERS_POLICY_NAME" /> で指定されたファイル内の「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドに対応している必要があります。</translation>
 <translation id="3152425128389603870">統合デスクトップを使用可能にし、デフォルトで有効にする</translation>
 <translation id="3159375329008977062">ユーザーは UI から Crostini コンテナを書き出しおよび読み込みできます</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index f293cea..effde32 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1359,6 +1359,7 @@
 <translation id="2886969306951284125">Android 앱이 사용 설정되어 있을 때 정책을 True로 설정하면 등록된 기기에서 Android 상태 정보를 보고합니다.
 
       정책을 사용 중지하거나 설정하지 않으면 등록된 기기에서 Android 상태 정보를 보고하지 않습니다.</translation>
+<translation id="288923520817177650"><ph name="WEBXR_API_NAME_SHORT" />의 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 세션 생성 허용</translation>
 <translation id="2890645751406497668">다음 사이트가 주어진 공급업체 및 제품 ID를 사용해 USB 기기에 연결할 수 있는 권한을 자동으로 부여합니다.</translation>
 <translation id="2893546967669465276">시스템 로그를 관리 서버로 전송합니다.</translation>
 <translation id="2899002520262095963">Android 앱은 이 정책을 통해 설정된 네트워크 구성 및 CA 인증서를 사용할 수 있지만 일부 구성 옵션에는 액세스할 권한이 없습니다.</translation>
@@ -1572,9 +1573,6 @@
 <translation id="3122082892722698079">안전하지 않은 콘텐츠 예외 사용 제어</translation>
 <translation id="3128072319047570212">키 생성기 설정</translation>
 <translation id="3142410959002029864">정책을 설정하면 기본 양면 인쇄 모드가 재정의됩니다. 이 모드를 사용할 수 없는 경우 정책은 무시됩니다.</translation>
-<translation id="3143265893557969814">정책이 설정되면 지정된 모든 데이터 유형이 Google 동기화와 로밍 프로필 동기화 모두에서 제외됩니다. 이렇게 하면 로밍 프로필의 크기를 줄이거나 Google 동기화 서버에 업로드되는 데이터의 유형을 제한하는 데 도움이 될 수 있습니다.
-
-      이 정책의 현재 데이터 유형은 'bookmarks', 'preferences', 'passwords', 'autofill', 'themes', 'typedUrls', 'extensions', 'apps', 'tabs', 'wifiConfigurations'입니다. 이름은 대소문자를 구분합니다.</translation>
 <translation id="3144173889708944482"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_BLOCKLIST" />을 선택할 경우 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 없는 프린터가 지정됩니다. ID가 이 정책에 명시된 프린터를 제외한 모든 프린터가 사용자에게 제공됩니다. ID는 <ph name="DEVICE_PRINTERS_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.</translation>
 <translation id="3152425128389603870">통합 바탕화면을 기본적으로 허용하고 사용 설정합니다.</translation>
 <translation id="3159375329008977062">사용자가 UI를 통해 Crostini 컨테이너를 내보내고 가져올 수 있음</translation>
@@ -2064,6 +2062,13 @@
 <translation id="377044054160169374">악의적 사용자 환경 개입 시행</translation>
 <translation id="3778689139323007309">로컬에 설치된 CA 인증서로 서명했으며 유효성이 검증된 서버 인증서 폐기 확인 검사 실행</translation>
 <translation id="3780152581321609624">Kerberos SPN에 비표준 포트 포함</translation>
+<translation id="378495749480642482">사용자가 탐색하는 사이트에서 <ph name="WEBXR_API_NAME" />를 사용하여 몰입형 증강 현실 세션을 생성할 수 있는지 선택합니다.
+
+      정책을 설정하지 않거나 사용 설정하면 <ph name="WEBXR_API_NAME" />에서 세션 생성 중에 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />을 허용하므로 사용자가 증강 현실 환경에 진입할 수 있습니다.
+
+      사용 중지하면 <ph name="WEBXR_API_NAME" />에서 모드가 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />로 설정된 세션 생성 요청을 거부합니다. 기존의 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 세션이 있다면 종료되지 않습니다.
+
+      <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 세션에 관한 자세한 정보는 <ph name="WEBXR_AR_MODULE_API_NAME" /> 사양에서 확인하세요.</translation>
 <translation id="3788662722837364290">사용자가 유휴 상태가 될 때 전원 관리 설정</translation>
 <translation id="3790085888761753785">이 설정을 사용하면 사용자가 Smart Lock을 사용하여 자신의 계정에 로그인할 수 있습니다. 사용자의 화면 잠금 해제만 허용하는 Smart Lock의 일반적인 행동에 비해 더 많은 권한을 허용합니다.
 
@@ -4255,6 +4260,7 @@
       정책을 사용 설정하면 쉼표로 구분된 목록에서 이름이 지정된 각 출처는 자체 프로세스로 동작합니다. 또한 하위 도메인으로 이름이 지정된 출처도 격리됩니다. 예를 들어 https://example.com/을 지정하면 https://foo.example.com/도 https://example.com/ 사이트의 일부로 격리됩니다.
       정책을 구성하지 않거나 사용 중지하면 로그인 화면에서 플랫폼 기본 사이트 격리 설정이 사용됩니다.
       </translation>
+<translation id="6947587367703216074"><ph name="WEBXR_API_NAME_SHORT" />의 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 세션 생성 차단</translation>
 <translation id="6949867264289339206">정책을 설정하면 기기에 연결된 회사 프린터의 설정이 제공됩니다. 형식은 <ph name="PRINTERS_POLICY_NAME" /> 사전과 일치하며 허용 목록 또는 차단 목록을 사용하려면 프린터마다 'id' 또는 'guid' 필드가 추가로 필요합니다. 파일 크기는 5MB를 초과할 수 없으며 JSON 형식입니다. 약 21,000대의 프린터가 포함된 파일은 5MB 크기의 파일로 인코딩됩니다. 암호화 해시로 다운로드 파일의 무결성을 확인할 수 있습니다. 파일이 다운로드되고 캐시되며 이후 URL 또는 해시가 변경되면 다시 다운로드됩니다. <ph name="PRODUCT_OS_NAME" />에서 프린터 설정 파일을 다운로드하고 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />에 따라 프린터를 사용할 수 있게 합니다.
 
       이 정책은
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index d2cab11c..444436c4 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1549,9 +1549,6 @@
 <translation id="3122082892722698079">Gebruik van niet-beveiligde contentuitzonderingen beheren</translation>
 <translation id="3128072319047570212">Instellingen voor sleutelgenerator</translation>
 <translation id="3142410959002029864">Als je dit beleid instelt, wordt de standaardinstelling voor dubbelzijdig afdrukken overschreven. Als deze instelling niet beschikbaar is, wordt dit beleid genegeerd.</translation>
-<translation id="3143265893557969814">Als dit beleid is ingesteld, worden alle opgegeven gegevenstypen uitgesloten van synchronisatie voor zowel Google Sync als synchronisatie van roaming-profielen. Dit kan handig zijn om het roaming-profiel te verkleinen of het type gegevens te beperken dat wordt geüpload naar de Google Sync-servers.
-
-      De huidige gegevenstypen voor dit beleid zijn: 'bookmarks', 'preferences', 'passwords', 'autofill', 'themes', 'typedUrls', 'extensions', 'apps', 'tabs', 'wifiConfigurations'. Die namen zijn hoofdlettergevoelig.</translation>
 <translation id="3144173889708944482">Als <ph name="PRINTERS_BLOCKLIST" /> wordt gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="DEVICE_PRINTERS_BLOCKLIST_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" />.</translation>
 <translation id="3152425128389603870">Maak Samengestelde desktop beschikbaar en schakel deze standaard in</translation>
 <translation id="3159375329008977062">Gebruiker kan Crostini-containers exporteren/importeren via de gebruikersinterface</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index faffd1f61..06942f1 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1558,9 +1558,6 @@
 <translation id="3122082892722698079">Controlar o uso de exceções de conteúdo não seguro</translation>
 <translation id="3128072319047570212">Configurações de keygen</translation>
 <translation id="3142410959002029864">A definição da política substitui o modo duplex de impressão padrão. Se o modo não estiver disponível, a política será ignorada.</translation>
-<translation id="3143265893557969814">Se essa política for definida, todos os tipos de dados especificados serão excluídos da sincronização, tanto para o Google Sync quanto para a sincronização de perfil de roaming. Isso pode ser benéfico para reduzir o tamanho do perfil de roaming ou limitar o tipo de dado que será enviado aos servidores do Google Sync.
-
-      Atualmente, os tipos de dados para esta política são: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Esses nomes têm diferenciação de letras maiúsculas e minúsculas.</translation>
 <translation id="3144173889708944482">Se <ph name="PRINTERS_BLOCKLIST" /> for escolhida para <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, a definição de <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> especificará quais impressoras os usuários não podem usar. Todas as impressoras estão disponíveis para os usuários, com exceção dos IDs listados nesta política. Os IDs precisam corresponder aos campos <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> no arquivo especificado na <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Disponibilizar e ativar por padrão a área de trabalho unificada</translation>
 <translation id="3159375329008977062">O usuário tem permissão para exportar/importar contêineres do Crostini por meio da IU</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 15e93b3..2613caa0 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1345,6 +1345,7 @@
 <translation id="2886969306951284125">Если на устройстве разрешены приложения для Android и для правила задано значение True, то зарегистрированные устройства отправляют данные о статусе Android.
 
       Если правило выключено или не настроено, эти данные не отправляются.</translation>
+<translation id="288923520817177650">Разрешать создание сеансов в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> с помощью <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Автоматически разрешать этим сайтам подключение к USB-устройствам с предоставленными идентификаторами поставщика и продукта.</translation>
 <translation id="2893546967669465276">Позволяет отправлять системные журналы на сервер для проверки администраторами</translation>
 <translation id="2899002520262095963">Приложения Android могут использовать сетевые настройки и сертификаты ЦС, указанные с помощью этого правила, но лишены доступа к некоторым параметрам конфигурации.</translation>
@@ -1558,9 +1559,6 @@
 <translation id="3122082892722698079">Контроль использования исключений для небезопасного контента</translation>
 <translation id="3128072319047570212">Настройки генератора ключей</translation>
 <translation id="3142410959002029864">Переопределяет режим двусторонней печати по умолчанию. Если этот режим недоступен, правило не действует.</translation>
-<translation id="3143265893557969814">Если настроить это правило, для всех указанных в нем типов данных будет запрещена синхронизация как в Google Sync, так и в перемещаемом профиле. Таким образом можно уменьшить объем информации в перемещаемом профиле или ограничить типы данных, загружаемых на серверы Google Sync.
-
-      В настоящее время вы можете указывать в этом правиле следующие типы данных: bookmarks, preferences, passwords, autofill, themes, typedUrls, extensions, apps, tabs, wifiConfigurations. Регистр символов в перечисленных названиях имеет значение.</translation>
 <translation id="3144173889708944482">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_BLOCKLIST" />, правило <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> определяет принтеры, с которыми не может работать пользователь. Пользователям запрещено работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Включить режим единого рабочего стола и установить его по умолчанию</translation>
 <translation id="3159375329008977062">Пользователю разрешено экспортировать и импортировать контейнеры Crostini, используя интерфейс</translation>
@@ -2051,6 +2049,13 @@
 <translation id="377044054160169374">Принудительное прерывание при злоупотреблении доверием</translation>
 <translation id="3778689139323007309">Проверять, не был ли отозван сертификат сервера, успешно прошедший проверку и подписанный локальным сертификатом ЦС</translation>
 <translation id="3780152581321609624">Включить нестандартный порт в имя SPN Kerberos</translation>
+<translation id="378495749480642482">Разрешает или запрещает сайтам, на которые переходит пользователь, создавать сеансы дополненной реальности с эффектом погружения, используя <ph name="WEBXR_API_NAME" />.
+
+      Если правило включено или не настроено, <ph name="WEBXR_API_NAME" /> будет разрешать создание сеансов в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, позволяя пользователям погружаться в дополненную реальность.
+
+      Если отключить правило, <ph name="WEBXR_API_NAME" /> будет отклонять запросы на создание сеансов в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Существующие сеансы в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> (если они есть) не будут прерваны.
+
+      Более подробная информация о сеансах в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> доступна в спецификации <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Параметры электропитания в режиме неактивности</translation>
 <translation id="3790085888761753785">Когда эта настройка включена, пользователи могут входить в аккаунт, используя Smart Lock. Это правило расширяет возможности Smart Lock, так как по умолчанию функция позволяет разблокировать только экран устройства.
 
@@ -4232,6 +4237,7 @@
       Если правило включено, для каждого сайта из списка, разделенного запятыми, запускается отдельный процесс. При этом сайты также будут изолированы по субдоменам. Например, если указать сайт https://example.com/, его субдомен https://foo.example.com/ тоже будет изолирован.
       Если правило не настроено или отключено, на экране входа будут применяться настройки изоляции сайтов, установленные на этой платформе по умолчанию.
       </translation>
+<translation id="6947587367703216074">Запрещать создание сеансов в режиме <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> с помощью <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Позволяет настроить корпоративные принтеры, связанные с устройствами. Поддерживаемый формат файла тот же, что и для словаря <ph name="PRINTERS_POLICY_NAME" />, но с дополнительными полями id и guid. Заполните их для каждого принтера, чтобы внести его в список разрешенных или заблокированных. Поддерживаемый формат файла конфигурации – JSON. Его размер не должен превышать 5 МБ. В файле такого объема можно указать около 21 000 принтеров. Для проверки целостности скачанного файла используется хеш-сумма. Файл скачивается и кешируется. В случае изменения URL или хеша файл скачивается повторно. <ph name="PRODUCT_OS_NAME" /> скачивает файл конфигурации и открывает доступ к принтерам согласно правилам <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> и <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Это правило:
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 636c9b4b..9b24f48 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1545,9 +1545,6 @@
 <translation id="3122082892722698079">ควบคุมการใช้ข้อยกเว้นเนื้อหาที่ไม่ปลอดภัย</translation>
 <translation id="3128072319047570212">การตั้งค่าคีย์เจน</translation>
 <translation id="3142410959002029864">การตั้งค่านโยบายนี้จะลบล้างโหมดการพิมพ์ 2 ด้านเริ่มต้น หากโหมดนี้ไม่พร้อมใช้งาน ระบบจะเพิกเฉยต่อนโยบายนี้</translation>
-<translation id="3143265893557969814">หากตั้งค่านโยบายนี้ ประเภทข้อมูลที่ระบุไว้ทั้งหมดจะถูกยกเว้นจากการซิงค์ข้อมูลทั้งสำหรับ Google Sync และการซิงค์ข้อมูลโปรไฟล์โรมมิ่ง วิธีนี้อาจช่วยลดขนาดของโปรไฟล์โรมมิ่งหรือจำกัดประเภทข้อมูลที่อัปโหลดไปยังเซิร์ฟเวอร์ Google Sync
-
-      ประเภทข้อมูลปัจจุบันของนโยบายนี้ ได้แก่ "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations" โดยชื่อประเภทข้อมูลเหล่านี้จะคำนึงถึงตัวพิมพ์เล็กหรือใหญ่</translation>
 <translation id="3144173889708944482">หากมีการเลือก <ph name="PRINTERS_BLOCKLIST" /> ไว้สำหรับ <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> การตั้งค่า <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> จะระบุเครื่องพิมพ์ที่ผู้ใช้จะใช้ไม่ได้ เครื่องพิมพ์ทั้งหมดจะพร้อมให้ผู้ใช้นำมาใช้งาน ยกเว้นเครื่องที่มีรหัสตามที่ระบุไว้ในนโยบายนี้ รหัสดังกล่าวต้องตรงกับช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ในไฟล์ที่ระบุไว้ใน <ph name="DEVICE_PRINTERS_POLICY_NAME" /></translation>
 <translation id="3152425128389603870">ทำให้เดสก์ท็อปแบบรวมหลายหน้าจอพร้อมใช้งานและเปิดใช้โดยค่าเริ่มต้น</translation>
 <translation id="3159375329008977062">อนุญาตให้ผู้ใช้ส่งออก/นำเข้าคอนเทนเนอร์ Crostini ผ่าน UI</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index a45c6c2..95d459d 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -1341,6 +1341,7 @@
 <translation id="2886969306951284125">Android uygulamaları açıkken bu politika Doğru değerine ayarlanırsa kayıtlı cihazlar Android durum bilgilerini rapor eder.
 
       Politika Devre Dışı değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı cihazlar Android durum bilgilerini rapor etmez.</translation>
+<translation id="288923520817177650"><ph name="WEBXR_API_NAME_SHORT" /> API'nin <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumlarına izin ver</translation>
 <translation id="2890645751406497668">Bu sitelere, sağlanan tedarikçi ve ürün kimlikleriyle otomatik olarak USB cihazlarına bağlanma izni verir.</translation>
 <translation id="2893546967669465276">Yönetim sunucusuna sistem günlükleri gönder</translation>
 <translation id="2899002520262095963">Android uygulamaları, bu politika aracılığıyla ayarlanan CA sertifikalarını ve ağ yapılandırmalarını kullanabilir, ancak bazı yapılandırma seçeneklerine erişemez.</translation>
@@ -1554,9 +1555,6 @@
 <translation id="3122082892722698079">Güvenli olmayan içerik istisnalarının kullanımını kontrol et</translation>
 <translation id="3128072319047570212">Anahtar oluşturucu ayarları</translation>
 <translation id="3142410959002029864">Politika ayarlanırsa varsayılan dupleks yazdırma modu geçersiz kılınır. Mod kullanılamıyorsa bu politika yok sayılır.</translation>
-<translation id="3143265893557969814">Bu politika ayarlanırsa belirtilen tüm veri türleri hem Google Sync senkronizasyonunun hem de dolaşım profili senkronizasyonunun dışında tutulur. Bu, dolaşım profilinin boyutunu küçültmeye veya Google Sync sunucularına yüklenen veri türlerini sınırlandırmaya yarayabilir.
-
-      Şu anda bu politika kapsamında bulunan veri türleri şunlardır: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Bu adlar büyük/küçük harfe duyarlıdır.</translation>
 <translation id="3144173889708944482"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> için <ph name="PRINTERS_BLOCKLIST" /> seçiliyken <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> politikası ayarlanırsa kullanıcıların hangi yazıcıları kullanamayacağı belirlenir. Bu politikada listelenen kimlikler dışında kalan tüm yazıcılar kullanıcılara sağlanır. Kimliklerin, <ph name="DEVICE_PRINTERS_POLICY_NAME" /> politikasında belirtilen dosyadaki <ph name="ID_FIELD" /> veya <ph name="GUID_FIELD" /> alanlarına karşılık gelmesi gerekir.</translation>
 <translation id="3152425128389603870">Birleşik Masaüstü'nü kullanılabilir hale getir ve varsayılan olarak aç.</translation>
 <translation id="3159375329008977062">Kullanıcının, kullanıcı arayüzü üzerinden Crostini kapsayıcıları dışa/içe aktarmasına izin verilir</translation>
@@ -2044,6 +2042,13 @@
 <translation id="377044054160169374">Kötüye Kullanım Deneyimi Müdahele Yaptırımı</translation>
 <translation id="3778689139323007309">Yerel olarak yüklü CA sertifikaları tarafından imzalanmış başarıyla doğrulanmış sunucu sertifikaları için iptal kontrolleri gerçekleştir</translation>
 <translation id="3780152581321609624">Kerberos SPN'sine standart dışı bağlantı noktasını dahil et</translation>
+<translation id="378495749480642482">Kullanıcıların gittiği sitelerin, <ph name="WEBXR_API_NAME" /> API'yi kullanarak yoğun düzeyde Artırılmış Gerçeklik oluşturmasına izin verilip verilmeyeceğini yapılandırır.
+
+      Bu politika ayarlanmadan bırakılır veya etkinleştirilirse oturum oluştururken <ph name="WEBXR_API_NAME" /> API, <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> değerini kabul ederek kullanıcıların Artırılmış Gerçeklik deneyimi yaşamalarına izin verir.
+
+      Bu politika devre dışı bırakılırsa <ph name="WEBXR_API_NAME" /> uygulaması, <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> olarak ayarlanmış moda sahip oturum oluşturma isteklerini reddeder. Mevcut <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumları (varsa) sonlandırılmaz.
+
+      <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumlarıyla ilgili daha fazla bilgi edinmek için lütfen <ph name="WEBXR_AR_MODULE_API_NAME" /> API'nin teknik özelliklerine bakın.</translation>
 <translation id="3788662722837364290">Kullanıcının işlem yapmadığı zaman için güç yönetimi ayarları</translation>
 <translation id="3790085888761753785">Bu ayar etkinleştirilirse, kullanıcılar Smart Lock kullanarak hesaplarında oturum açabilirler. Bu, kullanıcıların yalnızca ekranlarının kilidini açmalarına izin veren normal Smart Lock davranışından daha serbest bir ayardır.
 
@@ -4224,6 +4229,7 @@
       Bu politika etkinleştirilirse virgülle ayrılmış listede adı belirtilen her kaynak kendi işleminde çalışır. Bu politika ayrıca alt alan adlarıyla adlandırılan kaynakları da izole eder; ör. https://example.com/ adresinin belirtilmesi, https://example.com/ sitesinin bir parçası olarak https://foo.example.com/ adresinin de izole edilmesine neden olur.
       Bu politika yapılandırılmaz veya devre dışı bırakılırsa oturum açma ekranı için platformun varsayılan site izolasyonu ayarları kullanılır.
       </translation>
+<translation id="6947587367703216074"><ph name="WEBXR_API_NAME_SHORT" /> API'nin <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> oturumları oluşturmasını engelle</translation>
 <translation id="6949867264289339206">Politika ayarlanırsa cihazlara bağlı kurumsal yazıcılar için yapılandırmalar sağlanır. Biçimi, <ph name="PRINTERS_POLICY_NAME" /> sözlüğü ile aynı olmakla birlikte izin verilenler veya engellenenler listelerine eklenecek her yazıcı için gerekli ek "id" veya "guid" alanlarını içerir. Dosya biçimi JSON olup boyutu 5 MB'tan büyük olamaz. Yaklaşık 21.000 yazıcı içeren bir dosya, 5 MB boyutunda olur. Şifreleme karma değeri, indirmenin bütünlüğünü doğrulamaya yardımcı olur. URL veya karma değer değiştiğinde dosya indirilir, önbelleğe alınır ve yeniden indirilir. <ph name="PRODUCT_OS_NAME" />, yazıcı yapılandırmalarına ait dosyayı indirerek <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> ve <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> ile birlikte yazıcıları kullanılabilir hale getirir.
 
       Bu politika:
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 518354dc..a2bba372 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1362,6 +1362,7 @@
 <translation id="2886969306951284125">Якщо додатки для Android увімкнено, а для цього правила вибрано значення "Правда", зареєстровані пристрої надсилатимуть дані про статус Android.
 
       Якщо це правило вимкнено або не налаштовано, зареєстровані пристрої не надсилатимуть таку інформацію</translation>
+<translation id="288923520817177650">Дозволити створення сеансів <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> через <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Автоматично дозволяє цим сайтам підключати пристрої USB з певними ідентифікаторами постачальника й продукту.</translation>
 <translation id="2893546967669465276">Надсилати системні журнали на сервер керування</translation>
 <translation id="2899002520262095963">Додатки Android можуть використовувати налаштування мережі та сертифікати ЦС, установлені за допомогою цього правила, однак вони не мають доступу до деяких параметрів налаштувань.</translation>
@@ -1574,9 +1575,6 @@
 <translation id="3122082892722698079">Контролювати використання винятків для незахищеного контенту</translation>
 <translation id="3128072319047570212">Налаштування генератора ключів</translation>
 <translation id="3142410959002029864">Якщо ввімкнути це правило, воно замінить стандартні параметри двостороннього друку. Якщо такий режим недоступний, це правило ігнорується.</translation>
-<translation id="3143265893557969814">Якщо це правило налаштовано, усі вказані типи даних буде виключено з даних для синхронізації через Google Sync і синхронізації роумінгових профілів. Це може допомогти зменшити розмір роумінгового профілю чи обмежити тип даних, завантажених на сервери Google Sync.
-
-      Поточні типи даних для цього правила: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Ці назви чутливі до регістру.</translation>
 <translation id="3144173889708944482">Якщо для правила <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> вибрано параметр <ph name="PRINTERS_BLOCKLIST" />, тоді налаштування <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> визначає, які принтери не можна використовувати. Користувачам недоступні лише принтери з переліченими в правилі ідентифікаторами. Ідентифікатори мають відповідати полю <ph name="ID_FIELD" /> або <ph name="GUID_FIELD" /> у файлі, указаному в правилі <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">За умовчанням робити доступним і вмикати уніфікований режим робочого стола</translation>
 <translation id="3159375329008977062">Користувач може експортувати або імпортувати контейнери Crostini через інтерфейс</translation>
@@ -2069,6 +2067,13 @@
 <translation id="377044054160169374">Abusive Experience Intervention Enforce</translation>
 <translation id="3778689139323007309">Перевіряти відкликання сертифікатів сервера, підтверджених і підписаних локально встановленими сертифікатами центру сертифікації</translation>
 <translation id="3780152581321609624">Включити нестандартний порт в ім’я учасника сервера (SPN) за протоколом Kerberos</translation>
+<translation id="378495749480642482">Визначає, чи можуть сайти, на які переходить користувач, створювати сеанси доповненої реальності з ефектом присутності через <ph name="WEBXR_API_NAME" />.
+
+      Коли це правило не налаштовано або ввімкнено, <ph name="WEBXR_API_NAME" /> дозволятиме створювати сеанси <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, тобто користувачам буде доступний режим доповненої реальності.
+
+      Коли це правило вимкнено, <ph name="WEBXR_API_NAME" /> відхилятиме запити на створення сеансів <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Наявні сеанси <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> не буде припинено.
+
+      Докладніша інформація про сеанси <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> доступна в специфікації <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Параметри керування живленням, коли користувач неактивний</translation>
 <translation id="3790085888761753785">Якщо це налаштування ввімкнено, користувачі зможуть входити в обліковий запис за допомогою Smart Lock. Воно має менше обмежень, ніж звичайна поведінка Smart Lock, яка дозволяє користувачам лише розблоковувати екран.
 
@@ -4254,6 +4259,7 @@
       Якщо це правило ввімкнено, кожне джерело в списку значень, відокремлених комами, відкриватиметься окремо. Також ізолюватимуться джерела з іменами субдоменів. Наприклад, якщо вказати https://example.com/, то https://foo.example.com/ буде ізольовано як частину сайту https://example.com/.
       Якщо це правило не налаштовано або вимкнено, для екрана входу діятимуть параметри платформи за умовчанням.
       </translation>
+<translation id="6947587367703216074">Заборонити створення сеансів <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> через <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Це правило визначає налаштування принтерів підприємства, які зв'язані з пристроями. Його формат збігається зі словником <ph name="PRINTERS_POLICY_NAME" />, але з обов'язковим полем "id" або "guid" для кожного принтера, який додається в білий чи чорний список. Файл має бути у форматі JSON, а його розмір не може перевищувати 5 МБ. Файл розміром 5 МБ містить приблизно 21 000 принтерів. Криптографічний хеш допомагає перевірити цілісність завантаження. Файл завантажується й додається в кеш. Коли URL-адреса або хеш змінюються, файл завантажується повторно. <ph name="PRODUCT_OS_NAME" /> завантажує файл для налаштування принтерів і надає доступ до принтерів відповідно до правил <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> та <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Це правило:
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 7c86812..02cb0cb1 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1362,6 +1362,7 @@
 <translation id="2886969306951284125">Nếu thiết bị được phép chạy trên các ứng dụng Android, thì khi bạn đặt chính sách thành Bật, thiết bị đã đăng ký sẽ báo cáo thông tin về trạng thái của Android.
 
       Nếu bạn không đặt hoặc đặt chính sách này thành Tắt, thì thiết bị đã đăng ký sẽ không báo cáo thông tin về trạng thái của Android</translation>
+<translation id="288923520817177650">Cho phép tạo các phiên <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> trong <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="2890645751406497668">Tự động cấp quyền cho những trang web này để kết nối với các thiết bị USB bằng ID sản phẩm và nhà cung cấp cụ thể.</translation>
 <translation id="2893546967669465276">Gửi nhật ký hệ thống đến máy chủ quản lý</translation>
 <translation id="2899002520262095963">Các ứng dụng Android có thể sử dụng cấu hình mạng và chứng chỉ CA được đặt qua chính sách này nhưng không có quyền truy cập vào một số tùy chọn cấu hình.</translation>
@@ -1574,9 +1575,6 @@
 <translation id="3122082892722698079">Kiểm soát việc sử dụng trường hợp ngoại lệ cho nội dung không an toàn</translation>
 <translation id="3128072319047570212">Cài đặt chương trình tạo khóa</translation>
 <translation id="3142410959002029864">Việc đặt chính sách này sẽ ghi đè chế độ in hai mặt mặc định. Nếu không có chế độ nêu trên, chính sách này sẽ bị bỏ qua.</translation>
-<translation id="3143265893557969814">Nếu bạn đặt chính sách này thì tất cả các loại dữ liệu đã chỉ định sẽ bị loại trừ khỏi cả quá trình đồng bộ hóa của Google Sync lẫn quá trình đồng bộ hóa cấu hình chuyển vùng. Điều này có thể giúp giảm kích thước của cấu hình chuyển vùng hoặc giới hạn loại dữ liệu đã tải lên các máy chủ Google Sync.
-
-      Chính sách này hiện áp dụng cho các loại dữ liệu sau: "bookmarks", "preferences", "passwords", "autofill", "themes", "typedUrls", "extensions", "apps", "tabs", "wifiConfigurations". Tên của các loại dữ liệu đó phân biệt chữ hoa chữ thường!</translation>
 <translation id="3144173889708944482">Nếu bạn chọn <ph name="PRINTERS_BLOCKLIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, thì việc đặt <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng không thể sử dụng. Tất cả máy in sẽ được cung cấp cho người dùng, ngoại trừ những mã nhận dạng được liệt kê trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="3152425128389603870">Cho phép Màn hình hợp nhất và chính sách này bật theo mặc định.</translation>
 <translation id="3159375329008977062">Người dùng được phép xuất/nhập các vùng chứa Crostini qua giao diện người dùng</translation>
@@ -2069,6 +2067,13 @@
 <translation id="377044054160169374">Thực thi can thiệp trải nghiệm lạm dụng</translation>
 <translation id="3778689139323007309">Thực hiện quá trình kiểm tra trạng thái thu hồi đối của các chứng chỉ máy chủ đã xác thực thành công, được ký theo chứng chỉ CA đã cài đặt trên máy</translation>
 <translation id="3780152581321609624">Bao gồm cổng không chuẩn trong  Kerberos SPN</translation>
+<translation id="378495749480642482">Định cấu hình liệu các trang web mà người dùng chuyển đến có được phép tạo các phiên Thực tế tăng cường sống động bằng cách sử dụng <ph name="WEBXR_API_NAME" /> không.
+
+      Khi bạn đặt thành bật hoặc không đặt chính sách này, <ph name="WEBXR_API_NAME" /> sẽ chấp nhận <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> trong quá trình tạo phiên, qua đó cho phép người dùng tham gia các trải nghiệm Thực tế tăng cường.
+
+      Khi bạn tắt chính sách này, <ph name="WEBXR_API_NAME" /> sẽ từ chối các yêu cầu tạo phiên có chế độ được đặt thành <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />. Các phiên <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> hiện tại (nếu có) sẽ không bị chấm dứt.
+
+      Để biết thêm thông tin chi tiết về các phiên <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />, vui lòng xem thông số kỹ thuật của <ph name="WEBXR_AR_MODULE_API_NAME" />.</translation>
 <translation id="3788662722837364290">Cài đặt quản lý nguồn khi người dùng không sử dụng</translation>
 <translation id="3790085888761753785">Nếu bạn bật tùy chọn cài đặt này, thì người dùng sẽ được phép đăng nhập vào tài khoản của họ bằng tính năng Smart Lock. Tùy chọn này cấp nhiều quyền hơn so với hành vi Smart Lock thông thường (chỉ cho phép người dùng mở khóa màn hình).
 
@@ -4262,6 +4267,7 @@
       Nếu bạn bật chính sách này, thì mỗi nguồn gốc có tên trong danh sách được phân tách bằng dấu phẩy sẽ chạy ở quy trình riêng. Điều này cũng sẽ cách ly các nguồn gốc được đặt tên theo miền con. Ví dụ: việc chỉ định https://example.com/ cũng sẽ khiến https://foo.example.com/ bị cách ly vì là một phần của trang web https://example.com/.
       Nếu bạn tắt hoặc không định cấu hình chính sách này, thì các tùy chọn cài đặt cách ly trang web mặc định của nền tảng sẽ được dùng cho màn hình đăng nhập.
       </translation>
+<translation id="6947587367703216074">Ngăn tạo các phiên <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> trong <ph name="WEBXR_API_NAME_SHORT" /></translation>
 <translation id="6949867264289339206">Việc đặt chính sách này sẽ cung cấp các cấu hình máy in dành cho doanh nghiệp được kết nối với các thiết bị. Định dạng của chính sách khớp với định dạng của từ điển <ph name="PRINTERS_POLICY_NAME" />, có thêm trường "id" hoặc "guid" bắt buộc trên từng máy in để đưa vào danh sách cho phép hoặc danh sách cấm. Kích thước tệp không được vượt quá 5 MB và phải ở định dạng JSON. Một tệp có khoảng 21.000 máy in sẽ mã hóa dưới dạng tệp 5 MB. Hàm băm mật mã giúp xác minh tính toàn vẹn của tệp tải xuống. Tệp này được tải xuống, lưu vào bộ nhớ đệm và tải lại xuống khi URL hoặc hàm băm thay đổi. <ph name="PRODUCT_OS_NAME" /> tải tệp này xuống để định cấu hình máy in và cung cấp các máy in theo đúng <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />, và <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.
 
       Chính sách này:
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 5b700959b..10112084 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1538,9 +1538,6 @@
 <translation id="3122082892722698079">控制对不安全内容例外情况的使用</translation>
 <translation id="3128072319047570212">Keygen 设置</translation>
 <translation id="3142410959002029864">通过设置此政策,您可以替换默认双面打印模式。如果这种模式不适用,系统会忽略此政策。</translation>
-<translation id="3143265893557969814">如果您设置了此政策,所有指定的数据类型都会从同步操作(无论是 Google 同步还是漫游个人资料同步)中排除。这有助于缩减漫游个人资料的大小,或者限制向 Google 同步服务器上传的数据类型。
-
-      此政策当前可用的数据类型为:“bookmarks”、“preferences”、“passwords”、“autofill”、“themes”、“typedUrls”、“extensions”、“apps”、“tabs”、“wifiConfiguration”。这些名称区分大小写!</translation>
 <translation id="3144173889708944482">如果为 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 选择了 <ph name="PRINTERS_BLOCKLIST" />,您便可通过设置 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 来指定用户不能使用哪些打印机。除了与此政策中所列 ID 对应的打印机之外,其他所有打印机都可供用户使用。ID 必须与 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 所指定文件内的<ph name="ID_FIELD" />或<ph name="GUID_FIELD" />字段相符。</translation>
 <translation id="3152425128389603870">使“统一桌面”功能可供用户使用,并使其在默认情况下处于启用状态</translation>
 <translation id="3159375329008977062">允许用户通过界面导出/导入 Crostini 容器</translation>
@@ -5494,7 +5491,7 @@
       如果未设置,此政策会处于开启状态,而且无法被用户关闭。</translation>
 <translation id="879697755145469671">不检测被遮挡的窗口</translation>
 <translation id="8798099450830957504">默认</translation>
-<translation id="8799492680917278474">如果您设置了此政策,当会话时长达到此政策中指定的分钟数之后,远程访问连接将会自动断开。这不会阻止客户端在达到会话时长上限后重新建立连接。如果您为此政策指定的值不在下限值/上限值范围内,则可能会导致主机无法启动。此政策不影响远程支持场景。
+<translation id="8799492680917278474">如果您设置了此政策,当会话时长达到此政策中指定的分钟数之后,远程访问连接将会自动断开。这不会阻止客户端在达到会话时长上限后重新建立连接。如果您为此政策指定的值不在下限值/上限值范围内,主机可能会因此无法启动。此政策不影响远程支持场景。
 
           如果未设置,此政策将不会产生任何影响。在这种情况下,此计算机上的远程访问连接将不会受到任何时长上限的制约。</translation>
 <translation id="8800453707696044281">设置电池充电自定义停止充电值(以百分比表示)</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index a96dec3..e8d56a8 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1320,6 +1320,7 @@
 <translation id="2886969306951284125">如果執行 Android 應用程式的功能已啟用,將這項政策設為 True 會讓已註冊的裝置回報 Android 狀態資訊。
 
       如果將這項政策設為停用或不設定,已註冊的裝置不會回報 Android 狀態資訊</translation>
+<translation id="288923520817177650">允許建立 <ph name="WEBXR_API_NAME_SHORT" /> 的 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 工作階段</translation>
 <translation id="2890645751406497668">自動授予權限給這些網站,以連結至指定廠商和產品 ID 的 USB 裝置。</translation>
 <translation id="2893546967669465276">將系統記錄傳送到管理伺服器</translation>
 <translation id="2899002520262095963">Android 應用程式可以使用透過這項政策指定的網路設定和 CA 憑證,但無法存取部分設定選項。</translation>
@@ -1532,9 +1533,6 @@
 <translation id="3122082892722698079">控管可使用不安全內容的例外網站</translation>
 <translation id="3128072319047570212">Keygen 設定</translation>
 <translation id="3142410959002029864">如果設定這項政策,將覆寫預設的雙面列印模式。如果系統不支援設定的模式,將會忽略這項政策。</translation>
-<translation id="3143265893557969814">如果設定了這項政策,系統會將所有指定的資料類型從同步處理作業 (包含 Google Sync 和漫遊設定檔的同步處理作業) 中排除。這有助於縮減漫遊設定檔的大小,或限制上傳到 Google Sync 伺服器的資料類型。
-
-      這項政策目前涵蓋的資料類型為:「bookmarks」、「preferences」、「passwords」、「autofill」、「themes」、「typedUrls」、「extensions」、「apps」、「tabs」、「wifiConfigurations」。這些名稱有大小寫之分。</translation>
 <translation id="3144173889708944482">如果在 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_BLOCKLIST" />,系統會根據 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 的設定指定使用者不能操作的印表機。除了這項政策所列 ID 的印表機外,其他印表機皆可供使用。印表機 ID 必須與 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。</translation>
 <translation id="3152425128389603870">允許使用整合桌面並預設為啟用。</translation>
 <translation id="3159375329008977062">允許使用者透過 UI 匯出/匯入 Crostini 容器</translation>
@@ -2014,6 +2012,13 @@
 <translation id="377044054160169374">強制干預濫用行為</translation>
 <translation id="3778689139323007309">針對由本機裝載 CA 憑證所簽署並經過成功驗證的伺服器憑證,執行撤銷檢查</translation>
 <translation id="3780152581321609624">Kerberos SPN 包含非標準通訊埠</translation>
+<translation id="378495749480642482">設定使用者前往的網站是否能透過 <ph name="WEBXR_API_NAME" /> 建立沉浸式擴增實境工作階段。
+
+      如果未設定這項政策或設為啟用,<ph name="WEBXR_API_NAME" /> 會在工作階段建立期間接受 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />,為使用者提供擴增實境體驗。
+
+      如果停用這項政策,<ph name="WEBXR_API_NAME" /> 便會拒絕工作階段的建立要求 (模式設為 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" />),但現有的 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 工作階段 (如果有的話) 並不會終止。
+
+      如要進一步瞭解 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 工作階段,請參閱 <ph name="WEBXR_AR_MODULE_API_NAME" />規範。</translation>
 <translation id="3788662722837364290">使用者進入閒置狀態時的電源管理設定</translation>
 <translation id="3790085888761753785">如果啟用這項設定,使用者將可透過 Smart Lock 登入帳戶。一般 Smart Lock 只能讓使用者解鎖螢幕畫面,相較之下這項設定提供了更高的權限。
 
@@ -4189,6 +4194,7 @@
       如果啟用這項政策,系統會以獨立程序分別執行逗號分隔清單中指定的每個來源。這也會讓系統隔離以子網域命名的來源,例如指定 https://example.com/ 也會導致 https://foo.example.com/ 遭到隔離,因為後者屬於 https://example.com/ 網站的一部分。
       如果不設定或停用這項政策,系統會將平台預設的網站隔離設定套用至登入畫面。
       </translation>
+<translation id="6947587367703216074">禁止建立 <ph name="WEBXR_API_NAME_SHORT" /> 的 <ph name="WEBXR_AR_SESSION_ENUM_VALUE" /> 工作階段</translation>
 <translation id="6949867264289339206">你可以透過這項政策設定已連接到裝置的企業印表機。其格式與 <ph name="PRINTERS_POLICY_NAME" /> 條目相符,且針對每台印表機另外設有「id」或「guid」必填欄位,用於指明要加入許可清單或拒絕清單。相關檔案大小不得超過 5 MB,且必須採用 JSON 格式。一個 5 MB 的編碼檔案可包含約 21,000 台印表機的資料。加密編譯雜湊的作用是驗證下載內容的完整性。系統會下載及快取這個檔案,而且只要網址或雜湊一有變動,就會重新下載檔案。<ph name="PRODUCT_OS_NAME" />會下載這個檔案來設定印表機,並依據 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />、<ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> 和 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 開放使用印表機。
 
       這項政策:
diff --git a/components/previous_session_info/OWNERS b/components/previous_session_info/OWNERS
index d00155d..3854d05 100644
--- a/components/previous_session_info/OWNERS
+++ b/components/previous_session_info/OWNERS
@@ -1,2 +1,2 @@
-eugenebut@chromium.org
+michaeldo@chromium.org
 olivierrobin@chromium.org
diff --git a/components/printing/browser/print_composite_client.cc b/components/printing/browser/print_composite_client.cc
index b8047b2ea..c4b5e09 100644
--- a/components/printing/browser/print_composite_client.cc
+++ b/components/printing/browser/print_composite_client.cc
@@ -12,7 +12,6 @@
 #include "build/build_config.h"
 #include "components/discardable_memory/service/discardable_shared_memory_manager.h"
 #include "components/printing/browser/service_sandbox_type.h"
-#include "components/printing/common/print_messages.h"
 #include "components/services/print_compositor/public/cpp/print_service_mojo_types.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/browser_task_traits.h"
diff --git a/components/printing/browser/print_manager_utils.cc b/components/printing/browser/print_manager_utils.cc
index 1b7ca78d..2e8bd20 100644
--- a/components/printing/browser/print_manager_utils.cc
+++ b/components/printing/browser/print_manager_utils.cc
@@ -6,7 +6,6 @@
 
 #include "components/printing/browser/print_composite_client.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "components/site_isolation/site_isolation_policy.h"
 #include "printing/mojom/print.mojom.h"
 #include "printing/print_settings.h"
diff --git a/components/printing/common/BUILD.gn b/components/printing/common/BUILD.gn
index 9c47a44a..d1fd46d 100644
--- a/components/printing/common/BUILD.gn
+++ b/components/printing/common/BUILD.gn
@@ -9,11 +9,6 @@
   sources = [
     "cloud_print_cdd_conversion.cc",
     "cloud_print_cdd_conversion.h",
-    "print_messages.cc",
-    "print_messages.h",
-    "printing_param_traits.cc",
-    "printing_param_traits.h",
-    "printing_param_traits_macros.h",
   ]
 
   deps = [
@@ -21,16 +16,9 @@
     "//base",
     "//build:chromeos_buildflags",
     "//components/cloud_devices/common:common",
-    "//ipc",
     "//printing",
     "//printing/common:common",
     "//printing/mojom",
-    "//third_party/blink/public:blink_headers",
-    "//ui/accessibility",
-    "//ui/gfx/geometry",
-    "//ui/gfx/ipc",
-    "//ui/gfx/ipc/geometry",
-    "//ui/gfx/ipc/skia",
   ]
 }
 
@@ -52,16 +40,3 @@
     enabled_features += [ "enable_tagged_pdf" ]
   }
 }
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [ "printing_param_traits_unittest.cc" ]
-  deps = [
-    ":common",
-    "//ipc:test_support",
-    "//printing/mojom",
-    "//skia",
-    "//testing/gtest",
-    "//ui/gfx/geometry",
-  ]
-}
diff --git a/components/printing/common/print_messages.cc b/components/printing/common/print_messages.cc
deleted file mode 100644
index 7b0d123e..0000000
--- a/components/printing/common/print_messages.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2012 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/strings/string16.h"
-#include "printing/buildflags/buildflags.h"
-#include "ui/gfx/geometry/size.h"
-
-// Generating implementations for all aspects of the IPC message
-// handling by setting appropriate IPC macros and including the
-// message file, over and over again until all versions have been
-// generated.
-
-#define IPC_MESSAGE_IMPL
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#undef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-#include "components/printing/common/print_messages.h"
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#error "Failed to include header components/printing/common/print_messages.h"
-#endif
-
-// Generate constructors.
-#include "ipc/struct_constructor_macros.h"
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#undef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-#include "components/printing/common/print_messages.h"
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#error "Failed to include header components/printing/common/print_messages.h"
-#endif
-
-// Generate param traits write methods.
-#include "ipc/param_traits_write_macros.h"
-namespace IPC {
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#undef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-#include "components/printing/common/print_messages.h"
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#error "Failed to include header components/printing/common/print_messages.h"
-#endif
-}  // namespace IPC
-
-// Generate param traits read methods.
-#include "ipc/param_traits_read_macros.h"
-namespace IPC {
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#undef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-#include "components/printing/common/print_messages.h"
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#error "Failed to include header components/printing/common/print_messages.h"
-#endif
-}  // namespace IPC
-
-// Generate param traits log methods.
-#include "ipc/param_traits_log_macros.h"
-namespace IPC {
-#undef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-// Force multiple inclusion of the param traits file to generate all methods.
-#undef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-
-#include "components/printing/common/print_messages.h"
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#error "Failed to include header components/printing/common/print_messages.h"
-#endif
-}  // namespace IPC
diff --git a/components/printing/common/print_messages.h b/components/printing/common/print_messages.h
deleted file mode 100644
index 14aabf0f..0000000
--- a/components/printing/common/print_messages.h
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2012 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.
-
-// IPC messages for printing.
-#ifndef COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-#define COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/values.h"
-#include "build/build_config.h"
-#include "components/printing/common/print.mojom.h"
-#include "components/printing/common/printing_param_traits.h"
-#include "components/printing/common/printing_param_traits_macros.h"
-#include "ipc/ipc_message_macros.h"
-#include "printing/buildflags/buildflags.h"
-#include "printing/mojom/print.mojom.h"
-#include "printing/page_range.h"
-#include "printing/print_job_constants.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/ipc/geometry/gfx_param_traits.h"
-
-#define IPC_MESSAGE_START PrintMsgStart
-
-IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::PageOrientation,
-                          printing::mojom::PageOrientation::kMaxValue)
-IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::PrintScalingOption,
-                          printing::mojom::PrintScalingOption::kMaxValue)
-IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::SkiaDocumentType,
-                          printing::mojom::SkiaDocumentType::kMaxValue)
-
-// Parameters for a render request.
-IPC_STRUCT_TRAITS_BEGIN(printing::mojom::PrintParams)
-  // Physical size of the page, including non-printable margins,
-  // in pixels according to dpi.
-  IPC_STRUCT_TRAITS_MEMBER(page_size)
-
-  // In pixels according to dpi.
-  IPC_STRUCT_TRAITS_MEMBER(content_size)
-
-  // Physical printable area of the page in pixels according to dpi.
-  IPC_STRUCT_TRAITS_MEMBER(printable_area)
-
-  // The y-offset of the printable area, in pixels according to dpi.
-  IPC_STRUCT_TRAITS_MEMBER(margin_top)
-
-  // The x-offset of the printable area, in pixels according to dpi.
-  IPC_STRUCT_TRAITS_MEMBER(margin_left)
-
-  // Specifies the page orientation.
-  IPC_STRUCT_TRAITS_MEMBER(page_orientation)
-
-  // Specifies dots per inch in the x and y direction.
-  IPC_STRUCT_TRAITS_MEMBER(dpi)
-
-  // Specifies the scale factor in percent
-  IPC_STRUCT_TRAITS_MEMBER(scale_factor)
-
-  // Cookie for the document to ensure correctness.
-  IPC_STRUCT_TRAITS_MEMBER(document_cookie)
-
-  // Should only print currently selected text.
-  IPC_STRUCT_TRAITS_MEMBER(selection_only)
-
-  // Does the printer support alpha blending?
-  IPC_STRUCT_TRAITS_MEMBER(supports_alpha_blend)
-
-  // *** Parameters below are used only for print preview. ***
-
-  // The print preview ui associated with this request.
-  IPC_STRUCT_TRAITS_MEMBER(preview_ui_id)
-
-  // The id of the preview request.
-  IPC_STRUCT_TRAITS_MEMBER(preview_request_id)
-
-  // True if this is the first preview request.
-  IPC_STRUCT_TRAITS_MEMBER(is_first_request)
-
-  // Specifies the page scaling option for preview printing.
-  IPC_STRUCT_TRAITS_MEMBER(print_scaling_option)
-
-  // True if print to pdf is requested.
-  IPC_STRUCT_TRAITS_MEMBER(print_to_pdf)
-
-  // Specifies if the header and footer should be rendered.
-  IPC_STRUCT_TRAITS_MEMBER(display_header_footer)
-
-  // Title string to be printed as header if requested by the user.
-  IPC_STRUCT_TRAITS_MEMBER(title)
-
-  // URL string to be printed as footer if requested by the user.
-  IPC_STRUCT_TRAITS_MEMBER(url)
-
-  // HTML template to use as a print header.
-  IPC_STRUCT_TRAITS_MEMBER(header_template)
-
-  // HTML template to use as a print footer.
-  IPC_STRUCT_TRAITS_MEMBER(footer_template)
-
-  // Whether to rasterize a PDF for printing
-  IPC_STRUCT_TRAITS_MEMBER(rasterize_pdf)
-
-  // True if print backgrounds is requested by the user.
-  IPC_STRUCT_TRAITS_MEMBER(should_print_backgrounds)
-
-  // The document type of printed page(s) from render.
-  IPC_STRUCT_TRAITS_MEMBER(printed_doc_type)
-
-  // True if page size defined by css should be preferred.
-  IPC_STRUCT_TRAITS_MEMBER(prefer_css_page_size)
-
-  // Number of pages per sheet.  This parameter is for N-up mode.
-  // Defaults to 1 if the feature is disabled, and some number greater
-  // than 1 otherwise.  See printing::NupParameters for supported values.
-  IPC_STRUCT_TRAITS_MEMBER(pages_per_sheet)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(printing::PageRange)
-  IPC_STRUCT_TRAITS_MEMBER(from)
-  IPC_STRUCT_TRAITS_MEMBER(to)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(printing::mojom::PrintPagesParams)
-  // Parameters to render the page as a printed page. It must always be the same
-  // value for all the document.
-  IPC_STRUCT_TRAITS_MEMBER(params)
-
-  // If empty, this means a request to render all the printed pages.
-  IPC_STRUCT_TRAITS_MEMBER(pages)
-IPC_STRUCT_TRAITS_END()
-
-// Holds the printed content information.
-// The printed content is in shared memory, and passed as a region.
-// A map on out-of-process subframe contents is also included so the printed
-// content can be composited as needed.
-IPC_STRUCT_TRAITS_BEGIN(printing::mojom::DidPrintContentParams)
-  // A shared memory region for the metafile data.
-  IPC_STRUCT_TRAITS_MEMBER(metafile_data_region)
-
-  // Content id to render frame proxy id mapping for out-of-process subframes.
-  IPC_STRUCT_TRAITS_MEMBER(subframe_content_info)
-IPC_STRUCT_TRAITS_END()
-
-// Parameters to describe a rendered page.
-IPC_STRUCT_TRAITS_BEGIN(printing::mojom::DidPrintDocumentParams)
-  // Document's content including metafile data and subframe info.
-  IPC_STRUCT_TRAITS_MEMBER(content)
-
-  // Cookie for the document to ensure correctness.
-  IPC_STRUCT_TRAITS_MEMBER(document_cookie)
-
-  // The size of the page the page author specified.
-  IPC_STRUCT_TRAITS_MEMBER(page_size)
-
-  // The printable area the page author specified.
-  IPC_STRUCT_TRAITS_MEMBER(content_area)
-
-  // The physical offsets of the printer in DPI. Used for PS printing.
-  IPC_STRUCT_TRAITS_MEMBER(physical_offsets)
-IPC_STRUCT_TRAITS_END()
-
-// Messages sent from the renderer to the browser.
-
-#endif  // COMPONENTS_PRINTING_COMMON_PRINT_MESSAGES_H_
diff --git a/components/printing/common/printing_param_traits.cc b/components/printing/common/printing_param_traits.cc
deleted file mode 100644
index 1c7b9d8..0000000
--- a/components/printing/common/printing_param_traits.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2020 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/printing/common/printing_param_traits.h"
-
-#include "base/containers/flat_map.h"
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/pickle.h"
-#include "components/printing/common/print_messages.h"
-
-namespace IPC {
-
-using printing::mojom::DidPrintContentParamsPtr;
-using printing::mojom::PrintParamsPtr;
-
-void ParamTraits<DidPrintContentParamsPtr>::Write(base::Pickle* m,
-                                                  const param_type& p) {
-  WriteParam(m, p->metafile_data_region);
-  WriteParam(m, p->subframe_content_info);
-}
-
-bool ParamTraits<DidPrintContentParamsPtr>::Read(const base::Pickle* m,
-                                                 base::PickleIterator* iter,
-                                                 param_type* p) {
-  bool success = true;
-
-  base::ReadOnlySharedMemoryRegion metafile_data_region;
-  success &= ReadParam(m, iter, &metafile_data_region);
-
-  base::flat_map<uint32_t, base::UnguessableToken> subframe_content_info;
-  success &= ReadParam(m, iter, &subframe_content_info);
-
-  if (success) {
-    *p = printing::mojom::DidPrintContentParams::New(
-        std::move(metafile_data_region), subframe_content_info);
-  }
-  return success;
-}
-
-void ParamTraits<DidPrintContentParamsPtr>::Log(const param_type& p,
-                                                std::string* l) {}
-
-void ParamTraits<PrintParamsPtr>::Write(base::Pickle* m, const param_type& p) {
-  WriteParam(m, p->page_size);
-  WriteParam(m, p->content_size);
-  WriteParam(m, p->printable_area);
-  m->WriteInt(p->margin_top);
-  m->WriteInt(p->margin_left);
-  WriteParam(m, p->page_orientation);
-  WriteParam(m, p->dpi);
-  m->WriteDouble(p->scale_factor);
-  m->WriteInt(p->document_cookie);
-  m->WriteBool(p->selection_only);
-  m->WriteBool(p->supports_alpha_blend);
-  m->WriteInt(p->preview_ui_id);
-  m->WriteInt(p->preview_request_id);
-  m->WriteBool(p->is_first_request);
-  WriteParam(m, p->print_scaling_option);
-  m->WriteBool(p->print_to_pdf);
-  m->WriteBool(p->display_header_footer);
-  m->WriteString16(p->title);
-  m->WriteString16(p->url);
-  m->WriteString16(p->header_template);
-  m->WriteString16(p->footer_template);
-  m->WriteBool(p->rasterize_pdf);
-  m->WriteBool(p->should_print_backgrounds);
-  WriteParam(m, p->printed_doc_type);
-  m->WriteBool(p->prefer_css_page_size);
-  m->WriteUInt32(p->pages_per_sheet);
-}
-
-bool ParamTraits<PrintParamsPtr>::Read(const base::Pickle* m,
-                                       base::PickleIterator* iter,
-                                       param_type* p) {
-  bool success = true;
-
-  gfx::Size page_size;
-  success &= ReadParam(m, iter, &page_size);
-
-  gfx::Size content_size;
-  success &= ReadParam(m, iter, &content_size);
-
-  gfx::Rect printable_area;
-  success &= ReadParam(m, iter, &printable_area);
-
-  int32_t margin_top;
-  success &= iter->ReadInt(&margin_top);
-
-  int32_t margin_left;
-  success &= iter->ReadInt(&margin_left);
-
-  printing::mojom::PageOrientation page_orientation;
-  success &= ReadParam(m, iter, &page_orientation);
-
-  gfx::Size dpi;
-  success &= ReadParam(m, iter, &dpi);
-
-  double scale_factor;
-  success &= iter->ReadDouble(&scale_factor);
-
-  int32_t document_cookie;
-  success &= iter->ReadInt(&document_cookie);
-
-  bool selection_only;
-  success &= iter->ReadBool(&selection_only);
-
-  bool supports_alpha_blend;
-  success &= iter->ReadBool(&supports_alpha_blend);
-
-  int32_t preview_ui_id;
-  success &= iter->ReadInt(&preview_ui_id);
-
-  int32_t preview_request_id;
-  success &= iter->ReadInt(&preview_request_id);
-
-  bool is_first_request;
-  success &= iter->ReadBool(&is_first_request);
-
-  printing::mojom::PrintScalingOption print_scaling_option;
-  success &= ReadParam(m, iter, &print_scaling_option);
-
-  bool print_to_pdf;
-  success &= iter->ReadBool(&print_to_pdf);
-
-  bool display_header_footer;
-  success &= iter->ReadBool(&display_header_footer);
-
-  base::string16 title;
-  success &= iter->ReadString16(&title);
-
-  base::string16 url;
-  success &= iter->ReadString16(&url);
-
-  base::string16 header_template;
-  success &= iter->ReadString16(&header_template);
-
-  base::string16 footer_template;
-  success &= iter->ReadString16(&footer_template);
-
-  bool rasterize_pdf;
-  success &= iter->ReadBool(&rasterize_pdf);
-
-  bool should_print_backgrounds;
-  success &= iter->ReadBool(&should_print_backgrounds);
-
-  printing::mojom::SkiaDocumentType printed_doc_type;
-  success &= ReadParam(m, iter, &printed_doc_type);
-
-  bool prefer_css_page_size;
-  success &= iter->ReadBool(&prefer_css_page_size);
-
-  uint32_t pages_per_sheet;
-  success &= iter->ReadUInt32(&pages_per_sheet);
-
-  if (success) {
-    *p = printing::mojom::PrintParams::New(
-        page_size, content_size, printable_area, margin_top, margin_left,
-        page_orientation, dpi, scale_factor, document_cookie, selection_only,
-        supports_alpha_blend, preview_ui_id, preview_request_id,
-        is_first_request, print_scaling_option, print_to_pdf,
-        display_header_footer, title, url, header_template, footer_template,
-        rasterize_pdf, should_print_backgrounds, printed_doc_type,
-        prefer_css_page_size, pages_per_sheet);
-  }
-  return success;
-}
-
-void ParamTraits<PrintParamsPtr>::Log(const param_type& p, std::string* l) {}
-
-}  // namespace IPC
diff --git a/components/printing/common/printing_param_traits.h b/components/printing/common/printing_param_traits.h
deleted file mode 100644
index bf302f0..0000000
--- a/components/printing/common/printing_param_traits.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2020 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.
-
-// TODO(crbug.com/1008939): These traits files, printing_param_traits.{cc,h},
-// are required for sending printing mojom types to legacy IPCs. Once the
-// mojofication of printing is done, these traits should be removed.
-
-#ifndef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_H_
-#define COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_H_
-
-#include "components/printing/common/print.mojom.h"
-#include "ipc/ipc_message_utils.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-}  // namespace base
-
-namespace IPC {
-
-template <>
-struct ParamTraits<printing::mojom::DidPrintContentParamsPtr> {
-  typedef printing::mojom::DidPrintContentParamsPtr param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<printing::mojom::PrintParamsPtr> {
-  typedef printing::mojom::PrintParamsPtr param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-}  // namespace IPC
-
-#endif  // COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_H_
diff --git a/components/printing/common/printing_param_traits_macros.h b/components/printing/common/printing_param_traits_macros.h
deleted file mode 100644
index b5ea53e7..0000000
--- a/components/printing/common/printing_param_traits_macros.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2015 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.
-
-// Singly or multiply-included shared traits file depending on circumstances.
-// This allows the use of printing IPC serialization macros in more than one IPC
-// message file.
-#ifndef COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-#define COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
-
-#include "ipc/ipc_message_macros.h"
-#include "printing/mojom/print.mojom.h"
-
-// TODO(dgn) move all those macros back to
-// components/printing/common/print_messages.h when they can be handled by a
-// single generator. (main tracking bug: crbug.com/450822)
-IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::MarginType,
-                          printing::mojom::MarginType::kMaxValue)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(printing::mojom::DuplexMode,
-                              printing::mojom::DuplexMode::kUnknownDuplexMode,
-                              printing::mojom::DuplexMode::kShortEdge)
-
-#endif  // COMPONENTS_PRINTING_COMMON_PRINTING_PARAM_TRAITS_MACROS_H_
diff --git a/components/printing/common/printing_param_traits_unittest.cc b/components/printing/common/printing_param_traits_unittest.cc
deleted file mode 100644
index 28636f1bf..0000000
--- a/components/printing/common/printing_param_traits_unittest.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2020 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/printing/common/printing_param_traits.h"
-
-#include "base/strings/utf_string_conversions.h"
-#include "ipc/ipc_message_macros.h"
-#include "printing/mojom/print.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-
-TEST(PrintingParamTraitsTest, PrintParamsPtrTest) {
-  constexpr gfx::Size kPageSize(660, 400);
-  constexpr gfx::Size kContentSize(500, 300);
-  constexpr gfx::Rect kPrintableArea(0, 0, 600, 400);
-  constexpr int kMarginTop = 31;
-  constexpr int kMarginLeft = 93;
-  constexpr gfx::Size kDPI(72, 72);
-  constexpr double kScaleFactor = 1.1;
-  constexpr char kTitle[] = "title";
-  constexpr char kUrl[] = "url";
-  constexpr char kHeader[] = "header";
-  constexpr char kFooter[] = "footer";
-
-  printing::mojom::PrintParamsPtr params = printing::mojom::PrintParams::New();
-  params->page_size = kPageSize;
-  params->content_size = kContentSize;
-  params->printable_area = kPrintableArea;
-  params->margin_top = kMarginTop;
-  params->margin_left = kMarginLeft;
-  params->page_orientation = printing::mojom::PageOrientation::kUpright;
-  params->dpi = kDPI;
-  params->scale_factor = kScaleFactor;
-  params->document_cookie = 1;
-  params->selection_only = false;
-  params->supports_alpha_blend = true;
-  params->preview_ui_id = 1;
-  params->preview_request_id = 0;
-  params->is_first_request = false;
-  params->print_scaling_option =
-      printing::mojom::PrintScalingOption::kSourceSize;
-  params->print_to_pdf = false;
-  params->display_header_footer = false;
-  params->title = base::ASCIIToUTF16(kTitle);
-  params->url = base::ASCIIToUTF16(kUrl);
-  params->header_template = base::ASCIIToUTF16(kHeader);
-  params->footer_template = base::ASCIIToUTF16(kFooter);
-  params->rasterize_pdf = false;
-  params->should_print_backgrounds = true;
-  params->printed_doc_type = printing::mojom::SkiaDocumentType::kPDF;
-  params->prefer_css_page_size = true;
-  params->pages_per_sheet = 1;
-
-  IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
-  IPC::WriteParam(&msg, params);
-  base::PickleIterator iter(msg);
-  printing::mojom::PrintParamsPtr output;
-  EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output));
-
-  EXPECT_EQ(output->page_size, kPageSize);
-  EXPECT_EQ(output->content_size, kContentSize);
-  EXPECT_EQ(output->printable_area, kPrintableArea);
-  EXPECT_EQ(output->margin_top, kMarginTop);
-  EXPECT_EQ(output->margin_left, kMarginLeft);
-  EXPECT_EQ(output->page_orientation,
-            printing::mojom::PageOrientation::kUpright);
-  EXPECT_EQ(output->dpi, kDPI);
-  EXPECT_EQ(output->scale_factor, kScaleFactor);
-  EXPECT_EQ(output->document_cookie, 1);
-  EXPECT_FALSE(output->selection_only);
-  EXPECT_TRUE(output->supports_alpha_blend);
-  EXPECT_EQ(output->preview_ui_id, 1);
-  EXPECT_EQ(output->preview_request_id, 0);
-  EXPECT_FALSE(output->is_first_request);
-  EXPECT_EQ(output->print_scaling_option,
-            printing::mojom::PrintScalingOption::kSourceSize);
-  EXPECT_FALSE(output->print_to_pdf);
-  EXPECT_FALSE(output->display_header_footer);
-  EXPECT_EQ(output->preview_request_id, 0);
-  EXPECT_FALSE(output->is_first_request);
-  EXPECT_EQ(output->title, base::ASCIIToUTF16(kTitle));
-  EXPECT_EQ(output->url, base::ASCIIToUTF16(kUrl));
-  EXPECT_EQ(output->header_template, base::ASCIIToUTF16(kHeader));
-  EXPECT_EQ(output->footer_template, base::ASCIIToUTF16(kFooter));
-  EXPECT_FALSE(output->rasterize_pdf);
-  EXPECT_TRUE(output->should_print_backgrounds);
-  EXPECT_EQ(output->printed_doc_type, printing::mojom::SkiaDocumentType::kPDF);
-  EXPECT_TRUE(output->prefer_css_page_size);
-  EXPECT_EQ(output->pages_per_sheet, 1u);
-}
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 3159b54..bf5d2e30d 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -29,7 +29,6 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "components/grit/components_resources.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
@@ -38,6 +37,7 @@
 #include "printing/buildflags/buildflags.h"
 #include "printing/metafile_skia.h"
 #include "printing/mojom/print.mojom.h"
+#include "printing/print_job_constants.h"
 #include "printing/units.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
diff --git a/components/printing/renderer/print_render_frame_helper_mac.mm b/components/printing/renderer/print_render_frame_helper_mac.mm
index 26a7aa5..8cecf23 100644
--- a/components/printing/renderer/print_render_frame_helper_mac.mm
+++ b/components/printing/renderer/print_render_frame_helper_mac.mm
@@ -12,7 +12,6 @@
 #include "base/mac/scoped_nsautorelease_pool.h"
 #include "base/metrics/histogram.h"
 #include "cc/paint/paint_canvas.h"
-#include "components/printing/common/print_messages.h"
 #include "printing/buildflags/buildflags.h"
 #include "printing/metafile_skia.h"
 #include "printing/mojom/print.mojom.h"
diff --git a/components/printing/test/mock_printer.cc b/components/printing/test/mock_printer.cc
index ebab2e6..eefc165 100644
--- a/components/printing/test/mock_printer.cc
+++ b/components/printing/test/mock_printer.cc
@@ -10,7 +10,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "ipc/ipc_message_utils.h"
 #include "printing/metafile_skia.h"
 #include "printing/mojom/print.mojom.h"
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc
index 14997065..10d811b 100644
--- a/components/printing/test/print_render_frame_helper_browsertest.cc
+++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -19,7 +19,6 @@
 #include "build/chromeos_buildflags.h"
 #include "components/printing/common/print.mojom-test-utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "components/printing/test/mock_printer.h"
 #include "components/printing/test/print_test_content_renderer_client.h"
 #include "content/public/renderer/render_frame.h"
diff --git a/components/reading_list/core/reading_list_model_unittest.cc b/components/reading_list/core/reading_list_model_unittest.cc
index d8243da6..2d32acd 100644
--- a/components/reading_list/core/reading_list_model_unittest.cc
+++ b/components/reading_list/core/reading_list_model_unittest.cc
@@ -11,7 +11,7 @@
 #include "components/reading_list/core/reading_list_store_delegate.h"
 #include "components/sync/model/metadata_change_list.h"
 #include "components/sync/model/model_error.h"
-#include "components/sync/model_impl/client_tag_based_model_type_processor.h"
+#include "components/sync/test/model/mock_model_type_change_processor.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -40,10 +40,8 @@
   TestReadingListStorage(TestReadingListStorageObserver* observer,
                          base::SimpleTestClock* clock)
       : ReadingListModelStorage(
-            // TODO(crbug.com/823380): Consider using mock/fake here.
-            std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
-                syncer::READING_LIST,
-                /*dump_stack=*/base::RepeatingClosure())),
+            std::make_unique<
+                testing::NiceMock<syncer::MockModelTypeChangeProcessor>>()),
         entries_(new ReadingListStoreDelegate::ReadingListEntries()),
         observer_(observer),
         clock_(clock) {}
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_android.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_android.cc
index 13cc7e0..1782ffb5 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_android.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_android.cc
@@ -88,7 +88,7 @@
                                       const std::vector<std::string>& scopes) {
   JNIEnv* env = AttachCurrentThread();
   std::string scope = CombineScopes(scopes);
-  ScopedJavaLocalRef<jstring> j_username =
+  ScopedJavaLocalRef<jstring> j_email =
       ConvertUTF8ToJavaString(env, account_id_);
   ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope);
   std::unique_ptr<FetchOAuth2TokenCallback> heap_callback(
@@ -98,7 +98,7 @@
 
   // Call into Java to get a new token.
   signin::Java_ProfileOAuth2TokenServiceDelegate_getAccessTokenFromNative(
-      env, oauth2_token_service_delegate_->GetJavaObject(), j_username, j_scope,
+      env, oauth2_token_service_delegate_->GetJavaObject(), j_email, j_scope,
       reinterpret_cast<intptr_t>(heap_callback.release()));
 }
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
index 0a78901b..876536c 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegate.java
@@ -117,10 +117,9 @@
     @CalledByNative
     private void getAccessTokenFromNative(
             String accountEmail, String scope, final long nativeCallback) {
-        final Account account = accountEmail == null
-                ? null
-                : AccountUtils.findAccountByName(
-                        mAccountManagerFacade.tryGetGoogleAccounts(), accountEmail);
+        assert accountEmail != null : "Account email cannot be null!";
+        final Account account = AccountUtils.findAccountByName(
+                mAccountManagerFacade.tryGetGoogleAccounts(), accountEmail);
         if (account == null) {
             ThreadUtils.postOnUiThread(() -> {
                 ProfileOAuth2TokenServiceDelegateJni.get().onOAuth2TokenFetched(
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
index 04ebfc0..4f46781 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.Feature;
 import org.chromium.components.signin.AccessTokenData;
 import org.chromium.components.signin.AccountUtils;
@@ -25,6 +26,7 @@
 
 /** Tests for {@link ProfileOAuth2TokenServiceDelegate}. */
 @RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
 public class ProfileOAuth2TokenServiceDelegateTest {
     private FakeAccountManagerFacade mAccountManagerFacade;
 
diff --git a/components/site_engagement/content/site_engagement_service.cc b/components/site_engagement/content/site_engagement_service.cc
index 896da1f..07244378 100644
--- a/components/site_engagement/content/site_engagement_service.cc
+++ b/components/site_engagement/content/site_engagement_service.cc
@@ -23,6 +23,7 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/permissions/permissions_client.h"
+#include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/site_engagement/content/engagement_type.h"
 #include "components/site_engagement/content/site_engagement_metrics.h"
@@ -163,6 +164,12 @@
 const char SiteEngagementService::kEngagementParams[] = "SiteEngagement";
 
 // static
+void SiteEngagementService::RegisterProfilePrefs(PrefRegistrySimple* registry) {
+  registry->RegisterInt64Pref(prefs::kSiteEngagementLastUpdateTime, 0,
+                              PrefRegistry::LOSSY_PREF);
+}
+
+// static
 SiteEngagementService* SiteEngagementService::Get(
     content::BrowserContext* context) {
   return g_service_provider->GetSiteEngagementService(context);
diff --git a/components/site_engagement/content/site_engagement_service.h b/components/site_engagement/content/site_engagement_service.h
index 6dd38f34..fc30827 100644
--- a/components/site_engagement/content/site_engagement_service.h
+++ b/components/site_engagement/content/site_engagement_service.h
@@ -39,6 +39,7 @@
 
 class GURL;
 class HostContentSettingsMap;
+class PrefRegistrySimple;
 
 namespace site_engagement {
 
@@ -98,6 +99,8 @@
   // The name of the site engagement variation field trial.
   static const char kEngagementParams[];
 
+  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
   // Sets and clears the service provider. These are separate functions to
   // enable better checking.
   static void SetServiceProvider(ServiceProvider* provider);
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index e994f6d..6b1d842 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Es kann keine private Verbindung zu <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> hergestellt werden, weil Datum und Uhrzeit (<ph name="DATE_AND_TIME" />) Ihres Geräts falsch sind.&lt;/p&gt;
 
           &lt;p&gt;Stellen Sie in der App &lt;strong&gt;Einstellungen&lt;/strong&gt; im Bereich &lt;strong&gt;Allgemein&lt;/strong&gt; Datum und Uhrzeit richtig ein.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">Diese Richtlinie funktioniert wie beabsichtigt, an anderer Stelle ist jedoch der gleiche Wert festgelegt, der von dieser Richtlinie ersetzt wird.</translation>
 <translation id="1569487616857761740">Ablaufdatum eingeben</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Fehler beim Anzeigen dieser Webseite.</translation>
@@ -309,6 +310,7 @@
 <translation id="2114841414352855701">Wird ignoriert, da sie von <ph name="POLICY_NAME" /> außer Kraft gesetzt wurde.</translation>
 <translation id="2119505898009119320">Ausgestellt für: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">Lochung unten rechts</translation>
+<translation id="2122719317867821810">Diese Richtlinie funktioniert wie beabsichtigt, an anderer Stelle ist jedoch ein widersprüchlicher Wert festgelegt, der von dieser Richtlinie überschrieben wird.</translation>
 <translation id="2126374524350484896">PDF-Erstellungsprogramm:</translation>
 <translation id="2129079103035905234">Bewegungssensoren</translation>
 <translation id="2130448033692577677">Die von Ihnen angegebenen Vorlagen können nicht angewendet werden, weil die Richtlinie "DnsOverHttpsMode" nicht konfiguriert ist.</translation>
@@ -575,6 +577,7 @@
 <translation id="3229041911291329567">Versionsinformationen zu Ihrem Gerät und Browser</translation>
 <translation id="323107829343500871">CVC für <ph name="CREDIT_CARD" /> eingeben</translation>
 <translation id="3234666976984236645">Wichtige Inhalte auf dieser Website immer erkennen</translation>
+<translation id="3266793032086590337">Wert (Konflikt)</translation>
 <translation id="3270847123878663523">&amp;Neu anordnen rückgängig machen</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">Angabe für "Name auf der Karte" hinzufügen</translation>
@@ -726,6 +729,7 @@
 <translation id="3807873520724684969">Schädliche Inhalte blockiert.</translation>
 <translation id="3808375843007691220">Warnung: experimentelle Funktionen!</translation>
 <translation id="3810973564298564668">Verwalten</translation>
+<translation id="3816482573645936981">Wert (ersetzt)</translation>
 <translation id="382518646247711829">Falls Sie einen Proxyserver verwenden...</translation>
 <translation id="3827112369919217609">Absolut</translation>
 <translation id="3828924085048779000">Eine leere Passphrase ist nicht zulässig.</translation>
@@ -915,6 +919,7 @@
 <translation id="4579056131138995126">Personal (Umschlag)</translation>
 <translation id="4582204425268416675">Karte entfernen</translation>
 <translation id="4587425331216688090">Adresse aus Chrome entfernen?</translation>
+<translation id="459089498662672729">Die Administratorrichtlinie empfiehlt, keine Inhalte aus <ph name="ORIGIN_NAME" /> an dieser Stelle einzufügen</translation>
 <translation id="4592951414987517459">Ihre Verbindung zu <ph name="DOMAIN" /> ist mit einer modernen Codier-Suite verschlüsselt.</translation>
 <translation id="4594403342090139922">&amp;Löschen rückgängig machen</translation>
 <translation id="4597348597567598915">Größe 8</translation>
@@ -1077,6 +1082,7 @@
 <translation id="519422657042045905">Anmerkungsmodus nicht verfügbar</translation>
 <translation id="5201306358585911203">Auf einer in dieser Seite eingebetteten Seite wird Folgendes angezeigt</translation>
 <translation id="5205222826937269299">Name erforderlich</translation>
+<translation id="5208899478506185232"><ph name="ONE_TIME_CODE" /> ist Ihr Code für <ph name="TOP_ORIGIN" /> (über <ph name="EMBEDDED_ORIGIN" />)</translation>
 <translation id="5209518306177824490">SHA-1-Fingerabdruck</translation>
 <translation id="5215116848420601511">Bei Google Pay gespeicherte Zahlungsmethoden und Adressen</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1206,6 +1212,7 @@
 <translation id="5689199277474810259">Als JSON exportieren</translation>
 <translation id="5689516760719285838">Standort</translation>
 <translation id="569000877158168851">Der Wert von "DnsOverHttpsTemplates" ist nicht relevant und wird nicht verwendet, es sei denn, die Richtlinie "DnsOverHttpsMode" ist auf <ph name="SECURE_DNS_MODE_AUTOMATIC" /> oder <ph name="SECURE_DNS_MODE_SECURE" /> gesetzt.</translation>
+<translation id="5695542892312572833">Möchten Sie zum Bestätigen und Abschließen Ihres Kaufs Windows Hello verwenden?</translation>
 <translation id="5701381305118179107">Zentrieren</translation>
 <translation id="570530837424789914">Verwalten…</translation>
 <translation id="57094364128775171">Starkes Passwort vorschlagen…</translation>
@@ -1397,6 +1404,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6451458296329894277">Erneute Formular-Übermittlung bestätigen</translation>
 <translation id="6457206614190510200">Rückendrahtheftung</translation>
+<translation id="6458606150257356946">Trotzdem einfügen</translation>
 <translation id="6465306955648956876">Passwörter verwalten…</translation>
 <translation id="6468485451923838994">Schriftarten</translation>
 <translation id="647261751007945333">Geräterichtlinien</translation>
@@ -1492,6 +1500,7 @@
 <translation id="6950684638814147129">Fehler beim Parsen des JSON-Werts: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">Alle zurücksetzen</translation>
 <translation id="6957887021205513506">Das Zertifikat des Servers ist möglicherweise eine Fälschung.</translation>
+<translation id="6963520811470373926">Ersetzt</translation>
 <translation id="6964255747740675745">Netzwerkkonfiguration konnte nicht geparst werden (ungültige JSON-Datei).</translation>
 <translation id="6965382102122355670">Ok</translation>
 <translation id="6965978654500191972">Gerät</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index dd78bcc8..3181569 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Ezin da ezarri <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> domeinurako konexio pribatua, gailuaren data eta ordua (<ph name="DATE_AND_TIME" />) okerrak direlako.&lt;/p&gt;
 
           &lt;p&gt;Doitu data eta ordua &lt;strong&gt;Ezarpenak&lt;/strong&gt; aplikazioko &lt;strong&gt;Orokorra&lt;/strong&gt; atalean.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">Gidalerroak espero bezala funtzionatzen du, baina beste nonbait balio bera dago ezarrita, eta gidalerro honek hura ordezten du.</translation>
 <translation id="1569487616857761740">Adierazi iraungitze-data</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Arazoren bat izan da web-orria bistaratzean.</translation>
@@ -309,6 +310,7 @@
 <translation id="2114841414352855701">Ez ikusi egin zaio <ph name="POLICY_NAME" /> gidalerroak gainidatzi duelako.</translation>
 <translation id="2119505898009119320">Honi jaulkia: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">Zulo bat behean, eskuinetara</translation>
+<translation id="2122719317867821810">Gidalerroak espero bezala funtzionatzen du, baina gatazka sortzen duen balioa beste nonbait dago ezarrita, eta gidalerro honek hura ordezten du.</translation>
 <translation id="2126374524350484896">PDFaren egilea:</translation>
 <translation id="2129079103035905234">Mugimendu-sentsoreak</translation>
 <translation id="2130448033692577677">Baliteke zehaztu dituzun txantiloiak ez aplikatzea, DnsOverHttpsMode gidalerroa ez delako ezarri.</translation>
@@ -572,6 +574,7 @@
 <translation id="3229041911291329567">Gailuaren eta arakatzailearen bertsioari buruzko informazioa</translation>
 <translation id="323107829343500871">Idatzi <ph name="CREDIT_CARD" /> txartelaren CVC kodea</translation>
 <translation id="3234666976984236645">Hauteman beti webgune honetako eduki garrantzitsua</translation>
+<translation id="3266793032086590337">Balioa (gatazka)</translation>
 <translation id="3270847123878663523">&amp;Desegin berrantolatzea</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">Gehitu titularra</translation>
@@ -724,6 +727,7 @@
 <translation id="3807873520724684969">Eduki kaltegarria blokeatu da.</translation>
 <translation id="3808375843007691220">Abisua: eginbide esperimentalak daude hemen!</translation>
 <translation id="3810973564298564668">Kudeatu</translation>
+<translation id="3816482573645936981">Balioa (ordeztua)</translation>
 <translation id="382518646247711829">Proxy-zerbitzari bat erabiltzen baduzu…</translation>
 <translation id="3827112369919217609">Absolutua</translation>
 <translation id="3828924085048779000">Pasaesaldia ezin da hutsik utzi.</translation>
@@ -913,6 +917,7 @@
 <translation id="4579056131138995126">Personal (gutun-azala)</translation>
 <translation id="4582204425268416675">Kendu txartela</translation>
 <translation id="4587425331216688090">Helbidea Chrome-tik kendu nahi duzu?</translation>
+<translation id="459089498662672729">Administratzailearen gidalerroek ez dute gomendatzen <ph name="ORIGIN_NAME" /> domeinuko edukia kokapen honetan itsastea</translation>
 <translation id="4592951414987517459"><ph name="DOMAIN" /> domeinurako konexioa enkriptatze multzo moderno bat erabilita enkriptatu da.</translation>
 <translation id="4594403342090139922">&amp;Desegin ezabatzea</translation>
 <translation id="4597348597567598915">Tamaina: 8</translation>
@@ -1075,6 +1080,7 @@
 <translation id="519422657042045905">Oharpena ez dago erabilgarri</translation>
 <translation id="5201306358585911203">Orriko orri kapsulatu batek hau dio:</translation>
 <translation id="5205222826937269299">Nahitaez zehaztu behar duzu izena</translation>
+<translation id="5208899478506185232"><ph name="ONE_TIME_CODE" /> da <ph name="TOP_ORIGIN" /> helbideko kodea (<ph name="EMBEDDED_ORIGIN" /> bidez)</translation>
 <translation id="5209518306177824490">SHA-1 erreferentzia-gako digitala</translation>
 <translation id="5215116848420601511">Google Pay-rekin erabiltzen dituzun ordainketa-metodoak eta helbideak</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1204,6 +1210,7 @@
 <translation id="5689199277474810259">Esportatu JSON formatura</translation>
 <translation id="5689516760719285838">Kokapena</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates aukerako balioa ez da egokia, eta ez da erabiliko DnsOverHttpsMode gidalerroan <ph name="SECURE_DNS_MODE_AUTOMATIC" /> edo <ph name="SECURE_DNS_MODE_SECURE" /> ezarri ezean.</translation>
+<translation id="5695542892312572833">Windows Hello erabili nahi duzu erosketa egiaztatzeko eta osatzeko?</translation>
 <translation id="5701381305118179107">Erdiratu</translation>
 <translation id="570530837424789914">Kudeatu…</translation>
 <translation id="57094364128775171">Iradoki pasahitz seguru bat…</translation>
@@ -1394,6 +1401,7 @@
 <translation id="6447842834002726250">Cookieak</translation>
 <translation id="6451458296329894277">Berretsi inprimakia berriro bidali nahi duzula</translation>
 <translation id="6457206614190510200">Grapa bidezko koadernatzea</translation>
+<translation id="6458606150257356946">Itsatsi halere</translation>
 <translation id="6465306955648956876">Kudeatu pasahitzak…</translation>
 <translation id="6468485451923838994">Letrak</translation>
 <translation id="647261751007945333">Gailuaren gidalerroak</translation>
@@ -1489,6 +1497,7 @@
 <translation id="6950684638814147129">Errore bat gertatu da JSON balio bat analizatzean: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">Berrezarri guztiak</translation>
 <translation id="6957887021205513506">Zerbitzariaren ziurtagiriak faltsifikazioa dirudi.</translation>
+<translation id="6963520811470373926">Ordezten</translation>
 <translation id="6964255747740675745">Ezin izan da analizatu sarearen konfigurazioa (JSON formatuak ez du balio).</translation>
 <translation id="6965382102122355670">Ados</translation>
 <translation id="6965978654500191972">Gailua</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 6c2b97e..a580119f 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Impossible d'établir une connexion privée à <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> : la date et l'heure de votre appareil (<ph name="DATE_AND_TIME" />) sont incorrectes.&lt;/p&gt;
 
       &lt;p&gt;Veuillez ajuster la date et l'heure dans la section &lt;strong&gt;Général&lt;/strong&gt; de l'application &lt;strong&gt;Réglages&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">Cette règle fonctionne comme prévu, mais notez que la même valeur a été définie ailleurs et que cette règle la remplace.</translation>
 <translation id="1569487616857761740">Saisir la date d'expiration</translation>
 <translation id="1581080074034554886">Code CVC :</translation>
 <translation id="1583429793053364125">Une erreur s'est produite lors de l'affichage de la page Web.</translation>
@@ -313,6 +314,7 @@
 <translation id="2114841414352855701">Ignorée parce que remplacée par <ph name="POLICY_NAME" />.</translation>
 <translation id="2119505898009119320">Émis pour : <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">Perforation en bas à droite</translation>
+<translation id="2122719317867821810">Cette règle fonctionne comme prévu, mais notez qu'une valeur conflictuelle a été définie ailleurs et que cette règle la remplace.</translation>
 <translation id="2126374524350484896">Outil de conversion PDF :</translation>
 <translation id="2129079103035905234">Capteurs de mouvement</translation>
 <translation id="2130448033692577677">Les modèles que vous avez spécifiés risquent de ne pas être appliqués, car la règle DnsOverHttpsMode n'est pas configurée.</translation>
@@ -579,6 +581,7 @@
 <translation id="3229041911291329567">Informations sur la version de l'appareil et du navigateur</translation>
 <translation id="323107829343500871">Saisir le code CVC de la carte <ph name="CREDIT_CARD" /></translation>
 <translation id="3234666976984236645">Toujours détecter du contenu important sur ce site</translation>
+<translation id="3266793032086590337">Valeur (conflit)</translation>
 <translation id="3270847123878663523">&amp;Annuler la réorganisation</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">Ajouter le nom sur la carte</translation>
@@ -732,6 +735,7 @@
 <translation id="3807873520724684969">Contenu malveillant bloqué.</translation>
 <translation id="3808375843007691220">Attention : Fonctionnalités expérimentales sur cette page !</translation>
 <translation id="3810973564298564668">Gérer</translation>
+<translation id="3816482573645936981">Valeur (remplacée)</translation>
 <translation id="382518646247711829">Si vous utilisez un serveur proxy…</translation>
 <translation id="3827112369919217609">Valeur absolue</translation>
 <translation id="3828924085048779000">La phrase secrète est obligatoire.</translation>
@@ -926,6 +930,7 @@
 <translation id="4579056131138995126">Personal (enveloppe)</translation>
 <translation id="4582204425268416675">Supprimer la carte</translation>
 <translation id="4587425331216688090">Supprimer l'adresse de Chrome ?</translation>
+<translation id="459089498662672729">Une règle définie par l'administrateur interdit de coller du contenu provenant de "<ph name="ORIGIN_NAME" />" à cet endroit</translation>
 <translation id="4592951414987517459">Votre connexion à <ph name="DOMAIN" /> est chiffrée à l'aide d'une méthode de chiffrement récente.</translation>
 <translation id="4594403342090139922">&amp;Annuler la suppression</translation>
 <translation id="4597348597567598915">Taille 8</translation>
@@ -1088,6 +1093,7 @@
 <translation id="519422657042045905">Annotation indisponible</translation>
 <translation id="5201306358585911203">Une page intégrée à cette page Web indique</translation>
 <translation id="5205222826937269299">Veuillez saisir un nom</translation>
+<translation id="5208899478506185232"><ph name="ONE_TIME_CODE" /> est votre code pour <ph name="TOP_ORIGIN" /> (via <ph name="EMBEDDED_ORIGIN" />)</translation>
 <translation id="5209518306177824490">Empreinte SHA-1</translation>
 <translation id="5215116848420601511">Modes de paiement et adresses utilisés dans Google Pay</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1217,6 +1223,7 @@
 <translation id="5689199277474810259">Exporter au format JSON</translation>
 <translation id="5689516760719285838">Position</translation>
 <translation id="569000877158168851">La valeur de la règle DnsOverHttpsTemplates n'est pas valide et ne sera pas utilisée, sauf si la règle DnsOverHttpsMode est définie sur <ph name="SECURE_DNS_MODE_AUTOMATIC" /> ou <ph name="SECURE_DNS_MODE_SECURE" />.</translation>
+<translation id="5695542892312572833">Utiliser Windows Hello pour valider et finaliser votre achat ?</translation>
 <translation id="5701381305118179107">Centrer</translation>
 <translation id="570530837424789914">Gérer…</translation>
 <translation id="57094364128775171">Suggérer un mot de passe sécurisé…</translation>
@@ -1408,6 +1415,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6451458296329894277">Confirmer le nouvel envoi du formulaire</translation>
 <translation id="6457206614190510200">Agrafage à cheval</translation>
+<translation id="6458606150257356946">Coller quand même</translation>
 <translation id="6465306955648956876">Gérer les mots de passe…</translation>
 <translation id="6468485451923838994">Polices</translation>
 <translation id="647261751007945333">Règles relatives aux appareils</translation>
@@ -1503,6 +1511,7 @@
 <translation id="6950684638814147129">Erreur lors de l'analyse de la valeur JSON : <ph name="ERROR" /></translation>
 <translation id="695140971690006676">Tout réinitialiser</translation>
 <translation id="6957887021205513506">Le certificat du serveur semble être contrefait.</translation>
+<translation id="6963520811470373926">Remplacer</translation>
 <translation id="6964255747740675745">Échec de l'analyse de la configuration réseau (JSON non valide).</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965978654500191972">Périphérique</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb
index 8ac6daa..c7124164 100644
--- a/components/strings/components_strings_gl.xtb
+++ b/components/strings/components_strings_gl.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;Non se pode establecer unha conexión privada con <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> porque a data e a hora do dispositivo (<ph name="DATE_AND_TIME" />) son incorrectas.&lt;/p&gt;
 
       &lt;p&gt;Axusta a data e a hora na sección &lt;strong&gt;Xeral&lt;/strong&gt; da aplicación &lt;strong&gt;Configuración&lt;/strong&gt;.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">Esta política funciona segundo o previsto, pero substitúe un valor equivalente que está definido noutro lugar.</translation>
 <translation id="1569487616857761740">Introduce unha data de vencemento</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">Produciuse un erro ao mostrar esta páxina web.</translation>
@@ -312,6 +313,7 @@
 <translation id="2114841414352855701">Ignorouse porque a anulou <ph name="POLICY_NAME" />.</translation>
 <translation id="2119505898009119320">Emitida para: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">Perforación na parte inferior dereita</translation>
+<translation id="2122719317867821810">Esta política funciona segundo o previsto, pero anula un valor en conflito que está definido noutro lugar.</translation>
 <translation id="2126374524350484896">Produtor do PDF:</translation>
 <translation id="2129079103035905234">Sensores de movemento</translation>
 <translation id="2130448033692577677">Os modelos que especificaches poden non aplicarse debido a que non se definiu a política DnsOverHttpsMode.</translation>
@@ -578,6 +580,7 @@
 <translation id="3229041911291329567">Información sobre a versión do dispositivo e do navegador</translation>
 <translation id="323107829343500871">Introduce o código CVC da tarxeta <ph name="CREDIT_CARD" /></translation>
 <translation id="3234666976984236645">Detectar sempre contido importante neste sitio</translation>
+<translation id="3266793032086590337">Valor (en conflito)</translation>
 <translation id="3270847123878663523">&amp;Desfacer de cambio de orde</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">Engadir o nome que aparece na tarxeta</translation>
@@ -731,6 +734,7 @@
 <translation id="3807873520724684969">Bloqueouse o contido daniño.</translation>
 <translation id="3808375843007691220">Advertencia: Detectáronse funcións experimentais.</translation>
 <translation id="3810973564298564668">Xestionar</translation>
+<translation id="3816482573645936981">Valor (substituído)</translation>
 <translation id="382518646247711829">Se utilizas un servidor proxy...</translation>
 <translation id="3827112369919217609">Absoluto</translation>
 <translation id="3828924085048779000">A frase de acceso non pode estar baleira.</translation>
@@ -925,6 +929,7 @@
 <translation id="4579056131138995126">Personal (sobre)</translation>
 <translation id="4582204425268416675">Quitar tarxeta</translation>
 <translation id="4587425331216688090">Queres eliminar o enderezo de Chrome?</translation>
+<translation id="459089498662672729">A política do administrador non recomenda pegar contido de <ph name="ORIGIN_NAME" /> nesta localización</translation>
 <translation id="4592951414987517459">A túa conexión a <ph name="DOMAIN" /> está encriptada cun conxunto de cifrado moderno.</translation>
 <translation id="4594403342090139922">&amp;Desfacer eliminación</translation>
 <translation id="4597348597567598915">Tamaño 8</translation>
@@ -1087,6 +1092,7 @@
 <translation id="519422657042045905">O modo de anotación non está dispoñible</translation>
 <translation id="5201306358585911203">Unha páxina inserida nesta páxina di</translation>
 <translation id="5205222826937269299">É obrigatorio introducir o nome</translation>
+<translation id="5208899478506185232"><ph name="ONE_TIME_CODE" /> é o teu código para <ph name="TOP_ORIGIN" /> (a través de <ph name="EMBEDDED_ORIGIN" />)</translation>
 <translation id="5209518306177824490">Impresión dixital SHA-1</translation>
 <translation id="5215116848420601511">Métodos de pago e enderezos que usan Google Pay</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1216,6 +1222,7 @@
 <translation id="5689199277474810259">Exportar a JSON</translation>
 <translation id="5689516760719285838">Localización</translation>
 <translation id="569000877158168851">O valor de DnsOverHttpsTemplates non é relevante e non se utilizará, a non ser que a política DnsOverHttpsMode se defina como <ph name="SECURE_DNS_MODE_AUTOMATIC" /> ou <ph name="SECURE_DNS_MODE_SECURE" />.</translation>
+<translation id="5695542892312572833">Queres utilizar Windows Hello para verificar e completar a compra?</translation>
 <translation id="5701381305118179107">Centrar</translation>
 <translation id="570530837424789914">Xestiona o contido...</translation>
 <translation id="57094364128775171">Suxerir contrasinal seguro…</translation>
@@ -1407,6 +1414,7 @@
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6451458296329894277">Confirmar reenvío do formulario</translation>
 <translation id="6457206614190510200">Costura</translation>
+<translation id="6458606150257356946">Pegar de todas as formas</translation>
 <translation id="6465306955648956876">Xestiona os contrasinais…</translation>
 <translation id="6468485451923838994">Letras</translation>
 <translation id="647261751007945333">Políticas de dispositivo</translation>
@@ -1502,6 +1510,7 @@
 <translation id="6950684638814147129">Produciuse un erro ao analizar o valor JSON: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">Restablecer todo</translation>
 <translation id="6957887021205513506">O certificado do servidor parece ser falso.</translation>
+<translation id="6963520811470373926">En substitución doutro valor</translation>
 <translation id="6964255747740675745">Non se puido analizar a configuración da rede (ficheiro JSON non válido).</translation>
 <translation id="6965382102122355670">Aceptar</translation>
 <translation id="6965978654500191972">Dispositivo</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index 26e2165f..2bf4c47e 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -948,7 +948,7 @@
 <translation id="4644670975240021822">ផ្កាប់ចុះ​តាមលំដាប់លំដោយ​បញ្ច្រាស</translation>
 <translation id="4646534391647090355">នាំខ្ញុំទៅទីនោះឥឡូវនេះ</translation>
 <translation id="4658638640878098064">កិប​ខាងលើ​ផ្នែកខាងឆ្វេង</translation>
-<translation id="4660119392514473465">ឥឡូវនេះ អ្នក​អាច​រុករក​ជាលក្ខណៈ​ឯកជន​បានហើយ ដូច្នេះ​អ្នកផ្សេងទៀត​ដែល​ប្រើ​ឧបករណ៍​នេះ​នឹង​មើលមិនឃើញ​សកម្មភាព​របស់អ្នក​ទេ។ ទោះបីជា​យ៉ាងនេះក្តី ការទាញយក ​ចំណាំ​ និងធាតុនៃបញ្ជីនឹងត្រូវបានរក្សាទុក។</translation>
+<translation id="4660119392514473465">ឥឡូវនេះ អ្នក​អាច​រុករក​ជាលក្ខណៈ​ឯកជន​បានហើយ ដូច្នេះ​អ្នកផ្សេងទៀត​ដែល​ប្រើ​ឧបករណ៍​នេះ​នឹង​មើលមិនឃើញ​សកម្មភាព​របស់អ្នក​ទេ។ ទោះបីជា​យ៉ាងនេះក្តី ការទាញយក ​ចំណាំ​ និងធាតុនៃបញ្ជីអាននឹងត្រូវបានរក្សាទុក។</translation>
 <translation id="4668929960204016307">,</translation>
 <translation id="4670064810192446073">VR</translation>
 <translation id="4675657451653251260">អ្នកនឹងមិនឃើញព័ត៌មានរបស់កម្រងព័ត៌មាន Chrome នៅក្នុងមុខងារ​ភ្ញៀវទេ។ អ្នកអាច<ph name="LINK_BEGIN" />ចូល<ph name="LINK_END" /> ដើម្បីចូលប្រើព័ត៌មានគណនី Google របស់អ្នកដូចជា ពាក្យសម្ងាត់ និងវិធីបង់ប្រាក់ជាដើម។</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 4e79bb42..cef6bc1 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;നിങ്ങളുടെ ഉപകരണത്തിന്റെ തീയതിയും സമയവും (<ph name="DATE_AND_TIME" />) തെറ്റായതിനാൽ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> എന്നതിലേക്ക് ഒരു സ്വകാര്യ കണക്ഷൻ സ്ഥാപിക്കാനാകില്ല.&lt;/p&gt;
 
           &lt;p&gt;&lt;strong&gt;ക്രമീകരണ&lt;/strong&gt; ആപ്പിന്റെ &lt;strong&gt;പൊതുവായവ&lt;/strong&gt; വിഭാഗത്തിൽ നിന്ന് തീയതിയും സമയവും ക്രമീകരിക്കുക.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">ഈ നയം ഉദ്ദേശിച്ചത് പോലെ പ്രവർത്തിക്കുന്നുണ്ട്, എന്നാൽ മറ്റൊരു ഉറവിടത്തിൽ അതേ മൂല്യം സജ്ജീകരിച്ചതിനെ തുടർന്ന് ഈ നയത്തിന് പകരം മറ്റൊന്ന് സജീവമായി.</translation>
 <translation id="1569487616857761740">കാലഹരണപ്പെടുന്ന തീയതി നൽകുക</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">ഈ വെബ്‌പേജ് പ്രദർശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.</translation>
@@ -312,6 +313,7 @@
 <translation id="2114841414352855701"> <ph name="POLICY_NAME" /> എന്നതിനാൽ മറികടന്നതിനാൽ ഇത് അവഗണിച്ചു.</translation>
 <translation id="2119505898009119320">ഇതിന് നല്‍‌കി: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">താഴെ വലതുവശത്ത് പഞ്ച് ചെയ്യുക</translation>
+<translation id="2122719317867821810">ഈ നയം ഉദ്ദേശിച്ചത് പോലെ പ്രവർത്തിക്കുന്നുണ്ട്, എന്നാൽ മറ്റൊരു ഉറവിടത്തിൽ വൈരുദ്ധ്യമുള്ള മൂല്യം സജ്ജീകരിച്ചതിനെ തുടർന്ന് ഈ നയം അസാധുവാക്കി.</translation>
 <translation id="2126374524350484896">PDF പ്രൊഡ്യൂസർ:</translation>
 <translation id="2129079103035905234">ചലന സെൻസറുകൾ</translation>
 <translation id="2130448033692577677">DnsOverHttpsMode നയം സജ്ജീകരിക്കാത്തതിനാൽ നിങ്ങൾ വ്യക്തമാക്കിയ ടെംപ്ലേറ്റുകൾ ബാധകമാക്കാനായേക്കില്ല.</translation>
@@ -577,6 +579,7 @@
 <translation id="3229041911291329567">നിങ്ങളുടെ ഉപകരണത്തെയും ബ്രൗസറിനെയും കുറിച്ചുള്ള പതിപ്പ് വിവരങ്ങൾ</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" />-ന്‍റെ CVC നൽകുക</translation>
 <translation id="3234666976984236645">ഈ സൈറ്റിൽ എപ്പോഴും പ്രധാന ഉള്ളടക്കം കണ്ടെത്തുക</translation>
+<translation id="3266793032086590337">മൂല്യം (വൈരുദ്ധ്യം)</translation>
 <translation id="3270847123878663523">&amp;പുനഃക്രമീകരിക്കുന്നത് പഴയപടിയാക്കുക</translation>
 <translation id="3274521967729236597">പാ-കായ്</translation>
 <translation id="3282497668470633863">കാർഡിൽ പേര് ചേർക്കുക</translation>
@@ -730,6 +733,7 @@
 <translation id="3807873520724684969">ദോഷകരമായ ഉള്ളടക്കം ബ്ലോക്ക് ചെയ്‌തു.</translation>
 <translation id="3808375843007691220">മുന്നറിയിപ്പ്: പരീക്ഷണാത്മക ഫീച്ചറുകൾ കണ്ടേക്കാം, ജാഗ്രത പുലർത്തുക!</translation>
 <translation id="3810973564298564668">മാനേജ് ചെയ്യുക</translation>
+<translation id="3816482573645936981">മൂല്യം (പകരം മറ്റൊന്ന് സജീവം)</translation>
 <translation id="382518646247711829">നിങ്ങൾ ഒരു പ്രോക്‌സി സെർവർ ഉപയോഗിക്കുന്നെങ്കിൽ...</translation>
 <translation id="3827112369919217609">അബ്‌സല്യൂട്ട്</translation>
 <translation id="3828924085048779000">പാസ്ഫ്രെയ്‍സ് പൂരിപ്പിക്കാതിരിക്കാനാവില്ല.</translation>
@@ -922,6 +926,7 @@
 <translation id="4579056131138995126">വ്യക്തിപരം (എൻവലപ്പ്)</translation>
 <translation id="4582204425268416675">കാർഡ് നീക്കം ചെയ്യുക</translation>
 <translation id="4587425331216688090">Chrome-ൽ നിന്ന് വിലാസം നീക്കംചെയ്യണോ?</translation>
+<translation id="459089498662672729"><ph name="ORIGIN_NAME" /> എന്നതിൽ നിന്ന് ഈ ലൊക്കേഷനിലേക്ക് ഒട്ടിക്കുന്നത് അഡ്‌മിൻ നയം ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation>
 <translation id="4592951414987517459"><ph name="DOMAIN" /> എന്നതിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷനെ ആധുനിക സൈഫർ സ്യൂട്ട് ഉപയോഗിച്ച് എൻക്രിപ്റ്റുചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="4594403342090139922">&amp;ഇല്ലാതാക്കുന്നത് പഴയപടിയാക്കുക</translation>
 <translation id="4597348597567598915">വലുപ്പം 8</translation>
@@ -1084,6 +1089,7 @@
 <translation id="519422657042045905">കുറിപ്പ് ലഭ്യമല്ല</translation>
 <translation id="5201306358585911203">ഈ പേജിലെ ഉൾച്ചേർത്ത പേജ് പറയുന്നത്:</translation>
 <translation id="5205222826937269299">പേര് ആവശ്യമാണ്</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" /> എന്നതിനുള്ള നിങ്ങളുടെ കോഡ് <ph name="ONE_TIME_CODE" /> ആണ് (<ph name="EMBEDDED_ORIGIN" /> വഴി)</translation>
 <translation id="5209518306177824490">SHA-1 ഫിംഗര്‍‌പ്രിന്‍റ്</translation>
 <translation id="5215116848420601511">Google Pay ഉപയോഗിക്കുന്ന വിലാസങ്ങളും പേയ്മെന്റ് രീതികളും</translation>
 <translation id="5215363486134917902">ഫോളിയോ-Sp</translation>
@@ -1213,6 +1219,7 @@
 <translation id="5689199277474810259">JSON-ലേക്ക് ‌എക്‌സ്‌പോർട്ട് ചെയ്യുക</translation>
 <translation id="5689516760719285838">ലൊക്കേഷൻ</translation>
 <translation id="569000877158168851">DnsOverHttpsMode നയം <ph name="SECURE_DNS_MODE_AUTOMATIC" /> എന്നതിലേക്ക് അല്ലെങ്കിൽ <ph name="SECURE_DNS_MODE_SECURE" /> എന്നതിലേക്ക് സജ്ജീകരിക്കുന്നില്ലെങ്കിൽ DnsOverHttpsTemplates മൂല്യം പ്രസക്തമായിരിക്കില്ല, അത് ഉപയോഗിക്കുകയുമില്ല.</translation>
+<translation id="5695542892312572833">പരിശോധിച്ചുറപ്പിക്കാനും വാങ്ങൽ പൂർത്തിയാക്കാനും Windows Hello ഉപയോഗിക്കണോ?</translation>
 <translation id="5701381305118179107">മധ്യഭാഗം</translation>
 <translation id="570530837424789914">മാനേജ് ചെയ്യുക...</translation>
 <translation id="57094364128775171">ശക്തമായ പാസ്‌വേഡ് നിർദ്ദേശിക്കുക…</translation>
@@ -1404,6 +1411,7 @@
 <translation id="6447842834002726250">കുക്കികള്‍</translation>
 <translation id="6451458296329894277">വീണ്ടും സമര്‍പ്പിക്കല്‍ അപേക്ഷ ഉറപ്പാക്കുക</translation>
 <translation id="6457206614190510200">സാഡിൽ സ്‌റ്റിച്ച്</translation>
+<translation id="6458606150257356946">എന്തായാലും ഒട്ടിക്കുക</translation>
 <translation id="6465306955648956876">പാസ്‌വേഡുകൾ മാനേജ് ചെയ്യുക...</translation>
 <translation id="6468485451923838994">ഫോണ്ടുകൾ</translation>
 <translation id="647261751007945333">ഉപകരണ നയങ്ങൾ</translation>
@@ -1499,6 +1507,7 @@
 <translation id="6950684638814147129">JSON മൂല്യം വിശകലനം ചെയ്യുമ്പോൾ പിശക്: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">എല്ലാം റീസെറ്റ് ചെയ്യുക</translation>
 <translation id="6957887021205513506">സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് വിശ്വസിക്കാൻ കൊള്ളാത്ത ഒന്നായി തോന്നുന്നു.</translation>
+<translation id="6963520811470373926">പകരം മറ്റൊന്ന് സജീവം</translation>
 <translation id="6964255747740675745">നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ വിശകലനം ചെയ്യാനായില്ല (അസാധുവായ JSON).</translation>
 <translation id="6965382102122355670">ശരി</translation>
 <translation id="6965978654500191972">ഉപകരണം</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb
index d93c8ddb..556264f 100644
--- a/components/strings/components_strings_ne.xtb
+++ b/components/strings/components_strings_ne.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> सँग निजी जडान स्थापना गर्न सकिँदैन किनकि तपाईँको यन्त्रको मिति र समय (<ph name="DATE_AND_TIME" />) सही छैनन्।&lt;/p&gt;
 
       &lt;p&gt;कृपया मिति र समय मिलाउन &lt;strong&gt;सेटिङ&lt;/strong&gt; एपको &lt;strong&gt;सामान्य&lt;/strong&gt; खण्डमा गई मिलाउनुहोस्।&lt;/p&gt;</translation>
+<translation id="1567040042588613346">यो नीतिले सोचेअनुसार काम गरिरहेको छ तर एउटै मान अन्यत्र तय गरिएका कारण यस नीतिअनुसार उक्त मानको साटो अर्को मान लागू गरिएको छ।</translation>
 <translation id="1569487616857761740">म्याद सकिने मिति प्रविष्टि गर्नुहोस्</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">यो वेबपृष्ठ प्रदर्शन गर्दा कुनै त्रुटी भयो।</translation>
@@ -313,6 +314,7 @@
 <translation id="2114841414352855701">यसलाई <ph name="POLICY_NAME" /> द्वारा ओभरराइड गरिएको हुनाले उपेक्षा गरियो।</translation>
 <translation id="2119505898009119320">जारी गरिएको सङ्गठन: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">फेदको दायाँपट्टि प्वाल</translation>
+<translation id="2122719317867821810">यो नीतिले सोचेअनुसार काम गरिरहेको छ तर बेमेल मान अन्यत्र तय गरिएका कारण यस नीतिअनुसार उक्त मान प्रतिस्थापन गरिएको छ।</translation>
 <translation id="2126374524350484896">PDF निर्माता:</translation>
 <translation id="2129079103035905234">चालसम्बन्धी सेन्सरहरू</translation>
 <translation id="2130448033692577677">DnsOverHttpsMode नीति निर्धारण नगरिएकाले तपाईंले तोक्नुभएका टेम्प्लेटहरू लागू नहुन सक्छन्।</translation>
@@ -578,6 +580,7 @@
 <translation id="3229041911291329567">तपाईंको यन्त्र र ब्राउजरको संस्करणसम्बन्धी जानकारी</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" /> को CVC प्रविष्टि गर्नुहोस्</translation>
 <translation id="3234666976984236645">सधैं यस साइटमा महत्वपूर्ण सामग्री पत्ता लगाउनुहोस्</translation>
+<translation id="3266793032086590337">मान (बेमेल)</translation>
 <translation id="3270847123878663523">क्रम परिवर्तन &amp;पूर्ववत गर्नुहोस्</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">कार्डमा रहेको नाम थप्नुहोस्</translation>
@@ -731,6 +734,7 @@
 <translation id="3807873520724684969">हानिकारक सामग्रीमाथि रोक लगाइयो।</translation>
 <translation id="3808375843007691220">चेतावनी: अगाडि परीक्षणको चरणमा रहेका सुविधाहरू छन्!</translation>
 <translation id="3810973564298564668">व्यवस्थित गर्नुहोस्</translation>
+<translation id="3816482573645936981">मान (यो मानको साटो लागू गरिएको)</translation>
 <translation id="382518646247711829">यदि तपाईंले कुनै एउटा प्रोक्सी सर्भर प्रयोग गर्नुभयो भने ...</translation>
 <translation id="3827112369919217609">निरपेक्ष</translation>
 <translation id="3828924085048779000">खाली पासफ्रेजको लागि अनुमति छैन।</translation>
@@ -924,6 +928,7 @@
 <translation id="4579056131138995126">Personal (Envelope)</translation>
 <translation id="4582204425268416675">कार्ड हटाउनुहोस्</translation>
 <translation id="4587425331216688090">Chrome बाट ठेगाना हटाउने हो?</translation>
+<translation id="459089498662672729">एड्मिनले तोक्नुभएको नीतिअनुसार <ph name="ORIGIN_NAME" /> बाट पाठ कपी गरी यो स्थानमा पेस्ट गर्नु हुँदैन</translation>
 <translation id="4592951414987517459"><ph name="DOMAIN" />मा तपाईँको जडान आधुनिक साइफर प्रयोग गरेर इन्क्रिप्ट गरिएको छ।</translation>
 <translation id="4594403342090139922">मेटाइलाई &amp;पूर्ववत गर्नुहोस्</translation>
 <translation id="4597348597567598915">आकार ८</translation>
@@ -1086,6 +1091,7 @@
 <translation id="519422657042045905">एनोटेसन उपलब्ध छैन</translation>
 <translation id="5201306358585911203">यो पृष्ठमा इम्बेड गरिएको पृष्ठले यसो भन्छ</translation>
 <translation id="5205222826937269299">नाम आवश्यक छ</translation>
+<translation id="5208899478506185232"><ph name="ONE_TIME_CODE" /> तपाईंको <ph name="TOP_ORIGIN" /> को कोड हो (<ph name="EMBEDDED_ORIGIN" /> मार्फत)</translation>
 <translation id="5209518306177824490">SHA-1 फिङ्गरप्रिन्ट</translation>
 <translation id="5215116848420601511">Google Pay को प्रयोग गर्ने भुक्तानी विधि र ठेगानाहरू</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1215,6 +1221,7 @@
 <translation id="5689199277474810259">JSON ढाँचामा निर्यात गर्नुहोस्</translation>
 <translation id="5689516760719285838">स्थान</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates को यो मान सान्दर्भिक नभएकाले DnsOverHttpsMode नीति सेट गरेर <ph name="SECURE_DNS_MODE_AUTOMATIC" /> वा <ph name="SECURE_DNS_MODE_SECURE" /> नबनाइँदासम्म यसको प्रयोग गरिने छैन।</translation>
+<translation id="5695542892312572833">आफ्नो खरिद पुष्टि तथा पूरा गर्न Windows Hello प्रयोग गर्ने हो?</translation>
 <translation id="5701381305118179107">केन्द्र</translation>
 <translation id="570530837424789914">व्यवस्थित गर्नुहोस्...</translation>
 <translation id="57094364128775171">भरपर्दो पासवर्ड सिफारिस गर्नुहोस्…</translation>
@@ -1406,6 +1413,7 @@
 <translation id="6447842834002726250">कुकीहरू</translation>
 <translation id="6451458296329894277">फाराम पुन: प्रस्तुतीकरण पक्का गर्नुहोस्</translation>
 <translation id="6457206614190510200">स्याडल स्टिच</translation>
+<translation id="6458606150257356946">जे होस् पेस्ट गर्नुहोस्</translation>
 <translation id="6465306955648956876">पासवर्डहरूको व्यवस्थापन गर्नुहोस्...</translation>
 <translation id="6468485451923838994">फन्टहरू</translation>
 <translation id="647261751007945333">यन्त्र नीतिहरू</translation>
@@ -1501,6 +1509,7 @@
 <translation id="6950684638814147129">JSON को मान पार्स गर्दा त्रुटि भयो: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">सबै रिसेट गर्नुहोस्</translation>
 <translation id="6957887021205513506">सर्भरको प्रमाणपत्र जालसाजी जस्तो देखिन्छ।</translation>
+<translation id="6963520811470373926">यसको साटो लागू गरिँदै छ</translation>
 <translation id="6964255747740675745">नेटवर्कको कन्फिगुरेसन पार्स गर्न सकिएन (अमान्य JSON)।</translation>
 <translation id="6965382102122355670">ठिक छ</translation>
 <translation id="6965978654500191972">यन्त्र</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb
index a4d8c21..590aa7b 100644
--- a/components/strings/components_strings_or.xtb
+++ b/components/strings/components_strings_or.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />କୁ ଏକ ବ୍ୟକ୍ତିଗତ ସଂଯୋଗ ସ୍ଥାପନ କରାଯାଇପାରିବ ନାହିଁ କାରଣ, ଆପଣଙ୍କ ଡିଭାଇସ୍‌ର ତାରିଖ ଏବଂ ସମୟ (<ph name="DATE_AND_TIME" />) ଭୁଲ ଅଛି।&lt;/p&gt;
 
       &lt;p&gt;ଦୟାକରି &lt;strong&gt;ସେଟିଂସ୍&lt;/strong&gt; ଆପ୍‌ର &lt;strong&gt;ସାଧାରଣ&lt;/strong&gt; ବିଭାଗରୁ ତାରିଖ ଏବଂ ସମୟ ଆଡ୍‌ଜଷ୍ଟ କରନ୍ତୁ।&lt;/p&gt;</translation>
+<translation id="1567040042588613346">ଏହି ନୀତି ଆଶାନୁରୂପ ଭାବେ କାର୍ଯ୍ୟ କରୁଛି କିନ୍ତୁ ସମାନ ମୂଲ୍ୟ ଅନ୍ୟ କୌଣସି ସ୍ଥାନରେ ସେଟ୍ କରାଯାଇଛି ଏବଂ ଏହି ନୀତି ଦ୍ୱାରା ସ୍ଥାନ ଅଧିକାର କରାଯାଇଛି।</translation>
 <translation id="1569487616857761740">ମିଆଦ ଶେଷର ତାରିଖ ଲେଖନ୍ତୁ</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">ଏହି ୱେବ୍ ପୃଷ୍ଠାଟି ପ୍ରଦର୍ଶନ କରୁଥିବା ବେଳେ କିଛି ତ୍ରୁଟି ହୋଇଛି।</translation>
@@ -309,6 +310,7 @@
 <translation id="2114841414352855701"><ph name="POLICY_NAME" /> ଦ୍ୱାରା ଓଭର୍‍ରାଇଡ୍ ହୋଇଥିବାରୁ ଏହାକୁ ଅଣଦେଖା କରାଯାଇଛି।</translation>
 <translation id="2119505898009119320">ଏହାଙ୍କୁ ଜାରି କରାଯାଇଛି: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">ତଳ ଡାହାଣ ପଟରେ ପଞ୍ଚ୍</translation>
+<translation id="2122719317867821810">ଏହି ନୀତି ଆଶାନୁରୂପ ଭାବେ କାର୍ଯ୍ୟ କରୁଛି କିନ୍ତୁ ଏକ ଦ୍ୱନ୍ଦ୍ୱ ସୃଷ୍ଟି କରୁଥିବା ମୂଲ୍ୟ ଅନ୍ୟ କୌଣସି ସ୍ଥାନରେ ସେଟ୍ କରାଯାଇଛି ଏବଂ ଏହି ନୀତି ଦ୍ୱାରା ଓଭରରାଇଡ୍ ହୋଇଛି।</translation>
 <translation id="2126374524350484896">PDF ପ୍ରଯୋଜକ:</translation>
 <translation id="2129079103035905234">ମୋସନ୍ ସେନ୍ସର୍</translation>
 <translation id="2130448033692577677">DnsOverHttpsMode ନୀତି ସେଟ୍ କରାଯାଇନଥିବା ଯୋଗୁଁ, ଆପଣଙ୍କ ଦ୍ୱାରା ନିର୍ଦ୍ଦିଷ୍ଟ କରାଯାଇଥିବା ଟେମ୍ପଲେଟ୍‍ଗୁଡ଼ିକ ଲାଗୁ ହୋଇନପାରେ।</translation>
@@ -573,6 +575,7 @@
 <translation id="3229041911291329567">ଆପଣଙ୍କର ଡିଭାଇସ୍ ଏବଂ ବ୍ରାଉଜର୍ ସଂସ୍କରଣ ବିଷୟରେ ସୂଚନା</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" /> ପାଇଁ CVC ଲେଖନ୍ତୁ</translation>
 <translation id="3234666976984236645">ସର୍ବଦା ଏହି ସାଇଟ୍‍‍ରେ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବିଷୟବସ୍ତୁ ଚିହ୍ନଟ କରେ</translation>
+<translation id="3266793032086590337">ମୂଲ୍ୟ (ବିବାଦରେ ଅଛି)</translation>
 <translation id="3270847123878663523">ପୁନଃକ୍ରମକୁ &amp;ପୂର୍ବବତ୍ କରନ୍ତୁ</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">କାର୍ଡରେ ନାମକୁ ଯୋଗ କରନ୍ତୁ</translation>
@@ -725,6 +728,7 @@
 <translation id="3807873520724684969">ହାନିକାରକ ବିଷୟବସ୍ତୁକୁ ଅବରୋଧ କରାଗଲା।</translation>
 <translation id="3808375843007691220">ଚେତାବନୀ: ଆଗକୁ ପରୀକ୍ଷଣ ଫିଚର୍‌ଗୁଡ଼ିକ ଅଛି!</translation>
 <translation id="3810973564298564668">ପରିଚାଳନା</translation>
+<translation id="3816482573645936981">ମୂଲ୍ୟ (ଏହାର ସ୍ଥାନ ଅଧିକାର କରାଯାଇଛି)</translation>
 <translation id="382518646247711829">ଯଦି ଆପଣ ଏକ ପ୍ରକ୍ସି ସର୍ଭର ବ୍ୟବହାର କରନ୍ତି...</translation>
 <translation id="3827112369919217609">ସମ୍ପୂର୍ଣ୍ଣ</translation>
 <translation id="3828924085048779000">ଶୂନ୍ୟ ପାସ୍‌ଫ୍ରେଜ୍‌ର ଅନୁମତି ନାହିଁ।</translation>
@@ -914,6 +918,7 @@
 <translation id="4579056131138995126">ବ୍ୟକ୍ତିଗତ (ଏନଭଲପ୍)</translation>
 <translation id="4582204425268416675">କାର୍ଡ କାଢ଼ନ୍ତୁ</translation>
 <translation id="4587425331216688090">Chromeରୁ ଠିକଣା କାଢ଼ିବେ?</translation>
+<translation id="459089498662672729"><ph name="ORIGIN_NAME" />ରୁ ଏହି ଲୋକେସନରେ ପେଷ୍ଟ କରିବା ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ନୀତି ଦ୍ୱାରା ସୁପାରିଶ କରାଯାଇନାହିଁ</translation>
 <translation id="4592951414987517459">କୌଣସି ଗୋଟିଏ ଆଧୁନିକ ସାଇଫର୍‌ ସୁଟ୍‍ର ବ୍ୟବହାର କରି ଆପଣଙ୍କର ସଂଯୋଗକୁ <ph name="DOMAIN" />ରେ ଏନ୍‌କ୍ରିପ୍ଟ କରାଯାଇଛି।</translation>
 <translation id="4594403342090139922">&amp;ଡିଲିଟ୍‌କୁ ପୂର୍ବବତ୍ କରନ୍ତୁ</translation>
 <translation id="4597348597567598915">ଆକାର 8</translation>
@@ -1076,6 +1081,7 @@
 <translation id="519422657042045905">ବ୍ୟାଖ୍ୟା ଉପଲବ୍ଧ ନାହିଁ</translation>
 <translation id="5201306358585911203">ଏହି ପୃଷ୍ଠାରେ ଏକ ଏମ୍ବାଡ୍ ହୋଇଥିବା ପୃଷ୍ଠା ଏହା ଜଣାଏ</translation>
 <translation id="5205222826937269299">ନାମ ଆବଶ୍ୟକ</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" /> ପାଇଁ <ph name="ONE_TIME_CODE" /> ହେଉଛି ଆପଣଙ୍କ କୋଡ୍ (<ph name="EMBEDDED_ORIGIN" /> ମାଧ୍ୟମରେ)</translation>
 <translation id="5209518306177824490">SHA-1 ଟିପ ଚିହ୍ନ</translation>
 <translation id="5215116848420601511">Google Pay ବ୍ୟବହାର କରୁଥିବା ପେମେଣ୍ଟ ପଦ୍ଧତି ଏବଂ ଠିକଣାଗୁଡ଼ିକ</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1205,6 +1211,7 @@
 <translation id="5689199277474810259">JSONକୁ ଏକ୍ସପୋର୍ଟ କରନ୍ତୁ</translation>
 <translation id="5689516760719285838">ଲୋକେସନ୍</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates ମୂଲ୍ୟ ପ୍ରାସଙ୍ଗିକ ନୁହେଁ, DnsOverHttpsMode ନୀତି <ph name="SECURE_DNS_MODE_AUTOMATIC" /> କିମ୍ବା <ph name="SECURE_DNS_MODE_SECURE" />କୁ ସେଟ୍ କରାନଯିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ବ୍ୟବହାର କରାଯିବ ନାହିଁ।</translation>
+<translation id="5695542892312572833">ଆପଣଙ୍କ କ୍ରୟକୁ ଯାଞ୍ଚ କରିବା ଏବଂ ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ Windows Hello ବ୍ୟବହାର କରିବେ?</translation>
 <translation id="5701381305118179107">କେନ୍ଦ୍ର</translation>
 <translation id="570530837424789914">ପରିଚାଳନା…</translation>
 <translation id="57094364128775171">ଜଟିଳ ପାସ୍‌ୱର୍ଡ ପରାମର୍ଶ କରନ୍ତୁ…</translation>
@@ -1395,6 +1402,7 @@
 <translation id="6447842834002726250">କୁକୀଗୁଡିକ</translation>
 <translation id="6451458296329894277">ଫର୍ମ ପୁନଃଦାଖଲକରଣ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</translation>
 <translation id="6457206614190510200">ସାଡାଲ୍ ଷ୍ଟିଚ୍</translation>
+<translation id="6458606150257356946">ଯେ କୌଣସି ମତେ ପେଷ୍ଟ କରନ୍ତୁ</translation>
 <translation id="6465306955648956876">ପାସ୍‌ୱାର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳିତ କରନ୍ତୁ…</translation>
 <translation id="6468485451923838994">ଫଣ୍ଟଗୁଡ଼ିକ</translation>
 <translation id="647261751007945333">ଡିଭାଇସ୍ ନୀତି</translation>
@@ -1490,6 +1498,7 @@
 <translation id="6950684638814147129">JSON ମୂଲ୍ୟ ପାର୍ସ କରିବାରେ ତ୍ରୁଟି: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">ସବୁ ରିସେଟ୍ କରନ୍ତୁ</translation>
 <translation id="6957887021205513506">ସର୍ଭର୍‌ର ସାର୍ଟିଫିକେଟ୍‌ ଏକ ଜାଲ୍‌ ପରି ଲାଗୁଛି।</translation>
+<translation id="6963520811470373926">ସ୍ଥାନ ଅଧିକାର କରାଯାଇଛି</translation>
 <translation id="6964255747740675745">ନେଟ୍‌ୱର୍କ କନ୍‌ଫିଗରେସନ୍‌ ବିଶ୍ଳେଷଣ ହେବାରେ ବିଫଳ ହେଲା (ଅବୈଧ JSON)।</translation>
 <translation id="6965382102122355670">ଓକେ ବଟନ୍</translation>
 <translation id="6965978654500191972">ଡିଭାଇସ୍</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb
index ef2ed9d..f8609e8f 100644
--- a/components/strings/components_strings_pa.xtb
+++ b/components/strings/components_strings_pa.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />ਨਾਲ ਇੱਕ ਨਿੱਜੀ ਕਨੈਕਸ਼ਨ ਨੂੰ ਸਥਾਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਮਿਤੀ ਅਤੇ ਸਮਾਂ (<ph name="DATE_AND_TIME" />) ਗ਼ਲਤ ਹੈ।&lt;/p&gt;
 
           &lt;p&gt;ਕਿਰਪਾ ਕਰਕੇ &lt;strong&gt;ਸੈਟਿੰਗਾਂ&lt;/strong&gt; ਐਪ ਦੇ &lt;strong&gt;ਸਧਾਰਨ&lt;/strong&gt; ਭਾਗ ਤੋਂ ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਅਨੁਕੂਲਿਤ ਕਰੋ।&lt;/p&gt;</translation>
+<translation id="1567040042588613346">ਇਹ ਨੀਤੀ ਉਮੀਦ ਮੁਤਾਬਕ ਕੰਮ ਕਰ ਰਹੀ ਹੈ ਪਰ ਸਮਾਨ ਮੁੱਲ ਕਿਸੇ ਹੋਰ ਥਾਂ 'ਤੇ ਸੈੱਟ ਹੈ ਅਤੇ ਇਸ ਨੀਤੀ ਵੱਲੋਂ ਪ੍ਰਤਿਸਥਾਪਨ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="1569487616857761740">ਮਿਆਦ ਮੁੱਕਣ ਦੀ ਤਾਰੀਖ ਦਾਖਲ ਕਰੋ</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">ਇਹ ਵੈਬਸਫ਼ਾ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਦੇ ਸਮੇਂ ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ।</translation>
@@ -309,6 +310,7 @@
 <translation id="2114841414352855701">ਅਣਡਿੱਠ ਕੀਤਾ ਕਿਉਂਕਿ ਇਹ <ph name="POLICY_NAME" /> ਵੱਲੋਂ ਓਵਰਰਾਈਡ ਕੀਤਾ ਸੀ।</translation>
 <translation id="2119505898009119320">ਇਹਨਾਂ ਨੂੰ ਜਾਰੀ ਕੀਤਾ ਗਿਆ: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">ਹੇਠਾਂ ਸੱਜੇ ਪਾਸੇ ਮੋਰੀ</translation>
+<translation id="2122719317867821810">ਇਹ ਨੀਤੀ ਉਮੀਦ ਮੁਤਾਬਕ ਕੰਮ ਕਰ ਰਹੀ ਹੈ ਪਰ ਕੋਈ ਵਿਵਾਦਗ੍ਰਸਤ ਮੁੱਲ ਕਿਸੇ ਹੋਰ ਥਾਂ 'ਤੇ ਸੈੱਟ ਹੈ ਅਤੇ ਇਸ ਨੀਤੀ ਵੱਲੋਂ ਓਵਰਰਾਈਡ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="2126374524350484896">PDF ਨਿਰਮਾਤਾ:</translation>
 <translation id="2129079103035905234">ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰ</translation>
 <translation id="2130448033692577677">ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਟੈਮਪਲੇਟ DnsOverHttpsMode ਨੀਤੀ ਸੈੱਟ ਨਾ ਕੀਤੇ ਜਾਣ ਕਾਰਨ ਸ਼ਾਇਦ ਲਾਗੂ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ।</translation>
@@ -574,6 +576,7 @@
 <translation id="3229041911291329567">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਵਰਜਨ ਬਾਰੇ ਜਾਣਕਾਰੀ</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" /> ਦਾ CVC ਦਾਖਲ ਕਰੋ</translation>
 <translation id="3234666976984236645">ਇਸ ਸਾਈਟ 'ਤੇ ਹਮੇਸ਼ਾਂ ਆਯਾਤ ਸਮੱਗਰੀ ਖੋਜੋ</translation>
+<translation id="3266793032086590337">ਮੁੱਲ (ਵਿਵਾਦ)</translation>
 <translation id="3270847123878663523">&amp;ਦੁਬਾਰਾ ਕ੍ਰਮ ਦੇਣ ਨੂੰ ਅਨਡੂ ਕਰੋ</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">ਕਾਰਡ 'ਤੇ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ</translation>
@@ -726,6 +729,7 @@
 <translation id="3807873520724684969">ਨੁਕਸਾਨਦੇਹ ਸਮੱਗਰੀ ਬਲਾਕ ਕੀਤੀ ਗਈ।</translation>
 <translation id="3808375843007691220">ਚੇਤਾਵਨੀ: ਪ੍ਰਯੋਗਮਈ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅੱਗੇ ਹਨ!</translation>
 <translation id="3810973564298564668">ਵਿਵਸਥਿਤ ਕਰੋ</translation>
+<translation id="3816482573645936981">ਮੁੱਲ (ਪ੍ਰਤਿਸਥਾਪਨ ਕੀਤਾ)</translation>
 <translation id="382518646247711829">ਜੇਕਰ ਤੁਸੀਂ ਇੱਕ ਪ੍ਰੌਕਸੀ ਸਰਵਰ ਵਰਤਦੇ ਹੋ...</translation>
 <translation id="3827112369919217609">ਸੰਪੂਰਨ</translation>
 <translation id="3828924085048779000">ਖਾਲੀ ਪਾਸਫਰੇਜ਼ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।</translation>
@@ -915,6 +919,7 @@
 <translation id="4579056131138995126">ਨਿੱਜੀ (ਲਿਫ਼ਾਫ਼ਾ)</translation>
 <translation id="4582204425268416675">ਕਾਰਡ ਹਟਾਓ</translation>
 <translation id="4587425331216688090">ਕੀ Chrome ਤੋਂ ਪਤੇ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</translation>
+<translation id="459089498662672729"><ph name="ORIGIN_NAME" /> ਤੋਂ ਇਸ ਟਿਕਾਣੇ 'ਤੇ ਪੇਸਟ ਕਰਨ ਦੀ ਸੁਵਿਧਾ ਦੀ ਪ੍ਰਸ਼ਾਸਕ ਨੀਤੀ ਵੱਲੋਂ ਸਿਫ਼ਾਰਸ਼ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ</translation>
 <translation id="4592951414987517459"><ph name="DOMAIN" /> ਵਿੱਚ ਤੁਹਾਡਾ ਕਨੈਕਸ਼ਨ ਕਿਸੇ ਆਧੁਨਿਕ ਸਿਫ਼ਰ ਸੂਟ ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਏਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="4594403342090139922">&amp;ਮਿਟਾਏ ਗਏ ਨੂੰ ਅਣਕੀਤਾ ਕਰੋ</translation>
 <translation id="4597348597567598915">ਆਕਾਰ 8</translation>
@@ -1077,6 +1082,7 @@
 <translation id="519422657042045905">ਐਨੋਟੇਸ਼ਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation>
 <translation id="5201306358585911203">ਇਸ ਪੰਨੇ 'ਤੇ ਇੱਕ ਪਰੋਏ ਗਏ ਪੰਨੇ ਦੇ ਮੁਤਾਬਕ</translation>
 <translation id="5205222826937269299">ਨਾਮ ਲੋੜੀਂਦਾ ਹੈ</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" /> ਲਈ <ph name="ONE_TIME_CODE" /> ਤੁਹਾਡਾ ਕੋਡ ਹੈ (<ph name="EMBEDDED_ORIGIN" /> ਰਾਹੀਂ)</translation>
 <translation id="5209518306177824490">SHA-1 ਫਿੰਗਰਪ੍ਰਿੰਟ</translation>
 <translation id="5215116848420601511">Google Pay ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਅਤੇ ਪਤੇ</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1206,6 +1212,7 @@
 <translation id="5689199277474810259">JSON ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ</translation>
 <translation id="5689516760719285838">ਟਿਕਾਣਾ</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates ਮੁੱਲ ਢੁਕਵਾਂ ਨਹੀਂ ਹੈ, ਅਤੇ ਇਸਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ, ਜਦੋਂ ਤੱਕ ਕਿ DnsOverHttpsMode ਨੀਤੀ <ph name="SECURE_DNS_MODE_AUTOMATIC" /> ਜਾਂ <ph name="SECURE_DNS_MODE_SECURE" /> 'ਤੇ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ।</translation>
+<translation id="5695542892312572833">ਕੀ ਤੁਸੀਂ ਆਪਣੀਆਂ ਖਰੀਦਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ Windows Hello ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="5701381305118179107">ਕੇਂਦਰ</translation>
 <translation id="570530837424789914">ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation>
 <translation id="57094364128775171">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਸੁਝਾਓ…</translation>
@@ -1396,6 +1403,7 @@
 <translation id="6447842834002726250">ਕੁਕੀਜ਼</translation>
 <translation id="6451458296329894277">ਫ਼ਾਰਮ ਨੂੰ ਮੁੜ ਸਪੁਰਦ ਕਰਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
 <translation id="6457206614190510200">ਪਰਤਦਾਰ ਸਿਲਾਈ</translation>
+<translation id="6458606150257356946">ਫਿਰ ਵੀ ਪੇਸਟ ਕਰੋ</translation>
 <translation id="6465306955648956876">ਪਾਸਵਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation>
 <translation id="6468485451923838994">ਫੌਂਟ</translation>
 <translation id="647261751007945333">ਡੀਵਾਈਸ ਨੀਤੀਆਂ</translation>
@@ -1491,6 +1499,7 @@
 <translation id="6950684638814147129">JSON ਮੁੱਲ ਪਾਰਸ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">ਸਭ ਰੀਸੈੱਟ ਕਰੋ</translation>
 <translation id="6957887021205513506">ਸਰਵਰ ਦਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਇੱਕ ਧੋਖਾ ਜਾਪਦਾ ਹੈ।</translation>
+<translation id="6963520811470373926">ਪ੍ਰਤਿਸਥਾਪਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="6964255747740675745">ਨੈੱਟਵਰਕ ਸੰਰੂਪਣ ਪਾਰਸ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ (ਅਵੈਧ JSON)।</translation>
 <translation id="6965382102122355670">ਠੀਕ</translation>
 <translation id="6965978654500191972">ਡੀਵਾਈਸ</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 68ddd7b9..8557783 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;உங்கள் சாதனத்தின் தேதி மற்றும் நேரம் (<ph name="DATE_AND_TIME" />) தவறாக இருப்பதால் <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> என்கிற டொமைனிற்குத் தனிப்பட்ட இணைப்பை ஏற்படுத்த முடியவில்லை.&lt;/p&gt;
 
       &lt;p&gt;தேதி மற்றும் நேரத்தை &lt;strong&gt;அமைப்புகள்&lt;/strong&gt; ஆப்ஸின் &lt;strong&gt;பொது&lt;/strong&gt; என்கிற பகுதியில் மாற்றவும்.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">இந்தக் கொள்கை எதிர்பார்த்த வகையில் வேலை செய்கிறது. ஆனால் இதே மதிப்பு வேறு எங்கோ அமைக்கப்பட்டுள்ளதோடு இந்தக் கொள்கையின் மூலம் மாற்றியமைக்கப்படுகிறது.</translation>
 <translation id="1569487616857761740">காலாவதித் தேதியை உள்ளிடவும்</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">இந்த இணையப்பக்கத்தைக் காட்டும்போது ஏதோ தவறு ஏற்பட்டது.</translation>
@@ -313,6 +314,7 @@
 <translation id="2114841414352855701"><ph name="POLICY_NAME" /> ஆல் கொள்கை மேலெழுதப்பட்டுள்ளதால் புறக்கணிக்கப்பட்டது.</translation>
 <translation id="2119505898009119320">வழங்கப்பட்ட நிறுவனம்: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">பஞ்ச் பாட்டம் ரைட்</translation>
+<translation id="2122719317867821810">இந்தக் கொள்கை எதிர்பார்த்த வகையில் வேலை செய்கிறது. ஆனால் முரண்படும் மதிப்பு ஒன்று வேறு எங்கோ அமைக்கப்பட்டுள்ளதோடு இந்தக் கொள்கையின் மூலம் மீறிச் செயல்படுகிறது.</translation>
 <translation id="2126374524350484896">PDF தயாரிப்பாளர்:</translation>
 <translation id="2129079103035905234">மோஷன் சென்சார்கள்</translation>
 <translation id="2130448033692577677">DnsOverHttpsMode கொள்கை அமைக்கப்படாததால் நீங்கள் குறிப்பிட்ட டெம்ப்ளேட்கள் பொருந்தாமல் போகக்கூடும்.</translation>
@@ -576,6 +578,7 @@
 <translation id="3229041911291329567">உங்கள் சாதனம் மற்றும் உலாவியின் பதிப்புத் தகவல்</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" /> இன் CVC எண்ணை உள்ளிடவும்</translation>
 <translation id="3234666976984236645">இந்தத் தளத்தின் முக்கிய உள்ளடக்கத்தை எப்போதும் இயக்கவும்</translation>
+<translation id="3266793032086590337">மதிப்பு (முரண்பாடு)</translation>
 <translation id="3270847123878663523">&amp;மறுவரிசைப்படுத்தலைச் செயல்தவிர்</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">கார்டிலுள்ள பெயரைச் சேர்க்கவும்</translation>
@@ -728,6 +731,7 @@
 <translation id="3807873520724684969">தீங்கிழைக்கும் உள்ளடக்கம் தடுக்கப்பட்டது.</translation>
 <translation id="3808375843007691220">எச்சரிக்கை: பரிசோதனை அம்சங்கள்!</translation>
 <translation id="3810973564298564668">நிர்வகி</translation>
+<translation id="3816482573645936981">மதிப்பு (மாற்றியமைக்கப்பட்டது)</translation>
 <translation id="382518646247711829">நீங்கள் பிராக்சி சர்வரைப் பயன்படுத்தினால்....</translation>
 <translation id="3827112369919217609">துல்லியமானது</translation>
 <translation id="3828924085048779000">வெற்று கடவுச்சொற்றொடருக்கு அனுமதியில்லை.</translation>
@@ -922,6 +926,7 @@
 <translation id="4579056131138995126">Personal (என்வலப்)</translation>
 <translation id="4582204425268416675">கார்டை அகற்றும்</translation>
 <translation id="4587425331216688090">Chrome இலிருந்து முகவரியை அகற்றவா?</translation>
+<translation id="459089498662672729"><ph name="ORIGIN_NAME" /> என்ற தளத்திலிருந்து நகலெடுத்து இங்கே ஒட்டுவது நிர்வாகக் கொள்கையின்படி பரிந்துரைக்கப்படவில்லை</translation>
 <translation id="4592951414987517459">நவீன சைபர் சூட்டைப் பயன்படுத்தி <ph name="DOMAIN" /> உடனான உங்கள் இணைப்பு என்க்ரிப்ட் செய்யப்பட்டது.</translation>
 <translation id="4594403342090139922">&amp;நீக்குதலைச் செயல்தவிர்</translation>
 <translation id="4597348597567598915">அளவு: 8</translation>
@@ -1084,6 +1089,7 @@
 <translation id="519422657042045905">விரிவுரை இல்லை</translation>
 <translation id="5201306358585911203">இந்தப் பக்கத்திலுள்ள உட்பொதிக்கப்பட்ட பக்கம் தெரிவிப்பது:</translation>
 <translation id="5205222826937269299">பெயர் தேவை</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" /> (<ph name="EMBEDDED_ORIGIN" /> மூலம்) தளத்திற்கான குறியீடு: <ph name="ONE_TIME_CODE" /></translation>
 <translation id="5209518306177824490">SHA-1 விரல்அச்சு</translation>
 <translation id="5215116848420601511">Google Payவைப் பயன்படுத்தும் கட்டண முறைகளும் முகவரிகளும்</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1213,6 +1219,7 @@
 <translation id="5689199277474810259">JSONக்கு ஏற்று</translation>
 <translation id="5689516760719285838">இருப்பிடம்</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates மதிப்பு தொடர்புடையதாகவும் இல்லை, பயன்படுத்தவும் படாது. அதற்கு DnsOverHttpsMode கொள்கையை <ph name="SECURE_DNS_MODE_AUTOMATIC" /> அல்லது <ph name="SECURE_DNS_MODE_SECURE" /> ஆக அமைக்க வேண்டும்.</translation>
+<translation id="5695542892312572833">உங்கள் பர்ச்சேஸைச் சரிபார்த்து நிறைவுசெய்ய Windows Helloவைப் பயன்படுத்த விரும்புகிறீர்களா?</translation>
 <translation id="5701381305118179107">மையம்</translation>
 <translation id="570530837424789914">நிர்வகி...</translation>
 <translation id="57094364128775171">வலுவான கடவுச்சொல்லைப் பரிந்துரைசெய்…</translation>
@@ -1403,6 +1410,7 @@
 <translation id="6447842834002726250">குக்கீகள்</translation>
 <translation id="6451458296329894277">படிவ மறுசமர்ப்பிப்பை உறுதிசெய்க</translation>
 <translation id="6457206614190510200">சேடில் ஸ்டிட்ச்</translation>
+<translation id="6458606150257356946">பரவாயில்லை ஒட்டு</translation>
 <translation id="6465306955648956876">கடவுச்சொற்களை நிர்வகி...</translation>
 <translation id="6468485451923838994">எழுத்துருக்கள்</translation>
 <translation id="647261751007945333">சாதனக் கொள்கைகள்</translation>
@@ -1498,6 +1506,7 @@
 <translation id="6950684638814147129">JSON மதிப்பைப் பாகுபடுத்தும்போது பிழை நேர்ந்தது: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">அனைத்தையும் மீட்டமை</translation>
 <translation id="6957887021205513506">சேவையகத்தின் சான்றிதழ் போலியானது போல் தெரிகிறது.</translation>
+<translation id="6963520811470373926">மாற்றியமைக்கிறது</translation>
 <translation id="6964255747740675745">நெட்வொர்க் உள்ளமைவைப் பாகுபடுத்த முடியவில்லை (தவறான JSON).</translation>
 <translation id="6965382102122355670">சரி</translation>
 <translation id="6965978654500191972">சாதனம்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 2f5e758c..e377350 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -180,6 +180,7 @@
 <translation id="1559572115229829303">&lt;p&gt;మీ పరికరం తేదీ మరియు సమయం తప్పుగా (<ph name="DATE_AND_TIME" />) ఉన్నందున, <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />కు ప్రైవేట్ కనెక్షన్ ఏర్పాటు చేయడం సాధ్యపడలేదు.&lt;/p&gt;
 
       &lt;p&gt;&lt;strong&gt;సెట్టింగ్‌లు&lt;/strong&gt; యాప్ యొక్క &lt;strong&gt;సాధారణం&lt;/strong&gt; విభాగంలో తేదీ మరియు సమయాన్ని దయచేసి సర్దుబాటు చేయండి.&lt;/p&gt;</translation>
+<translation id="1567040042588613346">ఈ పాలసీ అనుకున్నట్టుగా పని చేస్తోంది, కానీ అదే విలువ మరో చోట సెట్ చేయబడింది, అలాగే ఈ పాలసీ ద్వారా అధిగమించబడింది.</translation>
 <translation id="1569487616857761740">గడువు ముగింపు తేదీని నమోదు చేయండి</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">ఈ వెబ్ పేజీని ప్రదర్శిస్తున్నప్పుడు ఏదో తప్పు జరిగింది.</translation>
@@ -315,6 +316,7 @@
 <translation id="2114841414352855701">ఇది <ph name="POLICY_NAME" /> ద్వారా భర్తీ చేయబడినందున విస్మరించబడింది.</translation>
 <translation id="2119505898009119320">వీరికి జారీ చేయబడింది: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">కుడివైపు దిగువ భాగంలో రంధ్రాలు</translation>
+<translation id="2122719317867821810">ఈ పాలసీ అనుకున్నట్టుగా పని చేస్తోంది, కానీ వైరుధ్య విలువ మరో చోట సెట్ చేయబడింది, అలాగే ఈ పాలసీ ద్వారా ఓవర్‌రైడ్ అయ్యింది.</translation>
 <translation id="2126374524350484896">PDF ప్రొడ్యూసర్:</translation>
 <translation id="2129079103035905234">మోషన్ సెన్సార్‌లు</translation>
 <translation id="2130448033692577677">DnsOverHttpsMode విధానాన్ని సెట్ చేయని కారణంగా, మీరు పేర్కొన్న టెంప్లేట్‌లను వర్తింపజేయడం వీలుకాకపోవచ్చు.</translation>
@@ -581,6 +583,7 @@
 <translation id="3229041911291329567">మీ పరికరం, బ్రౌజర్‌ల వెర్షన్ సమాచారం</translation>
 <translation id="323107829343500871"><ph name="CREDIT_CARD" /> కార్డ్ CVCని నమోదు చేయండి</translation>
 <translation id="3234666976984236645">ఈ సైట్‌లో ఎప్పుడూ ముఖ్యమైన కంటెంట్‌ను గుర్తించు</translation>
+<translation id="3266793032086590337">విలువ (వైరుధ్యం)</translation>
 <translation id="3270847123878663523">&amp;మళ్లీ క్రమం చేయడాన్ని రద్దు చేయి</translation>
 <translation id="3274521967729236597">పా-కాయ్</translation>
 <translation id="3282497668470633863">కార్డ్‌లో పేరుని జోడించండి</translation>
@@ -734,6 +737,7 @@
 <translation id="3807873520724684969">హానికర కంటెంట్ బ్లాక్ చేయబడింది.</translation>
 <translation id="3808375843007691220">హెచ్చరిక: ప్రయోగాత్మక ఫీచర్‌లు ముందున్నాయి!</translation>
 <translation id="3810973564298564668">నిర్వహించు</translation>
+<translation id="3816482573645936981">విలువ (అధిగమించబడింది)</translation>
 <translation id="382518646247711829">మీరు ప్రాక్సీ సర్వర్‌ను ఉపయోగిస్తే...</translation>
 <translation id="3827112369919217609">అబ్సల్యూట్</translation>
 <translation id="3828924085048779000">ఖాళీ రహస్య పదబంధం అనుమతించబడదు.</translation>
@@ -928,6 +932,7 @@
 <translation id="4579056131138995126">వ్యక్తిగతం (ఎన్వలప్)</translation>
 <translation id="4582204425268416675">కార్డ్‌ని తీసివేయండి</translation>
 <translation id="4587425331216688090">Chrome నుండి చిరునామాను తీసివేయాలా?</translation>
+<translation id="459089498662672729"><ph name="ORIGIN_NAME" /> నుండి ఈ లొకేషన్‌కు పేస్ట్ చేయడం అడ్మినిస్ట్రేటర్ పాలసీ ద్వారా సిఫార్సు చేయబడదు</translation>
 <translation id="4592951414987517459"><ph name="DOMAIN" />కు గల మీ కనెక్షన్ ఆధునిక సైఫర్ సూట్ ఉపయోగించి ఎన్‌క్రిప్ట్ చేయ‌బ‌డింది.</translation>
 <translation id="4594403342090139922">&amp;తొలగించడాన్ని రద్దు చేయి</translation>
 <translation id="4597348597567598915">పరిమాణం 8</translation>
@@ -1090,6 +1095,7 @@
 <translation id="519422657042045905">అదనపు గమనిక అందుబాటులో లేదు</translation>
 <translation id="5201306358585911203">ఈ పేజీలోని పొందుపరిచిన పేజీ ఇలా చెబుతోంది</translation>
 <translation id="5205222826937269299">పేరు ఆవశ్యకం</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" />కు సంబంధించి <ph name="ONE_TIME_CODE" /> మీ కోడ్ (<ph name="EMBEDDED_ORIGIN" />ద్వారా)</translation>
 <translation id="5209518306177824490">SHA-1 వేలిముద్ర</translation>
 <translation id="5215116848420601511">Google Payని ఉపయోగిస్తున్న చెల్లింపు పద్ధతులు మరియు చిరునామాలు</translation>
 <translation id="5215363486134917902">ఫోలియో-Sp</translation>
@@ -1219,6 +1225,7 @@
 <translation id="5689199277474810259">JSONకు ఎగుమతి చేయి</translation>
 <translation id="5689516760719285838">లొకేషన్</translation>
 <translation id="569000877158168851">DnsOverHttpsTemplates విలువ ఔచిత్యంగా లేదు, DnsOverHttpsMode విధానాన్ని <ph name="SECURE_DNS_MODE_AUTOMATIC" />కు లేదా <ph name="SECURE_DNS_MODE_SECURE" />కు సెట్ చేస్తే మినహా, అది ఉపయోగించబడదు.</translation>
+<translation id="5695542892312572833">మీ కొనుగోలును వెరిఫై చేసి, పూర్తి చేయడానికి Windows Helloను ఉపయోగించాలా?</translation>
 <translation id="5701381305118179107">మధ్యకు</translation>
 <translation id="570530837424789914">నిర్వహించండి...</translation>
 <translation id="57094364128775171">బలమైన పాస్‌వర్డ్‌ను సూచించండి…</translation>
@@ -1410,6 +1417,7 @@
 <translation id="6447842834002726250">కుక్కీలు</translation>
 <translation id="6451458296329894277">ఫారమ్ పునఃసమర్పణను నిర్థారించండి</translation>
 <translation id="6457206614190510200">సాడిల్ స్టిచ్</translation>
+<translation id="6458606150257356946">అయినా పేస్ట్ చేయి</translation>
 <translation id="6465306955648956876">పాస్‌వర్డ్‌లను నిర్వహించండి...</translation>
 <translation id="6468485451923838994">ఫాంట్‌లు</translation>
 <translation id="647261751007945333">పరికర విధానాలు</translation>
@@ -1505,6 +1513,7 @@
 <translation id="6950684638814147129">JSON విలువను అన్వయిస్తుండగా ఎర్రర్ ఏర్పడింది: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">అన్నీ రీసెట్ చేయి</translation>
 <translation id="6957887021205513506">సర్వర్ ధృవీకరణ పత్రం చెల్లదు.</translation>
+<translation id="6963520811470373926">అధిగమిస్తోంది</translation>
 <translation id="6964255747740675745">నెట్‌వర్క్ కాన్ఫిగరేషన్‌ని అన్వయించడం విఫలమైంది (JSON చెల్లదు).</translation>
 <translation id="6965382102122355670">సరే</translation>
 <translation id="6965978654500191972">పరికరం</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb
index 4763912..c98439b 100644
--- a/components/strings/components_strings_ur.xtb
+++ b/components/strings/components_strings_ur.xtb
@@ -178,6 +178,7 @@
 <translation id="1559572115229829303">‏&lt;p&gt;<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> سے ایک نجی کنکشن تشکیل نہیں دیا جا سکتا ہے کیونکہ آپ کے آلے کی تاریخ اور وقت (<ph name="DATE_AND_TIME" />) غلط ہیں۔&lt;‎/p&gt;
 
       &lt;p&gt;براہ کرم تاریخ اور وقت کو &lt;strong&gt;ترتیبات&lt;‎/strong&gt; ایپ کے &lt;strong&gt;عمومی&lt;‎/strong&gt; سیکشن سے ایڈجسٹ کریں۔&lt;‎/p&gt;</translation>
+<translation id="1567040042588613346">یہ پالیسی توقع کے مطابق کام کر رہی ہے لیکن کسی دوسری جگہ ایک جیسی قدر سیٹ کی گئی ہے اور اس نے اس پالیسی کی جگہ لے لی ہے۔</translation>
 <translation id="1569487616857761740">تاریخ اختتام درج کریں</translation>
 <translation id="1581080074034554886">CVC</translation>
 <translation id="1583429793053364125">یہ ویب صفحہ ڈسپلے کرتے ہوئے کچھ غلط ہو گیا۔</translation>
@@ -314,6 +315,7 @@
 <translation id="2114841414352855701"><ph name="POLICY_NAME" /> کی جانب سے اسے اوور رائڈ کیے جانے کی وجہ سے نظر انداز کر دیا گیا۔</translation>
 <translation id="2119505898009119320">جاری کردہ بنام: <ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">نیچے دائیں طرف سوراخ</translation>
+<translation id="2122719317867821810">یہ پالیسی توقع کے مطابق کام کر رہی ہے لیکن کسی دوسری جگہ ایک متضاد قدر سیٹ کی گئی ہے اور اسے اس پالیسی سے اوور رائیڈ کر دیا گیا ہے۔</translation>
 <translation id="2126374524350484896">‏PDF پروڈیوسر:</translation>
 <translation id="2129079103035905234">موشن سینسرز</translation>
 <translation id="2130448033692577677">‏ہو سکتا ہے کہ آپ کے ذریعے متعینہ تمثیلات DnsOverHttpsMode پالیسی سیٹ نہ ہونے کی وجہ سے لاگو نہ ہو۔</translation>
@@ -584,6 +586,7 @@
 <translation id="3229041911291329567">آپ کے آلے اور براؤزر کے بارے میں ورژن کی معلومات</translation>
 <translation id="323107829343500871">‏<ph name="CREDIT_CARD" /> کا CVC درج کریں</translation>
 <translation id="3234666976984236645">اس سائٹ پر اہم مواد کا ہمیشہ پتا لگائیں</translation>
+<translation id="3266793032086590337">قدر (متضاد)</translation>
 <translation id="3270847123878663523">دوبارہ ترتیب &amp;کالعدم کریں</translation>
 <translation id="3274521967729236597">Pa-Kai</translation>
 <translation id="3282497668470633863">کارڈ پر نام شامل کریں</translation>
@@ -737,6 +740,7 @@
 <translation id="3807873520724684969">نقصان دہ مواد مسدود ہے۔</translation>
 <translation id="3808375843007691220">انتباہ: تجرباتی خصوصیات آگے ہیں!</translation>
 <translation id="3810973564298564668">نظم کریں</translation>
+<translation id="3816482573645936981">قدر (اس کی جگہ نافذ کردہ)</translation>
 <translation id="382518646247711829">اگر آپ ایک پراکسی سرور استعمال کرتے ہیں تو…</translation>
 <translation id="3827112369919217609">یقینی</translation>
 <translation id="3828924085048779000">خالی پاس فریز کی اجازت نہیں ہے۔</translation>
@@ -931,6 +935,7 @@
 <translation id="4579056131138995126">Personal ‎(Envelope‎)‎</translation>
 <translation id="4582204425268416675">کارڈ ہٹائیں</translation>
 <translation id="4587425331216688090">‏Chrome سے پتہ ہٹائیں؟</translation>
+<translation id="459089498662672729">منتظم کی پالیسی تحت، <ph name="ORIGIN_NAME" /> سے اس مقام پر پیسٹ کرنا مسدود ہے</translation>
 <translation id="4592951414987517459">ایک جدید سائفر سوئٹ کا استعمال کر کے <ph name="DOMAIN" /> کا آپ کا کنکشن مرموز کیا گیا ہے۔</translation>
 <translation id="4594403342090139922">حذف کو کالعدم کریں</translation>
 <translation id="4597348597567598915">سائز 8</translation>
@@ -1093,6 +1098,7 @@
 <translation id="519422657042045905">تشریح دستیاب نہیں ہے</translation>
 <translation id="5201306358585911203">اس صفحے پر انضمام کردہ ایک صفحے کے مطابق</translation>
 <translation id="5205222826937269299">نام مطلوب ہے</translation>
+<translation id="5208899478506185232"><ph name="TOP_ORIGIN" /> کیلئے آپ کا کوڈ <ph name="ONE_TIME_CODE" /> ہے (<ph name="EMBEDDED_ORIGIN" /> کے ذریعے)</translation>
 <translation id="5209518306177824490">‏SHA-1 فنگرپرنٹ</translation>
 <translation id="5215116848420601511">‏Google Pay استعمال کرنے والے ادائیگی کے طریقے اور پتے</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1222,6 +1228,7 @@
 <translation id="5689199277474810259">‏JSON فارمیٹ میں برآمد کریں</translation>
 <translation id="5689516760719285838">مقام</translation>
 <translation id="569000877158168851">‏DnsOverHttpsTemplates قدر متعلقہ نہیں ہے اور استعمال نہیں کی جائے گی الاؐ DnsOverHttpsMode پالیسی یا تو <ph name="SECURE_DNS_MODE_AUTOMATIC" /> یا <ph name="SECURE_DNS_MODE_SECURE" /> پر سیٹ ہو۔</translation>
+<translation id="5695542892312572833">‏آپ کی خریداری کی توثیق اور اسے مکمل کرنے کیلئے Windows Hello کا استعمال کریں؟</translation>
 <translation id="5701381305118179107">مرکز</translation>
 <translation id="570530837424789914">نظم کریں…</translation>
 <translation id="57094364128775171">مضبوط پاس ورڈ تجویز کریں…</translation>
@@ -1414,6 +1421,7 @@
 <translation id="6447842834002726250">کوکیز</translation>
 <translation id="6451458296329894277">فارم دوبارہ جمع کرانے کی توثیق کریں</translation>
 <translation id="6457206614190510200">سیڈل سلائی</translation>
+<translation id="6458606150257356946">بہر حال پیسٹ کریں</translation>
 <translation id="6465306955648956876">پاسورڈز کا نظم کریں...</translation>
 <translation id="6468485451923838994">فونٹس</translation>
 <translation id="647261751007945333">آلے کی پالیسیاں</translation>
@@ -1509,6 +1517,7 @@
 <translation id="6950684638814147129">‏JSON قدر پارس کرنے میں خرابی: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">تمام کو ری سیٹ کریں</translation>
 <translation id="6957887021205513506">سرور کا سرٹیفکیٹ ایک جعل سازی معلوم پڑتی ہے۔</translation>
+<translation id="6963520811470373926">جگہ لے رہا ہے</translation>
 <translation id="6964255747740675745">‏نیٹ ورک کنفیگریشن پارس کیے جانے میں ناکام ہو گیا (غلط JSON)۔</translation>
 <translation id="6965382102122355670">ٹھیک ہے</translation>
 <translation id="6965978654500191972">آلہ</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 8178ba4..3f0398c 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -178,7 +178,7 @@
 <translation id="1559572115229829303">&lt;p&gt;由於您裝置的日期和時間 (<ph name="DATE_AND_TIME" />) 不正確,因此無法與 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> 建立私人連線。&lt;/p&gt;
 
       &lt;p&gt;請在「設定」&lt;strong&gt;&lt;/strong&gt;應用程式中,前往 [一般] &lt;strong&gt;&lt;/strong&gt;並調整日期和時間。&lt;/p&gt;</translation>
-<translation id="1567040042588613346">這項政策運作正常,但與其他地方設定的值相同,並已取代該值。</translation>
+<translation id="1567040042588613346">此政策運作正常,但與其他地方設定的值相同,並已取代該值。</translation>
 <translation id="1569487616857761740">輸入到期日</translation>
 <translation id="1581080074034554886">信用卡驗證碼 (CVC)</translation>
 <translation id="1583429793053364125">顯示此網頁時發生錯誤。</translation>
@@ -310,7 +310,7 @@
 <translation id="2114841414352855701">由於政策已被「<ph name="POLICY_NAME" />」覆寫,因此被略過。</translation>
 <translation id="2119505898009119320">核發對象:<ph name="ORGANIZATION" /> [<ph name="JURISDICTION" />]</translation>
 <translation id="2119867082804433120">打孔 (右下方)</translation>
-<translation id="2122719317867821810">這項政策運作正常,但與其他地方設定的值有所衝突,並已覆寫該值。</translation>
+<translation id="2122719317867821810">此政策運作正常,但與其他地方設定的值有衝突,並已覆寫該值。</translation>
 <translation id="2126374524350484896">PDF 製作工具:</translation>
 <translation id="2129079103035905234">動作感應器</translation>
 <translation id="2130448033692577677">您並未設定 DnsOverHttpsMode 政策,因此系統無法套用您指定的範本。</translation>
@@ -920,7 +920,7 @@
 <translation id="4579056131138995126">Personal (信封)</translation>
 <translation id="4582204425268416675">移除卡</translation>
 <translation id="4587425331216688090">要從 Chrome 中移除地址嗎?</translation>
-<translation id="459089498662672729">系統管理員政策不建議將資料從「<ph name="ORIGIN_NAME" />」貼到這個位置</translation>
+<translation id="459089498662672729">管理員政策不建議將資料從 <ph name="ORIGIN_NAME" /> 貼到此位置</translation>
 <translation id="4592951414987517459">您與 <ph name="DOMAIN" /> 之間的連線透過最新加密套件加密處理。</translation>
 <translation id="4594403342090139922">復原刪除(&amp;U)</translation>
 <translation id="4597348597567598915">粗幼:8</translation>
@@ -1083,7 +1083,7 @@
 <translation id="519422657042045905">無法使用註解模式</translation>
 <translation id="5201306358585911203">此網頁上的嵌入式頁面顯示</translation>
 <translation id="5205222826937269299">需要提供名稱</translation>
-<translation id="5208899478506185232">你的 <ph name="TOP_ORIGIN" /> 驗證碼是 <ph name="ONE_TIME_CODE" /> (透過 <ph name="EMBEDDED_ORIGIN" /> 發送)</translation>
+<translation id="5208899478506185232">您的 <ph name="TOP_ORIGIN" /> 驗證碼是 <ph name="ONE_TIME_CODE" /> (透過 <ph name="EMBEDDED_ORIGIN" /> 發送)</translation>
 <translation id="5209518306177824490">SHA-1 指紋</translation>
 <translation id="5215116848420601511">使用 Google Pay 儲存的付款方法和地址</translation>
 <translation id="5215363486134917902">Folio-Sp</translation>
@@ -1213,7 +1213,7 @@
 <translation id="5689199277474810259">匯出為 JSON 格式</translation>
 <translation id="5689516760719285838">位置</translation>
 <translation id="569000877158168851">除非 DnsOverHttpsMode 政策設定為 <ph name="SECURE_DNS_MODE_AUTOMATIC" /> 或 <ph name="SECURE_DNS_MODE_SECURE" />,否則 DnsOverHttpsTemplates 的值不相關,系統也不會使用該值。</translation>
-<translation id="5695542892312572833">要使用 Windows Hello 驗證並完成購物嗎?</translation>
+<translation id="5695542892312572833">要使用 Windows Hello 驗證並完成購買嗎?</translation>
 <translation id="5701381305118179107">置中</translation>
 <translation id="570530837424789914">管理…</translation>
 <translation id="57094364128775171">建議安全性強的密碼…</translation>
diff --git a/components/sync/PRESUBMIT.py b/components/sync/PRESUBMIT.py
index 45de349..485586c 100644
--- a/components/sync/PRESUBMIT.py
+++ b/components/sync/PRESUBMIT.py
@@ -26,8 +26,6 @@
                                # 'Supervised' with 'Managed'
 
   # Deprecated types:
-  'DEPRECATED_FAVICON_IMAGES',
-  'DEPRECATED_FAVICON_TRACKING',
   'DEPRECATED_SUPERVISED_USER_ALLOWLISTS']
 
 # Root tags are used as prefixes when creating storage keys, so certain strings
diff --git a/components/sync/PRESUBMIT_test.py b/components/sync/PRESUBMIT_test.py
index 85bb0c9..abcb02eb2 100755
--- a/components/sync/PRESUBMIT_test.py
+++ b/components/sync/PRESUBMIT_test.py
@@ -78,7 +78,6 @@
   '    AppSettingSpecifics app_setting = 789;\n'
   '    ExtensionSettingSpecifics extension_setting = 910;\n'
   '    ExperimentsSpecifics experiments = 161496;\n'
-  '    FaviconImageSpecifics favicon_image = 182019;\n'
   '    //comment\n'
   '  }\n'
   '}\n'
@@ -113,10 +112,13 @@
     results = self._testChange('{PROXY_TABS, "", "", "Tabs", -1, 25},')
     self.assertEqual(0, len(results))
 
-  def testValidChangeDeprecatedEntry(self):
-    results = self._testChange('{DEPRECATED_FAVICON_IMAGES, "FAVICON_IMAGE",\n'
-      '"favicon_images", "Favicon Images",\n'
-      'sync_pb::EntitySpecifics::kFaviconImageFieldNumber, 23},')
+  # TODO(crbug.com/1170749): The only remaining deprecated type doesn't satisfy
+  # this test, revisit it.
+  def DISABLED_testValidChangeDeprecatedEntry(self):
+    results = self._testChange('{DEPRECATED_SUPERVISED_USER_ALLOWLISTS,\n'
+      '"MANAGED_USER_WHITELIST",\n'
+      '"managed_user_whitelists", "Managed User Whitelists",\n'
+      'sync_pb::EntitySpecifics::kManagedUserWhitelistFieldNumber, 33},')
     self.assertEqual(0, len(results))
 
   def testInvalidChangeMismatchedNotificationType(self):
diff --git a/components/sync/base/model_type.cc b/components/sync/base/model_type.cc
index 539d0ef6..fa15989ca 100644
--- a/components/sync/base/model_type.cc
+++ b/components/sync/base/model_type.cc
@@ -121,12 +121,6 @@
     {DICTIONARY, "DICTIONARY", "dictionary", "Dictionary",
      sync_pb::EntitySpecifics::kDictionaryFieldNumber,
      ModelTypeForHistograms::kDictionary},
-    {DEPRECATED_FAVICON_IMAGES, "FAVICON_IMAGE", "favicon_images",
-     "Favicon Images", sync_pb::EntitySpecifics::kFaviconImageFieldNumber,
-     ModelTypeForHistograms::kFaviconImages},
-    {DEPRECATED_FAVICON_TRACKING, "FAVICON_TRACKING", "favicon_tracking",
-     "Favicon Tracking", sync_pb::EntitySpecifics::kFaviconTrackingFieldNumber,
-     ModelTypeForHistograms::kFaviconTracking},
     {DEVICE_INFO, "DEVICE_INFO", "device_info", "Device Info",
      sync_pb::EntitySpecifics::kDeviceInfoFieldNumber,
      ModelTypeForHistograms::kDeviceInfo},
@@ -194,11 +188,11 @@
 static_assert(base::size(kModelTypeInfoMap) == ModelType::NUM_ENTRIES,
               "kModelTypeInfoMap should have ModelType::NUM_ENTRIES elements");
 
-static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+static_assert(39 == syncer::ModelType::NUM_ENTRIES,
               "When adding a new type, update enum SyncModelTypes in enums.xml "
               "and suffix SyncModelType in histograms.xml.");
 
-static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+static_assert(39 == syncer::ModelType::NUM_ENTRIES,
               "When adding a new type, update kAllocatorDumpNameAllowlist in "
               "base/trace_event/memory_infra_background_allowlist.cc.");
 
@@ -262,12 +256,6 @@
     case DICTIONARY:
       specifics->mutable_dictionary();
       break;
-    case DEPRECATED_FAVICON_IMAGES:
-      specifics->mutable_favicon_image();
-      break;
-    case DEPRECATED_FAVICON_TRACKING:
-      specifics->mutable_favicon_tracking();
-      break;
     case DEVICE_INFO:
       specifics->mutable_device_info();
       break;
@@ -367,7 +355,7 @@
 }
 
 ModelType GetModelTypeFromSpecifics(const sync_pb::EntitySpecifics& specifics) {
-  static_assert(41 == ModelType::NUM_ENTRIES,
+  static_assert(39 == ModelType::NUM_ENTRIES,
                 "When adding new protocol types, the following type lookup "
                 "logic must be updated.");
   if (specifics.has_bookmark())
@@ -404,10 +392,6 @@
     return HISTORY_DELETE_DIRECTIVES;
   if (specifics.has_dictionary())
     return DICTIONARY;
-  if (specifics.has_favicon_image())
-    return DEPRECATED_FAVICON_IMAGES;
-  if (specifics.has_favicon_tracking())
-    return DEPRECATED_FAVICON_TRACKING;
   if (specifics.has_device_info())
     return DEVICE_INFO;
   if (specifics.has_priority_preference())
@@ -451,7 +435,7 @@
 }
 
 ModelTypeSet EncryptableUserTypes() {
-  static_assert(41 == ModelType::NUM_ENTRIES,
+  static_assert(39 == ModelType::NUM_ENTRIES,
                 "If adding an unencryptable type, remove from "
                 "encryptable_user_types below.");
   ModelTypeSet encryptable_user_types = UserTypes();
diff --git a/components/sync/base/model_type.h b/components/sync/base/model_type.h
index 4cb4ac3..4b8a974 100644
--- a/components/sync/base/model_type.h
+++ b/components/sync/base/model_type.h
@@ -97,10 +97,6 @@
   HISTORY_DELETE_DIRECTIVES,
   // Custom spelling dictionary entries.
   DICTIONARY,
-  // Favicon images, including both the image URL and the actual pixels.
-  DEPRECATED_FAVICON_IMAGES,
-  // Favicon tracking information, i.e. metadata such as last visit date.
-  DEPRECATED_FAVICON_TRACKING,
   // Client-specific metadata, synced before other user types.
   DEVICE_INFO,
   // These preferences are synced before other user types and are never
@@ -203,8 +199,8 @@
   // kDeprecatedSyncedNotifications = 20,
   kPriorityPreferences = 21,
   kDictionary = 22,
-  kFaviconImages = 23,
-  kFaviconTracking = 24,
+  // kFaviconImages = 23,
+  // kFaviconTracking = 24,
   kProxyTabs = 25,
   kSupervisedUserSettings = 26,
   // kDeprecatedSupervisedUsers = 27,
@@ -256,8 +252,7 @@
       AUTOFILL_WALLET_DATA, AUTOFILL_WALLET_METADATA, AUTOFILL_WALLET_OFFER,
       THEMES, TYPED_URLS, EXTENSIONS, SEARCH_ENGINES, SESSIONS, APPS,
       APP_SETTINGS, EXTENSION_SETTINGS, HISTORY_DELETE_DIRECTIVES, DICTIONARY,
-      DEPRECATED_FAVICON_IMAGES, DEPRECATED_FAVICON_TRACKING, DEVICE_INFO,
-      PRIORITY_PREFERENCES, SUPERVISED_USER_SETTINGS, APP_LIST,
+      DEVICE_INFO, PRIORITY_PREFERENCES, SUPERVISED_USER_SETTINGS, APP_LIST,
       DEPRECATED_SUPERVISED_USER_ALLOWLISTS, ARC_PACKAGE, PRINTERS,
       READING_LIST, USER_EVENTS, NIGORI, USER_CONSENTS, SEND_TAB_TO_SELF,
       SECURITY_EVENTS, WEB_APPS, WIFI_CONFIGURATIONS, OS_PREFERENCES,
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc
index b101e53..03610cea 100644
--- a/components/sync/base/sync_prefs.cc
+++ b/components/sync/base/sync_prefs.cc
@@ -50,6 +50,11 @@
 
 CryptoSyncPrefs::~CryptoSyncPrefs() {}
 
+SyncTransportDataPrefs::SyncTransportDataPrefs(PrefService* pref_service)
+    : pref_service_(pref_service) {}
+
+SyncTransportDataPrefs::~SyncTransportDataPrefs() = default;
+
 SyncPrefObserver::~SyncPrefObserver() {}
 
 SyncPrefs::SyncPrefs(PrefService* pref_service) : pref_service_(pref_service) {
@@ -142,7 +147,7 @@
   sync_pref_observers_.RemoveObserver(sync_pref_observer);
 }
 
-void SyncPrefs::ClearLocalSyncTransportData() {
+void SyncTransportDataPrefs::ClearAll() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   pref_service_->ClearPref(prefs::kSyncLastSyncedTime);
@@ -156,9 +161,6 @@
   pref_service_->ClearPref(prefs::kSyncCacheGuid);
   pref_service_->ClearPref(prefs::kSyncBirthday);
   pref_service_->ClearPref(prefs::kSyncBagOfChips);
-
-  // No need to clear kManaged, kEnableLocalSyncBackend or kLocalSyncBackendDir,
-  // since they're never actually set as user preferences.
 }
 
 bool SyncPrefs::IsFirstSetupComplete() const {
@@ -196,35 +198,35 @@
   }
 }
 
-base::Time SyncPrefs::GetLastSyncedTime() const {
+base::Time SyncTransportDataPrefs::GetLastSyncedTime() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return base::Time::FromInternalValue(
       pref_service_->GetInt64(prefs::kSyncLastSyncedTime));
 }
 
-void SyncPrefs::SetLastSyncedTime(base::Time time) {
+void SyncTransportDataPrefs::SetLastSyncedTime(base::Time time) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetInt64(prefs::kSyncLastSyncedTime, time.ToInternalValue());
 }
 
-base::Time SyncPrefs::GetLastPollTime() const {
+base::Time SyncTransportDataPrefs::GetLastPollTime() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return base::Time::FromInternalValue(
       pref_service_->GetInt64(prefs::kSyncLastPollTime));
 }
 
-void SyncPrefs::SetLastPollTime(base::Time time) {
+void SyncTransportDataPrefs::SetLastPollTime(base::Time time) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetInt64(prefs::kSyncLastPollTime, time.ToInternalValue());
 }
 
-base::TimeDelta SyncPrefs::GetPollInterval() const {
+base::TimeDelta SyncTransportDataPrefs::GetPollInterval() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return base::TimeDelta::FromSeconds(
       pref_service_->GetInt64(prefs::kSyncPollIntervalSeconds));
 }
 
-void SyncPrefs::SetPollInterval(base::TimeDelta interval) {
+void SyncTransportDataPrefs::SetPollInterval(base::TimeDelta interval) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetInt64(prefs::kSyncPollIntervalSeconds,
                           interval.InSeconds());
@@ -342,27 +344,30 @@
   return pref_service_->GetBoolean(prefs::kSyncManaged);
 }
 
-std::string SyncPrefs::GetEncryptionBootstrapToken() const {
+std::string SyncTransportDataPrefs::GetEncryptionBootstrapToken() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return pref_service_->GetString(prefs::kSyncEncryptionBootstrapToken);
 }
 
-void SyncPrefs::SetEncryptionBootstrapToken(const std::string& token) {
+void SyncTransportDataPrefs::SetEncryptionBootstrapToken(
+    const std::string& token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetString(prefs::kSyncEncryptionBootstrapToken, token);
 }
 
-void SyncPrefs::ClearEncryptionBootstrapToken() {
+void SyncTransportDataPrefs::ClearEncryptionBootstrapToken() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->ClearPref(prefs::kSyncEncryptionBootstrapToken);
 }
 
-std::string SyncPrefs::GetKeystoreEncryptionBootstrapToken() const {
+std::string SyncTransportDataPrefs::GetKeystoreEncryptionBootstrapToken()
+    const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return pref_service_->GetString(prefs::kSyncKeystoreEncryptionBootstrapToken);
 }
 
-void SyncPrefs::SetKeystoreEncryptionBootstrapToken(const std::string& token) {
+void SyncTransportDataPrefs::SetKeystoreEncryptionBootstrapToken(
+    const std::string& token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetString(prefs::kSyncKeystoreEncryptionBootstrapToken, token);
 }
@@ -430,32 +435,32 @@
   registry->RegisterBooleanPref(pref_name, false);
 }
 
-void SyncPrefs::SetGaiaId(const std::string& gaia_id) {
+void SyncTransportDataPrefs::SetGaiaId(const std::string& gaia_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->SetString(prefs::kSyncGaiaId, gaia_id);
 }
 
-std::string SyncPrefs::GetGaiaId() const {
+std::string SyncTransportDataPrefs::GetGaiaId() const {
   return pref_service_->GetString(prefs::kSyncGaiaId);
 }
 
-void SyncPrefs::SetCacheGuid(const std::string& cache_guid) {
+void SyncTransportDataPrefs::SetCacheGuid(const std::string& cache_guid) {
   pref_service_->SetString(prefs::kSyncCacheGuid, cache_guid);
 }
 
-std::string SyncPrefs::GetCacheGuid() const {
+std::string SyncTransportDataPrefs::GetCacheGuid() const {
   return pref_service_->GetString(prefs::kSyncCacheGuid);
 }
 
-void SyncPrefs::SetBirthday(const std::string& birthday) {
+void SyncTransportDataPrefs::SetBirthday(const std::string& birthday) {
   pref_service_->SetString(prefs::kSyncBirthday, birthday);
 }
 
-std::string SyncPrefs::GetBirthday() const {
+std::string SyncTransportDataPrefs::GetBirthday() const {
   return pref_service_->GetString(prefs::kSyncBirthday);
 }
 
-void SyncPrefs::SetBagOfChips(const std::string& bag_of_chips) {
+void SyncTransportDataPrefs::SetBagOfChips(const std::string& bag_of_chips) {
   // |bag_of_chips| contains a serialized proto which is not utf-8, hence we use
   // base64 encoding in prefs.
   std::string encoded;
@@ -463,7 +468,7 @@
   pref_service_->SetString(prefs::kSyncBagOfChips, encoded);
 }
 
-std::string SyncPrefs::GetBagOfChips() const {
+std::string SyncTransportDataPrefs::GetBagOfChips() const {
   // |kSyncBagOfChips| gets stored in base64 because it represents a serialized
   // proto which is not utf-8 encoding.
   const std::string encoded = pref_service_->GetString(prefs::kSyncBagOfChips);
@@ -472,11 +477,11 @@
   return decoded;
 }
 
-bool SyncPrefs::IsPassphrasePrompted() const {
+bool SyncTransportDataPrefs::IsPassphrasePrompted() const {
   return pref_service_->GetBoolean(prefs::kSyncPassphrasePrompted);
 }
 
-void SyncPrefs::SetPassphrasePrompted(bool value) {
+void SyncTransportDataPrefs::SetPassphrasePrompted(bool value) {
   pref_service_->SetBoolean(prefs::kSyncPassphrasePrompted, value);
 }
 
@@ -492,7 +497,8 @@
 }
 #endif  // defined(OS_ANDROID)
 
-std::map<ModelType, int64_t> SyncPrefs::GetInvalidationVersions() const {
+std::map<ModelType, int64_t> SyncTransportDataPrefs::GetInvalidationVersions()
+    const {
   std::map<ModelType, int64_t> invalidation_versions;
   const base::DictionaryValue* invalidation_dictionary =
       pref_service_->GetDictionary(prefs::kSyncInvalidationVersions);
@@ -509,7 +515,7 @@
   return invalidation_versions;
 }
 
-void SyncPrefs::UpdateInvalidationVersions(
+void SyncTransportDataPrefs::UpdateInvalidationVersions(
     const std::map<ModelType, int64_t>& invalidation_versions) {
   std::unique_ptr<base::DictionaryValue> invalidation_dictionary(
       new base::DictionaryValue());
@@ -522,11 +528,12 @@
                      *invalidation_dictionary);
 }
 
-std::string SyncPrefs::GetLastRunVersion() const {
+std::string SyncTransportDataPrefs::GetLastRunVersion() const {
   return pref_service_->GetString(prefs::kSyncLastRunVersion);
 }
 
-void SyncPrefs::SetLastRunVersion(const std::string& current_version) {
+void SyncTransportDataPrefs::SetLastRunVersion(
+    const std::string& current_version) {
   pref_service_->SetString(prefs::kSyncLastRunVersion, current_version);
 }
 
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h
index e123173..43e61f251 100644
--- a/components/sync/base/sync_prefs.h
+++ b/components/sync/base/sync_prefs.h
@@ -56,25 +56,96 @@
       const std::string& token) = 0;
 };
 
+// Thin wrapper for "bookkeeping" sync preferences, such as the last synced
+// time, whether the last shutdown was clean, etc. Does *NOT* include sync
+// preferences which are directly user-controlled, such as the set of selected
+// types.
+//
+// In order to use this class SyncPrefs::RegisterProfilePrefs() needs to be
+// invoked first.
+// TODO(crbug.com/938894): Move to dedicated file, possibly next to
+// SyncEngineImpl and introduce a separate pref registration function.
+class SyncTransportDataPrefs
+    : public base::SupportsWeakPtr<SyncTransportDataPrefs>,
+      public CryptoSyncPrefs {
+ public:
+  // |pref_service| must not be null and must outlive this object.
+  explicit SyncTransportDataPrefs(PrefService* pref_service);
+  SyncTransportDataPrefs(const SyncTransportDataPrefs&) = delete;
+  SyncTransportDataPrefs& operator=(const SyncTransportDataPrefs&) = delete;
+  ~SyncTransportDataPrefs() override;
+
+  // Clears all preferences in this class, which excludes
+  void ClearAll();
+
+  void SetGaiaId(const std::string& gaia_id);
+  std::string GetGaiaId() const;
+  void SetCacheGuid(const std::string& cache_guid);
+  std::string GetCacheGuid() const;
+  void SetBirthday(const std::string& birthday);
+  std::string GetBirthday() const;
+  void SetBagOfChips(const std::string& bag_of_chips);
+  std::string GetBagOfChips() const;
+
+  // Out of band sync passphrase prompt getter/setter.
+  bool IsPassphrasePrompted() const;
+  void SetPassphrasePrompted(bool value);
+
+  base::Time GetLastSyncedTime() const;
+  void SetLastSyncedTime(base::Time time);
+
+  base::Time GetLastPollTime() const;
+  void SetLastPollTime(base::Time time);
+
+  base::TimeDelta GetPollInterval() const;
+  void SetPollInterval(base::TimeDelta interval);
+
+  // The encryption bootstrap token is used for explicit passphrase users
+  // (usually custom passphrase) and represents a user-entered passphrase.
+  // Hence, it gets treated as user-controlled similarly to sync datatype
+  // selection settings (i.e. doesn't get cleared in
+  // ClearLocalSyncTransportData()).
+  std::string GetEncryptionBootstrapToken() const override;
+  void SetEncryptionBootstrapToken(const std::string& token) override;
+  void ClearEncryptionBootstrapToken();
+
+  // Use this keystore bootstrap token if we're not using an explicit
+  // passphrase.
+  std::string GetKeystoreEncryptionBootstrapToken() const override;
+  void SetKeystoreEncryptionBootstrapToken(const std::string& token) override;
+
+  // Get/set for the last known sync invalidation versions.
+  std::map<ModelType, int64_t> GetInvalidationVersions() const;
+  void UpdateInvalidationVersions(
+      const std::map<ModelType, int64_t>& invalidation_versions);
+
+  // Will return the contents of the LastRunVersion preference. This may be an
+  // empty string if no version info was present, and is only valid at
+  // Sync startup time (after which the LastRunVersion preference will have been
+  // updated to the current version).
+  std::string GetLastRunVersion() const;
+  void SetLastRunVersion(const std::string& current_version);
+
+ private:
+  // Never null.
+  PrefService* const pref_service_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
 // SyncPrefs is a helper class that manages getting, setting, and persisting
 // global sync preferences. It is not thread-safe, and lives on the UI thread.
-class SyncPrefs : public CryptoSyncPrefs,
-                  public base::SupportsWeakPtr<SyncPrefs> {
+class SyncPrefs {
  public:
   // |pref_service| must not be null and must outlive this object.
   explicit SyncPrefs(PrefService* pref_service);
-  ~SyncPrefs() override;
+  ~SyncPrefs();
 
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
   void AddSyncPrefObserver(SyncPrefObserver* sync_pref_observer);
   void RemoveSyncPrefObserver(SyncPrefObserver* sync_pref_observer);
 
-  // Clears "bookkeeping" sync preferences, such as the last synced time,
-  // whether the last shutdown was clean, etc. Does *not* clear sync preferences
-  // which are directly user-controlled, such as the set of selected types.
-  void ClearLocalSyncTransportData();
-
   // Getters and setters for global sync prefs.
 
   // First-Setup-Complete is conceptually similar to the user's consent to
@@ -87,15 +158,6 @@
   void SetSyncRequested(bool is_requested);
   void SetSyncRequestedIfNotSetExplicitly();
 
-  base::Time GetLastSyncedTime() const;
-  void SetLastSyncedTime(base::Time time);
-
-  base::Time GetLastPollTime() const;
-  void SetLastPollTime(base::Time time);
-
-  base::TimeDelta GetPollInterval() const;
-  void SetPollInterval(base::TimeDelta interval);
-
   bool HasKeepEverythingSynced() const;
 
   // Returns UserSelectableTypeSet::All() if HasKeepEverythingSynced() is true.
@@ -135,36 +197,9 @@
   // policy, is handled directly in ProfileSyncService.
   bool IsManaged() const;
 
-  // The encryption bootstrap token is used for explicit passphrase users
-  // (usually custom passphrase) and represents a user-entered passphrase.
-  // Hence, it gets treated as user-controlled similarly to sync datatype
-  // selection settings (i.e. doesn't get cleared in
-  // ClearLocalSyncTransportData()).
-  std::string GetEncryptionBootstrapToken() const override;
-  void SetEncryptionBootstrapToken(const std::string& token) override;
-  void ClearEncryptionBootstrapToken();
-
-  // Use this keystore bootstrap token if we're not using an explicit
-  // passphrase.
-  std::string GetKeystoreEncryptionBootstrapToken() const override;
-  void SetKeystoreEncryptionBootstrapToken(const std::string& token) override;
-
   // Maps |type| to its corresponding preference name.
   static const char* GetPrefNameForType(UserSelectableType type);
 
-  void SetGaiaId(const std::string& gaia_id);
-  std::string GetGaiaId() const;
-  void SetCacheGuid(const std::string& cache_guid);
-  std::string GetCacheGuid() const;
-  void SetBirthday(const std::string& birthday);
-  std::string GetBirthday() const;
-  void SetBagOfChips(const std::string& bag_of_chips);
-  std::string GetBagOfChips() const;
-
-  // Out of band sync passphrase prompt getter/setter.
-  bool IsPassphrasePrompted() const;
-  void SetPassphrasePrompted(bool value);
-
 #if defined(OS_ANDROID)
   // Sets a boolean pref representing that Sync should no longer respect whether
   // Android master sync is enabled/disabled. It is set per-device and never
@@ -180,18 +215,6 @@
   // For testing.
   void SetManagedForTest(bool is_managed);
 
-  // Get/set for the last known sync invalidation versions.
-  std::map<ModelType, int64_t> GetInvalidationVersions() const;
-  void UpdateInvalidationVersions(
-      const std::map<ModelType, int64_t>& invalidation_versions);
-
-  // Will return the contents of the LastRunVersion preference. This may be an
-  // empty string if no version info was present, and is only valid at
-  // Sync startup time (after which the LastRunVersion preference will have been
-  // updated to the current version).
-  std::string GetLastRunVersion() const;
-  void SetLastRunVersion(const std::string& current_version);
-
   // Gets the local sync backend enabled state.
   bool IsLocalSyncEnabled() const;
 
diff --git a/components/sync/base/sync_prefs_unittest.cc b/components/sync/base/sync_prefs_unittest.cc
index ca5712e..870ffe9 100644
--- a/components/sync/base/sync_prefs_unittest.cc
+++ b/components/sync/base/sync_prefs_unittest.cc
@@ -44,8 +44,20 @@
   std::unique_ptr<SyncPrefs> sync_prefs_;
 };
 
+class SyncTransportDataPrefsTest : public testing::Test {
+ protected:
+  SyncTransportDataPrefsTest() {
+    SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
+    sync_prefs_ = std::make_unique<SyncTransportDataPrefs>(&pref_service_);
+  }
+
+  base::test::SingleThreadTaskEnvironment task_environment_;
+  TestingPrefServiceSimple pref_service_;
+  std::unique_ptr<SyncTransportDataPrefs> sync_prefs_;
+};
+
 // Verify that invalidation versions are persisted and loaded correctly.
-TEST_F(SyncPrefsTest, InvalidationVersions) {
+TEST_F(SyncTransportDataPrefsTest, InvalidationVersions) {
   std::map<ModelType, int64_t> versions;
   versions[BOOKMARKS] = 10;
   versions[SESSIONS] = 20;
@@ -62,15 +74,26 @@
   }
 }
 
-TEST_F(SyncPrefsTest, PollInterval) {
+TEST_F(SyncTransportDataPrefsTest, PollInterval) {
   EXPECT_TRUE(sync_prefs_->GetPollInterval().is_zero());
-
   sync_prefs_->SetPollInterval(base::TimeDelta::FromMinutes(30));
-
   EXPECT_FALSE(sync_prefs_->GetPollInterval().is_zero());
   EXPECT_EQ(sync_prefs_->GetPollInterval().InMinutes(), 30);
 }
 
+TEST_F(SyncTransportDataPrefsTest, LastSyncTime) {
+  EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
+  const base::Time now = base::Time::Now();
+  sync_prefs_->SetLastSyncedTime(now);
+  EXPECT_EQ(now, sync_prefs_->GetLastSyncedTime());
+}
+
+TEST_F(SyncTransportDataPrefsTest, EncryptionBootstrapToken) {
+  EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
+  sync_prefs_->SetEncryptionBootstrapToken("token");
+  EXPECT_EQ("token", sync_prefs_->GetEncryptionBootstrapToken());
+}
+
 class MockSyncPrefObserver : public SyncPrefObserver {
  public:
   MOCK_METHOD(void, OnSyncManagedPrefChange, (bool), (override));
@@ -126,32 +149,21 @@
 }
 #endif
 
-TEST_F(SyncPrefsTest, ClearLocalSyncTransportData) {
-  ASSERT_FALSE(sync_prefs_->IsFirstSetupComplete());
-  ASSERT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
-  ASSERT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
-
-  sync_prefs_->SetFirstSetupComplete();
+TEST_F(SyncTransportDataPrefsTest, ClearAll) {
   sync_prefs_->SetLastSyncedTime(base::Time::Now());
   sync_prefs_->SetEncryptionBootstrapToken("explicit_passphrase_token");
   sync_prefs_->SetKeystoreEncryptionBootstrapToken("keystore_token");
 
-  ASSERT_TRUE(sync_prefs_->IsFirstSetupComplete());
   ASSERT_NE(base::Time(), sync_prefs_->GetLastSyncedTime());
   ASSERT_EQ("explicit_passphrase_token",
             sync_prefs_->GetEncryptionBootstrapToken());
   ASSERT_EQ("keystore_token",
             sync_prefs_->GetKeystoreEncryptionBootstrapToken());
 
-  sync_prefs_->ClearLocalSyncTransportData();
+  sync_prefs_->ClearAll();
 
   EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
   EXPECT_TRUE(sync_prefs_->GetKeystoreEncryptionBootstrapToken().empty());
-
-  // User-entered field should not have been cleared.
-  EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
-  EXPECT_EQ("explicit_passphrase_token",
-            sync_prefs_->GetEncryptionBootstrapToken());
 }
 
 TEST_F(SyncPrefsTest, Basic) {
@@ -165,11 +177,6 @@
   sync_prefs_->SetSyncRequested(false);
   EXPECT_FALSE(sync_prefs_->IsSyncRequested());
 
-  EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
-  const base::Time& now = base::Time::Now();
-  sync_prefs_->SetLastSyncedTime(now);
-  EXPECT_EQ(now, sync_prefs_->GetLastSyncedTime());
-
   EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
   sync_prefs_->SetSelectedTypes(
       /*keep_everything_synced=*/false,
@@ -181,10 +188,6 @@
       /*registered_types=*/UserSelectableTypeSet::All(),
       /*selected_types=*/UserSelectableTypeSet());
   EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
-
-  EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
-  sync_prefs_->SetEncryptionBootstrapToken("token");
-  EXPECT_EQ("token", sync_prefs_->GetEncryptionBootstrapToken());
 }
 
 TEST_F(SyncPrefsTest, SelectedTypesKeepEverythingSynced) {
diff --git a/components/sync/base/user_selectable_type.cc b/components/sync/base/user_selectable_type.cc
index 2085c746..cd31574 100644
--- a/components/sync/base/user_selectable_type.cc
+++ b/components/sync/base/user_selectable_type.cc
@@ -67,7 +67,6 @@
       return {kTypedUrlsTypeName,
               TYPED_URLS,
               {TYPED_URLS, HISTORY_DELETE_DIRECTIVES, SESSIONS,
-               DEPRECATED_FAVICON_IMAGES, DEPRECATED_FAVICON_TRACKING,
                USER_EVENTS}};
     case UserSelectableType::kExtensions:
       return {
@@ -89,10 +88,8 @@
     case UserSelectableType::kReadingList:
       return {kReadingListTypeName, READING_LIST, {READING_LIST}};
     case UserSelectableType::kTabs:
-      return {kTabsTypeName,
-              PROXY_TABS,
-              {PROXY_TABS, SESSIONS, DEPRECATED_FAVICON_IMAGES,
-               DEPRECATED_FAVICON_TRACKING, SEND_TAB_TO_SELF}};
+      return {
+          kTabsTypeName, PROXY_TABS, {PROXY_TABS, SESSIONS, SEND_TAB_TO_SELF}};
     case UserSelectableType::kWifiConfigurations: {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       // SplitSettingsSync moves Wi-Fi configurations to Chrome OS settings.
diff --git a/components/sync/driver/glue/sync_engine_impl.cc b/components/sync/driver/glue/sync_engine_impl.cc
index 6cf935a..64d5c8d 100644
--- a/components/sync/driver/glue/sync_engine_impl.cc
+++ b/components/sync/driver/glue/sync_engine_impl.cc
@@ -41,12 +41,12 @@
     invalidation::InvalidationService* invalidator,
     SyncInvalidationsService* sync_invalidations_service,
     std::unique_ptr<ActiveDevicesProvider> active_devices_provider,
-    const base::WeakPtr<SyncPrefs>& sync_prefs,
+    const base::WeakPtr<SyncTransportDataPrefs>& prefs,
     const base::FilePath& sync_data_folder,
     scoped_refptr<base::SequencedTaskRunner> sync_task_runner)
     : sync_task_runner_(std::move(sync_task_runner)),
       name_(name),
-      sync_prefs_(sync_prefs),
+      prefs_(prefs),
       invalidator_(invalidator),
       sync_invalidations_service_(sync_invalidations_service),
 #if defined(OS_ANDROID)
@@ -120,12 +120,12 @@
 
 void SyncEngineImpl::StartSyncingWithServer() {
   DVLOG(1) << name_ << ": SyncEngineImpl::StartSyncingWithServer called.";
-  base::Time last_poll_time = sync_prefs_->GetLastPollTime();
+  base::Time last_poll_time = prefs_->GetLastPollTime();
   // If there's no known last poll time (e.g. on initial start-up), we treat
   // this as if a poll just happened.
   if (last_poll_time.is_null()) {
     last_poll_time = base::Time::Now();
-    sync_prefs_->SetLastPollTime(last_poll_time);
+    prefs_->SetLastPollTime(last_poll_time);
   }
   sync_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&SyncEngineBackend::DoStartSyncing, backend_,
@@ -378,7 +378,7 @@
 void SyncEngineImpl::UpdateInvalidationVersions(
     const std::map<ModelType, int64_t>& invalidation_versions) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  sync_prefs_->UpdateInvalidationVersions(invalidation_versions);
+  prefs_->UpdateInvalidationVersions(invalidation_versions);
 }
 
 void SyncEngineImpl::HandleSyncStatusChanged(const SyncStatus& status) {
diff --git a/components/sync/driver/glue/sync_engine_impl.h b/components/sync/driver/glue/sync_engine_impl.h
index 4a114c3..6b290419 100644
--- a/components/sync/driver/glue/sync_engine_impl.h
+++ b/components/sync/driver/glue/sync_engine_impl.h
@@ -47,7 +47,7 @@
 class ProtocolEvent;
 class SyncEngineBackend;
 class SyncInvalidationsService;
-class SyncPrefs;
+class SyncTransportDataPrefs;
 
 // The only real implementation of the SyncEngine. See that interface's
 // definition for documentation of public methods.
@@ -61,7 +61,7 @@
                  invalidation::InvalidationService* invalidator,
                  SyncInvalidationsService* sync_invalidations_service,
                  std::unique_ptr<ActiveDevicesProvider> active_devices_provider,
-                 const base::WeakPtr<SyncPrefs>& sync_prefs,
+                 const base::WeakPtr<SyncTransportDataPrefs>& prefs,
                  const base::FilePath& sync_data_folder,
                  scoped_refptr<base::SequencedTaskRunner> sync_task_runner);
   ~SyncEngineImpl() override;
@@ -186,7 +186,7 @@
 
   bool initialized_ = false;
 
-  const base::WeakPtr<SyncPrefs> sync_prefs_;
+  const base::WeakPtr<SyncTransportDataPrefs> prefs_;
 
   // The host which we serve (and are owned by). Set in Initialize() and nulled
   // out in StopSyncingForShutdown().
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc
index aa951373..fe9dbbc2 100644
--- a/components/sync/driver/glue/sync_engine_impl_unittest.cc
+++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -191,7 +191,7 @@
 
     SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
 
-    sync_prefs_ = std::make_unique<SyncPrefs>(&pref_service_);
+    prefs_ = std::make_unique<SyncTransportDataPrefs>(&pref_service_);
     ON_CALL(invalidator_, UpdateInterestedTopics)
         .WillByDefault(testing::Return(true));
     auto sync_task_runner = base::ThreadPool::CreateSequencedTaskRunner(
@@ -200,7 +200,7 @@
     backend_ = std::make_unique<SyncEngineImpl>(
         "dummyDebugName", &invalidator_, GetSyncInvalidationsService(),
         std::make_unique<NiceMock<MockActiveDevicesProvider>>(),
-        sync_prefs_->AsWeakPtr(),
+        prefs_->AsWeakPtr(),
         temp_dir_.GetPath().Append(base::FilePath(kTestSyncDir)),
         sync_task_runner);
 
@@ -225,7 +225,7 @@
       backend_->Shutdown(STOP_SYNC);
     }
     backend_.reset();
-    sync_prefs_.reset();
+    prefs_.reset();
     // Pump messages posted by the sync thread.
     base::RunLoop().RunUntilIdle();
   }
@@ -239,7 +239,7 @@
     params.http_factory_getter = base::BindOnce(&CreateHttpBridgeFactory);
     params.authenticated_account_id = CoreAccountId("account_id");
     params.sync_manager_factory = std::move(fake_manager_factory_);
-    params.invalidation_versions = sync_prefs_->GetInvalidationVersions();
+    params.invalidation_versions = prefs_->GetInvalidationVersions();
 
     backend_->Initialize(std::move(params));
 
@@ -304,7 +304,7 @@
   base::ScopedTempDir temp_dir_;
   TestingPrefServiceSimple pref_service_;
   TestSyncEngineHost host_;
-  std::unique_ptr<SyncPrefs> sync_prefs_;
+  std::unique_ptr<SyncTransportDataPrefs> prefs_;
   std::unique_ptr<SyncEngineImpl> backend_;
   std::unique_ptr<FakeSyncManagerFactory> fake_manager_factory_;
   FakeSyncManager* fake_manager_ = nullptr;
@@ -373,7 +373,6 @@
 // Test the restart after setting up sync scenario. No enabled types should be
 // downloaded.
 TEST_F(SyncEngineImplTest, Restart) {
-  sync_prefs_->SetFirstSetupComplete();
   fake_manager_factory_->set_progress_marker_types(enabled_types_);
   fake_manager_factory_->set_initial_sync_ended_types(enabled_types_);
   InitializeBackend(true);
@@ -455,7 +454,6 @@
 // Test restarting the browser to newly supported datatypes. The new datatypes
 // should be downloaded on the configuration after backend initialization.
 TEST_F(SyncEngineImplTest, NewlySupportedTypes) {
-  sync_prefs_->SetFirstSetupComplete();
   // Set sync manager behavior before passing it down. All types have progress
   // markers and initial sync ended except the new types.
   ModelTypeSet old_types = enabled_types_;
@@ -481,7 +479,6 @@
 // Verify that downloading control types only downloads those types that do
 // not have initial sync ended set.
 TEST_F(SyncEngineImplTest, DownloadControlTypes) {
-  sync_prefs_->SetFirstSetupComplete();
   // Set sync manager behavior before passing it down. Experiments and device
   // info are new types without progress markers or initial sync ended, while
   // all other types have been fully downloaded and applied.
@@ -533,7 +530,6 @@
 
 // Test that configuration on restart sends the proper GU source.
 TEST_F(SyncEngineImplTest, DownloadControlTypesRestart) {
-  sync_prefs_->SetFirstSetupComplete();
   fake_manager_factory_->set_progress_marker_types(enabled_types_);
   fake_manager_factory_->set_initial_sync_ended_types(enabled_types_);
   InitializeBackend(true);
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 9870bce5..449f8a9 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -156,7 +156,7 @@
   return guid;
 }
 
-bool IsLocalSyncTransportDataValid(const SyncPrefs& sync_prefs,
+bool IsLocalSyncTransportDataValid(const SyncTransportDataPrefs& sync_prefs,
                                    const CoreAccountInfo& core_account_info) {
   // If the cache GUID is empty, it most probably is because local sync data
   // has been fully cleared via ClearLocalSyncTransportData() due to
@@ -204,6 +204,7 @@
 ProfileSyncService::ProfileSyncService(InitParams init_params)
     : sync_client_(std::move(init_params.sync_client)),
       sync_prefs_(sync_client_->GetPrefService()),
+      sync_transport_data_prefs_(sync_client_->GetPrefService()),
       identity_manager_(init_params.identity_manager),
       auth_manager_(std::make_unique<SyncAuthManager>(
           identity_manager_,
@@ -222,7 +223,7 @@
                               base::Unretained(this)),
           base::BindRepeating(&ProfileSyncService::ReconfigureDueToPassphrase,
                               base::Unretained(this)),
-          &sync_prefs_,
+          &sync_transport_data_prefs_,
           sync_client_->GetTrustedVaultClient()),
       network_time_update_callback_(
           std::move(init_params.network_time_update_callback)),
@@ -231,8 +232,6 @@
       is_first_time_sync_configure_(false),
       sync_disabled_by_admin_(false),
       expect_sync_configuration_aborted_(false),
-      invalidations_identity_provider_(
-          init_params.invalidations_identity_provider),
       create_http_post_provider_factory_cb_(
           base::BindRepeating(&CreateHttpBridgeFactory)),
       start_behavior_(init_params.start_behavior),
@@ -252,9 +251,9 @@
   // shouldn't be instantiated.
   DCHECK(switches::IsSyncAllowedByFlag());
 
-  std::string last_version = sync_prefs_.GetLastRunVersion();
+  std::string last_version = sync_transport_data_prefs_.GetLastRunVersion();
   std::string current_version = PRODUCT_VERSION;
-  sync_prefs_.SetLastRunVersion(current_version);
+  sync_transport_data_prefs_.SetLastRunVersion(current_version);
 
   // Check for a major version change. Note that the versions have format
   // MAJOR.MINOR.BUILD.PATCH.
@@ -309,10 +308,6 @@
 
   if (!IsLocalSyncEnabled()) {
     auth_manager_->RegisterForAuthNotifications();
-    if (invalidations_identity_provider_) {
-      invalidations_identity_provider_->SetActiveAccountId(
-          GetAuthenticatedAccountInfo().account_id);
-    }
 
     SyncInvalidationsService* sync_invalidations_service =
         sync_client_->GetSyncInvalidationsService();
@@ -439,12 +434,8 @@
     }
   }
 
-  // Propagate the (potentially) changed account ID to the invalidations system.
-  if (invalidations_identity_provider_) {
-    invalidations_identity_provider_->SetActiveAccountId(
-        GetAuthenticatedAccountInfo().account_id);
-  }
-
+  // Propagate the (potentially) changed account state to the invalidations
+  // system.
   SyncInvalidationsService* sync_invalidations_service =
       sync_client_->GetSyncInvalidationsService();
   if (sync_invalidations_service) {
@@ -554,29 +545,31 @@
 
   engine_ = sync_client_->GetSyncApiComponentFactory()->CreateSyncEngine(
       debug_identifier_, sync_client_->GetInvalidationService(),
-      sync_client_->GetSyncInvalidationsService(), sync_prefs_.AsWeakPtr());
+      sync_client_->GetSyncInvalidationsService(),
+      sync_transport_data_prefs_.AsWeakPtr());
 
   // Clear any old errors the first time sync starts.
   if (!user_settings_->IsFirstSetupComplete()) {
     last_actionable_error_ = SyncProtocolError();
   }
 
-  // The gaia ID in SyncPrefs was introduced with M81, so having an empty value
+  // The gaia ID in sync prefs was introduced with M81, so having an empty value
   // is legitimate and should be populated as a one-off migration.
   // TODO(mastiz): Clean up this migration code after a grace period (e.g. 1
   // year).
-  if (sync_prefs_.GetGaiaId().empty()) {
-    sync_prefs_.SetGaiaId(authenticated_account_info.gaia);
+  if (sync_transport_data_prefs_.GetGaiaId().empty()) {
+    sync_transport_data_prefs_.SetGaiaId(authenticated_account_info.gaia);
   }
 
-  if (!IsLocalSyncTransportDataValid(sync_prefs_, authenticated_account_info)) {
+  if (!IsLocalSyncTransportDataValid(sync_transport_data_prefs_,
+                                     authenticated_account_info)) {
     // Either the local data is uninitialized or corrupt, so let's throw
     // everything away and start from scratch with a new cache GUID, which also
     // cascades into datatypes throwing away their dangling sync metadata due to
     // cache GUID mismatches.
     ClearLocalTransportDataAndNotify();
-    sync_prefs_.SetCacheGuid(GenerateCacheGUID());
-    sync_prefs_.SetGaiaId(authenticated_account_info.gaia);
+    sync_transport_data_prefs_.SetCacheGuid(GenerateCacheGUID());
+    sync_transport_data_prefs_.SetGaiaId(authenticated_account_info.gaia);
   }
 
   SyncEngine::InitParams params;
@@ -604,17 +597,18 @@
         sync_client_->GetLocalSyncBackendFolder();
   }
   params.restored_key_for_bootstrapping =
-      sync_prefs_.GetEncryptionBootstrapToken();
+      sync_transport_data_prefs_.GetEncryptionBootstrapToken();
   params.restored_keystore_key_for_bootstrapping =
-      sync_prefs_.GetKeystoreEncryptionBootstrapToken();
-  params.cache_guid = sync_prefs_.GetCacheGuid();
-  params.birthday = sync_prefs_.GetBirthday();
-  params.bag_of_chips = sync_prefs_.GetBagOfChips();
+      sync_transport_data_prefs_.GetKeystoreEncryptionBootstrapToken();
+  params.cache_guid = sync_transport_data_prefs_.GetCacheGuid();
+  params.birthday = sync_transport_data_prefs_.GetBirthday();
+  params.bag_of_chips = sync_transport_data_prefs_.GetBagOfChips();
   params.engine_components_factory =
       std::make_unique<EngineComponentsFactoryImpl>(
           EngineSwitchesFromCommandLine());
-  params.invalidation_versions = sync_prefs_.GetInvalidationVersions();
-  params.poll_interval = sync_prefs_.GetPollInterval();
+  params.invalidation_versions =
+      sync_transport_data_prefs_.GetInvalidationVersions();
+  params.poll_interval = sync_transport_data_prefs_.GetPollInterval();
   if (params.poll_interval.is_zero()) {
     params.poll_interval = kDefaultPollInterval;
   }
@@ -653,7 +647,7 @@
       // triggered consistently upon browser startup (which is the case for
       // certain codepaths such as the user being signed out). To avoid that,
       // SyncPrefs is used to determine whether it's worth it.
-      if (!sync_prefs_.GetCacheGuid().empty()) {
+      if (!sync_transport_data_prefs_.GetCacheGuid().empty()) {
         sync_client_->GetSyncApiComponentFactory()
             ->DeleteLegacyDirectoryFilesAndNigoriStorage();
       }
@@ -732,7 +726,7 @@
       SetSyncRequestedAndIgnoreNotification(false);
       // For explicit passphrase users, clear the encryption key, such that they
       // will need to reenter it if sync gets re-enabled.
-      sync_prefs_.ClearEncryptionBootstrapToken();
+      sync_transport_data_prefs_.ClearEncryptionBootstrapToken();
       // Also let observers know that Sync-the-feature is now fully disabled
       // (before it possibly starts up again in transport-only mode).
       NotifyObservers();
@@ -835,7 +829,7 @@
 }
 
 void ProfileSyncService::UpdateLastSyncedTime() {
-  sync_prefs_.SetLastSyncedTime(base::Time::Now());
+  sync_transport_data_prefs_.SetLastSyncedTime(base::Time::Now());
 }
 
 void ProfileSyncService::NotifyObservers() {
@@ -916,7 +910,8 @@
   // The very first time the backend initializes is effectively the first time
   // we can say we successfully "synced".  LastSyncedTime will only be null in
   // this case, because the pref wasn't restored on StartUp.
-  is_first_time_sync_configure_ = sync_prefs_.GetLastSyncedTime().is_null();
+  is_first_time_sync_configure_ =
+      sync_transport_data_prefs_.GetLastSyncedTime().is_null();
 
   UpdateEngineInitUMA(success);
 
@@ -931,8 +926,8 @@
   sync_js_controller_.AttachJsBackend(js_backend);
 
   // Save initialization data to preferences.
-  sync_prefs_.SetBirthday(birthday);
-  sync_prefs_.SetBagOfChips(bag_of_chips);
+  sync_transport_data_prefs_.SetBirthday(birthday);
+  sync_transport_data_prefs_.SetBagOfChips(bag_of_chips);
 
   if (!protocol_event_observers_.empty()) {
     engine_->RequestBufferedProtocolEventsAndEnableForwarding();
@@ -985,11 +980,11 @@
 
   UpdateLastSyncedTime();
   if (!snapshot.poll_finish_time().is_null())
-    sync_prefs_.SetLastPollTime(snapshot.poll_finish_time());
+    sync_transport_data_prefs_.SetLastPollTime(snapshot.poll_finish_time());
   DCHECK(!snapshot.poll_interval().is_zero());
-  sync_prefs_.SetPollInterval(snapshot.poll_interval());
+  sync_transport_data_prefs_.SetPollInterval(snapshot.poll_interval());
 
-  sync_prefs_.SetBagOfChips(snapshot.bag_of_chips());
+  sync_transport_data_prefs_.SetBagOfChips(snapshot.bag_of_chips());
 
   DVLOG(2) << "Notifying observers sync cycle completed";
   NotifySyncCycleCompleted();
@@ -1205,7 +1200,7 @@
 }
 
 base::Time ProfileSyncService::GetLastSyncedTimeForDebugging() const {
-  return sync_prefs_.GetLastSyncedTime();
+  return sync_transport_data_prefs_.GetLastSyncedTime();
 }
 
 void ProfileSyncService::OnPreferredDataTypesPrefChange() {
@@ -1289,7 +1284,7 @@
   ConfigureContext configure_context;
   configure_context.authenticated_account_id =
       GetAuthenticatedAccountInfo().account_id;
-  configure_context.cache_guid = sync_prefs_.GetCacheGuid();
+  configure_context.cache_guid = sync_transport_data_prefs_.GetCacheGuid();
   configure_context.sync_mode = SyncMode::kFull;
   configure_context.reason = reason;
   configure_context.configuration_start_time = base::Time::Now();
@@ -1894,11 +1889,11 @@
 }
 
 bool ProfileSyncService::IsPassphrasePrompted() const {
-  return sync_prefs_.IsPassphrasePrompted();
+  return sync_transport_data_prefs_.IsPassphrasePrompted();
 }
 
 void ProfileSyncService::SetPassphrasePrompted(bool prompted) {
-  sync_prefs_.SetPassphrasePrompted(prompted);
+  sync_transport_data_prefs_.SetPassphrasePrompted(prompted);
 }
 
 #if defined(OS_ANDROID)
@@ -1922,8 +1917,8 @@
   if (!engine_ || !engine_->IsInitialized()) {
     return;
   }
-  const std::string cache_guid = sync_prefs_.GetCacheGuid();
-  const std::string birthday = sync_prefs_.GetBirthday();
+  const std::string cache_guid = sync_transport_data_prefs_.GetCacheGuid();
+  const std::string birthday = sync_transport_data_prefs_.GetBirthday();
   DCHECK(!cache_guid.empty());
   const std::string& access_token = auth_manager_->access_token();
   if (!access_token.empty() && !birthday.empty()) {
@@ -2003,7 +1998,7 @@
 }
 
 void ProfileSyncService::ClearLocalTransportDataAndNotify() {
-  sync_prefs_.ClearLocalSyncTransportData();
+  sync_transport_data_prefs_.ClearAll();
   sync_client_->OnLocalSyncTransportDataCleared();
 }
 
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h
index 33962602..6d70341 100644
--- a/components/sync/driver/profile_sync_service.h
+++ b/components/sync/driver/profile_sync_service.h
@@ -20,7 +20,6 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "components/invalidation/public/identity_provider.h"
 #include "components/policy/core/common/policy_service.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/sync/base/model_type.h"
@@ -86,7 +85,6 @@
     // TODO(treib): Remove this and instead retrieve it via
     // SyncClient::GetIdentityManager (but mind LocalSync).
     signin::IdentityManager* identity_manager = nullptr;
-    invalidation::IdentityProvider* invalidations_identity_provider = nullptr;
     StartBehavior start_behavior = MANUAL_START;
     NetworkTimeUpdateCallback network_time_update_callback;
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory;
@@ -378,6 +376,7 @@
 
   // The class that handles getting, setting, and persisting sync preferences.
   SyncPrefs sync_prefs_;
+  SyncTransportDataPrefs sync_transport_data_prefs_;
 
   // Encapsulates user signin - used to set/get the user's authenticated
   // email address and sign-out upon error.
@@ -466,12 +465,6 @@
   // or must delay loading for some reason).
   DataTypeStatusTable::TypeErrorMap data_type_error_map_;
 
-  // This provider tells the invalidations code which identity to register for.
-  // The account that it registers for should be the same as the currently
-  // syncing account, so we'll need to update this whenever the account changes.
-  // May be null (if local Sync is enabled).
-  invalidation::IdentityProvider* const invalidations_identity_provider_;
-
   // List of available data type controllers.
   DataTypeController::TypeMap data_type_controllers_;
 
diff --git a/components/sync/driver/profile_sync_service_bundle.cc b/components/sync/driver/profile_sync_service_bundle.cc
index 8f8fe71..5cd4e08 100644
--- a/components/sync/driver/profile_sync_service_bundle.cc
+++ b/components/sync/driver/profile_sync_service_bundle.cc
@@ -24,8 +24,6 @@
     : identity_test_env_(&test_url_loader_factory_) {
   SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
   identity_test_env_.SetAutomaticIssueOfAccessTokens(true);
-  identity_provider_ = std::make_unique<invalidation::ProfileIdentityProvider>(
-      identity_manager());
 }
 
 ProfileSyncServiceBundle::~ProfileSyncServiceBundle() {}
@@ -49,7 +47,6 @@
   init_params.start_behavior = start_behavior;
   init_params.sync_client = std::move(sync_client);
   init_params.identity_manager = identity_manager();
-  init_params.invalidations_identity_provider = identity_provider_.get();
   init_params.network_time_update_callback = base::DoNothing();
   init_params.url_loader_factory =
       base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
diff --git a/components/sync/driver/profile_sync_service_bundle.h b/components/sync/driver/profile_sync_service_bundle.h
index 0328761e..d00a215e 100644
--- a/components/sync/driver/profile_sync_service_bundle.h
+++ b/components/sync/driver/profile_sync_service_bundle.h
@@ -10,7 +10,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "components/invalidation/impl/profile_identity_provider.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "components/sync/driver/profile_sync_service.h"
@@ -57,10 +56,6 @@
     return &component_factory_;
   }
 
-  invalidation::ProfileIdentityProvider* identity_provider() {
-    return identity_provider_.get();
-  }
-
   MockSyncInvalidationsService* sync_invalidations_service() {
     if (base::FeatureList::IsEnabled(switches::kSyncSendInterestedDataTypes)) {
       return &sync_invalidations_service_;
@@ -74,7 +69,6 @@
   network::TestURLLoaderFactory test_url_loader_factory_;
   signin::IdentityTestEnvironment identity_test_env_;
   testing::NiceMock<SyncApiComponentFactoryMock> component_factory_;
-  std::unique_ptr<invalidation::ProfileIdentityProvider> identity_provider_;
   testing::NiceMock<MockSyncInvalidationsService> sync_invalidations_service_;
 
   DISALLOW_COPY_AND_ASSIGN(ProfileSyncServiceBundle);
diff --git a/components/sync/driver/profile_sync_service_startup_unittest.cc b/components/sync/driver/profile_sync_service_startup_unittest.cc
index 28cba59..a79ffd16 100644
--- a/components/sync/driver/profile_sync_service_startup_unittest.cc
+++ b/components/sync/driver/profile_sync_service_startup_unittest.cc
@@ -178,7 +178,7 @@
             sync_service()->GetTransportState());
 
   // Preferences should be back to defaults.
-  EXPECT_EQ(base::Time(), sync_prefs()->GetLastSyncedTime());
+  EXPECT_EQ(base::Time(), sync_service()->GetLastSyncedTimeForDebugging());
   EXPECT_FALSE(sync_prefs()->IsFirstSetupComplete());
 
   // This tells the ProfileSyncService that setup is now in progress, which
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc
index 01a8f81..e4fe201e 100644
--- a/components/sync/driver/profile_sync_service_unittest.cc
+++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -250,10 +250,11 @@
 
   void PopulatePrefsForNthSync() {
     // Set first sync time before initialize to simulate a complete sync setup.
+    SyncTransportDataPrefs transport_data_prefs(prefs());
     SyncPrefs sync_prefs(prefs());
-    sync_prefs.SetCacheGuid(kTestCacheGuid);
-    sync_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
-    sync_prefs.SetLastSyncedTime(base::Time::Now());
+    transport_data_prefs.SetCacheGuid(kTestCacheGuid);
+    transport_data_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
+    transport_data_prefs.SetLastSyncedTime(base::Time::Now());
     sync_prefs.SetSyncRequested(true);
     sync_prefs.SetSelectedTypes(
         /*keep_everything_synced=*/true,
@@ -295,10 +296,6 @@
         [reason_dest](ConfigureReason reason) { *reason_dest = reason; });
   }
 
-  invalidation::ProfileIdentityProvider* identity_provider() {
-    return profile_sync_service_bundle_.identity_provider();
-  }
-
   signin::IdentityManager* identity_manager() {
     return profile_sync_service_bundle_.identity_manager();
   }
@@ -396,9 +393,10 @@
 
   // Mimic a sync cycle (transport-only) having completed earlier.
   const base::Time kLastSyncedTime = base::Time::Now();
-  sync_prefs.SetLastSyncedTime(kLastSyncedTime);
-  sync_prefs.SetCacheGuid(kTestCacheGuid);
-  sync_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
+  SyncTransportDataPrefs transport_data_prefs(prefs());
+  transport_data_prefs.SetLastSyncedTime(kLastSyncedTime);
+  transport_data_prefs.SetCacheGuid(kTestCacheGuid);
+  transport_data_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
 
   service()->Initialize();
 
@@ -411,8 +409,8 @@
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
   // The local sync data shouldn't be cleared.
-  EXPECT_EQ(kTestCacheGuid, sync_prefs.GetCacheGuid());
-  EXPECT_EQ(kLastSyncedTime, sync_prefs.GetLastSyncedTime());
+  EXPECT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid());
+  EXPECT_EQ(kLastSyncedTime, transport_data_prefs.GetLastSyncedTime());
 }
 
 TEST_F(ProfileSyncServiceTest, ModelTypesForTransportMode) {
@@ -709,32 +707,6 @@
   // There's no signed-in user, so SyncRequested should have been set to false.
   EXPECT_FALSE(service()->GetUserSettings()->IsSyncRequested());
 }
-
-TEST_F(ProfileSyncServiceTest, IdentityProvider_GetActiveAccountId) {
-  // Sign-in and enable sync.
-  SignIn();
-  CreateService(ProfileSyncService::MANUAL_START);
-  InitializeForNthSync();
-  EXPECT_EQ(identity_manager()->GetPrimaryAccountId(),
-            identity_provider()->GetActiveAccountId());
-
-  // Sign out.
-  auto* account_mutator = identity_manager()->GetPrimaryAccountMutator();
-  DCHECK(account_mutator) << "Account mutator should only be null on ChromeOS.";
-  account_mutator->ClearPrimaryAccount(
-      signin_metrics::SIGNOUT_TEST,
-      signin_metrics::SignoutDelete::IGNORE_METRIC);
-  // Wait for ProfileSyncService to be notified.
-  base::RunLoop().RunUntilIdle();
-
-  // The identity provider should show no active account.
-  EXPECT_EQ(CoreAccountId(), identity_provider()->GetActiveAccountId());
-
-  // Change account.
-  identity_test_env()->MakePrimaryAccountAvailable("new_user@gmail.com");
-  EXPECT_EQ(identity_manager()->GetPrimaryAccountId(),
-            identity_provider()->GetActiveAccountId());
-}
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
 TEST_F(ProfileSyncServiceTest, GetSyncTokenStatus) {
@@ -1134,26 +1106,26 @@
   CreateService(ProfileSyncService::MANUAL_START);
   InitializeForNthSync();
 
-  SyncPrefs sync_prefs(prefs());
-  ASSERT_EQ(PRODUCT_VERSION, sync_prefs.GetLastRunVersion());
+  SyncTransportDataPrefs transport_data_prefs(prefs());
+  ASSERT_EQ(PRODUCT_VERSION, transport_data_prefs.GetLastRunVersion());
 
-  sync_prefs.SetPassphrasePrompted(true);
+  transport_data_prefs.SetPassphrasePrompted(true);
 
   // Until a datatype requests startup while a passphrase is required the
   // passphrase prompt bit should remain set.
-  EXPECT_TRUE(sync_prefs.IsPassphrasePrompted());
+  EXPECT_TRUE(transport_data_prefs.IsPassphrasePrompted());
   TriggerPassphraseRequired();
-  EXPECT_TRUE(sync_prefs.IsPassphrasePrompted());
+  EXPECT_TRUE(transport_data_prefs.IsPassphrasePrompted());
 
   // Because the last version was unset, this run should be treated as a new
   // version and force a prompt.
   TriggerDataTypeStartRequest();
-  EXPECT_FALSE(sync_prefs.IsPassphrasePrompted());
+  EXPECT_FALSE(transport_data_prefs.IsPassphrasePrompted());
 
   // At this point further datatype startup request should have no effect.
-  sync_prefs.SetPassphrasePrompted(true);
+  transport_data_prefs.SetPassphrasePrompted(true);
   TriggerDataTypeStartRequest();
-  EXPECT_TRUE(sync_prefs.IsPassphrasePrompted());
+  EXPECT_TRUE(transport_data_prefs.IsPassphrasePrompted());
 }
 
 // Test that when ProfileSyncService receives actionable error
@@ -1317,15 +1289,16 @@
 }
 
 TEST_F(ProfileSyncServiceTest, ShouldPopulateAccountIdCachedInPrefs) {
-  SyncPrefs sync_prefs(prefs());
+  SyncTransportDataPrefs transport_data_prefs(prefs());
 
   SignIn();
   CreateService(ProfileSyncService::MANUAL_START);
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
-  ASSERT_EQ(kTestCacheGuid, sync_prefs.GetCacheGuid());
-  EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser), sync_prefs.GetGaiaId());
+  ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid());
+  EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser),
+            transport_data_prefs.GetGaiaId());
 }
 
 #if defined(OS_ANDROID)
@@ -1367,38 +1340,39 @@
 
 TEST_F(ProfileSyncServiceTest,
        ShouldNotPopulateAccountIdCachedInPrefsWithLocalSync) {
-  SyncPrefs sync_prefs(prefs());
+  SyncTransportDataPrefs transport_data_prefs(prefs());
 
   SignIn();
   CreateServiceWithLocalSyncBackend();
   InitializeForNthSync();
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
-  ASSERT_EQ(kTestCacheGuid, sync_prefs.GetCacheGuid());
-  EXPECT_TRUE(sync_prefs.GetGaiaId().empty());
+  ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid());
+  EXPECT_TRUE(transport_data_prefs.GetGaiaId().empty());
 }
 
 // Verifies that local sync transport data is thrown away if there is a mismatch
 // between the account ID cached in SyncPrefs and the actual one.
 TEST_F(ProfileSyncServiceTest,
        ShouldClearLocalSyncTransportDataDueToAccountIdMismatch) {
-  SyncPrefs sync_prefs(prefs());
+  SyncTransportDataPrefs transport_data_prefs(prefs());
 
   SignIn();
   CreateService(ProfileSyncService::MANUAL_START);
   PopulatePrefsForNthSync();
-  ASSERT_EQ(kTestCacheGuid, sync_prefs.GetCacheGuid());
+  ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid());
 
   // Manually override the authenticated account ID, which should be detected
   // during initialization.
-  sync_prefs.SetGaiaId("corrupt_gaia_id");
+  transport_data_prefs.SetGaiaId("corrupt_gaia_id");
 
   service()->Initialize();
 
   ASSERT_EQ(SyncService::TransportState::ACTIVE,
             service()->GetTransportState());
-  EXPECT_NE(kTestCacheGuid, sync_prefs.GetCacheGuid());
-  EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser), sync_prefs.GetGaiaId());
+  EXPECT_NE(kTestCacheGuid, transport_data_prefs.GetCacheGuid());
+  EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser),
+            transport_data_prefs.GetGaiaId());
 }
 
 TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated,
diff --git a/components/sync/driver/sync_api_component_factory.h b/components/sync/driver/sync_api_component_factory.h
index 363163a..d2fde58 100644
--- a/components/sync/driver/sync_api_component_factory.h
+++ b/components/sync/driver/sync_api_component_factory.h
@@ -25,7 +25,7 @@
 class DataTypeManagerObserver;
 class SyncEngine;
 class SyncInvalidationsService;
-class SyncPrefs;
+class SyncTransportDataPrefs;
 
 // This factory provides sync driver code with the model type specific sync/api
 // service (like SyncableService) implementations.
@@ -50,7 +50,7 @@
       const std::string& name,
       invalidation::InvalidationService* invalidator,
       syncer::SyncInvalidationsService* sync_invalidation_service,
-      const base::WeakPtr<SyncPrefs>& sync_prefs) = 0;
+      const base::WeakPtr<SyncTransportDataPrefs>& sync_prefs) = 0;
 
   // Deletes the directory database files from the sync data folder to cleanup
   // all files. The main purpose is to delete the legacy Directory files
diff --git a/components/sync/driver/sync_api_component_factory_mock.h b/components/sync/driver/sync_api_component_factory_mock.h
index 5987906..1965c17 100644
--- a/components/sync/driver/sync_api_component_factory_mock.h
+++ b/components/sync/driver/sync_api_component_factory_mock.h
@@ -36,7 +36,7 @@
               (const std::string& name,
                invalidation::InvalidationService* invalidator,
                syncer::SyncInvalidationsService* sync_invalidations_service,
-               const base::WeakPtr<SyncPrefs>& sync_prefs),
+               const base::WeakPtr<SyncTransportDataPrefs>& sync_prefs),
               (override));
   MOCK_METHOD(void, DeleteLegacyDirectoryFilesAndNigoriStorage, (), (override));
 };
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc
index ac1b9b3..adf2bfc4 100644
--- a/components/sync/driver/sync_user_settings_impl.cc
+++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -243,7 +243,7 @@
 #endif
   types.RetainAll(registered_model_types_);
 
-  static_assert(41 == ModelType::NUM_ENTRIES,
+  static_assert(39 == ModelType::NUM_ENTRIES,
                 "If adding a new sync data type, update the list below below if"
                 " you want to disable the new data type for local sync.");
   types.PutAll(ControlTypes());
diff --git a/components/sync/driver/sync_user_settings_unittest.cc b/components/sync/driver/sync_user_settings_unittest.cc
index 1826d77..da482cc 100644
--- a/components/sync/driver/sync_user_settings_unittest.cc
+++ b/components/sync/driver/sync_user_settings_unittest.cc
@@ -55,11 +55,13 @@
   SyncUserSettingsTest() {
     SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
     sync_prefs_ = std::make_unique<SyncPrefs>(&pref_service_);
+    transport_data_prefs_ =
+        std::make_unique<SyncTransportDataPrefs>(&pref_service_);
 
     sync_service_crypto_ = std::make_unique<SyncServiceCrypto>(
         /*notify_observers=*/base::DoNothing(),
         /*notify_required_user_action_changed=*/base::DoNothing(),
-        /*reconfigure=*/base::DoNothing(), sync_prefs_.get(),
+        /*reconfigure=*/base::DoNothing(), transport_data_prefs_.get(),
         /*trusted_vault_client=*/nullptr);
   }
 
@@ -76,6 +78,7 @@
   // fields are dependent.
   TestingPrefServiceSimple pref_service_;
   std::unique_ptr<SyncPrefs> sync_prefs_;
+  std::unique_ptr<SyncTransportDataPrefs> transport_data_prefs_;
   std::unique_ptr<SyncServiceCrypto> sync_service_crypto_;
 };
 
diff --git a/components/sync/model_impl/model_type_store_service_impl.cc b/components/sync/model_impl/model_type_store_service_impl.cc
index 4d4c9d2b..328ac56 100644
--- a/components/sync/model_impl/model_type_store_service_impl.cc
+++ b/components/sync/model_impl/model_type_store_service_impl.cc
@@ -39,13 +39,6 @@
                << error->ToString();
     return;
   }
-
-  // TODO(crbug.com/978775): Remove the cleanup logic after a year (in 2020-12).
-  // Clean up local data from deprecated datatypes.
-  for (ModelType type :
-       {DEPRECATED_FAVICON_IMAGES, DEPRECATED_FAVICON_TRACKING}) {
-    BlockingModelTypeStoreImpl(type, store_backend).DeleteAllDataAndMetadata();
-  }
 }
 
 std::unique_ptr<BlockingModelTypeStoreImpl, base::OnTaskRunnerDeleter>
diff --git a/components/sync/nigori/nigori_state.cc b/components/sync/nigori/nigori_state.cc
index 51fcfef..eee3184 100644
--- a/components/sync/nigori/nigori_state.cc
+++ b/components/sync/nigori/nigori_state.cc
@@ -63,7 +63,7 @@
 void UpdateNigoriSpecificsFromEncryptedTypes(
     ModelTypeSet encrypted_types,
     sync_pb::NigoriSpecifics* specifics) {
-  static_assert(41 == ModelType::NUM_ENTRIES,
+  static_assert(39 == ModelType::NUM_ENTRIES,
                 "If adding an encryptable type, update handling below.");
   specifics->set_encrypt_bookmarks(encrypted_types.Has(BOOKMARKS));
   specifics->set_encrypt_preferences(encrypted_types.Has(PREFERENCES));
@@ -82,10 +82,6 @@
   specifics->set_encrypt_extension_settings(
       encrypted_types.Has(EXTENSION_SETTINGS));
   specifics->set_encrypt_dictionary(encrypted_types.Has(DICTIONARY));
-  specifics->set_encrypt_favicon_images(
-      encrypted_types.Has(DEPRECATED_FAVICON_IMAGES));
-  specifics->set_encrypt_favicon_tracking(
-      encrypted_types.Has(DEPRECATED_FAVICON_TRACKING));
   specifics->set_encrypt_app_list(encrypted_types.Has(APP_LIST));
   specifics->set_encrypt_arc_package(encrypted_types.Has(ARC_PACKAGE));
   specifics->set_encrypt_printers(encrypted_types.Has(PRINTERS));
diff --git a/components/sync/protocol/favicon_image_specifics.proto b/components/sync/protocol/favicon_image_specifics.proto
index 446054e..cf9ab9f 100644
--- a/components/sync/protocol/favicon_image_specifics.proto
+++ b/components/sync/protocol/favicon_image_specifics.proto
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
+// DEPRECATED: This data type is no longer synced.
+// TODO(crbug.com/978775): Remove once the file is no longer used by the server.
 // Sync protocol datatype extension for the favicon image specifics.
 
 // If you change or add any fields in this file, update proto_visitors.h and
diff --git a/components/sync/protocol/favicon_tracking_specifics.proto b/components/sync/protocol/favicon_tracking_specifics.proto
index cda309c..78e0fec 100644
--- a/components/sync/protocol/favicon_tracking_specifics.proto
+++ b/components/sync/protocol/favicon_tracking_specifics.proto
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
+// DEPRECATED: This data type is no longer synced.
+// TODO(crbug.com/978775): Remove once the file is no longer used by the server.
 // Sync protocol datatype extension for the favicon tracking type.
 
 // If you change or add any fields in this file, update proto_visitors.h and
diff --git a/components/sync/protocol/nigori_specifics.proto b/components/sync/protocol/nigori_specifics.proto
index cba13753..06b0eee 100644
--- a/components/sync/protocol/nigori_specifics.proto
+++ b/components/sync/protocol/nigori_specifics.proto
@@ -142,9 +142,8 @@
   // encrypted.
   optional bool encrypt_dictionary = 34;
 
-  // Boolean corresponding to Whether to encrypt favicons data or not.
-  optional bool encrypt_favicon_images = 35;
-  optional bool encrypt_favicon_tracking = 36;
+  reserved 35;
+  reserved 36;
 
   reserved 37;
   reserved "encrypt_articles";
diff --git a/components/sync/protocol/proto_value_conversions.cc b/components/sync/protocol/proto_value_conversions.cc
index 7316c0c..82e8020 100644
--- a/components/sync/protocol/proto_value_conversions.cc
+++ b/components/sync/protocol/proto_value_conversions.cc
@@ -309,8 +309,6 @@
 IMPLEMENT_PROTO_TO_VALUE(ExperimentsSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(ExtensionSettingSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(ExtensionSpecifics)
-IMPLEMENT_PROTO_TO_VALUE(FaviconImageSpecifics)
-IMPLEMENT_PROTO_TO_VALUE(FaviconTrackingSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(GlobalIdDirective)
 IMPLEMENT_PROTO_TO_VALUE(HistoryDeleteDirectiveSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(LinkedAppIconInfo)
diff --git a/components/sync/protocol/proto_value_conversions.h b/components/sync/protocol/proto_value_conversions.h
index 7b2422d4..4ea852d 100644
--- a/components/sync/protocol/proto_value_conversions.h
+++ b/components/sync/protocol/proto_value_conversions.h
@@ -36,8 +36,6 @@
 class ExperimentsSpecifics;
 class ExtensionSettingSpecifics;
 class ExtensionSpecifics;
-class FaviconImageSpecifics;
-class FaviconTrackingSpecifics;
 class HistoryDeleteDirectiveSpecifics;
 class LinkedAppIconInfo;
 class ManagedUserSettingSpecifics;
@@ -154,12 +152,6 @@
 std::unique_ptr<base::DictionaryValue> ExtensionSpecificsToValue(
     const sync_pb::ExtensionSpecifics& extension_specifics);
 
-std::unique_ptr<base::DictionaryValue> FaviconImageSpecificsToValue(
-    const sync_pb::FaviconImageSpecifics& favicon_image_specifics);
-
-std::unique_ptr<base::DictionaryValue> FaviconTrackingSpecificsToValue(
-    const sync_pb::FaviconTrackingSpecifics& favicon_tracking_specifics);
-
 std::unique_ptr<base::DictionaryValue> HistoryDeleteDirectiveSpecificsToValue(
     const sync_pb::HistoryDeleteDirectiveSpecifics&
         history_delete_directive_specifics);
diff --git a/components/sync/protocol/proto_value_conversions_unittest.cc b/components/sync/protocol/proto_value_conversions_unittest.cc
index bc68bb2..de8b7d9 100644
--- a/components/sync/protocol/proto_value_conversions_unittest.cc
+++ b/components/sync/protocol/proto_value_conversions_unittest.cc
@@ -20,8 +20,6 @@
 #include "components/sync/protocol/experiments_specifics.pb.h"
 #include "components/sync/protocol/extension_setting_specifics.pb.h"
 #include "components/sync/protocol/extension_specifics.pb.h"
-#include "components/sync/protocol/favicon_image_specifics.pb.h"
-#include "components/sync/protocol/favicon_tracking_specifics.pb.h"
 #include "components/sync/protocol/managed_user_setting_specifics.pb.h"
 #include "components/sync/protocol/managed_user_whitelist_specifics.pb.h"
 #include "components/sync/protocol/nigori_specifics.pb.h"
@@ -59,7 +57,7 @@
 
 DEFINE_SPECIFICS_TO_VALUE_TEST(encrypted)
 
-static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+static_assert(39 == syncer::ModelType::NUM_ENTRIES,
               "When adding a new field, add a DEFINE_SPECIFICS_TO_VALUE_TEST "
               "for your field below, and optionally a test for the specific "
               "conversions.");
@@ -78,8 +76,6 @@
 DEFINE_SPECIFICS_TO_VALUE_TEST(experiments)
 DEFINE_SPECIFICS_TO_VALUE_TEST(extension)
 DEFINE_SPECIFICS_TO_VALUE_TEST(extension_setting)
-DEFINE_SPECIFICS_TO_VALUE_TEST(favicon_image)
-DEFINE_SPECIFICS_TO_VALUE_TEST(favicon_tracking)
 DEFINE_SPECIFICS_TO_VALUE_TEST(history_delete_directive)
 DEFINE_SPECIFICS_TO_VALUE_TEST(managed_user_setting)
 DEFINE_SPECIFICS_TO_VALUE_TEST(managed_user_whitelist)
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index 4b5da2b..0d7e59f 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -424,7 +424,7 @@
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::EntitySpecifics& proto) {
-  static_assert(41 == ModelType::NUM_ENTRIES,
+  static_assert(39 == ModelType::NUM_ENTRIES,
                 "When adding a new protocol type, you will likely need to add "
                 "it here as well.");
   VISIT(encrypted);
@@ -442,8 +442,8 @@
   VISIT(experiments);
   VISIT(extension);
   VISIT(extension_setting);
-  VISIT(favicon_image);
-  VISIT(favicon_tracking);
+  VISIT(deprecated_favicon_image);
+  VISIT(deprecated_favicon_tracking);
   VISIT(history_delete_directive);
   VISIT(managed_user_setting);
   VISIT(managed_user_whitelist);
diff --git a/components/sync/protocol/sync.proto b/components/sync/protocol/sync.proto
index 9234a208..c7f8c6b 100644
--- a/components/sync/protocol/sync.proto
+++ b/components/sync/protocol/sync.proto
@@ -145,8 +145,9 @@
     ExperimentsSpecifics experiments = 161496 [deprecated = true];
     PriorityPreferenceSpecifics priority_preference = 163425;
     DictionarySpecifics dictionary = 170540;
-    FaviconTrackingSpecifics favicon_tracking = 181534;
-    FaviconImageSpecifics favicon_image = 182019;
+    FaviconTrackingSpecifics deprecated_favicon_tracking = 181534
+        [deprecated = true];
+    FaviconImageSpecifics deprecated_favicon_image = 182019 [deprecated = true];
     ManagedUserSettingSpecifics managed_user_setting = 186662;
     // TODO(tschumann): Remove once server-side dependencies are resolved.
     ManagedUserSpecifics managed_user = 194582 [deprecated = true];
diff --git a/components/sync/test/model/mock_model_type_change_processor.h b/components/sync/test/model/mock_model_type_change_processor.h
index 43d8bf1..99e0a45 100644
--- a/components/sync/test/model/mock_model_type_change_processor.h
+++ b/components/sync/test/model/mock_model_type_change_processor.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "components/sync/model/metadata_batch.h"
 #include "components/sync/model/model_type_change_processor.h"
 #include "components/sync/model/model_type_sync_bridge.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/components/webapps/browser/BUILD.gn b/components/webapps/browser/BUILD.gn
index 13dc0c96..87dbcfdf 100644
--- a/components/webapps/browser/BUILD.gn
+++ b/components/webapps/browser/BUILD.gn
@@ -6,6 +6,12 @@
 
 source_set("browser") {
   sources = [
+    "banners/app_banner_manager.cc",
+    "banners/app_banner_manager.h",
+    "banners/app_banner_metrics.cc",
+    "banners/app_banner_metrics.h",
+    "banners/app_banner_settings_helper.cc",
+    "banners/app_banner_settings_helper.h",
     "installable/installable_data.cc",
     "installable/installable_data.h",
     "installable/installable_logging.cc",
@@ -23,7 +29,12 @@
   ]
   deps = [
     "//base",
+    "//components/content_settings/core/browser",
+    "//components/permissions",
     "//components/security_state/core",
+    "//components/site_engagement/content",
+    "//components/variations",
+    "//components/webapps/common",
     "//content/public/browser",
     "//content/public/common",
     "//net",
@@ -65,14 +76,10 @@
       "//components/infobars/android",
       "//components/infobars/content",
       "//components/strings",
-      "//components/webapps/common",
       "//components/webapps/common:mojo_bindings",
       "//services/device/public/mojom",
-      "//skia",
-      "//third_party/blink/public/common:common",
       "//ui/base",
       "//ui/gfx",
-      "//url",
     ]
   }
 }
@@ -94,6 +101,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "banners/app_banner_settings_helper_unittest.cc",
     "installable/installable_manager_unittest.cc",
     "installable/installable_task_queue_unittest.cc",
   ]
@@ -101,7 +109,14 @@
     ":browser",
     "//base",
     "//base/test:test_support",
+    "//components/content_settings/core/browser",
+    "//components/permissions:test_support",
+    "//components/prefs:test_support",
+    "//components/site_engagement/content",
+    "//components/user_prefs",
+    "//content/public/browser",
     "//content/public/common",
+    "//content/test:test_support",
     "//testing/gtest",
     "//third_party/blink/public/mojom:mojom_platform_headers",
   ]
diff --git a/components/webapps/browser/DEPS b/components/webapps/browser/DEPS
index 54871c47..f4c9834 100644
--- a/components/webapps/browser/DEPS
+++ b/components/webapps/browser/DEPS
@@ -1,10 +1,19 @@
 include_rules = [
+  "+components/content_settings",
   "+components/infobars",
+  "+components/permissions",
+  "+components/prefs",
   "+components/security_state/core",
+  "+components/site_engagement",
+  "+components/user_prefs",
+  "+components/variations",
   "+content/public/browser",
   "+content/public/common",
+  "+content/public/test",
+  "+mojo/public/cpp",
   "+net/base",
   "+services/network/public/cpp",
+  "+services/service_manager/public/cpp",
   "+third_party/blink/public/common",
   "+third_party/blink/public/mojom",
   "+third_party/skia/include",
diff --git a/components/webapps/browser/android/BUILD.gn b/components/webapps/browser/android/BUILD.gn
index 23ee3de..0cc56d20 100644
--- a/components/webapps/browser/android/BUILD.gn
+++ b/components/webapps/browser/android/BUILD.gn
@@ -36,6 +36,7 @@
 
 java_cpp_enum("webapps_java_enums_srcjar") {
   sources = [
+    "//components/webapps/browser/banners/app_banner_settings_helper.h",
     "add_to_homescreen_params.h",
     "shortcut_info.h",
   ]
diff --git a/components/webapps/browser/android/shortcut_info.cc b/components/webapps/browser/android/shortcut_info.cc
index b232e81..ccc01b9 100644
--- a/components/webapps/browser/android/shortcut_info.cc
+++ b/components/webapps/browser/android/shortcut_info.cc
@@ -84,10 +84,6 @@
 
   description = manifest.description.value_or(base::string16());
 
-  categories.clear();
-  for (const auto& category : manifest.categories)
-    categories.push_back(category);
-
   // Set the url based on the manifest value, if any.
   if (manifest.start_url.is_valid())
     url = manifest.start_url;
diff --git a/chrome/browser/banners/app_banner_manager.cc b/components/webapps/browser/banners/app_banner_manager.cc
similarity index 97%
rename from chrome/browser/banners/app_banner_manager.cc
rename to components/webapps/browser/banners/app_banner_manager.cc
index 13b8a01..3b51c2d 100644
--- a/chrome/browser/banners/app_banner_manager.cc
+++ b/components/webapps/browser/banners/app_banner_manager.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/banners/app_banner_manager.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
 
 #include <algorithm>
 #include <utility>
@@ -16,12 +16,13 @@
 #include "base/stl_util.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/browser/banners/app_banner_settings_helper.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "components/webapps/browser/installable/installable_data.h"
 #include "components/webapps/browser/installable/installable_manager.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/browser/webapps_client.h"
 #include "components/webapps/common/switches.h"
 #include "content/public/browser/back_forward_cache.h"
 #include "content/public/browser/navigation_handle.h"
@@ -127,6 +128,14 @@
 }  // anonymous namespace
 
 // static
+AppBannerManager* AppBannerManager::FromWebContents(
+    content::WebContents* web_contents) {
+  return WebappsClient::Get()
+             ? WebappsClient::Get()->GetAppBannerManager(web_contents)
+             : nullptr;
+}
+
+// static
 base::Time AppBannerManager::GetCurrentTime() {
   return base::Time::Now() +
          base::TimeDelta::FromDays(gTimeDeltaInDaysForTesting);
@@ -421,8 +430,7 @@
 
   AppBannerSettingsHelper::RecordBannerEvent(
       contents, validated_url_, GetAppIdentifier(),
-      AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW,
-      GetCurrentTime());
+      AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, GetCurrentTime());
 }
 
 void AppBannerManager::ReportStatus(InstallableStatusCode code) {
diff --git a/chrome/browser/banners/app_banner_manager.h b/components/webapps/browser/banners/app_banner_manager.h
similarity index 98%
rename from chrome/browser/banners/app_banner_manager.h
rename to components/webapps/browser/banners/app_banner_manager.h
index b342c9f..c4ae1e3 100644
--- a/chrome/browser/banners/app_banner_manager.h
+++ b/components/webapps/browser/banners/app_banner_manager.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 CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
-#define CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
+#ifndef COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
+#define COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
 
 #include <memory>
 #include <string>
@@ -426,4 +426,4 @@
 
 }  // namespace webapps
 
-#endif  // CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
+#endif  // COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_MANAGER_H_
diff --git a/chrome/browser/banners/app_banner_metrics.cc b/components/webapps/browser/banners/app_banner_metrics.cc
similarity index 97%
rename from chrome/browser/banners/app_banner_metrics.cc
rename to components/webapps/browser/banners/app_banner_metrics.cc
index 17a4779..ae3f5cd 100644
--- a/chrome/browser/banners/app_banner_metrics.cc
+++ b/components/webapps/browser/banners/app_banner_metrics.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/banners/app_banner_metrics.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
 
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/chrome/browser/banners/app_banner_metrics.h b/components/webapps/browser/banners/app_banner_metrics.h
similarity index 94%
rename from chrome/browser/banners/app_banner_metrics.h
rename to components/webapps/browser/banners/app_banner_metrics.h
index b9ebb2d..1979fa7 100644
--- a/chrome/browser/banners/app_banner_metrics.h
+++ b/components/webapps/browser/banners/app_banner_metrics.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 CHROME_BROWSER_BANNERS_APP_BANNER_METRICS_H_
-#define CHROME_BROWSER_BANNERS_APP_BANNER_METRICS_H_
+#ifndef COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_METRICS_H_
+#define COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_METRICS_H_
 
 #include "components/webapps/browser/installable/installable_logging.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-forward.h"
@@ -96,4 +96,4 @@
 
 }  // namespace webapps
 
-#endif  // CHROME_BROWSER_BANNERS_APP_BANNER_METRICS_H_
+#endif  // COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_METRICS_H_
diff --git a/chrome/browser/banners/app_banner_settings_helper.cc b/components/webapps/browser/banners/app_banner_settings_helper.cc
similarity index 98%
rename from chrome/browser/banners/app_banner_settings_helper.cc
rename to components/webapps/browser/banners/app_banner_settings_helper.cc
index fff93d1..8454e20 100644
--- a/chrome/browser/banners/app_banner_settings_helper.cc
+++ b/components/webapps/browser/banners/app_banner_settings_helper.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/banners/app_banner_settings_helper.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
 
 #include <stddef.h>
 
@@ -14,12 +14,12 @@
 #include "base/command_line.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/util/values/values_util.h"
-#include "chrome/browser/banners/app_banner_manager.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/permissions/permissions_client.h"
 #include "components/variations/variations_associated_data.h"
+#include "components/webapps/browser/banners/app_banner_manager.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
 #include "components/webapps/common/switches.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/banners/app_banner_settings_helper.h b/components/webapps/browser/banners/app_banner_settings_helper.h
similarity index 97%
rename from chrome/browser/banners/app_banner_settings_helper.h
rename to components/webapps/browser/banners/app_banner_settings_helper.h
index a749a012..9260a01 100644
--- a/chrome/browser/banners/app_banner_settings_helper.h
+++ b/components/webapps/browser/banners/app_banner_settings_helper.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 CHROME_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
-#define CHROME_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
+#ifndef COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
+#define COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
 
 #include <set>
 #include <string>
@@ -197,4 +197,4 @@
 
 }  // namespace webapps
 
-#endif  // CHROME_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
+#endif  // COMPONENTS_WEBAPPS_BROWSER_BANNERS_APP_BANNER_SETTINGS_HELPER_H_
diff --git a/chrome/browser/banners/app_banner_settings_helper_unittest.cc b/components/webapps/browser/banners/app_banner_settings_helper_unittest.cc
similarity index 77%
rename from chrome/browser/banners/app_banner_settings_helper_unittest.cc
rename to components/webapps/browser/banners/app_banner_settings_helper_unittest.cc
index d0de883a..b8b7d86 100644
--- a/chrome/browser/banners/app_banner_settings_helper_unittest.cc
+++ b/components/webapps/browser/banners/app_banner_settings_helper_unittest.cc
@@ -2,11 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/banners/app_banner_settings_helper.h"
-#include "chrome/browser/banners/app_banner_metrics.h"
-#include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "chrome/test/base/testing_profile.h"
+#include "components/webapps/browser/banners/app_banner_settings_helper.h"
+
+#include "components/permissions/test/test_permissions_client.h"
+#include "components/prefs/testing_pref_service.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/user_prefs/user_prefs.h"
+#include "components/webapps/browser/banners/app_banner_metrics.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/test/test_renderer_host.h"
 
 namespace webapps {
 
@@ -36,11 +40,37 @@
   return out_time;
 }
 
-class AppBannerSettingsHelperTest : public ChromeRenderViewHostTestHarness {
+class AppBannerSettingsHelperTest
+    : public content::RenderViewHostTestHarness,
+      public site_engagement::SiteEngagementService::ServiceProvider {
   void SetUp() override {
-    ChromeRenderViewHostTestHarness::SetUp();
+    content::RenderViewHostTestHarness::SetUp();
+    user_prefs::UserPrefs::Set(browser_context(), &prefs_);
+    site_engagement_service_ =
+        std::make_unique<site_engagement::SiteEngagementService>(
+            browser_context());
+    site_engagement::SiteEngagementService::RegisterProfilePrefs(
+        prefs_.registry());
+    site_engagement::SiteEngagementService::SetServiceProvider(this);
     AppBannerSettingsHelper::SetDefaultParameters();
   }
+
+  void TearDown() override {
+    site_engagement::SiteEngagementService::ClearServiceProvider(this);
+    content::RenderViewHostTestHarness::TearDown();
+  }
+
+  // site_engagement::SiteEngagementService::ServiceProvider:
+  site_engagement::SiteEngagementService* GetSiteEngagementService(
+      content::BrowserContext* browser_context) override {
+    return site_engagement_service_.get();
+  }
+
+ private:
+  TestingPrefServiceSimple prefs_;
+  permissions::TestPermissionsClient permissions_client_;
+  std::unique_ptr<site_engagement::SiteEngagementService>
+      site_engagement_service_;
 };
 
 }  // namespace
@@ -90,7 +120,7 @@
 TEST_F(AppBannerSettingsHelperTest, ShouldShowFromEngagement) {
   GURL url(kTestURL);
   site_engagement::SiteEngagementService* service =
-      site_engagement::SiteEngagementService::Get(profile());
+      site_engagement::SiteEngagementService::Get(browser_context());
 
   // By default the banner should not be shown.
   EXPECT_FALSE(
@@ -193,7 +223,7 @@
   GURL otherURL(kSameOriginTestURL);
 
   site_engagement::SiteEngagementService* service =
-      site_engagement::SiteEngagementService::Get(profile());
+      site_engagement::SiteEngagementService::Get(browser_context());
 
   // By default the banner should not be shown.
   EXPECT_FALSE(
@@ -234,7 +264,7 @@
   AppBannerSettingsHelper::SetTotalEngagementToTrigger(10);
   GURL url(kTestURL);
   site_engagement::SiteEngagementService* service =
-      site_engagement::SiteEngagementService::Get(profile());
+      site_engagement::SiteEngagementService::Get(browser_context());
 
   // By default the banner should not be shown.
   EXPECT_FALSE(
@@ -274,61 +304,61 @@
   base::Time tenth_day = reference_time + base::TimeDelta::FromDays(10);
   base::Time eleventh_day = reference_time + base::TimeDelta::FromDays(11);
 
-  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url,
-                                                            reference_time));
+  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(
+      browser_context(), url, reference_time));
 
   AppBannerSettingsHelper::RecordBannerEvent(
       web_contents(), url, kTestPackageName,
       AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN,
       reference_time);
-  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url,
-                                                           reference_time));
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, first_day));
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, ninth_day));
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, tenth_day));
-  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url,
-                                                            eleventh_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(
+      browser_context(), url, reference_time));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, first_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, ninth_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, tenth_day));
+  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                            url, eleventh_day));
 
   // Make sure a different path under the same origin also returns true.
   EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(
-      profile(), url_same_origin, reference_time));
+      browser_context(), url_same_origin, reference_time));
   EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(
-      profile(), url_same_origin, first_day));
+      browser_context(), url_same_origin, first_day));
   EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(
-      profile(), url_same_origin, ninth_day));
+      browser_context(), url_same_origin, ninth_day));
   EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(
-      profile(), url_same_origin, tenth_day));
+      browser_context(), url_same_origin, tenth_day));
   EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(
-      profile(), url_same_origin, eleventh_day));
+      browser_context(), url_same_origin, eleventh_day));
 
   // Check a different event type.
   AppBannerSettingsHelper::RecordBannerEvent(
       web_contents(), url2, kTestPackageName,
       AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, reference_time);
 
-  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2,
-                                                            reference_time));
-  EXPECT_FALSE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2, first_day));
-  EXPECT_FALSE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url2, ninth_day));
+  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(
+      browser_context(), url2, reference_time));
+  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                            url2, first_day));
+  EXPECT_FALSE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                            url2, ninth_day));
 
   // Make sure that the most recent time the event is recorded is used.
   AppBannerSettingsHelper::RecordBannerEvent(
       web_contents(), url, kTestPackageName,
       AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN,
       first_day);
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, first_day));
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, ninth_day));
-  EXPECT_TRUE(
-      AppBannerSettingsHelper::WasLaunchedRecently(profile(), url, tenth_day));
-  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(profile(), url,
-                                                           eleventh_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, first_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, ninth_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, tenth_day));
+  EXPECT_TRUE(AppBannerSettingsHelper::WasLaunchedRecently(browser_context(),
+                                                           url, eleventh_day));
 }
 
 TEST_F(AppBannerSettingsHelperTest, NulloptSingleBannerEvent) {
diff --git a/components/webapps/browser/webapps_client.h b/components/webapps/browser/webapps_client.h
index d1760dd..9528793 100644
--- a/components/webapps/browser/webapps_client.h
+++ b/components/webapps/browser/webapps_client.h
@@ -20,6 +20,7 @@
 
 namespace webapps {
 
+class AppBannerManager;
 enum class InstallTrigger;
 enum class WebappInstallSource;
 struct AddToHomescreenParams;
@@ -46,6 +47,9 @@
       content::WebContents* web_contents,
       InstallTrigger trigger) = 0;
 
+  virtual AppBannerManager* GetAppBannerManager(
+      content::WebContents* web_contents) = 0;
+
 #if defined(OS_ANDROID)
   virtual bool IsInstallationInProgress(content::WebContents* web_contents,
                                         const GURL& manifest_url) = 0;
diff --git a/content/app/BUILD.gn b/content/app/BUILD.gn
index b6f8a11..6736d66 100644
--- a/content/app/BUILD.gn
+++ b/content/app/BUILD.gn
@@ -67,6 +67,8 @@
   sources = [
     "content_main_runner_impl.cc",
     "content_main_runner_impl.h",
+    "partition_alloc_support.cc",
+    "partition_alloc_support.h",
   ]
 
   configs += extra_configs
diff --git a/content/app/OWNERS b/content/app/OWNERS
index 60a5c1d..e084a55 100644
--- a/content/app/OWNERS
+++ b/content/app/OWNERS
@@ -1,2 +1,4 @@
 rockot@google.com
+
+per-file partition_alloc_support.*=file://base/allocator/partition_allocator/OWNERS
 per-file sandbox_helper_win.cc=file://sandbox/win/OWNERS
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index 7e915c0a..829cf04 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -14,10 +14,6 @@
 #include <vector>
 
 #include "base/allocator/allocator_check.h"
-#include "base/allocator/allocator_extension.h"
-#include "base/allocator/allocator_shim.h"
-#include "base/allocator/buildflags.h"
-#include "base/allocator/partition_allocator/partition_alloc_features.h"
 #include "base/at_exit.h"
 #include "base/base_switches.h"
 #include "base/bind.h"
@@ -25,7 +21,6 @@
 #include "base/debug/debugger.h"
 #include "base/debug/leak_annotations.h"
 #include "base/debug/stack_trace.h"
-#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/i18n/icu_util.h"
 #include "base/lazy_instance.h"
@@ -33,7 +28,6 @@
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_base.h"
-#include "base/partition_alloc_buildflags.h"
 #include "base/path_service.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/power_monitor/power_monitor_device_source.h"
@@ -54,6 +48,7 @@
 #include "components/download/public/common/download_task_runner.h"
 #include "content/app/mojo/mojo_init.h"
 #include "content/app/mojo_ipc_support.h"
+#include "content/app/partition_alloc_support.h"
 #include "content/browser/browser_main.h"
 #include "content/browser/browser_process_sub_thread.h"
 #include "content/browser/browser_thread_impl.h"
@@ -174,11 +169,6 @@
 #include "content/common/android/cpu_affinity.h"
 #endif
 
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-#include "base/allocator/partition_allocator/extended_api.h"
-#include "base/allocator/partition_allocator/thread_cache.h"
-#endif
-
 namespace content {
 extern int GpuMain(const content::MainFunctionParams&);
 #if BUILDFLAG(ENABLE_PLUGINS)
@@ -243,41 +233,6 @@
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 }
 
-void EnablePCScanForMallocPartitionsIfNeeded() {
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN
-  CHECK(base::FeatureList::GetInstance());
-  if (base::FeatureList::IsEnabled(base::features::kPartitionAllocPCScan)) {
-    base::allocator::EnablePCScan();
-  }
-#endif
-}
-
-void EnablePCScanForMallocPartitionsInBrowserProcessIfNeeded() {
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN
-  CHECK(base::FeatureList::GetInstance());
-  if (base::FeatureList::IsEnabled(
-          base::features::kPartitionAllocPCScanBrowserOnly)) {
-    base::allocator::EnablePCScan();
-  }
-#endif
-}
-
-// This function should be executed as early as possible once we can get the
-// command line arguments and determine whether the process needs BRP support.
-// Until that moment, all heap allocations end up in a slower temporary
-// partition with no thread cache and cause heap fragmentation.
-//
-// Furthermore, since the function has to allocate a new partition, it must
-// only run once.
-void ConfigurePartitionRefCountSupportIfNeeded(bool enable_ref_count) {
-// Note that ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL implies that
-// USE_BACKUP_REF_PTR is true.
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
-    BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
-  base::allocator::ConfigurePartitionRefCountSupport(enable_ref_count);
-#endif
-}
-
 #if BUILDFLAG(USE_ZYGOTE_HANDLE)
 pid_t LaunchZygoteHelper(base::CommandLine* cmd_line,
                          base::ScopedFD* control_fd) {
@@ -517,9 +472,9 @@
       *base::CommandLine::ForCurrentProcess();
   std::string process_type =
       command_line.GetSwitchValueASCII(switches::kProcessType);
-  // Must run as early as possible. See the definition comment.
-  ConfigurePartitionRefCountSupportIfNeeded(process_type !=
-                                            switches::kRendererProcess);
+
+  internal::ReconfigurePartitionAllocAfterZygoteFork(process_type);
+
   ContentClientInitializer::Set(process_type, delegate);
 
   MainFunctionParams main_params(command_line);
@@ -527,11 +482,10 @@
 
   InitializeFieldTrialAndFeatureList();
   delegate->PostFieldTrialInitialization();
-  mojo::core::InitFeatures();
 
-  // After feature list has been initialized, enable pcscan on malloc
-  // partitions.
-  EnablePCScanForMallocPartitionsIfNeeded();
+  internal::ReconfigurePartitionAllocAfterFeatureListInit(process_type);
+
+  mojo::core::InitFeatures();
 
   for (size_t i = 0; i < base::size(kMainFunctions); ++i) {
     if (process_type == kMainFunctions[i].name)
@@ -557,7 +511,6 @@
   int exit_code = delegate->RunProcess("", main_function_params);
   if (exit_code >= 0)
     return exit_code;
-  EnablePCScanForMallocPartitionsInBrowserProcessIfNeeded();
   return BrowserMain(main_function_params);
 }
 
@@ -575,12 +528,6 @@
     {switches::kGpuProcess, GpuMain},
   };
 
-  if (process_type != switches::kZygoteProcess) {
-    // Must run as early as possible. See the definition comment.
-    ConfigurePartitionRefCountSupportIfNeeded(process_type !=
-                                              switches::kRendererProcess);
-  }
-
   for (size_t i = 0; i < base::size(kMainFunctions); ++i) {
     if (process_type == kMainFunctions[i].name) {
       int exit_code = delegate->RunProcess(process_type, main_function_params);
@@ -590,11 +537,6 @@
     }
   }
 
-  if (process_type != switches::kZygoteProcess) {
-    // Zygote processes are handled in RunZygote.
-    EnablePCScanForMallocPartitionsIfNeeded();
-  }
-
 #if BUILDFLAG(USE_ZYGOTE_HANDLE)
   // Zygote startup is special -- see RunZygote comments above
   // for why we don't use ZygoteMain directly.
@@ -742,9 +684,8 @@
   // overriding logic is working correctly. If not causes a hard crash, as its
   // unexpected absence has security implications.
   CHECK(base::allocator::IsAllocatorInitialized());
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
-  base::allocator::EnablePartitionAllocMemoryReclaimer();
-#endif
+
+  internal::ReconfigurePartitionAllocEarlyish(process_type);
 
 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
   if (!process_type.empty()) {
@@ -898,9 +839,8 @@
       InitializeFieldTrialAndFeatureList();
       delegate_->PostFieldTrialInitialization();
 
-      // After feature list has been initialized, enable pcscan on malloc
-      // partitions.
-      EnablePCScanForMallocPartitionsIfNeeded();
+      internal::ReconfigurePartitionAllocAfterFeatureListInit(process_type);
+
       mojo::core::InitFeatures();
     }
 
@@ -928,13 +868,6 @@
 
   RegisterMainThreadFactories();
 
-#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && defined(OS_ANDROID)
-  // The thread cache consumes more memory, especially as long as periodic purge
-  // above is disabled. Don't use one on low-memory devices.
-  if (base::SysInfo::IsLowEndDevice())
-    base::DisablePartitionAllocThreadCacheForProcess();
-#endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && defined(OS_ANDROID)
-
   if (process_type.empty())
     return RunBrowser(main_params, start_minimal_browser);
 
@@ -948,9 +881,6 @@
   if (is_browser_main_loop_started_)
     return -1;
 
-  // Must run as early as possible. See the definition comment.
-  ConfigurePartitionRefCountSupportIfNeeded(/* enable_ref_count = */ true);
-
   bool should_start_minimal_browser = start_minimal_browser;
   if (!mojo_ipc_support_) {
     if (delegate_->ShouldCreateFeatureList()) {
@@ -1049,8 +979,8 @@
 #endif
   }
 
-  // Enable PCScan once we are certain that FeatureList was initialized.
-  EnablePCScanForMallocPartitionsIfNeeded();
+  // No specified process type means this is the Browser process.
+  internal::ReconfigurePartitionAllocAfterFeatureListInit("");
 
   if (should_start_minimal_browser) {
     DVLOG(0) << "Chrome is running in minimal browser mode.";
diff --git a/content/app/partition_alloc_support.cc b/content/app/partition_alloc_support.cc
new file mode 100644
index 0000000..69ca4a61
--- /dev/null
+++ b/content/app/partition_alloc_support.cc
@@ -0,0 +1,111 @@
+// Copyright (c) 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 "content/app/partition_alloc_support.h"
+
+#include <string>
+
+#include "base/allocator/allocator_shim.h"
+#include "base/allocator/buildflags.h"
+#include "base/allocator/partition_allocator/extended_api.h"
+#include "base/allocator/partition_allocator/partition_alloc_features.h"
+#include "base/feature_list.h"
+#include "base/partition_alloc_buildflags.h"
+#include "build/build_config.h"
+#include "content/public/common/content_switches.h"
+
+#if defined(OS_ANDROID)
+#include "base/system/sys_info.h"
+#endif
+
+namespace content {
+namespace internal {
+
+namespace {
+
+void EnablePCScanForMallocPartitionsIfNeeded() {
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN
+  DCHECK(base::FeatureList::GetInstance());
+  if (base::FeatureList::IsEnabled(base::features::kPartitionAllocPCScan)) {
+    base::allocator::EnablePCScan();
+  }
+#endif
+}
+
+void EnablePCScanForMallocPartitionsInBrowserProcessIfNeeded() {
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN
+  DCHECK(base::FeatureList::GetInstance());
+  if (base::FeatureList::IsEnabled(
+          base::features::kPartitionAllocPCScanBrowserOnly)) {
+    base::allocator::EnablePCScan();
+  }
+#endif
+}
+
+// This function should be executed as early as possible once we can get the
+// command line arguments and determine whether the process needs BRP support.
+// Until that moment, all heap allocations end up in a slower temporary
+// partition with no thread cache and cause heap fragmentation.
+//
+// Furthermore, since the function has to allocate a new partition, it must
+// only run once.
+void ConfigurePartitionRefCountSupportIfNeeded(bool enable_ref_count) {
+// Note that ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL implies that
+// USE_BACKUP_REF_PTR is true.
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
+    BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
+  base::allocator::ConfigurePartitionRefCountSupport(enable_ref_count);
+#endif
+}
+
+void ReconfigurePartitionForKnownProcess(const std::string& process_type) {
+  DCHECK_NE(process_type, switches::kZygoteProcess);
+
+  // No specified process type means this is the Browser process.
+  ConfigurePartitionRefCountSupportIfNeeded(process_type.empty());
+}
+
+}  // namespace
+
+void ReconfigurePartitionAllocEarlyish(const std::string& process_type) {
+  if (process_type != switches::kZygoteProcess) {
+    ReconfigurePartitionForKnownProcess(process_type);
+  }
+
+  // These initializations are only relevant for PartitionAlloc-Everywhere
+  // builds.
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+
+  base::allocator::EnablePartitionAllocMemoryReclaimer();
+
+#if defined(OS_ANDROID)
+  // The thread cache consumes more memory, especially as long as periodic purge
+  // above is disabled. Don't use one on low-memory devices.
+  if (base::SysInfo::IsLowEndDevice()) {
+    base::DisablePartitionAllocThreadCacheForProcess();
+  }
+#endif  // defined(OS_ANDROID)
+
+#endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+}
+
+void ReconfigurePartitionAllocAfterZygoteFork(const std::string& process_type) {
+  ReconfigurePartitionForKnownProcess(process_type);
+}
+
+void ReconfigurePartitionAllocAfterFeatureListInit(
+    const std::string& process_type) {
+  DCHECK_NE(process_type, switches::kZygoteProcess);
+  // TODO(bartekn): Switch to DCHECK once confirmed there are no issues.
+  CHECK(base::FeatureList::GetInstance());
+
+  EnablePCScanForMallocPartitionsIfNeeded();
+  // No specified process type means this is the Browser process.
+  if (process_type.empty()) {
+    EnablePCScanForMallocPartitionsInBrowserProcessIfNeeded();
+  }
+}
+
+}  // namespace internal
+}  // namespace content
\ No newline at end of file
diff --git a/content/app/partition_alloc_support.h b/content/app/partition_alloc_support.h
new file mode 100644
index 0000000..44f37dc
--- /dev/null
+++ b/content/app/partition_alloc_support.h
@@ -0,0 +1,34 @@
+// Copyright (c) 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 CONTENT_APP_PARTITION_ALLOC_SUPPORT_H_
+#define CONTENT_APP_PARTITION_ALLOC_SUPPORT_H_
+
+#include <string>
+
+namespace content {
+namespace internal {
+
+// ReconfigurePartitionAlloc* functions re-configure PartitionAlloc. It is
+// impossible to configure PartitionAlloc before/at its initialization using
+// information not known at compile-time (e.g. process type, Finch), because by
+// the time this information is available memory allocations would have surely
+// happened, that requiring a functioning allocator.
+//
+// *Earlyish() is called as early as it is reasonably possible.
+// *AfterZygoteFork() is its complement to finish configuring process-specific
+// stuff that had to be postponed due to *Earlyish() being called with
+// |process_type==kZygoteProcess|.
+// *AfterFeatureListInit() is called in addition to the above, once
+// FeatureList has been initialized and ready to use. It is guaranteed to be
+// called on non-zygote processes or after the zygote has been forked.
+void ReconfigurePartitionAllocEarlyish(const std::string& process_type);
+void ReconfigurePartitionAllocAfterZygoteFork(const std::string& process_type);
+void ReconfigurePartitionAllocAfterFeatureListInit(
+    const std::string& process_type);
+
+}  // namespace internal
+}  // namespace content
+
+#endif  // CONTENT_APP_PARTITION_ALLOC_SUPPORT_H_
\ No newline at end of file
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 88a9a54..7000d441 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -2069,7 +2069,6 @@
       "accessibility/accessibility_tree_formatter_utils_win.cc",
       "accessibility/accessibility_tree_formatter_utils_win.h",
       "accessibility/accessibility_tree_formatter_win.cc",
-      "accessibility/accessibility_tree_formatter_win.h",
       "accessibility/browser_accessibility_com_win.cc",
       "accessibility/browser_accessibility_com_win.h",
       "accessibility/browser_accessibility_manager_win.cc",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.cc b/content/browser/accessibility/accessibility_tree_formatter_win.cc
index 4229c81..18c9f7e 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_win.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_win.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/accessibility/accessibility_tree_formatter_win.h"
+#include "ui/accessibility/platform/inspect/ax_tree_formatter_base.h"
 
 #include <math.h>
+#include <oleacc.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <wrl/client.h>
 
 #include <iostream>
 #include <string>
@@ -19,6 +21,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
+#include "base/win/com_init_util.h"
 #include "base/win/scoped_bstr.h"
 #include "base/win/scoped_variant.h"
 #include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
@@ -33,6 +36,82 @@
 
 namespace content {
 
+class AccessibilityTreeFormatterWin : public ui::AXTreeFormatterBase {
+ public:
+  AccessibilityTreeFormatterWin();
+  ~AccessibilityTreeFormatterWin() override;
+
+  base::Value BuildTree(ui::AXPlatformNodeDelegate* start) const override;
+  base::Value BuildTreeForWindow(gfx::AcceleratedWidget hwnd) const override;
+  base::Value BuildTreeForSelector(
+      const AXTreeSelector& selector) const override;
+
+ protected:
+  void AddDefaultFilters(
+      std::vector<AXPropertyFilter>* property_filters) override;
+
+ private:
+  void RecursiveBuildTree(const Microsoft::WRL::ComPtr<IAccessible> node,
+                          base::DictionaryValue* dict,
+                          LONG root_x,
+                          LONG root_y) const;
+
+  void AddProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                     base::DictionaryValue* dict,
+                     LONG root_x,
+                     LONG root_y) const;
+  void AddMSAAProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                         base::DictionaryValue* dict,
+                         LONG root_x,
+                         LONG root_y) const;
+  void AddSimpleDOMNodeProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                                  base::DictionaryValue* dict) const;
+  bool AddIA2Properties(const Microsoft::WRL::ComPtr<IAccessible>,
+                        base::DictionaryValue* dict) const;
+  void AddIA2ActionProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                              base::DictionaryValue* dict) const;
+  void AddIA2HypertextProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                                 base::DictionaryValue* dict) const;
+  void AddIA2TextProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                            base::DictionaryValue* dict) const;
+  void AddIA2TableProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                             base::DictionaryValue* dict) const;
+  void AddIA2TableCellProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                                 base::DictionaryValue* dict) const;
+  void AddIA2ValueProperties(const Microsoft::WRL::ComPtr<IAccessible>,
+                             base::DictionaryValue* dict) const;
+  std::string ProcessTreeForOutput(
+      const base::DictionaryValue& node) const override;
+};
+
+// TODO(crbug.com/1133330): move implementation into
+// content/public/ax_inspect_factory.cc when AccessibilityTreeFormatterWin is
+// relocated under ui/accessibility/platform
+
+// static
+std::unique_ptr<ui::AXTreeFormatter>
+AXInspectFactory::CreatePlatformFormatter() {
+  return CreateFormatter(kWinIA2);
+}
+
+// static
+std::unique_ptr<ui::AXTreeFormatter> AXInspectFactory::CreateFormatter(
+    AXInspectFactory::Type type) {
+  switch (type) {
+    case kBlink:
+      return std::make_unique<AccessibilityTreeFormatterBlink>();
+    case kWinIA2:
+      base::win::AssertComInitialized();
+      return std::make_unique<AccessibilityTreeFormatterWin>();
+    case kWinUIA:
+      base::win::AssertComInitialized();
+      return std::make_unique<AccessibilityTreeFormatterUia>();
+    default:
+      NOTREACHED() << "Unsupported formatter type " << type;
+  }
+  return nullptr;
+}
+
 void AccessibilityTreeFormatterWin::AddDefaultFilters(
     std::vector<AXPropertyFilter>* property_filters) {
   // Too noisy: HOTTRACKED, LINKED, SELECTABLE, IA2_STATE_EDITABLE,
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.h b/content/browser/accessibility/accessibility_tree_formatter_win.h
deleted file mode 100644
index 4f5bdcba..0000000
--- a/content/browser/accessibility/accessibility_tree_formatter_win.h
+++ /dev/null
@@ -1,67 +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 CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_WIN_H_
-#define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_WIN_H_
-
-#include <oleacc.h>
-#include <wrl/client.h>
-
-#include "content/common/content_export.h"
-#include "ui/accessibility/platform/inspect/ax_tree_formatter_base.h"
-
-namespace content {
-
-class CONTENT_EXPORT AccessibilityTreeFormatterWin
-    : public ui::AXTreeFormatterBase {
- public:
-  AccessibilityTreeFormatterWin();
-  ~AccessibilityTreeFormatterWin() override;
-
-  base::Value BuildTree(ui::AXPlatformNodeDelegate* start) const override;
-  base::Value BuildTreeForWindow(gfx::AcceleratedWidget hwnd) const override;
-  base::Value BuildTreeForSelector(
-      const AXTreeSelector& selector) const override;
-
- protected:
-  void AddDefaultFilters(
-      std::vector<AXPropertyFilter>* property_filters) override;
-
- private:
-  void RecursiveBuildTree(const Microsoft::WRL::ComPtr<IAccessible> node,
-                          base::DictionaryValue* dict,
-                          LONG root_x,
-                          LONG root_y) const;
-
-  void AddProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                     base::DictionaryValue* dict,
-                     LONG root_x,
-                     LONG root_y) const;
-  void AddMSAAProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                         base::DictionaryValue* dict,
-                         LONG root_x,
-                         LONG root_y) const;
-  void AddSimpleDOMNodeProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                                  base::DictionaryValue* dict) const;
-  bool AddIA2Properties(const Microsoft::WRL::ComPtr<IAccessible>,
-                        base::DictionaryValue* dict) const;
-  void AddIA2ActionProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                              base::DictionaryValue* dict) const;
-  void AddIA2HypertextProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                                 base::DictionaryValue* dict) const;
-  void AddIA2TextProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                            base::DictionaryValue* dict) const;
-  void AddIA2TableProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                             base::DictionaryValue* dict) const;
-  void AddIA2TableCellProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                                 base::DictionaryValue* dict) const;
-  void AddIA2ValueProperties(const Microsoft::WRL::ComPtr<IAccessible>,
-                             base::DictionaryValue* dict) const;
-  std::string ProcessTreeForOutput(
-      const base::DictionaryValue& node) const override;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_WIN_H_
diff --git a/content/browser/android/content_feature_list.cc b/content/browser/android/content_feature_list.cc
index a687918..2114129 100644
--- a/content/browser/android/content_feature_list.cc
+++ b/content/browser/android/content_feature_list.cc
@@ -22,6 +22,7 @@
 // in other locations in the code base (e.g. content_features.h).
 const base::Feature* kFeaturesExposedToJava[] = {
     &features::kBackgroundMediaRendererHasModerateBinding,
+    &features::kBindingManagementWaiveCpu,
     &features::kExperimentalAccessibilityLabels,
     &features::kWebBluetoothNewPermissionsBackend,
     &features::kWebNfc,
diff --git a/content/browser/font_access/font_access_manager_impl_browsertest.cc b/content/browser/font_access/font_access_manager_impl_browsertest.cc
index 8feca69..484cd2c 100644
--- a/content/browser/font_access/font_access_manager_impl_browsertest.cc
+++ b/content/browser/font_access/font_access_manager_impl_browsertest.cc
@@ -107,7 +107,7 @@
                       "  return count;"
                       "})()")
                    .ExtractInt();
-  ASSERT_GT(result, 0) << "Expected at least one font. Got: " << result;
+  EXPECT_GT(result, 0) << "Expected at least one font. Got: " << result;
 }
 
 #if defined(OS_WIN)
@@ -133,8 +133,7 @@
              "})()")
           .ExtractString();
   std::string ms_yahei_utf8 = "微软雅黑";
-  ASSERT_EQ(result, ms_yahei_utf8)
-      << "Expected:" << ms_yahei_utf8 << " Got:" << result;
+  EXPECT_EQ(result, ms_yahei_utf8);
 }
 
 IN_PROC_BROWSER_TEST_F(FontAccessManagerImplBrowserTest,
diff --git a/content/browser/font_access/font_enumeration_cache_fontconfig.cc b/content/browser/font_access/font_enumeration_cache_fontconfig.cc
index ca91b4c..3af4c88 100644
--- a/content/browser/font_access/font_enumeration_cache_fontconfig.cc
+++ b/content/browser/font_access/font_enumeration_cache_fontconfig.cc
@@ -88,7 +88,8 @@
   auto font_enumeration_table = std::make_unique<blink::FontEnumerationTable>();
 
   std::unique_ptr<FcObjectSet, decltype(&FcObjectSetDestroy)> object_set(
-      FcObjectSetBuild(FC_POSTSCRIPT_NAME, FC_FULLNAME, FC_FAMILY, nullptr),
+      FcObjectSetBuild(FC_POSTSCRIPT_NAME, FC_FULLNAME, FC_FAMILY, FC_STYLE,
+                       nullptr),
       FcObjectSetDestroy);
 
   std::unique_ptr<FcFontSet, decltype(&FcFontSetDestroy)> fontset(
@@ -105,6 +106,7 @@
     char* postscript_name;
     char* full_name;
     char* family;
+    char* style;
     if (FcPatternGetString(fontset->fonts[i], FC_POSTSCRIPT_NAME, 0,
                            reinterpret_cast<FcChar8**>(&postscript_name)) !=
             FcResultMatch ||
@@ -113,6 +115,9 @@
             FcResultMatch ||
         FcPatternGetString(fontset->fonts[i], FC_FAMILY, 0,
                            reinterpret_cast<FcChar8**>(&family)) !=
+            FcResultMatch ||
+        FcPatternGetString(fontset->fonts[i], FC_STYLE, 0,
+                           reinterpret_cast<FcChar8**>(&style)) !=
             FcResultMatch) {
       // Skip incomplete or malformed fonts.
       ++incomplete_count;
@@ -131,6 +136,7 @@
     metadata.set_postscript_name(postscript_name);
     metadata.set_full_name(full_name);
     metadata.set_family(family);
+    metadata.set_style(style);
 
     blink::FontEnumerationTable_FontMetadata* added_font_meta =
         font_enumeration_table->add_fonts();
diff --git a/content/browser/font_access/font_enumeration_cache_mac.mm b/content/browser/font_access/font_enumeration_cache_mac.mm
index ffc2355..534bdf6 100644
--- a/content/browser/font_access/font_enumeration_cache_mac.mm
+++ b/content/browser/font_access/font_enumeration_cache_mac.mm
@@ -94,6 +94,8 @@
           GetLocalizedString(fd, kCTFontDisplayNameAttribute);
       base::ScopedCFTypeRef<CFStringRef> cf_family =
           GetString(fd, kCTFontFamilyNameAttribute);
+      base::ScopedCFTypeRef<CFStringRef> cf_style =
+          GetString(fd, kCTFontStyleNameAttribute);
 
       std::string postscript_name =
           base::SysCFStringRefToUTF8(cf_postscript_name.get());
@@ -110,6 +112,7 @@
       metadata.set_full_name(
           base::SysCFStringRefToUTF8(cf_full_name.get()).c_str());
       metadata.set_family(base::SysCFStringRefToUTF8(cf_family.get()).c_str());
+      metadata.set_style(base::SysCFStringRefToUTF8(cf_style.get()).c_str());
 
       blink::FontEnumerationTable_FontMetadata* added_font_meta =
           font_enumeration_table->add_fonts();
diff --git a/content/browser/font_access/font_enumeration_cache_win.cc b/content/browser/font_access/font_enumeration_cache_win.cc
index 3b77144..700bf7c 100644
--- a/content/browser/font_access/font_enumeration_cache_win.cc
+++ b/content/browser/font_access/font_enumeration_cache_win.cc
@@ -102,6 +102,7 @@
 
     Microsoft::WRL::ComPtr<IDWriteLocalizedStrings> postscript_name;
     Microsoft::WRL::ComPtr<IDWriteLocalizedStrings> full_name;
+    Microsoft::WRL::ComPtr<IDWriteLocalizedStrings> style;
 
     // DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME and
     // DWRITE_INFORMATIONAL_STRING_FULL_NAME are only supported on Windows 7
@@ -110,6 +111,7 @@
     // in Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=947812 However,
     // this might not be worth the effort.
 
+    // Extracting the postscript name.
     {
       base::ScopedBlockingCall scoped_blocking_call(
           FROM_HERE, base::BlockingType::MAY_BLOCK);
@@ -133,6 +135,7 @@
       return family_result;
     }
 
+    // Extracting the full name.
     {
       base::ScopedBlockingCall scoped_blocking_call(
           FROM_HERE, base::BlockingType::MAY_BLOCK);
@@ -155,10 +158,40 @@
     if (!localized_full_name)
       localized_full_name = native_postscript_name;
 
+    // Extracting Style.
+    {
+      base::ScopedBlockingCall scoped_blocking_call(
+          FROM_HERE, base::BlockingType::MAY_BLOCK);
+      hr = font->GetInformationalStrings(
+          DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES, &style,
+          &exists);
+    }
+    if (FAILED(hr)) {
+      family_result->exit_hresult = hr;
+      return family_result;
+    }
+    if (!exists) {
+      {
+        base::ScopedBlockingCall scoped_blocking_call(
+            FROM_HERE, base::BlockingType::MAY_BLOCK);
+        hr = font->GetInformationalStrings(
+            DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES, &style, &exists);
+      }
+      if (FAILED(hr)) {
+        family_result->exit_hresult = hr;
+        return family_result;
+      }
+    }
+    base::Optional<std::string> native_style_name;
+    if (exists) {
+      native_style_name = GetNativeString(style);
+    }
+
     blink::FontEnumerationTable_FontMetadata metadata;
     metadata.set_postscript_name(native_postscript_name.value());
     metadata.set_full_name(localized_full_name.value());
     metadata.set_family(native_family_name.value());
+    metadata.set_style(native_style_name ? native_style_name.value() : "");
 
     family_result->fonts.push_back(std::move(metadata));
   }
diff --git a/content/browser/form_controls_browsertest.cc b/content/browser/form_controls_browsertest.cc
index 935e5f0..139384e 100644
--- a/content/browser/form_controls_browsertest.cc
+++ b/content/browser/form_controls_browsertest.cc
@@ -108,7 +108,7 @@
     // - Slight differences in radio and checkbox rendering in 10.15
     cc::FuzzyPixelComparator comparator(
         /* discard_alpha */ true,
-        /* error_pixels_percentage_limit */ 9.f,
+        /* error_pixels_percentage_limit */ 11.f,
         /* small_error_pixels_percentage_limit */ 0.f,
         /* avg_abs_error_limit */ 20.f,
         /* max_abs_error_limit */ 79.f,
@@ -165,7 +165,7 @@
           /* screenshot_height */ 40);
 }
 
-// TODO(iopopesc): Re-enable test when there is a resolution for
+// TODO(crbug.com/1165919): Re-enable test when there is a resolution for
 // android-bfcache-rel builder producing different results.
 #if defined(OS_ANDROID) || defined(OS_MAC)
 #define MAYBE_DarkModeTextSelection DISABLED_DarkModeTextSelection
@@ -175,6 +175,7 @@
 IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_DarkModeTextSelection) {
   RunTest("form_controls_browsertest_dark_mode_text_selection",
           "<meta name=\"color-scheme\" content=\"dark\">"
+          "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
           "<div id=\"target\">This is some basic text that we are going to "
           "select.</div>"
           "<script>"
@@ -188,6 +189,35 @@
           /* screenshot_height */ 40);
 }
 
+// TODO(crbug.com/1165919) skip this test until there is a resolution for
+// android-bfcache-rel builder producing different results.
+#if defined(OS_ANDROID)
+#define MAYBE_Input DISABLED_Input
+#else
+#define MAYBE_Input Input
+#endif
+IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_Input) {
+  RunTest("form_controls_browsertest_input",
+          "<!-- text inputs -->"
+          "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
+          "<style>body {margin: 8px} input {width: 150px; "
+          "margin-bottom: 18px}</style>"
+          "<input type=\"text\" /><br>"
+          "<input type=\"number\" /><br>"
+          "<input type=\"search\" /><br>"
+          "<input type=\"email\" /><br>"
+          "<input type=\"password\" /><br>"
+          "<!-- border -->"
+          "<input type=\"text\" style=\"border: 3px solid lime;\"/><br>"
+          "<!-- shadow -->"
+          "<input type=\"text\" style=\"box-shadow: 4px 4px 10px "
+          "rgba(255,0,0,0.5), inset 4px 4px 4px rgba(0,255,0,0.5);\"/><br>"
+          "<!-- disabled -->"
+          "<input type=\"text\" disabled/>",
+          /* screenshot_width */ 200,
+          /* screenshot_height */ 330);
+}
+
 // TODO(jarhar): Add tests for other elements from
 //   https://concrete-hardboard.glitch.me
 
diff --git a/content/browser/media/media_devices_util.cc b/content/browser/media/media_devices_util.cc
index 48c4be6..24041cb 100644
--- a/content/browser/media/media_devices_util.cc
+++ b/content/browser/media/media_devices_util.cc
@@ -100,10 +100,20 @@
 
 MediaDeviceSaltAndOrigin::MediaDeviceSaltAndOrigin(std::string device_id_salt,
                                                    std::string group_id_salt,
-                                                   url::Origin origin)
+                                                   url::Origin origin,
+                                                   GURL url)
     : device_id_salt(std::move(device_id_salt)),
       group_id_salt(std::move(group_id_salt)),
-      origin(std::move(origin)) {}
+      origin(std::move(origin)),
+      url(std::move(url)) {}
+
+MediaDeviceSaltAndOrigin::MediaDeviceSaltAndOrigin(
+    const MediaDeviceSaltAndOrigin&) = default;
+
+MediaDeviceSaltAndOrigin& MediaDeviceSaltAndOrigin::operator=(
+    const MediaDeviceSaltAndOrigin&) = default;
+
+MediaDeviceSaltAndOrigin::~MediaDeviceSaltAndOrigin() = default;
 
 void GetDefaultMediaDeviceID(
     MediaDeviceType device_type,
@@ -175,7 +185,7 @@
   group_id_salt += frame_salt + "groupid";
 
   return {std::move(device_id_salt), std::move(group_id_salt),
-          std::move(origin)};
+          std::move(origin), std::move(url)};
 }
 
 blink::WebMediaDeviceInfo TranslateMediaDeviceInfo(
diff --git a/content/browser/media/media_devices_util.h b/content/browser/media/media_devices_util.h
index 613080b..9c5c6c0e 100644
--- a/content/browser/media/media_devices_util.h
+++ b/content/browser/media/media_devices_util.h
@@ -11,6 +11,7 @@
 #include "base/callback.h"
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/mediastream/media_devices.h"
+#include "url/gurl.h"
 #include "url/origin.h"
 
 using blink::mojom::MediaDeviceType;
@@ -27,13 +28,19 @@
 
 struct CONTENT_EXPORT MediaDeviceSaltAndOrigin {
   MediaDeviceSaltAndOrigin();
+  MediaDeviceSaltAndOrigin(const MediaDeviceSaltAndOrigin&);
+  MediaDeviceSaltAndOrigin& operator=(const MediaDeviceSaltAndOrigin&);
   MediaDeviceSaltAndOrigin(std::string device_id_salt,
                            std::string group_id_salt,
-                           url::Origin origin);
+                           url::Origin origin,
+                           GURL url);
+  ~MediaDeviceSaltAndOrigin();
 
   std::string device_id_salt;
   std::string group_id_salt;
   url::Origin origin;
+  // TODO(https://crbug.com/1140187): temporary while tracking down bug.
+  GURL url;
 };
 
 // Returns the current media device ID salt and security origin for the given
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc
index 7d03411f..08a1eed 100644
--- a/content/browser/prerender/prerender_host.cc
+++ b/content/browser/prerender/prerender_host.cc
@@ -6,6 +6,8 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/trace_event/common/trace_event_common.h"
+#include "base/trace_event/trace_conversion_helper.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_delegate.h"
@@ -30,6 +32,8 @@
 // no-state-prefetch implementation. See PrerenderContents::StartPrerendering()
 // for example.
 void PrerenderHost::StartPrerendering(BrowserContext& browser_context) {
+  TRACE_EVENT1("navigation", "PrerenderHost::StartPrerendering",
+               "browser_context", &browser_context);
   // Create a new WebContents for prerendering.
   WebContents::CreateParams web_contents_params(&browser_context);
   // TODO(https://crbug.com/1132746): Set up other fields of
@@ -60,6 +64,9 @@
 
 bool PrerenderHost::ActivatePrerenderedContents(
     RenderFrameHostImpl& current_render_frame_host) {
+  TRACE_EVENT1("navigation", "PrerenderHost::ActivatePrerenderedContents",
+               "render_frame_host",
+               base::trace_event::ToTracedValue(&current_render_frame_host));
   DCHECK_EQ(blink::features::kPrerender2Param.Get(),
             blink::features::Prerender2ActivationMode::kEnabled);
 
diff --git a/content/browser/prerender/prerender_host_registry.cc b/content/browser/prerender/prerender_host_registry.cc
index 314c005..6ebb3377 100644
--- a/content/browser/prerender/prerender_host_registry.cc
+++ b/content/browser/prerender/prerender_host_registry.cc
@@ -7,6 +7,8 @@
 #include "base/check.h"
 #include "base/feature_list.h"
 #include "base/stl_util.h"
+#include "base/trace_event/common/trace_event_common.h"
+#include "base/trace_event/trace_conversion_helper.h"
 #include "content/browser/prerender/prerender_host.h"
 #include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -28,6 +30,11 @@
 
   // Ignore prerendering requests for the same URL.
   const GURL prerendering_url = attributes->url;
+  TRACE_EVENT2("navigation", "PrerenderHostRegistry::CreateAndStartHost",
+               "Prerender Attributes",
+               base::trace_event::ToTracedValue(*attributes),
+               "initiator_origin", initiator_origin.GetURL().spec());
+
   auto found = prerender_host_id_by_url_.find(prerendering_url);
   if (found != prerender_host_id_by_url_.end())
     return found->second;
@@ -59,6 +66,8 @@
 }
 
 void PrerenderHostRegistry::AbandonHost(int64_t prerender_host_id) {
+  TRACE_EVENT1("navigation", "PrerenderHostRegistry::AbandonHost",
+               "prerender_host_id", prerender_host_id);
   auto found = prerender_host_by_id_.find(prerender_host_id);
   if (found != prerender_host_by_id_.end()) {
     auto initial_url = found->second->GetInitialUrl();
@@ -71,6 +80,9 @@
     const GURL& navigation_url,
     FrameTreeNode& frame_tree_node) {
   RenderFrameHostImpl* render_frame_host = frame_tree_node.current_frame_host();
+  TRACE_EVENT2("navigation", "PrerenderHostRegistry::FindHostToActivate",
+               "navigation_url", navigation_url.spec(), "render_frame_host",
+               base::trace_event::ToTracedValue(render_frame_host));
 
   // Disallow activation when the navigation is for prerendering.
   if (render_frame_host->IsPrerendering())
diff --git a/content/browser/prerender/prerender_processor.cc b/content/browser/prerender/prerender_processor.cc
index 0ef60e1..60ea40ef 100644
--- a/content/browser/prerender/prerender_processor.cc
+++ b/content/browser/prerender/prerender_processor.cc
@@ -69,6 +69,7 @@
 }
 
 void PrerenderProcessor::CancelPrerendering() {
+  TRACE_EVENT0("navigation", "PrerenderProcessor::CancelPrerendering");
   DCHECK_EQ(state_, State::kStarted);
   state_ = State::kCancelled;
   GetPrerenderHostRegistry().AbandonHost(prerender_host_id_);
diff --git a/content/browser/renderer_host/cors_rfc1918_browsertest.cc b/content/browser/renderer_host/cors_rfc1918_browsertest.cc
index 32dc969..6030842 100644
--- a/content/browser/renderer_host/cors_rfc1918_browsertest.cc
+++ b/content/browser/renderer_host/cors_rfc1918_browsertest.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include <memory>
+#include <set>
 #include <string>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/strings/string_piece.h"
@@ -27,6 +29,7 @@
 #include "services/network/public/mojom/url_loader.mojom.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "url/gurl.h"
+#include "url/origin.h"
 
 namespace content {
 namespace {
@@ -170,18 +173,19 @@
 
   ~PolicyTestContentBrowserClient() override = default;
 
-  void SetAllowInsecurePrivateNetworkRequests(bool value) {
-    allow_insecure_private_network_requests_ = value;
+  // Adds an origin to the allowlist.
+  void SetAllowInsecurePrivateNetworkRequestsFrom(const url::Origin& origin) {
+    allowlisted_origins_.insert(origin);
   }
 
   bool ShouldAllowInsecurePrivateNetworkRequests(
       content::BrowserContext* browser_context,
-      const GURL& url) override {
-    return allow_insecure_private_network_requests_;
+      const url::Origin& origin) override {
+    return allowlisted_origins_.find(origin) != allowlisted_origins_.end();
   }
 
  private:
-  bool allow_insecure_private_network_requests_ = false;
+  std::set<url::Origin> allowlisted_origins_;
 };
 
 // RAII wrapper for |SetContentBrowserClientForTesting()|.
@@ -228,12 +232,9 @@
 
  protected:
   // Allows subclasses to construct instances with different features enabled.
-  explicit CorsRfc1918BrowserTestBase(const base::Feature* feature) {
-    if (feature) {
-      feature_list_.InitAndEnableFeature(*feature);
-    } else {
-      feature_list_.Init();
-    }
+  explicit CorsRfc1918BrowserTestBase(
+      const std::vector<base::Feature>& enabled_features) {
+    feature_list_.InitWithFeatures(enabled_features, {});
 
     StartServer();
   }
@@ -253,25 +254,36 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-// Test with insecure private network requests blocked.
+// Test with insecure private network requests blocked, excluding navigations.
 class CorsRfc1918BrowserTest : public CorsRfc1918BrowserTestBase {
  public:
   CorsRfc1918BrowserTest()
       : CorsRfc1918BrowserTestBase(
-            &features::kBlockInsecurePrivateNetworkRequests) {}
+            {features::kBlockInsecurePrivateNetworkRequests}) {}
+};
+
+// Test with insecure private network requests blocked, including navigations.
+class CorsRfc1918BrowserTestBlockNavigations
+    : public CorsRfc1918BrowserTestBase {
+ public:
+  CorsRfc1918BrowserTestBlockNavigations()
+      : CorsRfc1918BrowserTestBase({
+            features::kBlockInsecurePrivateNetworkRequests,
+            features::kBlockInsecurePrivateNetworkRequestsForNavigations,
+        }) {}
 };
 
 // Test with insecure private network requests allowed.
 class CorsRfc1918BrowserTestNoBlocking : public CorsRfc1918BrowserTestBase {
  public:
-  CorsRfc1918BrowserTestNoBlocking() : CorsRfc1918BrowserTestBase(nullptr) {}
+  CorsRfc1918BrowserTestNoBlocking() : CorsRfc1918BrowserTestBase({}) {}
 };
 
 // This test verifies that when the right feature is enabled, iframe requests:
 //  - from an insecure page with the "treat-as-public-address" CSP directive
 //  - to a local IP address
 // are blocked.
-IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTest,
+IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTestBlockNavigations,
                        IframeFromInsecureTreatAsPublicToLocalIsBlocked) {
   EXPECT_TRUE(NavigateToURL(
       shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
@@ -304,6 +316,35 @@
   EXPECT_TRUE(child_frame->GetLastCommittedOrigin().opaque());
 }
 
+// This test mimics the one above, only it is executed without enabling the
+// BlockInsecurePrivateNetworkRequestsForNavigations feature. It asserts that
+// the navigation is not blocked in this case.
+IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTest,
+                       IframeFromInsecureTreatAsPublicToLocalIsNotBlocked) {
+  EXPECT_TRUE(NavigateToURL(
+      shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
+
+  GURL url = InsecureURL(*embedded_test_server(), "/empty.html");
+
+  TestNavigationManager child_navigation_manager(shell()->web_contents(), url);
+
+  EXPECT_TRUE(ExecJs(root_frame_host(), R"(
+    const iframe = document.createElement("iframe");
+    iframe.src = "/empty.html";
+    document.body.appendChild(iframe);
+  )"));
+
+  child_navigation_manager.WaitForNavigationFinished();
+
+  // Check that the child iframe navigated successfully.
+  EXPECT_TRUE(child_navigation_manager.was_successful());
+
+  ASSERT_EQ(1ul, root_frame_host()->child_count());
+  RenderFrameHostImpl* child_frame =
+      root_frame_host()->child_at(0)->current_frame_host();
+  EXPECT_EQ(url, EvalJs(child_frame, "document.location.href"));
+}
+
 // Similar to IframeFromInsecureTreatAsPublicToLocalIsBlocked, but in
 // report-only mode. As a result "treat-as-public-address" must be ignored.
 IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTest,
@@ -339,7 +380,7 @@
 // TODO(https://crbug.com/1129326): Revisit this when main-frame navigations are
 // subject to CORS-RFC1918 checks.
 IN_PROC_BROWSER_TEST_F(
-    CorsRfc1918BrowserTest,
+    CorsRfc1918BrowserTestBlockNavigations,
     FormSubmissionFromInsecurePublictoLocalIsNotBlockedInMainFrame) {
   EXPECT_TRUE(NavigateToURL(
       shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
@@ -368,7 +409,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(
-    CorsRfc1918BrowserTest,
+    CorsRfc1918BrowserTestBlockNavigations,
     FormSubmissionFromInsecurePublictoLocalIsBlockedInChildFrame) {
   EXPECT_TRUE(NavigateToURL(
       shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
@@ -410,7 +451,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(
-    CorsRfc1918BrowserTest,
+    CorsRfc1918BrowserTestBlockNavigations,
     FormSubmissionGetFromInsecurePublictoLocalIsBlockedInChildFrame) {
   EXPECT_TRUE(NavigateToURL(
       shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
@@ -2096,15 +2137,16 @@
 IN_PROC_BROWSER_TEST_F(
     CorsRfc1918BrowserTest,
     FromInsecureTreatAsPublicToLocalWithPolicySetToAllowIsNotBlocked) {
+  GURL url = InsecureTreatAsPublicAddressURL(*embedded_test_server());
+
   PolicyTestContentBrowserClient client;
-  client.SetAllowInsecurePrivateNetworkRequests(true);
+  client.SetAllowInsecurePrivateNetworkRequestsFrom(url::Origin::Create(url));
 
   // Register the client before we navigate, so that the navigation commits the
   // correct PrivateNetworkRequestPolicy.
   ContentBrowserClientRegistration registration(&client);
 
-  EXPECT_TRUE(NavigateToURL(
-      shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
+  EXPECT_TRUE(NavigateToURL(shell(), url));
 
   const network::mojom::ClientSecurityStatePtr security_state =
       root_frame_host()->BuildClientSecurityState();
@@ -2118,6 +2160,116 @@
             EvalJs(root_frame_host(), FetchSubresourceScript("image.jpg")));
 }
 
+// This test verifies that child frames with distinct origins from their parent
+// do not inherit their private network request policy, which is based on the
+// origin of the child document instead.
+IN_PROC_BROWSER_TEST_F(CorsRfc1918BrowserTest,
+                       PrivateNetworkRequestPolicyCalculatedPerOrigin) {
+  GURL url = InsecureTreatAsPublicAddressURL(*embedded_test_server());
+
+  PolicyTestContentBrowserClient client;
+  client.SetAllowInsecurePrivateNetworkRequestsFrom(url::Origin::Create(url));
+
+  // Register the client before we navigate, so that the navigation commits the
+  // correct PrivateNetworkRequestPolicy.
+  ContentBrowserClientRegistration registration(&client);
+
+  EXPECT_TRUE(NavigateToURL(
+      shell(), InsecureTreatAsPublicAddressURL(*embedded_test_server())));
+
+  RenderFrameHostImpl* child_frame = AddChildFromURL(
+      root_frame_host(), SecureDefaultURL(*embedded_test_server()));
+
+  network::mojom::ClientSecurityStatePtr security_state =
+      child_frame->BuildClientSecurityState();
+  ASSERT_FALSE(security_state.is_null());
+
+  EXPECT_EQ(security_state->private_network_request_policy,
+            network::mojom::PrivateNetworkRequestPolicy::
+                kBlockFromInsecureToMorePrivate);
+}
+
+// This test verifies that the initial empty document, which inherits its origin
+// from the document creator, also inherits its private network request policy.
+IN_PROC_BROWSER_TEST_F(
+    CorsRfc1918BrowserTest,
+    PrivateNetworkRequestPolicyInheritedWithOriginForInitialEmptyDoc) {
+  GURL url = InsecureTreatAsPublicAddressURL(*embedded_test_server());
+
+  PolicyTestContentBrowserClient client;
+  client.SetAllowInsecurePrivateNetworkRequestsFrom(url::Origin::Create(url));
+
+  // Register the client before we navigate, so that the navigation commits the
+  // correct PrivateNetworkRequestPolicy.
+  ContentBrowserClientRegistration registration(&client);
+
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  RenderFrameHostImpl* child_frame = AddChildInitialEmptyDoc(root_frame_host());
+
+  network::mojom::ClientSecurityStatePtr security_state =
+      child_frame->BuildClientSecurityState();
+  ASSERT_FALSE(security_state.is_null());
+
+  EXPECT_EQ(security_state->private_network_request_policy,
+            network::mojom::PrivateNetworkRequestPolicy::kAllow);
+}
+
+// This test verifies that `about:blank` iframes, which inherit their origin
+// from the navigation initiator, also inherit their private network request
+// policy.
+IN_PROC_BROWSER_TEST_F(
+    CorsRfc1918BrowserTest,
+    PrivateNetworkRequestPolicyInheritedWithOriginForAboutBlank) {
+  GURL url = InsecureTreatAsPublicAddressURL(*embedded_test_server());
+
+  PolicyTestContentBrowserClient client;
+  client.SetAllowInsecurePrivateNetworkRequestsFrom(url::Origin::Create(url));
+
+  // Register the client before we navigate, so that the navigation commits the
+  // correct PrivateNetworkRequestPolicy.
+  ContentBrowserClientRegistration registration(&client);
+
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  RenderFrameHostImpl* child_frame = AddChildFromAboutBlank(root_frame_host());
+
+  network::mojom::ClientSecurityStatePtr security_state =
+      child_frame->BuildClientSecurityState();
+  ASSERT_FALSE(security_state.is_null());
+
+  EXPECT_EQ(security_state->private_network_request_policy,
+            network::mojom::PrivateNetworkRequestPolicy::kAllow);
+}
+
+// This test verifies that `data:` iframes, which commit an opaque origin
+// derived from the navigation initiator's origin, do not inherit their private
+// network request policy.
+IN_PROC_BROWSER_TEST_F(
+    CorsRfc1918BrowserTest,
+    PrivateNetworkRequestPolicyNotInheritedWithOriginForDataURL) {
+  GURL url = InsecureTreatAsPublicAddressURL(*embedded_test_server());
+
+  PolicyTestContentBrowserClient client;
+  client.SetAllowInsecurePrivateNetworkRequestsFrom(url::Origin::Create(url));
+
+  // Register the client before we navigate, so that the navigation commits the
+  // correct PrivateNetworkRequestPolicy.
+  ContentBrowserClientRegistration registration(&client);
+
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  RenderFrameHostImpl* child_frame = AddChildFromDataURL(root_frame_host());
+
+  network::mojom::ClientSecurityStatePtr security_state =
+      child_frame->BuildClientSecurityState();
+  ASSERT_FALSE(security_state.is_null());
+
+  EXPECT_EQ(security_state->private_network_request_policy,
+            network::mojom::PrivateNetworkRequestPolicy::
+                kBlockFromInsecureToMorePrivate);
+}
+
 // This test verifies that when the right feature is enabled, requests:
 //  - from a secure page with the "treat-as-public-address" CSP directive
 //  - to a local IP address
@@ -2264,7 +2416,8 @@
             client_security_state->cross_origin_embedder_policy.value);
   EXPECT_EQ(network::mojom::IPAddressSpace::kUnknown,
             client_security_state->ip_address_space);
-  EXPECT_EQ(network::mojom::PrivateNetworkRequestPolicy::kAllow,
+  EXPECT_EQ(network::mojom::PrivateNetworkRequestPolicy::
+                kBlockFromInsecureToMorePrivate,
             client_security_state->private_network_request_policy);
 }
 
diff --git a/content/browser/renderer_host/input/touch_action_browsertest.cc b/content/browser/renderer_host/input/touch_action_browsertest.cc
index de43c62..5fb53c9 100644
--- a/content/browser/renderer_host/input/touch_action_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_action_browsertest.cc
@@ -362,7 +362,7 @@
     ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
     ActionsParser actions_parser(std::move(*parsed_json.value));
 
-    ASSERT_TRUE(actions_parser.ParsePointerActionSequence());
+    ASSERT_TRUE(actions_parser.Parse());
 
     run_loop_ = std::make_unique<base::RunLoop>();
 
@@ -400,7 +400,7 @@
     ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
     ActionsParser actions_parser(std::move(*parsed_json.value));
 
-    ASSERT_TRUE(actions_parser.ParsePointerActionSequence());
+    ASSERT_TRUE(actions_parser.Parse());
 
     run_loop_ = std::make_unique<base::RunLoop>();
 
diff --git a/content/browser/renderer_host/media/media_devices_manager_unittest.cc b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
index de4d877..8b1cbc3 100644
--- a/content/browser/renderer_host/media/media_devices_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
@@ -58,7 +58,7 @@
                                           int /* frame_id */) {
   return MediaDeviceSaltAndOrigin(
       "fake_media_device_salt", "fake_group_id_salt",
-      url::Origin::Create(GURL("https://test.com")));
+      url::Origin::Create(GURL("https://test.com")), GURL());
 }
 
 // This class mocks the audio manager and overrides some methods to ensure that
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index 55afa389..a6aa4f7 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -227,13 +227,13 @@
  public:
   MockMediaStreamUIProxy()
       : FakeMediaStreamUIProxy(/*tests_use_fake_render_frame_hosts=*/true) {}
-  void OnStarted(
-      base::OnceClosure stop,
-      content::MediaStreamUI::SourceCallback source,
-      MediaStreamUIProxy::WindowIdCallback window_id_callback,
-      const std::string& label,
-      std::vector<DesktopMediaID> screen_share_ids,
-      MediaStreamUI::StateChangeCallback state_change_callback) override {
+  void OnStarted(base::OnceClosure stop,
+                 content::MediaStreamUI::SourceCallback source,
+                 MediaStreamUIProxy::WindowIdCallback window_id_callback,
+                 const std::string& label,
+                 std::vector<DesktopMediaID> screen_share_ids,
+                 MediaStreamUI::StateChangeCallback state_change_callback,
+                 const GURL& url) override {
     // gmock cannot handle move-only types, so no std::move().
     MockOnStarted(stop);
   }
@@ -319,7 +319,7 @@
   MediaDeviceSaltAndOrigin GetSaltAndOrigin(int /* process_id */,
                                             int /* frame_id */) {
     return MediaDeviceSaltAndOrigin(browser_context_->GetMediaDeviceIDSalt(),
-                                    "fake_group_id_salt", origin_);
+                                    "fake_group_id_salt", origin_, GURL());
   }
 
  protected:
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 6d1e47d..c75201e 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -849,6 +849,7 @@
     int requester_id,
     int page_request_id,
     const StreamControls& controls,
+    const GURL& url,
     const url::Origin& security_origin,
     MediaAccessRequestCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -863,7 +864,7 @@
       blink::MEDIA_DEVICE_ACCESS, controls,
       MediaDeviceSaltAndOrigin{std::string() /* salt */,
                                std::string() /* group_id_salt */,
-                               security_origin});
+                               security_origin, url});
 
   request->media_access_request_cb = std::move(callback);
   const std::string& label = AddRequest(std::move(request));
@@ -2697,7 +2698,8 @@
                        request->devices),
         label, screen_share_ids,
         base::BindRepeating(&MediaStreamManager::RequestStateChangeFromBrowser,
-                            base::Unretained(this), label));
+                            base::Unretained(this), label),
+        request->salt_and_origin.url);
   }
 }
 
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h
index d6652e4a..ce64eef1 100644
--- a/content/browser/renderer_host/media/media_stream_manager.h
+++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -175,6 +175,7 @@
                                      int requester_id,
                                      int page_request_id,
                                      const blink::StreamControls& controls,
+                                     const GURL& url,
                                      const url::Origin& security_origin,
                                      MediaAccessRequestCallback callback);
 
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
index ec68078..273aaf7 100644
--- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -231,7 +231,7 @@
     blink::StreamControls controls(true, true);
     return media_stream_manager_->MakeMediaAccessRequest(
         render_process_id, render_frame_id, requester_id, page_request_id,
-        controls, security_origin, std::move(callback));
+        controls, GURL(), security_origin, std::move(callback));
   }
 
   void RequestAndStopGetDisplayMedia(bool request_audio) {
@@ -472,7 +472,7 @@
       &MediaStreamManagerTest::ResponseCallback, base::Unretained(this), 1);
   std::string label2 = media_stream_manager_->MakeMediaAccessRequest(
       render_process_id, render_frame_id, requester_id, page_request_id,
-      controls, security_origin, std::move(callback));
+      controls, GURL(), security_origin, std::move(callback));
 
   // Expecting the callbackS from requests will be triggered and quit the test.
   // Note, the callbacks might come in a different order depending on the
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.cc b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
index 79862e07..3ec8a59 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/debug/alias.h"
 #include "base/macros.h"
 #include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/renderer_host/render_frame_host_delegate.h"
@@ -293,12 +294,15 @@
     WindowIdCallback window_id_callback,
     const std::string& label,
     std::vector<DesktopMediaID> screen_share_ids,
-    MediaStreamUI::StateChangeCallback state_change_callback) {
+    MediaStreamUI::StateChangeCallback state_change_callback,
+    const GURL& url) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   stop_callback_ = std::move(stop_callback);
   source_callback_ = std::move(source_callback);
   state_change_callback_ = std::move(state_change_callback);
+  last_url_ = url;
+  ++start_count_;
 
   // Owned by the PostTaskAndReply callback.
   gfx::NativeViewId* window_id = new gfx::NativeViewId(0);
@@ -333,8 +337,10 @@
 
 void MediaStreamUIProxy::ProcessStopRequestFromUI() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(!stop_callback_.is_null());
-
+  const int start_count_copy = start_count_;
+  base::debug::Alias(&start_count_copy);
+  DEBUG_ALIAS_FOR_GURL(last_url_copy, last_url_);
+  CHECK(stop_callback_);
   std::move(stop_callback_).Run();
 }
 
@@ -453,7 +459,8 @@
     WindowIdCallback window_id_callback,
     const std::string& label,
     std::vector<DesktopMediaID> screen_share_ids,
-    MediaStreamUI::StateChangeCallback state_change_callback) {}
+    MediaStreamUI::StateChangeCallback state_change_callback,
+    const GURL& url) {}
 
 void FakeMediaStreamUIProxy::OnDeviceStopped(const std::string& label,
                                              const DesktopMediaID& media_id) {}
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.h b/content/browser/renderer_host/media/media_stream_ui_proxy.h
index 420e67b..b44de5a 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy.h
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy.h
@@ -15,6 +15,7 @@
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 #include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
 #include "ui/gfx/native_widget_types.h"
+#include "url/gurl.h"
 
 namespace content {
 
@@ -64,7 +65,8 @@
       WindowIdCallback window_id_callback,
       const std::string& label,
       std::vector<DesktopMediaID> screen_share_ids,
-      MediaStreamUI::StateChangeCallback state_change_callback);
+      MediaStreamUI::StateChangeCallback state_change_callback,
+      const GURL& url);
 
   virtual void OnDeviceStopped(const std::string& label,
                                const DesktopMediaID& media_id);
@@ -93,6 +95,10 @@
   MediaStreamUI::SourceCallback source_callback_;
   MediaStreamUI::StateChangeCallback state_change_callback_;
 
+  // TODO(https://crbug.com/1140187): temporary while tracking down bug.
+  GURL last_url_;
+  int start_count_ = 0;
+
   base::WeakPtrFactory<MediaStreamUIProxy> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(MediaStreamUIProxy);
@@ -113,13 +119,13 @@
   // MediaStreamUIProxy overrides.
   void RequestAccess(std::unique_ptr<MediaStreamRequest> request,
                      ResponseCallback response_callback) override;
-  void OnStarted(
-      base::OnceClosure stop_callback,
-      MediaStreamUI::SourceCallback source_callback,
-      WindowIdCallback window_id_callback,
-      const std::string& label,
-      std::vector<DesktopMediaID> screen_share_ids,
-      MediaStreamUI::StateChangeCallback state_change_callback) override;
+  void OnStarted(base::OnceClosure stop_callback,
+                 MediaStreamUI::SourceCallback source_callback,
+                 WindowIdCallback window_id_callback,
+                 const std::string& label,
+                 std::vector<DesktopMediaID> screen_share_ids,
+                 MediaStreamUI::StateChangeCallback state_change_callback,
+                 const GURL& url) override;
   void OnDeviceStopped(const std::string& label,
                        const DesktopMediaID& media_id) override;
 
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
index 8041fbb..bfa59cf 100644
--- a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
@@ -200,7 +200,7 @@
   proxy_->OnStarted(base::OnceClosure(), MediaStreamUI::SourceCallback(),
                     MediaStreamUIProxy::WindowIdCallback(),
                     /*label=*/std::string(), /*screen_capture_ids=*/{},
-                    MediaStreamUI::StateChangeCallback());
+                    MediaStreamUI::StateChangeCallback(), GURL());
   base::RunLoop().RunUntilIdle();
 }
 
@@ -279,7 +279,7 @@
                     MediaStreamUI::SourceCallback(),
                     MediaStreamUIProxy::WindowIdCallback(),
                     /*label=*/std::string(), /*screen_capture_ids=*/{},
-                    MediaStreamUI::StateChangeCallback());
+                    MediaStreamUI::StateChangeCallback(), GURL());
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(stop_callback);
@@ -326,7 +326,7 @@
                     base::BindOnce(&MockStopStreamHandler::OnWindowId,
                                    base::Unretained(&handler)),
                     /*label=*/std::string(), /*screen_capture_ids=*/{},
-                    MediaStreamUI::StateChangeCallback());
+                    MediaStreamUI::StateChangeCallback(), GURL());
   base::RunLoop().RunUntilIdle();
 }
 
@@ -378,7 +378,7 @@
       base::BindRepeating(&MockChangeSourceStreamHandler::OnChangeSource,
                           base::Unretained(&source_handler)),
       MediaStreamUIProxy::WindowIdCallback(), /*label=*/std::string(),
-      /*screen_capture_ids=*/{}, MediaStreamUI::StateChangeCallback());
+      /*screen_capture_ids=*/{}, MediaStreamUI::StateChangeCallback(), GURL());
   base::RunLoop().RunUntilIdle();
 
   ASSERT_FALSE(source_callback.is_null());
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 27edd3b..72bbdfaa 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -2976,21 +2976,29 @@
   // a ClientSecurityState to use instead.
   //
   // We currently define the client of the fetch as the parent frame, if any.
-  // This is probably incorrect: frames can cause others in the same browsing
-  // context group to navigate to pages, without being the parent. Additionally
+  // This is incorrect: frames can cause others in the same browsing context
+  // group to navigate to pages, without being the parent. Additionally
   // there is no client security state for top-level navigations, which mainly
   // means that CORS-RFC1918 checks are skipped for such requests.
   //
-  // TODO(https://crbug.com/1129326): Figure out the UX story for top-level
-  // navigations and spooky-action-at-a-distance navigations, then revisit this.
-  // The client security state might need to be that of the initiator of the
-  // navigation, or we might need to take into account both the parent frame and
-  // the initiator's client security states. In any case, we should probably
-  // always provide a client security state.
+  // TODO(https://crbug.com/1170335): Pass the client security state of the
+  // navigation initiator to this navigation request somehow and use that
+  // instead.
+  //
+  // TODO(https://crbug.com/1129326): Figure out the UX story for main-frame
+  // navigations, then revisit the exception made in that case.
   network::mojom::ClientSecurityStatePtr client_security_state = nullptr;
   RenderFrameHostImpl* parent = GetParentFrame();
   if (parent) {
     client_security_state = parent->BuildClientSecurityState();
+
+    // Selectively disable blocking of insecure private network requests if the
+    // right feature is not enabled.
+    if (!base::FeatureList::IsEnabled(
+            features::kBlockInsecurePrivateNetworkRequestsForNavigations)) {
+      client_security_state->private_network_request_policy =
+          network::mojom::PrivateNetworkRequestPolicy::kAllow;
+    }
   }
 
   auto loader_type = NavigationURLLoader::LoaderType::kRegular;
@@ -4610,8 +4618,8 @@
   BrowserContext* context =
       frame_tree_node_->navigator().GetController()->GetBrowserContext();
 
-  if (client->ShouldAllowInsecurePrivateNetworkRequests(context,
-                                                        common_params_->url)) {
+  url::Origin origin = GetOriginForURLLoaderFactory();
+  if (client->ShouldAllowInsecurePrivateNetworkRequests(context, origin)) {
     // The content browser client decided to make an exception for this URL.
     return;
   }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index e26ca666..b983f439 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1156,6 +1156,12 @@
     }
   }
 
+  if (!base::FeatureList::IsEnabled(
+          features::kBlockInsecurePrivateNetworkRequests)) {
+    private_network_request_policy_ =
+        network::mojom::PrivateNetworkRequestPolicy::kAllow;
+  }
+
   unload_event_monitor_timeout_ =
       std::make_unique<TimeoutMonitor>(base::BindRepeating(
           &RenderFrameHostImpl::OnUnloaded, weak_ptr_factory_.GetWeakPtr()));
@@ -2704,6 +2710,11 @@
                     is_off_the_record, updated_source_id);
 }
 
+void RenderFrameHostImpl::FrameSizeChanged(const gfx::Size& frame_size) {
+  frame_size_ = frame_size;
+  delegate_->FrameSizeChanged(this, frame_size);
+}
+
 void RenderFrameHostImpl::OnCreateChildFrame(
     int new_routing_id,
     mojo::PendingAssociatedRemote<mojom::Frame> frame_remote,
@@ -3000,6 +3011,13 @@
       new_frame_origin, net::IsolationInfo::RequestType::kOther);
   SetLastCommittedOrigin(new_frame_origin);
 
+  // Apply private network request policy according to our new origin.
+  if (GetContentClient()->browser()->ShouldAllowInsecurePrivateNetworkRequests(
+          GetBrowserContext(), new_frame_origin)) {
+    private_network_request_policy_ =
+        network::mojom::PrivateNetworkRequestPolicy::kAllow;
+  }
+
   // Construct the frame's feature policy only once we know its initial
   // committed origin. It's necessary to wait for the origin because the feature
   // policy's state depends on the origin, so the FeaturePolicy object could be
@@ -4322,11 +4340,6 @@
       base::GetCanonicalEncodingNameByAliasName(encoding_name);
 }
 
-void RenderFrameHostImpl::FrameSizeChanged(const gfx::Size& frame_size) {
-  frame_size_ = frame_size;
-  delegate_->FrameSizeChanged(this, frame_size);
-}
-
 void RenderFrameHostImpl::FullscreenStateChanged(
     bool is_fullscreen,
     blink::mojom::FullscreenOptionsPtr options) {
@@ -9059,10 +9072,11 @@
   // browser must match with the ones computed from the renderer process.
   // Ultimately, the one from the browser process should supersede the
   // renderer one. The browser will just "push" the correct value.
-  if (navigation_request->state() >=
-      NavigationRequest::NavigationState::WILL_PROCESS_RESPONSE) {
-    DCHECK_EQ(params.sandbox_flags, navigation_request->SandboxFlagsToCommit());
-  }
+  //
+  // This currently doesn't match for about blank in the WPT test:
+  // window-open-blank-from-different-initiator-after-slow.html
+  DCHECK(navigation_request->GetURL().IsAboutBlank() ||
+         params.sandbox_flags == navigation_request->SandboxFlagsToCommit());
 
   // TODO(https://crbug.com/888079): The origin computed from the browser must
   // match the one reported from the renderer process.
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 82632d65..b34f885 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -1759,6 +1759,7 @@
       int32_t line_no,
       const base::Optional<base::string16>& source_id,
       const base::Optional<base::string16>& untrusted_stack_trace) override;
+  void FrameSizeChanged(const gfx::Size& frame_size) override;
 
   // blink::LocalMainFrameHost overrides:
   void ScaleFactorChanged(float scale) override;
@@ -2165,7 +2166,6 @@
                      const std::string& unique_name) override;
   void CancelInitialHistoryLoad() override;
   void UpdateEncoding(const std::string& encoding) override;
-  void FrameSizeChanged(const gfx::Size& frame_size) override;
   void UpdateState(const blink::PageState& state) override;
   void OpenURL(mojom::OpenURLParamsPtr params) override;
   void DidStopLoading() override;
@@ -2725,6 +2725,13 @@
   GURL last_committed_url_;
 
   // Track this frame's last committed origin.
+  //
+  // WARNING: Until crbug.com/888079 is fixed, frame hosts for `about:blank`
+  // will inherit the origin of their parent document instead of the initiator
+  // document. This happens because Blink computes the origin incorrectly and we
+  // commit the origin given by Blink into this member.
+  //
+  // TODO(https://crbug.com/888079): Remove the above.
   url::Origin last_committed_origin_;
 
   // Whether the last committed document is a secure context.
@@ -2742,6 +2749,26 @@
   // TODO(https://crbug.com/1168024): Fix this to behave as specified in HTML.
   bool is_web_secure_context_ = false;
 
+  // The policy to apply to private network requests issued by the last
+  // committed document. Set to a default value until a document commits for the
+  // first time. The default value depends on whether the
+  // BlockInsecurePrivateNetworkRequests feature is enabled, see constructor.
+  //
+  // This property normally depends on the last committed origin and the state
+  // of |ContentBrowserClient| at the time the navigation committed. Due to the
+  // fact that this is based on the origin computed by the browser process in
+  // |NavigationRequest|, whereas |last_commited_origin_| is computed by the
+  // renderer process (see crbug.com/888079), there can be discrepancies.
+  // Notably, in the case of an `about:blank` document, this policy is inherited
+  // from the initiator document, whereas the origin is inherited (incorrectly)
+  // from the parent document.
+  //
+  // TODO(https://crbug.com/888079): Simplify the above comment when the
+  // behavior it explains is fixed.
+  network::mojom::PrivateNetworkRequestPolicy private_network_request_policy_ =
+      network::mojom::PrivateNetworkRequestPolicy::
+          kBlockFromInsecureToMorePrivate;
+
   network::CrossOriginEmbedderPolicy cross_origin_embedder_policy_;
 
   network::CrossOriginOpenerPolicy cross_origin_opener_policy_;
@@ -3274,11 +3301,6 @@
   // Salt for generating frame-specific media device IDs.
   std::string media_device_id_salt_base_;
 
-  // This is a security property of the last committed document that are
-  // needed by the network service. Until then it has a default value.
-  network::mojom::PrivateNetworkRequestPolicy private_network_request_policy_ =
-      network::mojom::PrivateNetworkRequestPolicy::kAllow;
-
   // Keep the list of ServiceWorkerContainerHosts so that they can observe when
   // the frame goes in/out of BackForwardCache.
   // These pointers must be dereferenced on the
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 7927fc6c..d5abfae 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -15468,7 +15468,7 @@
   ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
   ActionsParser actions_parser(std::move(*parsed_json.value));
 
-  ASSERT_TRUE(actions_parser.ParsePointerActionSequence());
+  ASSERT_TRUE(actions_parser.Parse());
   auto synthetic_gesture_doubletap =
       SyntheticGesture::Create(actions_parser.gesture_params());
 
@@ -16153,7 +16153,7 @@
   ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
   ActionsParser actions_parser(std::move(*parsed_json.value));
 
-  ASSERT_TRUE(actions_parser.ParsePointerActionSequence());
+  ASSERT_TRUE(actions_parser.Parse());
   auto synthetic_scroll_gesture =
       SyntheticGesture::Create(actions_parser.gesture_params());
 
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc
index dc06b07..26d81d8 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.cc
+++ b/content/browser/speech/speech_recognition_dispatcher_host.cc
@@ -138,7 +138,8 @@
           &SpeechRecognitionDispatcherHost::StartSessionOnIO,
           speech_recognition_dispatcher_host, std::move(params),
           embedder_render_process_id, embedder_render_frame_id,
-          rfh->GetLastCommittedOrigin(), filter_profanities,
+          rfh->GetLastCommittedURL(), rfh->GetLastCommittedOrigin(),
+          filter_profanities,
           storage_partition->GetURLLoaderFactoryForBrowserProcessIOThread(),
           GetContentClient()->browser()->GetAcceptLangs(browser_context)));
 }
@@ -147,6 +148,7 @@
     blink::mojom::StartSpeechRecognitionRequestParamsPtr params,
     int embedder_render_process_id,
     int embedder_render_frame_id,
+    const GURL& url,
     const url::Origin& origin,
     bool filter_profanities,
     std::unique_ptr<network::PendingSharedURLLoaderFactory>
@@ -156,6 +158,7 @@
 
   SpeechRecognitionSessionContext context;
   context.security_origin = origin;
+  context.url = url;
   context.render_process_id = render_process_id_;
   context.render_frame_id = render_frame_id_;
   context.embedder_render_process_id = embedder_render_process_id;
diff --git a/content/browser/speech/speech_recognition_dispatcher_host.h b/content/browser/speech/speech_recognition_dispatcher_host.h
index 14d090e..81dd140 100644
--- a/content/browser/speech/speech_recognition_dispatcher_host.h
+++ b/content/browser/speech/speech_recognition_dispatcher_host.h
@@ -61,6 +61,7 @@
       blink::mojom::StartSpeechRecognitionRequestParamsPtr params,
       int embedder_render_process_id,
       int embedder_render_frame_id,
+      const GURL& url,
       const url::Origin& origin,
       bool filter_profanities,
       std::unique_ptr<network::PendingSharedURLLoaderFactory>
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc
index 195b11d1b..0fd5b5af 100644
--- a/content/browser/speech/speech_recognition_manager_impl.cc
+++ b/content/browser/speech/speech_recognition_manager_impl.cc
@@ -352,7 +352,8 @@
     SpeechRecognitionSessionContext& context = session->context;
     context.label = media_stream_manager_->MakeMediaAccessRequest(
         context.render_process_id, context.render_frame_id, requester_id_,
-        session_id, blink::StreamControls(true, false), context.security_origin,
+        session_id, blink::StreamControls(true, false), context.url,
+        context.security_origin,
         base::BindOnce(
             &SpeechRecognitionManagerImpl::MediaRequestPermissionCallback,
             weak_factory_.GetWeakPtr(), session_id));
@@ -484,7 +485,8 @@
     iter->second->ui->OnStarted(
         base::OnceClosure(), MediaStreamUI::SourceCallback(),
         MediaStreamUIProxy::WindowIdCallback(), /*label=*/std::string(),
-        /*screen_capture_ids=*/{}, MediaStreamUI::StateChangeCallback());
+        /*screen_capture_ids=*/{}, MediaStreamUI::StateChangeCallback(),
+        GURL());
   }
 
   DCHECK_EQ(primary_session_id_, session_id);
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc
index f4418345..ee75cc4 100644
--- a/content/browser/webui/shared_resources_data_source.cc
+++ b/content/browser/webui/shared_resources_data_source.cc
@@ -60,15 +60,11 @@
   std::map<std::string, std::string> aliases = {
     {"../../views/resources/default_100_percent/common/", "images/apps/"},
     {"../../views/resources/default_200_percent/common/", "images/2x/apps/"},
-    {"@out_folder@/gen/ui/webui/resources/", ""},
 #if defined(OS_ANDROID)
     // This is a temporary fix for `target_cpu = "arm64"`. See the bug for
     // more context: crbug.com/1020284.
     {"@out_folder@/android_clang_arm/gen/ui/webui/resources/", ""},
 #endif  // defined(OS_ANDROID)
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    {"@out_folder@/gen/ui/chromeos/", "chromeos/"},
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   };
 
 #if !defined(OS_ANDROID)
diff --git a/content/child/webthemeengine_impl_android.cc b/content/child/webthemeengine_impl_android.cc
index a6be4c16..8e6ddcc1 100644
--- a/content/child/webthemeengine_impl_android.cc
+++ b/content/child/webthemeengine_impl_android.cc
@@ -59,6 +59,8 @@
           extra_params->text_field.is_listbox;
       native_theme_extra_params->text_field.background_color =
           extra_params->text_field.background_color;
+      native_theme_extra_params->text_field.has_border =
+          extra_params->text_field.has_border;
       break;
     case WebThemeEngine::kPartMenuList:
       native_theme_extra_params->menu_list.has_border =
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index f7f1e3d0..3530150 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -573,11 +573,6 @@
   // proper encoding name. Sent for top-level frames.
   UpdateEncoding(string encoding_name);
 
-  // The frame's size is replicated in the browser so that the browser can
-  // correctly set the initial size of the frame in case of a cross-process
-  // navigation.
-  FrameSizeChanged(gfx.mojom.Size size);
-
   // Updates information to determine whether a user gesture should carryover to
   // future navigations. This is needed so navigations within a certain
   // timeframe of a request initiated by a gesture will be treated as if they
diff --git a/content/common/input/actions_parser.cc b/content/common/input/actions_parser.cc
index 7438101a..a3bcded 100644
--- a/content/common/input/actions_parser.cc
+++ b/content/common/input/actions_parser.cc
@@ -11,6 +11,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
+#include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
+#include "ui/events/types/scroll_types.h"
 
 namespace content {
 
@@ -77,56 +79,71 @@
 
 }  // namespace
 
-ActionsParser::ActionsParser(base::Value pointer_actions_value)
-    : longest_action_sequence_(0),
-      pointer_actions_value_(std::move(pointer_actions_value)),
-      action_index_(0),
-      use_testdriver_api_(true) {}
+ActionsParser::ActionsParser(base::Value action_sequence_list)
+    : action_sequence_list_(std::move(action_sequence_list)) {
+  // We have two different JSON formats from testdriver Action API or
+  // gpuBenchmarking.pointerActionSequence. Below we are deciding where the
+  // action sequence list comes from.
+  if (action_sequence_list_.is_list() &&
+      action_sequence_list_.GetList().size() > 0) {
+    use_testdriver_api_ =
+        ActionsDictionaryUsesTestDriverApi(action_sequence_list_.GetList()[0]);
+  }
+}
 
 ActionsParser::~ActionsParser() {}
 
-bool ActionsParser::ParsePointerActionSequence() {
-  if (!pointer_actions_value_.is_list()) {
-    error_message_ = std::string("provided value is not a list");
+bool ActionsParser::Parse() {
+  if (!action_sequence_list_.is_list() ||
+      action_sequence_list_.GetList().size() == 0) {
+    error_message_ =
+        std::string("provided action sequence list is not a list or is empty");
     return false;
   }
 
-  int index = 0;
-  for (const auto& pointer_actions : pointer_actions_value_.GetList()) {
-    if (!pointer_actions.is_dict()) {
+  for (const auto& action_sequence : action_sequence_list_.GetList()) {
+    if (!action_sequence.is_dict()) {
       error_message_ =
-          std::string("pointer actions is missing or not a dictionary");
-      return false;
-    } else if (!ParsePointerActions(pointer_actions, index)) {
+          std::string("Expected ActionSequence is not a dictionary");
       return false;
     }
-    index++;
-    if (source_type_ == "pointer" || !use_testdriver_api_)
-      action_index_++;
+
+    if (use_testdriver_api_) {
+      if (!ParseTestDriverActionSequence(action_sequence))
+        return false;
+    } else {
+      if (!ParseGpuBenchmarkingActionSequence(action_sequence))
+        return false;
+    }
   }
 
-  gesture_params_.gesture_source_type =
+  if (source_type_ == "wheel")
+    return true;
+
+  gesture_params_ = std::make_unique<SyntheticPointerActionListParams>();
+  SyntheticPointerActionListParams* pointer_actions =
+      static_cast<SyntheticPointerActionListParams*>(gesture_params_.get());
+  pointer_actions->gesture_source_type =
       ToSyntheticGestureSourceType(pointer_type_);
   // Group a list of actions from all pointers into a
   // SyntheticPointerActionListParams object, which is a list of actions, which
   // will be dispatched together.
-  for (size_t action_index = 0; action_index < longest_action_sequence_;
-       ++action_index) {
+  for (size_t index = 0; index < longest_action_sequence_; ++index) {
     SyntheticPointerActionListParams::ParamList param_list;
     size_t longest_pause_frame = 0;
-    for (const auto& pointer_action_list : pointer_actions_list_) {
-      if (action_index < pointer_action_list.size()) {
-        param_list.push_back(pointer_action_list[action_index]);
-        if (pointer_action_list[action_index].pointer_action_type() ==
+    for (const auto& pointer_action_list : pointer_actions_lists_) {
+      if (index < pointer_action_list.size()) {
+        param_list.push_back(pointer_action_list[index]);
+        if (pointer_action_list[index].pointer_action_type() ==
             SyntheticPointerActionParams::PointerActionType::IDLE) {
           size_t num_pause_frame = static_cast<size_t>(std::ceil(
-              pointer_action_list[action_index].duration().InMilliseconds() /
+              pointer_action_list[index].duration().InMilliseconds() /
               viz::BeginFrameArgs::DefaultInterval().InMilliseconds()));
           longest_pause_frame = std::max(longest_pause_frame, num_pause_frame);
         }
       }
     }
-    gesture_params_.PushPointerActionParamsList(param_list);
+    pointer_actions->PushPointerActionParamsList(param_list);
 
     for (size_t pause_index = 1; pause_index < longest_pause_frame;
          ++pause_index) {
@@ -136,187 +153,229 @@
       for (size_t i = 0; i < param_list.size(); ++i) {
         pause_param_list.push_back(pause_action_param);
       }
-      gesture_params_.PushPointerActionParamsList(pause_param_list);
+      pointer_actions->PushPointerActionParamsList(pause_param_list);
     }
   }
   return true;
 }
 
-bool ActionsParser::ParsePointerActions(const base::Value& pointer, int index) {
-  int pointer_id = -1;
-  // If the json format of each pointer has "type" element, it is from the new
-  // Action API, otherwise it is from gpuBenchmarking.pointerActionSequence
-  // API. We have to keep both formats for now, but later on once we switch to
-  // the new Action API in all tests, we will remove the old format.
-  const base::Value* type_key = pointer.FindKey("type");
-  if (index == 0)
-    use_testdriver_api_ = type_key != nullptr;
+bool ActionsParser::ActionsDictionaryUsesTestDriverApi(
+    const base::Value& action_sequence) {
+  // If the JSON format of each action_sequence has "type" element, it is from
+  // the new Action API, otherwise it is from
+  // gpuBenchmarking.pointerActionSequence API. We have to keep both formats
+  // for now, but later on once we switch to the new Action API in all tests,
+  // we will remove the old format.
+  if (action_sequence.FindKey("type"))
+    return true;
+  return false;
+}
 
-  if (use_testdriver_api_) {
-    DCHECK_NE(nullptr, type_key);
-    if (!type_key->is_string()) {
-      error_message_ =
-          std::string("action sequence type is missing or not a string");
-      return false;
-    }
-    std::string source_type = type_key->GetString();
-    if (source_type == "") {
-      error_message_ = std::string("action sequence type cannot be empty");
-      return false;
-    } else if (source_type == "key") {
-      error_message_ =
-          std::string("we do not support action sequence type of key");
-      return false;
-    }
+bool ActionsParser::ParseGpuBenchmarkingActionSequence(
+    const base::Value& action_sequence) {
+  // The GpuBenchmarking format is implicitly for pointers only and for
+  // historic reasons, the "source" key refers to what TestDriver calls the
+  // pointer_type_.
+  source_type_ = "pointer";
+  if (use_testdriver_api_ !=
+      ActionsDictionaryUsesTestDriverApi(action_sequence)) {
+    error_message_ = std::string(
+        "all action sequences must be of the same gpuBenchmarking format");
+    return false;
+  }
 
-    if (source_type == "pointer") {
-      if (source_type_.empty())
-        source_type_ = source_type;
+  const std::string* pointer_type = action_sequence.FindStringKey("source");
+  if (!pointer_type) {
+    error_message_ = std::string("source type is not defined or not a string");
+    return false;
+  }
 
-      const base::Value* parameters = pointer.FindKey("parameters");
-      if (source_type_ == "pointer" && !parameters) {
-        error_message_ = std::string(
-            "action sequence parameters is missing for pointer type");
-        return false;
-      }
+  if (*pointer_type != "touch" && *pointer_type != "mouse" &&
+      *pointer_type != "pen") {
+    error_message_ = base::StringPrintf(
+        "source type %s is an unsupported input type", (*pointer_type).c_str());
+    return false;
+  }
 
-      if (!parameters->is_dict()) {
-        error_message_ =
-            std::string("action sequence parameters is not a dictionary");
-        return false;
-      }
+  if (pointer_type_.empty()) {
+    pointer_type_ = *pointer_type;
+  } else if (pointer_type_ != *pointer_type) {
+    error_message_ =
+        std::string("currently multiple input types are not not supported");
+    return false;
+  }
 
-      const std::string* pointer_type =
-          parameters->FindStringKey("pointerType");
-      if (!pointer_type) {
-        error_message_ = std::string(
-            "action sequence pointer type is missing or not a string");
-        return false;
-      } else if (*pointer_type != "touch" && *pointer_type != "mouse" &&
-                 *pointer_type != "pen") {
-        error_message_ = std::string(
-            "action sequence pointer type is an unsupported input type");
-        return false;
-      }
-
-      if (pointer_type_.empty()) {
-        pointer_type_ = *pointer_type;
-      }
-
-      if (pointer_type_ != *pointer_type) {
-        error_message_ = std::string(
-            "currently multiple action sequence pointer type are not "
-            "supported");
-        return false;
-      }
-
-      if (*pointer_type != "touch" && action_index_ > 0) {
-        error_message_ = std::string(
-            "for input type of mouse and pen, we only support one device");
-        return false;
-      }
-
-      const std::string* pointer_name = pointer.FindStringKey("id");
-      if (!pointer_name) {
-        error_message_ = std::string("pointer name is missing or not a string");
-        return false;
-      }
-
-      if (pointer_name_set_.find(*pointer_name) != pointer_name_set_.end()) {
-        error_message_ = std::string("pointer name already exists");
-        return false;
-      }
-
-      pointer_name_set_.insert(*pointer_name);
-      pointer_id_set_.insert(action_index_);
-    }
-    pointer_id = action_index_;
-  } else {
-    DCHECK_EQ(nullptr, type_key);
-    const std::string* pointer_type = pointer.FindStringKey("source");
-    if (!pointer_type) {
-      error_message_ = std::string("source type is missing or not a string");
-      return false;
-    } else if (*pointer_type != "touch" && *pointer_type != "mouse" &&
-               *pointer_type != "pen") {
-      error_message_ =
-          std::string("source type is an unsupported input source");
-      return false;
-    }
-
-    if (pointer_type_.empty()) {
-      pointer_type_ = *pointer_type;
-    }
-
-    if (pointer_type_ != *pointer_type) {
-      error_message_ =
-          std::string("currently multiple input sources are not not supported");
-      return false;
-    }
-
-    if (*pointer_type != "touch" && action_index_ > 0) {
-      error_message_ = std::string(
-          "for input source type of mouse and pen, we only support one device "
-          "in one sequence");
-      return false;
-    }
-
-    const base::Value* id_key = pointer.FindKey("id");
-    if (id_key) {
-      if (!id_key->is_int()) {
-        error_message_ = std::string("pointer id is not an integer");
-        return false;
-      }
-      pointer_id = id_key->GetInt();
-
-      if (pointer_id < 0) {
-        error_message_ = std::string("pointer id can not be negative");
-        return false;
-      }
-    }
-
-    if (pointer_id != -1) {
-      if (pointer_id_set_.find(pointer_id) != pointer_id_set_.end()) {
-        error_message_ = std::string("pointer id already exists");
-        return false;
-      }
-
-      if (action_index_ != static_cast<int>(pointer_id_set_.size())) {
-        error_message_ = std::string("some pointers do not have a pointer id");
-        return false;
-      }
-
-      pointer_id_set_.insert(pointer_id);
-    } else {
-      if (pointer_id_set_.size() > 0) {
-        error_message_ = std::string("this pointer does not have a pointer id");
-        return false;
-      }
-    }
+  if (*pointer_type != "touch" && input_source_count_ > 0) {
+    error_message_ = std::string(
+        "for source type of mouse and pen, we only support one device "
+        "in one sequence");
+    return false;
   }
 
   const base::Value* actions =
-      pointer.FindKeyOfType("actions", base::Value::Type::LIST);
+      action_sequence.FindKeyOfType("actions", base::Value::Type::LIST);
   if (!actions) {
     error_message_ = base::StringPrintf(
-        "pointer[%d].actions is missing or not a list", action_index_);
+        "action_sequence[%zu].actions is not defined or not a list",
+        action_index_);
+    return false;
+  } else if (actions->GetList().size() == 0) {
+    error_message_ = base::StringPrintf(
+        "action_sequence[%zu].actions is an empty list", action_index_);
     return false;
   }
 
-  if (!ParseActions(*actions, pointer_id))
+  if (!ParseActionItemList(*actions, "pointer"))
     return false;
 
+  input_source_count_++;
+  return true;
+}
+
+bool ActionsParser::ParseTestDriverActionSequence(
+    const base::Value& action_sequence) {
+  if (use_testdriver_api_ !=
+      ActionsDictionaryUsesTestDriverApi(action_sequence)) {
+    error_message_ = std::string(
+        "all action sequences must be of the same TestDriver format");
+    return false;
+  }
+
+  const std::string* source_type = action_sequence.FindStringKey("type");
+  if (!source_type) {
+    error_message_ =
+        std::string("input source type is not defined or not a string");
+    return false;
+  }
+
+  if (*source_type != "none") {
+    if (source_type_.empty()) {
+      source_type_ = *source_type;
+    } else if (source_type_ != *source_type) {
+      error_message_ = std::string(
+          "currently multiple input source types are not supported");
+      return false;
+    }
+  }
+
+  if (*source_type == "pointer") {
+    if (!ParsePointerParameters(action_sequence))
+      return false;
+  } else if (*source_type == "key") {
+    error_message_ =
+        std::string("we do not support action sequence type of key");
+    return false;
+  } else if (*source_type == "wheel") {
+    // do nothing
+  } else if (*source_type == "none") {
+    // do nothing
+  } else {
+    error_message_ = base::StringPrintf("the input source type %s is invalid",
+                                        (*source_type).c_str());
+    return false;
+  }
+
+  const base::Value* actions =
+      action_sequence.FindKeyOfType("actions", base::Value::Type::LIST);
+  if (!actions) {
+    error_message_ = base::StringPrintf(
+        "action_sequence[%zu].actions is not defined or not a list",
+        action_index_);
+    return false;
+  } else if (actions->GetList().size() == 0) {
+    error_message_ = base::StringPrintf(
+        "action_sequence[%zu].actions is an empty list", action_index_);
+    return false;
+  } else if (*source_type == "wheel" && actions->GetList().size() > 1) {
+    error_message_ = base::StringPrintf(
+        "action_sequence[%zu].actions should only have one action for the "
+        "wheel input source",
+        action_index_);
+    return false;
+  }
+
+  if (!ParseActionItemList(*actions, *source_type))
+    return false;
+
+  if (*source_type != "none")
+    input_source_count_++;
+
   return true;
 }
 
-bool ActionsParser::ParseActions(const base::Value& actions, int pointer_id) {
+bool ActionsParser::ParsePointerParameters(const base::Value& action_sequence) {
+  const base::Value* parameters = action_sequence.FindKey("parameters");
+  // The default pointer type is mouse.
+  std::string pointer_type = "mouse";
+  if (parameters) {
+    if (!parameters->is_dict()) {
+      error_message_ =
+          std::string("action sequence parameters is not a dictionary");
+      return false;
+    }
+
+    const std::string* pointer_type_value =
+        parameters->FindStringKey("pointerType");
+    if (!pointer_type_value) {
+      error_message_ = std::string(
+          "action sequence pointer type is not defined or not a string");
+      return false;
+    }
+
+    if (*pointer_type_value != "touch" && *pointer_type_value != "mouse" &&
+        *pointer_type_value != "pen") {
+      error_message_ = base::StringPrintf(
+          "action sequence pointer type %s is an unsupported input type",
+          (*pointer_type_value).c_str());
+      return false;
+    }
+    pointer_type = *pointer_type_value;
+  }
+
+  if (pointer_type_.empty()) {
+    pointer_type_ = pointer_type;
+  } else if (pointer_type_ != pointer_type) {
+    error_message_ = std::string(
+        "currently multiple action sequence pointer type are not "
+        "supported");
+    return false;
+  }
+
+  if (pointer_type != "touch" && input_source_count_ > 0) {
+    error_message_ = std::string(
+        "for input type of mouse and pen, we only support one device");
+    return false;
+  }
+
+  // TODO(lanwei): according to the Webdriver spec, "Let id be the result of
+  // getting the property id from action sequence.", we should move "id" from
+  // parameters dictionary to action sequence.
+  const std::string* pointer_name = action_sequence.FindStringKey("id");
+  if (!pointer_name) {
+    error_message_ = std::string("pointer name is not defined or not a string");
+    return false;
+  }
+
+  if (pointer_name_set_.find(*pointer_name) != pointer_name_set_.end()) {
+    error_message_ = std::string("pointer name already exists");
+    return false;
+  }
+
+  pointer_name_set_.insert(*pointer_name);
+  return true;
+}
+
+bool ActionsParser::ParseActionItemList(const base::Value& actions,
+                                        std::string source_type) {
+  DCHECK(source_type == "none" || source_type == source_type_);
   SyntheticPointerActionListParams::ParamList param_list;
   for (const auto& action : actions.GetList()) {
     if (!action.is_dict()) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions is missing or not a dictionary", action_index_);
+          "actions[%zu].actions is not defined or not a dictionary",
+          action_index_);
       return false;
-    } else if (!ParseAction(action, param_list, pointer_id)) {
+    } else if (!ParseAction(action, param_list, source_type)) {
       return false;
     }
   }
@@ -324,93 +383,136 @@
   if (param_list.size() > longest_action_sequence_)
     longest_action_sequence_ = param_list.size();
 
-  pointer_actions_list_.push_back(param_list);
+  pointer_actions_lists_.push_back(param_list);
   return true;
 }
 
 bool ActionsParser::ParseAction(
     const base::Value& action,
     SyntheticPointerActionListParams::ParamList& param_list,
-    int pointer_id) {
-  SyntheticPointerActionParams::PointerActionType pointer_action_type =
-      SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED;
-  std::string type;
-  const base::Value* type_key = action.FindKey("type");
-  if (type_key) {
-    if (!type_key->is_string()) {
+    std::string source_type) {
+  std::string subtype;
+  if (use_testdriver_api_) {
+    const std::string* type_value = action.FindStringKey("type");
+    if (!type_value) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions.name is missing or not a string", action_index_);
+          "actions[%zu].actions.type is not defined or not a string",
+          action_index_);
       return false;
     }
-    type = type_key->GetString();
+    subtype = *type_value;
   } else {
-    const std::string* name_key = action.FindStringKey("name");
-    if (!name_key) {
+    const std::string* name_value = action.FindStringKey("name");
+    if (!name_value) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions.name is missing or not a string", action_index_);
+          "actions[%zu].actions.name is not defined or not a string",
+          action_index_);
       return false;
     }
-    type = *name_key;
+    subtype = *name_value;
   }
 
-  pointer_action_type = ToSyntheticPointerActionType(type);
-  if (pointer_action_type ==
-      SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED) {
+  if (source_type == "wheel") {
+    return ParseWheelAction(action, subtype);
+  } else if (source_type == "pointer") {
+    return ParsePointerAction(action, subtype, param_list);
+  } else if (source_type == "none") {
+    return ParseNullAction(action, subtype, param_list);
+  } else {
+    NOTREACHED();
+  }
+  return false;
+}
+
+bool ActionsParser::ParseWheelAction(const base::Value& action,
+                                     std::string subtype) {
+  if (subtype == "pause") {
     error_message_ = base::StringPrintf(
-        "actions[%d].actions.name is an unsupported action name",
+        "actions[%zu].actions.type of pause is not supported now",
+        action_index_);
+    return false;
+  } else if (subtype != "scroll") {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.type is not scroll or pause when source type is "
+        "wheel",
         action_index_);
     return false;
   }
 
   double position_x = 0;
   double position_y = 0;
-  const base::Value* position_x_key = action.FindKey("x");
-  const base::Value* position_y_key = action.FindKey("y");
-  if (position_x_key) {
-    if (!position_x_key->is_int() && !position_x_key->is_double()) {
-      error_message_ = base::StringPrintf(
-          "actions[%d].actions.x is not a number", action_index_);
-      return false;
-    }
-    position_x = position_x_key->GetDouble();
+  if (!GetPosition(action, position_x, position_y))
+    return false;
+
+  int delta_x = 0;
+  int delta_y = 0;
+  if (!GetScrollDelta(action, delta_x, delta_y))
+    return false;
+
+  gesture_params_ = std::make_unique<SyntheticSmoothScrollGestureParams>();
+  SyntheticSmoothScrollGestureParams* scroll =
+      static_cast<SyntheticSmoothScrollGestureParams*>(gesture_params_.get());
+  scroll->gesture_source_type = SyntheticGestureParams::MOUSE_INPUT;
+  scroll->speed_in_pixels_s = 8000;
+  scroll->prevent_fling = true;
+  scroll->granularity = ui::ScrollGranularity::kScrollByPrecisePixel;
+  scroll->anchor.SetPoint(position_x, position_y);
+  scroll->fling_velocity_x = 0;
+  scroll->fling_velocity_y = 0;
+  scroll->distances.push_back(-gfx::Vector2dF(delta_x, delta_y));
+  scroll->modifiers = 0;
+  return true;
+}
+
+bool ActionsParser::ParsePointerAction(
+    const base::Value& action,
+    std::string subtype,
+    SyntheticPointerActionListParams::ParamList& param_list) {
+  double position_x = 0;
+  double position_y = 0;
+  if ((subtype == "pointerDown" || subtype == "pointerMove") &&
+      !GetPosition(action, position_x, position_y)) {
+    return false;
   }
 
-  if (position_y_key) {
-    if (!position_y_key->is_int() && !position_y_key->is_double()) {
-      error_message_ = base::StringPrintf(
-          "actions[%d].actions.y is not a number", action_index_);
-      return false;
-    }
-    position_y = position_y_key->GetDouble();
+  SyntheticPointerActionParams::PointerActionType pointer_action_type =
+      SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED;
+  pointer_action_type = ToSyntheticPointerActionType(subtype);
+  if (pointer_action_type ==
+      SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.name is an unsupported action name",
+        action_index_);
+    return false;
   }
 
   int button_id = 0;
-  const base::Value* button_id_key = action.FindKey("button");
-  if (button_id_key) {
-    if (!button_id_key->is_int()) {
+  const base::Value* button_id_value = action.FindKey("button");
+  if (button_id_value) {
+    if (!button_id_value->is_int()) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions.button is not a string", action_index_);
+          "actions[%zu].actions.button is not a string", action_index_);
       return false;
     }
-    button_id = button_id_key->GetInt();
+    button_id = button_id_value->GetInt();
   }
   if (button_id < 0 || button_id > 4) {
     error_message_ = base::StringPrintf(
-        "actions[%d].actions.button is an unsupported button", action_index_);
+        "actions[%zu].actions.button is an unsupported button", action_index_);
     return false;
   }
   SyntheticPointerActionParams::Button button =
       ToSyntheticMouseButton(button_id);
 
   std::string keys;
-  const base::Value* keys_key = action.FindKey("keys");
-  if (keys_key) {
-    if (!keys_key->is_string()) {
+  const base::Value* keys_value = action.FindKey("keys");
+  if (keys_value) {
+    if (!keys_value->is_string()) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions.key is not a string", action_index_);
+          "actions[%zu].actions.key is not a string", action_index_);
       return false;
     }
-    keys = keys_key->GetString();
+    keys = keys_value->GetString();
   }
 
   int key_modifiers = 0;
@@ -420,7 +522,7 @@
     int key_modifier = ToKeyModifiers(key);
     if (key_modifier == 0) {
       error_message_ = base::StringPrintf(
-          "actions[%d].actions.key is not a valid key", action_index_);
+          "actions[%zu].actions.key is not a valid key", action_index_);
       return false;
     }
     key_modifiers |= key_modifier;
@@ -428,28 +530,13 @@
 
   int duration = viz::BeginFrameArgs::DefaultInterval().InMilliseconds();
   if (pointer_action_type ==
-      SyntheticPointerActionParams::PointerActionType::IDLE) {
-    const base::Value* duration_key = action.FindKey("duration");
-    if (duration_key) {
-      if (!duration_key->is_double() && !duration_key->is_int()) {
-        error_message_ = base::StringPrintf(
-            "actions[%d].actions.duration is not a number", action_index_);
-        return false;
-      }
-      duration = duration_key->GetDouble();
-    }
-    if (duration < 0) {
-      error_message_ = base::StringPrintf(
-          "actions[%d].actions.duration should not be negative", action_index_);
-      return false;
-    }
+          SyntheticPointerActionParams::PointerActionType::IDLE &&
+      !GetPauseDuration(action, duration)) {
+    return false;
   }
 
   SyntheticPointerActionParams action_param(pointer_action_type);
-  if (pointer_id == -1)
-    action_param.set_pointer_id(action_index_);
-  else
-    action_param.set_pointer_id(pointer_id);
+  action_param.set_pointer_id(input_source_count_);
   switch (pointer_action_type) {
     case SyntheticPointerActionParams::PointerActionType::PRESS:
       action_param.set_position(gfx::PointF(position_x, position_y));
@@ -476,4 +563,98 @@
   return true;
 }
 
+bool ActionsParser::ParseNullAction(
+    const base::Value& action,
+    std::string subtype,
+    SyntheticPointerActionListParams::ParamList& param_list) {
+  SyntheticPointerActionParams::PointerActionType pointer_action_type =
+      SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED;
+  pointer_action_type = ToSyntheticPointerActionType(subtype);
+  if (pointer_action_type !=
+      SyntheticPointerActionParams::PointerActionType::IDLE) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.name should only be pause", action_index_);
+    return false;
+  }
+
+  int duration = viz::BeginFrameArgs::DefaultInterval().InMilliseconds();
+  if (!GetPauseDuration(action, duration))
+    return false;
+
+  SyntheticPointerActionParams action_param(pointer_action_type);
+  action_param.set_pointer_id(0);
+  action_param.set_duration(base::TimeDelta::FromMilliseconds(duration));
+  param_list.push_back(action_param);
+  return true;
+}
+
+bool ActionsParser::GetPosition(const base::Value& action,
+                                double& position_x,
+                                double& position_y) {
+  const base::Value* position_x_value = action.FindKey("x");
+  const base::Value* position_y_value = action.FindKey("y");
+  // TODO(lanwei): we should clarify the case when x or y is undefined in the
+  // WebDriver spec.
+  // https://www.w3.org/TR/webdriver/#dfn-process-a-pointer-move-action.
+  if (!position_x_value ||
+      (!position_x_value->is_int() && !position_x_value->is_double())) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.x is not defined or not a number", action_index_);
+    return false;
+  }
+  position_x = position_x_value->GetDouble();
+
+  if (!position_y_value ||
+      (!position_y_value->is_int() && !position_y_value->is_double())) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.y is not defined or not a number", action_index_);
+    return false;
+  }
+  position_y = position_y_value->GetDouble();
+  return true;
+}
+
+bool ActionsParser::GetScrollDelta(const base::Value& action,
+                                   int& delta_x,
+                                   int& delta_y) {
+  const base::Value* delta_x_value = action.FindKey("deltaX");
+  const base::Value* delta_y_value = action.FindKey("deltaY");
+  if (!delta_x_value || !delta_x_value->is_int()) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.delta_x is not defined or not an integer",
+        action_index_);
+    return false;
+  }
+  delta_x = delta_x_value->GetInt();
+
+  if (!delta_y_value || !delta_y_value->is_int()) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.delta_y is not defined or not an integer",
+        action_index_);
+    return false;
+  }
+  delta_y = delta_y_value->GetInt();
+  return true;
+}
+
+bool ActionsParser::GetPauseDuration(const base::Value& action, int& duration) {
+  const base::Value* duration_value = action.FindKey("duration");
+  // TODO(lanwei): we should always have a duration value for pause action.
+  if (duration_value) {
+    if (!duration_value->is_double() && !duration_value->is_int()) {
+      error_message_ = base::StringPrintf(
+          "actions[%zu].actions.duration is not a number", action_index_);
+      return false;
+    }
+    duration = duration_value->GetDouble();
+  }
+
+  if (duration < 0) {
+    error_message_ = base::StringPrintf(
+        "actions[%zu].actions.duration should not be negative", action_index_);
+    return false;
+  }
+  return true;
+}
+
 }  // namespace content
diff --git a/content/common/input/actions_parser.h b/content/common/input/actions_parser.h
index 4894ac69..3c2c9ed 100644
--- a/content/common/input/actions_parser.h
+++ b/content/common/input/actions_parser.h
@@ -17,39 +17,95 @@
 
 namespace content {
 
-// This class takes the argument of json format from
-// GpuBenchmarking::PointerActionSequence, parses it and warps
-// it into a SyntheticPointerActionListParams object.
+// This class takes the argument of JSON format from
+// gpuBenchmarking.pointerActionSequence and testdriver Action API.
+// gpuBenchmarking.pointerActionSequence is used in all the web tests, and
+// testdriver Action API is used in the WPT tests. We will eventually
+// transition to testdriver, so that the web tests and WPT tests will use
+// a unified way to inject user inputs.
+// Testdriver Action API is an implementation of Webdriver Action API
+// https://www.w3.org/TR/webdriver/#processing-actions.
+// TestDriver API input is a list of ActionSequences, each of which represents
+// a single device. Each action sequence has device-properties and a list of
+// ActionItems that define the action to take at each tick.
+// ActionSequenceList = [
+//   ActionSequence = {
+//      type:
+//      id:
+//      parameters:
+//      actions: [ ActionItem { type, duration, etc. }, * ]
+//   }, *
+// ]
+// gpuBenchmarking.pointerActionSequence takes a different JSON format, an
+// example can be found here in third_party/blink/web_tests/fast/events/
+// pointerevents/multi-pointer-event-in-slop-region.html.
+// This class parses the JSON string and warps it into a SyntehticGestureParams
+// object that can be used to inject input into Chrome.
 class CONTENT_EXPORT ActionsParser {
  public:
   explicit ActionsParser(base::Value value);
   ~ActionsParser();
-  bool ParsePointerActionSequence();
+  bool Parse();
   const std::string& error_message() const { return error_message_; }
-  const SyntheticPointerActionListParams& gesture_params() const {
-    return gesture_params_;
+  const SyntheticGestureParams& gesture_params() const {
+    return *gesture_params_.get();
   }
 
  private:
-  bool ParsePointerActions(const base::Value& pointer_actions, int index);
-  bool ParseActions(const base::Value& actions, int pointer_id);
+  bool ActionsDictionaryUsesTestDriverApi(const base::Value& action_sequence);
+  // For testdriver actions JSON format, please refer to Webdriver spec
+  // https://www.w3.org/TR/webdriver/#actions.
+  bool ParseTestDriverActionSequence(const base::Value& action_sequence);
+  bool ParseGpuBenchmarkingActionSequence(const base::Value& action_sequence);
+  bool ParseActionItemList(const base::Value& actions, std::string source_type);
   bool ParseAction(const base::Value& action,
                    SyntheticPointerActionListParams::ParamList& param_list,
-                   int pointer_id);
+                   std::string source_type);
+  bool ParsePointerParameters(const base::Value& action_sequence);
+  bool ParseWheelAction(const base::Value& action, std::string subtype);
+  bool ParsePointerAction(
+      const base::Value& action,
+      std::string subtype,
+      SyntheticPointerActionListParams::ParamList& param_list);
+  bool ParseNullAction(const base::Value& action,
+                       std::string subtype,
+                       SyntheticPointerActionListParams::ParamList& param_list);
+  bool GetPosition(const base::Value& action,
+                   double& position_x,
+                   double& position_y);
+  bool GetScrollDelta(const base::Value& action, int& delta_x, int& delta_y);
+  bool GetPauseDuration(const base::Value& action, int& duration);
 
-  SyntheticPointerActionListParams gesture_params_;
+  std::unique_ptr<SyntheticGestureParams> gesture_params_;
+  // This is a list of action sequence lists, which have all the actions for all
+  // pointers.
   std::vector<SyntheticPointerActionListParams::ParamList>
-      pointer_actions_list_;
-  size_t longest_action_sequence_;
+      pointer_actions_lists_;
+  size_t longest_action_sequence_ = 0;
+  // This is the index of every input source action sequence in the actions
+  // list.
+  size_t action_index_ = 0;
+  // This is the index of all the input source action sequences, whose type is
+  // not "none".
+  size_t input_source_count_ = 0;
+  // size_t pointer_count_ = 0;
+  // This is the input source type from testdriver Action API, such as "none",
+  // "key", "pointer" or "wheel". With TestDriver, if the |source_type_| is
+  // "pointer", we'll also set |pointer_type_| from the pointer parameters
+  // dictionary.
   std::string source_type_;
+  // This is the pointer type, such as "mouse", "touch" or "pen".
+  // For TestDriver format, this will be empty for |source_type_| other than
+  // "pointer".
   std::string pointer_type_;
   std::string error_message_;
 
-  base::Value pointer_actions_value_;
-  int action_index_;
-  std::set<int> pointer_id_set_;
+  // This indicates if we want to parse the action sequence JSON string from
+  // testdriver Action API or GpuBenchmarking::PointerActionSequence.
+  bool use_testdriver_api_ = false;
+
+  base::Value action_sequence_list_;
   std::set<std::string> pointer_name_set_;
-  bool use_testdriver_api_;
 
   DISALLOW_COPY_AND_ASSIGN(ActionsParser);
 };
diff --git a/content/common/input/actions_parser_test_driver_unittest.cc b/content/common/input/actions_parser_test_driver_unittest.cc
new file mode 100644
index 0000000..155e8d7a
--- /dev/null
+++ b/content/common/input/actions_parser_test_driver_unittest.cc
@@ -0,0 +1,440 @@
+// 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 "content/common/input/actions_parser.h"
+
+#include <utility>
+
+#include "base/json/json_reader.h"
+#include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+TEST(ActionsParserTestDriverTest, ParseMousePointerActionSequence) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 2, "y": 3,
+                             "button": 0},
+                            {"type": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_TRUE(actions_parser.Parse());
+  SyntheticPointerActionListParams action_list_params =
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
+  EXPECT_EQ(SyntheticGestureParams::MOUSE_INPUT,
+            action_list_params.gesture_source_type);
+  EXPECT_EQ(2U, action_list_params.params.size());
+  EXPECT_EQ(1U, action_list_params.params[0].size());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
+            action_list_params.params[0][0].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(2, 3), action_list_params.params[0][0].position());
+  EXPECT_EQ(SyntheticPointerActionParams::Button::LEFT,
+            action_list_params.params[0][0].button());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::RELEASE,
+            action_list_params.params[1][0].pointer_action_type());
+}
+
+TEST(ActionsParserTestDriverTest, ParseTouchPointerActionSequence) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3, "y": 5},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer1"},
+               {"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 10, "y": 10},
+                            {"type": "pointerMove", "x": 50, "y": 50},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer2"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_TRUE(actions_parser.Parse());
+  SyntheticPointerActionListParams action_list_params =
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
+  EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
+            action_list_params.gesture_source_type);
+  EXPECT_EQ(3U, action_list_params.params.size());
+  EXPECT_EQ(2U, action_list_params.params[0].size());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
+            action_list_params.params[0][0].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(3, 5), action_list_params.params[0][0].position());
+  EXPECT_EQ(0U, action_list_params.params[0][0].pointer_id());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
+            action_list_params.params[0][1].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(10, 10), action_list_params.params[0][1].position());
+  EXPECT_EQ(1U, action_list_params.params[0][1].pointer_id());
+}
+
+TEST(ActionsParserTestDriverTest, ParseTouchPointerActionSequenceWithPause) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3, "y": 5},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer1"},
+               {"type":"none",
+                "actions":[{"type":"pause", "duration":0},
+                           {"type":"pause", "duration":50},
+                           {"type":"pause", "duration":0}],
+                "id":"0"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_TRUE(actions_parser.Parse());
+  SyntheticPointerActionListParams action_list_params =
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
+  EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
+            action_list_params.gesture_source_type);
+  EXPECT_EQ(5U, action_list_params.params.size());
+  EXPECT_EQ(2U, action_list_params.params[0].size());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
+            action_list_params.params[0][0].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(3, 5), action_list_params.params[0][0].position());
+  EXPECT_EQ(0U, action_list_params.params[0][0].pointer_id());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[0][1].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::MOVE,
+            action_list_params.params[1][0].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(30, 30), action_list_params.params[1][0].position());
+  EXPECT_EQ(0U, action_list_params.params[1][0].pointer_id());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[1][1].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[2][0].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[2][1].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[3][0].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[3][1].pointer_action_type());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::RELEASE,
+            action_list_params.params[4][0].pointer_action_type());
+  EXPECT_EQ(0U, action_list_params.params[4][0].pointer_id());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+            action_list_params.params[4][1].pointer_action_type());
+}
+
+TEST(ActionsParserTestDriverTest, ParseTouchPointerActionSequenceIdNotString) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 0, "y": 0},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp"}],
+                "parameters": {"pointerType": "touch"},
+                "id": 1},
+               {"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 10, "y": 10},
+                            {"type": "pointerMove", "x": 50, "y": 50},
+                            {"type": "pointerUp"}],
+                "parameters": {"pointerType": "touch"},
+                "id": 2}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("pointer name is not defined or not a string",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseTouchPointerActionSequenceDuplicateId) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 0, "y": 0},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp"}],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer1"},
+               {"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 10, "y": 10},
+                            {"type": "pointerMove", "x": 50, "y": 50},
+                            {"type": "pointerUp"}],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("pointer name already exists", actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseMousePointerActionSequenceNoParameters) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 2, "y": 3,
+                             "button": 0},
+                            {"type": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}],
+                "id": "pointer1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_TRUE(actions_parser.Parse());
+  SyntheticPointerActionListParams action_list_params =
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
+  EXPECT_EQ(SyntheticGestureParams::MOUSE_INPUT,
+            action_list_params.gesture_source_type);
+  EXPECT_EQ(2U, action_list_params.params.size());
+  EXPECT_EQ(1U, action_list_params.params[0].size());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
+            action_list_params.params[0][0].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(2, 3), action_list_params.params[0][0].position());
+  EXPECT_EQ(SyntheticPointerActionParams::Button::LEFT,
+            action_list_params.params[0][0].button());
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::RELEASE,
+            action_list_params.params[1][0].pointer_action_type());
+}
+
+TEST(ActionsParserTestDriverTest,
+     ParseMousePointerActionSequenceNoPointerType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 2, "y": 3,
+                             "button": 0},
+                            {"type": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}],
+                "parameters": {},
+                "id": "pointer1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("action sequence pointer type is not defined or not a string",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseMousePointerActionSequenceNoAction) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer", "parameters": {"pointerType": "mouse"},
+                "id": "pointer1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("action_sequence[0].actions is not defined or not a list",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest,
+     ParseMousePointerActionSequenceUnsupportedButton) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 2, "y": 3,
+                             "button": -1},
+                            {"type": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("actions[0].actions.button is an unsupported button",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest,
+     ParseTouchPointerActionSequenceMultiActionsType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "key",
+                "actions": [{"type":"keyDown","value":"p"},
+                            {"type":"keyUp","value":"p"},
+                            {"type":"keyDown","value":"a"},
+                            {"type":"keyUp","value":"a"}],
+                "id": "1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("we do not support action sequence type of key",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest,
+     ParseTouchPointerActionSequenceMultiPointerType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3, "y": 5},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "touch"},
+                "id": "pointer1"},
+               {"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 10, "y": 10},
+                            {"type": "pointerMove", "x": 50, "y": 50},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("currently multiple action sequence pointer type are not supported",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseTouchPointerActionSequenceMultiMouse) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3, "y": 5},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"},
+               {"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 10, "y": 10},
+                            {"type": "pointerMove", "x": 50, "y": 50},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "mouse"},
+                "id": "2"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("for input type of mouse and pen, we only support one device",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollAction) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "wheel",
+                "actions": [{"type": "scroll", "x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 50}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_TRUE(actions_parser.Parse());
+  SyntheticSmoothScrollGestureParams scroll_gesture_params =
+      static_cast<const SyntheticSmoothScrollGestureParams&>(
+          actions_parser.gesture_params());
+  EXPECT_EQ(SyntheticGestureParams::MOUSE_INPUT,
+            scroll_gesture_params.gesture_source_type);
+  EXPECT_EQ(gfx::PointF(10, 10), scroll_gesture_params.anchor);
+  EXPECT_EQ(1U, scroll_gesture_params.distances.size());
+  EXPECT_EQ(-gfx::Vector2d(30, 50), scroll_gesture_params.distances[0]);
+  EXPECT_EQ(true, scroll_gesture_params.prevent_fling);
+  EXPECT_EQ(8000, scroll_gesture_params.speed_in_pixels_s);
+  EXPECT_EQ(0, scroll_gesture_params.fling_velocity_x);
+  EXPECT_EQ(0, scroll_gesture_params.fling_velocity_y);
+  EXPECT_EQ(ui::ScrollGranularity::kScrollByPrecisePixel,
+            scroll_gesture_params.granularity);
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollActionNoSourceType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{
+            "actions": [{"type": "scroll", "x": 10, "y": 10,
+                         "deltaX": 30, "deltaY": 50}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("source type is not defined or not a string",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollActionInvalidDelta) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "wheel",
+                "actions": [{"type": "scroll", "x": 10, "y": 10,
+                             "deltaX": 30.2, "deltaY": 50}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("actions[0].actions.delta_x is not defined or not an integer",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollNoActionType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "wheel",
+                "actions": [{"x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 50}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("actions[0].actions.type is not defined or not a string",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollInvalidActionType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "wheel",
+                "actions": [{"type": "zoom", "x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 30}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ(
+      "actions[0].actions.type is not scroll or pause when source type is "
+      "wheel",
+      actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseWheelScrollInvalidActionList) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "wheel",
+                "actions": [{"type": "scroll", "x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 50},
+                            {"type": "scroll", "x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 50}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ(
+      "action_sequence[0].actions should only have one action for the wheel "
+      "input source",
+      actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseMultiInputSource) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3, "y": 5},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" },
+                            {"type": "pause", "duration": 10 },
+                            {"type": "pause", "duration": 10 }],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"},
+               {"type": "key",
+                "actions": [{"type": "pause", "duration": 10 },
+                            {"type": "pause", "duration": 10 },
+                            {"type": "pause", "duration": 10 },
+                            {"type": "keyDown", "value": "a"},
+                            {"type": "keyUp", "value": "a"}],
+                "id": "2"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("currently multiple input source types are not supported",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseActionSequenceInvalidInputSourceType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "touchpad",
+                "actions": [{"type": "scroll", "x": 10, "y": 10,
+                             "deltaX": 30, "deltaY": 30}]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("the input source type touchpad is invalid",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTestDriverTest, ParseActionSequenceWithoutY) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"type": "pointer",
+                "actions": [{"type": "pointerDown", "x": 3},
+                            {"type": "pointerMove", "x": 30, "y": 30},
+                            {"type": "pointerUp" }],
+                "parameters": {"pointerType": "mouse"},
+                "id": "1"}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("actions[0].actions.y is not defined or not a number",
+            actions_parser.error_message());
+}
+
+}  // namespace content
diff --git a/content/common/input/actions_parser_unittest.cc b/content/common/input/actions_parser_unittest.cc
index 5479393..fa5a54a 100644
--- a/content/common/input/actions_parser_unittest.cc
+++ b/content/common/input/actions_parser_unittest.cc
@@ -13,18 +13,17 @@
 
 TEST(ActionsParserTest, ParseMousePointerActionSequence) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 2, "y": 3,
-                         "button": 0},
-                        {"type": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}],
-            "parameters": {"pointerType": "mouse"},
-            "id": "1"}] )");
+      R"JSON( [{"source": "mouse", "id": 0,
+                "actions": [{"name": "pointerDown", "x": 2, "y": 3,
+                             "button": 0},
+                            {"name": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
+  EXPECT_TRUE(actions_parser.Parse());
   SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
   EXPECT_EQ(SyntheticGestureParams::MOUSE_INPUT,
             action_list_params.gesture_source_type);
   EXPECT_EQ(2U, action_list_params.params.size());
@@ -38,25 +37,22 @@
             action_list_params.params[1][0].pointer_action_type());
 }
 
-TEST(ActionsParserTest, ParseTouchPointerActionSequence) {
+TEST(ActionsParserTest, ParseTouchPointerActionSequence1) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 3, "y": 5},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer1"},
-           {"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 10, "y": 10},
-                        {"type": "pointerMove", "x": 50, "y": 50},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer2"}] )");
+      R"JSON( [{"source": "touch", "id": 1,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5},
+                            {"name": "pointerMove", "x": 30, "y": 30},
+                            {"name": "pointerUp" } ]},
+               {"source": "touch", "id": 2,
+                "actions": [{"name": "pointerDown", "x": 10, "y": 10},
+                            {"name": "pointerMove", "x": 50, "y": 50},
+                            {"name": "pointerUp" } ]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
+  EXPECT_TRUE(actions_parser.Parse());
   SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
   EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
             action_list_params.gesture_source_type);
   EXPECT_EQ(3U, action_list_params.params.size());
@@ -71,459 +67,143 @@
   EXPECT_EQ(1U, action_list_params.params[0][1].pointer_id());
 }
 
-TEST(ActionsParserTest, ParseTouchPointerActionSequenceWithPause) {
+TEST(ActionsParserTest, ParseTouchPointerActionSequenceWithoutId) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 3, "y": 5},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer1"},
-           {"type":"none",
-            "actions":[{"type":"pause"},
-                       {"type":"pause","duration":50},
-                       {"type":"pause"}],
-            "id":"0"}] )");
+      R"JSON( [{"source": "touch", "id": 0,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5},
+                            {"name": "pointerMove", "x": 30, "y": 30},
+                            {"name": "pointerUp" } ]},
+               {"source": "touch", "id": 1,
+                "actions": [{"name": "pointerDown", "x": 10, "y": 10},
+                            {"name": "pointerMove", "x": 50, "y": 50},
+                            {"name": "pointerUp" } ]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
+  EXPECT_TRUE(actions_parser.Parse());
   SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
+      static_cast<const SyntheticPointerActionListParams&>(
+          actions_parser.gesture_params());
   EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
             action_list_params.gesture_source_type);
-  EXPECT_EQ(5U, action_list_params.params.size());
+  EXPECT_EQ(3U, action_list_params.params.size());
   EXPECT_EQ(2U, action_list_params.params[0].size());
   EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
             action_list_params.params[0][0].pointer_action_type());
   EXPECT_EQ(gfx::PointF(3, 5), action_list_params.params[0][0].position());
   EXPECT_EQ(0U, action_list_params.params[0][0].pointer_id());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
+  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
             action_list_params.params[0][1].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::MOVE,
-            action_list_params.params[1][0].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(30, 30), action_list_params.params[1][0].position());
-  EXPECT_EQ(0U, action_list_params.params[1][0].pointer_id());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[1][1].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[2][0].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[2][1].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[3][0].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[3][1].pointer_action_type());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::RELEASE,
-            action_list_params.params[4][0].pointer_action_type());
-  EXPECT_EQ(0U, action_list_params.params[4][0].pointer_id());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::IDLE,
-            action_list_params.params[4][1].pointer_action_type());
+  EXPECT_EQ(gfx::PointF(10, 10), action_list_params.params[0][1].position());
+  EXPECT_EQ(1U, action_list_params.params[0][1].pointer_id());
 }
 
-TEST(ActionsParserTest, ParseTouchPointerActionSequenceIdNotString) {
+TEST(ActionsParserTest, ParseMousePointerActionSequenceNoSource) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 0, "y": 0},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp"}],
-            "parameters": {"pointerType": "touch"},
-            "id": 1},
-           {"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 10, "y": 10},
-                        {"type": "pointerMove", "x": 50, "y": 50},
-                        {"type": "pointerUp"}],
-            "parameters": {"pointerType": "touch"},
-            "id": 2}] )");
+      R"JSON( [{"id": 0,
+                "actions": [{"name": "pointerDown", "x": 2, "y": 3,
+                             "button": 0},
+                            {"name": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer name is missing or not a string",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, ParseTouchPointerActionSequenceDuplicateId) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 0, "y": 0},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp"}],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer1"},
-           {"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 10, "y": 10},
-                        {"type": "pointerMove", "x": 50, "y": 50},
-                        {"type": "pointerUp"}],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer1"}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer name already exists", actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, ParseMousePointerActionSequenceNoParameters) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 2, "y": 3,
-                         "button": 0},
-                        {"type": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}],
-            "id": "pointer1"}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("action sequence parameters is missing for pointer type",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, ParseMousePointerActionSequenceNoPointerType) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 2, "y": 3,
-                         "button": 0},
-                        {"type": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}],
-            "parameters": {},
-            "id": "pointer1"}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("action sequence pointer type is missing or not a string",
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("source type is not defined or not a string",
             actions_parser.error_message());
 }
 
 TEST(ActionsParserTest, ParseMousePointerActionSequenceNoAction) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer", "parameters": {"pointerType": "mouse"},
-            "id": "pointer1"}] )");
+  base::Optional<base::Value> value =
+      base::JSONReader::Read(R"JSON( [{"source": "mouse", "id": 0}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer[0].actions is missing or not a list",
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("action_sequence[0].actions is not defined or not a list",
             actions_parser.error_message());
 }
 
 TEST(ActionsParserTest, ParseMousePointerActionSequenceUnsupportedButton) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 2, "y": 3,
-                         "button": -1},
-                        {"type": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}],
-            "parameters": {"pointerType": "mouse"},
-            "id": "1"}] )");
+      R"JSON( [{"source": "mouse", "id": 0,
+                "actions": [{"name": "pointerDown", "x": 2, "y": 3,
+                             "button": -1},
+                            {"name": "pointerUp", "x": 2, "y": 3,
+                             "button": 0}]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
+  EXPECT_FALSE(actions_parser.Parse());
   EXPECT_EQ("actions[0].actions.button is an unsupported button",
             actions_parser.error_message());
 }
 
-TEST(ActionsParserTest, ParseTouchPointerActionSequenceMultiActionsType) {
+TEST(ActionsParserTest, ParseTouchPointerActionSequenceMultiSource) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "key",
-            "actions": [{"type":"keyDown","value":"p"},
-                        {"type":"keyUp","value":"p"},
-                        {"type":"keyDown","value":"a"},
-                        {"type":"keyUp","value":"a"}],
-            "id": "1"}] )");
+      R"JSON( [{"source": "touch", "id": 1,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5},
+                            {"name": "pointerMove", "x": 30, "y": 30},
+                            {"name": "pointerUp" } ]},
+               {"source": "mouse", "id": 2,
+                "actions": [{"name": "pointerDown", "x": 10, "y": 10},
+                            {"name": "pointerMove", "x": 50, "y": 50},
+                            {"name": "pointerUp" } ]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("we do not support action sequence type of key",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, ParseTouchPointerActionSequenceMultiPointerType) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 3, "y": 5},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "touch"},
-            "id": "pointer1"},
-           {"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 10, "y": 10},
-                        {"type": "pointerMove", "x": 50, "y": 50},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "mouse"},
-            "id": "1"}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("currently multiple action sequence pointer type are not supported",
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("currently multiple input types are not not supported",
             actions_parser.error_message());
 }
 
 TEST(ActionsParserTest, ParseTouchPointerActionSequenceMultiMouse) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 3, "y": 5},
-                        {"type": "pointerMove", "x": 30, "y": 30},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "mouse"},
-            "id": "1"},
-           {"type": "pointer",
-            "actions": [{"type": "pointerDown", "x": 10, "y": 10},
-                        {"type": "pointerMove", "x": 50, "y": 50},
-                        {"type": "pointerUp" }],
-            "parameters": {"pointerType": "mouse"},
-            "id": "2"}] )");
+      R"JSON( [{"source": "mouse", "id": 1,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5},
+                            {"name": "pointerMove", "x": 30, "y": 30},
+                            {"name": "pointerUp" } ]},
+               {"source": "mouse", "id": 2,
+                "actions": [{"name": "pointerDown", "x": 10, "y": 10},
+                            {"name": "pointerMove", "x": 50, "y": 50},
+                            {"name": "pointerUp" } ]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("for input type of mouse and pen, we only support one device",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseMousePointerActionSequence) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "mouse", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 2, "y": 3,
-                         "button": 0},
-                        {"name": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
-  SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
-  EXPECT_EQ(SyntheticGestureParams::MOUSE_INPUT,
-            action_list_params.gesture_source_type);
-  EXPECT_EQ(2U, action_list_params.params.size());
-  EXPECT_EQ(1U, action_list_params.params[0].size());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
-            action_list_params.params[0][0].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(2, 3), action_list_params.params[0][0].position());
-  EXPECT_EQ(SyntheticPointerActionParams::Button::LEFT,
-            action_list_params.params[0][0].button());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::RELEASE,
-            action_list_params.params[1][0].pointer_action_type());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequence1) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": 1,
-            "actions": [{"name": "pointerDown", "x": 3, "y": 5},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": 2,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
-  SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
-  EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
-            action_list_params.gesture_source_type);
-  EXPECT_EQ(3U, action_list_params.params.size());
-  EXPECT_EQ(2U, action_list_params.params[0].size());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
-            action_list_params.params[0][0].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(3, 5), action_list_params.params[0][0].position());
-  EXPECT_EQ(1U, action_list_params.params[0][0].pointer_id());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
-            action_list_params.params[0][1].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(10, 10), action_list_params.params[0][1].position());
-  EXPECT_EQ(2U, action_list_params.params[0][1].pointer_id());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceWithoutId) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 3, "y": 5},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": 1,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_TRUE(actions_parser.ParsePointerActionSequence());
-  SyntheticPointerActionListParams action_list_params =
-      actions_parser.gesture_params();
-  EXPECT_EQ(SyntheticGestureParams::TOUCH_INPUT,
-            action_list_params.gesture_source_type);
-  EXPECT_EQ(3U, action_list_params.params.size());
-  EXPECT_EQ(2U, action_list_params.params[0].size());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
-            action_list_params.params[0][0].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(3, 5), action_list_params.params[0][0].position());
-  EXPECT_EQ(0U, action_list_params.params[0][0].pointer_id());
-  EXPECT_EQ(SyntheticPointerActionParams::PointerActionType::PRESS,
-            action_list_params.params[0][1].pointer_action_type());
-  EXPECT_EQ(gfx::PointF(10, 10), action_list_params.params[0][1].position());
-  EXPECT_EQ(1U, action_list_params.params[0][1].pointer_id());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceIdNotInt) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": "0",
-            "actions": [{"name": "pointerDown", "x": 0, "y": 0},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": "1",
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer id is not an integer", actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceIdNegative) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": -1,
-            "actions": [{"name": "pointerDown", "x": 0, "y": 0},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": -2,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer id can not be negative", actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceDuplicateId) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 0, "y": 0},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer id already exists", actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceNoId) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 0, "y": 0},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch",
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("this pointer does not have a pointer id",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceMissingId) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch",
-            "actions": [{"name": "pointerDown", "x": 0, "y": 0},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "touch", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("some pointers do not have a pointer id",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseMousePointerActionSequenceNoSource) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"id": 0, "actions": [{"name": "pointerDown", "x": 2, "y": 3,
-                                  "button": 0},
-                                 {"name": "pointerUp", "x": 2, "y": 3,
-                                  "button": 0}]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("source type is missing or not a string",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseMousePointerActionSequenceNoAction) {
-  base::Optional<base::Value> value =
-      base::JSONReader::Read(R"( [{"source": "mouse", "id": 0}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("pointer[0].actions is missing or not a list",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseMousePointerActionSequenceUnsupportedButton) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "mouse", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 2, "y": 3,
-                         "button": -1},
-                        {"name": "pointerUp", "x": 2, "y": 3,
-                         "button": 0}]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("actions[0].actions.button is an unsupported button",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceMultiSource) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "touch", "id": 1,
-            "actions": [{"name": "pointerDown", "x": 3, "y": 5},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "mouse", "id": 2,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
-  EXPECT_EQ("currently multiple input sources are not not supported",
-            actions_parser.error_message());
-}
-
-TEST(ActionsParserTest, OldParseTouchPointerActionSequenceMultiMouse) {
-  base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "mouse", "id": 1,
-            "actions": [{"name": "pointerDown", "x": 3, "y": 5},
-                        {"name": "pointerMove", "x": 30, "y": 30},
-                        {"name": "pointerUp" } ]},
-           {"source": "mouse", "id": 2,
-            "actions": [{"name": "pointerDown", "x": 10, "y": 10},
-                        {"name": "pointerMove", "x": 50, "y": 50},
-                        {"name": "pointerUp" } ]}] )");
-
-  ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
+  EXPECT_FALSE(actions_parser.Parse());
   EXPECT_EQ(
-      "for input source type of mouse and pen, we only support one device in "
-      "one sequence",
+      "for source type of mouse and pen, we only support one device in one "
+      "sequence",
       actions_parser.error_message());
 }
 
-TEST(ActionsParserTest, OldParsePointerActionSequenceInvalidKey) {
+TEST(ActionsParserTest, ParsePointerActionSequenceInvalidKey) {
   base::Optional<base::Value> value = base::JSONReader::Read(
-      R"( [{"source": "mouse", "id": 0,
-            "actions": [{"name": "pointerDown", "x": 3, "y": 5,
-                         "keys": "Ctrl"} ]}] )");
+      R"JSON( [{"source": "mouse", "id": 0,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5,
+                             "keys": "Ctrl"} ]}] )JSON");
 
   ActionsParser actions_parser(std::move(value.value()));
-  EXPECT_FALSE(actions_parser.ParsePointerActionSequence());
+  EXPECT_FALSE(actions_parser.Parse());
   EXPECT_EQ("actions[0].actions.key is not a valid key",
             actions_parser.error_message());
 }
 
+TEST(ActionsParserTest, ParsePointerActionSequenceEmptyActionList) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"source": "mouse", "id": 0,
+                "actions": []}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("action_sequence[0].actions is an empty list",
+            actions_parser.error_message());
+}
+
+TEST(ActionsParserTest, ParsePointerActionSequenceInvalidPointerType) {
+  base::Optional<base::Value> value = base::JSONReader::Read(
+      R"JSON( [{"source": "wheel", "id": 0,
+                "actions": [{"name": "pointerDown", "x": 3, "y": 5,
+                             "keys": "Ctrl"} ]}] )JSON");
+
+  ActionsParser actions_parser(std::move(value.value()));
+  EXPECT_FALSE(actions_parser.Parse());
+  EXPECT_EQ("source type wheel is an unsupported input type",
+            actions_parser.error_message());
+}
+
 }  // namespace content
diff --git a/content/public/android/java/src/org/chromium/content/browser/BindingManager.java b/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
index ea48379..25d4934 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
@@ -33,6 +33,7 @@
     // Delays used when clearing moderate binding pool when onSentToBackground happens.
     private static final long MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS = 10 * 1000;
 
+    private final boolean mBindWaiveCpu;
     private final Set<ChildProcessConnection> mConnections = new ArraySet<ChildProcessConnection>();
     // Can be -1 to mean no max size.
     private final int mMaxSize;
@@ -109,7 +110,7 @@
         if (connection == mWaivedConnection) {
             mWaivedConnection = null;
         } else {
-            connection.removeModerateBinding();
+            removeModerateBinding(connection);
         }
     }
 
@@ -121,11 +122,11 @@
         if (lowestRanked == mWaivedConnection) return;
         if (mWaivedConnection != null) {
             assert mConnections.contains(mWaivedConnection);
-            mWaivedConnection.addModerateBinding();
+            addModerateBinding(mWaivedConnection);
             mWaivedConnection = null;
         }
         if (!mConnections.contains(lowestRanked)) return;
-        lowestRanked.removeModerateBinding();
+        removeModerateBinding(lowestRanked);
         mWaivedConnection = lowestRanked;
     }
 
@@ -150,22 +151,26 @@
     /**
      * Construct instance without maxsize and can support arbitrary number of connections.
      */
-    BindingManager(Context context, Iterable<ChildProcessConnection> ranking) {
-        this(-1, ranking, context);
+    BindingManager(
+            Context context, Iterable<ChildProcessConnection> ranking, boolean bindWaiveCpu) {
+        this(-1, ranking, context, bindWaiveCpu);
     }
 
     /**
      * Construct instance with maxSize.
      */
-    BindingManager(Context context, int maxSize, Iterable<ChildProcessConnection> ranking) {
-        this(maxSize, ranking, context);
+    BindingManager(Context context, int maxSize, Iterable<ChildProcessConnection> ranking,
+            boolean bindWaiveCpu) {
+        this(maxSize, ranking, context, bindWaiveCpu);
         assert maxSize > 0;
     }
 
-    private BindingManager(int maxSize, Iterable<ChildProcessConnection> ranking, Context context) {
+    private BindingManager(int maxSize, Iterable<ChildProcessConnection> ranking, Context context,
+            boolean bindWaiveCpu) {
         assert LauncherThread.runningOnLauncherThread();
         Log.i(TAG, "Moderate binding enabled: maxSize=%d", maxSize);
 
+        mBindWaiveCpu = bindWaiveCpu;
         mMaxSize = maxSize;
         mRanking = ranking;
         assert mMaxSize > 0 || mMaxSize == -1;
@@ -195,7 +200,7 @@
         // Note that the size of connections is currently fairly small (40).
         // If it became bigger we should consider using an alternate data structure.
         boolean alreadyInQueue = !mConnections.add(connection);
-        if (!alreadyInQueue) connection.addModerateBinding();
+        if (!alreadyInQueue) addModerateBinding(connection);
         assert mMaxSize == -1 || mConnections.size() <= mMaxSize;
     }
 
@@ -211,4 +216,12 @@
     public void rankingChanged() {
         ensureLowestRankIsWaived();
     }
+
+    private void addModerateBinding(ChildProcessConnection connection) {
+        connection.addModerateBinding(mBindWaiveCpu);
+    }
+
+    private void removeModerateBinding(ChildProcessConnection connection) {
+        connection.removeModerateBinding(mBindWaiveCpu);
+    }
 }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
index cdff5c7..090c2fb66 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
@@ -315,11 +315,14 @@
             public void run() {
                 ChildConnectionAllocator allocator =
                         getConnectionAllocator(context, true /* sandboxed */);
+                boolean bindWaiveCpu = ContentFeatureList.isEnabled(
+                        ContentFeatureList.BINDING_MANAGEMENT_WAIVE_CPU);
                 if (ChildProcessConnection.supportVariableConnections()) {
-                    sBindingManager = new BindingManager(context, sSandboxedChildConnectionRanking);
+                    sBindingManager = new BindingManager(
+                            context, sSandboxedChildConnectionRanking, bindWaiveCpu);
                 } else {
                     sBindingManager = new BindingManager(context, allocator.getNumberOfServices(),
-                            sSandboxedChildConnectionRanking);
+                            sSandboxedChildConnectionRanking, bindWaiveCpu);
                 }
             }
         });
@@ -565,7 +568,7 @@
                     // Nothing to add.
                     break;
                 case ChildProcessImportance.MODERATE:
-                    connection.addModerateBinding();
+                    connection.addModerateBinding(false);
                     break;
                 case ChildProcessImportance.IMPORTANT:
                     connection.addStrongBinding();
@@ -590,7 +593,7 @@
                         // Nothing to remove.
                         break;
                     case ChildProcessImportance.MODERATE:
-                        connection.removeModerateBinding();
+                        connection.removeModerateBinding(false);
                         break;
                     case ChildProcessImportance.IMPORTANT:
                         connection.removeStrongBinding();
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
index 3918bb19..d14c71a 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -29,6 +29,8 @@
     public static final String BACKGROUND_MEDIA_RENDERER_HAS_MODERATE_BINDING =
             "BackgroundMediaRendererHasModerateBinding";
 
+    public static final String BINDING_MANAGEMENT_WAIVE_CPU = "BindingManagementWaiveCpu";
+
     public static final String EXPERIMENTAL_ACCESSIBILITY_LABELS =
             "ExperimentalAccessibilityLabels";
 
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java
index 3ce55f40..527626d 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherIntegrationTest.java
@@ -80,8 +80,8 @@
         }
 
         @Override
-        public void removeModerateBinding() {
-            super.removeModerateBinding();
+        public void removeModerateBinding(boolean waiveCpuPrority) {
+            super.removeModerateBinding(waiveCpuPrority);
             if (mRemovedBothModerateAndStrongBinding == null && !isStrongBindingBound()) {
                 mRemovedBothModerateAndStrongBinding =
                         new RuntimeException("removeModerateBinding");
diff --git a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
index 40522b0..b067336 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
@@ -50,7 +50,7 @@
         connection.start(false /* useStrongBinding */, null /* serviceCallback */);
         manager.addConnection(connection);
         iterable.add(connection);
-        connection.removeModerateBinding(); // Remove initial binding.
+        connection.removeModerateBinding(false); // Remove initial binding.
         return connection;
     }
 
@@ -69,8 +69,8 @@
         LauncherThread.setCurrentThreadAsLauncherThread();
         mActivity = Robolectric.buildActivity(Activity.class).setup().get();
         mIterable = new ArrayList<>();
-        mManager = new BindingManager(mActivity, 4, mIterable);
-        mVariableManager = new BindingManager(mActivity, mIterable);
+        mManager = new BindingManager(mActivity, 4, mIterable, false);
+        mVariableManager = new BindingManager(mActivity, mIterable, false);
     }
 
     @After
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 504557e..133b81c 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -529,10 +529,6 @@
     ]
   }
 
-  if (is_win) {
-    sources += [ "ax_inspect_factory_win.cc" ]
-  }
-
   if (use_atk) {
     sources += [ "ax_inspect_factory_auralinux.cc" ]
   }
diff --git a/content/public/browser/ax_inspect_factory_win.cc b/content/public/browser/ax_inspect_factory_win.cc
deleted file mode 100644
index 87232c9e..0000000
--- a/content/public/browser/ax_inspect_factory_win.cc
+++ /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.
-
-#include "content/public/browser/ax_inspect_factory.h"
-
-#include "base/notreached.h"
-#include "base/win/com_init_util.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_uia_win.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_win.h"
-
-namespace content {
-
-// static
-std::unique_ptr<ui::AXTreeFormatter>
-AXInspectFactory::CreatePlatformFormatter() {
-  return CreateFormatter(kWinIA2);
-}
-
-// static
-std::unique_ptr<ui::AXTreeFormatter> AXInspectFactory::CreateFormatter(
-    AXInspectFactory::Type type) {
-  switch (type) {
-    case kBlink:
-      return std::make_unique<AccessibilityTreeFormatterBlink>();
-    case kWinIA2:
-      base::win::AssertComInitialized();
-      return std::make_unique<AccessibilityTreeFormatterWin>();
-    case kWinUIA:
-      base::win::AssertComInitialized();
-      return std::make_unique<AccessibilityTreeFormatterUia>();
-    default:
-      NOTREACHED() << "Unsupported formatter type " << type;
-  }
-  return nullptr;
-}
-
-}  // namespace content
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index a152372..adc83e8 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -1138,7 +1138,7 @@
 
 bool ContentBrowserClient::ShouldAllowInsecurePrivateNetworkRequests(
     BrowserContext* browser_context,
-    const GURL& url) {
+    const url::Origin& origin) {
   return false;
 }
 
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 6daed83..b5796830 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -1935,17 +1935,17 @@
   virtual bool ShouldInheritCrossOriginEmbedderPolicyImplicitly(
       const GURL& url);
 
-  // Returns whether a context whose URL is |url| should be allowed to make
+  // Returns whether a context with the given |origin| should be allowed to make
   // insecure private network requests.
   //
   // See the CORS-RFC1918 spec for more details:
   // https://wicg.github.io/cors-rfc1918.
   //
   // |browser_context| must not be nullptr. Caller retains ownership.
-  // |url| is the URL of a navigation ready to commit.
+  // |origin| is the origin of a navigation ready to commit.
   virtual bool ShouldAllowInsecurePrivateNetworkRequests(
       BrowserContext* browser_context,
-      const GURL& url);
+      const url::Origin& origin);
 
   // Returns the URL-Keyed Metrics service for chrome:ukm.
   virtual ukm::UkmService* GetUkmService();
diff --git a/content/public/browser/speech_recognition_session_context.h b/content/public/browser/speech_recognition_session_context.h
index b2bf6e0..09b844c 100644
--- a/content/public/browser/speech_recognition_session_context.h
+++ b/content/public/browser/speech_recognition_session_context.h
@@ -10,6 +10,7 @@
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 #include "ui/gfx/geometry/rect.h"
+#include "url/gurl.h"
 #include "url/origin.h"
 
 namespace content {
@@ -44,6 +45,9 @@
 
   // A list of devices being used by the recognition session.
   blink::MediaStreamDevices devices;
+
+  // TODO(https://crbug.com/1140187): temporary while tracking down bug.
+  GURL url;
 };
 
 }  // namespace content
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 11daa580..a473fa3 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -90,10 +90,21 @@
 // from a less-private network may only target a more-private network if the
 // initiating context is secure.
 //
-// https://wicg.github.io/cors-rfc1918/#integration-fetch
+// See also:
+//  - https://wicg.github.io/cors-rfc1918/#integration-fetch
+//  - kBlockInsecurePrivateNetworkRequestsForNavigations
 const base::Feature kBlockInsecurePrivateNetworkRequests{
     "BlockInsecurePrivateNetworkRequests", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// When both kBlockInsecurePrivateNetworkRequestsForNavigations and
+// kBlockInsecurePrivateNetworkRequests are enabled, navigations initiated
+// by documents in a less-private network may only target a more-private network
+// if the initiating context is secure.
+const base::Feature kBlockInsecurePrivateNetworkRequestsForNavigations{
+    "BlockInsecurePrivateNetworkRequestsForNavigations",
+    base::FEATURE_DISABLED_BY_DEFAULT,
+};
+
 // Use ThreadPriority::DISPLAY for browser UI and IO threads.
 #if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH)
 const base::Feature kBrowserUseDisplayThreadPriority{
@@ -873,6 +884,11 @@
     "BackgroundMediaRendererHasModerateBinding",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, BindingManager will use Context.BIND_NOT_FOREGROUND to avoid
+// affecting cpu scheduling priority.
+const base::Feature kBindingManagementWaiveCpu{
+    "BindingManagementWaiveCpu", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Screen Capture API support for Android
 const base::Feature kUserMediaScreenCapturing{
     "UserMediaScreenCapturing", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 272e6d30..70a65f52 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -28,6 +28,8 @@
 CONTENT_EXPORT extern const base::Feature kBackForwardCacheMemoryControl;
 CONTENT_EXPORT extern const base::Feature kBlockCredentialedSubresources;
 CONTENT_EXPORT extern const base::Feature kBlockInsecurePrivateNetworkRequests;
+CONTENT_EXPORT extern const base::Feature
+    kBlockInsecurePrivateNetworkRequestsForNavigations;
 CONTENT_EXPORT extern const base::Feature kBrowserUseDisplayThreadPriority;
 CONTENT_EXPORT extern const base::Feature
     kBrowserVerifiedUserActivationKeyboard;
@@ -200,6 +202,7 @@
 CONTENT_EXPORT extern const base::Feature kAndroidAutofillAccessibility;
 CONTENT_EXPORT extern const base::Feature
     kBackgroundMediaRendererHasModerateBinding;
+CONTENT_EXPORT extern const base::Feature kBindingManagementWaiveCpu;
 CONTENT_EXPORT extern const base::Feature kUserMediaScreenCapturing;
 CONTENT_EXPORT extern const base::Feature kWarmUpNetworkProcess;
 CONTENT_EXPORT extern const base::Feature kWebNfc;
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 4d26731..ccd103c 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -372,7 +372,7 @@
 // also applys to workers.
 const char kEnablePreciseMemoryInfo[] = "enable-precise-memory-info";
 
-// Set options to cache V8 data. (off, preparse data, or code)
+// Set options to cache V8 data. (none, code, or default)
 const char kV8CacheOptions[] = "v8-cache-options";
 
 // If true the ServiceProcessLauncher is used to launch services. This allows
diff --git a/content/renderer/gpu_benchmarking_extension.cc b/content/renderer/gpu_benchmarking_extension.cc
index cd72fbb4..f56994e 100644
--- a/content/renderer/gpu_benchmarking_extension.cc
+++ b/content/renderer/gpu_benchmarking_extension.cc
@@ -1195,7 +1195,7 @@
   // SyntheticPointerActionListParams object.
   ActionsParser actions_parser(
       base::Value::FromUniquePtrValue(std::move(value)));
-  if (!actions_parser.ParsePointerActionSequence()) {
+  if (!actions_parser.Parse()) {
     // TODO(dtapuska): Throw an error here, some web tests start
     // failing when this is done though.
     // args->ThrowTypeError(actions_parser.error_message());
@@ -1212,10 +1212,22 @@
       new CallbackAndContext(args->isolate(), callback,
                              context.web_frame()->MainWorldScriptContext());
   EnsureRemoteInterface();
-  input_injector_->QueueSyntheticPointerAction(
-      actions_parser.gesture_params(),
-      base::BindOnce(&OnSyntheticGestureCompleted,
-                     base::RetainedRef(callback_and_context)));
+  if (actions_parser.gesture_params().GetGestureType() ==
+      SyntheticGestureParams::SMOOTH_SCROLL_GESTURE) {
+    input_injector_->QueueSyntheticSmoothScroll(
+        static_cast<const SyntheticSmoothScrollGestureParams&>(
+            actions_parser.gesture_params()),
+        base::BindOnce(&OnSyntheticGestureCompleted,
+                       base::RetainedRef(callback_and_context)));
+  } else {
+    DCHECK(actions_parser.gesture_params().GetGestureType() ==
+           SyntheticGestureParams::POINTER_ACTION_LIST);
+    input_injector_->QueueSyntheticPointerAction(
+        static_cast<const SyntheticPointerActionListParams&>(
+            actions_parser.gesture_params()),
+        base::BindOnce(&OnSyntheticGestureCompleted,
+                       base::RetainedRef(callback_and_context)));
+  }
   return true;
 }
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index b99bb849..a52fcdf 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4441,17 +4441,6 @@
   Send(new FrameHostMsg_ContextMenu(routing_id_, params));
 }
 
-void RenderFrameImpl::FrameRectsChanged(const gfx::Rect& frame_rect) {
-  // To limit the number of IPCs, only notify the browser when the rect's size
-  // changes, not when the position changes. The size needs to be replicated if
-  // the iframe goes out-of-process.
-  gfx::Size frame_size = frame_rect.size();
-  if (!frame_size_ || *frame_size_ != frame_size) {
-    frame_size_ = frame_size;
-    GetFrameHost()->FrameSizeChanged(frame_size);
-  }
-}
-
 void RenderFrameImpl::OnMainFrameIntersectionChanged(
     const gfx::Rect& mainframe_intersection_rect) {
   if (!mainframe_intersection_rect_ ||
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 04f6f3e4..9d100f04 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -573,7 +573,6 @@
   void ShowContextMenu(
       const blink::ContextMenuData& data,
       const base::Optional<gfx::Point>& host_context_menu_location) override;
-  void FrameRectsChanged(const gfx::Rect& frame_rect) override;
   void FocusedElementChanged(const blink::WebElement& element) override;
   void OnMainFrameIntersectionChanged(const gfx::Rect& intersect_rect) override;
   void WillSendRequest(blink::WebURLRequest& request,
@@ -1415,10 +1414,6 @@
   // use inside of Blink.
   std::unique_ptr<blink::WebComputedAXTree> computed_ax_tree_;
 
-  // Used for tracking the frame's size and replicating it to the browser
-  // process when it changes.
-  base::Optional<gfx::Size> frame_size_;
-
   // Used for tracking a frame's main frame document intersection and
   // and replicating it to the browser when it changes.
   base::Optional<gfx::Rect> mainframe_intersection_rect_;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index bcd4e53..62c54d7 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -619,10 +619,6 @@
   return true;
 }
 
-blink::WebString RenderViewImpl::AcceptLanguages() {
-  return WebString::FromUTF8(GetRendererPreferences().accept_languages);
-}
-
 // RenderView implementation ---------------------------------------------------
 
 bool RenderViewImpl::Send(IPC::Message* message) {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index c860de18..56374d4 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -178,7 +178,6 @@
   bool AcceptsLoadDrops() override;
   bool CanUpdateLayout() override;
   void DidUpdateMainFrameLayout() override;
-  blink::WebString AcceptLanguages() override;
   int HistoryBackListCount() override;
   int HistoryForwardListCount() override;
   void OnPageVisibilityChanged(PageVisibilityState visibility) override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 9652eb6..2fa7857 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2082,6 +2082,7 @@
     "../common/cursors/webcursor_unittest.cc",
     "../common/fetch/fetch_api_request_proto_unittest.cc",
     "../common/font_list_unittest.cc",
+    "../common/input/actions_parser_test_driver_unittest.cc",
     "../common/input/actions_parser_unittest.cc",
     "../common/input/event_with_latency_info_unittest.cc",
     "../common/input/gesture_event_stream_validator_unittest.cc",
diff --git a/content/test/data/forms/form_controls_browsertest_input.png b/content/test/data/forms/form_controls_browsertest_input.png
new file mode 100644
index 0000000..5b26c7d3
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_input.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_input_android.png b/content/test/data/forms/form_controls_browsertest_input_android.png
new file mode 100644
index 0000000..54cb91bf
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_input_android.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_input_mac.png b/content/test/data/forms/form_controls_browsertest_input_mac.png
new file mode 100644
index 0000000..a58c8f14
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_input_mac.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_input_win.png b/content/test/data/forms/form_controls_browsertest_input_win.png
new file mode 100644
index 0000000..a58c8f14
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_input_win.png
Binary files differ
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index a053c1a68..aab7dc9 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -193,8 +193,6 @@
 
   void UpdateEncoding(const std::string& encoding_name) override {}
 
-  void FrameSizeChanged(const gfx::Size& frame_size) override {}
-
   void UpdateState(const blink::PageState& state) override {
     is_page_state_updated_ = true;
   }
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc
index d3e3fbb8..02aeb045 100644
--- a/content/web_test/renderer/test_runner.cc
+++ b/content/web_test/renderer/test_runner.cc
@@ -2894,8 +2894,12 @@
   web_test_runtime_flags_.set_accept_languages(accept_languages);
   OnWebTestRuntimeFlagsChanged();
 
-  for (WebViewTestProxy* view : render_views_)
-    view->GetWebView()->AcceptLanguagesChanged();
+  for (WebViewTestProxy* view : render_views_) {
+    blink::RendererPreferences prefs =
+        view->GetWebView()->GetRendererPreferences();
+    prefs.accept_languages = accept_languages;
+    view->GetWebView()->SetRendererPreferences(prefs);
+  }
 }
 
 void TestRunner::DumpEditingCallbacks() {
diff --git a/content/web_test/renderer/web_view_test_proxy.cc b/content/web_test/renderer/web_view_test_proxy.cc
index 0f34f25..6fcac85 100644
--- a/content/web_test/renderer/web_view_test_proxy.cc
+++ b/content/web_test/renderer/web_view_test_proxy.cc
@@ -74,10 +74,6 @@
   frame->PrintEnd();
 }
 
-blink::WebString WebViewTestProxy::AcceptLanguages() {
-  return blink::WebString::FromUTF8(test_runner_->GetAcceptLanguages());
-}
-
 void WebViewTestProxy::Reset() {
   accessibility_controller_.Reset();
   // |text_input_controller_| doesn't have any state to reset.
diff --git a/content/web_test/renderer/web_view_test_proxy.h b/content/web_test/renderer/web_view_test_proxy.h
index 1235c57..af9922ec 100644
--- a/content/web_test/renderer/web_view_test_proxy.h
+++ b/content/web_test/renderer/web_view_test_proxy.h
@@ -73,7 +73,6 @@
       bool& consumed_user_gesture,
       const base::Optional<blink::WebImpression>& impression) override;
   void PrintPage(blink::WebLocalFrame* frame) override;
-  blink::WebString AcceptLanguages() override;
 
   TestRunner* GetTestRunner() { return test_runner_; }
   AccessibilityController* accessibility_controller() {
diff --git a/device/fido/cable/cable_discovery_data.cc b/device/fido/cable/cable_discovery_data.cc
index b5da2a06..7d44d2e 100644
--- a/device/fido/cable/cable_discovery_data.cc
+++ b/device/fido/cable/cable_discovery_data.cc
@@ -94,7 +94,7 @@
       map.find(cbor::Value(5));
   if (name_it == map.end() || !name_it->second.is_string() ||
       std::any_of(
-          &its[0], &its[its.size()],
+          its.begin(), its.end(),
           [&map](const cbor::Value::MapValue::const_iterator& it) -> bool {
             return it == map.end() || !it->second.is_bytestring();
           }) ||
diff --git a/device/fido/hid/fido_hid_device_unittest.cc b/device/fido/hid/fido_hid_device_unittest.cc
index 4c9c2e74..5fc89302 100644
--- a/device/fido/hid/fido_hid_device_unittest.cc
+++ b/device/fido/hid/fido_hid_device_unittest.cc
@@ -151,7 +151,8 @@
   EXPECT_CALL(*mock_connection, ReadPtr(_))
       .InSequence(sequence)
       // Response to HID_INIT request.
-      .WillOnce(Invoke([&](device::mojom::HidConnection::ReadCallback* cb) {
+      .WillOnce(Invoke([mock_connection = mock_connection.get()](
+                           device::mojom::HidConnection::ReadCallback* cb) {
         std::move(*cb).Run(
             true, 0,
             CreateMockInitResponse(mock_connection->nonce(),
diff --git a/device/vr/android/arcore/arcore_gl.cc b/device/vr/android/arcore/arcore_gl.cc
index b346b0b..c62fb21 100644
--- a/device/vr/android/arcore/arcore_gl.cc
+++ b/device/vr/android/arcore/arcore_gl.cc
@@ -235,19 +235,12 @@
   DCHECK(IsOnGlThread());
   DCHECK(!is_initialized_);
 
-  // We can only share native GL resources with GVR, and GVR doesn't support
-  // ANGLE, so disable it.
-  // TODO(crbug.com/1170580): support ANGLE with cardboard?
-  gl::init::DisableANGLE();
-
   if (gl::GetGLImplementation() == gl::kGLImplementationNone &&
       !gl::init::InitializeGLOneOff()) {
     DLOG(ERROR) << "gl::init::InitializeGLOneOff failed";
     return false;
   }
 
-  DCHECK(gl::GetGLImplementation() != gl::kGLImplementationEGLANGLE);
-
   scoped_refptr<gl::GLSurface> surface =
       gl::init::CreateViewGLSurface(drawing_widget);
   DVLOG(3) << "surface=" << surface.get();
diff --git a/extensions/browser/renderer_startup_helper.cc b/extensions/browser/renderer_startup_helper.cc
index 9167c25..ef71952 100644
--- a/extensions/browser/renderer_startup_helper.cc
+++ b/extensions/browser/renderer_startup_helper.cc
@@ -131,8 +131,8 @@
 
   // Scripting allowlist. This is modified by tests and must be communicated
   // to renderers.
-  process->Send(new ExtensionMsg_SetScriptingAllowlist(
-      extensions::ExtensionsClient::Get()->GetScriptingAllowlist()));
+  renderer->SetScriptingAllowlist(
+      extensions::ExtensionsClient::Get()->GetScriptingAllowlist());
 
   // If the new render process is a WebView guest process, propagate the WebView
   // partition ID to it.
diff --git a/extensions/browser/renderer_startup_helper_unittest.cc b/extensions/browser/renderer_startup_helper_unittest.cc
index 9ef927c..9df5479 100644
--- a/extensions/browser/renderer_startup_helper_unittest.cc
+++ b/extensions/browser/renderer_startup_helper_unittest.cc
@@ -59,6 +59,9 @@
 
   void SetWebViewPartitionID(const std::string& partition_id) override {}
 
+  void SetScriptingAllowlist(
+      const std::vector<std::string>& extension_ids) override {}
+
   std::vector<std::string> activated_extensions_;
   std::vector<std::string> unloaded_extensions_;
   mojo::AssociatedReceiverSet<mojom::Renderer> receivers_;
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index 62a93fa3..bf124b1 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -301,6 +301,7 @@
       "chrome://os-settings/*",
       "chrome://settings/*",
       "chrome://sync-confirmation/*",
+      "chrome://read-later.top-chrome/*",
       "chrome://tab-search.top-chrome/*",
       "chrome://tab-strip/*",
       "chrome://welcome/*",
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h
index 17bb559..bb327d2 100644
--- a/extensions/common/extension_messages.h
+++ b/extensions/common/extension_messages.h
@@ -572,12 +572,6 @@
 IPC_MESSAGE_CONTROL1(ExtensionMsg_Loaded,
                      std::vector<ExtensionMsg_Loaded_Params>)
 
-// Updates the scripting allowlist for extensions in the render process. This is
-// only used for testing.
-IPC_MESSAGE_CONTROL1(ExtensionMsg_SetScriptingAllowlist,
-                     // extension ids
-                     extensions::ExtensionsClient::ScriptingAllowlist)
-
 // Notification that renderer should run some JavaScript code.
 IPC_MESSAGE_ROUTED1(ExtensionMsg_ExecuteCode,
                     ExtensionMsg_ExecuteCode_Params)
diff --git a/extensions/common/mojom/renderer.mojom b/extensions/common/mojom/renderer.mojom
index 273d828..f6e0c49 100644
--- a/extensions/common/mojom/renderer.mojom
+++ b/extensions/common/mojom/renderer.mojom
@@ -36,4 +36,8 @@
 
   // Reports the WebView partition ID to the WebView guest renderer process.
   SetWebViewPartitionID(string partition_id);
+
+  // Updates the scripting allowlist for extensions in the render process. This
+  // is only used for testing.
+  SetScriptingAllowlist(array<string> extension_ids);
 };
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index ecc7688..fcf14c4 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -874,8 +874,6 @@
   IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnLoaded)
   IPC_MESSAGE_HANDLER(ExtensionMsg_MessageInvoke, OnMessageInvoke)
   IPC_MESSAGE_HANDLER(ExtensionMsg_DispatchEvent, OnDispatchEvent)
-  IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingAllowlist,
-                      OnSetScriptingAllowlist)
   IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldSuspend, OnShouldSuspend)
   IPC_MESSAGE_HANDLER(ExtensionMsg_Suspend, OnSuspend)
   IPC_MESSAGE_HANDLER(ExtensionMsg_TransferBlobs, OnTransferBlobs)
@@ -1018,6 +1016,11 @@
   webview_partition_id_ = partition_id;
 }
 
+void Dispatcher::SetScriptingAllowlist(
+    const std::vector<std::string>& extension_ids) {
+  ExtensionsClient::Get()->SetScriptingAllowlist(extension_ids);
+}
+
 void Dispatcher::OnCancelSuspend(const std::string& extension_id) {
   DispatchEvent(extension_id, kOnSuspendCanceledEvent, base::ListValue(),
                 nullptr);
@@ -1184,11 +1187,6 @@
       blink::WebString::FromUTF8(extensions::kExtensionScheme));
 }
 
-void Dispatcher::OnSetScriptingAllowlist(
-    const ExtensionsClient::ScriptingAllowlist& extension_ids) {
-  ExtensionsClient::Get()->SetScriptingAllowlist(extension_ids);
-}
-
 void Dispatcher::OnShouldSuspend(const std::string& extension_id,
                                  uint64_t sequence_id) {
   RenderThread::Get()->Send(
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h
index a784c3f..4bb93df 100644
--- a/extensions/renderer/dispatcher.h
+++ b/extensions/renderer/dispatcher.h
@@ -223,6 +223,8 @@
   void SetSystemFont(const std::string& font_family,
                      const std::string& font_size) override;
   void SetWebViewPartitionID(const std::string& partition_id) override;
+  void SetScriptingAllowlist(
+      const std::vector<std::string>& extension_ids) override;
   void OnRendererAssociatedRequest(
       mojo::PendingAssociatedReceiver<mojom::Renderer> receiver);
   void OnCancelSuspend(const std::string& extension_id);
@@ -245,8 +247,6 @@
                        const base::ListValue& args);
   void OnDispatchEvent(const ExtensionMsg_DispatchEvent_Params& params,
                        const base::ListValue& event_args);
-  void OnSetScriptingAllowlist(
-      const ExtensionsClient::ScriptingAllowlist& extension_ids);
   void OnShouldSuspend(const std::string& extension_id, uint64_t sequence_id);
   void OnSuspend(const std::string& extension_id);
   void OnTransferBlobs(const std::vector<std::string>& blob_uuids);
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 9e8cc78..ee24d43 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -47,6 +47,10 @@
 const base::Feature kAndroidSurfaceControl{"AndroidSurfaceControl",
                                            base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Hardware Overlays for WebView.
+const base::Feature kWebViewSurfaceControl{"WebViewSurfaceControl",
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Use AImageReader for MediaCodec and MediaPlyer on android.
 const base::Feature kAImageReader{"AImageReader",
                                   base::FEATURE_ENABLED_BY_DEFAULT};
@@ -210,9 +214,19 @@
 }
 
 bool IsAndroidSurfaceControlEnabled() {
-  return IsAImageReaderEnabled() &&
-         base::FeatureList::IsEnabled(kAndroidSurfaceControl) &&
-         gfx::SurfaceControl::IsSupported();
+  if (!gfx::SurfaceControl::IsSupported())
+    return false;
+
+  // We can use surface control only with AImageReader.
+  if (!IsAImageReaderEnabled())
+    return false;
+
+  // On WebView we also require zero copy to use SurfaceControl
+  if (IsWebViewZeroCopyVideoEnabled() &&
+      base::FeatureList::IsEnabled(kWebViewSurfaceControl))
+    return true;
+
+  return base::FeatureList::IsEnabled(kAndroidSurfaceControl);
 }
 
 // Many devices do not support more than 1 image to be acquired from the
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h
index ddfd223a..06cb3730 100644
--- a/gpu/config/gpu_finch_features.h
+++ b/gpu/config/gpu_finch_features.h
@@ -19,6 +19,7 @@
 #if defined(OS_ANDROID)
 GPU_EXPORT extern const base::Feature kUseGles2ForOopR;
 GPU_EXPORT extern const base::Feature kAndroidSurfaceControl;
+GPU_EXPORT extern const base::Feature kWebViewSurfaceControl;
 GPU_EXPORT extern const base::Feature kAImageReader;
 GPU_EXPORT extern const base::Feature kWebViewVulkan;
 GPU_EXPORT extern const base::Feature kLimitAImageReaderMaxSizeToOne;
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 3973795..fcb2350 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -416,14 +416,9 @@
 
   // Compute passthrough decoder status before ComputeGpuFeatureInfo below.
   // Do this after GL is initialized so extensions can be queried.
-  if (gles2::UsePassthroughCommandDecoder(command_line)) {
-    gpu_info_.passthrough_cmd_decoder =
-        gles2::PassthroughCommandDecoderSupported();
-    LOG_IF(DFATAL, !gpu_info_.passthrough_cmd_decoder)
-        << "Passthrough is not supported";
-  } else {
-    gpu_info_.passthrough_cmd_decoder = false;
-  }
+  gpu_info_.passthrough_cmd_decoder =
+      gles2::UsePassthroughCommandDecoder(command_line) &&
+      gles2::PassthroughCommandDecoderSupported();
 
   // We need to collect GL strings (VENDOR, RENDERER) for blocklisting purposes.
   if (!gl_disabled) {
diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc
index af0460d..752d6af5 100644
--- a/headless/app/headless_shell.cc
+++ b/headless/app/headless_shell.cc
@@ -51,7 +51,6 @@
 #include "ui/gfx/geometry/size.h"
 
 #if defined(OS_WIN)
-#include <base/win/windows_types.h>
 #include "components/crash/core/app/crash_switches.h"
 #include "components/crash/core/app/run_as_crashpad_handler_win.h"
 #include "sandbox/win/src/sandbox_types.h"
@@ -839,13 +838,12 @@
 
   int rc = RunContentMain(builder.Build(),
                           base::OnceCallback<void(HeadlessBrowser*)>());
-#if defined(OS_WIN)
-  // Use TerminateProcess instead of exit to avoid shutdown crashes and
-  // slowdowns on shutdown.
-  ::TerminateProcess(::GetCurrentProcess(), rc);
-#else   // defined(OS_WIN)
-  exit(rc);
-#endif  // defined(OS_WIN)
+
+  // Note that exiting from here means that base::AtExitManager objects will not
+  // have a chance to be destroyed (typically in main/WinMain).
+  // Use TerminateCurrentProcessImmediately instead of exit to avoid shutdown
+  // crashes and slowdowns on shutdown.
+  base::Process::TerminateCurrentProcessImmediately(rc);
 }
 
 int HeadlessBrowserMain(
diff --git a/headless/lib/browser/headless_print_manager.cc b/headless/lib/browser/headless_print_manager.cc
index cb07b26..6620bf1 100644
--- a/headless/lib/browser/headless_print_manager.cc
+++ b/headless/lib/browser/headless_print_manager.cc
@@ -16,7 +16,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "components/printing/browser/print_manager_utils.h"
 #include "components/printing/common/print.mojom.h"
-#include "components/printing/common/print_messages.h"
 #include "content/public/browser/render_view_host.h"
 #include "printing/mojom/print.mojom.h"
 #include "printing/print_job_constants.h"
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
index 850d0c7..58663014 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -70,6 +70,7 @@
 <translation id="7890287942691234100">Jetzt Chromium-Scanner verwenden</translation>
 <translation id="8013573822802650211">Melden Sie sich auf allen Ihren Geräten an, um Ihre Tabs überall dort aufzurufen, wo Sie Chromium verwenden</translation>
 <translation id="8073677936375100957">Ihre Chromium-Daten von diesem Gerät löschen?</translation>
+<translation id="8097322092271030751">Da Ihr Konto von <ph name="HOSTED_DOMAIN" /> verwaltet wird, werden Ihre Chromium-Daten beim Abmelden von diesem Gerät gelöscht. Ihre synchronisierten Daten verbleiben in Ihrem Google-Konto.</translation>
 <translation id="8175055321229419309">Tipp: <ph name="BEGIN_LINK" />Ziehen Sie Chromium in Ihr Dock<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Wenn Sie Chromium als Standardbrowser festlegen möchten, öffnen Sie die Einstellungen, tippen Sie auf "Standard-Webbrowser" und wählen Sie dann "Chromium" aus.</translation>
 <translation id="8240981428553046115">Chromium konnte nicht nach Updates suchen. Versuchen Sie es später noch einmal.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
index eedf3a5..dac2008 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
@@ -46,7 +46,7 @@
 <translation id="5777187867430702742">Chromium-eko orri bat</translation>
 <translation id="5862307444128926510">Ongi etorri Chromium-era</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> domeinuak kudeatutako kontu batekin hasi duzu saioa eta administratzaileari eman diozu Chromium datuen kontrola. Datuak betiko lotuko dira kontu honekin. Saioa amaitzen baduzu, Chromium datuak ezabatu egingo dira gailutik, baina Google-ko kontuan izango dituzu gordeta.</translation>
-<translation id="602807004951640891">Chromium erabiltzen baduzu, onartu egingo dituzu <ph name="BEGIN_LINK_TOS" />Zerbitzu-baldintzak<ph name="END_LINK_TOS" />.</translation>
+<translation id="602807004951640891">Chromium erabiltzen baduzu, onartuko dituzu <ph name="BEGIN_LINK_TOS" />Zerbitzu-baldintzak<ph name="END_LINK_TOS" />.</translation>
 <translation id="6119647025869519954">Chromium arakatzaile lehenetsi bihurtzeko:
 1. Ireki Ezarpenak.
 2. Sakatu Arakatzaile lehenetsia.
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Hasi Chromium-en eskanerra erabiltzen</translation>
 <translation id="8013573822802650211">Chromium erabiltzen duzun gailu guztietan zure fitxak eskura izateko, hasi saioa gailu guztietan</translation>
 <translation id="8073677936375100957">Gailu honetan dituzun Chromium-eko datuak garbitu nahi dituzu?</translation>
+<translation id="8097322092271030751">Kontua <ph name="HOSTED_DOMAIN" /> domeinuak kudeatzen duenez, saioa amaitzen duzunean Chromium-eko datuak ezabatu egingo dira gailu honetatik. Sinkronizatutako datuek Google-ko kontuan jarraituko dute.</translation>
 <translation id="8175055321229419309">Aholkua: <ph name="BEGIN_LINK" />ainguratu Chromium dock-ean<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromium arakatzaile lehenetsi bihurtzeko, ireki Ezarpenak, sakatu Arakatzaile lehenetsia eta hautatu Chromium.</translation>
 <translation id="8240981428553046115">Chromium-ek ezin izan ditu bilatu eguneratzeak. Saiatu berriro geroago.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
index c46a9fea..da6dcf2 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -70,6 +70,7 @@
 <translation id="7890287942691234100">Commencer à utiliser le lecteur Chromium</translation>
 <translation id="8013573822802650211">Pour retrouver vos onglets Chromium quel que soit l'appareil utilisé, connectez-vous à votre compte</translation>
 <translation id="8073677936375100957">Supprimer vos données Chromium sur cet appareil ?</translation>
+<translation id="8097322092271030751">Votre compte étant géré par <ph name="HOSTED_DOMAIN" />, vos données Chromium seront supprimées de cet appareil lorsque vous vous déconnecterez. En revanche, vos données synchronisées resteront dans votre compte Google.</translation>
 <translation id="8175055321229419309">Conseil : <ph name="BEGIN_LINK" />Placez Chromium dans le dock.<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Pour définir Chromium comme votre navigateur par défaut, ouvrez "Paramètres", appuyez sur "Navigateur par défaut", puis sélectionnez "Chromium".</translation>
 <translation id="8240981428553046115">Chromium n'est pas parvenu à rechercher les mises à jour. Réessayez plus tard.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
index cb56efa..0a370ac 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gl.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Comeza a utilizar o escáner de Chromium</translation>
 <translation id="8013573822802650211">Para ver as túas pestanas desde calquera dispositivo no que utilices Chromium, inicia sesión en todos eles</translation>
 <translation id="8073677936375100957">Queres borrar os teus datos de Chromium deste dispositivo?</translation>
+<translation id="8097322092271030751">Dado que a conta está xestionada por <ph name="HOSTED_DOMAIN" />, os teus datos de Chromium eliminaranse deste dispositivo cando peches sesión. Os datos sincronizados conservaranse na túa Conta de Google.</translation>
 <translation id="8175055321229419309">Consello: <ph name="BEGIN_LINK" />Engade Chromium á barra de aplicacións<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Para facer que Chromium sexa o teu navegador predeterminado, abre Settings (Configuración), toca Default Browser App (Aplicación de navegador predeterminada) e selecciona Chromium.</translation>
 <translation id="8240981428553046115">Chromium non puido buscar actualizacións. Téntao máis tarde.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
index b894d330..3c78c8c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Chromium സ്‌കാനർ ഉപയോഗിക്കാൻ ആരംഭിക്കുക</translation>
 <translation id="8013573822802650211">Chromium ഉപയോഗിക്കുന്നിടത്തെല്ലാം നിങ്ങളുടെ ടാബുകൾ കാണാൻ, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="8073677936375100957">ഉപകരണത്തില്‍ നിന്ന് Chromium ഡാറ്റ മായ്ക്കണോ?</translation>
+<translation id="8097322092271030751">നിങ്ങളുടെ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്നത് <ph name="HOSTED_DOMAIN" /> ആയതിനാൽ, സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ നിങ്ങളുടെ Chromium ഡാറ്റ ഈ ഉപകരണത്തിൽ നിന്ന് ഇല്ലാതാക്കും. നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഡാറ്റ Google അക്കൗണ്ടിൽ നിലനിൽക്കും.</translation>
 <translation id="8175055321229419309">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chromium-ത്തെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ ആക്കാൻ, ക്രമീകരണം തുറന്ന് ഡിഫോൾട്ട് ബ്രൗസർ എന്നതിൽ ടാപ്പ് ചെയ്‌ത് Chromium തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="8240981428553046115">Chromium-ന് അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb
index 80182e9..4d7b86a4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ne.xtb
@@ -70,6 +70,7 @@
 <translation id="7890287942691234100">Chromium को स्क्यानर प्रयोग गर्न थाल्नुहोस्</translation>
 <translation id="8013573822802650211">आफूले Chromium प्रयोग गर्ने सबै यन्त्रमा खोलिएका ट्याबहरू हेर्न ती सबै यन्त्रमा साइन इन गर्नुहोस्</translation>
 <translation id="8073677936375100957">यस यन्त्रबाट तपाईंको Chromium को डेटा मेटाउने हो?</translation>
+<translation id="8097322092271030751">तपाईंको खाता <ph name="HOSTED_DOMAIN" /> ले व्यवस्थापन गर्ने हुनाले साइन आउट गर्दा Chromium मा रहेको तपाईंको डेटा यो यन्त्रबाट मेटाइने छ। सिंक भएको तपाईंको डेटा तपाईंको Google खातामा रहिरहने छ।</translation>
 <translation id="8175055321229419309">सुझाव: <ph name="BEGIN_LINK" />Chromium लाई आफ्नो डकमा सार्नुहोस्<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromium लाई आफ्नो पूर्वनिर्धारित ब्राउजर बनाउन सेटिङ खोल्नुहोस्, 'पूर्वनिर्धारित ब्राउजर एप' मा ट्याप गर्नुहोस् र Chromium चयन गर्नुहोस्।</translation>
 <translation id="8240981428553046115">Chromium ले अपडेटहरू उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच गर्न सकेन। पछि फेरि प्रयास गर्नुहोस्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb
index 660ee920..c74a20c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Chromium ସ୍କାନର୍ ବ୍ୟବହାର କରିବାକୁ ଆରମ୍ଭ କରନ୍ତୁ</translation>
 <translation id="8013573822802650211">ଆପଣ Chromium ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ସ୍ଥାନରୁ ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକ ଦେଖିବାକୁ, ଆପଣଙ୍କ ସମସ୍ତ ଡିଭାଇସରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
 <translation id="8073677936375100957">ଏହି ଡିଭାଇସ୍‍ରୁ ଆପଣଙ୍କର Chromium ଡାଟା ଖାଲି କରିବେ କି?</translation>
+<translation id="8097322092271030751">ଆପଣଙ୍କ ଆକାଉଣ୍ଟ <ph name="HOSTED_DOMAIN" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଥିବା ଯୋଗୁଁ, ସାଇନ୍ ଆଉଟ୍ କରିବା ବେଳେ ଆପଣଙ୍କ Chromium ଡାଟାକୁ ଏହି ଡିଭାଇସରୁ ଡିଲିଟ୍ କରିଦିଆଯିବ। ଆପଣଙ୍କର ସିଙ୍କ୍ କରାଯାଇଥିବା ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ରହିବ।</translation>
 <translation id="8175055321229419309">ପରାମର୍ଶ: <ph name="BEGIN_LINK" />ଆପଣଙ୍କର ଡକ୍‍କୁ Chromium ଘୁଞ୍ଚାନ୍ତୁ<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromiumକୁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ କରିବାକୁ, ସେଟିଂସ୍ ଖୋଲି ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଆପରେ ଟାପ୍ କରନ୍ତୁ ଏବଂ Chromium ଚୟନ କରନ୍ତୁ।</translation>
 <translation id="8240981428553046115">ଅପଡେଟଗୁଡ଼ିକ ଅଛି କି ନାହିଁ ତାହା Chromium ଯାଞ୍ଚ କରିପାରିଲା ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pa.xtb
index a4d57ff7..1ef4688c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pa.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Chromium ਸਕੈਨਰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰੋ</translation>
 <translation id="8013573822802650211">ਜਿਸ ਡੀਵਾਈਸ 'ਤੇ ਵੀ ਤੁਸੀਂ Chromium ਵਰਤਦੇ ਹੋ, ਉੱਥੇ ਆਪਣੀਆਂ ਟੈਬਾਂ ਦੇਖਣ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
 <translation id="8073677936375100957">ਕੀ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡਾ Chromium ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation>
+<translation id="8097322092271030751">ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ <ph name="HOSTED_DOMAIN" /> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਸਾਈਨ-ਆਊਟ ਕਰਨ 'ਤੇ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡਾ Chromium ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਡਾ ਸਮਕਾਲੀਕਿਰਤ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਬਰਕਰਾਰ ਰਹੇਗਾ।</translation>
 <translation id="8175055321229419309">ਨੁਕਤਾ: <ph name="BEGIN_LINK" />Chromium ਨੂੰ ਆਪਣੇ ਡੌਕ 'ਤੇ ਲੈ ਜਾਓ<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromium ਨੂੰ ਆਪਣਾ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਬਣਾਉਣ ਲਈ, ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ, 'ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਐਪ' 'ਤੇ ਟੈਪ ਕਰੋ ਅਤੇ Chromium ਚੁਣੋ।</translation>
 <translation id="8240981428553046115">Chromium ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
index ac7498d..0a2f0355b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Chromium ஸ்கேனரைப் பயன்படுத்தத் தொடங்கவும்</translation>
 <translation id="8013573822802650211">நீங்கள் Chromiumமைப் பயன்படுத்தும் சாதனங்களில் உங்கள் தாவல்களைப் பார்க்க, அனைத்துச் சாதனங்களிலும் உள்நுழையவும்</translation>
 <translation id="8073677936375100957">இந்தச் சாதனத்திலிருந்து உங்கள் Chromium தரவை அழிக்கவா?</translation>
+<translation id="8097322092271030751">உங்கள் கணக்கை <ph name="HOSTED_DOMAIN" /> நிர்வகிப்பதால் இந்தச் சாதனத்திலிருந்து வெளியேறும்போது உங்கள் Chromium தரவு நீக்கப்படும். ஏற்கெனவே ஒத்திசைக்கப்பட்ட தரவு தொடர்ந்து உங்கள் Google கணக்கிலேயே இருக்கும்.</translation>
 <translation id="8175055321229419309">உதவிக் குறிப்பு: <ph name="BEGIN_LINK" />Chromiumமை உங்கள் டாக்கிற்கு நகர்த்துங்கள்<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromiumமை இயல்பு உலாவியாக அமைக்க, அமைப்புகளைத் திறந்து இயல்பு உலாவி ஆப்ஸ் என்பதைத் தட்டி Chromiumமைத் தேர்ந்தெடுக்கவும்.</translation>
 <translation id="8240981428553046115">Chromium உலாவியால் புதுப்பிப்புகள் உள்ளனவா எனப் பார்க்க முடியவில்லை. பிறகு முயலவும்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
index 4aa5b56..6f8e3423 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">Chromium స్కానర్‌ను ఉపయోగించడం ప్రారంభించండి</translation>
 <translation id="8013573822802650211">మీరు Chromiumను ఎక్కడ ఉపయోగించినా, అక్కడినుండి మీ ట్యాబ్‌లను చూసేందుకు, మీ పరికరాలన్నింటిలో సైన్ ఇన్ చేయండి</translation>
 <translation id="8073677936375100957">ఈ పరికరం నుండి మీ Chromium డేటాని తీసివేయాలా?</translation>
+<translation id="8097322092271030751">మీ ఖాతా <ph name="HOSTED_DOMAIN" /> ద్వారా మేనేజ్ చేయబడుతోంది కాబట్టి, సైన్ అవుట్ చేసినప్పుడు, ఈ పరికరం నుండి మీ Chromium డేటా తొలగించబడుతుంది. మీ సింక్ చేయబడిన డేటా మీ Google ఖాతాలోనే ఉండిపోతుంది.</translation>
 <translation id="8175055321229419309">చిట్కా: <ph name="BEGIN_LINK" />Chromiumను మీ డాక్‌కు తరలించండి<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">Chromiumను మీ ఆటోమేటిక్ బ్రౌజర్ యాప్‌గా ఉంచడానికి, సెట్టింగ్‌లు తెరిచి, సెట్టింగ్ ఆటోమేటిక్ బ్రౌజర్ యాప్‌ను ట్యాప్ చేసి, Chromiumను ఎంచుకోండి.</translation>
 <translation id="8240981428553046115">Chromium అప్‌డేట్‌లు ఏమైనా ఉన్నాయో లేదో చెక్ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb
index 15ac1d9..de50d4aa 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb
@@ -71,6 +71,7 @@
 <translation id="7890287942691234100">‏Chromium اسکینر کا استعمال شروع کریں</translation>
 <translation id="8013573822802650211">‏اپنے ٹیبز کو دیکھنے کے لئے جہاں بھی آپ Chromium استعمال کرتے ہیں، اپنے تمام آلات پر سائن ان کریں</translation>
 <translation id="8073677936375100957">‏اس آلہ سے آپ کا Chromium ڈیٹا صاف کریں؟</translation>
+<translation id="8097322092271030751">‏چونکہ آپ کا اکاؤنٹ <ph name="HOSTED_DOMAIN" /> کے زیر نظم ہے، اسلئے سائن آؤٹ کرنے پر آپ کا Chromium ڈیٹا اس آلے سے حذف کر دیا جائے گا۔ آپ کا سِنک کردہ ڈیٹا ہنوز آپ کے Google اکاؤنٹ میں رہے گا۔</translation>
 <translation id="8175055321229419309">‏تجویز: <ph name="BEGIN_LINK" />Chromium کو اپنے ڈاک میں منتقل کریں<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">‏Chromium کو اپنا ڈیفالٹ بنانے کیلئے، ترتیبات کھولیں، ڈیفالٹ براؤزر ایپ پر تھپتھپائیں اور Chromium منتخب کریں۔</translation>
 <translation id="8240981428553046115">‏Chromium اپ ڈیٹس چیک نہیں کر سکا۔ بعد میں دوبارہ کوشش کریں۔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
index dcf70492..1a05c697 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
@@ -71,7 +71,7 @@
 <translation id="7890287942691234100">開始使用 Chromium 掃瞄器</translation>
 <translation id="8013573822802650211">如要在任何使用 Chromium 的裝置上查看分頁,請在所有裝置上登入</translation>
 <translation id="8073677936375100957">要清除此裝置上的 Chromium 資料嗎?</translation>
-<translation id="8097322092271030751">由於你的帳戶是由 <ph name="HOSTED_DOMAIN" /> 管理,因此當你登出帳戶時,系統會將你的 Chromium 資料從這部裝置上刪除,但是已同步處理的資料會繼續保留在你的 Google 帳戶中。</translation>
+<translation id="8097322092271030751">由於您的帳戶由 <ph name="HOSTED_DOMAIN" /> 管理,當您登出帳戶時,Chromium 資料亦會從此裝置上刪除,已同步處理的資料會繼續保留在 Google 帳戶中。</translation>
 <translation id="8175055321229419309">提示:<ph name="BEGIN_LINK" />請將 Chromium 移至工具列<ph name="END_LINK" /></translation>
 <translation id="8235785158661376110">如要將 Chromium 設定為預設瀏覽器,請開啟「設定」,然後輕按 [預設的瀏覽器應用程式] 並選取 Chromium。</translation>
 <translation id="8240981428553046115">Chromium 無法檢查更新,請稍後再試。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
index 79822d0..4eedadb3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">Soll Google Chrome beim nächsten Mal eine Übersetzung von Seiten dieser Website anbieten, die auf <ph name="LANGUAGE_NAME" /> sind?</translation>
 <translation id="2695886661449553974">Chrome konnte nicht nach Updates suchen. Versuchen Sie es später noch einmal.</translation>
 <translation id="2732745070297234559">Chrome konnte nicht alle Passwörter prüfen. Versuchen Sie es morgen noch einmal.</translation>
+<translation id="2786324948676799004">Da Ihr Konto von <ph name="HOSTED_DOMAIN" /> verwaltet wird, werden Ihre Chrome-Daten beim Abmelden von diesem Gerät gelöscht. Ihre synchronisierten Daten verbleiben in Ihrem Google-Konto.</translation>
 <translation id="2919738076569633423">Wenn Sie Chrome nutzen, stimmen Sie damit den <ph name="BEGIN_LINK_TOS" />Nutzungsbedingungen<ph name="END_LINK_TOS" /> zu.</translation>
 <translation id="3030414234702425231">Sie melden sich von einem Konto ab, das von <ph name="SIGNOUT_MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chrome-Daten von diesem Gerät gelöscht. Sie bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="3148688391461398285">Profitieren Sie von einer besseren Nutzererfahrung in Chrome auf Grundlage Ihres Standorts.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
index 3a3083ce..138677e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
@@ -17,7 +17,8 @@
 <translation id="257708665678654955">Webgune honetara zatozen hurrengo aldian Google Chrome-k <ph name="LANGUAGE_NAME" /> hizkuntzan dauden orriak itzultzea eskaintzea nahi duzu?</translation>
 <translation id="2695886661449553974">Chrome-k ezin izan ditu bilatu eguneratzeak. Saiatu berriro geroago.</translation>
 <translation id="2732745070297234559">Chrome-k ezin izan ditu egiaztatu pasahitz guztiak. Saiatu berriro bihar.</translation>
-<translation id="2919738076569633423">Chrome erabiltzen baduzu, onartu egingo dituzu <ph name="BEGIN_LINK_TOS" />Zerbitzu-baldintzak<ph name="END_LINK_TOS" />.</translation>
+<translation id="2786324948676799004">Kontua <ph name="HOSTED_DOMAIN" /> domeinuak kudeatzen duenez, saioa amaitzen duzunean Chrome-ko datuak ezabatu egingo dira gailu honetatik. Sinkronizatutako datuek Google-ko kontuan jarraituko dute.</translation>
+<translation id="2919738076569633423">Chrome erabiltzen baduzu, onartuko dituzu <ph name="BEGIN_LINK_TOS" />Zerbitzu-baldintzak<ph name="END_LINK_TOS" />.</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> domeinuak kudeatutako kontu baten saioa amaituko duzunez, Chrome-n dituzun datuak ezabatu egingo dira gailu honetatik. Hala ere, datu horiek Google-ko kontuan egoten jarraituko dute.</translation>
 <translation id="3148688391461398285">Atera etekin handiagoa Chrome-ri, zure kokapenaren arabera.</translation>
 <translation id="3167189358072330585">Kontua ez dabil Google Chrome-n. Jarri harremanetan domeinuaren administratzailearekin edo erabili ohiko Google-ko kontu bat saioa hasteko.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
index 874bd9d..1ba43e6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">Souhaitez-vous que Google Chrome vous propose de traduire les pages de ce site rédigées en <ph name="LANGUAGE_NAME" /> lors de votre prochaine visite ?</translation>
 <translation id="2695886661449553974">Chrome n'est pas parvenu à rechercher les mises à jour. Réessayez plus tard.</translation>
 <translation id="2732745070297234559">Chrome n'est pas parvenu à vérifier tous les mots de passe. Réessayez demain.</translation>
+<translation id="2786324948676799004">Votre compte étant géré par <ph name="HOSTED_DOMAIN" />, vos données Chrome seront supprimées de cet appareil lorsque vous vous déconnecterez. En revanche, vos données synchronisées resteront dans votre compte Google.</translation>
 <translation id="2919738076569633423">En utilisant Chrome, vous acceptez les <ph name="BEGIN_LINK_TOS" />Conditions d'utilisation<ph name="END_LINK_TOS" />.</translation>
 <translation id="3030414234702425231">Comme vous vous déconnectez d'un compte géré par <ph name="SIGNOUT_MANAGED_DOMAIN" />, vos données Chrome seront supprimées de cet appareil, mais elles seront conservées dans votre compte Google.</translation>
 <translation id="3148688391461398285">Améliorez votre expérience dans Chrome grâce à votre position.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
index 8cd3e0d..3405bf9 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gl.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">Queres que a próxima vez Google Chrome che ofreza a posibilidade de traducir as páxinas en <ph name="LANGUAGE_NAME" /> deste sitio?</translation>
 <translation id="2695886661449553974">Chrome non puido buscar actualizacións. Téntao máis tarde.</translation>
 <translation id="2732745070297234559">Chrome non puido comprobar todos os contrasinais. Téntao de novo mañá.</translation>
+<translation id="2786324948676799004">Ademais, dado que a conta está xestionada por <ph name="HOSTED_DOMAIN" />, os teus datos de Chrome eliminaranse deste dispositivo cando peches sesión. Os datos sincronizados conservaranse na túa Conta de Google.</translation>
 <translation id="2919738076569633423">Ao usar Chrome, aceptas as <ph name="BEGIN_LINK_TOS" />Condicións de servizo<ph name="END_LINK_TOS" />.</translation>
 <translation id="3030414234702425231">Dado que estás pechando sesión nunha conta xestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, eliminaranse os teus datos de Chrome deste dispositivo, pero conservaranse na túa Conta de Google.</translation>
 <translation id="3148688391461398285">Obtén unha mellor experiencia en Chrome baseada na túa localización.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
index 32014c0f..f76702d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">അടുത്ത തവണ ഈ സൈറ്റിൽ നിന്ന് <ph name="LANGUAGE_NAME" /> പേജുകൾ വിവർത്തനം ചെയ്യാൻ Google Chrome ഓഫർ ചെയ്യുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ?</translation>
 <translation id="2695886661449553974">Chrome-ന് അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2732745070297234559">എല്ലാ പാസ്‌വേഡുകളും Chrome-ന് പരിശോധിക്കാനായില്ല. നാളെ വീണ്ടും ശ്രമിക്കുക.</translation>
+<translation id="2786324948676799004">നിങ്ങളുടെ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്നത് <ph name="HOSTED_DOMAIN" /> ആയതിനാൽ, സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ നിങ്ങളുടെ Chrome ഡാറ്റ ഈ ഉപകരണത്തിൽ നിന്ന് ഇല്ലാതാക്കും. നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഡാറ്റ Google അക്കൗണ്ടിൽ നിലനിൽക്കും.</translation>
 <translation id="2919738076569633423">Chrome ഉപയോഗിക്കുന്നതിലൂടെ, <ph name="BEGIN_LINK_TOS" />സേവന നിബന്ധനകള്‍<ph name="END_LINK_TOS" /> നിങ്ങൾ അംഗീകരിക്കുന്നു.</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങള്‍ സൈൻ ഔട്ട് ചെയ്യുന്നത് കാരണം, ഈ ഉപകരണത്തില്‍ നിന്ന് Chrome ഡാറ്റ ഇല്ലാതാക്കപ്പെടും. നിങ്ങളുടെ ഡാറ്റ തുടര്‍ന്നും Google അക്കൗണ്ടില്‍ ഉണ്ടായിരിക്കും.</translation>
 <translation id="3148688391461398285">നിങ്ങളുടെ ലൊക്കേഷനെ അടിസ്ഥാനമാക്കി Chrome-ൽ മികച്ച അനുഭവം നേടുക.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb
index 2603656..20a89e6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ne.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">तपाइँ Google Chrome लाई अर्को पटक यस साइटबाट <ph name="LANGUAGE_NAME" />को पृष्ठहरू अनुवाद गर्न प्रस्ताव गर्न चाहनुहुन्छ?</translation>
 <translation id="2695886661449553974">Chrome ले अपडेटहरू उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच गर्न सकेन। पछि फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="2732745070297234559">Chrome ले सबै पासवर्डहरू जाँच्न सकेन। भोलि फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="2786324948676799004">तपाईंको खाता <ph name="HOSTED_DOMAIN" /> ले व्यवस्थापन गर्ने हुनाले साइन आउट गर्दा Chrome मा रहेको तपाईंको डेटा यो यन्त्रबाट मेटाइने छ। सिंक भएको तपाईंको डेटा तपाईंको Google खातामा रहिरहने छ।</translation>
 <translation id="2919738076569633423">Chrome प्रयोग गरेर तपाईं <ph name="BEGIN_LINK_TOS" />सेवाका सर्तहरू<ph name="END_LINK_TOS" />मा सहमति जनाउनुहुन्छ।</translation>
 <translation id="3030414234702425231">तपाईंले <ph name="SIGNOUT_MANAGED_DOMAIN" />, द्वारा व्यवस्थापन गरिएको खाताबाट साइन आउट गर्दै गरेका कारण, यस कम्प्युटरबाट तपाईंको Chrome को डेटा मेटाइने छ। तर तपाईंको डेटा तपाईंको Google खातामा रहिरहने छ।</translation>
 <translation id="3148688391461398285">तपाईंको स्थानमा आधारित रहेर Chrome मा राम्रो अनुभव प्राप्त गर्नुहोस्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_or.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_or.xtb
index 1d6a3b7..1acfdc3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_or.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">ଆପଣ କ’ଣ ଚାହୁଁଛନ୍ତି ଯେ Google Chrome ପରବର୍ତ୍ତୀ ସମୟରେ ଏହି ସାଇଟ୍‌ର <ph name="LANGUAGE_NAME" /> ପୃଷ୍ଠାଗୁଡ଼ିକର ଅନୁବାଦ କରିବା ଅଫର୍‌ ଦେଉ?</translation>
 <translation id="2695886661449553974">ଅପଡେଟଗୁଡ଼ିକ ଅଛି କି ନାହିଁ ତାହା Chrome ଯାଞ୍ଚ କରିପାରିଲା ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="2732745070297234559">Chrome ସମସ୍ତ ପାସୱାର୍ଡକୁ ଯାଞ୍ଚ କରିପାରିଲା ନାହିଁ। ଆସନ୍ତାକାଲି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
+<translation id="2786324948676799004">ଆପଣଙ୍କ ଆକାଉଣ୍ଟ <ph name="HOSTED_DOMAIN" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଥିବା ଯୋଗୁଁ, ସାଇନ୍ ଆଉଟ୍ କରିବା ବେଳେ ଆପଣଙ୍କ Chrome ଡାଟାକୁ ଏହି ଡିଭାଇସରୁ ଡିଲିଟ୍ କରିଦିଆଯିବ। ଆପଣଙ୍କର ସିଙ୍କ୍ କରାଯାଇଥିବା ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ରହିବ।</translation>
 <translation id="2919738076569633423">Chrome ବ୍ୟବହାର କରି, ଆପଣ <ph name="BEGIN_LINK_TOS" />ସେବାର ସର୍ତ୍ତାବଳୀ<ph name="END_LINK_TOS" />ରେ ସମ୍ମତ ହୁଅନ୍ତି।</translation>
 <translation id="3030414234702425231">ଯେହେତୁ ଆପଣ <ph name="SIGNOUT_MANAGED_DOMAIN" />ଙ୍କ ଦ୍ଵାରା ପରିଚାଳିତ ଏକ ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ କରୁଛନ୍ତି, ଏହି ଡିଭାଇସ୍‌ରୁ ଆପଣଙ୍କର Chrome ଡାଟା ଡିଲିଟ୍ କରାଯିବ। ଆପଣଙ୍କର ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ରହିବ।</translation>
 <translation id="3148688391461398285">ଆପଣଙ୍କର ଲୋକେସନ୍ ଆଧାରରେ Chromeରେ ଏକ ଉତ୍ତମ ଅଭିଜ୍ଞତା ପ୍ରାପ୍ତ କରନ୍ତୁ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pa.xtb
index 88921cc..5b33e444 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pa.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">ਕੀ ਤੁਸੀਂ ਚਾਹੋਗੇ ਕਿ Google Chrome ਅਗਲੀ ਵਾਰ ਇਸ ਸਾਈਟ ਦੇ <ph name="LANGUAGE_NAME" /> ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੇ?</translation>
 <translation id="2695886661449553974">Chrome ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="2732745070297234559">Chrome ਸਾਰੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਕੱਲ੍ਹ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
+<translation id="2786324948676799004">ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ <ph name="HOSTED_DOMAIN" /> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਸਾਈਨ-ਆਊਟ ਕਰਨ 'ਤੇ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡਾ Chrome ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਡਾ ਸਮਕਾਲੀਕਿਰਤ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਬਰਕਰਾਰ ਰਹੇਗਾ।</translation>
 <translation id="2919738076569633423">Chrome ਨੂੰ ਵਰਤ ਕੇ, ਤੁਸੀਂ <ph name="BEGIN_LINK_TOS" />ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK_TOS" /> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ।</translation>
 <translation id="3030414234702425231">ਕਿਉਂਕਿ ਤੁਸੀਂ <ph name="SIGNOUT_MANAGED_DOMAIN" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਕਿਸੇ ਖਾਤੇ ਵਿੱਚੋਂ ਸਾਈਨ-ਆਊਟ ਕਰ ਰਹੇ ਹੋ, ਇਸ ਲਈ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡੇ Chrome ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਡਾ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰਹੇਗਾ।</translation>
 <translation id="3148688391461398285">ਆਪਣੇ ਟਿਕਾਣੇ ਦੇ ਆਧਾਰ 'ਤੇ Chrome ਵਿੱਚ ਇੱਕ ਬਿਹਤਰ ਅਨੁਭਵ ਪ੍ਰਾਪਤ ਕਰੋ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
index 3a9a9d1..7a6fd3e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">அடுத்த முறை இந்தத் தளத்தின் <ph name="LANGUAGE_NAME" /> பக்கங்களை மொழிபெயர்க்கவா என்று Google Chrome  கேட்க வேண்டுமென விரும்புகிறீர்களா?</translation>
 <translation id="2695886661449553974">Chrome உலாவியால் புதுப்பிப்புகள் உள்ளனவா எனப் பார்க்க முடியவில்லை. பிறகு முயலவும்.</translation>
 <translation id="2732745070297234559">Chrome உலாவியால் கடவுச்சொற்கள் அனைத்தையும் சரிபார்க்க முடியவில்லை. நாளை முயலவும்.</translation>
+<translation id="2786324948676799004">உங்கள் கணக்கை <ph name="HOSTED_DOMAIN" /> நிர்வகிப்பதால் இந்தச் சாதனத்திலிருந்து வெளியேறும்போது உங்கள் Chrome தரவு நீக்கப்படும். ஏற்கெனவே ஒத்திசைக்கப்பட்ட தரவு தொடர்ந்து உங்கள் Google கணக்கிலேயே இருக்கும்.</translation>
 <translation id="2919738076569633423">Chrome உலாவியைப் பயன்படுத்துவதன் மூலம் <ph name="BEGIN_LINK_TOS" />சேவை விதிமுறைகளை<ph name="END_LINK_TOS" /> ஏற்கிறீர்கள்.</translation>
 <translation id="3030414234702425231">நீங்கள் <ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுவதால், இந்தச் சாதனத்திலிருந்து உங்கள் Chrome தரவு நீக்கப்படும். ஆனால் உங்கள் Google கணக்கிலிருந்து உங்கள் தரவு நீக்கப்படாது.</translation>
 <translation id="3148688391461398285">உங்கள் இருப்பிடத்தின் அடிப்படையில் Chrome இல் சிறந்த அனுபவத்தைப் பெறவும்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
index 6dcd3a0d..cee88b1 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">ఈ సైట్‌లోని <ph name="LANGUAGE_NAME" /> పేజీలను మీరు తర్వాతిసారి సందర్శించినప్పుడు, వాటిని అనువదించే సదుపాయాన్ని Google Chrome అందించాలని కోరుకుంటున్నారా?</translation>
 <translation id="2695886661449553974">Chrome అప్‌డేట్‌లు ఏమైనా ఉన్నాయో లేదో చెక్ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="2732745070297234559">Chromeకు అన్ని పాస్‌వర్డ్‌లను చెక్ చేయడం సాధ్యపడలేదు. రేపు మళ్లీ ట్రై చేయండి.</translation>
+<translation id="2786324948676799004">మీ ఖాతా <ph name="HOSTED_DOMAIN" /> ద్వారా మేనేజ్ చేయబడుతోంది కాబట్టి, సైన్ అవుట్ చేసినప్పుడు, ఈ పరికరం నుండి మీ Chrome డేటా తొలగించబడుతుంది. మీ సింక్ చేయబడిన డేటా మీ Google ఖాతాలోనే ఉండిపోతుంది.</translation>
 <translation id="2919738076569633423">Chromeను ఉపయోగించడం ద్వారా, మీరు <ph name="BEGIN_LINK_TOS" />సేవా నిబంధనల<ph name="END_LINK_TOS" />కు అంగీకరిస్తున్నారు.</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహిస్తున్న ఖాతా నుండి మీరు సైన్ అవుట్ చేస్తున్నారు కనుక మీ Chrome డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="3148688391461398285">మీ స్థానం ఆధారంగా Chromeలో మెరుగైన అనుభవాన్ని పొందండి.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb
index 4ddbd42..8d420c3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ur.xtb
@@ -17,6 +17,7 @@
 <translation id="257708665678654955">‏کیا آپ چاہیں گے کہ Google Chrome اگلی بار اس سائٹ سے <ph name="LANGUAGE_NAME" /> صفحات کا ترجمہ کرنے کی پیشکش کرے؟</translation>
 <translation id="2695886661449553974">‏Chrome اپ ڈیٹس چیک نہیں کر سکا۔ بعد میں دوبارہ کوشش کریں۔</translation>
 <translation id="2732745070297234559">‏Chrome سبھی پاس ورڈز چیک نہیں کر سکا۔ کل دوبارہ کوشش کریں۔</translation>
+<translation id="2786324948676799004">‏چونکہ آپ کا اکاؤنٹ <ph name="HOSTED_DOMAIN" /> کے زیر نظم ہے، اسلئے سائن آؤٹ کرنے پر آپ کا Chrome ڈیٹا اس آلے سے حذف کر دیا جائے گا۔ آپ کا سِنک کردہ ڈیٹا ہنوز آپ کے Google اکاؤنٹ میں رہے گا۔</translation>
 <translation id="2919738076569633423">‏Chrome استعمال کر کے، آپ <ph name="BEGIN_LINK_TOS" />سروس کی شرائط<ph name="END_LINK_TOS" /> سے اتفاق کرتے ہیں۔</translation>
 <translation id="3030414234702425231">‏چونکہ آپ <ph name="SIGNOUT_MANAGED_DOMAIN" /> کے زیر انتظام ایک اکاؤنٹ سے سائن آؤٹ کر رہے ہیں، لہذا آپ کا Chrome ڈیٹا اس آلہ سے حذف ہو جائے گا۔ آپ کا ڈیٹا آپ کے Google اکاؤنٹ میں رہے گا۔</translation>
 <translation id="3148688391461398285">‏اپنے مقام کی بنیاد پر Chrome میں ایک بہتر تجربہ حاصل کریں۔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
index 718671e..73d99c26 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
@@ -17,7 +17,7 @@
 <translation id="257708665678654955">您希望 Google Chrome 將來翻譯此網站的<ph name="LANGUAGE_NAME" />頁面嗎?</translation>
 <translation id="2695886661449553974">Chrome 無法檢查更新,請稍後再試。</translation>
 <translation id="2732745070297234559">Chrome 無法檢查所有密碼。請明天再試。</translation>
-<translation id="2786324948676799004">由於你的帳戶是由 <ph name="HOSTED_DOMAIN" /> 管理,因此當你登出帳戶時,系統會將你的 Chrome 資料從這部裝置上刪除,但是已同步處理的資料會繼續保留在你的 Google 帳戶中。</translation>
+<translation id="2786324948676799004">由於您的帳戶由 <ph name="HOSTED_DOMAIN" /> 管理,當您登出帳戶時,Chrome 資料亦會從此裝置上刪除,已同步處理的資料會繼續保留在 Google 帳戶中。</translation>
 <translation id="2919738076569633423">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK_TOS" />服務條款<ph name="END_LINK_TOS" />》。</translation>
 <translation id="3030414234702425231">由於您即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理的帳戶,系統將刪除您在此裝置上的 Chrome 資料,但這些資料仍會保留在您的 Google 帳戶中。</translation>
 <translation id="3148688391461398285">讓應用程式根據您的位置資訊在 Chrome 中為您提供更優質的服務。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 0fcce848..24af50d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">Neuer Tab</translation>
 <translation id="3551320343578183772">Tab schließen</translation>
 <translation id="3581564640715911333">Übersetzung für Seiten in andere Sprachen anbieten</translation>
+<translation id="3588492282865875287">Abmelden?</translation>
 <translation id="3588820906588687999">Bild in neuem Tab öffnen</translation>
 <translation id="359441731697487922">Links werden automatisch in Chrome geöffnet, wenn Sie es als Standard-Browser-App festlegen.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">Speichern</translation>
 <translation id="5327248766486351172">Name</translation>
 <translation id="5339316356165661760">Synchronisierung aktivieren</translation>
+<translation id="5351284593342054342">Von diesem Gerät löschen</translation>
 <translation id="5388358297987318779">Bild öffnen</translation>
 <translation id="5407969256130905701">Änderungen verwerfen</translation>
 <translation id="5409365236829784218">Es sind keine Apps inst., die diese Datei öffnen können.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">Dadurch können Sie Fotos in der Fotogalerie speichern.</translation>
 <translation id="5955891643922670672">Offlineversion wird angezeigt</translation>
 <translation id="5957613098218939406">Weitere Optionen</translation>
+<translation id="5961521066940389233">Auf diesem Gerät speichern</translation>
 <translation id="5964480694698977962">Neuen Inkognitotab erstellen.</translation>
 <translation id="5965679971710331625">Sie sind angemeldet</translation>
 <translation id="5979837087407522202">Passwörter suchen</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">JJ</translation>
 <translation id="6059830886158432458">Hier können Sie festlegen, welche Meldungen und Aktivitäten Ihnen angezeigt werden</translation>
 <translation id="6066301408025741299">Zum Abbrechen tippen</translation>
+<translation id="6085282545406522838">Ihre synchronisierten Daten verbleiben in Ihrem Google-Konto.</translation>
 <translation id="6108923351542677676">Einrichtung läuft...</translation>
 <translation id="6119050551270742952">Die aktuelle Webseite ist im Inkognitomodus</translation>
 <translation id="6122191549521593678">Online</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">Herunterladen</translation>
 <translation id="7537586195939242955">Ihr Pass kann derzeit nicht in Passbook installiert werden.</translation>
 <translation id="7554791636758816595">Neuer Tab</translation>
+<translation id="7558943807639707687">Was möchten Sie mit Ihren Lesezeichen, Ihrem Verlauf und anderen Daten auf diesem Gerät tun?</translation>
 <translation id="7561196759112975576">Immer</translation>
 <translation id="7583004045319035904">Nutzen Sie <ph name="BIOMETRIC_AUTHENITCATION_TYPE" />, um Ihre Inkognitotabs zu entsperren.</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> nie übersetzen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index beeb6c9f..324d199 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">Fitxa berria</translation>
 <translation id="3551320343578183772">Itxi fitxa</translation>
 <translation id="3581564640715911333">Eskaini beste hizkuntzetan dauden orriak itzultzea</translation>
+<translation id="3588492282865875287">Saioa amaitu nahi duzu?</translation>
 <translation id="3588820906588687999">Ireki irudia beste fitxa batean</translation>
 <translation id="359441731697487922">Estekak automatikoki ireki ditzakezu Chrome-n arakatzaile lehenetsi gisa ezartzen baduzu.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">Gorde</translation>
 <translation id="5327248766486351172">Izena</translation>
 <translation id="5339316356165661760">Aktibatu sinkronizazioa</translation>
+<translation id="5351284593342054342">Garbitu gailu honetatik</translation>
 <translation id="5388358297987318779">Ireki irudia</translation>
 <translation id="5407969256130905701">Baztertu aldaketak</translation>
 <translation id="5409365236829784218">Ez dago fitxategi hori ireki dezakeen aplikazioak instalatuta.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">Honekin, argazkien liburutegian gorde ahalko dituzu argazkiak.</translation>
 <translation id="5955891643922670672">Konexiorik gabeko bertsioa da hau</translation>
 <translation id="5957613098218939406">Aukera gehiago</translation>
+<translation id="5961521066940389233">Mantendu gailu honetan</translation>
 <translation id="5964480694698977962">Sortu ezkutuko beste fitxa bat.</translation>
 <translation id="5965679971710331625">Hasi duzu saioa</translation>
 <translation id="5979837087407522202">Bilatu pasahitzak</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">UU</translation>
 <translation id="6059830886158432458">Kontrolatu istorioak eta jarduerak hemen</translation>
 <translation id="6066301408025741299">Sakatu bertan behera uzteko</translation>
+<translation id="6085282545406522838">Sinkronizatutako datuek Google-ko kontuan jarraituko dute.</translation>
 <translation id="6108923351542677676">Konfigurazioa abian da…</translation>
 <translation id="6119050551270742952">Web-orri hau ezkutuko moduan dago</translation>
 <translation id="6122191549521593678">Konektatu</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">Deskargatu</translation>
 <translation id="7537586195939242955">Dokumentua ezin izan da instalatu Passbook-en.</translation>
 <translation id="7554791636758816595">Fitxa berria</translation>
+<translation id="7558943807639707687">Zer egin nahi duzu gailu honetan gordetako laster-marka, historia eta bestelako datuekin?</translation>
 <translation id="7561196759112975576">Beti</translation>
 <translation id="7583004045319035904">Erabili <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ezkutuko moduko fitxak desblokeatzeko.</translation>
 <translation id="7600965453749440009">Ez itzuli <ph name="LANGUAGE" /> inoiz</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 246e765..097666ad 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">Nouvel onglet</translation>
 <translation id="3551320343578183772">Fermer l'onglet</translation>
 <translation id="3581564640715911333">Proposer de traduire les pages dans d'autres langues</translation>
+<translation id="3588492282865875287">Se déconnecter ?</translation>
 <translation id="3588820906588687999">Ouvrir l'image dans un nouvel onglet</translation>
 <translation id="359441731697487922">Vous pouvez définir Chrome comme votre navigateur par défaut pour y ouvrir des liens automatiquement.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">Enregistrer</translation>
 <translation id="5327248766486351172">Nom</translation>
 <translation id="5339316356165661760">Activer la synchronisation</translation>
+<translation id="5351284593342054342">Supprimer de cet appareil</translation>
 <translation id="5388358297987318779">Ouvrir l'image</translation>
 <translation id="5407969256130905701">Supprimer les modifications</translation>
 <translation id="5409365236829784218">Aucune application installée ne peut ouvrir ce fichier.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">Cela vous permet d'enregistrer des photos dans votre photothèque.</translation>
 <translation id="5955891643922670672">Affichage de la version hors connexion</translation>
 <translation id="5957613098218939406">Plus d'options</translation>
+<translation id="5961521066940389233">Stocker sur l'appareil</translation>
 <translation id="5964480694698977962">Créer un onglet de navigation privée</translation>
 <translation id="5965679971710331625">Vous êtes connecté</translation>
 <translation id="5979837087407522202">Rechercher des mots de passe</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">AA</translation>
 <translation id="6059830886158432458">Contrôlez vos articles et votre activité via ce menu</translation>
 <translation id="6066301408025741299">Appuyez sur l'écran pour annuler.</translation>
+<translation id="6085282545406522838">En revanche, vos données synchronisées resteront dans votre compte Google.</translation>
 <translation id="6108923351542677676">Configuration en cours…</translation>
 <translation id="6119050551270742952">La page Web actuelle est en mode navigation privée</translation>
 <translation id="6122191549521593678">En ligne</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">Télécharger</translation>
 <translation id="7537586195939242955">Impossible d'installer votre Pass dans Passbook actuellement.</translation>
 <translation id="7554791636758816595">Nouvel onglet</translation>
+<translation id="7558943807639707687">Que souhaitez-vous faire avec vos favoris, votre historique et les autres données de cet appareil ?</translation>
 <translation id="7561196759112975576">Toujours</translation>
 <translation id="7583004045319035904">Utilisez "<ph name="BIOMETRIC_AUTHENITCATION_TYPE" />" pour déverrouiller vos onglets de navigation privée.</translation>
 <translation id="7600965453749440009">Ne jamais traduire les pages rédigées en <ph name="LANGUAGE" /> </translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 8c253b6..403f59e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">Nova pestana</translation>
 <translation id="3551320343578183772">Pechar pestana</translation>
 <translation id="3581564640715911333">Ofrece a tradución de páxinas noutros idiomas</translation>
+<translation id="3588492282865875287">Queres pechar sesión?</translation>
 <translation id="3588820906588687999">Abrir imaxe nunha pestana nova</translation>
 <translation id="359441731697487922">Podes abrir ligazóns en Chrome automaticamente configurándoo como o teu navegador predeterminado.
 
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">Gardar</translation>
 <translation id="5327248766486351172">Nome</translation>
 <translation id="5339316356165661760">Activar sincronización</translation>
+<translation id="5351284593342054342">Borrar todos os datos deste dispositivo</translation>
 <translation id="5388358297987318779">Abrir imaxe</translation>
 <translation id="5407969256130905701">Descartar cambios</translation>
 <translation id="5409365236829784218">Ningunha aplicación instalada que poida abrir este ficheiro.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">Permíteche gardar fotos na túa fototeca.</translation>
 <translation id="5955891643922670672">Visualizando a versión sen conexión</translation>
 <translation id="5957613098218939406">Máis opcións</translation>
+<translation id="5961521066940389233">Conservar todos os datos neste dispositivo</translation>
 <translation id="5964480694698977962">Crear pestana nova do modo de incógnito</translation>
 <translation id="5965679971710331625">Iniciaches sesión</translation>
 <translation id="5979837087407522202">Buscar contrasinais</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">AA</translation>
 <translation id="6059830886158432458">Controla as túas historias e a túa actividade aquí</translation>
 <translation id="6066301408025741299">Toca para cancelar.</translation>
+<translation id="6085282545406522838">Os datos sincronizados conservaranse na túa Conta de Google.</translation>
 <translation id="6108923351542677676">Configuración en curso…</translation>
 <translation id="6119050551270742952">O sitio web actual está no modo de incógnito</translation>
 <translation id="6122191549521593678">Online</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">Descargar</translation>
 <translation id="7537586195939242955">Non se pode instalar o teu pase en Passbook neste momento.</translation>
 <translation id="7554791636758816595">Nova pestana</translation>
+<translation id="7558943807639707687">Que queres facer cos marcadores, co historial e cos outros datos que están almacenados neste dispositivo?</translation>
 <translation id="7561196759112975576">Sempre</translation>
 <translation id="7583004045319035904">Utiliza <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> para desbloquear as pestanas do modo de incógnito.</translation>
 <translation id="7600965453749440009">Non traducir nunca do <ph name="LANGUAGE" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 3860ccb8..482519dc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">പുതിയ ടാബ്</translation>
 <translation id="3551320343578183772">ടാബ് അടയ്‌ക്കുക</translation>
 <translation id="3581564640715911333">പേജുകൾ മറ്റ് ഭാഷകളിലേക്ക് വിവർത്തനം ചെയ്യാനുള്ള ഓഫർ</translation>
+<translation id="3588492282865875287">സൈൻ ഔട്ട് ചെയ്യണോ?</translation>
 <translation id="3588820906588687999">ചിത്രം പുതിയ ടാബിൽ തുറക്കുക</translation>
 <translation id="359441731697487922">Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസർ ആപ്പ് ആയി സജ്ജീകരിച്ച്, അതിൽ ലിങ്കുകൾ സ്വയമേവ തുറക്കാം.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation>
 <translation id="5327248766486351172">പേര്</translation>
 <translation id="5339316356165661760">സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
+<translation id="5351284593342054342">ഈ ഉപകരണത്തിൽ നിന്ന് മായ്‌ക്കുക</translation>
 <translation id="5388358297987318779">ചിത്രം തുറക്കുക</translation>
 <translation id="5407969256130905701">മാറ്റങ്ങൾ നിരസിക്കുക</translation>
 <translation id="5409365236829784218">ഈ ഫയലിൽ തുറക്കാൻ കഴിയുന്ന അപ്ലിക്കേഷനുകളൊന്നും ഇൻസ്റ്റാൾ ചെയ്‌തില്ല.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറിയിലേക്ക് ഫോട്ടോകൾ സംരക്ഷിക്കാൻ അനുവദിക്കുന്നു.</translation>
 <translation id="5955891643922670672">ഓഫ്‌ലൈൻ പതിപ്പ് കാണുന്നു</translation>
 <translation id="5957613098218939406">കൂടുതൽ ഓപ്‌ഷനുകൾ</translation>
+<translation id="5961521066940389233">ഈ ഉപകരണത്തിൽ നിലനിർത്തുക</translation>
 <translation id="5964480694698977962">പുതിയ അദൃശ്യ ടാബ് സൃഷ്‌ടിക്കുക.</translation>
 <translation id="5965679971710331625">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തു</translation>
 <translation id="5979837087407522202">പാസ്‌വേഡുകൾ തിരയുക</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">നിങ്ങളുടെ സ്‌റ്റോറികളും ആക്റ്റിവിറ്റികളും ഇവിടെ നിയന്ത്രിക്കുക</translation>
 <translation id="6066301408025741299">റദ്ദാക്കുന്നതിന് ടാപ്പ് ചെയ്യുക.</translation>
+<translation id="6085282545406522838">നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഡാറ്റ Google അക്കൗണ്ടിൽ നിലനിൽക്കും.</translation>
 <translation id="6108923351542677676">സജ്ജീകരണം പുരോഗതിയിലാണ്...</translation>
 <translation id="6119050551270742952">നിലവിലെ വെബ്‌പേജ് അദൃശ്യ മോഡിലാണ്</translation>
 <translation id="6122191549521593678">ഓൺലൈൻ</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">ഡൗൺലോഡ് ചെയ്യുക</translation>
 <translation id="7537586195939242955">ക്ഷമിക്കണം, നിങ്ങളുടെ പാസ് ഈ സമയം പാസ്‌ബുക്കിൽ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയില്ല.</translation>
 <translation id="7554791636758816595">പുതിയ ടാബ്</translation>
+<translation id="7558943807639707687">ഈ ഉപകരണത്തിലെ നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, മറ്റ് ഡാറ്റ എന്നിവ എന്താണ് ചെയ്യേണ്ടത്?</translation>
 <translation id="7561196759112975576">എല്ലായ്പ്പോഴും</translation>
 <translation id="7583004045319035904">നിങ്ങളുടെ അദൃശ്യ ടാബുകൾ അൺലോക്ക് ചെയ്യാൻ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ഉപയോഗിക്കുക.</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ഒരിക്കലും വിവര്‍‌ത്തനം ചെയ്യരുത്</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index 8943f73..6eb0421 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">नयाँ ट्याब</translation>
 <translation id="3551320343578183772">ट्याब बन्द गर्नुहोस्</translation>
 <translation id="3581564640715911333">पृष्ठहरू अन्य भाषामा अनुवाद गर्ने प्रस्ताव गर्नुहोस्</translation>
+<translation id="3588492282865875287">साइन आउट गर्ने हो?</translation>
 <translation id="3588820906588687999">छविलाई नयाँ ट्याबमा खोल्नुहोस्</translation>
 <translation id="359441731697487922">तपाईं Chrome लाई आफ्नो पूर्वनिर्धारित ब्राउजर एप बनाएर लिंकहरू स्वतः Chrome मा खोल्न सक्नुहुन्छ।
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">बचत गर्नुहोस्</translation>
 <translation id="5327248766486351172">नाम</translation>
 <translation id="5339316356165661760">सिंक गर्ने सुविधा अन गर्नुहोस्</translation>
+<translation id="5351284593342054342">यो यन्त्रबाट हटाउनुहोस्</translation>
 <translation id="5388358297987318779">छवि खोल्नुहोस्</translation>
 <translation id="5407969256130905701">परिवर्तनहरू खारेज गर्नुहोस्</translation>
 <translation id="5409365236829784218">यस फाइल खोल्न सक्ने कुनै पनि एपहरू स्थापना गरिएको छैन्।</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">यो अनुप्रयोगले तपाईंलाई आफ्नो तस्बिरको लाइब्रेरीमा तस्बिरहरू सुरक्षित गर्न दिन्छ।</translation>
 <translation id="5955891643922670672">अफलाइन संस्करण हेरिँदै</translation>
 <translation id="5957613098218939406">थप विकल्पहरू</translation>
+<translation id="5961521066940389233">यो यन्त्रमा राख्नुहोस्</translation>
 <translation id="5964480694698977962">नयाँ इन्कोग्निटो ट्याब सिर्जना गर्नुहोस्</translation>
 <translation id="5965679971710331625">तपाईं साइन इन हुनुभएको छ</translation>
 <translation id="5979837087407522202">पासवर्डहरू खोज्नुहोस्</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">यहाँ आफ्नो समाचार फिडमा देखिने सामग्री तथा क्रियाकलाप नियन्त्रण गर्नुहोस्</translation>
 <translation id="6066301408025741299">रद्द गर्न ट्याप गर्नुहोस्।</translation>
+<translation id="6085282545406522838">सिंक भएको तपाईंको डेटा तपाईंको Google खातामा रहिरहने छ।</translation>
 <translation id="6108923351542677676">सेटअप प्रगतिमा छ...</translation>
 <translation id="6119050551270742952">हालको वेबपृष्ठ इन्कोग्निटो मोडमा छ</translation>
 <translation id="6122191549521593678">अनलाइन</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">डाउनलोड गर्नुहोस्</translation>
 <translation id="7537586195939242955">माफ गर्नुहोस्, यस समयमा तपाईंको पासलाई पासबुकमा स्थापना गर्न सकिदैन।</translation>
 <translation id="7554791636758816595">नयाँ ट्याब</translation>
+<translation id="7558943807639707687">तपाईं यस यन्त्रमा भएका आफ्ना बुकमार्क, इतिहास र अन्य डेटाका सम्बन्धमा के गर्न चाहनुहुन्छ?</translation>
 <translation id="7561196759112975576">सधैं</translation>
 <translation id="7583004045319035904">आफ्ना इन्कोग्निटो ट्याबहरू अनलक गर्न <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> प्रयोग गर्नुहोस्।</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> कहिले पनि अनुवाद नगर्नुहोस्</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index be9e83b..e02c37f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">ନୂତନ ଟାବ୍‌</translation>
 <translation id="3551320343578183772">ଟାବ୍‌ ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="3581564640715911333">ଅନ୍ୟ ଭାଷାରେ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁବାଦ କରିବାକୁ ଅଫର୍ ଦିଅନ୍ତୁ</translation>
+<translation id="3588492282865875287">ସାଇନ୍ ଆଉଟ୍ କରିବେ?</translation>
 <translation id="3588820906588687999">ନୂଆ ଟାବ୍‍‍‍ରେ ଛବି ଖୋଲନ୍ତୁ</translation>
 <translation id="359441731697487922">ଆପଣ Chromeକୁ ଆପଣଙ୍କର ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଆପ୍ ଭାବେ ସେଟ୍ କରି ଲିଙ୍କଗୁଡ଼ିକୁ ଏଥିରେ ସ୍ୱଚାଳିତ ଭାବରେ ଖୋଲିପାରିବେ।
       
@@ -408,6 +409,7 @@
 <translation id="5317780077021120954">ସଞ୍ଚୟ</translation>
 <translation id="5327248766486351172">ନାମ</translation>
 <translation id="5339316356165661760">ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation>
+<translation id="5351284593342054342">ଏହି ଡିଭାଇସରୁ ଖାଲି କରିଦିଅନ୍ତୁ</translation>
 <translation id="5388358297987318779">ଛବି ଖୋଲନ୍ତୁ</translation>
 <translation id="5407969256130905701">ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଖାରଜ କରନ୍ତୁ</translation>
 <translation id="5409365236829784218">ଏହି ଫାଇଲ୍‌କୁ ଖୋଲିପାରିବା ଭଳି କୌଣସି ଆପ୍ଲିକେସନ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରାଯାଇ ନାହିଁ।</translation>
@@ -463,6 +465,7 @@
 <translation id="5948291296578561264">ଏହା ଆପଣଙ୍କର ଫଟୋ ଲାଇବ୍ରେରୀରେ ଫଟୋଗୁଡ଼ିକ ସେଭ୍‍ କରିବାକୁ ଦେଇଥାଏ।</translation>
 <translation id="5955891643922670672">ଅଫ୍‌ଲାଇନ୍ ସଂସ୍କରଣ ଦେଖୁଛନ୍ତି</translation>
 <translation id="5957613098218939406">ଅଧିକ ବିକଳ୍ପ</translation>
+<translation id="5961521066940389233">ଏହି ଡିଭାଇସରେ ରଖନ୍ତୁ</translation>
 <translation id="5964480694698977962">ନୂଆ ଇନ୍‌କଗ୍‌ନିଟୋ ଟାବ୍ ତିଆରି କରନ୍ତୁ।</translation>
 <translation id="5965679971710331625">ଆପଣ ସାଇନ୍‌ ଇନ୍ ଅଛନ୍ତି</translation>
 <translation id="5979837087407522202">ପାସ୍‌ୱାର୍ଡ ଖୋଜନ୍ତୁ</translation>
@@ -477,6 +480,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">ଏଠାରେ ଆପଣଙ୍କ ଷ୍ଟୋରୀ ଏବଂ କାର୍ଯ୍ୟକଳାପ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation>
 <translation id="6066301408025741299">ବାତିଲ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।</translation>
+<translation id="6085282545406522838">ଆପଣଙ୍କର ସିଙ୍କ୍ କରାଯାଇଥିବା ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ରହିବ।</translation>
 <translation id="6108923351542677676">ସେଟ୍ ଅପ୍ ପ୍ରକ୍ରିୟା ଚାଲିଛି…</translation>
 <translation id="6119050551270742952">ବର୍ତ୍ତମାନର ୱେବ୍‍ପୃଷ୍ଠା ଇନ୍‍କଗ୍ନିଟୋରେ ଅଛି</translation>
 <translation id="6122191549521593678">ଅନ୍‌ଲାଇନ୍</translation>
@@ -629,6 +633,7 @@
 <translation id="7514365320538308">ଡାଉନ୍‌‌ଲୋଡ୍‌ କରନ୍ତୁ</translation>
 <translation id="7537586195939242955">କ୍ଷମାକରନ୍ତୁ, ଏହି ସମୟରେ ପାସ୍‌ବୁକ୍‌ରେ ଆପଣଙ୍କର ପାସ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରାଯାଇପାରିବ ନାହିଁ।</translation>
 <translation id="7554791636758816595">ନୂତନ ଟ୍ୟାବ୍</translation>
+<translation id="7558943807639707687">ଆପଣ ଏହି ଡିଭାଇସରେ ଆପଣଙ୍କ ବୁକମାର୍କ୍, ଇତିହାସ ଏବଂ ଅନ୍ୟ ଡାଟା ମାଧ୍ୟମରେ କଣ କରିବାକୁ ଚାହିଁବେ?</translation>
 <translation id="7561196759112975576">ସର୍ବଦା</translation>
 <translation id="7583004045319035904">ଆପଣଙ୍କର ଇନକଗ୍ନିଟୋ ଟାବଗୁଡ଼ିକୁ ଅନଲକ୍ କରିବା ପାଇଁ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" />କୁ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ଆଦୌ ଅନୁବାଦ କରନ୍ତୁ ନାହିଁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index 0c511b20..baecc232 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">ਨਵੀਂ ਟੈਬ</translation>
 <translation id="3551320343578183772">ਟੈਬ ਬੰਦ ਕਰੋ</translation>
 <translation id="3581564640715911333">ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਲਈ ਪੇਸ਼ਕਸ਼ ਕਰੋ</translation>
+<translation id="3588492282865875287">ਕੀ ਸਾਈਨ-ਆਊਟ ਕਰਨਾ ਹੈ?</translation>
 <translation id="3588820906588687999">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation>
 <translation id="359441731697487922">ਤੁਸੀਂ Chrome ਨੂੰ ਆਪਣੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਐਪ ਬਣਾ ਕੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਇਸ ਵਿੱਚ ਲਿੰਕ ਖੋਲ੍ਹ ਸਕਦੇ ਹੋ। ਹੇਠਾਂ ਦਿੱਤੇ ਪੜਾਵਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ:</translation>
 <translation id="3603009562372709545">ਲਿੰਕ URL ਕਾਪੀ ਕਰੋ</translation>
@@ -408,6 +409,7 @@
 <translation id="5317780077021120954">ਰੱਖਿਅਤ ਕਰੋ</translation>
 <translation id="5327248766486351172">ਨਾਮ</translation>
 <translation id="5339316356165661760">ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ</translation>
+<translation id="5351284593342054342">ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਕਲੀਅਰ ਕਰੋ</translation>
 <translation id="5388358297987318779">ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation>
 <translation id="5407969256130905701">ਤਬਦੀਲੀਆਂ ਰੱਦ ਕਰੋ</translation>
 <translation id="5409365236829784218">ਅਜਿਹੀਆਂ ਕੋਈ ਵੀ ਐਪਲੀਕੇਸ਼ਨਾਂ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ, ਜੋ ਇਸ ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹ ਸਕਣ।</translation>
@@ -463,6 +465,7 @@
 <translation id="5948291296578561264">ਇਹ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਫ਼ੋਟੋ ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਫ਼ੋਟੋਆਂ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਦਿੰਦਾ ਹੈ।</translation>
 <translation id="5955891643922670672">ਆਫ਼ਲਾਈਨ ਵਰਜਨ ਦੇਖਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="5957613098218939406">ਹੋਰ ਵਿਕਲਪ</translation>
+<translation id="5961521066940389233">ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖੋ</translation>
 <translation id="5964480694698977962">ਨਵੀਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬ ਬਣਾਓ।</translation>
 <translation id="5965679971710331625">ਤੁਸੀਂ ਸਾਈਨ ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation>
 <translation id="5979837087407522202">ਪਾਸਵਰਡ ਖੋਜੋ</translation>
@@ -477,6 +480,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">ਆਪਣੀਆਂ ਕਹਾਣੀਆਂ ਅਤੇ ਸਰਗਰਮੀ ਨੂੰ ਇੱਥੇ ਕੰਟਰੋਲ ਕਰੋ</translation>
 <translation id="6066301408025741299">ਰੱਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।</translation>
+<translation id="6085282545406522838">ਤੁਹਾਡਾ ਸਮਕਾਲੀਕਿਰਤ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਬਰਕਰਾਰ ਰਹੇਗਾ।</translation>
 <translation id="6108923351542677676">ਸੈਟਅਪ ਚਾਲੂ ਹੈ...</translation>
 <translation id="6119050551270742952">ਵਰਤਮਾਨ ਵੈੱਬਪੰਨਾ ਇਨਕੋਗਨਿਟੋ 'ਤੇ</translation>
 <translation id="6122191549521593678">ਆਨਲਾਈਨ</translation>
@@ -629,6 +633,7 @@
 <translation id="7514365320538308">ਡਾਊਨਲੋਡ ਕਰੋ</translation>
 <translation id="7537586195939242955">ਮਾਫ਼ ਕਰਨਾ, ਤੁਹਾਡਾ ਪਾਸ ਇਸ ਵੇਲੇ ਪਾਸਬੁੱਕ ਤੇ ਇੰਸਟੌਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation>
 <translation id="7554791636758816595">ਨਵੀਂ ਟੈਬ</translation>
+<translation id="7558943807639707687">ਤੁਸੀਂ ਇਸ ਡੀਵਾਈਸ ਦੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ ਅਤੇ ਹੋਰ ਡਾਟੇ ਨਾਲ ਕੀ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="7561196759112975576">ਹਮੇਸ਼ਾਂ</translation>
 <translation id="7583004045319035904">ਆਪਣੀਆਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ਦਾ ਕਦੇ ਵੀ ਅਨੁਵਾਦ ਨਾ ਕਰੋ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index b68d4bfa..df30c4da 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">புதிய தாவல்</translation>
 <translation id="3551320343578183772">தாவலை மூடுக</translation>
 <translation id="3581564640715911333">பக்கங்களைப் பிற மொழிகளில் மொழிபெயர்க்க அனுமதி</translation>
+<translation id="3588492282865875287">வெளியேறவா?</translation>
 <translation id="3588820906588687999">படத்தைப் புதிய தாவலில் திற</translation>
 <translation id="359441731697487922">Chromeமை உங்கள் இயல்பு உலாவி ஆப்ஸாக அமைப்பதன் மூலம் இணைப்புகளை அதில் தானாகவே திறக்கலாம்.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">சேமி</translation>
 <translation id="5327248766486351172">பெயர்</translation>
 <translation id="5339316356165661760">ஒத்திசைவை இயக்கு</translation>
+<translation id="5351284593342054342">இந்தச் சாதனத்திலிருந்து அழி</translation>
 <translation id="5388358297987318779">படத்தைத் திற</translation>
 <translation id="5407969256130905701">மாற்றங்களை நிராகரி</translation>
 <translation id="5409365236829784218">இந்தக் கோப்பைத் திறக்கக்கூடிய ஆப்ஸ் எதுவும் நிறுவப்படவில்லை.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">உங்கள் பட நூலகத்தில் படங்களைச் சேமிக்க இது அனுமதிக்கும்.</translation>
 <translation id="5955891643922670672">ஆஃப்லைன் பதிப்பைப் பார்க்கிறீர்கள்</translation>
 <translation id="5957613098218939406">கூடுதல் விருப்பங்கள்</translation>
+<translation id="5961521066940389233">இந்தச் சாதனத்தில் வைத்திரு</translation>
 <translation id="5964480694698977962">புதிய மறைநிலைத் தாவலை உருவாக்கு</translation>
 <translation id="5965679971710331625">உள்நுழைந்துள்ளீர்கள்</translation>
 <translation id="5979837087407522202">கடவுச்சொற்களைத் தேடு</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">உங்கள் செய்திகளையும் செயல்பாட்டையும் இங்கே கட்டுப்படுத்தலாம்</translation>
 <translation id="6066301408025741299">ரத்துசெய்ய தட்டவும்.</translation>
+<translation id="6085282545406522838">ஏற்கெனவே ஒத்திசைக்கப்பட்ட தரவு தொடர்ந்து உங்கள் Google கணக்கிலேயே இருக்கும்.</translation>
 <translation id="6108923351542677676">அமைவு செயலிலுள்ளது...</translation>
 <translation id="6119050551270742952">இந்த இணையப் பக்கம் மறைநிலையில் உள்ளது</translation>
 <translation id="6122191549521593678">ஆன்லைன்</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">பதிவிறக்கு</translation>
 <translation id="7537586195939242955">வருந்துகிறோம், இந்த நேரத்தில் உங்கள் பாஸை பாஸ்புக்கில் நிறுவ முடியாது.</translation>
 <translation id="7554791636758816595">புதிய தாவல்</translation>
+<translation id="7558943807639707687">இந்தச் சாதனத்தில் இருக்கும் புக்மார்க்குகள், வரலாறு மற்றும் பிற தரவை என்ன செய்ய விரும்புகிறீர்கள்?</translation>
 <translation id="7561196759112975576">எப்போதும்</translation>
 <translation id="7583004045319035904">மறைநிலைத் தாவல்களைத் திறக்க <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ஐப் பயன்படுத்தவும்.</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ஐ எப்போதும் மொழிபெயர்க்க வேண்டாம்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 2580adba..ae29e75 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">కొత్త ట్యాబ్</translation>
 <translation id="3551320343578183772">ట్యాబ్‌ను మూసివేయి</translation>
 <translation id="3581564640715911333">ఇతర భాషలలో ఉన్న పేజీలను అనువదించడాన్ని ఆఫర్ చేస్తుంది</translation>
+<translation id="3588492282865875287">సైన్ అవుట్ చేయాలా?</translation>
 <translation id="3588820906588687999">చిత్రాన్ని కొత్త ట్యాబ్‌లో తెరువు</translation>
 <translation id="359441731697487922">Chromeను మీ ఆటోమేటిక్ బ్రౌజర్ యాప్‌గా చేయడం ద్వారా, దానిలో లింక్‌లను ఆటోమేటిక్‌గా తెరవండి.
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">సేవ్ చేయి</translation>
 <translation id="5327248766486351172">పేరు</translation>
 <translation id="5339316356165661760">సింక్‌ను ఆన్ చేయి</translation>
+<translation id="5351284593342054342">ఈ పరికరం నుండి క్లియర్ చేయి</translation>
 <translation id="5388358297987318779">చిత్రాన్ని తెరువు</translation>
 <translation id="5407969256130905701">మార్పులను విస్మరించు</translation>
 <translation id="5409365236829784218">ఈ ఫైల్‌ను తెరవగలిగే యాప్‌లు ఇన్‌స్టాల్ చేయబడలేదు.</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">ఇది మీ ఫోటో లైబ్రరీకి ఫోటోలను సేవ్ చేయడానికి మీకు వీలు కల్పిస్తుంది.</translation>
 <translation id="5955891643922670672">ఆఫ్‌లైన్ వెర్షన్‌ను చూస్తున్నారు</translation>
 <translation id="5957613098218939406">మరిన్ని ఎంపికలు</translation>
+<translation id="5961521066940389233">ఈ పరికరంలో ఉంచు</translation>
 <translation id="5964480694698977962">కొత్త అజ్ఞాత ట్యాబ్‌ను సృష్టించండి.</translation>
 <translation id="5965679971710331625">మీరు సైన్ ఇన్ చేసారు</translation>
 <translation id="5979837087407522202">పాస్‌వర్డ్‌లను వెతుకు</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">ఇక్కడ మీ కథనాలు, యాక్టివిటీని కంట్రోల్ చేయండి</translation>
 <translation id="6066301408025741299">రద్దు చేయడానికి నొక్కండి.</translation>
+<translation id="6085282545406522838">మీ సింక్ చేయబడిన డేటా మీ Google ఖాతాలోనే ఉండిపోతుంది.</translation>
 <translation id="6108923351542677676">సెటప్ ప్రోగ్రెస్‌లో ఉంది...</translation>
 <translation id="6119050551270742952">ప్రస్తుత వెబ్‌పేజీ అజ్ఞాత మోడ్‌లో ఉంది</translation>
 <translation id="6122191549521593678">ఆన్‌లైన్</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">డౌన్‌లోడ్ చేయి</translation>
 <translation id="7537586195939242955">క్షమించండి, ఈ సమయంలో పాస్‌బుక్‌కు మీ పాస్‌ను ఇన్‌స్టాల్ చేయడం సాధ్యపడదు.</translation>
 <translation id="7554791636758816595">కొత్త ట్యాబ్</translation>
+<translation id="7558943807639707687">మీరు ఈ పరికరంలోని మీ బుక్‌మార్క్‌లు, హిస్టరీ, అలాగే ఇతర డేటాతో ఏం చేయాలనుకుంటున్నారు?</translation>
 <translation id="7561196759112975576">ఎల్లప్పుడూ</translation>
 <translation id="7583004045319035904">మీ అజ్ఞాత ట్యాబ్‌లను అన్‌లాక్ చేయడానికి <ph name="BIOMETRIC_AUTHENITCATION_TYPE" />ను ఉపయోగించండి.</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" />ను ఎప్పటికీ అనువదించవద్దు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index 42f1fe4..db8cd9f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -257,6 +257,7 @@
 <translation id="3533436815740441613">نیا ٹیب</translation>
 <translation id="3551320343578183772">ٹیب بند کریں</translation>
 <translation id="3581564640715911333">صفحات کو دیگر زبانوں میں ترجمہ کرنے کی پیشکش کریں</translation>
+<translation id="3588492282865875287">سائن آؤٹ کریں؟</translation>
 <translation id="3588820906588687999">تصویر نئے ٹیب میں کھولیں</translation>
 <translation id="359441731697487922">‏آپ Chrome کو اپنی ڈیفالٹ براؤزر ایپ بنا کر میں لنکس کو خود کار طور پر کھول سکتے ہیں۔
       
@@ -410,6 +411,7 @@
 <translation id="5317780077021120954">محفوظ کریں</translation>
 <translation id="5327248766486351172">نام</translation>
 <translation id="5339316356165661760">مطابقت پذیری آن کریں</translation>
+<translation id="5351284593342054342">اس آلے سے صاف کریں</translation>
 <translation id="5388358297987318779">تصویر کھولیں</translation>
 <translation id="5407969256130905701">تبدیلیاں مسترد کریں</translation>
 <translation id="5409365236829784218">کوئی ایسی ایپلیکیشنز انسٹال نہیں کی گئی ہیں جو اس فائل کو کھول سکتی ہوں۔</translation>
@@ -465,6 +467,7 @@
 <translation id="5948291296578561264">یہ آپ کو اپنی تصویری لائبریری میں تصاویر محفوظ کرنے دیتا ہے۔</translation>
 <translation id="5955891643922670672">آف لائن ورژن دیکھنا</translation>
 <translation id="5957613098218939406">مزید اختیارات</translation>
+<translation id="5961521066940389233">اس آلے پر رکھیں</translation>
 <translation id="5964480694698977962">نیا پوشیدگی ٹیب بنائیں۔</translation>
 <translation id="5965679971710331625">آپ سائن ان ہیں</translation>
 <translation id="5979837087407522202">پاس ورڈز تلاش کریں</translation>
@@ -479,6 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">اپنی کہانیوں اور سرگرمی کو یہاں کنٹرول کریں</translation>
 <translation id="6066301408025741299">منسوخ کرنے کیلئے تھپتھپائیں۔</translation>
+<translation id="6085282545406522838">‏آپ کا سِنک کردہ ڈیٹا ہنوز آپ کے Google اکاؤنٹ میں رہے گا۔</translation>
 <translation id="6108923351542677676">سیٹ اپ جاری ہے…</translation>
 <translation id="6119050551270742952">موجودہ ویب صفحہ پوشیدگی پر ہے</translation>
 <translation id="6122191549521593678">آن لائن</translation>
@@ -631,6 +635,7 @@
 <translation id="7514365320538308">ڈاؤن لوڈ کریں</translation>
 <translation id="7537586195939242955">‏معذرت، آپ کا Pass اس وقت Passbook میں انسٹال نہیں کیا جا سکتا ہے۔</translation>
 <translation id="7554791636758816595">نیا ٹیب</translation>
+<translation id="7558943807639707687">آپ اپنے بُک مارکس کی سرگزشت اور اس آلے پر موجود دوسرے ڈیٹا کے ساتھ کیا کرنا پسند کریں گے؟</translation>
 <translation id="7561196759112975576">ہمیشہ</translation>
 <translation id="7583004045319035904">اپنے پوشیدگی ٹیبز کو غیر مقفل کرنے کیلئے <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> کا استعمال کریں۔</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> کا کبھی بھی ترجمہ نہ کریں</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 864a7e3..597cd86 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -411,7 +411,7 @@
 <translation id="5317780077021120954">儲存</translation>
 <translation id="5327248766486351172">名稱</translation>
 <translation id="5339316356165661760">開啟同步處理功能</translation>
-<translation id="5351284593342054342">從這部裝置清除</translation>
+<translation id="5351284593342054342">從此裝置清除</translation>
 <translation id="5388358297987318779">開啟圖片</translation>
 <translation id="5407969256130905701">捨棄變更</translation>
 <translation id="5409365236829784218">未安裝可開啟這個檔案的應用程式。</translation>
@@ -482,7 +482,7 @@
 <translation id="605721222689873409">YY</translation>
 <translation id="6059830886158432458">請在這裡控制您的報導和活動</translation>
 <translation id="6066301408025741299">輕觸即可取消。</translation>
-<translation id="6085282545406522838">已同步處理的資料會繼續保留在你的 Google 帳戶中。</translation>
+<translation id="6085282545406522838">已同步處理的資料會繼續保留在 Google 帳戶中。</translation>
 <translation id="6108923351542677676">設定中…</translation>
 <translation id="6119050551270742952">目前的網頁已處於無痕模式</translation>
 <translation id="6122191549521593678">線上</translation>
@@ -633,7 +633,7 @@
 <translation id="7514365320538308">下載</translation>
 <translation id="7537586195939242955">很抱歉,目前無法將您的通行票證加到 Passbook。</translation>
 <translation id="7554791636758816595">新分頁</translation>
-<translation id="7558943807639707687">你打算如何處理這部裝置上的書籤、歷史記錄和其他資料?</translation>
+<translation id="7558943807639707687">您想如何處理此裝置上的書籤、記錄和其他資料?</translation>
 <translation id="7561196759112975576">永遠使用</translation>
 <translation id="7583004045319035904">使用 <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> 解鎖無痕式分頁。</translation>
 <translation id="7600965453749440009">永遠不要翻譯<ph name="LANGUAGE" /></translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 0a9b826..f73c930 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -692,6 +692,19 @@
     }];
   }
 
+  // If an incognito mode availability is set, add the policy key to the list of
+  // allowed experimental policies, and set the value.
+  NSString* incognito_policy_key =
+      base::SysUTF8ToNSString(policy::key::kIncognitoModeAvailability);
+  NSInteger incognito_mode_availability =
+      [defaults integerForKey:incognito_policy_key];
+  if (incognito_mode_availability) {
+    [allowed_experimental_policies addObject:incognito_policy_key];
+    [testing_policies addEntriesFromDictionary:@{
+      incognito_policy_key : @(incognito_mode_availability),
+    }];
+  }
+
   // If a CBCM enrollment token is provided, force Chrome Browser Cloud
   // Management to enabled, add the token to the list of policies, and allow
   // the CloudReportingEnabled experimental policy.
diff --git a/ios/chrome/browser/reading_list/offline_page_tab_helper.h b/ios/chrome/browser/reading_list/offline_page_tab_helper.h
index d3b9f52..3c91ba6 100644
--- a/ios/chrome/browser/reading_list/offline_page_tab_helper.h
+++ b/ios/chrome/browser/reading_list/offline_page_tab_helper.h
@@ -46,6 +46,9 @@
   // Returns true if reading list model has processed entry for the given url.
   bool HasDistilledVersionForOnlineUrl(const GURL& url) const;
 
+  // Returns true if offline page can handle this url loading.
+  bool CanHandleErrorLoadingURL(const GURL& url) const;
+
  private:
   friend class web::WebStateUserData<OfflinePageTabHelper>;
 
@@ -99,6 +102,9 @@
   // Returns the URL of the Reading List entry given a navigation URL.
   GURL GetOnlineURLFromNavigationURL(const GURL& url) const;
 
+  // Injects some JS to replace the current page with |url| and reload the page.
+  void ReplaceLocationUrlAndReload(const GURL& url);
+
   web::WebState* web_state_ = nullptr;
   ReadingListModel* reading_list_model_ = nullptr;
 
@@ -128,10 +134,18 @@
   // Whether the latest navigation started for this tab helper was initiated
   // with chrome://offline URL.
   bool is_offline_navigation_ = false;
+  // Whether the latest navigation started for this tab helper was a reload.
+  bool is_reload_navigation_ = false;
+  // Whether the latest navigation started for this tab helper is a new one.
+  bool is_new_navigation_ = false;
   // Some parameters of the latest navigation started observed by this tab
   // helper.
   ui::PageTransition navigation_transition_type_ = ui::PAGE_TRANSITION_FIRST;
   bool navigation_is_renderer_initiated_ = false;
+  // On next navigation, don't reload the online page.
+  bool dont_reload_online_on_next_navigation_ = false;
+  // Whether a reload navigation has just been triggered.
+  bool reloading_from_offline_ = false;
 
   WEB_STATE_USER_DATA_KEY_DECL();
 
diff --git a/ios/chrome/browser/reading_list/offline_page_tab_helper.mm b/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
index 2af07b8f68..4aa0c48 100644
--- a/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
+++ b/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
@@ -23,6 +23,7 @@
 #include "ios/chrome/browser/reading_list/reading_list_download_service.h"
 #include "ios/chrome/browser/reading_list/reading_list_download_service_factory.h"
 #import "ios/web/public/navigation/navigation_context.h"
+#import "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/thread/web_task_traits.h"
 #include "ios/web/public/thread/web_thread.h"
@@ -137,8 +138,14 @@
   DCHECK(mime);
   presenting_offline_page_ = true;
   NSData* ns_data = [NSData dataWithBytes:data.c_str() length:data.size()];
-  offline_navigation_triggered_ = url;
-  web_state_->LoadData(ns_data, mime, url);
+  offline_navigation_triggered_ = reading_list::OfflineReloadURLForURL(url);
+  dont_reload_online_on_next_navigation_ = true;
+  web_state_->LoadData(ns_data, mime, offline_navigation_triggered_);
+  // LoadData replace the last committed item and will set the URL to
+  // |offline_navigation_triggered_|. Set the VirtualURL to |url| so it is
+  // displayed in the omnibox.
+  web_state_->GetNavigationManager()->GetLastCommittedItem()->SetVirtualURL(
+      url);
 }
 
 void OfflinePageTabHelper::DidStartNavigation(web::WebState* web_state,
@@ -155,12 +162,23 @@
   loading_slow_or_failed_ = false;
   navigation_committed_ = false;
   last_navigation_started_++;
-  bool is_reload = ui::PageTransitionTypeIncludingQualifiersIs(
-      context->GetPageTransition(), ui::PAGE_TRANSITION_RELOAD);
-  is_offline_navigation_ = reading_list::IsOfflineURL(initial_navigation_url_);
-  navigation_transition_type_ = context->GetPageTransition();
-  navigation_is_renderer_initiated_ = context->IsRendererInitiated();
-  if (!is_reload || !presenting_offline_page_) {
+
+  if (!reloading_from_offline_) {
+    is_reload_navigation_ = ui::PageTransitionTypeIncludingQualifiersIs(
+        context->GetPageTransition(), ui::PAGE_TRANSITION_RELOAD);
+    is_offline_navigation_ =
+        reading_list::IsOfflineEntryURL(initial_navigation_url_);
+    is_new_navigation_ =
+        ui::PageTransitionIsNewNavigation(navigation_transition_type_);
+    navigation_transition_type_ = context->GetPageTransition();
+    navigation_is_renderer_initiated_ = context->IsRendererInitiated();
+  }
+
+  if (reading_list::IsOfflineReloadURL(context->GetUrl())) {
+    return;
+  }
+  reloading_from_offline_ = false;
+  if (!is_reload_navigation_ || !presenting_offline_page_) {
     StartCheckingLoadingProgress(initial_navigation_url_);
   }
   presenting_offline_page_ = false;
@@ -173,11 +191,38 @@
     return;
   }
   navigation_committed_ = navigation_context->HasCommitted();
+
+  if (reading_list::IsOfflineReloadURL(navigation_context->GetUrl())) {
+    if (dont_reload_online_on_next_navigation_) {
+      dont_reload_online_on_next_navigation_ = false;
+    } else {
+      ReplaceLocationUrlAndReload(
+          reading_list::ReloadURLForOfflineURL(navigation_context->GetUrl()));
+      return;
+    }
+  }
   if (!presenting_offline_page_) {
     PresentOfflinePageForOnlineUrl(initial_navigation_url_);
   }
 }
 
+void OfflinePageTabHelper::ReplaceLocationUrlAndReload(const GURL& url) {
+  DCHECK(presenting_offline_page_);
+  web_state_->GetNavigationManager()->GetLastCommittedItem()->SetVirtualURL(
+      url);
+  reloading_from_offline_ = true;
+  std::string encoded_url;
+  if (url.is_valid() && url.SchemeIsHTTPOrHTTPS()) {
+    base::Base64Encode(url.spec(), &encoded_url);
+  } else {
+    base::Base64Encode("about:blank", &encoded_url);
+  }
+  NSString* js =
+      [NSString stringWithFormat:@"window.location.replace(atob('%@'));",
+                                 base::SysUTF8ToNSString(encoded_url)];
+  web_state_->ExecuteUserJavaScript(js);
+}
+
 GURL OfflinePageTabHelper::GetOnlineURLFromNavigationURL(
     const GURL& url) const {
   if (url.host() == kChromeUIOfflineHost) {
@@ -189,6 +234,9 @@
 void OfflinePageTabHelper::PageLoaded(
     web::WebState* web_state,
     web::PageLoadCompletionStatus load_completion_status) {
+  if (reading_list::IsOfflineReloadURL(initial_navigation_url_)) {
+    return;
+  }
   StopCheckingLoadingProgress();
   // If the offline page was loaded directly, the initial_navigation_url_ is
   // chrome://offline?... and triggers a load error. Extract the meaningful
@@ -250,11 +298,8 @@
   //   In this case, it will be cancel and a new placeholder navigation will be
   //   triggerred that will always becommitted. This new navigation will be
   //   replaced by offline version.
-  bool is_reload = ui::PageTransitionTypeIncludingQualifiersIs(
-      navigation_transition_type_, ui::PAGE_TRANSITION_RELOAD);
-  bool is_new_navigation =
-      ui::PageTransitionIsNewNavigation(navigation_transition_type_);
-  bool can_work_on_not_committed_navigation = is_reload || is_new_navigation;
+  bool can_work_on_not_committed_navigation =
+      is_reload_navigation_ || is_new_navigation_;
   bool can_load_offline =
       navigation_committed_ || can_work_on_not_committed_navigation;
   if (!can_load_offline) {
@@ -268,7 +313,7 @@
   }
   GURL entry_url = GetOnlineURLFromNavigationURL(url);
   const ReadingListEntry* entry = reading_list_model_->GetEntryByURL(entry_url);
-  if (!is_offline_navigation_ && is_new_navigation && !navigation_committed_) {
+  if (!is_offline_navigation_ && is_new_navigation_ && !navigation_committed_) {
     // If the current navigation was not committed, but it was a new navigation,
     // a new placeholder navigation with a chrome://offline URL can be created
     // which will be replaced by the offline version on load failure.
@@ -297,7 +342,7 @@
       base::BindOnce(&GetOfflineData, offline_root, offline_path),
       base::BindOnce(&OfflinePageTabHelper::LoadData,
                      weak_factory_.GetWeakPtr(), last_navigation_started_,
-                     entry->DistilledURL(), offline_path.Extension()));
+                     entry_url, offline_path.Extension()));
 }
 
 bool OfflinePageTabHelper::HasDistilledVersionForOnlineUrl(
@@ -315,6 +360,11 @@
   return entry->DistilledState() == ReadingListEntry::PROCESSED;
 }
 
+bool OfflinePageTabHelper::CanHandleErrorLoadingURL(const GURL& url) const {
+  return HasDistilledVersionForOnlineUrl(url) ||
+         reading_list::IsOfflineReloadURL(url);
+}
+
 void OfflinePageTabHelper::StartCheckingLoadingProgress(const GURL& url) {
   if (reading_list_model_->loaded() && !HasDistilledVersionForOnlineUrl(url)) {
     // No need to launch the timer if there is no distilled version.
diff --git a/ios/chrome/browser/reading_list/offline_url_utils.cc b/ios/chrome/browser/reading_list/offline_url_utils.cc
index 09d57ea..6d7343e 100644
--- a/ios/chrome/browser/reading_list/offline_url_utils.cc
+++ b/ios/chrome/browser/reading_list/offline_url_utils.cc
@@ -17,6 +17,7 @@
 
 namespace {
 const char kEntryURLQueryParam[] = "entryURL";
+const char kReloadURLQueryParam[] = "reload";
 const char kVirtualURLQueryParam[] = "virtualURL";
 }
 
@@ -41,6 +42,15 @@
   return page_url;
 }
 
+GURL OfflineReloadURLForURL(const GURL& entry_url) {
+  DCHECK(entry_url.is_valid());
+  GURL page_url(kChromeUIOfflineURL);
+  page_url = net::AppendQueryParameter(page_url, kReloadURLQueryParam,
+                                       entry_url.spec());
+
+  return page_url;
+}
+
 GURL EntryURLForOfflineURL(const GURL& offline_url) {
   std::string entry_url_string;
   if (net::GetValueForKeyInQuery(offline_url, kEntryURLQueryParam,
@@ -81,8 +91,27 @@
   return file_url;
 }
 
+GURL ReloadURLForOfflineURL(const GURL& offline_url) {
+  std::string reload_url_string;
+  if (net::GetValueForKeyInQuery(offline_url, kReloadURLQueryParam,
+                                 &reload_url_string)) {
+    GURL reload_url = GURL(reload_url_string);
+    if (reload_url.is_valid()) {
+      return reload_url;
+    }
+  }
+  return GURL::EmptyGURL();
+}
+
 bool IsOfflineURL(const GURL& url) {
   return url.SchemeIs(kChromeUIScheme) && url.host() == kChromeUIOfflineHost;
 }
 
+bool IsOfflineEntryURL(const GURL& url) {
+  return IsOfflineURL(url) && EntryURLForOfflineURL(url).is_valid();
+}
+
+bool IsOfflineReloadURL(const GURL& url) {
+  return IsOfflineURL(url) && ReloadURLForOfflineURL(url).is_valid();
+}
 }
diff --git a/ios/chrome/browser/reading_list/offline_url_utils.h b/ios/chrome/browser/reading_list/offline_url_utils.h
index e5da70f..8a8044d 100644
--- a/ios/chrome/browser/reading_list/offline_url_utils.h
+++ b/ios/chrome/browser/reading_list/offline_url_utils.h
@@ -23,6 +23,10 @@
                        const GURL& entry_url,
                        const GURL& virtual_url);
 
+// Create a chrome://offline/ URL that embeds entry_url in a "reload"
+// parameters.
+GURL OfflineReloadURLForURL(const GURL& entry_url);
+
 // If |offline_url| has a "entryURL" query params that is a URL, returns it.
 // If not, return GURL::EmptyURL().
 GURL EntryURLForOfflineURL(const GURL& offline_url);
@@ -39,9 +43,19 @@
                             const base::FilePath& offline_path,
                             GURL* resources_root_url);
 
+// If |offline_url| has a "reload" query params that is a URL, returns it.
+// If not, return GURL::EmptyURL().
+GURL ReloadURLForOfflineURL(const GURL& offline_url);
+
 // Returns whether the URL points to a chrome offline URL.
 bool IsOfflineURL(const GURL& url);
 
+// Returns whether the URL points to a chrome offline URL with entry data.
+bool IsOfflineEntryURL(const GURL& url);
+
+// Returns whether the URL points to a chrome offline URL with reload data.
+bool IsOfflineReloadURL(const GURL& url);
+
 }  // namespace reading_list
 
 #endif  // IOS_CHROME_BROWSER_READING_LIST_OFFLINE_URL_UTILS_H_
diff --git a/ios/chrome/browser/reading_list/offline_url_utils_unittest.cc b/ios/chrome/browser/reading_list/offline_url_utils_unittest.cc
index 675a5f39..af081db 100644
--- a/ios/chrome/browser/reading_list/offline_url_utils_unittest.cc
+++ b/ios/chrome/browser/reading_list/offline_url_utils_unittest.cc
@@ -122,4 +122,66 @@
   EXPECT_TRUE(reading_list::IsOfflineURL(GURL("chrome://offline/foobar")));
   EXPECT_TRUE(
       reading_list::IsOfflineURL(GURL("chrome://offline/foobar?foo=bar")));
+  EXPECT_TRUE(reading_list::IsOfflineURL(
+      GURL("chrome://offline/foobar?entryURL=http%3A%2F%2Ffoo.bar%2F")));
+  EXPECT_TRUE(reading_list::IsOfflineURL(
+      GURL("chrome://offline/foobar?reload=http%3A%2F%2Ffoo.bar%2F")));
+}
+
+// Checks that the offline URLs are correctly detected by |IsOfflineEntryURL|.
+TEST_F(OfflineURLUtilsTest, IsOfflineEntryURL) {
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(GURL()));
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(GURL("chrome://")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineEntryURL(GURL("chrome://offline-foobar")));
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(GURL("http://offline/")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineEntryURL(GURL("http://chrome://offline/")));
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(GURL("chrome://offline")));
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(GURL("chrome://offline/")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineEntryURL(GURL("chrome://offline/foobar")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineEntryURL(GURL("chrome://offline/foobar?foo=bar")));
+  EXPECT_TRUE(reading_list::IsOfflineEntryURL(
+      GURL("chrome://offline/foobar?entryURL=http%3A%2F%2Ffoo.bar%2F")));
+  EXPECT_FALSE(reading_list::IsOfflineEntryURL(
+      GURL("chrome://offline/foobar?reload=http%3A%2F%2Ffoo.bar%2F")));
+}
+
+// Checks that the offline URLs are correctly detected by |IsOfflineReloadURL|.
+TEST_F(OfflineURLUtilsTest, IsOfflineReloadURL) {
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(GURL()));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(GURL("chrome://")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineReloadURL(GURL("chrome://offline-foobar")));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(GURL("http://offline/")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineReloadURL(GURL("http://chrome://offline/")));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(GURL("chrome://offline")));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(GURL("chrome://offline/")));
+  EXPECT_FALSE(
+      reading_list::IsOfflineReloadURL(GURL("chrome://offline/foobar")));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(
+      GURL("chrome://offline/foobar?foo=bar")));
+  EXPECT_FALSE(reading_list::IsOfflineReloadURL(
+      GURL("chrome://offline/foobar?entryURL=http%3A%2F%2Ffoo.bar%2F")));
+  EXPECT_TRUE(reading_list::IsOfflineReloadURL(
+      GURL("chrome://offline/foobar?reload=http%3A%2F%2Ffoo.bar%2F")));
+}
+
+// Checks the offline URL to reload URL is
+// chrome://offline?reload=URL
+TEST_F(OfflineURLUtilsTest, OfflineReloadURLForURLTest) {
+  GURL reload_url = GURL("http://foo.bar");
+  GURL offline_url = reading_list::OfflineReloadURLForURL(reload_url);
+  EXPECT_EQ("chrome://offline/?reload=http%3A%2F%2Ffoo.bar%2F",
+            offline_url.spec());
+}
+
+// Extracts the reload URL from chrome://offline?reload=URL
+TEST_F(OfflineURLUtilsTest, ReloadURLForOfflineURLTest) {
+  GURL offline_url = GURL("chrome://offline?reload=http%3A%2F%2Ffoo.bar%2F");
+  GURL reload_url = reading_list::ReloadURLForOfflineURL(offline_url);
+  EXPECT_EQ("http://foo.bar/", reload_url.spec());
 }
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
index b7db9f6b..8f996bd 100644
--- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
+++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -166,6 +166,28 @@
 		</dict>
 		<dict>
 			<key>Type</key>
+			<string>PSMultiValueSpecifier</string>
+			<key>Title</key>
+			<string>Incognito Mode</string>
+			<key>Key</key>
+			<string>IncognitoModeAvailability</string>
+			<key>DefaultValue</key>
+			<integer>0</integer>
+			<key>Values</key>
+			<array>
+				<integer>0</integer>
+				<integer>1</integer>
+				<integer>2</integer>
+			</array>
+			<key>Titles</key>
+			<array>
+				<string>Default</string>
+				<string>Disabled</string>
+				<string>Forced</string>
+			</array>
+		</dict>
+		<dict>
+			<key>Type</key>
 			<string>PSTextFieldSpecifier</string>
 			<key>Title</key>
 			<string>CBCM Enrollment Token</string>
diff --git a/ios/chrome/browser/sync/profile_sync_service_factory.cc b/ios/chrome/browser/sync/profile_sync_service_factory.cc
index 3507452e..1729fca 100644
--- a/ios/chrome/browser/sync/profile_sync_service_factory.cc
+++ b/ios/chrome/browser/sync/profile_sync_service_factory.cc
@@ -11,7 +11,6 @@
 #include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/network_time/network_time_tracker.h"
 #include "components/policy/core/common/policy_map.h"
@@ -27,7 +26,6 @@
 #include "ios/chrome/browser/favicon/favicon_service_factory.h"
 #include "ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.h"
 #include "ios/chrome/browser/history/history_service_factory.h"
-#include "ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h"
 #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
 #include "ios/chrome/browser/policy/browser_state_policy_connector.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_factory.h"
@@ -132,7 +130,6 @@
   DependsOn(IdentityManagerFactory::GetInstance());
   DependsOn(IOSChromeGCMProfileServiceFactory::GetInstance());
   DependsOn(IOSChromePasswordStoreFactory::GetInstance());
-  DependsOn(IOSChromeProfileInvalidationProviderFactory::GetInstance());
   DependsOn(IOSUserEventServiceFactory::GetInstance());
   DependsOn(ModelTypeStoreServiceFactory::GetInstance());
   DependsOn(ReadingListModelFactory::GetInstance());
@@ -174,14 +171,6 @@
   init_params.policy_service =
       policy_connector ? policy_connector->GetPolicyService() : nullptr;
 
-  auto* fcm_invalidation_provider =
-      IOSChromeProfileInvalidationProviderFactory::GetForBrowserState(
-          browser_state);
-  if (fcm_invalidation_provider) {
-    init_params.invalidations_identity_provider =
-        fcm_invalidation_provider->GetIdentityProvider();
-  }
-
   auto pss =
       std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
   pss->Initialize();
diff --git a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index 52560256..3c99b8d 100644
--- a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -48,7 +48,7 @@
  protected:
   // Returns the collection of default datatypes.
   std::vector<syncer::ModelType> DefaultDatatypes() {
-    static_assert(41 == syncer::ModelType::NUM_ENTRIES,
+    static_assert(39 == syncer::ModelType::NUM_ENTRIES,
                   "When adding a new type, you probably want to add it here as "
                   "well (assuming it is already enabled).");
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
index 41fd202..4636d8f 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -162,10 +162,10 @@
   if (self) {
     _contentSuggestionsEnabled =
         prefService->FindPreference(prefs::kArticlesForYouEnabled);
-    // TODO(crbug.com/1085419): Stop observing this Service once DiscoverFeed is
-    // launched.
-    _suggestionBridge =
-        std::make_unique<ContentSuggestionsServiceBridge>(self, contentService);
+    if (!IsDiscoverFeedEnabled()) {
+      _suggestionBridge = std::make_unique<ContentSuggestionsServiceBridge>(
+          self, contentService);
+    }
     _contentService = contentService;
     _sectionInformationByCategory = [[NSMutableDictionary alloc] init];
 
@@ -447,10 +447,7 @@
 - (void)contentSuggestionsService:
             (ntp_snippets::ContentSuggestionsService*)suggestionsService
          newSuggestionsInCategory:(ntp_snippets::Category)category {
-  // Ignore newSuggestionsInCategory if the DiscoverFeed is enabled, if not
-  // these might cause some unecessary section updates and crashes.
-  if (IsDiscoverFeedEnabled())
-    return;
+  DCHECK(!IsDiscoverFeedEnabled());
 
   ContentSuggestionsCategoryWrapper* wrapper =
       [ContentSuggestionsCategoryWrapper wrapperWithCategory:category];
@@ -474,10 +471,7 @@
             (ntp_snippets::ContentSuggestionsService*)suggestionsService
                          category:(ntp_snippets::Category)category
                   statusChangedTo:(ntp_snippets::CategoryStatus)status {
-  // Ignore all ContentSuggestionsService if the DiscoverFeed is enabled, if not
-  // these might cause some unecessary section updates and crashes.
-  if (IsDiscoverFeedEnabled())
-    return;
+  DCHECK(!IsDiscoverFeedEnabled());
 
   ContentSuggestionsCategoryWrapper* wrapper =
       [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category];
@@ -510,6 +504,7 @@
             (ntp_snippets::ContentSuggestionsService*)suggestionsService
             suggestionInvalidated:
                 (const ntp_snippets::ContentSuggestion::ID&)suggestion_id {
+  DCHECK(!IsDiscoverFeedEnabled());
   ContentSuggestionsCategoryWrapper* wrapper =
       [[ContentSuggestionsCategoryWrapper alloc]
           initWithCategory:suggestion_id.category()];
@@ -523,6 +518,7 @@
 
 - (void)contentSuggestionsServiceFullRefreshRequired:
     (ntp_snippets::ContentSuggestionsService*)suggestionsService {
+  DCHECK(!IsDiscoverFeedEnabled());
   // The UICollectionView -reloadData method is a no-op if it is called at the
   // same time as other collection updates. This full refresh command can come
   // at the same time as other collection update commands. To make sure that it
@@ -537,6 +533,7 @@
 
 - (void)contentSuggestionsServiceShutdown:
     (ntp_snippets::ContentSuggestionsService*)suggestionsService {
+  DCHECK(!IsDiscoverFeedEnabled());
   // Update dataSink.
 }
 
diff --git a/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.mm b/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.mm
index 25dc6c6..62e1575 100644
--- a/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.mm
+++ b/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.mm
@@ -125,7 +125,7 @@
 }
 
 - (void)updateWindowHasIncognitoContent:(SceneState*)sceneState {
-  BOOL hasIncognitoContent = NO;
+  BOOL hasIncognitoContent = YES;
   if (sceneState.interfaceProvider.hasIncognitoInterface) {
     hasIncognitoContent =
         sceneState.interfaceProvider.incognitoInterface.browser
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn
index 4b0f189..1d63eb57 100644
--- a/ios/chrome/browser/ui/reading_list/BUILD.gn
+++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -201,6 +201,7 @@
     "//net",
     "//net:test_support",
     "//ui/base",
+    "//ui/base:test_support",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
index 5d3f8f7a..5b34ce1 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -11,7 +11,9 @@
 #include "base/bind.h"
 #include "base/ios/ios_util.h"
 #include "base/mac/foundation_util.h"
+#include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
@@ -37,6 +39,7 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/test/embedded_test_server/request_handler_util.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/test/ios/ui_image_test_utils.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -53,6 +56,8 @@
 NSString* const kDistillableTitle = @"Tomato";
 const char kDistillableURL[] = "/potato";
 const char kNonDistillableURL[] = "/beans";
+const char kRedImageURL[] = "/redimage";
+const char kGreenImageURL[] = "/greenimage";
 NSString* const kReadTitle = @"foobar";
 NSString* const kReadURL = @"http://readfoobar.com";
 NSString* const kUnreadTitle = @"I am an unread entry";
@@ -73,6 +78,18 @@
 NSString* const kReadHeader = @"Read";
 NSString* const kUnreadHeader = @"Unread";
 
+NSString* const kCheckImagesJS =
+    @"function checkImages() {"
+    @"  for (img of document.getElementsByTagName('img')) {"
+    @"    s = img.src;"
+    @"    data = s.startsWith('data:');"
+    @"    loaded = img.complete && (img.naturalWidth > 0);"
+    @"    if (data != loaded) return false;"
+    @"  }"
+    @"  return true;"
+    @"}"
+    @"checkImages();";
+
 // Returns the string concatenated |n| times.
 std::string operator*(const std::string& s, unsigned int n) {
   std::ostringstream out;
@@ -363,20 +380,70 @@
   }
   auto response = std::make_unique<net::test_server::DelayedHttpResponse>(
       base::TimeDelta::FromSeconds(delay));
-  response->set_content_type("text/html");
-  if (distillable) {
+
+  if (base::StartsWith(request.relative_url, kDistillableURL)) {
+    response->set_content_type("text/html");
     std::string page_title = "Tomato";
 
     std::string content_to_remove(kContentToRemove);
     std::string content_to_keep(kContentToKeep);
+    std::string green_image_url(kGreenImageURL);
+    std::string red_image_url(kRedImageURL);
 
     response->set_content("<html><head><title>" + page_title +
                           "</title></head>" + content_to_remove * 20 +
-                          "<article>" + content_to_keep * 20 + "</article>" +
+                          "<article>" + content_to_keep * 20 + "<img src='" +
+                          green_image_url +
+                          "'/>"
+                          "<img src='" +
+                          red_image_url +
+                          "'/>"
+                          "</article>" +
                           content_to_remove * 20 + "</html>");
-  } else {
-    response->set_content("<html><head><title>greens</title></head></html>");
+    return std::move(response);
   }
+  if (base::StartsWith(request.relative_url, kNonDistillableURL)) {
+    response->set_content_type("text/html");
+    response->set_content("<html><head><title>greens</title></head></html>");
+    return std::move(response);
+  }
+  NOTREACHED();
+  return std::move(response);
+}
+
+// Serves image URLs.
+// If |serve_red_image| is false, 404 error is returned when red image is
+// requested.
+// |served_red_image| will be set to true whenever red image is requested.
+std::unique_ptr<net::test_server::HttpResponse> HandleImageQueryOrCloseSocket(
+    const bool& serve_red_image,
+    bool& served_red_image,
+    const net::test_server::HttpRequest& request) {
+  auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+  if (base::StartsWith(request.relative_url, kGreenImageURL)) {
+    response->set_content_type("image/png");
+    UIImage* image = ui::test::uiimage_utils::UIImageWithSizeAndSolidColor(
+        CGSizeMake(10, 10), [UIColor greenColor]);
+    NSData* image_data = UIImagePNGRepresentation(image);
+    response->set_content(std::string(
+        static_cast<const char*>(image_data.bytes), image_data.length));
+    return std::move(response);
+  }
+  if (base::StartsWith(request.relative_url, kRedImageURL)) {
+    served_red_image = true;
+    if (!serve_red_image) {
+      response->set_code(net::HTTP_NOT_FOUND);
+      return std::move(response);
+    }
+    response->set_content_type("image/png");
+    UIImage* image = ui::test::uiimage_utils::UIImageWithSizeAndSolidColor(
+        CGSizeMake(10, 10), [UIColor redColor]);
+    NSData* image_data = UIImagePNGRepresentation(image);
+    response->set_content(std::string(
+        static_cast<const char*>(image_data.bytes), image_data.length));
+    return std::move(response);
+  }
+  NOTREACHED();
   return std::move(response);
 }
 
@@ -421,10 +488,15 @@
 @interface ReadingListTestCase : ChromeTestCase
 // YES if test server is replying with valid HTML content (URL query). NO if
 // test server closes the socket.
-@property(atomic) bool serverRespondsWithContent;
+@property(nonatomic, assign) bool serverRespondsWithContent;
+// YES if test server is replying with valid read image. NO if it responds with
+// 404 error.
+@property(nonatomic, assign) bool serverServesRedImage;
+// Server sets this to true when it is requested the red image.
+@property(nonatomic, assign) bool serverServedRedImage;
 
 // The delay after which self.testServer will send a response.
-@property(atomic) NSTimeInterval serverResponseDelay;
+@property(nonatomic, assign) NSTimeInterval serverResponseDelay;
 @end
 
 @implementation ReadingListTestCase
@@ -457,7 +529,18 @@
       base::BindRepeating(&HandleQueryOrCloseSocket,
                           std::cref(_serverRespondsWithContent),
                           std::cref(_serverResponseDelay), false)));
+  self.testServer->RegisterRequestHandler(base::BindRepeating(
+      &net::test_server::HandlePrefixedRequest, kGreenImageURL,
+      base::BindRepeating(&HandleImageQueryOrCloseSocket,
+                          std::cref(_serverServesRedImage),
+                          std::ref(_serverServedRedImage))));
+  self.testServer->RegisterRequestHandler(base::BindRepeating(
+      &net::test_server::HandlePrefixedRequest, kRedImageURL,
+      base::BindRepeating(&HandleImageQueryOrCloseSocket,
+                          std::cref(_serverServesRedImage),
+                          std::ref(_serverServedRedImage))));
   self.serverRespondsWithContent = true;
+  self.serverServesRedImage = true;
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 }
 
@@ -579,6 +662,51 @@
                          kDistillableTitle, @"Wrong page name");
 }
 
+// Tests that offline page does not request online resources.
+- (void)testSavingToReadingListAndLoadDistilledNoOnlineResource {
+  self.serverServesRedImage = false;
+  [ReadingListAppInterface forceConnectionToWifi];
+  GURL distillablePageURL(self.testServer->GetURL(kDistillableURL));
+  GURL nonDistillablePageURL(self.testServer->GetURL(kNonDistillableURL));
+  // Open http://potato
+  [ChromeEarlGrey loadURL:distillablePageURL];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+  AddCurrentPageToReadingList();
+
+  // Navigate to http://beans
+  [ChromeEarlGrey loadURL:nonDistillablePageURL];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+
+  // Verify that an entry with the correct title is present in the reading list.
+  OpenReadingList();
+  AssertEntryVisible(kDistillableTitle);
+
+  WaitForDistillation();
+  self.serverServesRedImage = true;
+  self.serverServedRedImage = false;
+
+  // Long press the entry, and open it offline.
+  LongPressEntry(kDistillableTitle);
+
+  int offlineStringId = IDS_IOS_READING_LIST_CONTENT_CONTEXT_OFFLINE;
+  if ([ChromeEarlGrey isNativeContextMenusEnabled]) {
+    offlineStringId = IDS_IOS_READING_LIST_OPEN_OFFLINE_BUTTON;
+  }
+
+  TapContextMenuButtonWithA11yLabelID(offlineStringId);
+  [ChromeEarlGrey waitForPageToFinishLoading];
+  AssertIsShowingDistillablePage(false, distillablePageURL);
+  GREYAssertFalse(self.serverServedRedImage,
+                  @"Offline page accessed online resource.");
+
+  id checkImage = [ChromeEarlGrey executeJavaScript:kCheckImagesJS];
+  GREYAssert([checkImage isEqual:@YES], @"Incorrect image loading.");
+
+  // Verify that the webState's title is correct.
+  GREYAssertEqualObjects([ChromeEarlGreyAppInterface currentTabTitle],
+                         kDistillableTitle, @"Wrong page name");
+}
+
 // Tests that sharing a web page to the Reading List results in a snackbar
 // appearing, and that the Reading List entry is present in the Reading List.
 // Loads online version by tapping on entry.
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 31156805..f61764f 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -273,6 +273,7 @@
     "search_engine_table_view_controller_unittest.mm",
     "settings_navigation_controller_unittest.mm",
     "settings_root_table_view_controller_unittest.mm",
+    "settings_table_view_controller_mice_unittest.mm",
     "settings_table_view_controller_unittest.mm",
     "translate_table_view_controller_unittest.mm",
     "voice_search_table_view_controller_unittest.mm",
@@ -292,6 +293,7 @@
     "//components/pref_registry",
     "//components/prefs:test_support",
     "//components/search_engines",
+    "//components/signin/ios/browser",
     "//components/strings",
     "//components/sync/driver:test_support",
     "//components/sync_preferences",
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 12a622a..ac64782e 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -155,14 +155,14 @@
   if (syncService->GetDisableReasons().Has(
           syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY)) {
     return kSyncDisabledByAdministrator;
-  } else if (syncSetupService->IsFirstSetupComplete()) {
+  } else if (syncSetupService->IsFirstSetupComplete() &&
+             syncSetupService->IsSyncEnabled()) {
     SyncSetupService::SyncServiceState errorState =
         syncSetupService->GetSyncServiceState();
-    if (syncSetupService->IsSyncEnabled() && IsTransientSyncError(errorState)) {
+    if (IsTransientSyncError(errorState)) {
       return kSyncEnabled;
-    } else {
-      return kSyncEnabledWithError;
     }
+    return kSyncEnabledWithError;
   } else {
     return kSyncOff;
   }
@@ -1484,6 +1484,7 @@
     case kSyncEnabledWithError: {
       SyncSetupService* syncSetupService =
           SyncSetupServiceFactory::GetForBrowserState(_browserState);
+      googleSyncItem.textLayoutConstraintAxis = UILayoutConstraintAxisVertical;
       googleSyncItem.detailText =
           GetSyncErrorDescriptionForSyncSetupService(syncSetupService);
       googleSyncItem.iconImageName = kSyncAndGoogleServicesSyncErrorImageName;
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller_mice_unittest.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller_mice_unittest.mm
new file mode 100644
index 0000000..1fc0cd8
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller_mice_unittest.mm
@@ -0,0 +1,222 @@
+// Copyright 2020 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 "ios/chrome/browser/ui/settings/settings_table_view_controller.h"
+
+#import "base/test/scoped_feature_list.h"
+#import "base/test/task_environment.h"
+#import "components/signin/ios/browser/features.h"
+#import "components/sync/driver/mock_sync_service.h"
+#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/main/test_browser.h"
+#import "ios/chrome/browser/search_engines/template_url_service_factory.h"
+#import "ios/chrome/browser/signin/authentication_service_factory.h"
+#import "ios/chrome/browser/signin/authentication_service_fake.h"
+#import "ios/chrome/browser/sync/profile_sync_service_factory.h"
+#import "ios/chrome/browser/sync/sync_setup_service.h"
+#import "ios/chrome/browser/sync/sync_setup_service_factory.h"
+#import "ios/chrome/browser/sync/sync_setup_service_mock.h"
+#import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/commands/browser_commands.h"
+#import "ios/chrome/browser/ui/commands/browsing_data_commands.h"
+#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h"
+#import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h"
+#import "ios/chrome/grit/ios_chromium_strings.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
+#import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
+#import "ios/web/public/test/web_task_environment.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#import "third_party/ocmock/gtest_support.h"
+#import "ui/base/l10n/l10n_util_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using ::testing::NiceMock;
+using ::testing::Return;
+using web::WebTaskEnvironment;
+
+namespace {
+std::unique_ptr<KeyedService> CreateMockSyncService(
+    web::BrowserState* context) {
+  return std::make_unique<NiceMock<syncer::MockSyncService>>();
+}
+}  // namespace
+
+class SettingsTableViewControllerMICETest
+    : public ChromeTableViewControllerTest {
+ public:
+  void SetUp() override {
+    scoped_feature_.InitAndEnableFeature(signin::kMobileIdentityConsistency);
+    ChromeTableViewControllerTest::SetUp();
+
+    TestChromeBrowserState::Builder builder;
+    builder.AddTestingFactory(ProfileSyncServiceFactory::GetInstance(),
+                              base::BindRepeating(&CreateMockSyncService));
+    builder.AddTestingFactory(
+        SyncSetupServiceFactory::GetInstance(),
+        base::BindRepeating(&SyncSetupServiceMock::CreateKeyedService));
+    builder.AddTestingFactory(
+        ios::TemplateURLServiceFactory::GetInstance(),
+        ios::TemplateURLServiceFactory::GetDefaultFactory());
+    builder.AddTestingFactory(
+        AuthenticationServiceFactory::GetInstance(),
+        base::BindRepeating(
+            &AuthenticationServiceFake::CreateAuthenticationService));
+    chrome_browser_state_ = builder.Build();
+
+    WebStateList* web_state_list = nullptr;
+    browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get(),
+                                             web_state_list);
+
+    sync_setup_service_mock_ = static_cast<SyncSetupServiceMock*>(
+        SyncSetupServiceFactory::GetForBrowserState(
+            chrome_browser_state_.get()));
+    sync_service_mock_ = static_cast<syncer::MockSyncService*>(
+        ProfileSyncServiceFactory::GetForBrowserState(
+            chrome_browser_state_.get()));
+
+    auth_service_ = static_cast<AuthenticationServiceFake*>(
+        AuthenticationServiceFactory::GetInstance()->GetForBrowserState(
+            chrome_browser_state_.get()));
+
+    fake_identity_ = [FakeChromeIdentity identityWithEmail:@"foo1@gmail.com"
+                                                    gaiaID:@"foo1ID"
+                                                      name:@"Fake Foo 1"];
+  }
+
+  void TearDown() override {
+    [static_cast<SettingsTableViewController*>(controller())
+        settingsWillBeDismissed];
+    ChromeTableViewControllerTest::TearDown();
+  }
+
+  ChromeTableViewController* InstantiateController() override {
+    return [[SettingsTableViewController alloc]
+        initWithBrowser:browser_.get()
+             dispatcher:static_cast<id<ApplicationCommands, BrowserCommands,
+                                       BrowsingDataCommands>>(
+                            browser_->GetCommandDispatcher())];
+  }
+
+  void SetupSyncServiceEnabledExpectations() {
+    ON_CALL(*sync_setup_service_mock_, IsSyncEnabled())
+        .WillByDefault(Return(true));
+    ON_CALL(*sync_setup_service_mock_, IsSyncingAllDataTypes())
+        .WillByDefault(Return(true));
+    ON_CALL(*sync_setup_service_mock_, HasFinishedInitialSetup())
+        .WillByDefault(Return(true));
+    ON_CALL(*sync_service_mock_, GetTransportState())
+        .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
+    ON_CALL(*sync_service_mock_->GetMockUserSettings(), IsFirstSetupComplete())
+        .WillByDefault(Return(true));
+    ON_CALL(*sync_service_mock_, IsAuthenticatedAccountPrimary())
+        .WillByDefault(Return(true));
+  }
+
+ protected:
+  // Needed for test browser state created by TestChromeBrowserState().
+  web::WebTaskEnvironment task_environment_;
+  IOSChromeScopedTestingLocalState local_state_;
+  base::test::ScopedFeatureList scoped_feature_;
+
+  FakeChromeIdentity* fake_identity_ = nullptr;
+  AuthenticationServiceFake* auth_service_ = nullptr;
+  syncer::MockSyncService* sync_service_mock_ = nullptr;
+  SyncSetupServiceMock* sync_setup_service_mock_ = nullptr;
+  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+  std::unique_ptr<TestBrowser> browser_;
+
+  SettingsTableViewController* controller_ = nullptr;
+};
+
+// Verifies that the Sync icon displays the on state when the user has turned
+// on sync during sign-in.
+TEST_F(SettingsTableViewControllerMICETest, SyncOn) {
+  SetupSyncServiceEnabledExpectations();
+  ON_CALL(*sync_setup_service_mock_, GetSyncServiceState())
+      .WillByDefault(Return(SyncSetupService::kNoSyncServiceError));
+  auth_service_->SignIn(fake_identity_);
+
+  CreateController();
+  CheckController();
+
+  NSArray* account_items = [controller().tableViewModel
+      itemsInSectionWithIdentifier:SettingsSectionIdentifier::
+                                       SettingsSectionIdentifierAccount];
+  ASSERT_EQ(3U, account_items.count);
+
+  TableViewDetailIconItem* sync_item =
+      static_cast<TableViewDetailIconItem*>(account_items[1]);
+  ASSERT_NSEQ(sync_item.text,
+              l10n_util::GetNSString(IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE));
+  ASSERT_NSEQ(l10n_util::GetNSString(IDS_IOS_SETTING_ON), sync_item.detailText);
+  ASSERT_EQ(UILayoutConstraintAxisHorizontal,
+            sync_item.textLayoutConstraintAxis);
+}
+
+// Verifies that the Sync icon displays the sync password error when the user
+// has turned on sync during sign-in, but not entered an existing encryption
+// password.
+TEST_F(SettingsTableViewControllerMICETest, SyncPasswordError) {
+  SetupSyncServiceEnabledExpectations();
+  // Set missing password error in Sync service.
+  ON_CALL(*sync_setup_service_mock_, GetSyncServiceState())
+      .WillByDefault(Return(SyncSetupService::kSyncServiceNeedsPassphrase));
+  auth_service_->SignIn(fake_identity_);
+
+  CreateController();
+  CheckController();
+
+  NSArray* account_items = [controller().tableViewModel
+      itemsInSectionWithIdentifier:SettingsSectionIdentifier::
+                                       SettingsSectionIdentifierAccount];
+  ASSERT_EQ(3U, account_items.count);
+
+  TableViewDetailIconItem* sync_item =
+      static_cast<TableViewDetailIconItem*>(account_items[1]);
+  ASSERT_NSEQ(sync_item.text,
+              l10n_util::GetNSString(IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE));
+  ASSERT_NSEQ(sync_item.detailText,
+              l10n_util::GetNSString(IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION));
+  ASSERT_EQ(UILayoutConstraintAxisVertical, sync_item.textLayoutConstraintAxis);
+
+  // Check that there is no sign-in promo when there is a sync error.
+  NSArray* identity_items = [controller().tableViewModel
+      itemsInSectionWithIdentifier:SettingsSectionIdentifier::
+                                       SettingsSectionIdentifierSignIn];
+  ASSERT_EQ(0U, identity_items.count);
+}
+
+// Verifies that the Sync icon displays the off state when the user has
+// completed the sign-in and sync flow then explcitly turned off the Sync
+// setting.
+TEST_F(SettingsTableViewControllerMICETest, TurnsSyncOffAfterFirstSetup) {
+  ON_CALL(*sync_service_mock_->GetMockUserSettings(), IsFirstSetupComplete())
+      .WillByDefault(Return(true));
+  ON_CALL(*sync_setup_service_mock_, IsSyncEnabled())
+      .WillByDefault(Return(false));
+  auth_service_->SignIn(fake_identity_);
+
+  CreateController();
+  CheckController();
+
+  NSArray* account_items = [controller().tableViewModel
+      itemsInSectionWithIdentifier:SettingsSectionIdentifier::
+                                       SettingsSectionIdentifierAccount];
+  ASSERT_EQ(3U, account_items.count);
+
+  TableViewDetailIconItem* sync_item =
+      static_cast<TableViewDetailIconItem*>(account_items[1]);
+  ASSERT_NSEQ(l10n_util::GetNSString(IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE),
+              sync_item.text);
+  ASSERT_NSEQ(l10n_util::GetNSString(IDS_IOS_SETTING_OFF),
+              sync_item.detailText);
+}
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
index 570ccc97f5..fd6ea936 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -568,7 +568,11 @@
           self.blockingView.alpha = 0;
         }
         completion:^(BOOL finished) {
-          [self.blockingView removeFromSuperview];
+          if (self.contentNeedsAuthentication) {
+            self.blockingView.alpha = 1;
+          } else {
+            [self.blockingView removeFromSuperview];
+          }
         }];
   }
 }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
index 139d1c0..043fc0d 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -209,11 +209,6 @@
   [self setInsetForGridViews];
 }
 
-- (void)viewWillAppear:(BOOL)animated {
-  [super viewWillAppear:animated];
-  self.incognitoTabsViewController.handler = self.reauthHandler;
-}
-
 - (void)viewWillTransitionToSize:(CGSize)size
        withTransitionCoordinator:
            (id<UIViewControllerTransitionCoordinator>)coordinator {
@@ -453,6 +448,13 @@
   return self.remoteTabsViewController;
 }
 
+- (void)setReauthHandler:(id<IncognitoReauthCommands>)reauthHandler {
+  if (_reauthHandler == reauthHandler)
+    return;
+  _reauthHandler = reauthHandler;
+  self.incognitoTabsViewController.handler = self.reauthHandler;
+}
+
 #pragma mark - TabGridPaging
 
 - (void)setActivePage:(TabGridPage)activePage {
diff --git a/ios/chrome/browser/web/chrome_web_client.mm b/ios/chrome/browser/web/chrome_web_client.mm
index 4e345d8d..eef81c2 100644
--- a/ios/chrome/browser/web/chrome_web_client.mm
+++ b/ios/chrome/browser/web/chrome_web_client.mm
@@ -333,7 +333,7 @@
   // WebState that are not attached to a tab may not have an
   // OfflinePageTabHelper.
   if (offline_page_tab_helper &&
-      offline_page_tab_helper->HasDistilledVersionForOnlineUrl(url)) {
+      (offline_page_tab_helper->CanHandleErrorLoadingURL(url))) {
     // An offline version of the page will be displayed to replace this error
     // page. Loading an error page here can cause a race between the
     // navigation to load the error page and the navigation to display the
diff --git a/ios/web/web_state/ui/wk_content_rule_list_provider.h b/ios/web/web_state/ui/wk_content_rule_list_provider.h
index d7b1e86..1445c1c 100644
--- a/ios/web/web_state/ui/wk_content_rule_list_provider.h
+++ b/ios/web/web_state/ui/wk_content_rule_list_provider.h
@@ -53,6 +53,7 @@
   __weak WKUserContentController* user_content_controller_;
   WKContentRuleList* block_content_rule_list_;
   WKContentRuleList* block_third_party_content_rule_list_;
+  WKContentRuleList* block_local_rule_list_;
 
   base::OnceCallback<void(bool)> update_callback_;
 
diff --git a/ios/web/web_state/ui/wk_content_rule_list_provider.mm b/ios/web/web_state/ui/wk_content_rule_list_provider.mm
index 27ebdf0..5f736c9 100644
--- a/ios/web/web_state/ui/wk_content_rule_list_provider.mm
+++ b/ios/web/web_state/ui/wk_content_rule_list_provider.mm
@@ -48,6 +48,18 @@
                           block_third_party_content_rule_list_ = rule_list;
                           InstallContentRuleLists();
                         }];
+
+  [WKContentRuleListStore.defaultStore
+      compileContentRuleListForIdentifier:@"block-local"
+                   encodedContentRuleList:CreateLocalBlockingJsonRuleList()
+                        completionHandler:^(WKContentRuleList* rule_list,
+                                            NSError* error) {
+                          if (!weak_this.get()) {
+                            return;
+                          }
+                          block_local_rule_list_ = rule_list;
+                          InstallContentRuleLists();
+                        }];
 }
 
 WKContentRuleListProvider::~WKContentRuleListProvider() {}
@@ -63,6 +75,11 @@
 
 void WKContentRuleListProvider::InstallContentRuleLists() {
   UninstallContentRuleLists();
+
+  if (block_local_rule_list_) {
+    [user_content_controller_ addContentRuleList:block_local_rule_list_];
+  }
+
   switch (browser_state_->GetCookieBlockingMode()) {
     case CookieBlockingMode::kAllow:
       if (update_callback_) {
@@ -90,6 +107,9 @@
 }
 
 void WKContentRuleListProvider::UninstallContentRuleLists() {
+  if (block_local_rule_list_) {
+    [user_content_controller_ removeContentRuleList:block_local_rule_list_];
+  }
   if (block_content_rule_list_) {
     [user_content_controller_ removeContentRuleList:block_content_rule_list_];
   }
diff --git a/ios/web/web_state/ui/wk_content_rule_list_util.h b/ios/web/web_state/ui/wk_content_rule_list_util.h
index 73fff54..393db4c 100644
--- a/ios/web/web_state/ui/wk_content_rule_list_util.h
+++ b/ios/web/web_state/ui/wk_content_rule_list_util.h
@@ -14,6 +14,10 @@
 // expected by the Content Blocker API.
 NSString* CreateCookieBlockingJsonRuleList(CookieBlockingMode block_mode);
 
+// Creates the rules json as a string for blocking all online resources loaded
+// from file:// or application specific scheme:// pages.
+NSString* CreateLocalBlockingJsonRuleList();
+
 }  // namespace web
 
 #endif  // IOS_WEB_WEB_STATE_UI_WK_CONTENT_RULE_LIST_UTIL_H_
diff --git a/ios/web/web_state/ui/wk_content_rule_list_util.mm b/ios/web/web_state/ui/wk_content_rule_list_util.mm
index 816246d..cf643a1 100644
--- a/ios/web/web_state/ui/wk_content_rule_list_util.mm
+++ b/ios/web/web_state/ui/wk_content_rule_list_util.mm
@@ -5,7 +5,9 @@
 #import "ios/web/web_state/ui/wk_content_rule_list_util.h"
 
 #include "base/check.h"
+#include "base/strings/sys_string_conversions.h"
 #include "ios/web/public/browsing_data/cookie_blocking_mode.h"
+#include "ios/web/public/web_client.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -13,6 +15,41 @@
 
 namespace web {
 
+NSString* CreateLocalBlockingJsonRuleList() {
+  NSMutableDictionary* local_block = [@{
+    @"trigger" : [@{
+      @"url-filter" : @"https?://.*",
+      @"if-top-url" : [@[ @"file://.*" ] mutableCopy],
+      @"resource-type" : @[
+        // These should be all resource types except document.
+        // "document" cannot be blocked because it breaks error pages displayed
+        // when a WebStatePolicyDecider blocks a navigation.
+        @"image", @"style-sheet", @"script", @"font", @"raw", @"svg-document",
+        @"media", @"popup", @"ping"
+      ],
+    } mutableCopy],
+    @"action" : @{
+      @"type" : @"block",
+    },
+  } mutableCopy];
+
+  WebClient::Schemes schemes;
+  GetWebClient()->AddAdditionalSchemes(&schemes);
+  GetWebClient()->GetAdditionalWebUISchemes(&(schemes.standard_schemes));
+  for (std::string scheme : schemes.standard_schemes) {
+    [local_block[@"trigger"][@"if-top-url"]
+        addObject:base::SysUTF8ToNSString(scheme + "://.*")];
+  }
+
+  NSData* json_data =
+      [NSJSONSerialization dataWithJSONObject:@[ local_block ]
+                                      options:NSJSONWritingPrettyPrinted
+                                        error:nil];
+  NSString* json_string = [[NSString alloc] initWithData:json_data
+                                                encoding:NSUTF8StringEncoding];
+  return json_string;
+}
+
 NSString* CreateCookieBlockingJsonRuleList(CookieBlockingMode block_mode) {
   DCHECK(block_mode != CookieBlockingMode::kAllow);
   NSMutableDictionary* overall_block = [@{
diff --git a/ios/web/web_state/ui/wk_content_rule_list_util_unittest.mm b/ios/web/web_state/ui/wk_content_rule_list_util_unittest.mm
index 3c680915..351b201 100644
--- a/ios/web/web_state/ui/wk_content_rule_list_util_unittest.mm
+++ b/ios/web/web_state/ui/wk_content_rule_list_util_unittest.mm
@@ -5,6 +5,9 @@
 #import "ios/web/web_state/ui/wk_content_rule_list_util.h"
 
 #include "ios/web/public/browsing_data/cookie_blocking_mode.h"
+#import "ios/web/public/test/fakes/fake_web_client.h"
+#include "ios/web/public/test/scoped_testing_web_client.h"
+#include "ios/web/test/test_url_constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
 #include "testing/platform_test.h"
@@ -56,5 +59,33 @@
   ASSERT_NSEQ(@"block-cookies", block_rule[@"action"][@"type"]);
 }
 
+// Tests that the JSON created for block mode contains the correct keys.
+TEST_F(WKContentRuleListUtilTest, LocalResourceJSONBlock) {
+  ScopedTestingWebClient web_client(std::make_unique<FakeWebClient>());
+  NSString* rules_string = CreateLocalBlockingJsonRuleList();
+  NSData* rules_data = [rules_string dataUsingEncoding:NSUTF8StringEncoding];
+  id json = [NSJSONSerialization JSONObjectWithData:rules_data
+                                            options:0
+                                              error:nil];
+
+  // The Apple API says Content Blocker rules must be an array of rules.
+  ASSERT_TRUE([json isKindOfClass:[NSArray class]]);
+
+  id block_rule = json[0];
+  ASSERT_TRUE([block_rule isKindOfClass:[NSDictionary class]]);
+  NSArray* filtered_schemes = @[
+    @"file://.*", [@(kTestWebUIScheme) stringByAppendingString:@"://.*"],
+    [@(kTestAppSpecificScheme) stringByAppendingString:@"://.*"]
+  ];
+  ASSERT_NSEQ(filtered_schemes, block_rule[@"trigger"][@"if-top-url"]);
+  ASSERT_NSEQ(@"https?://.*", block_rule[@"trigger"][@"url-filter"]);
+  NSArray* filtered_types = @[
+    @"image", @"style-sheet", @"script", @"font", @"raw", @"svg-document",
+    @"media", @"popup", @"ping"
+  ];
+  ASSERT_NSEQ(filtered_types, block_rule[@"trigger"][@"resource-type"]);
+  ASSERT_NSEQ(@"block", block_rule[@"action"][@"type"]);
+}
+
 }  // namespace
 }  // namespace web
diff --git a/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm b/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm
index c55db44..16a90e880 100644
--- a/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm
+++ b/ios/web_view/internal/sync/web_view_profile_sync_service_factory.mm
@@ -10,7 +10,6 @@
 #include "base/no_destructor.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/sync/base/model_type.h"
@@ -26,7 +25,6 @@
 #import "ios/web_view/internal/sync/web_view_device_info_sync_service_factory.h"
 #import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h"
 #import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h"
-#import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h"
 #import "ios/web_view/internal/sync/web_view_sync_client.h"
 #import "ios/web_view/internal/sync/web_view_sync_invalidations_service_factory.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
@@ -68,7 +66,6 @@
   DependsOn(WebViewAccountPasswordStoreFactory::GetInstance());
   DependsOn(WebViewPasswordStoreFactory::GetInstance());
   DependsOn(WebViewGCMProfileServiceFactory::GetInstance());
-  DependsOn(WebViewProfileInvalidationProviderFactory::GetInstance());
   DependsOn(WebViewModelTypeStoreServiceFactory::GetInstance());
   DependsOn(WebViewSyncInvalidationsServiceFactory::GetInstance());
 }
@@ -95,10 +92,6 @@
   init_params.network_connection_tracker =
       ApplicationContext::GetInstance()->GetNetworkConnectionTracker();
   init_params.channel = version_info::Channel::STABLE;
-  init_params.invalidations_identity_provider =
-      WebViewProfileInvalidationProviderFactory::GetForBrowserState(
-          browser_state)
-          ->GetIdentityProvider();
 
   auto profile_sync_service =
       std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
index 4549e2b..8a44ae6 100644
--- a/ipc/ipc_message_start.h
+++ b/ipc/ipc_message_start.h
@@ -20,8 +20,6 @@
   GpuChannelMsgStart,
   MediaMsgStart,
   PpapiMsgStart,
-  ChromeMsgStart,
-  PrintMsgStart,
   ExtensionMsgStart,
   ChromotingMsgStart,
   NaClHostMsgStart,
diff --git a/ipc/trace_ipc_message.cc b/ipc/trace_ipc_message.cc
index d4f33c1..ffeb3879 100644
--- a/ipc/trace_ipc_message.cc
+++ b/ipc/trace_ipc_message.cc
@@ -43,12 +43,6 @@
     case PpapiMsgStart:
       message_class = ChromeLegacyIpc::CLASS_PPAPI;
       break;
-    case ChromeMsgStart:
-      message_class = ChromeLegacyIpc::CLASS_CHROME;
-      break;
-    case PrintMsgStart:
-      message_class = ChromeLegacyIpc::CLASS_PRINT;
-      break;
     case ExtensionMsgStart:
       message_class = ChromeLegacyIpc::CLASS_EXTENSION;
       break;
diff --git a/media/base/mock_filters.cc b/media/base/mock_filters.cc
index f7fc5c0..827694d 100644
--- a/media/base/mock_filters.cc
+++ b/media/base/mock_filters.cc
@@ -84,6 +84,7 @@
       supports_decryption_(supports_decryption),
       decoder_name_(std::move(decoder_name)) {
   ON_CALL(*this, CanReadWithoutStalling()).WillByDefault(Return(true));
+  ON_CALL(*this, IsOptimizedForRTC()).WillByDefault(Return(false));
 }
 
 MockVideoDecoder::~MockVideoDecoder() = default;
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 0a939b8..5d1adb0d 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -255,6 +255,7 @@
   MOCK_CONST_METHOD0(GetMaxDecodeRequests, int());
   MOCK_CONST_METHOD0(CanReadWithoutStalling, bool());
   MOCK_CONST_METHOD0(NeedsBitstreamConversion, bool());
+  MOCK_CONST_METHOD0(IsOptimizedForRTC, bool());
 
  private:
   const bool is_platform_decoder_;
diff --git a/media/base/video_decoder.cc b/media/base/video_decoder.cc
index 80ac2f5a..a593bb3 100644
--- a/media/base/video_decoder.cc
+++ b/media/base/video_decoder.cc
@@ -29,6 +29,10 @@
   return 1;
 }
 
+bool VideoDecoder::IsOptimizedForRTC() const {
+  return false;
+}
+
 // static
 int VideoDecoder::GetRecommendedThreadCount(int desired_threads) {
   // If the thread count is specified on the command line, respect it so long as
diff --git a/media/base/video_decoder.h b/media/base/video_decoder.h
index b66186c62..7f89465 100644
--- a/media/base/video_decoder.h
+++ b/media/base/video_decoder.h
@@ -115,6 +115,10 @@
   // Returns maximum number of parallel decode requests.
   virtual int GetMaxDecodeRequests() const;
 
+  // Returns true if and only if this decoder is optimized for decoding RTC
+  // streams.  The default is false.
+  virtual bool IsOptimizedForRTC() const;
+
   // Returns the recommended number of threads for software video decoding. If
   // the --video-threads command line option is specified and is valid, that
   // value is returned. Otherwise |desired_threads| is clamped to the number of
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h
index 5d04d524..144f7d6 100644
--- a/media/base/video_decoder_config.h
+++ b/media/base/video_decoder_config.h
@@ -167,6 +167,10 @@
   // useful for decryptors that decrypts an encrypted stream to a clear stream.
   void SetIsEncrypted(bool is_encrypted);
 
+  // Sets whether this config is for WebRTC or not.
+  void set_is_rtc(bool is_rtc) { is_rtc_ = is_rtc; }
+  bool is_rtc() const { return is_rtc_; }
+
  private:
   VideoCodec codec_ = kUnknownVideoCodec;
   VideoCodecProfile profile_ = VIDEO_CODEC_PROFILE_UNKNOWN;
@@ -191,6 +195,7 @@
 
   VideoColorSpace color_space_info_;
   base::Optional<gfx::HDRMetadata> hdr_metadata_;
+  bool is_rtc_ = false;
 
   // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
   // generated copy constructor and assignment operator. Since the extra data is
diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc
index c5a8b10..ac99eae 100644
--- a/media/filters/decoder_selector.cc
+++ b/media/filters/decoder_selector.cc
@@ -33,9 +33,25 @@
 
 const char kSelectDecoderTrace[] = "DecoderSelector::SelectDecoder";
 
+bool SkipDecoderForRTC(const AudioDecoderConfig& /*config*/,
+                       const AudioDecoder& /*decoder*/) {
+  return false;
+}
+
+bool SkipDecoderForRTC(const VideoDecoderConfig& config,
+                       const VideoDecoder& decoder) {
+  // For now, we assume that RTC decoders are able to decode non-RTC streams,
+  // presumably by configuring themselves based on the config's rtc bit.  Since
+  // no decoders take any action at all based on it, this is as good as any.
+  return config.is_rtc() && !decoder.IsOptimizedForRTC();
+}
+
 template <typename ConfigT, typename DecoderT>
-DecoderPriority NormalDecoderPriority(const ConfigT& /*config*/,
-                                      const DecoderT& /*decoder*/) {
+DecoderPriority NormalDecoderPriority(const ConfigT& config,
+                                      const DecoderT& decoder) {
+  if (SkipDecoderForRTC(config, decoder))
+    return DecoderPriority::kSkipped;
+
   return DecoderPriority::kNormal;
 }
 
@@ -49,6 +65,9 @@
   constexpr auto kSoftwareDecoderHeightCutoff = 720;
 #endif
 
+  if (SkipDecoderForRTC(config, decoder))
+    return DecoderPriority::kSkipped;
+
   // We only do a height check to err on the side of prioritizing platform
   // decoders.
   const auto at_or_above_software_cutoff =
@@ -62,8 +81,11 @@
 }
 
 template <typename ConfigT, typename DecoderT>
-DecoderPriority SkipNonPlatformDecoders(const ConfigT& /*config*/,
+DecoderPriority SkipNonPlatformDecoders(const ConfigT& config,
                                         const DecoderT& decoder) {
+  if (SkipDecoderForRTC(config, decoder))
+    return DecoderPriority::kSkipped;
+
   return decoder.IsPlatformDecoder() ? DecoderPriority::kNormal
                                      : DecoderPriority::kSkipped;
 }
diff --git a/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc
index db84317..e32c8d0 100644
--- a/media/filters/decoder_selector_unittest.cc
+++ b/media/filters/decoder_selector_unittest.cc
@@ -164,6 +164,8 @@
   static void ExpectNotInitialize(MockDecoder* decoder) {
     EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _)).Times(0);
   }
+
+  static void SetRTCDecoderness(MockDecoder* decoder, bool is_rtc_decoder) {}
 };
 
 // Allocate storage for the member variables.
@@ -246,6 +248,11 @@
   static void ExpectNotInitialize(MockDecoder* decoder) {
     EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _, _)).Times(0);
   }
+
+  static void SetRTCDecoderness(MockDecoder* decoder, bool is_optimized) {
+    EXPECT_CALL(*decoder, IsOptimizedForRTC())
+        .WillRepeatedly(Return(is_optimized));
+  }
 };
 
 // Allocate storate for the member variables.
@@ -289,6 +296,7 @@
     bool supports_decryption;
     bool is_platform_decoder;
     bool expect_not_initialized;
+    bool is_rtc_decoder = false;
   };
 
   DecoderSelectorTest()
@@ -330,6 +338,14 @@
     AddMockDecoder(std::move(args));
   }
 
+  void AddMockRTCPlatformDecoder(const std::string& decoder_name,
+                                 DecoderCapability capability) {
+    auto args = MockDecoderArgs::Create(std::move(decoder_name), capability);
+    args.is_rtc_decoder = true;
+    args.is_platform_decoder = true;
+    AddMockDecoder(std::move(args));
+  }
+
   void AddMockDecoder(MockDecoderArgs args) {
     // Actual decoders are created in CreateDecoders(), which may be called
     // multiple times by the DecoderSelector.
@@ -357,6 +373,7 @@
       } else {
         TypeParam::ExpectInitialize(decoder.get(), args.capability);
       }
+      TypeParam::SetRTCDecoderness(decoder.get(), args.is_rtc_decoder);
       decoders.push_back(std::move(decoder));
     }
 
@@ -1049,4 +1066,54 @@
   this->SelectDecoder();
 }
 
+// Tests that the normal decoder selector rule skips non-RTC decoders for RTC.
+TEST_F(VideoDecoderSelectorTest, RTC_NormalPriority) {
+  base::test::ScopedFeatureList features;
+
+  this->AddMockDecoder(kDecoder1, kAlwaysSucceed);
+  this->AddMockRTCPlatformDecoder(kDecoder2, kAlwaysSucceed);
+
+  auto config = TestVideoConfig::Custom(gfx::Size(4096, 4096));
+  config.set_is_rtc(true);
+  this->demuxer_stream_.set_video_decoder_config(config);
+  this->CreateDecoderSelector();
+
+  EXPECT_CALL(*this, OnDecoderSelected(kDecoder2, IsNull()));
+  this->SelectDecoder();
+}
+
+// Tests that the resolution-based rule skips non-RTC decoders for RTC.
+TEST_F(VideoDecoderSelectorTest, RTC_DecoderBasedPriority) {
+  base::test::ScopedFeatureList features;
+  features.InitAndEnableFeature(kResolutionBasedDecoderPriority);
+
+  this->AddMockDecoder(kDecoder1, kAlwaysSucceed);
+  this->AddMockRTCPlatformDecoder(kDecoder2, kAlwaysSucceed);
+
+  auto config = TestVideoConfig::Custom(gfx::Size(4096, 4096));
+  config.set_is_rtc(true);
+  this->demuxer_stream_.set_video_decoder_config(config);
+  this->CreateDecoderSelector();
+
+  EXPECT_CALL(*this, OnDecoderSelected(kDecoder2, IsNull()));
+  this->SelectDecoder();
+}
+
+// Tests that the hardware-based rule skips non-RTC decoders for RTC.
+TEST_F(VideoDecoderSelectorTest, RTC_ForceHardwareDecoders) {
+  base::test::ScopedFeatureList features;
+  features.InitAndEnableFeature(kForceHardwareVideoDecoders);
+
+  this->AddMockPlatformDecoder(kDecoder1, kAlwaysSucceed);
+  this->AddMockRTCPlatformDecoder(kDecoder2, kAlwaysSucceed);
+
+  auto config = TestVideoConfig::Custom(gfx::Size(4096, 4096));
+  config.set_is_rtc(true);
+  this->demuxer_stream_.set_video_decoder_config(config);
+  this->CreateDecoderSelector();
+
+  EXPECT_CALL(*this, OnDecoderSelected(kDecoder2, IsNull()));
+  this->SelectDecoder();
+}
+
 }  // namespace media
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 78da171..5d18f04d 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -352,6 +352,11 @@
   return max_decode_requests_;
 }
 
+bool MojoVideoDecoder::IsOptimizedForRTC() const {
+  DVLOG(3) << __func__;
+  return true;
+}
+
 void MojoVideoDecoder::BindRemoteDecoder() {
   DVLOG(3) << __func__;
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h
index 201b4ecd..1a25f19 100644
--- a/media/mojo/clients/mojo_video_decoder.h
+++ b/media/mojo/clients/mojo_video_decoder.h
@@ -74,6 +74,7 @@
   bool NeedsBitstreamConversion() const final;
   bool CanReadWithoutStalling() const final;
   int GetMaxDecodeRequests() const final;
+  bool IsOptimizedForRTC() const final;
 
   // mojom::VideoDecoderClient implementation.
   void OnVideoFrameDecoded(
diff --git a/mojo/core/BUILD.gn b/mojo/core/BUILD.gn
index aeb77dd..ae3c1b23 100644
--- a/mojo/core/BUILD.gn
+++ b/mojo/core/BUILD.gn
@@ -105,6 +105,7 @@
 
     public_deps = [
       "//base",
+      "//mojo/core/embedder:features",
       "//mojo/core/ports",
       "//mojo/public/c/system:headers",
       "//mojo/public/cpp/platform",
@@ -124,6 +125,15 @@
           "channel_posix.h",
         ]
       }
+
+      if ((is_linux || is_chromeos || is_android) && !is_nacl) {
+        sources += [
+          "channel_linux.cc",
+          "channel_linux.h",
+        ]
+
+        public += [ "channel_linux.h" ]
+      }
     }
 
     if (is_mac) {
diff --git a/mojo/core/channel.cc b/mojo/core/channel.cc
index 4fe42510..8609404 100644
--- a/mojo/core/channel.cc
+++ b/mojo/core/channel.cc
@@ -480,9 +480,7 @@
     data_ = MakeAlignedBuffer(size_);
   }
 
-  ~ReadBuffer() {
-    DCHECK(data_);
-  }
+  ~ReadBuffer() { DCHECK(data_); }
 
   const char* occupied_bytes() const {
     return data_.get() + num_discarded_bytes_;
@@ -729,5 +727,19 @@
   return false;
 }
 
+// Currently only Non-nacl CrOs, Linux, and Android support upgrades.
+#if defined(OS_NACL) || \
+    (!(defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_ANDROID)))
+// static
+MOJO_SYSTEM_IMPL_EXPORT bool Channel::SupportsChannelUpgrade() {
+  return false;
+}
+
+MOJO_SYSTEM_IMPL_EXPORT void Channel::OfferChannelUpgrade() {
+  NOTREACHED();
+  return;
+}
+#endif
+
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/channel.h b/mojo/core/channel.h
index 3b01b39..6e672f05 100644
--- a/mojo/core/channel.h
+++ b/mojo/core/channel.h
@@ -76,6 +76,16 @@
 #endif
       // A normal message that uses Header and can contain extra header values.
       NORMAL,
+
+      // The UPGRADE_OFFER control message offers to upgrade the channel to
+      // another side who has advertised support for an upgraded channel.
+      UPGRADE_OFFER,
+      // The UPGRADE_ACCEPT control message is returned when an upgrade offer is
+      // accepted.
+      UPGRADE_ACCEPT,
+      // The UPGRADE_REJECT control message is returned when the receiver cannot
+      // or chooses not to upgrade the channel.
+      UPGRADE_REJECT,
     };
 
 #pragma pack(push, 1)
@@ -281,7 +291,15 @@
 #if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
   // At this point only ChannelPosix needs InitFeatures.
   static void set_posix_use_writev(bool use_writev);
-#endif
+#endif  // defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
+
+  // SupportsChannelUpgrade will return true if this channel is capable of being
+  // upgraded.
+  static bool SupportsChannelUpgrade();
+
+  // OfferChannelUpgrade will inform this channel that it should offer an
+  // upgrade to the remote.
+  void OfferChannelUpgrade();
 
   // Allows the caller to change the Channel's HandlePolicy after construction.
   void set_handle_policy(HandlePolicy policy) { handle_policy_ = policy; }
@@ -328,6 +346,9 @@
 
   Delegate* delegate() const { return delegate_; }
 
+  // Allows the caller to determine the current HandlePolicy.
+  HandlePolicy handle_policy() const { return handle_policy_; }
+
   // Called by the implementation when it wants somewhere to stick data.
   // |*buffer_capacity| may be set by the caller to indicate the desired buffer
   // size. If 0, a sane default size will be used instead.
diff --git a/mojo/core/channel_linux.cc b/mojo/core/channel_linux.cc
new file mode 100644
index 0000000..f226e93
--- /dev/null
+++ b/mojo/core/channel_linux.cc
@@ -0,0 +1,864 @@
+// Copyright 2020 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 "mojo/core/channel_linux.h"
+
+#include <fcntl.h>
+#include <linux/futex.h>
+#include <linux/memfd.h>
+#include <sys/eventfd.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#include <algorithm>
+#include <atomic>
+#include <cstring>
+#include <limits>
+#include <memory>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/files/scoped_file.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/shared_memory_security_policy.h"
+#include "base/message_loop/message_pump_for_io.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/posix/eintr_wrapper.h"
+#include "base/task_runner.h"
+#include "base/time/time.h"
+#include "build/build_config.h"
+#include "mojo/core/core.h"
+#include "mojo/core/embedder/features.h"
+
+namespace mojo {
+namespace core {
+
+// DataAvailableNotifier is a simple interface which allows us to
+// substitute how we notify the reader that we've made data available,
+// implementations might be EventFDNotifier or FutexNotifier.
+class DataAvailableNotifier {
+ public:
+  DataAvailableNotifier() = default;
+  explicit DataAvailableNotifier(base::RepeatingClosure callback)
+      : callback_(std::move(callback)) {}
+
+  virtual ~DataAvailableNotifier() = default;
+
+  // The writer should notify the reader by invoking Notify.
+  virtual bool Notify() = 0;
+
+  // A reader should clear the notification (if appropriate) by calling Clear.
+  virtual bool Clear() = 0;
+
+  // Is_valid will return true if the implementation is valid and can be used.
+  virtual bool is_valid() const = 0;
+
+ protected:
+  // DataAvailable will be called by implementations of DataAvailableNotifier to
+  // dispatch this message into the registered callback.
+  void DataAvailable() {
+    DCHECK(callback_);
+    callback_.Run();
+  }
+
+  base::RepeatingClosure callback_;
+};
+
+namespace {
+
+constexpr int kMemFDSeals = F_SEAL_SEAL | F_SEAL_SHRINK | F_SEAL_GROW;
+
+std::atomic_bool g_params_set{false};
+std::atomic_bool g_use_shared_mem{false};
+std::atomic_uint32_t g_shared_mem_pages{4};
+
+struct UpgradeOfferMessage {
+  constexpr static int kEventFdNotifier = 1;
+  constexpr static int kSupportedVersion = kEventFdNotifier;
+
+  constexpr static int kDefaultPages = 4;
+
+  int version = kSupportedVersion;
+  int num_pages = kDefaultPages;
+};
+
+constexpr size_t RoundUpToWordBoundary(size_t size) {
+  return (size + (sizeof(void*) - 1)) & ~(sizeof(void*) - 1);
+}
+
+base::ScopedFD CreateSealedMemFD(size_t size) {
+  CHECK_GT(size, 0u);
+  CHECK_EQ(size % base::GetPageSize(), 0u);
+  base::ScopedFD fd(syscall(__NR_memfd_create, "mojo_channel_linux",
+                            MFD_CLOEXEC | MFD_ALLOW_SEALING));
+  if (!fd.is_valid()) {
+    PLOG(ERROR) << "Unable to create memfd for shared memory channel";
+    return {};
+  }
+
+  if (ftruncate(fd.get(), size) < 0) {
+    PLOG(ERROR) << "Unable to truncate memfd for shared memory channel";
+    return {};
+  }
+
+  // We make sure to use F_SEAL_SEAL to prevent any further changes to the
+  // seals and F_SEAL_SHRINK guarantees that we won't accidentally decrease
+  // the size, and similarly F_SEAL_GROW for increasing size.
+  if (fcntl(fd.get(), F_ADD_SEALS, kMemFDSeals) < 0) {
+    PLOG(ERROR) << "Unable to seal memfd for shared memory channel";
+    return {};
+  }
+
+  return fd;
+}
+
+// It's very important that we always verify that the FD we're passing and the
+// FD we're receive is a properly sealed MemFD.
+bool ValidateFDIsProperlySealedMemFD(const base::ScopedFD& fd) {
+  int seals = 0;
+  if ((seals = fcntl(fd.get(), F_GET_SEALS)) < 0) {
+    PLOG(ERROR) << "Unable to get seals on memfd for shared memory channel";
+    return false;
+  }
+
+  return seals == kMemFDSeals;
+}
+
+// EventFDNotifier is an implementation of the DataAvailableNotifier interface
+// which uses EventFDNotifier to signal the reader.
+class EventFDNotifier : public DataAvailableNotifier,
+                        public base::MessagePumpForIO::FdWatcher {
+ public:
+  EventFDNotifier(EventFDNotifier&& efd) = default;
+  ~EventFDNotifier() override { reset(); }
+
+  static constexpr int kEfdFlags = EFD_CLOEXEC | EFD_NONBLOCK;
+
+  static std::unique_ptr<EventFDNotifier> CreateWriteNotifier() {
+    int fd = eventfd(0, kEfdFlags);
+    if (fd < 0) {
+      PLOG(ERROR) << "Unable to create an eventfd";
+      return nullptr;
+    }
+
+    return WrapFD(base::ScopedFD(fd));
+  }
+
+  // The EventFD read notifier MUST be created on the IOThread. Luckily you're
+  // typically creating the read notifier in response to an OFFER_UPGRADE
+  // message which was received on the IOThread.
+  static std::unique_ptr<EventFDNotifier> CreateReadNotifier(
+      base::ScopedFD efd,
+      base::RepeatingClosure cb,
+      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) {
+    DCHECK(io_task_runner->RunsTasksInCurrentSequence());
+    DCHECK(cb);
+
+    return WrapFDWithCallback(std::move(efd), std::move(cb), io_task_runner);
+  }
+
+  static bool KernelSupported() {
+    // Try to create an eventfd with bad flags if we get -EINVAL it's supported
+    // if we get -ENOSYS it's not, we also support -EPERM because seccomp
+    // policies can cause it to be returned.
+    int ret = eventfd(0, ~0);
+    PCHECK(ret < 0 && (errno == EINVAL || errno == ENOSYS || errno == EPERM));
+    return (ret < 0 && errno == EINVAL);
+  }
+
+  // DataAvailableNotifier impl:
+  bool Clear() override {
+    uint64_t value = 0;
+    ssize_t res = HANDLE_EINTR(
+        read(fd_.get(), reinterpret_cast<void*>(&value), sizeof(value)));
+    if (res < static_cast<int64_t>(sizeof(value))) {
+      PLOG_IF(ERROR, errno != EWOULDBLOCK) << "eventfd read error";
+    }
+    return res == sizeof(value);
+  }
+
+  bool Notify() override {
+    uint64_t value = 1;
+    ssize_t res = HANDLE_EINTR(write(fd_.get(), &value, sizeof(value)));
+    return res == sizeof(value);
+  }
+
+  bool is_valid() const override { return fd_.is_valid(); }
+
+  // base::MessagePumpForIO::FdWatcher impl:
+  void OnFileCanReadWithoutBlocking(int fd) override {
+    DCHECK(fd == fd_.get());
+
+    // Invoke the callback to inform them that data is available to read.
+    DataAvailable();
+  }
+
+  void OnFileCanWriteWithoutBlocking(int fd) override {}
+
+  base::ScopedFD take() { return std::move(fd_); }
+  base::ScopedFD take_dup() {
+    return base::ScopedFD(HANDLE_EINTR(dup(fd_.get())));
+  }
+
+  void reset() {
+    watcher_.reset();
+    fd_.reset();
+  }
+
+  int fd() { return fd_.get(); }
+
+ private:
+  explicit EventFDNotifier(base::ScopedFD fd) : fd_(std::move(fd)) {}
+  explicit EventFDNotifier(
+      base::ScopedFD fd,
+      base::RepeatingClosure cb,
+      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
+      : DataAvailableNotifier(std::move(cb)),
+        fd_(std::move(fd)),
+        io_task_runner_(io_task_runner) {
+    DCHECK(watcher_);
+    watcher_ =
+        std::make_unique<base::MessagePumpForIO::FdWatchController>(FROM_HERE);
+    WaitForEventFDOnIOThread();
+  }
+
+  static std::unique_ptr<EventFDNotifier> WrapFD(base::ScopedFD fd) {
+    return base::WrapUnique<EventFDNotifier>(
+        new EventFDNotifier(std::move(fd)));
+  }
+
+  static std::unique_ptr<EventFDNotifier> WrapFDWithCallback(
+      base::ScopedFD fd,
+      base::RepeatingClosure cb,
+      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) {
+    return base::WrapUnique<EventFDNotifier>(
+        new EventFDNotifier(std::move(fd), std::move(cb), io_task_runner));
+  }
+
+  void WaitForEventFDOnIOThread() {
+    DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
+    base::CurrentIOThread::Get()->WatchFileDescriptor(
+        fd_.get(), true, base::MessagePumpForIO::WATCH_READ, watcher_.get(),
+        this);
+  }
+
+  base::ScopedFD fd_;
+  std::unique_ptr<base::MessagePumpForIO::FdWatchController> watcher_;
+  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(EventFDNotifier);
+};
+
+}  // namespace
+
+// SharedBuffer is an abstraction around a region of shared memory, it has
+// methods to facilitate safely reading and writing into the shared region.
+// SharedBuffer only handles the access to the shared memory any notifications
+// must be performed separately.
+class ChannelLinux::SharedBuffer {
+ public:
+  SharedBuffer(SharedBuffer&& other) = default;
+  ~SharedBuffer() { reset(); }
+
+  enum class Error { kSuccess = 0, kGeneralError = 1, kControlCorruption = 2 };
+
+  static std::unique_ptr<SharedBuffer> Create(const base::ScopedFD& memfd,
+                                              size_t size) {
+    if (!memfd.is_valid()) {
+      return nullptr;
+    }
+
+    // Enforce the system shared memory security policy.
+    if (!base::SharedMemorySecurityPolicy::AcquireReservationForMapping(size)) {
+      LOG(ERROR)
+          << "Unable to create shared buffer: unable to acquire reservation";
+      return nullptr;
+    }
+
+    uint8_t* ptr = reinterpret_cast<uint8_t*>(
+        mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED,
+             memfd.get(), 0));
+
+    if (ptr == MAP_FAILED) {
+      PLOG(ERROR) << "Unable to map shared memory";
+
+      // Always clean up our reservation if we actually fail to map.
+      base::SharedMemorySecurityPolicy::ReleaseReservationForMapping(size);
+      return nullptr;
+    }
+
+    return base::WrapUnique<SharedBuffer>(new SharedBuffer(ptr, size));
+  }
+
+  uint8_t* usable_region_ptr() const { return base_ptr_ + kReservedSpace; }
+  size_t usable_len() const { return len_ - kReservedSpace; }
+  bool is_valid() const { return base_ptr_ != nullptr && len_ > 0; }
+
+  void reset() {
+    if (is_valid()) {
+      if (munmap(base_ptr_, len_) < 0) {
+        PLOG(ERROR) << "Unable to unmap shared buffer";
+        return;
+      }
+
+      base::SharedMemorySecurityPolicy::ReleaseReservationForMapping(len_);
+      base_ptr_ = nullptr;
+      len_ = 0;
+    }
+  }
+
+  // Only one side should call Initialize, this will initialize the first
+  // sizeof(ControlStructure) bytes as our control structure. This should be
+  // done when offering fast comms.
+  void Initialize() { new (static_cast<void*>(base_ptr_)) ControlStructure; }
+
+  // TryWrite will attempt to append |data| of |len| to the shared buffer, this
+  // call will only succeed if there is no one else trying to write AND there is
+  // enough space currently in the buffer.
+  Error TryWrite(const void* data, size_t len) {
+    DCHECK(data);
+    DCHECK(len);
+
+    if (len > usable_len()) {
+      UMA_HISTOGRAM_COUNTS_100000(
+          "Mojo.Channel.Linux.SharedMemWriteBytes_Fail_TooLarge", len);
+      return Error::kGeneralError;
+    }
+
+    if (!TryLockForWriting()) {
+      UMA_HISTOGRAM_COUNTS_100000(
+          "Mojo.Channel.Linux.SharedMemWriteBytes_Fail_NoLock", len);
+      return Error::kGeneralError;
+    }
+
+    // At this point we know that the space available can only grow because
+    // we're the only writer we will write from write_pos -> end and 0 -> (len
+    // - (end - write_pos)) where end is usable_len().
+    uint32_t cur_read_pos = read_pos().load();
+    uint32_t cur_write_pos = write_pos().load();
+
+    if (!ValidateReadWritePositions(cur_read_pos, cur_write_pos)) {
+      UnlockForWriting();
+      return Error::kControlCorruption;
+    }
+
+    uint32_t space_available =
+        usable_len() - NumBytesInUse(cur_read_pos, cur_write_pos);
+
+    if (space_available <= len) {
+      UnlockForWriting();
+      UMA_HISTOGRAM_COUNTS_100000(
+          "Mojo.Channel.Linux.SharedMemWriteBytes_Fail_NoSpace", len);
+
+      return Error::kGeneralError;
+    }
+
+    // If we do not have enough space from the current write position to the end
+    // then we will be forced to wrap around. If we do have enough space we can
+    // just start writing at the write position, otherwise we start writing at
+    // the write position up to the end of the usable area and then we write the
+    // remainder of the payload starting at position 0.
+    if ((usable_len() - cur_write_pos) > len) {
+      memcpy(usable_region_ptr() + cur_write_pos, data, len);
+    } else {
+      size_t copy1_len = usable_len() - cur_write_pos;
+      memcpy(usable_region_ptr() + cur_write_pos, data, copy1_len);
+      memcpy(usable_region_ptr(),
+             reinterpret_cast<const uint8_t*>(data) + copy1_len,
+             len - copy1_len);
+    }
+
+    // Atomically update the write position.
+    // We also verify that the write position did not advance, it SHOULD NEVER
+    // advance since we were holding the write lock.
+    if (write_pos().exchange((cur_write_pos + len) % usable_len()) !=
+        cur_write_pos) {
+      UnlockForWriting();
+      return Error::kControlCorruption;
+    }
+
+    UnlockForWriting();
+
+    return Error::kSuccess;
+  }
+
+  Error TryReadLocked(void* data, uint32_t len, uint32_t* bytes_read) {
+    uint32_t cur_read_pos = read_pos().load();
+    uint32_t cur_write_pos = write_pos().load();
+
+    if (!ValidateReadWritePositions(cur_read_pos, cur_write_pos)) {
+      return Error::kControlCorruption;
+    }
+
+    // The most we can read is the smaller of what's in use in the shared memory
+    // usable area and the buffer size we've been passed.
+    uint32_t bytes_available_to_read =
+        NumBytesInUse(cur_read_pos, cur_write_pos);
+    bytes_available_to_read = std::min(bytes_available_to_read, len);
+    if (bytes_available_to_read == 0) {
+      *bytes_read = 0;
+      return Error::kSuccess;
+    }
+
+    // We have two cases when reading, the first is the read position is behind
+    // the write position, in that case we can simply read all data between the
+    // read and write position (up to our buffer size). The second case is when
+    // the write position is behind the read position. In this situation we must
+    // read from the read position to the end of the available area, and
+    // continue reading from the 0 position up to the write position or the
+    // maximum buffer size (bytes_available_to_read).
+    if (cur_read_pos < cur_write_pos) {
+      memcpy(data, usable_region_ptr() + cur_read_pos, bytes_available_to_read);
+    } else {
+      // We first start by reading to the end of the the usable area, if we
+      // cannot read all the way (because our buffer is too small, we're done).
+      uint32_t bytes_from_read_to_end = usable_len() - cur_read_pos;
+      bytes_from_read_to_end =
+          std::min(bytes_from_read_to_end, bytes_available_to_read);
+      memcpy(data, usable_region_ptr() + cur_read_pos, bytes_from_read_to_end);
+
+      if (bytes_from_read_to_end < bytes_available_to_read) {
+        memcpy(reinterpret_cast<uint8_t*>(data) + bytes_from_read_to_end,
+               usable_region_ptr(),
+               bytes_available_to_read - bytes_from_read_to_end);
+      }
+    }
+
+    // Atomically update the read position.
+    // We also verify that the read position did not advance, it SHOULD NEVER
+    // advance since we were holding the read lock.
+    uint32_t new_read_pos =
+        (cur_read_pos + bytes_available_to_read) % usable_len();
+    if (read_pos().exchange(new_read_pos) != cur_read_pos) {
+      *bytes_read = 0;
+      return Error::kControlCorruption;
+    }
+
+    *bytes_read = bytes_available_to_read;
+    return Error::kSuccess;
+  }
+
+  bool TryLockForReading() {
+    // We return true if we set the flag (meaning it was false).
+    return !read_flag().test_and_set(std::memory_order_acquire);
+  }
+
+  void UnlockForReading() { read_flag().clear(std::memory_order_release); }
+
+ private:
+  struct ControlStructure {
+    std::atomic_flag write_flag{false};
+    std::atomic_uint32_t write_pos{0};
+
+    std::atomic_flag read_flag{false};
+    std::atomic_uint32_t read_pos{0};
+
+    // If we're using a notification mechanism that relies on futex, make the
+    // space available for one, if not these 32bits are unused. The kernel
+    // requires they be 32bit aligned.
+    alignas(4) volatile uint32_t futex = 0;
+  };
+
+  // This function will only validate that the values provided for write and
+  // read positions are valid based on usable size of the shared memory region.
+  // This should ALWAYS be called before attempting a write or read using
+  // atomically loaded values from the control structure.
+  bool ValidateReadWritePositions(uint32_t read_pos, uint32_t write_pos) {
+    // The only valid values for read and write positions are [0 - usable_len
+    // - 1].
+    if (write_pos >= usable_len()) {
+      LOG(ERROR) << "Write position of shared buffer is currently beyond the "
+                    "usable length";
+      return false;
+    }
+
+    if (read_pos >= usable_len()) {
+      LOG(ERROR) << "Read position of shared buffer is currently beyond the "
+                    "usable length";
+      return false;
+    }
+
+    return true;
+  }
+
+  // NumBytesInUse will calculate how many bytes in the shared buffer are
+  // currently in use.
+  uint32_t NumBytesInUse(uint32_t read_pos, uint32_t write_pos) {
+    uint32_t bytes_in_use = 0;
+    if (read_pos <= write_pos) {
+      bytes_in_use = write_pos - read_pos;
+    } else {
+      bytes_in_use = write_pos + (usable_len() - read_pos);
+    }
+
+    return bytes_in_use;
+  }
+
+  bool TryLockForWriting() {
+    // We return true if we set the flag (meaning it was false).
+    return !write_flag().test_and_set(std::memory_order_acquire);
+  }
+
+  void UnlockForWriting() { write_flag().clear(std::memory_order_release); }
+
+  // This is the space we need to reserve in this shared buffer for our control
+  // structure at the start.
+  constexpr static size_t kReservedSpace =
+      RoundUpToWordBoundary(sizeof(ControlStructure));
+
+  std::atomic_flag& write_flag() {
+    DCHECK(is_valid());
+    return reinterpret_cast<ControlStructure*>(base_ptr_)->write_flag;
+  }
+
+  std::atomic_flag& read_flag() {
+    DCHECK(is_valid());
+    return reinterpret_cast<ControlStructure*>(base_ptr_)->read_flag;
+  }
+
+  std::atomic_uint32_t& read_pos() {
+    DCHECK(is_valid());
+    return reinterpret_cast<ControlStructure*>(base_ptr_)->read_pos;
+  }
+
+  std::atomic_uint32_t& write_pos() {
+    DCHECK(is_valid());
+    return reinterpret_cast<ControlStructure*>(base_ptr_)->write_pos;
+  }
+
+  SharedBuffer(uint8_t* ptr, size_t len) : base_ptr_(ptr), len_(len) {}
+
+  uint8_t* base_ptr_ = nullptr;
+  size_t len_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(SharedBuffer);
+};
+
+ChannelLinux::ChannelLinux(
+    Delegate* delegate,
+    ConnectionParams connection_params,
+    HandlePolicy handle_policy,
+    scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
+    : ChannelPosix(delegate,
+                   std::move(connection_params),
+                   handle_policy,
+                   io_task_runner),
+      num_pages_(g_shared_mem_pages.load()) {}
+
+ChannelLinux::~ChannelLinux() = default;
+
+void ChannelLinux::Write(MessagePtr message) {
+  if (!shared_mem_writer_ || message->has_handles() || reject_writes_) {
+    // Let the ChannelPosix deal with this.
+    return ChannelPosix::Write(std::move(message));
+  }
+
+  // Can we use the fast shared memory buffer?
+  SharedBuffer::Error write_result =
+      write_buffer_->TryWrite(message->data(), message->data_num_bytes());
+  if (write_result == SharedBuffer::Error::kGeneralError) {
+    // We can handle this with the posix channel.
+    return ChannelPosix::Write(std::move(message));
+  } else if (write_result == SharedBuffer::Error::kControlCorruption) {
+    // We will no longer be issuing writes via shared memory, and we will
+    // dispatch a write error.
+    reject_writes_ = true;
+
+    // Theoretically we could fall back to only using PosixChannel::Write
+    // but if this situation happens it's likely something else is going
+    // horribly wrong.
+    io_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&ChannelLinux::OnWriteError, this,
+                                  Channel::Error::kReceivedMalformedData));
+    return;
+  }
+
+  //  The write with shared memory was successful.
+  UMA_HISTOGRAM_COUNTS_100000("Mojo.Channel.Linux.SharedMemWriteBytes",
+                              message->data_num_bytes());
+  write_notifier_->Notify();
+}
+
+void ChannelLinux::OfferSharedMemUpgrade() {
+  if (!offered_.test_and_set() && UpgradesEnabled()) {
+    // Before we offer we need to make sure we can send handles, if we can't
+    // then no point in trying.
+    if (handle_policy() == HandlePolicy::kAcceptHandles) {
+      OfferSharedMemUpgradeInternal();
+    }
+  }
+}
+
+bool ChannelLinux::OnControlMessage(Message::MessageType message_type,
+                                    const void* payload,
+                                    size_t payload_size,
+                                    std::vector<PlatformHandle> handles) {
+  switch (message_type) {
+    case Message::MessageType::UPGRADE_OFFER: {
+      const UpgradeOfferMessage* msg =
+          reinterpret_cast<const UpgradeOfferMessage*>(payload);
+      if (msg->version != UpgradeOfferMessage::kSupportedVersion) {
+        LOG(ERROR) << "Reject shared mem upgrade unexpected version: "
+                   << msg->version;
+        RejectUpgradeOffer();
+        return true;
+      }
+
+      if (handles.size() != 2) {
+        LOG(ERROR) << "Received an UPGRADE_OFFER without two FDs";
+        RejectUpgradeOffer();
+        return true;
+      }
+
+      if (read_buffer_ || read_notifier_) {
+        LOG(ERROR) << "Received an UPGRADE_OFFER on already upgraded channel";
+        return true;
+      }
+
+      base::ScopedFD memfd(handles[0].TakeFD());
+      if (memfd.is_valid() && !ValidateFDIsProperlySealedMemFD(memfd)) {
+        PLOG(ERROR) << "Passed FD was not properly sealed";
+        DLOG(FATAL) << "MemFD was NOT properly sealed";
+        memfd.reset();
+      }
+
+      if (!memfd.is_valid()) {
+        RejectUpgradeOffer();
+        return true;
+      }
+
+      if (msg->num_pages <= 0 || msg->num_pages > 128) {
+        LOG(ERROR) << "SharedMemory upgrade offer was received with invalid "
+                      "number of pages: "
+                   << msg->num_pages;
+        RejectUpgradeOffer();
+      }
+
+      std::unique_ptr<DataAvailableNotifier> read_notifier;
+      if (msg->version == UpgradeOfferMessage::kEventFdNotifier) {
+        read_notifier = EventFDNotifier::CreateReadNotifier(
+            handles[1].TakeFD(),
+            base::BindRepeating(&ChannelLinux::SharedMemReadReady, this),
+            io_task_runner_);
+      }
+
+      if (!read_notifier) {
+        RejectUpgradeOffer();
+        return true;
+      }
+
+      read_notifier_ = std::move(read_notifier);
+
+      std::unique_ptr<SharedBuffer> read_sb = SharedBuffer::Create(
+          std::move(memfd), msg->num_pages * base::GetPageSize());
+      if (!read_sb || !read_sb->is_valid()) {
+        RejectUpgradeOffer();
+        return true;
+      }
+
+      read_buffer_ = std::move(read_sb);
+
+      read_buf_.resize(read_buffer_->usable_len());
+      AcceptUpgradeOffer();
+
+      // And if we haven't offered ourselves just go ahead and do it now.
+      OfferSharedMemUpgrade();
+      return true;
+    }
+
+    case Message::MessageType::UPGRADE_ACCEPT: {
+      if (!write_buffer_ || !write_notifier_ || !write_notifier_->is_valid()) {
+        LOG(ERROR) << "Received unexpected UPGRADE_ACCEPT";
+
+        // Clean up anything that may have been set.
+        shared_mem_writer_ = false;
+        write_buffer_.reset();
+        write_notifier_.reset();
+        return true;
+      }
+
+      shared_mem_writer_ = true;
+      return true;
+    }
+
+    case Message::MessageType::UPGRADE_REJECT: {
+      // We can free our resources.
+      shared_mem_writer_ = false;
+      write_buffer_.reset();
+      write_notifier_.reset();
+
+      return true;
+    }
+    default:
+      break;
+  }
+
+  return ChannelPosix::OnControlMessage(message_type, payload, payload_size,
+                                        std::move(handles));
+}
+
+void ChannelLinux::SharedMemReadReady() {
+  CHECK(read_buffer_);
+  if (read_buffer_->TryLockForReading()) {
+    read_notifier_->Clear();
+    do {
+      uint32_t bytes_read = 0;
+      SharedBuffer::Error read_res = read_buffer_->TryReadLocked(
+          read_buf_.data(), read_buf_.size(), &bytes_read);
+      if (read_res == SharedBuffer::Error::kControlCorruption) {
+        // This is an error we cannot recover from.
+        OnError(Error::kReceivedMalformedData);
+        read_buffer_->UnlockForReading();
+        break;
+      }
+
+      if (bytes_read == 0) {
+        break;
+      }
+
+      UMA_HISTOGRAM_COUNTS_100000("Mojo.Channel.Linux.SharedMemReadBytes",
+                                  bytes_read);
+
+      // Now dispatch the message, we KNOW it's at least one full message
+      // because we checked the message size before putting it into the
+      // shared buffer, this mechanism can never write a partial message.
+      off_t data_offset = 0;
+      while (bytes_read - data_offset > 0) {
+        size_t read_size_hint;
+        DispatchResult result = TryDispatchMessage(
+            base::make_span(
+                reinterpret_cast<char*>(read_buf_.data() + data_offset),
+                bytes_read - data_offset),
+            &read_size_hint);
+
+        // We cannot have a message parse failure, we KNOW that we wrote a
+        // full message if we get one something has gone horribly wrong.
+        if (result != DispatchResult::kOK) {
+          LOG(ERROR) << "Recevied a bad message via shared memory";
+          OnError(Error::kReceivedMalformedData);
+          break;
+        }
+
+        // The next message will start after read_size_hint bytes the writer
+        // guarantees that we wrote a full message and we've guaranteed that the
+        // message was dispatched correctly so we know where the next message
+        // starts.
+        data_offset += read_size_hint;
+      }
+    } while (true);
+    read_buffer_->UnlockForReading();
+  }
+}
+
+void ChannelLinux::OnWriteError(Error error) {
+  reject_writes_ = true;
+  ChannelPosix::OnWriteError(error);
+}
+
+void ChannelLinux::ShutDownOnIOThread() {
+  reject_writes_ = true;
+  read_notifier_.reset();
+  write_notifier_.reset();
+
+  ChannelPosix::ShutDownOnIOThread();
+}
+
+void ChannelLinux::StartOnIOThread() {
+  ChannelPosix::StartOnIOThread();
+}
+
+void ChannelLinux::OfferSharedMemUpgradeInternal() {
+  if (reject_writes_) {
+    return;
+  }
+
+  if (write_buffer_ || write_notifier_) {
+    LOG(ERROR) << "Upgrade attempted on an already upgraded channel";
+    return;
+  }
+
+  const size_t kSize = num_pages_ * base::GetPageSize();
+  base::ScopedFD memfd = CreateSealedMemFD(kSize);
+  if (!memfd.is_valid()) {
+    PLOG(ERROR) << "Unable to create memfd";
+    return;
+  }
+
+  bool properly_sealed = ValidateFDIsProperlySealedMemFD(memfd);
+  if (!properly_sealed) {
+    // We will not attempt an offer, something has gone wrong.
+    LOG(ERROR) << "FD was not properly sealed we cannot offer upgrade.";
+    return;
+  }
+
+  std::unique_ptr<SharedBuffer> write_buffer =
+      SharedBuffer::Create(memfd, kSize);
+  if (!write_buffer || !write_buffer->is_valid()) {
+    PLOG(ERROR) << "Unable to map shared memory";
+    return;
+  }
+
+  write_buffer->Initialize();
+
+  std::unique_ptr<EventFDNotifier> write_notifier =
+      EventFDNotifier::CreateWriteNotifier();
+  if (!write_notifier) {
+    PLOG(ERROR) << "Failed to create eventfd write notifier";
+    return;
+  }
+
+  std::vector<PlatformHandle> fds;
+  fds.emplace_back(std::move(memfd));
+  fds.emplace_back(write_notifier->take_dup());
+
+  write_notifier_ = std::move(write_notifier);
+  write_buffer_ = std::move(write_buffer);
+
+  UpgradeOfferMessage offer_msg;
+  offer_msg.num_pages = num_pages_;
+  MessagePtr msg(new Channel::Message(sizeof(UpgradeOfferMessage),
+                                      /*num handles=*/fds.size(),
+                                      Message::MessageType::UPGRADE_OFFER));
+  msg->SetHandles(std::move(fds));
+  memcpy(msg->mutable_payload(), &offer_msg, sizeof(offer_msg));
+
+  ChannelPosix::Write(std::move(msg));
+}
+
+// static
+bool ChannelLinux::KernelSupportsUpgradeRequirements() {
+  static bool supported = []() -> bool {
+    // Do we have memfd_create support, we check by seeing if we get an -ENOSYS
+    // or an -EINVAL. We also support -EPERM because of seccomp rules this is
+    // another possible outcome.
+    int ret = syscall(__NR_memfd_create, "", ~0);
+    PCHECK(ret < 0 && (errno == EINVAL || errno == ENOSYS || errno == EPERM));
+    bool memfd_supported = (ret < 0 && errno == EINVAL);
+    return memfd_supported && EventFDNotifier::KernelSupported();
+  }();
+  return supported;
+}
+
+// static
+bool ChannelLinux::UpgradesEnabled() {
+  if (!g_params_set.load())
+    return g_use_shared_mem.load();
+
+  return base::FeatureList::IsEnabled(kMojoLinuxChannelSharedMem);
+}
+
+// static
+void ChannelLinux::SetSharedMemParameters(bool enabled, uint32_t num_pages) {
+  g_params_set.store(true);
+  g_use_shared_mem.store(enabled);
+  g_shared_mem_pages.store(num_pages);
+}
+
+}  // namespace core
+}  // namespace mojo
diff --git a/mojo/core/channel_linux.h b/mojo/core/channel_linux.h
new file mode 100644
index 0000000..9793804a
--- /dev/null
+++ b/mojo/core/channel_linux.h
@@ -0,0 +1,95 @@
+// Copyright 2020 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 MOJO_CORE_CHANNEL_LINUX_H_
+#define MOJO_CORE_CHANNEL_LINUX_H_
+
+#include <atomic>
+#include <memory>
+
+#include "base/macros.h"
+#include "build/build_config.h"
+#include "mojo/core/channel_posix.h"
+
+namespace mojo {
+namespace core {
+
+class DataAvailableNotifier;
+
+// ChannelLinux is a specialization of ChannelPosix which has support for shared
+// memory via Mojo channel upgrades. By default on Linux, CrOS, and Android
+// every channel will be of type ChannelLinux which can be upgraded at runtime
+// to take advantage of shared memory when all required kernel features are
+// present.
+class MOJO_SYSTEM_IMPL_EXPORT ChannelLinux : public ChannelPosix {
+ public:
+  ChannelLinux(Delegate* delegate,
+               ConnectionParams connection_params,
+               HandlePolicy handle_policy,
+               scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
+
+  ChannelLinux(const ChannelLinux&) = delete;
+  ChannelLinux& operator=(const ChannelLinux&) = delete;
+
+  // KernelSupportsUpgradeRequirements will return true if the kernel supports
+  // the features necessary to use an upgrade channel. How the channel will be
+  // upgraded is an implementation detail and this just tells the caller that
+  // calling Channel::UpgradeChannel() will have some effect.
+  static bool KernelSupportsUpgradeRequirements();
+
+  // Will return true if at least one feature that is available via upgrade is
+  // enabled.
+  static bool UpgradesEnabled();
+
+  // SetSharedMemParams will control whether shared memory is used for this
+  // channel.
+  static void SetSharedMemParameters(bool enabled, uint32_t num_pages);
+
+  // ChannelPosix impl:
+  void Write(MessagePtr message) override;
+  void OfferSharedMemUpgrade();
+  bool OnControlMessage(Message::MessageType message_type,
+                        const void* payload,
+                        size_t payload_size,
+                        std::vector<PlatformHandle> handles) override;
+  void OnWriteError(Error error) override;
+
+  void StartOnIOThread() override;
+  void ShutDownOnIOThread() override;
+
+ private:
+  ~ChannelLinux() override;
+
+  class SharedBuffer;
+
+  void OfferSharedMemUpgradeInternal();
+  void SharedMemReadReady();
+
+  // We only offer once, we use an atomic flag to guarantee no races to offer.
+  std::atomic_flag offered_{false};
+
+  // This flag keeps track of whether or not we've established a shared memory
+  // channel with the remote. If false we always fall back to the PosixChannel
+  // (socket).
+  bool shared_mem_writer_ = false;
+
+  std::unique_ptr<DataAvailableNotifier> write_notifier_;
+  std::unique_ptr<SharedBuffer> write_buffer_;
+
+  std::unique_ptr<DataAvailableNotifier> read_notifier_;
+  std::unique_ptr<SharedBuffer> read_buffer_;
+
+  uint32_t num_pages_ = 0;
+
+  bool reject_writes_ = false;
+
+  // This is a temporary buffer we use to remove messages from the shared buffer
+  // for validation and dispatching.
+  std::vector<uint8_t> read_buf_;
+};
+
+}  // namespace core
+}  // namespace mojo
+
+#endif
diff --git a/mojo/core/channel_posix.cc b/mojo/core/channel_posix.cc
index 2335e8d2..5dd7359 100644
--- a/mojo/core/channel_posix.cc
+++ b/mojo/core/channel_posix.cc
@@ -31,15 +31,20 @@
 #if !defined(OS_NACL)
 #include <limits.h>
 #include <sys/uio.h>
+
+#if (defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID))
+#include "mojo/core/channel_linux.h"
 #endif
 
+#endif  // !defined(OS_NACL)
+
 namespace mojo {
 namespace core {
 
 namespace {
 #if !defined(OS_NACL)
 std::atomic<bool> g_use_writev{false};
-#endif
+#endif  // !defined(OS_NACL)
 
 const size_t kMaxBatchReadCapacity = 256 * 1024;
 }  // namespace
@@ -256,11 +261,11 @@
     ignore_result(server_.TakePlatformHandle());
   }
 #if defined(OS_IOS)
-    fds_to_close_.clear();
+  fds_to_close_.clear();
 #endif
 
-    // May destroy the |this| if it was the last reference.
-    self_ = nullptr;
+  // May destroy the |this| if it was the last reference.
+  self_ = nullptr;
 }
 
 void ChannelPosix::WillDestroyCurrentMessageLoop() {
@@ -273,68 +278,67 @@
   if (server_.is_valid()) {
     CHECK_EQ(fd, server_.platform_handle().GetFD().get());
 #if !defined(OS_NACL)
-      read_watcher_.reset();
-      base::CurrentThread::Get()->RemoveDestructionObserver(this);
+    read_watcher_.reset();
+    base::CurrentThread::Get()->RemoveDestructionObserver(this);
 
-      AcceptSocketConnection(server_.platform_handle().GetFD().get(), &socket_);
-      ignore_result(server_.TakePlatformHandle());
-      if (!socket_.is_valid()) {
-        OnError(Error::kConnectionFailed);
-        return;
-      }
-      StartOnIOThread();
-#else
-      NOTREACHED();
-#endif
+    AcceptSocketConnection(server_.platform_handle().GetFD().get(), &socket_);
+    ignore_result(server_.TakePlatformHandle());
+    if (!socket_.is_valid()) {
+      OnError(Error::kConnectionFailed);
       return;
-  }
-    CHECK_EQ(fd, socket_.get());
-
-    bool validation_error = false;
-    bool read_error = false;
-    size_t next_read_size = 0;
-    size_t buffer_capacity = 0;
-    size_t total_bytes_read = 0;
-    size_t bytes_read = 0;
-    do {
-      buffer_capacity = next_read_size;
-      char* buffer = GetReadBuffer(&buffer_capacity);
-      DCHECK_GT(buffer_capacity, 0u);
-
-      std::vector<base::ScopedFD> incoming_fds;
-      ssize_t read_result =
-          SocketRecvmsg(socket_.get(), buffer, buffer_capacity, &incoming_fds);
-      for (auto& incoming_fd : incoming_fds)
-        incoming_fds_.emplace_back(std::move(incoming_fd));
-
-      if (read_result > 0) {
-        bytes_read = static_cast<size_t>(read_result);
-        total_bytes_read += bytes_read;
-        if (!OnReadComplete(bytes_read, &next_read_size)) {
-          read_error = true;
-          validation_error = true;
-          break;
-        }
-      } else if (read_result == 0 ||
-                 (errno != EAGAIN && errno != EWOULDBLOCK)) {
-        read_error = true;
-        break;
-      } else {
-        // We expect more data but there is none to read. The
-        // FileDescriptorWatcher will wake us up again once there is.
-        DCHECK(errno == EAGAIN || errno == EWOULDBLOCK);
-        return;
-      }
-    } while (bytes_read == buffer_capacity &&
-             total_bytes_read < kMaxBatchReadCapacity && next_read_size > 0);
-    if (read_error) {
-      // Stop receiving read notifications.
-      read_watcher_.reset();
-      if (validation_error)
-        OnError(Error::kReceivedMalformedData);
-      else
-        OnError(Error::kDisconnected);
     }
+    StartOnIOThread();
+#else
+    NOTREACHED();
+#endif
+    return;
+  }
+  CHECK_EQ(fd, socket_.get());
+
+  bool validation_error = false;
+  bool read_error = false;
+  size_t next_read_size = 0;
+  size_t buffer_capacity = 0;
+  size_t total_bytes_read = 0;
+  size_t bytes_read = 0;
+  do {
+    buffer_capacity = next_read_size;
+    char* buffer = GetReadBuffer(&buffer_capacity);
+    DCHECK_GT(buffer_capacity, 0u);
+
+    std::vector<base::ScopedFD> incoming_fds;
+    ssize_t read_result =
+        SocketRecvmsg(socket_.get(), buffer, buffer_capacity, &incoming_fds);
+    for (auto& incoming_fd : incoming_fds)
+      incoming_fds_.emplace_back(std::move(incoming_fd));
+
+    if (read_result > 0) {
+      bytes_read = static_cast<size_t>(read_result);
+      total_bytes_read += bytes_read;
+      if (!OnReadComplete(bytes_read, &next_read_size)) {
+        read_error = true;
+        validation_error = true;
+        break;
+      }
+    } else if (read_result == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) {
+      read_error = true;
+      break;
+    } else {
+      // We expect more data but there is none to read. The
+      // FileDescriptorWatcher will wake us up again once there is.
+      DCHECK(errno == EAGAIN || errno == EWOULDBLOCK);
+      return;
+    }
+  } while (bytes_read == buffer_capacity &&
+           total_bytes_read < kMaxBatchReadCapacity && next_read_size > 0);
+  if (read_error) {
+    // Stop receiving read notifications.
+    read_watcher_.reset();
+    if (validation_error)
+      OnError(Error::kReceivedMalformedData);
+    else
+      OnError(Error::kDisconnected);
+  }
 }
 
 void ChannelPosix::OnFileCanWriteWithoutBlocking(int fd) {
@@ -377,29 +381,29 @@
       result = SendmsgWithHandles(socket_.get(), &iov, 1, fds);
       if (result >= 0) {
 #if defined(OS_IOS)
-          // There is a bug in XNU which makes it dangerous to close
-          // a file descriptor while it is in transit. So instead we
-          // store the file descriptor in a set and send a message to
-          // the recipient, which is queued AFTER the message that
-          // sent the FD. The recipient will reply to the message,
-          // letting us know that it is now safe to close the file
-          // descriptor. For more information, see:
-          // http://crbug.com/298276
-          MessagePtr fds_message(new Channel::Message(
-              sizeof(int) * fds.size(), 0, Message::MessageType::HANDLES_SENT));
-          int* fd_data = reinterpret_cast<int*>(fds_message->mutable_payload());
-          for (size_t i = 0; i < fds.size(); ++i)
-            fd_data[i] = fds[i].get();
-          outgoing_messages_.emplace_back(std::move(fds_message), 0);
-          {
-            base::AutoLock l(fds_to_close_lock_);
-            for (auto& fd : fds)
-              fds_to_close_.emplace_back(std::move(fd));
-          }
+        // There is a bug in XNU which makes it dangerous to close
+        // a file descriptor while it is in transit. So instead we
+        // store the file descriptor in a set and send a message to
+        // the recipient, which is queued AFTER the message that
+        // sent the FD. The recipient will reply to the message,
+        // letting us know that it is now safe to close the file
+        // descriptor. For more information, see:
+        // http://crbug.com/298276
+        MessagePtr fds_message(new Channel::Message(
+            sizeof(int) * fds.size(), 0, Message::MessageType::HANDLES_SENT));
+        int* fd_data = reinterpret_cast<int*>(fds_message->mutable_payload());
+        for (size_t i = 0; i < fds.size(); ++i)
+          fd_data[i] = fds[i].get();
+        outgoing_messages_.emplace_back(std::move(fds_message), 0);
+        {
+          base::AutoLock l(fds_to_close_lock_);
+          for (auto& fd : fds)
+            fds_to_close_.emplace_back(std::move(fd));
+        }
 #endif  // defined(OS_IOS)
-          handles_written += num_handles_to_send;
-          DCHECK_LE(handles_written, num_handles);
-          message_view.set_num_handles_sent(handles_written);
+        handles_written += num_handles_to_send;
+        DCHECK_LE(handles_written, num_handles);
+        message_view.set_num_handles_sent(handles_written);
       } else {
         // Message transmission failed, so pull the FDs back into |handles|
         // so they can be held by the Message again.
@@ -413,76 +417,86 @@
                            message_view.data_num_bytes());
     }
 
-      if (result < 0) {
-        if (errno != EAGAIN &&
-            errno != EWOULDBLOCK
+    if (result < 0) {
+      if (errno != EAGAIN &&
+          errno != EWOULDBLOCK
 #if defined(OS_IOS)
-            // On iOS if sendmsg() is trying to send fds between processes and
-            // there isn't enough room in the output buffer to send the fd
-            // structure over atomically then EMSGSIZE is returned.
-            //
-            // EMSGSIZE presents a problem since the system APIs can only call
-            // us when there's room in the socket buffer and not when there is
-            // "enough" room.
-            //
-            // The current behavior is to return to the event loop when EMSGSIZE
-            // is received and hopefull service another FD.  This is however
-            // still technically a busy wait since the event loop will call us
-            // right back until the receiver has read enough data to allow
-            // passing the FD over atomically.
-            && errno != EMSGSIZE
+          // On iOS if sendmsg() is trying to send fds between processes and
+          // there isn't enough room in the output buffer to send the fd
+          // structure over atomically then EMSGSIZE is returned.
+          //
+          // EMSGSIZE presents a problem since the system APIs can only call
+          // us when there's room in the socket buffer and not when there is
+          // "enough" room.
+          //
+          // The current behavior is to return to the event loop when EMSGSIZE
+          // is received and hopefully service another FD.  This is however
+          // still technically a busy wait since the event loop will call us
+          // right back until the receiver has read enough data to allow
+          // passing the FD over atomically.
+          && errno != EMSGSIZE
 #endif
-        ) {
-          return false;
-        }
-        message_view.SetHandles(std::move(handles));
-        outgoing_messages_.emplace_front(std::move(message_view));
-        WaitForWriteOnIOThreadNoLock();
-        return true;
+      ) {
+        return false;
       }
+      message_view.SetHandles(std::move(handles));
+      outgoing_messages_.emplace_front(std::move(message_view));
+      WaitForWriteOnIOThreadNoLock();
+      return true;
+    }
 
-      bytes_written = static_cast<size_t>(result);
+    bytes_written = static_cast<size_t>(result);
   } while (handles_written < num_handles ||
            bytes_written < message_view.data_num_bytes());
 
-    return FlushOutgoingMessagesNoLock();
+  return FlushOutgoingMessagesNoLock();
 }
 
 bool ChannelPosix::FlushOutgoingMessagesNoLock() {
 #if !defined(OS_NACL)
-    if (g_use_writev)
-      return FlushOutgoingMessagesWritevNoLock();
+  if (g_use_writev)
+    return FlushOutgoingMessagesWritevNoLock();
 #endif
 
-    base::circular_deque<MessageView> messages;
-    std::swap(outgoing_messages_, messages);
+  base::circular_deque<MessageView> messages;
+  std::swap(outgoing_messages_, messages);
 
-    if (!messages.empty()) {
-      UMA_HISTOGRAM_COUNTS_1000("Mojo.Channel.WriteQueuePendingMessages",
-                                messages.size());
-    }
+  if (!messages.empty()) {
+    UMA_HISTOGRAM_COUNTS_1000("Mojo.Channel.WriteQueuePendingMessages",
+                              messages.size());
+  }
 
-    while (!messages.empty()) {
-      if (!WriteNoLock(std::move(messages.front())))
-        return false;
+  while (!messages.empty()) {
+    if (!WriteNoLock(std::move(messages.front())))
+      return false;
 
-      messages.pop_front();
-      if (!outgoing_messages_.empty()) {
-        // The message was requeued by WriteNoLock(), so we have to wait for
-        // pipe to become writable again. Repopulate the message queue and exit.
-        // If sending the message triggered any control messages, they may be
-        // in |outgoing_messages_| in addition to or instead of the message
-        // being sent.
-        std::swap(messages, outgoing_messages_);
-        while (!messages.empty()) {
-          outgoing_messages_.push_front(std::move(messages.back()));
-          messages.pop_back();
-        }
-        return true;
+    messages.pop_front();
+    if (!outgoing_messages_.empty()) {
+      // The message was requeued by WriteNoLock(), so we have to wait for
+      // pipe to become writable again. Repopulate the message queue and exit.
+      // If sending the message triggered any control messages, they may be
+      // in |outgoing_messages_| in addition to or instead of the message
+      // being sent.
+      std::swap(messages, outgoing_messages_);
+      while (!messages.empty()) {
+        outgoing_messages_.push_front(std::move(messages.back()));
+        messages.pop_back();
       }
+      return true;
     }
+  }
 
-    return true;
+  return true;
+}
+
+void ChannelPosix::RejectUpgradeOffer() {
+  Write(std::make_unique<Channel::Message>(
+      0, 0, Message::MessageType::UPGRADE_REJECT));
+}
+
+void ChannelPosix::AcceptUpgradeOffer() {
+  Write(std::make_unique<Channel::Message>(
+      0, 0, Message::MessageType::UPGRADE_ACCEPT));
 }
 
 void ChannelPosix::OnWriteError(Error error) {
@@ -607,12 +621,19 @@
 }
 #endif  // !defined(OS_NACL)
 
-#if defined(OS_IOS)
 bool ChannelPosix::OnControlMessage(Message::MessageType message_type,
                                     const void* payload,
                                     size_t payload_size,
                                     std::vector<PlatformHandle> handles) {
   switch (message_type) {
+    case Message::MessageType::UPGRADE_OFFER: {
+      // ChannelPosix itself does not support upgrades, if the message was
+      // delivered here it could have been when this channel was created we
+      // didn't support upgrades but another process does.
+      RejectUpgradeOffer();
+      return true;
+    }
+#if defined(OS_IOS)
     case Message::MessageType::HANDLES_SENT: {
       if (payload_size == 0)
         break;
@@ -633,7 +654,7 @@
         break;
       return true;
     }
-
+#endif
     default:
       break;
   }
@@ -641,6 +662,7 @@
   return false;
 }
 
+#if defined(OS_IOS)
 // Closes handles referenced by |fds|. Returns false if |num_fds| is 0, or if
 // |fds| does not match a sequence of handles in |fds_to_close_|.
 bool ChannelPosix::CloseHandles(const int* fds, size_t num_fds) {
@@ -675,12 +697,12 @@
 }
 #endif  // defined(OS_IOS)
 
-// static
 #if !defined(OS_NACL)
+// static
 void Channel::set_posix_use_writev(bool use_writev) {
   g_use_writev = use_writev;
 }
-#endif
+#endif  // !defined(OS_NACL)
 
 // static
 scoped_refptr<Channel> Channel::Create(
@@ -688,9 +710,33 @@
     ConnectionParams connection_params,
     HandlePolicy handle_policy,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) {
+#if !defined(OS_NACL)
+#if (defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID))
+  return new ChannelLinux(delegate, std::move(connection_params), handle_policy,
+                          io_task_runner);
+#endif
+#endif
+
   return new ChannelPosix(delegate, std::move(connection_params), handle_policy,
                           io_task_runner);
 }
 
+#if !defined(OS_NACL)
+#if (defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID))
+// static
+bool Channel::SupportsChannelUpgrade() {
+  return ChannelLinux::KernelSupportsUpgradeRequirements() &&
+         ChannelLinux::UpgradesEnabled();
+}
+
+void Channel::OfferChannelUpgrade() {
+  if (!SupportsChannelUpgrade()) {
+    return;
+  }
+  static_cast<ChannelLinux*>(this)->OfferSharedMemUpgrade();
+}
+#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+#endif  // !defined(OS_NACL)
+
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/channel_posix.h b/mojo/core/channel_posix.h
index 33a33aa..e64e64c 100644
--- a/mojo/core/channel_posix.h
+++ b/mojo/core/channel_posix.h
@@ -43,14 +43,28 @@
                               size_t extra_header_size,
                               std::vector<PlatformHandle>* handles,
                               bool* deferred) override;
+  bool OnControlMessage(Message::MessageType message_type,
+                        const void* payload,
+                        size_t payload_size,
+                        std::vector<PlatformHandle> handles) override;
+
+ protected:
+  ~ChannelPosix() override;
+  virtual void StartOnIOThread();
+  virtual void ShutDownOnIOThread();
+  virtual void OnWriteError(Error error);
+
+  void RejectUpgradeOffer();
+  void AcceptUpgradeOffer();
+
+  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
+  scoped_refptr<Channel> self_;
+
+  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
 
  private:
-  ~ChannelPosix() override;
-
-  void StartOnIOThread();
   void WaitForWriteOnIOThread();
   void WaitForWriteOnIOThreadNoLock();
-  void ShutDownOnIOThread();
 
   // base::CurrentThread::DestructionObserver:
   void WillDestroyCurrentMessageLoop() override;
@@ -78,18 +92,9 @@
 #endif  // !defined(OS_NACL)
 
 #if defined(OS_IOS)
-  bool OnControlMessage(Message::MessageType message_type,
-                        const void* payload,
-                        size_t payload_size,
-                        std::vector<PlatformHandle> handles) override;
   bool CloseHandles(const int* fds, size_t num_fds);
 #endif  // defined(OS_IOS)
 
-  void OnWriteError(Error error);
-
-  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
-  scoped_refptr<Channel> self_;
-
   // We may be initialized with a server socket, in which case this will be
   // valid until it accepts an incoming connection.
   PlatformChannelServerEndpoint server_;
@@ -98,8 +103,6 @@
   // or accepted over |server_|.
   base::ScopedFD socket_;
 
-  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
-
   // These watchers must only be accessed on the IO thread.
   std::unique_ptr<base::MessagePumpForIO::FdWatchController> read_watcher_;
   std::unique_ptr<base::MessagePumpForIO::FdWatchController> write_watcher_;
diff --git a/mojo/core/embedder/BUILD.gn b/mojo/core/embedder/BUILD.gn
index a2b8772..59495848 100644
--- a/mojo/core/embedder/BUILD.gn
+++ b/mojo/core/embedder/BUILD.gn
@@ -21,7 +21,19 @@
   public_deps = [ "//base" ]
 
   deps = [
+    ":features",
     "//mojo/core:embedder_internal",
     "//mojo/public/c/system",
   ]
 }
+
+component("features") {
+  output_name = "mojo_core_embedder_features"
+
+  defines = [ "IS_MOJO_CORE_EMBEDDER_FEATURES_IMPL" ]
+
+  public = [ "features.h" ]
+  sources = [ "features.cc" ]
+
+  public_deps = [ "//base" ]
+}
diff --git a/mojo/core/embedder/embedder.cc b/mojo/core/embedder/embedder.cc
index 29b6d05..30189c494 100644
--- a/mojo/core/embedder/embedder.cc
+++ b/mojo/core/embedder/embedder.cc
@@ -15,26 +15,40 @@
 #include "mojo/core/channel.h"
 #include "mojo/core/configuration.h"
 #include "mojo/core/core.h"
+#include "mojo/core/embedder/features.h"
 #include "mojo/core/entrypoints.h"
 #include "mojo/core/node_controller.h"
 #include "mojo/public/c/system/thunks.h"
 
+#if !defined(OS_NACL)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+#include "mojo/core/channel_linux.h"
+#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+#endif  // !defined(OS_NACL)
+
 namespace mojo {
 namespace core {
 
-namespace {
-#if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
-const base::Feature kMojoPosixUseWritev{"MojoPosixUseWritev",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
-#endif
-}  // namespace
-
 // InitFeatures will be called as soon as the base::FeatureList is initialized.
 void InitFeatures() {
 #if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
   Channel::set_posix_use_writev(
       base::FeatureList::IsEnabled(kMojoPosixUseWritev));
-#endif
+
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+  bool shared_mem_enabled =
+      base::FeatureList::IsEnabled(kMojoLinuxChannelSharedMem);
+  int num_pages = kMojoLinuxChannelSharedMemPages.Get();
+  if (num_pages < 0) {
+    num_pages = 4;
+  } else if (num_pages > 128) {
+    num_pages = 128;
+  }
+
+  ChannelLinux::SetSharedMemParameters(shared_mem_enabled,
+                                       static_cast<unsigned int>(num_pages));
+#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+#endif  // defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
 }
 
 void Init(const Configuration& configuration) {
diff --git a/mojo/core/embedder/features.cc b/mojo/core/embedder/features.cc
new file mode 100644
index 0000000..ed3f4f2
--- /dev/null
+++ b/mojo/core/embedder/features.cc
@@ -0,0 +1,26 @@
+// 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 "mojo/core/embedder/features.h"
+
+namespace mojo {
+namespace core {
+
+#if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
+const base::Feature kMojoLinuxChannelSharedMem{
+    "MojoLinuxChannelSharedMem", base::FEATURE_DISABLED_BY_DEFAULT};
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
+const base::FeatureParam<int> kMojoLinuxChannelSharedMemPages{
+    &kMojoLinuxChannelSharedMem, "MojoLinuxChannelSharedMemPages", 4};
+#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
+const base::Feature kMojoPosixUseWritev{"MojoPosixUseWritev",
+                                        base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
+
+}  // namespace core
+}  // namespace mojo
diff --git a/mojo/core/embedder/features.h b/mojo/core/embedder/features.h
new file mode 100644
index 0000000..5125335
--- /dev/null
+++ b/mojo/core/embedder/features.h
@@ -0,0 +1,27 @@
+// 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 MOJO_CORE_EMBEDDER_FEATURES_H_
+#define MOJO_CORE_EMBEDDER_FEATURES_H_
+
+#include "base/component_export.h"
+#include "base/feature_list.h"
+#include "build/build_config.h"
+
+namespace mojo {
+namespace core {
+
+#if defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+extern const base::Feature kMojoLinuxChannelSharedMem;
+extern const base::FeatureParam<int> kMojoLinuxChannelSharedMemPages;
+#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
+
+extern const base::Feature kMojoPosixUseWritev;
+#endif  // defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_MAC)
+
+}  // namespace core
+}  // namespace mojo
+
+#endif  // MOJO_CORE_EMBEDDER_FEATURES_H_
diff --git a/mojo/core/node_channel.cc b/mojo/core/node_channel.cc
index c48fb57..33fb00ec 100644
--- a/mojo/core/node_channel.cc
+++ b/mojo/core/node_channel.cc
@@ -59,14 +59,22 @@
   ports::NodeName token;
 };
 
-using AcceptInviteeData = AcceptInviteeDataV0;
+struct alignas(8) AcceptInviteeDataV1 : AcceptInviteeDataV0 {
+  uint64_t capabilities = kNodeCapabilityNone;
+};
+
+using AcceptInviteeData = AcceptInviteeDataV1;
 
 struct alignas(8) AcceptInvitationDataV0 {
   ports::NodeName token;
   ports::NodeName invitee_name;
 };
 
-using AcceptInvitationData = AcceptInvitationDataV0;
+struct alignas(8) AcceptInvitationDataV1 : AcceptInvitationDataV0 {
+  uint64_t capabilities = kNodeCapabilityNone;
+};
+
+using AcceptInvitationData = AcceptInvitationDataV1;
 
 struct alignas(8) AcceptPeerDataV0 {
   ports::NodeName token;
@@ -84,7 +92,11 @@
 #endif
 };
 
-using AddBrokerClientData = AddBrokerClientDataV0;
+struct alignas(8) AddBrokerClientDataV1 : AddBrokerClientDataV0 {
+  uint64_t capabilities = kNodeCapabilityNone;
+};
+
+using AddBrokerClientData = AddBrokerClientDataV1;
 
 #if !defined(OS_WIN)
 static_assert(sizeof(base::ProcessHandle) == sizeof(uint32_t),
@@ -106,7 +118,12 @@
   ports::NodeName broker_name;
 };
 
-using AcceptBrokerClientData = AcceptBrokerClientDataV0;
+struct alignas(8) AcceptBrokerClientDataV1 : AcceptBrokerClientDataV0 {
+  uint64_t capabilities = kNodeCapabilityNone;
+  uint64_t broker_capabilities = kNodeCapabilityNone;
+};
+
+using AcceptBrokerClientData = AcceptBrokerClientDataV1;
 
 // This is followed by arbitrary payload data which is interpreted as a token
 // string for port location.
@@ -125,7 +142,11 @@
   ports::NodeName name;
 };
 
-using IntroductionData = IntroductionDataV0;
+struct alignas(8) IntroductionDataV1 : IntroductionDataV0 {
+  uint64_t capabilities = kNodeCapabilityNone;
+};
+
+using IntroductionData = IntroductionDataV1;
 
 // This message is just a PlatformHandle. The data struct alignas(8) here has
 // only a padding field to ensure an aligned, non-zero-length payload.
@@ -322,6 +343,7 @@
       MessageType::ACCEPT_INVITEE, sizeof(AcceptInviteeData), 0, &data);
   data->inviter_name = inviter_name;
   data->token = token;
+  data->capabilities = local_capabilities_;
   WriteChannelMessage(std::move(message));
 }
 
@@ -332,6 +354,7 @@
       MessageType::ACCEPT_INVITATION, sizeof(AcceptInvitationData), 0, &data);
   data->token = token;
   data->invitee_name = invitee_name;
+  data->capabilities = local_capabilities_;
   WriteChannelMessage(std::move(message));
 }
 
@@ -362,6 +385,7 @@
 #if !defined(OS_WIN)
   data->process_handle = process_handle.Handle();
 #endif
+  data->capabilities = local_capabilities_;
   WriteChannelMessage(std::move(message));
 }
 
@@ -380,7 +404,8 @@
 }
 
 void NodeChannel::AcceptBrokerClient(const ports::NodeName& broker_name,
-                                     PlatformHandle broker_channel) {
+                                     PlatformHandle broker_channel,
+                                     const uint64_t broker_capabilities) {
   AcceptBrokerClientData* data;
   std::vector<PlatformHandle> handles;
   if (broker_channel.is_valid())
@@ -390,6 +415,8 @@
                     sizeof(AcceptBrokerClientData), handles.size(), &data);
   message->SetHandles(std::move(handles));
   data->broker_name = broker_name;
+  data->broker_capabilities = broker_capabilities;
+  data->capabilities = local_capabilities_;
   WriteChannelMessage(std::move(message));
 }
 
@@ -413,7 +440,8 @@
 }
 
 void NodeChannel::Introduce(const ports::NodeName& name,
-                            PlatformHandle channel_handle) {
+                            PlatformHandle channel_handle,
+                            uint64_t capabilities) {
   IntroductionData* data;
   std::vector<PlatformHandle> handles;
   if (channel_handle.is_valid())
@@ -422,6 +450,9 @@
       MessageType::INTRODUCE, sizeof(IntroductionData), handles.size(), &data);
   message->SetHandles(std::move(handles));
   data->name = name;
+  // Note that these are not our capabilities, but the capabilities of the peer
+  // we're introducing.
+  data->capabilities = capabilities;
   WriteChannelMessage(std::move(message));
 }
 
@@ -516,6 +547,7 @@
                                std::move(io_task_runner)))
 #endif
 {
+  InitializeLocalCapabilities();
 }
 
 NodeChannel::~NodeChannel() {
@@ -549,7 +581,10 @@
   switch (header->type) {
     case MessageType::ACCEPT_INVITEE: {
       AcceptInviteeData data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
+      if (GetMessagePayloadMinimumSized<AcceptInviteeData, AcceptInviteeDataV0>(
+              payload, payload_size, &data)) {
+        // Attach any capabilities that the other side advertised.
+        SetRemoteCapabilities(data.capabilities);
         delegate_->OnAcceptInvitee(remote_node_name_, data.inviter_name,
                                    data.token);
         return;
@@ -559,7 +594,11 @@
 
     case MessageType::ACCEPT_INVITATION: {
       AcceptInvitationData data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
+      if (GetMessagePayloadMinimumSized<AcceptInvitationData,
+                                        AcceptInvitationDataV0>(
+              payload, payload_size, &data)) {
+        // Attach any capabilities that the other side advertised.
+        SetRemoteCapabilities(data.capabilities);
         delegate_->OnAcceptInvitation(remote_node_name_, data.token,
                                       data.invitee_name);
         return;
@@ -606,7 +645,9 @@
 
     case MessageType::ACCEPT_BROKER_CLIENT: {
       AcceptBrokerClientData data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
+      if (GetMessagePayloadMinimumSized<AcceptBrokerClientData,
+                                        AcceptBrokerClientDataV0>(
+              payload, payload_size, &data)) {
         PlatformHandle broker_channel;
         if (handles.size() > 1) {
           DLOG(ERROR) << "Dropping invalid AcceptBrokerClient message.";
@@ -615,8 +656,11 @@
         if (handles.size() == 1)
           broker_channel = std::move(handles[0]);
 
+        // Attach any capabilities that the other side advertised.
+        SetRemoteCapabilities(data.capabilities);
         delegate_->OnAcceptBrokerClient(remote_node_name_, data.broker_name,
-                                        std::move(broker_channel));
+                                        std::move(broker_channel),
+                                        data.broker_capabilities);
         return;
       }
       break;
@@ -659,7 +703,8 @@
 
     case MessageType::INTRODUCE: {
       IntroductionData data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
+      if (GetMessagePayloadMinimumSized<IntroductionData, IntroductionDataV0>(
+              payload, payload_size, &data)) {
         if (handles.size() > 1) {
           DLOG(ERROR) << "Dropping invalid introduction message.";
           break;
@@ -668,8 +713,11 @@
         if (handles.size() == 1)
           channel_handle = std::move(handles[0]);
 
+        // The node channel for this introduction will be created later, so we
+        // can only pass up the capabilities we received from the broker for
+        // that remote.
         delegate_->OnIntroduce(remote_node_name_, data.name,
-                               std::move(channel_handle));
+                               std::move(channel_handle), data.capabilities);
         return;
       }
       break;
@@ -803,5 +851,42 @@
     channel_->Write(std::move(message));
 }
 
+void NodeChannel::OfferChannelUpgrade() {
+#if !defined(OS_NACL)
+  base::AutoLock lock(channel_lock_);
+  channel_->OfferChannelUpgrade();
+#endif
+}
+
+uint64_t NodeChannel::RemoteCapabilities() const {
+  return remote_capabilities_;
+}
+
+bool NodeChannel::HasRemoteCapability(const uint64_t capability) const {
+  return (remote_capabilities_ & capability) == capability;
+}
+
+void NodeChannel::SetRemoteCapabilities(const uint64_t capabilities) {
+  remote_capabilities_ |= capabilities;
+}
+
+uint64_t NodeChannel::LocalCapabilities() const {
+  return local_capabilities_;
+}
+
+bool NodeChannel::HasLocalCapability(const uint64_t capability) const {
+  return (local_capabilities_ & capability) == capability;
+}
+
+void NodeChannel::SetLocalCapabilities(const uint64_t capabilities) {
+  local_capabilities_ |= capabilities;
+}
+
+void NodeChannel::InitializeLocalCapabilities() {
+  if (core::Channel::SupportsChannelUpgrade()) {
+    SetLocalCapabilities(kNodeCapabilitySupportsUpgrade);
+  }
+}
+
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/node_channel.h b/mojo/core/node_channel.h
index 74306a5..b037054 100644
--- a/mojo/core/node_channel.h
+++ b/mojo/core/node_channel.h
@@ -26,6 +26,9 @@
 namespace mojo {
 namespace core {
 
+constexpr uint64_t kNodeCapabilityNone = 0;
+constexpr uint64_t kNodeCapabilitySupportsUpgrade = 1;
+
 // Wraps a Channel to send and receive Node control messages.
 class MOJO_SYSTEM_IMPL_EXPORT NodeChannel
     : public base::RefCountedDeleteOnSequence<NodeChannel>,
@@ -48,7 +51,8 @@
                                      PlatformHandle broker_channel) = 0;
     virtual void OnAcceptBrokerClient(const ports::NodeName& from_node,
                                       const ports::NodeName& broker_name,
-                                      PlatformHandle broker_channel) = 0;
+                                      PlatformHandle broker_channel,
+                                      const uint64_t broker_capabilities) = 0;
     virtual void OnEventMessage(const ports::NodeName& from_node,
                                 Channel::MessagePtr message) = 0;
     virtual void OnRequestPortMerge(const ports::NodeName& from_node,
@@ -58,7 +62,8 @@
                                        const ports::NodeName& name) = 0;
     virtual void OnIntroduce(const ports::NodeName& from_node,
                              const ports::NodeName& name,
-                             PlatformHandle channel_handle) = 0;
+                             PlatformHandle channel_handle,
+                             const uint64_t remote_capabilities) = 0;
     virtual void OnBroadcast(const ports::NodeName& from_node,
                              Channel::MessagePtr message) = 0;
 #if defined(OS_WIN)
@@ -130,15 +135,26 @@
   void BrokerClientAdded(const ports::NodeName& client_name,
                          PlatformHandle broker_channel);
   void AcceptBrokerClient(const ports::NodeName& broker_name,
-                          PlatformHandle broker_channel);
+                          PlatformHandle broker_channel,
+                          const uint64_t broker_capabilities);
   void RequestPortMerge(const ports::PortName& connector_port_name,
                         const std::string& token);
   void RequestIntroduction(const ports::NodeName& name);
-  void Introduce(const ports::NodeName& name, PlatformHandle channel_handle);
+  void Introduce(const ports::NodeName& name,
+                 PlatformHandle channel_handle,
+                 uint64_t capabilities);
   void SendChannelMessage(Channel::MessagePtr message);
   void Broadcast(Channel::MessagePtr message);
   void BindBrokerHost(PlatformHandle broker_host_handle);
 
+  uint64_t RemoteCapabilities() const;
+  bool HasRemoteCapability(const uint64_t capability) const;
+  void SetRemoteCapabilities(const uint64_t capability);
+
+  uint64_t LocalCapabilities() const;
+  bool HasLocalCapability(const uint64_t capability) const;
+  void SetLocalCapabilities(const uint64_t capability);
+
 #if defined(OS_WIN)
   // Relay the message to the specified node via this channel.  This is used to
   // pass windows handles between two processes that do not have permission to
@@ -154,6 +170,8 @@
                              Channel::MessagePtr message);
 #endif
 
+  void OfferChannelUpgrade();
+
  private:
   friend class base::RefCountedDeleteOnSequence<NodeChannel>;
   friend class base::DeleteHelper<NodeChannel>;
@@ -181,6 +199,10 @@
 
   void WriteChannelMessage(Channel::MessagePtr message);
 
+  // This method is responsible for setting up the default set of capabilities
+  // for this channel.
+  void InitializeLocalCapabilities();
+
   Delegate* const delegate_;
   const ProcessErrorCallback process_error_callback_;
 
@@ -190,6 +212,9 @@
   // Must only be accessed from the owning task runner's thread.
   ports::NodeName remote_node_name_;
 
+  uint64_t remote_capabilities_ = kNodeCapabilityNone;
+  uint64_t local_capabilities_ = kNodeCapabilityNone;
+
   base::Lock remote_process_handle_lock_;
   base::Process remote_process_handle_;
 
diff --git a/mojo/core/node_controller.cc b/mojo/core/node_controller.cc
index 86b397df..014dfd9a 100644
--- a/mojo/core/node_controller.cc
+++ b/mojo/core/node_controller.cc
@@ -867,7 +867,8 @@
 
     if (!inviter) {
       // Yes, we're the broker. We can initialize the client directly.
-      channel->AcceptBrokerClient(name_, PlatformHandle());
+      channel->AcceptBrokerClient(name_, PlatformHandle(),
+                                  channel->LocalCapabilities());
     } else {
       // We aren't the broker, so wait for a broker connection.
       base::AutoLock lock(broker_lock_);
@@ -935,12 +936,14 @@
 
   DVLOG(1) << "Client " << client_name << " accepted by broker " << from_node;
 
-  client->AcceptBrokerClient(from_node, std::move(broker_channel));
+  client->AcceptBrokerClient(from_node, std::move(broker_channel),
+                             GetBrokerChannel()->RemoteCapabilities());
 }
 
 void NodeController::OnAcceptBrokerClient(const ports::NodeName& from_node,
                                           const ports::NodeName& broker_name,
-                                          PlatformHandle broker_channel) {
+                                          PlatformHandle broker_channel,
+                                          const uint64_t broker_capabilities) {
   DCHECK(!GetConfiguration().is_broker_process);
 
   // This node should already have an inviter in bootstrap mode.
@@ -979,6 +982,7 @@
         ConnectionParams(PlatformChannelEndpoint(std::move(broker_channel))),
         Channel::HandlePolicy::kAcceptHandles, io_task_runner_,
         ProcessErrorCallback());
+    broker->SetRemoteCapabilities(broker_capabilities);
     AddPeer(broker_name, broker, true /* start_channel */);
   }
 
@@ -1014,6 +1018,10 @@
     }
   }
 #endif
+  if (inviter->HasLocalCapability(kNodeCapabilitySupportsUpgrade) &&
+      inviter->HasRemoteCapability(kNodeCapabilitySupportsUpgrade)) {
+    inviter->OfferChannelUpgrade();
+  }
 
   DVLOG(1) << "Client " << name_ << " accepted by broker " << broker_name;
 }
@@ -1092,19 +1100,22 @@
   scoped_refptr<NodeChannel> new_friend = GetPeerChannel(name);
   if (!new_friend) {
     // We don't know who they're talking about!
-    requestor->Introduce(name, PlatformHandle());
+    requestor->Introduce(name, PlatformHandle(), kNodeCapabilityNone);
   } else {
     PlatformChannel new_channel;
     requestor->Introduce(name,
-                         new_channel.TakeLocalEndpoint().TakePlatformHandle());
-    new_friend->Introduce(
-        from_node, new_channel.TakeRemoteEndpoint().TakePlatformHandle());
+                         new_channel.TakeLocalEndpoint().TakePlatformHandle(),
+                         new_friend->RemoteCapabilities());
+    new_friend->Introduce(from_node,
+                          new_channel.TakeRemoteEndpoint().TakePlatformHandle(),
+                          requestor->RemoteCapabilities());
   }
 }
 
 void NodeController::OnIntroduce(const ports::NodeName& from_node,
                                  const ports::NodeName& name,
-                                 PlatformHandle channel_handle) {
+                                 PlatformHandle channel_handle,
+                                 const uint64_t remote_capabilities) {
   DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
 
   if (!channel_handle.is_valid()) {
@@ -1131,6 +1142,13 @@
 
   DVLOG(1) << "Adding new peer " << name << " via broker introduction.";
   AddPeer(name, channel, true /* start_channel */);
+
+  channel->SetRemoteCapabilities(remote_capabilities);
+
+  if (channel->HasLocalCapability(kNodeCapabilitySupportsUpgrade) &&
+      channel->HasRemoteCapability(kNodeCapabilitySupportsUpgrade)) {
+    channel->OfferChannelUpgrade();
+  }
 }
 
 void NodeController::OnBroadcast(const ports::NodeName& from_node,
@@ -1339,11 +1357,13 @@
 
 NodeController::IsolatedConnection::~IsolatedConnection() = default;
 
-NodeController::IsolatedConnection& NodeController::IsolatedConnection::
-operator=(const IsolatedConnection& other) = default;
+NodeController::IsolatedConnection&
+NodeController::IsolatedConnection::operator=(const IsolatedConnection& other) =
+    default;
 
-NodeController::IsolatedConnection& NodeController::IsolatedConnection::
-operator=(IsolatedConnection&& other) = default;
+NodeController::IsolatedConnection&
+NodeController::IsolatedConnection::operator=(IsolatedConnection&& other) =
+    default;
 
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/node_controller.h b/mojo/core/node_controller.h
index 254efe4..affbeda 100644
--- a/mojo/core/node_controller.h
+++ b/mojo/core/node_controller.h
@@ -206,7 +206,8 @@
                            PlatformHandle broker_channel) override;
   void OnAcceptBrokerClient(const ports::NodeName& from_node,
                             const ports::NodeName& broker_name,
-                            PlatformHandle broker_channel) override;
+                            PlatformHandle broker_channel,
+                            const uint64_t broker_capabilities) override;
   void OnEventMessage(const ports::NodeName& from_node,
                       Channel::MessagePtr message) override;
   void OnRequestPortMerge(const ports::NodeName& from_node,
@@ -216,7 +217,8 @@
                              const ports::NodeName& name) override;
   void OnIntroduce(const ports::NodeName& from_node,
                    const ports::NodeName& name,
-                   PlatformHandle channel_handle) override;
+                   PlatformHandle channel_handle,
+                   const uint64_t remote_capailities) override;
   void OnBroadcast(const ports::NodeName& from_node,
                    Channel::MessagePtr message) override;
 #if defined(OS_WIN)
diff --git a/mojo/core/test/mock_node_channel_delegate.h b/mojo/core/test/mock_node_channel_delegate.h
index 06ca968..f58552f 100644
--- a/mojo/core/test/mock_node_channel_delegate.h
+++ b/mojo/core/test/mock_node_channel_delegate.h
@@ -54,7 +54,8 @@
               OnAcceptBrokerClient,
               (const NodeName& from_node,
                const NodeName& broker_name,
-               PlatformHandle broker_channel),
+               PlatformHandle broker_channel,
+               const uint64_t capabilities),
               (override));
   MOCK_METHOD(void,
               OnEventMessage,
@@ -74,7 +75,8 @@
               OnIntroduce,
               (const NodeName& from_node,
                const NodeName& name,
-               PlatformHandle channel_handle),
+               PlatformHandle channel_handle,
+               const uint64_t remote_capabilites),
               (override));
   MOCK_METHOD(void,
               OnBroadcast,
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
index e00e3125..5c70e1f 100644
--- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
@@ -40,9 +40,11 @@
 namespace {
 
 bool IsBaselinePolicyAllowed(int sysno) {
+  // clang-format off
   return SyscallSets::IsAllowedAddressSpaceAccess(sysno) ||
          SyscallSets::IsAllowedBasicScheduler(sysno) ||
          SyscallSets::IsAllowedEpoll(sysno) ||
+         SyscallSets::IsEventFd(sysno) ||
          SyscallSets::IsAllowedFileSystemAccessViaFd(sysno) ||
          SyscallSets::IsAllowedFutex(sysno) ||
          SyscallSets::IsAllowedGeneralIo(sysno) ||
@@ -59,6 +61,7 @@
          SyscallSets::IsMipsPrivate(sysno) ||
 #endif
          SyscallSets::IsAllowedOperationOnFd(sysno);
+  // clang-format on
 }
 
 // System calls that will trigger the crashing SIGSYS handler.
@@ -68,7 +71,6 @@
          SyscallSets::IsAdvancedTimer(sysno) ||
          SyscallSets::IsAsyncIo(sysno) ||
          SyscallSets::IsDebug(sysno) ||
-         SyscallSets::IsEventFd(sysno) ||
          SyscallSets::IsExtendedAttributes(sysno) ||
          SyscallSets::IsFaNotify(sysno) ||
          SyscallSets::IsFsControl(sysno) ||
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc
index 35ab90e..c9d598c 100644
--- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_android.cc
@@ -151,11 +151,6 @@
       break;
   }
 
-  // https://crbug.com/772441 and https://crbug.com/760020.
-  if (SyscallSets::IsEventFd(sysno)) {
-    return Allow();
-  }
-
   // Ptrace is allowed so the crash reporter can fork in a renderer
   // and then ptrace the parent. https://crbug.com/933418
   if (sysno == __NR_ptrace) {
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
index 01c046d..68c29b5 100644
--- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
@@ -303,7 +303,6 @@
 TEST_BASELINE_SIGSYS(__NR_timer_create)
 
 #if !defined(__aarch64__)
-TEST_BASELINE_SIGSYS(__NR_eventfd)
 TEST_BASELINE_SIGSYS(__NR_inotify_init)
 TEST_BASELINE_SIGSYS(__NR_vserver)
 #endif
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
index 2a97d39..8fa54f5 100644
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
@@ -215,7 +215,7 @@
   // TODO(davidung), remove MAP_DENYWRITE with updated Tegra libraries.
   const uint64_t kAllowedMask = MAP_SHARED | MAP_PRIVATE | MAP_ANONYMOUS |
                                 MAP_STACK | MAP_NORESERVE | MAP_FIXED |
-                                MAP_DENYWRITE;
+                                MAP_DENYWRITE | MAP_LOCKED;
   const Arg<int> flags(3);
   return If((flags & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS());
 }
@@ -245,9 +245,12 @@
 
   const uint64_t kAllowedMask = O_ACCMODE | O_APPEND | O_NONBLOCK | O_SYNC |
                                 kOLargeFileFlag | O_CLOEXEC | O_NOATIME;
+  const uint64_t kAllowedSeals = F_SEAL_SEAL | F_SEAL_GROW | F_SEAL_SHRINK;
+  // clang-format off
   return Switch(cmd)
       .CASES((F_GETFL,
               F_GETFD,
+              F_GET_SEALS,
               F_SETFD,
               F_SETLK,
               F_SETLKW,
@@ -257,7 +260,10 @@
              Allow())
       .Case(F_SETFL,
             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
+      .Case(F_ADD_SEALS,
+            If((long_arg & ~kAllowedSeals) == 0, Allow()).Else(CrashSIGSYS()))
       .Default(CrashSIGSYS());
+  // clang-format on
 }
 
 #if defined(__i386__) || defined(__mips__)
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
index d9d18822..f40d436 100644
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
@@ -168,9 +168,11 @@
 bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
   switch (sysno) {
     case __NR_fstat:
+    case __NR_ftruncate:
 #if defined(__i386__) || defined(__arm__) || \
     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
     case __NR_fstat64:
+    case __NR_ftruncate64:
 #endif
       return true;
 // TODO(jln): these should be denied gracefully as well (moved below).
@@ -211,14 +213,9 @@
     case __NR_fallocate:
     case __NR_fchmod:
     case __NR_fchown:
-    case __NR_ftruncate:
 #if defined(__i386__) || defined(__arm__)
     case __NR_fchown32:
 #endif
-#if defined(__i386__) || defined(__arm__) || \
-    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-    case __NR_ftruncate64:
-#endif
 #if !defined(__aarch64__)
     case __NR_getdents:    // EPERM not a valid errno.
 #endif
diff --git a/sandbox/policy/linux/bpf_base_policy_linux.cc b/sandbox/policy/linux/bpf_base_policy_linux.cc
index 90164ea..04bd9c84 100644
--- a/sandbox/policy/linux/bpf_base_policy_linux.cc
+++ b/sandbox/policy/linux/bpf_base_policy_linux.cc
@@ -31,6 +31,11 @@
 ResultExpr BPFBasePolicy::EvaluateSyscall(int system_call_number) const {
   DCHECK(baseline_policy_);
 
+  // Used for shared memory Mojo channels on Linux.
+  if (system_call_number == __NR_memfd_create) {
+    return Allow();
+  }
+
   // set_robust_list(2) is part of the futex(2) infrastructure.
   // Chrome on Linux/Chrome OS will call set_robust_list(2) frequently.
   // The baseline policy will EPERM set_robust_list(2), but on systems with
diff --git a/sandbox/policy/linux/bpf_gpu_policy_linux.cc b/sandbox/policy/linux/bpf_gpu_policy_linux.cc
index 829efee8b..dd4c3116 100644
--- a/sandbox/policy/linux/bpf_gpu_policy_linux.cc
+++ b/sandbox/policy/linux/bpf_gpu_policy_linux.cc
@@ -93,8 +93,6 @@
     default:
       break;
   }
-  if (SyscallSets::IsEventFd(sysno))
-    return Allow();
 
 #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && defined(USE_X11)
   if (SyscallSets::IsSystemVSharedMemory(sysno))
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index 5a5334d..06b4d14 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -199,6 +199,8 @@
     "quota/quota_macros.h",
     "quota/quota_manager.cc",
     "quota/quota_manager.h",
+    "quota/quota_manager_impl.cc",
+    "quota/quota_manager_impl.h",
     "quota/quota_manager_proxy.cc",
     "quota/quota_manager_proxy.h",
     "quota/quota_override_handle.cc",
diff --git a/storage/browser/file_system/README.md b/storage/browser/file_system/README.md
index 38c82a7..53460ee9 100644
--- a/storage/browser/file_system/README.md
+++ b/storage/browser/file_system/README.md
@@ -50,7 +50,7 @@
 There are two flavors of this, "temporary" and "persistent".
 
 This same file system (or at least the "temporary" version) is also exposed via
-the new Native File System API.
+the new File System Access API.
 
 ### Isolated File Systems
 
@@ -58,7 +58,7 @@
 types to the web for the [Files and Directory Entries API](https://wicg.github.io/entries-api/),
 either via Drag&Drop or `<input type=file>`. They are also used for the (deprecated)
 [Chrome Apps chrome.fileSystem API](https://developer.chrome.com/apps/fileSystem),
-and the new [Native File System API](http://wicg.github.io/file-system-access/).
+and the new [File System Access API](http://wicg.github.io/file-system-access/).
 
 # Interesting Classes
 
@@ -143,6 +143,6 @@
 certain file systems to certain renderer processes (i.e.
 `content::ChildProcessSecurityPolicyImpl` calls `AddReference` when
 permission is granted, and call `RemoveReference` when the process is destroyed
-on all the file systems that renderer has access to). The Native File System API
+on all the file systems that renderer has access to). The File System Access API
 will introduce its own way of adding and removing references to these file
 systems.
diff --git a/storage/browser/file_system/async_file_util.h b/storage/browser/file_system/async_file_util.h
index 8528fad..a5ef84d 100644
--- a/storage/browser/file_system/async_file_util.h
+++ b/storage/browser/file_system/async_file_util.h
@@ -79,9 +79,9 @@
   using CopyOrMoveOption = FileSystemOperation::CopyOrMoveOption;
   using GetMetadataField = FileSystemOperation::GetMetadataField;
 
-  // Creates an AsyncFileUtil instance which performs file operations on
-  // local native file system. The created instance assumes
-  // FileSystemURL::path() has the target platform path.
+  // Creates an AsyncFileUtil instance which performs file operations on local
+  // file system. The created instance assumes FileSystemURL::path() has the
+  // target platform path.
   COMPONENT_EXPORT(STORAGE_BROWSER)
   static AsyncFileUtil* CreateForLocalFileSystem();
 
diff --git a/storage/browser/quota/quota_manager.cc b/storage/browser/quota/quota_manager.cc
index 0e62b21..704ab8e 100644
--- a/storage/browser/quota/quota_manager.cc
+++ b/storage/browser/quota/quota_manager.cc
@@ -1,1983 +1,5 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 "storage/browser/quota/quota_manager.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <functional>
-#include <limits>
-#include <memory>
-#include <utility>
-
-#include "base/barrier_closure.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/rand_util.h"
-#include "base/sequence_checker.h"
-#include "base/sequenced_task_runner.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/system/sys_info.h"
-#include "base/task/post_task.h"
-#include "base/task/thread_pool.h"
-#include "base/task_runner_util.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "base/types/pass_key.h"
-#include "components/services/storage/public/mojom/quota_client.mojom.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "storage/browser/quota/client_usage_tracker.h"
-#include "storage/browser/quota/mojo_quota_client_wrapper.h"
-#include "storage/browser/quota/quota_client_type.h"
-#include "storage/browser/quota/quota_features.h"
-#include "storage/browser/quota/quota_macros.h"
-#include "storage/browser/quota/quota_manager_proxy.h"
-#include "storage/browser/quota/quota_override_handle.h"
-#include "storage/browser/quota/quota_temporary_storage_evictor.h"
-#include "storage/browser/quota/usage_tracker.h"
-#include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
-
-using blink::mojom::StorageType;
-
-namespace storage {
-
-namespace {
-
-constexpr int64_t kReportHistogramInterval = 60 * 60 * 1000;  // 1 hour
-
-// Take action on write errors if there is <= 2% disk space
-// available.
-constexpr double kStoragePressureThresholdRatio = 0.02;
-
-// Limit how frequently QuotaManager polls for free disk space when
-// only using that information to identify storage pressure.
-constexpr base::TimeDelta kStoragePressureCheckDiskStatsInterval =
-    base::TimeDelta::FromMinutes(5);
-
-// Modifies a given value by a uniformly random amount from
-// -percent to +percent.
-int64_t RandomizeByPercent(int64_t value, int percent) {
-  double random_percent = (base::RandDouble() - 0.5) * percent * 2;
-  return value * (1 + (random_percent / 100.0));
-}
-}  // namespace
-
-// Heuristics: assuming average cloud server allows a few Gigs storage
-// on the server side and the storage needs to be shared for user data
-// and by multiple apps.
-int64_t QuotaManager::kSyncableStorageDefaultHostQuota = 500 * kMBytes;
-
-namespace {
-
-bool IsSupportedType(StorageType type) {
-  return type == StorageType::kTemporary || type == StorageType::kPersistent ||
-         type == StorageType::kSyncable;
-}
-
-bool IsSupportedIncognitoType(StorageType type) {
-  return type == StorageType::kTemporary || type == StorageType::kPersistent;
-}
-
-bool GetPersistentHostQuotaOnDBThread(const std::string& host,
-                                      int64_t* quota,
-                                      QuotaDatabase* database) {
-  DCHECK(database);
-  database->GetHostQuota(host, StorageType::kPersistent, quota);
-  return true;
-}
-
-bool SetPersistentHostQuotaOnDBThread(const std::string& host,
-                                      int64_t* new_quota,
-                                      QuotaDatabase* database) {
-  DCHECK(database);
-  if (database->SetHostQuota(host, StorageType::kPersistent, *new_quota))
-    return true;
-  *new_quota = 0;
-  return false;
-}
-
-bool GetLRUOriginOnDBThread(StorageType type,
-                            const std::set<url::Origin>& exceptions,
-                            SpecialStoragePolicy* policy,
-                            base::Optional<url::Origin>* origin,
-                            QuotaDatabase* database) {
-  DCHECK(database);
-  database->GetLRUOrigin(type, exceptions, policy, origin);
-  return true;
-}
-
-bool DeleteOriginInfoOnDBThread(const url::Origin& origin,
-                                StorageType type,
-                                bool is_eviction,
-                                QuotaDatabase* database) {
-  DCHECK(database);
-
-  base::Time now = base::Time::Now();
-
-  if (is_eviction) {
-    QuotaDatabase::OriginInfoTableEntry entry;
-    database->GetOriginInfo(origin, type, &entry);
-    UMA_HISTOGRAM_COUNTS_1M(QuotaManager::kEvictedOriginAccessedCountHistogram,
-                            entry.used_count);
-    UMA_HISTOGRAM_COUNTS_1000(
-        QuotaManager::kEvictedOriginDaysSinceAccessHistogram,
-        (now - entry.last_access_time).InDays());
-  }
-
-  if (!database->DeleteOriginInfo(origin, type))
-    return false;
-
-  // If the deletion is not due to an eviction, delete the entry in the eviction
-  // table as well due to privacy concerns.
-  if (!is_eviction)
-    return database->DeleteOriginLastEvictionTime(origin, type);
-
-  base::Time last_eviction_time;
-  database->GetOriginLastEvictionTime(origin, type, &last_eviction_time);
-
-  if (last_eviction_time != base::Time()) {
-    UMA_HISTOGRAM_COUNTS_1000(
-        QuotaManager::kDaysBetweenRepeatedOriginEvictionsHistogram,
-        (now - last_eviction_time).InDays());
-  }
-
-  return database->SetOriginLastEvictionTime(origin, type, now);
-}
-
-bool BootstrapDatabaseOnDBThread(std::set<url::Origin> origins,
-                                 QuotaDatabase* database) {
-  DCHECK(database);
-  if (database->IsOriginDatabaseBootstrapped())
-    return true;
-
-  // Register existing origins with 0 last time access.
-  if (database->RegisterInitialOriginInfo(origins, StorageType::kTemporary)) {
-    database->SetOriginDatabaseBootstrapped(true);
-    return true;
-  }
-  return false;
-}
-
-bool UpdateAccessTimeOnDBThread(const url::Origin& origin,
-                                StorageType type,
-                                base::Time accessed_time,
-                                QuotaDatabase* database) {
-  DCHECK(database);
-  return database->SetOriginLastAccessTime(origin, type, accessed_time);
-}
-
-bool UpdateModifiedTimeOnDBThread(const url::Origin& origin,
-                                  StorageType type,
-                                  base::Time modified_time,
-                                  QuotaDatabase* database) {
-  DCHECK(database);
-  return database->SetOriginLastModifiedTime(origin, type, modified_time);
-}
-
-void DidGetUsageAndQuotaStripBreakdown(
-    QuotaManager::UsageAndQuotaCallback callback,
-    blink::mojom::QuotaStatusCode status,
-    int64_t usage,
-    int64_t quota,
-    blink::mojom::UsageBreakdownPtr usage_breakdown) {
-  std::move(callback).Run(status, usage, quota);
-}
-
-void DidGetUsageAndQuotaStripOverride(
-    QuotaManager::UsageAndQuotaWithBreakdownCallback callback,
-    blink::mojom::QuotaStatusCode status,
-    int64_t usage,
-    int64_t quota,
-    bool is_override_enabled,
-    blink::mojom::UsageBreakdownPtr usage_breakdown) {
-  std::move(callback).Run(status, usage, quota, std::move(usage_breakdown));
-}
-
-}  // namespace
-
-constexpr int64_t QuotaManager::kGBytes;
-constexpr int64_t QuotaManager::kNoLimit;
-constexpr int64_t QuotaManager::kPerHostPersistentQuotaLimit;
-constexpr int QuotaManager::kEvictionIntervalInMilliSeconds;
-constexpr int QuotaManager::kThresholdOfErrorsToBeDenylisted;
-constexpr int QuotaManager::kThresholdRandomizationPercent;
-constexpr char QuotaManager::kDatabaseName[];
-constexpr char QuotaManager::kDaysBetweenRepeatedOriginEvictionsHistogram[];
-constexpr char QuotaManager::kEvictedOriginAccessedCountHistogram[];
-constexpr char QuotaManager::kEvictedOriginDaysSinceAccessHistogram[];
-
-QuotaManager::QuotaOverride::QuotaOverride() = default;
-QuotaManager::QuotaOverride::~QuotaOverride() = default;
-
-class QuotaManager::UsageAndQuotaInfoGatherer : public QuotaTask {
- public:
-  UsageAndQuotaInfoGatherer(QuotaManager* manager,
-                            const url::Origin& origin,
-                            StorageType type,
-                            bool is_unlimited,
-                            bool is_session_only,
-                            bool is_incognito,
-                            base::Optional<int64_t> quota_override_size,
-                            UsageAndQuotaForDevtoolsCallback callback)
-      : QuotaTask(manager),
-        origin_(origin),
-        callback_(std::move(callback)),
-        type_(type),
-        is_unlimited_(is_unlimited),
-        is_session_only_(is_session_only),
-        is_incognito_(is_incognito),
-        is_override_enabled_(quota_override_size.has_value()),
-        quota_override_size_(quota_override_size) {}
-
- protected:
-  void Run() override {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    // Start the async process of gathering the info we need.
-    // Gather 4 pieces of info before computing an answer:
-    // settings, device_storage_capacity, host_usage, and host_quota.
-    base::RepeatingClosure barrier = base::BarrierClosure(
-        4, base::BindOnce(&UsageAndQuotaInfoGatherer::OnBarrierComplete,
-                          weak_factory_.GetWeakPtr()));
-
-    const std::string& host = origin_.host();
-
-    manager()->GetQuotaSettings(
-        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotSettings,
-                       weak_factory_.GetWeakPtr(), barrier));
-    manager()->GetStorageCapacity(
-        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotCapacity,
-                       weak_factory_.GetWeakPtr(), barrier));
-    manager()->GetHostUsageWithBreakdown(
-        host, type_,
-        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotHostUsage,
-                       weak_factory_.GetWeakPtr(), barrier));
-
-    // Determine host_quota differently depending on type.
-    if (is_unlimited_) {
-      SetDesiredHostQuota(barrier, blink::mojom::QuotaStatusCode::kOk,
-                          kNoLimit);
-    } else if (type_ == StorageType::kSyncable) {
-      SetDesiredHostQuota(barrier, blink::mojom::QuotaStatusCode::kOk,
-                          kSyncableStorageDefaultHostQuota);
-    } else if (type_ == StorageType::kPersistent) {
-      manager()->GetPersistentHostQuota(
-          host, base::BindOnce(&UsageAndQuotaInfoGatherer::SetDesiredHostQuota,
-                               weak_factory_.GetWeakPtr(), barrier));
-    } else {
-      DCHECK_EQ(StorageType::kTemporary, type_);
-      // For temporary storage,  OnGotSettings will set the host quota.
-    }
-  }
-
-  void Aborted() override {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    weak_factory_.InvalidateWeakPtrs();
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort,
-                             /*usage=*/0,
-                             /*quota=*/0,
-                             /*is_override_enabled=*/false,
-                             /*usage_breakdown=*/nullptr);
-    DeleteSoon();
-  }
-
-  void Completed() override {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    weak_factory_.InvalidateWeakPtrs();
-
-    int64_t host_quota = quota_override_size_.has_value()
-                             ? quota_override_size_.value()
-                             : desired_host_quota_;
-    int64_t temp_pool_free_space =
-        std::max(static_cast<int64_t>(0),
-                 available_space_ - settings_.must_remain_available);
-
-    // Constrain the desired |host_quota| to something that fits.
-    if (host_quota > temp_pool_free_space) {
-      if (is_unlimited_) {
-        host_quota = available_space_ + host_usage_;
-      }
-    }
-
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, host_usage_,
-                             host_quota, is_override_enabled_,
-                             std::move(host_usage_breakdown_));
-    if (type_ == StorageType::kTemporary && !is_incognito_ &&
-        !is_unlimited_) {
-      UMA_HISTOGRAM_MBYTES("Quota.QuotaForOrigin", host_quota);
-      UMA_HISTOGRAM_MBYTES("Quota.UsageByOrigin", host_usage_);
-      if (host_quota > 0) {
-        UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedByOrigin",
-            std::min(100, static_cast<int>((host_usage_ * 100) / host_quota)));
-      }
-    }
-    DeleteSoon();
-  }
-
- private:
-  QuotaManager* manager() const {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  void OnGotSettings(base::RepeatingClosure barrier_closure,
-                     const QuotaSettings& settings) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    settings_ = settings;
-    barrier_closure.Run();
-    if (type_ == StorageType::kTemporary && !is_unlimited_) {
-      int64_t host_quota = is_session_only_
-                               ? settings.session_only_per_host_quota
-                               : settings.per_host_quota;
-      SetDesiredHostQuota(barrier_closure, blink::mojom::QuotaStatusCode::kOk,
-                          host_quota);
-    }
-  }
-
-  void OnGotCapacity(base::OnceClosure barrier_closure,
-                     int64_t total_space,
-                     int64_t available_space) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    total_space_ = total_space;
-    available_space_ = available_space;
-    std::move(barrier_closure).Run();
-  }
-
-  void OnGotHostUsage(base::OnceClosure barrier_closure,
-                      int64_t usage,
-                      blink::mojom::UsageBreakdownPtr usage_breakdown) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    host_usage_ = usage;
-    host_usage_breakdown_ = std::move(usage_breakdown);
-    std::move(barrier_closure).Run();
-  }
-
-  void SetDesiredHostQuota(base::OnceClosure barrier_closure,
-                           blink::mojom::QuotaStatusCode status,
-                           int64_t quota) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    desired_host_quota_ = quota;
-    std::move(barrier_closure).Run();
-  }
-
-  void OnBarrierComplete() { CallCompleted(); }
-
-  const url::Origin origin_;
-  QuotaManager::UsageAndQuotaForDevtoolsCallback callback_;
-  const StorageType type_;
-  const bool is_unlimited_;
-  const bool is_session_only_;
-  const bool is_incognito_;
-  int64_t available_space_ = 0;
-  int64_t total_space_ = 0;
-  int64_t desired_host_quota_ = 0;
-  int64_t host_usage_ = 0;
-  const bool is_override_enabled_;
-  base::Optional<int64_t> quota_override_size_;
-  blink::mojom::UsageBreakdownPtr host_usage_breakdown_;
-  QuotaSettings settings_;
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  // Weak pointers are used to support cancelling work.
-  base::WeakPtrFactory<UsageAndQuotaInfoGatherer> weak_factory_{this};
-};
-
-class QuotaManager::EvictionRoundInfoHelper : public QuotaTask {
- public:
-  EvictionRoundInfoHelper(QuotaManager* manager,
-                          EvictionRoundInfoCallback callback)
-      : QuotaTask(manager), callback_(std::move(callback)) {}
-
- protected:
-  void Run() override {
-    // Gather 2 pieces of info before deciding if we need to get GlobalUsage:
-    // settings and device_storage_capacity.
-    base::RepeatingClosure barrier = base::BarrierClosure(
-        2, base::BindOnce(&EvictionRoundInfoHelper::OnBarrierComplete,
-                          weak_factory_.GetWeakPtr()));
-
-    manager()->GetQuotaSettings(
-        base::BindOnce(&EvictionRoundInfoHelper::OnGotSettings,
-                       weak_factory_.GetWeakPtr(), barrier));
-    manager()->GetStorageCapacity(
-        base::BindOnce(&EvictionRoundInfoHelper::OnGotCapacity,
-                       weak_factory_.GetWeakPtr(), barrier));
-  }
-
-  void Aborted() override {
-    weak_factory_.InvalidateWeakPtrs();
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort,
-                             QuotaSettings(), 0, 0, 0, false);
-    DeleteSoon();
-  }
-
-  void Completed() override {
-    weak_factory_.InvalidateWeakPtrs();
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, settings_,
-                             available_space_, total_space_, global_usage_,
-                             global_usage_is_complete_);
-    DeleteSoon();
-  }
-
- private:
-  QuotaManager* manager() const {
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  void OnGotSettings(base::OnceClosure barrier_closure,
-                     const QuotaSettings& settings) {
-    settings_ = settings;
-    std::move(barrier_closure).Run();
-  }
-
-  void OnGotCapacity(base::OnceClosure barrier_closure,
-                     int64_t total_space,
-                     int64_t available_space) {
-    total_space_ = total_space;
-    available_space_ = available_space;
-    std::move(barrier_closure).Run();
-  }
-
-  void OnBarrierComplete() {
-    // Avoid computing the full current_usage when there's no pressure.
-    int64_t consumed_space = total_space_ - available_space_;
-    if (consumed_space < settings_.pool_size &&
-        available_space_ > settings_.should_remain_available) {
-      DCHECK(!global_usage_is_complete_);
-      global_usage_ =
-          manager()->GetUsageTracker(StorageType::kTemporary)->GetCachedUsage();
-      CallCompleted();
-      return;
-    }
-    manager()->GetGlobalUsage(
-        StorageType::kTemporary,
-        base::BindOnce(&EvictionRoundInfoHelper::OnGotGlobalUsage,
-                       weak_factory_.GetWeakPtr()));
-  }
-
-  void OnGotGlobalUsage(int64_t usage, int64_t unlimited_usage) {
-    global_usage_ = std::max(INT64_C(0), usage - unlimited_usage);
-    global_usage_is_complete_ = true;
-    CallCompleted();
-  }
-
-  EvictionRoundInfoCallback callback_;
-  QuotaSettings settings_;
-  int64_t available_space_ = 0;
-  int64_t total_space_ = 0;
-  int64_t global_usage_ = 0;
-  bool global_usage_is_complete_ = false;
-  base::WeakPtrFactory<EvictionRoundInfoHelper> weak_factory_{this};
-};
-
-class QuotaManager::GetUsageInfoTask : public QuotaTask {
- public:
-  GetUsageInfoTask(QuotaManager* manager, GetUsageInfoCallback callback)
-      : QuotaTask(manager), callback_(std::move(callback)) {}
-
- protected:
-  void Run() override {
-    remaining_trackers_ = 3;
-    // This will populate cached hosts and usage info.
-    manager()
-        ->GetUsageTracker(StorageType::kTemporary)
-        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
-                                        weak_factory_.GetWeakPtr(),
-                                        StorageType::kTemporary));
-    manager()
-        ->GetUsageTracker(StorageType::kPersistent)
-        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
-                                        weak_factory_.GetWeakPtr(),
-                                        StorageType::kPersistent));
-    manager()
-        ->GetUsageTracker(StorageType::kSyncable)
-        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
-                                        weak_factory_.GetWeakPtr(),
-                                        StorageType::kSyncable));
-  }
-
-  void Completed() override {
-    std::move(callback_).Run(std::move(entries_));
-    DeleteSoon();
-  }
-
-  void Aborted() override {
-    std::move(callback_).Run(UsageInfoEntries());
-    DeleteSoon();
-  }
-
- private:
-  void AddEntries(StorageType type, UsageTracker* tracker) {
-    std::map<std::string, int64_t> host_usage = tracker->GetCachedHostsUsage();
-    for (const auto& host_usage_pair : host_usage) {
-      entries_.emplace_back(host_usage_pair.first, type,
-                            host_usage_pair.second);
-    }
-    if (--remaining_trackers_ == 0)
-      CallCompleted();
-  }
-
-  void DidGetGlobalUsage(StorageType type, int64_t, int64_t) {
-    DCHECK(manager()->GetUsageTracker(type));
-    AddEntries(type, manager()->GetUsageTracker(type));
-  }
-
-  QuotaManager* manager() const {
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  GetUsageInfoCallback callback_;
-  UsageInfoEntries entries_;
-  int remaining_trackers_;
-  base::WeakPtrFactory<GetUsageInfoTask> weak_factory_{this};
-
-};
-
-class QuotaManager::OriginDataDeleter : public QuotaTask {
- public:
-  OriginDataDeleter(QuotaManager* manager,
-                    const url::Origin& origin,
-                    StorageType type,
-                    QuotaClientTypes quota_client_types,
-                    bool is_eviction,
-                    StatusCallback callback)
-      : QuotaTask(manager),
-        origin_(origin),
-        type_(type),
-        quota_client_types_(std::move(quota_client_types)),
-        error_count_(0),
-        remaining_clients_(0),
-        skipped_clients_(0),
-        is_eviction_(is_eviction),
-        callback_(std::move(callback)) {}
-
- protected:
-  void Run() override {
-    DCHECK(manager()->client_types_.contains(type_));
-    remaining_clients_ = manager()->client_types_[type_].size();
-
-    for (const auto& client_and_type : manager()->client_types_[type_]) {
-      QuotaClient* client = client_and_type.first;
-      QuotaClientType client_type = client_and_type.second;
-      if (quota_client_types_.contains(client_type)) {
-        static int tracing_id = 0;
-        TRACE_EVENT_ASYNC_BEGIN2(
-            "browsing_data", "QuotaManager::OriginDataDeleter", ++tracing_id,
-            "client_type", client_type, "origin", origin_.Serialize());
-        client->DeleteOriginData(
-            origin_, type_,
-            base::BindOnce(&OriginDataDeleter::DidDeleteOriginData,
-                           weak_factory_.GetWeakPtr(), tracing_id));
-      } else {
-        ++skipped_clients_;
-        --remaining_clients_;
-      }
-    }
-
-    if (remaining_clients_ == 0)
-      CallCompleted();
-  }
-
-  void Completed() override {
-    if (error_count_ == 0) {
-      // Only remove the entire origin if we didn't skip any client types.
-      if (skipped_clients_ == 0)
-        manager()->DeleteOriginFromDatabase(origin_, type_, is_eviction_);
-      std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk);
-    } else {
-      std::move(callback_).Run(
-          blink::mojom::QuotaStatusCode::kErrorInvalidModification);
-    }
-    DeleteSoon();
-  }
-
-  void Aborted() override {
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort);
-    DeleteSoon();
-  }
-
- private:
-  void DidDeleteOriginData(int tracing_id,
-                           blink::mojom::QuotaStatusCode status) {
-    DCHECK_GT(remaining_clients_, 0U);
-    TRACE_EVENT_ASYNC_END0("browsing_data", "QuotaManager::OriginDataDeleter",
-                           tracing_id);
-
-    if (status != blink::mojom::QuotaStatusCode::kOk)
-      ++error_count_;
-
-    if (--remaining_clients_ == 0)
-      CallCompleted();
-  }
-
-  QuotaManager* manager() const {
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  const url::Origin origin_;
-  const StorageType type_;
-  const QuotaClientTypes quota_client_types_;
-  int error_count_;
-  size_t remaining_clients_;
-  int skipped_clients_;
-  const bool is_eviction_;
-  StatusCallback callback_;
-
-  base::WeakPtrFactory<OriginDataDeleter> weak_factory_{this};
-};
-
-class QuotaManager::HostDataDeleter : public QuotaTask {
- public:
-  HostDataDeleter(QuotaManager* manager,
-                  const std::string& host,
-                  StorageType type,
-                  QuotaClientTypes quota_client_types,
-                  StatusCallback callback)
-      : QuotaTask(manager),
-        host_(host),
-        type_(type),
-        quota_client_types_(std::move(quota_client_types)),
-        error_count_(0),
-        remaining_clients_(0),
-        remaining_deleters_(0),
-        callback_(std::move(callback)) {}
-
- protected:
-  void Run() override {
-    DCHECK(manager()->client_types_.contains(type_));
-    remaining_clients_ = manager()->client_types_[type_].size();
-
-    for (const auto& client_and_type : manager()->client_types_[type_]) {
-      client_and_type.first->GetOriginsForHost(
-          type_, host_,
-          base::BindOnce(&HostDataDeleter::DidGetOriginsForHost,
-                         weak_factory_.GetWeakPtr()));
-    }
-  }
-
-  void Completed() override {
-    if (error_count_ == 0) {
-      std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk);
-    } else {
-      std::move(callback_).Run(
-          blink::mojom::QuotaStatusCode::kErrorInvalidModification);
-    }
-    DeleteSoon();
-  }
-
-  void Aborted() override {
-    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort);
-    DeleteSoon();
-  }
-
- private:
-  void DidGetOriginsForHost(const std::vector<url::Origin>& origins) {
-    DCHECK_GT(remaining_clients_, 0U);
-
-    for (const auto& origin : origins)
-      origins_.insert(origin);
-
-    if (--remaining_clients_ == 0) {
-      if (!origins_.empty())
-        ScheduleOriginsDeletion();
-      else
-        CallCompleted();
-    }
-  }
-
-  void ScheduleOriginsDeletion() {
-    remaining_deleters_ = origins_.size();
-    for (const auto& origin : origins_) {
-      OriginDataDeleter* deleter = new OriginDataDeleter(
-          manager(), origin, type_, std::move(quota_client_types_), false,
-          base::BindOnce(&HostDataDeleter::DidDeleteOriginData,
-                         weak_factory_.GetWeakPtr()));
-      deleter->Start();
-    }
-  }
-
-  void DidDeleteOriginData(blink::mojom::QuotaStatusCode status) {
-    DCHECK_GT(remaining_deleters_, 0U);
-
-    if (status != blink::mojom::QuotaStatusCode::kOk)
-      ++error_count_;
-
-    if (--remaining_deleters_ == 0)
-      CallCompleted();
-  }
-
-  QuotaManager* manager() const {
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  const std::string host_;
-  const StorageType type_;
-  const QuotaClientTypes quota_client_types_;
-  std::set<url::Origin> origins_;
-  int error_count_;
-  size_t remaining_clients_;
-  size_t remaining_deleters_;
-  StatusCallback callback_;
-
-  base::WeakPtrFactory<HostDataDeleter> weak_factory_{this};
-};
-
-class QuotaManager::StorageCleanupHelper : public QuotaTask {
- public:
-  StorageCleanupHelper(QuotaManager* manager,
-                       StorageType type,
-                       QuotaClientTypes quota_client_types,
-                       base::OnceClosure callback)
-      : QuotaTask(manager),
-        type_(type),
-        quota_client_types_(std::move(quota_client_types)),
-        callback_(std::move(callback)) {
-    DCHECK(manager->client_types_.contains(type_));
-  }
-
- protected:
-  void Run() override {
-    DCHECK(manager()->client_types_.contains(type_));
-    base::RepeatingClosure barrier = base::BarrierClosure(
-        manager()->client_types_[type_].size(),
-        base::BindOnce(&StorageCleanupHelper::CallCompleted,
-                       weak_factory_.GetWeakPtr()));
-
-    // This may synchronously trigger |callback_| at the end of the for loop,
-    // make sure we do nothing after this block.
-    for (const auto& client_and_type : manager()->client_types_[type_]) {
-      QuotaClient* client = client_and_type.first;
-      QuotaClientType client_type = client_and_type.second;
-      if (quota_client_types_.contains(client_type)) {
-        client->PerformStorageCleanup(type_, barrier);
-      } else {
-        barrier.Run();
-      }
-    }
-  }
-
-  void Aborted() override {
-    weak_factory_.InvalidateWeakPtrs();
-    std::move(callback_).Run();
-    DeleteSoon();
-  }
-
-  void Completed() override {
-    weak_factory_.InvalidateWeakPtrs();
-    std::move(callback_).Run();
-    DeleteSoon();
-  }
-
- private:
-  QuotaManager* manager() const {
-    return static_cast<QuotaManager*>(observer());
-  }
-
-  const StorageType type_;
-  const QuotaClientTypes quota_client_types_;
-  base::OnceClosure callback_;
-  base::WeakPtrFactory<StorageCleanupHelper> weak_factory_{this};
-};
-
-// Fetch origins that have been modified since the specified time. This is used
-// to clear data for origins that have been modified within the user specified
-// time frame.
-//
-// This class is granted ownership of itself when it is passed to
-// DidGetModifiedBetween() via base::Owned(). When the closure for said
-// function goes out of scope, the object is deleted. This is a thread-safe
-// class.
-class QuotaManager::GetModifiedSinceHelper {
- public:
-  bool GetModifiedBetweenOnDBThread(StorageType type,
-                                    base::Time begin,
-                                    base::Time end,
-                                    QuotaDatabase* database) {
-    DCHECK(database);
-    return database->GetOriginsModifiedBetween(type, &origins_, begin, end);
-  }
-
-  void DidGetModifiedBetween(const base::WeakPtr<QuotaManager>& manager,
-                             GetOriginsCallback callback,
-                             StorageType type,
-                             bool success) {
-    if (!manager) {
-      // The operation was aborted.
-      std::move(callback).Run(std::set<url::Origin>(), type);
-      return;
-    }
-    manager->DidDatabaseWork(success);
-    std::move(callback).Run(origins_, type);
-  }
-
- private:
-  std::set<url::Origin> origins_;
-};
-
-// Gather origin info table for quota-internals page.
-//
-// This class is granted ownership of itself when it is passed to
-// DidDumpQuotaTable() via base::Owned(). When the closure for said function
-// goes out of scope, the object is deleted.
-// This class is not thread-safe because there can be a race when entries_ is
-// modified.
-class QuotaManager::DumpQuotaTableHelper {
- public:
-  bool DumpQuotaTableOnDBThread(QuotaDatabase* database) {
-    DCHECK(database);
-    return database->DumpQuotaTable(base::BindRepeating(
-        &DumpQuotaTableHelper::AppendEntry, base::Unretained(this)));
-  }
-
-  void DidDumpQuotaTable(const base::WeakPtr<QuotaManager>& manager,
-                         DumpQuotaTableCallback callback,
-                         bool success) {
-    if (!manager) {
-      // The operation was aborted.
-      std::move(callback).Run(QuotaTableEntries());
-      return;
-    }
-    manager->DidDatabaseWork(success);
-    std::move(callback).Run(entries_);
-  }
-
- private:
-  bool AppendEntry(const QuotaTableEntry& entry) {
-    entries_.push_back(entry);
-    return true;
-  }
-
-  QuotaTableEntries entries_;
-};
-
-// Gather origin info table for quota-internals page.
-//
-// This class is granted ownership of itself when it is passed to
-// DidDumpQuotaTable() via base::Owned(). When the closure for said function
-// goes out of scope, the object is deleted.
-// This class is not thread-safe because there can be races when entries_ is
-// modified.
-class QuotaManager::DumpOriginInfoTableHelper {
- public:
-  bool DumpOriginInfoTableOnDBThread(QuotaDatabase* database) {
-    DCHECK(database);
-    return database->DumpOriginInfoTable(base::BindRepeating(
-        &DumpOriginInfoTableHelper::AppendEntry, base::Unretained(this)));
-  }
-
-  void DidDumpOriginInfoTable(const base::WeakPtr<QuotaManager>& manager,
-                              DumpOriginInfoTableCallback callback,
-                              bool success) {
-    if (!manager) {
-      // The operation was aborted.
-      std::move(callback).Run(OriginInfoTableEntries());
-      return;
-    }
-    manager->DidDatabaseWork(success);
-    std::move(callback).Run(entries_);
-  }
-
- private:
-  bool AppendEntry(const OriginInfoTableEntry& entry) {
-    entries_.push_back(entry);
-    return true;
-  }
-
-  OriginInfoTableEntries entries_;
-};
-
-// QuotaManager ---------------------------------------------------------------
-
-QuotaManager::QuotaManager(
-    bool is_incognito,
-    const base::FilePath& profile_path,
-    scoped_refptr<base::SingleThreadTaskRunner> io_thread,
-    base::RepeatingClosure quota_change_callback,
-    scoped_refptr<SpecialStoragePolicy> special_storage_policy,
-    const GetQuotaSettingsFunc& get_settings_function)
-    : RefCountedDeleteOnSequence<QuotaManager>(io_thread),
-      is_incognito_(is_incognito),
-      profile_path_(profile_path),
-      proxy_(base::MakeRefCounted<QuotaManagerProxy>(this, io_thread)),
-      db_disabled_(false),
-      eviction_disabled_(false),
-      io_thread_(std::move(io_thread)),
-      db_runner_(base::ThreadPool::CreateSequencedTaskRunner(
-          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
-           base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
-      get_settings_function_(get_settings_function),
-      quota_change_callback_(std::move(quota_change_callback)),
-      is_getting_eviction_origin_(false),
-      special_storage_policy_(std::move(special_storage_policy)),
-      get_volume_info_fn_(&QuotaManager::GetVolumeInfo) {
-  DCHECK_EQ(settings_.refresh_interval, base::TimeDelta::Max());
-  if (!get_settings_function.is_null()) {
-    // Reset the interval to ensure we use the get_settings_function
-    // the first times settings_ is needed.
-    settings_.refresh_interval = base::TimeDelta();
-    get_settings_task_runner_ = base::ThreadTaskRunnerHandle::Get();
-  }
-  DETACH_FROM_SEQUENCE(sequence_checker_);
-}
-
-void QuotaManager::SetQuotaSettings(const QuotaSettings& settings) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  settings_ = settings;
-  settings_timestamp_ = base::TimeTicks::Now();
-}
-
-void QuotaManager::GetUsageInfo(GetUsageInfoCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  GetUsageInfoTask* get_usage_info =
-      new GetUsageInfoTask(this, std::move(callback));
-  get_usage_info->Start();
-}
-
-void QuotaManager::GetUsageAndQuotaForWebApps(const url::Origin& origin,
-                                              StorageType type,
-                                              UsageAndQuotaCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  GetUsageAndQuotaWithBreakdown(
-      origin, type,
-      base::BindOnce(&DidGetUsageAndQuotaStripBreakdown, std::move(callback)));
-}
-
-void QuotaManager::GetUsageAndQuotaWithBreakdown(
-    const url::Origin& origin,
-    StorageType type,
-    UsageAndQuotaWithBreakdownCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  GetUsageAndQuotaForDevtools(
-      origin, type,
-      base::BindOnce(&DidGetUsageAndQuotaStripOverride, std::move(callback)));
-}
-
-void QuotaManager::GetUsageAndQuotaForDevtools(
-    const url::Origin& origin,
-    StorageType type,
-    UsageAndQuotaForDevtoolsCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!IsSupportedType(type) ||
-      (is_incognito_ && !IsSupportedIncognitoType(type))) {
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported,
-                            /*usage=*/0,
-                            /*quota=*/0,
-                            /*is_override_enabled=*/false,
-                            /*usage_breakdown=*/nullptr);
-    return;
-  }
-  LazyInitialize();
-
-  bool is_session_only =
-      type == StorageType::kTemporary && special_storage_policy_ &&
-      special_storage_policy_->IsStorageSessionOnly(origin.GetURL());
-
-  base::Optional<int64_t> quota_override = GetQuotaOverrideForOrigin(origin);
-
-  UsageAndQuotaInfoGatherer* helper = new UsageAndQuotaInfoGatherer(
-      this, origin, type, IsStorageUnlimited(origin, type), is_session_only,
-      is_incognito_, quota_override, std::move(callback));
-  helper->Start();
-}
-
-void QuotaManager::GetUsageAndQuota(const url::Origin& origin,
-                                    StorageType type,
-                                    UsageAndQuotaCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (IsStorageUnlimited(origin, type)) {
-    // TODO(michaeln): This seems like a non-obvious odd behavior, probably for
-    // apps/extensions, but it would be good to eliminate this special case.
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0, kNoLimit);
-    return;
-  }
-
-  if (!IsSupportedType(type) ||
-      (is_incognito_ && !IsSupportedIncognitoType(type))) {
-    std::move(callback).Run(
-        /*status*/ blink::mojom::QuotaStatusCode::kErrorNotSupported,
-        /*usage*/ 0,
-        /*quota*/ 0);
-    return;
-  }
-  LazyInitialize();
-
-  bool is_session_only =
-      type == StorageType::kTemporary && special_storage_policy_ &&
-      special_storage_policy_->IsStorageSessionOnly(origin.GetURL());
-
-  base::Optional<int64_t> quota_override = GetQuotaOverrideForOrigin(origin);
-
-  UsageAndQuotaInfoGatherer* helper = new UsageAndQuotaInfoGatherer(
-      this, origin, type, IsStorageUnlimited(origin, type), is_session_only,
-      is_incognito_, quota_override,
-      base::BindOnce(&DidGetUsageAndQuotaStripOverride,
-                     base::BindOnce(&DidGetUsageAndQuotaStripBreakdown,
-                                    std::move(callback))));
-  helper->Start();
-}
-
-void QuotaManager::NotifyWriteFailed(const url::Origin& origin) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  auto age_of_disk_stats = base::TimeTicks::Now() -
-                           std::get<0>(cached_disk_stats_for_storage_pressure_);
-
-  // Avoid polling for free disk space if disk stats have been recently
-  // queried.
-  if (age_of_disk_stats < kStoragePressureCheckDiskStatsInterval) {
-    int64_t total_space = std::get<1>(cached_disk_stats_for_storage_pressure_);
-    int64_t available_space =
-        std::get<2>(cached_disk_stats_for_storage_pressure_);
-    MaybeRunStoragePressureCallback(origin, total_space, available_space);
-  }
-
-  GetStorageCapacity(
-      base::BindOnce(&QuotaManager::MaybeRunStoragePressureCallback,
-                     weak_factory_.GetWeakPtr(), origin));
-}
-
-void QuotaManager::NotifyOriginInUse(const url::Origin& origin) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-  origins_in_use_[origin]++;
-}
-
-void QuotaManager::NotifyOriginNoLongerInUse(const url::Origin& origin) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-  DCHECK(IsOriginInUse(origin));
-  int& count = origins_in_use_[origin];
-  if (--count == 0)
-    origins_in_use_.erase(origin);
-}
-
-void QuotaManager::SetUsageCacheEnabled(QuotaClientType client_id,
-                                        const url::Origin& origin,
-                                        StorageType type,
-                                        bool enabled) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  DCHECK(GetUsageTracker(type));
-  GetUsageTracker(type)->SetUsageCacheEnabled(client_id, origin, enabled);
-}
-
-void QuotaManager::DeleteOriginData(const url::Origin& origin,
-                                    StorageType type,
-                                    QuotaClientTypes quota_client_types,
-                                    StatusCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DeleteOriginDataInternal(origin, type, std::move(quota_client_types), false,
-                           std::move(callback));
-}
-
-void QuotaManager::PerformStorageCleanup(StorageType type,
-                                         QuotaClientTypes quota_client_types,
-                                         base::OnceClosure callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  StorageCleanupHelper* deleter = new StorageCleanupHelper(
-      this, type, std::move(quota_client_types), std::move(callback));
-  deleter->Start();
-}
-
-void QuotaManager::DeleteHostData(const std::string& host,
-                                  StorageType type,
-                                  QuotaClientTypes quota_client_types,
-                                  StatusCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-
-  DCHECK(client_types_.contains(type));
-  if (host.empty() || client_types_[type].empty()) {
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
-    return;
-  }
-
-  HostDataDeleter* deleter = new HostDataDeleter(
-      this, host, type, std::move(quota_client_types), std::move(callback));
-  deleter->Start();
-}
-
-void QuotaManager::GetPersistentHostQuota(const std::string& host,
-                                          QuotaCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  if (host.empty()) {
-    // This could happen if we are called on file:///.
-    // TODO(kinuko) We may want to respect --allow-file-access-from-files
-    // command line switch.
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0);
-    return;
-  }
-
-  if (!persistent_host_quota_callbacks_.Add(host, std::move(callback)))
-    return;
-
-  int64_t* quota_ptr = new int64_t(0);
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&GetPersistentHostQuotaOnDBThread, host,
-                     base::Unretained(quota_ptr)),
-      base::BindOnce(&QuotaManager::DidGetPersistentHostQuota,
-                     weak_factory_.GetWeakPtr(), host, base::Owned(quota_ptr)));
-}
-
-void QuotaManager::SetPersistentHostQuota(const std::string& host,
-                                          int64_t new_quota,
-                                          QuotaCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  if (host.empty()) {
-    // This could happen if we are called on file:///.
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported,
-                            0);
-    return;
-  }
-
-  if (new_quota < 0) {
-    std::move(callback).Run(
-        blink::mojom::QuotaStatusCode::kErrorInvalidModification, -1);
-    return;
-  }
-
-  // Cap the requested size at the per-host quota limit.
-  new_quota = std::min(new_quota, kPerHostPersistentQuotaLimit);
-
-  if (db_disabled_) {
-    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorInvalidAccess,
-                            -1);
-    return;
-  }
-
-  int64_t* new_quota_ptr = new int64_t(new_quota);
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&SetPersistentHostQuotaOnDBThread, host,
-                     base::Unretained(new_quota_ptr)),
-      base::BindOnce(&QuotaManager::DidSetPersistentHostQuota,
-                     weak_factory_.GetWeakPtr(), host, std::move(callback),
-                     base::Owned(new_quota_ptr)));
-}
-
-void QuotaManager::GetGlobalUsage(StorageType type,
-                                  GlobalUsageCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  DCHECK(GetUsageTracker(type));
-  GetUsageTracker(type)->GetGlobalUsage(std::move(callback));
-}
-
-void QuotaManager::GetHostUsageWithBreakdown(
-    const std::string& host,
-    StorageType type,
-    UsageWithBreakdownCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  DCHECK(GetUsageTracker(type));
-  GetUsageTracker(type)->GetHostUsageWithBreakdown(host, std::move(callback));
-}
-
-std::map<std::string, std::string> QuotaManager::GetStatistics() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::map<std::string, std::string> statistics;
-  if (temporary_storage_evictor_) {
-    std::map<std::string, int64_t> stats;
-    temporary_storage_evictor_->GetStatistics(&stats);
-    for (const auto& origin_usage_pair : stats) {
-      statistics[origin_usage_pair.first] =
-          base::NumberToString(origin_usage_pair.second);
-    }
-  }
-  return statistics;
-}
-
-bool QuotaManager::IsStorageUnlimited(const url::Origin& origin,
-                                      StorageType type) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // For syncable storage we should always enforce quota (since the
-  // quota must be capped by the server limit).
-  if (type == StorageType::kSyncable)
-    return false;
-  if (type == StorageType::kQuotaNotManaged)
-    return true;
-  return special_storage_policy_.get() &&
-         special_storage_policy_->IsStorageUnlimited(origin.GetURL());
-}
-
-void QuotaManager::GetOriginsModifiedBetween(StorageType type,
-                                             base::Time begin,
-                                             base::Time end,
-                                             GetOriginsCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  GetModifiedSinceHelper* helper = new GetModifiedSinceHelper;
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&GetModifiedSinceHelper::GetModifiedBetweenOnDBThread,
-                     base::Unretained(helper), type, begin, end),
-      base::BindOnce(&GetModifiedSinceHelper::DidGetModifiedBetween,
-                     base::Owned(helper), weak_factory_.GetWeakPtr(),
-                     std::move(callback), type));
-}
-
-bool QuotaManager::ResetUsageTracker(StorageType type) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(GetUsageTracker(type));
-  if (GetUsageTracker(type)->IsWorking())
-    return false;
-
-  auto usage_tracker = std::make_unique<UsageTracker>(
-      client_types_[type], type, special_storage_policy_.get());
-  switch (type) {
-    case StorageType::kTemporary:
-      temporary_usage_tracker_ = std::move(usage_tracker);
-      return true;
-    case StorageType::kPersistent:
-      persistent_usage_tracker_ = std::move(usage_tracker);
-      return true;
-    case StorageType::kSyncable:
-      syncable_usage_tracker_ = std::move(usage_tracker);
-      return true;
-    default:
-      NOTREACHED();
-  }
-  return true;
-}
-
-QuotaManager::~QuotaManager() {
-  proxy_->InvalidateQuotaManager(base::PassKey<QuotaManager>());
-
-  // Iterating over `legacy_clients_for_ownership_` is correct here because we
-  // want to call OnQuotaManagerDestroyed() once per QuotaClient.
-  for (const auto& client : legacy_clients_for_ownership_)
-    client->OnQuotaManagerDestroyed();
-
-  if (database_)
-    db_runner_->DeleteSoon(FROM_HERE, database_.release());
-}
-
-QuotaManager::EvictionContext::EvictionContext()
-    : evicted_type(StorageType::kUnknown) {}
-
-QuotaManager::EvictionContext::~EvictionContext() = default;
-
-void QuotaManager::LazyInitialize() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-  if (database_) {
-    // Already initialized.
-    return;
-  }
-
-  // Use an empty path to open an in-memory only database for incognito.
-  database_ = std::make_unique<QuotaDatabase>(
-      is_incognito_ ? base::FilePath()
-                    : profile_path_.AppendASCII(kDatabaseName));
-
-  temporary_usage_tracker_ = std::make_unique<UsageTracker>(
-      client_types_[StorageType::kTemporary], StorageType::kTemporary,
-      special_storage_policy_.get());
-  persistent_usage_tracker_ = std::make_unique<UsageTracker>(
-      client_types_[StorageType::kPersistent], StorageType::kPersistent,
-      special_storage_policy_.get());
-  syncable_usage_tracker_ = std::make_unique<UsageTracker>(
-      client_types_[StorageType::kSyncable], StorageType::kSyncable,
-      special_storage_policy_.get());
-
-  if (!is_incognito_) {
-    histogram_timer_.Start(
-        FROM_HERE, base::TimeDelta::FromMilliseconds(kReportHistogramInterval),
-        this, &QuotaManager::ReportHistogram);
-  }
-
-  base::PostTaskAndReplyWithResult(
-      db_runner_.get(), FROM_HERE,
-      base::BindOnce(&QuotaDatabase::IsOriginDatabaseBootstrapped,
-                     base::Unretained(database_.get())),
-      base::BindOnce(&QuotaManager::FinishLazyInitialize,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::FinishLazyInitialize(bool is_database_bootstrapped) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_database_bootstrapped_ = is_database_bootstrapped;
-  StartEviction();
-}
-
-void QuotaManager::BootstrapDatabaseForEviction(
-    GetOriginCallback did_get_origin_callback,
-    int64_t usage,
-    int64_t unlimited_usage) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // The usage cache should be fully populated now so we can
-  // seed the database with origins we know about.
-  std::set<url::Origin> origins = temporary_usage_tracker_->GetCachedOrigins();
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&BootstrapDatabaseOnDBThread, std::move(origins)),
-      base::BindOnce(&QuotaManager::DidBootstrapDatabase,
-                     weak_factory_.GetWeakPtr(),
-                     std::move(did_get_origin_callback)));
-}
-
-void QuotaManager::DidBootstrapDatabase(
-    GetOriginCallback did_get_origin_callback,
-    bool success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  is_database_bootstrapped_ = success;
-  DidDatabaseWork(success);
-  GetLRUOrigin(StorageType::kTemporary, std::move(did_get_origin_callback));
-}
-
-void QuotaManager::RegisterClient(
-    mojo::PendingRemote<mojom::QuotaClient> client,
-    QuotaClientType client_type,
-    const std::vector<blink::mojom::StorageType>& storage_types) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!database_.get())
-      << "All clients must be registered before the database is initialized";
-
-  clients_for_ownership_.emplace_back(std::move(client));
-  mojom::QuotaClient* client_ptr = clients_for_ownership_.back().get();
-
-  // TODO(crbug.com/1163009): Remove this block after all QuotaClients have been
-  //                          mojofied.
-  legacy_clients_for_ownership_.push_back(
-      base::MakeRefCounted<MojoQuotaClientWrapper>(client_ptr));
-  QuotaClient* legacy_client_ptr = legacy_clients_for_ownership_.back().get();
-
-  // TODO(crbug.com/1163009): Use client_ptr instead of legacy_client_ptr after
-  //                          all QuotaClients have been mojofied.
-  for (blink::mojom::StorageType storage_type : storage_types)
-    client_types_[storage_type].insert({legacy_client_ptr, client_type});
-}
-
-void QuotaManager::RegisterLegacyClient(
-    scoped_refptr<QuotaClient> client,
-    QuotaClientType client_type,
-    const std::vector<blink::mojom::StorageType>& storage_types) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!database_.get())
-      << "All clients must be registered before the database is initialized";
-  DCHECK(client.get());
-
-  for (blink::mojom::StorageType storage_type : storage_types)
-    client_types_[storage_type].insert({client.get(), client_type});
-  legacy_clients_for_ownership_.push_back(std::move(client));
-}
-
-UsageTracker* QuotaManager::GetUsageTracker(StorageType type) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  switch (type) {
-    case StorageType::kTemporary:
-      return temporary_usage_tracker_.get();
-    case StorageType::kPersistent:
-      return persistent_usage_tracker_.get();
-    case StorageType::kSyncable:
-      return syncable_usage_tracker_.get();
-    case StorageType::kQuotaNotManaged:
-      return nullptr;
-    case StorageType::kUnknown:
-      NOTREACHED();
-  }
-  return nullptr;
-}
-
-std::set<url::Origin> QuotaManager::GetCachedOrigins(StorageType type) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  DCHECK(GetUsageTracker(type));
-  return GetUsageTracker(type)->GetCachedOrigins();
-}
-
-void QuotaManager::NotifyStorageAccessed(const url::Origin& origin,
-                                         StorageType type,
-                                         base::Time access_time) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  if (type == StorageType::kTemporary && is_getting_eviction_origin_) {
-    // Record the accessed origins while GetLRUOrigin task is runing
-    // to filter out them from eviction.
-    access_notified_origins_.insert(origin);
-  }
-
-  if (db_disabled_)
-    return;
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&UpdateAccessTimeOnDBThread, origin, type, access_time),
-      base::BindOnce(&QuotaManager::DidDatabaseWork,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::NotifyStorageModified(QuotaClientType client_id,
-                                         const url::Origin& origin,
-                                         StorageType type,
-                                         int64_t delta,
-                                         base::Time modification_time) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  DCHECK(GetUsageTracker(type));
-  GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta);
-
-  if (db_disabled_)
-    return;
-
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&UpdateModifiedTimeOnDBThread, origin, type,
-                     modification_time),
-      base::BindOnce(&QuotaManager::DidDatabaseWork,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::DumpQuotaTable(DumpQuotaTableCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DumpQuotaTableHelper* helper = new DumpQuotaTableHelper;
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&DumpQuotaTableHelper::DumpQuotaTableOnDBThread,
-                     base::Unretained(helper)),
-      base::BindOnce(&DumpQuotaTableHelper::DidDumpQuotaTable,
-                     base::Owned(helper), weak_factory_.GetWeakPtr(),
-                     std::move(callback)));
-}
-
-void QuotaManager::DumpOriginInfoTable(DumpOriginInfoTableCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DumpOriginInfoTableHelper* helper = new DumpOriginInfoTableHelper;
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&DumpOriginInfoTableHelper::DumpOriginInfoTableOnDBThread,
-                     base::Unretained(helper)),
-      base::BindOnce(&DumpOriginInfoTableHelper::DidDumpOriginInfoTable,
-                     base::Owned(helper), weak_factory_.GetWeakPtr(),
-                     std::move(callback)));
-}
-
-void QuotaManager::StartEviction() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!temporary_storage_evictor_.get());
-  if (eviction_disabled_)
-    return;
-  temporary_storage_evictor_ = std::make_unique<QuotaTemporaryStorageEvictor>(
-      this, kEvictionIntervalInMilliSeconds);
-  temporary_storage_evictor_->Start();
-}
-
-void QuotaManager::DeleteOriginFromDatabase(const url::Origin& origin,
-                                            StorageType type,
-                                            bool is_eviction) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  if (db_disabled_)
-    return;
-
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&DeleteOriginInfoOnDBThread, origin, type, is_eviction),
-      base::BindOnce(&QuotaManager::DidDatabaseWork,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::DidOriginDataEvicted(blink::mojom::QuotaStatusCode status) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-
-  // We only try evict origins that are not in use, so basically
-  // deletion attempt for eviction should not fail.  Let's record
-  // the origin if we get error and exclude it from future eviction
-  // if the error happens consistently (> kThresholdOfErrorsToBeDenylisted).
-  if (status != blink::mojom::QuotaStatusCode::kOk)
-    origins_in_error_[eviction_context_.evicted_origin]++;
-
-  std::move(eviction_context_.evict_origin_data_callback).Run(status);
-}
-
-void QuotaManager::DeleteOriginDataInternal(const url::Origin& origin,
-                                            StorageType type,
-                                            QuotaClientTypes quota_client_types,
-                                            bool is_eviction,
-                                            StatusCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-
-  OriginDataDeleter* deleter =
-      new OriginDataDeleter(this, origin, type, std::move(quota_client_types),
-                            is_eviction, std::move(callback));
-  deleter->Start();
-}
-
-void QuotaManager::MaybeRunStoragePressureCallback(const url::Origin& origin,
-                                                   int64_t total_space,
-                                                   int64_t available_space) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(https://crbug.com/1059560): Figure out what 0 total_space means
-  // and how to handle the storage pressure callback in these cases.
-  if (total_space == 0)
-    return;
-
-  if (!storage_pressure_callback_) {
-    // Quota will hold onto a storage pressure notification if no storage
-    // pressure callback is set.
-    origin_for_pending_storage_pressure_callback_ = std::move(origin);
-    return;
-  }
-
-  if (available_space < kStoragePressureThresholdRatio * total_space) {
-    storage_pressure_callback_.Run(std::move(origin));
-  }
-}
-
-void QuotaManager::SimulateStoragePressure(const url::Origin origin) {
-  storage_pressure_callback_.Run(origin);
-}
-
-void QuotaManager::DetermineStoragePressure(int64_t total_space,
-                                            int64_t free_space) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!base::FeatureList::IsEnabled(features::kStoragePressureEvent)) {
-    return;
-  }
-  int64_t threshold_bytes =
-      RandomizeByPercent(kGBytes, kThresholdRandomizationPercent);
-  int64_t threshold = RandomizeByPercent(
-      static_cast<int64_t>(total_space *
-                           (kThresholdRandomizationPercent / 100.0)),
-      kThresholdRandomizationPercent);
-  threshold = std::min(threshold_bytes, threshold);
-  if (free_space < threshold && !quota_change_callback_.is_null()) {
-    quota_change_callback_.Run();
-  }
-}
-
-void QuotaManager::SetStoragePressureCallback(
-    base::RepeatingCallback<void(url::Origin)> storage_pressure_callback) {
-  storage_pressure_callback_ = storage_pressure_callback;
-  if (origin_for_pending_storage_pressure_callback_.has_value()) {
-    storage_pressure_callback_.Run(
-        std::move(origin_for_pending_storage_pressure_callback_.value()));
-    origin_for_pending_storage_pressure_callback_ = base::nullopt;
-  }
-}
-
-int QuotaManager::GetOverrideHandleId() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return ++next_override_handle_id_;
-}
-
-void QuotaManager::OverrideQuotaForOrigin(int handle_id,
-                                          const url::Origin& origin,
-                                          base::Optional<int64_t> quota_size) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (quota_size.has_value()) {
-    DCHECK_GE(next_override_handle_id_, handle_id);
-    // Bracket notation is safe here because we want to construct a new
-    // QuotaOverride in the case that one does not exist for origin.
-    devtools_overrides_[origin].active_override_session_ids.insert(handle_id);
-    devtools_overrides_[origin].quota_size = quota_size.value();
-  } else {
-    devtools_overrides_.erase(origin);
-  }
-}
-
-void QuotaManager::WithdrawOverridesForHandle(int handle_id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::vector<url::Origin> origins_to_clear;
-  for (auto& devtools_override : devtools_overrides_) {
-    auto& quota_override = devtools_override.second;
-    auto& origin = devtools_override.first;
-
-    quota_override.active_override_session_ids.erase(handle_id);
-
-    if (!quota_override.active_override_session_ids.size()) {
-      origins_to_clear.push_back(origin);
-    }
-  }
-
-  for (auto& origin : origins_to_clear) {
-    devtools_overrides_.erase(origin);
-  }
-}
-
-base::Optional<int64_t> QuotaManager::GetQuotaOverrideForOrigin(
-    const url::Origin& origin) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!base::Contains(devtools_overrides_, origin)) {
-    return base::nullopt;
-  }
-  return devtools_overrides_[origin].quota_size;
-}
-
-void QuotaManager::SetQuotaChangeCallbackForTesting(
-    base::RepeatingClosure storage_pressure_event_callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  quota_change_callback_ = std::move(storage_pressure_event_callback);
-}
-
-void QuotaManager::ReportHistogram() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(!is_incognito_);
-  GetGlobalUsage(
-      StorageType::kTemporary,
-      base::BindOnce(&QuotaManager::DidGetTemporaryGlobalUsageForHistogram,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::DidGetTemporaryGlobalUsageForHistogram(
-    int64_t usage,
-    int64_t unlimited_usage) {
-  GetStorageCapacity(
-      base::BindOnce(&QuotaManager::DidGetStorageCapacityForHistogram,
-                     weak_factory_.GetWeakPtr(), usage));
-}
-
-void QuotaManager::DidGetStorageCapacityForHistogram(int64_t usage,
-                                                     int64_t total_space,
-                                                     int64_t available_space) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage);
-  if (total_space > 0) {
-    UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedForTemporaryStorage2",
-                             static_cast<int>((usage * 100) / total_space));
-    UMA_HISTOGRAM_MBYTES("Quota.AvailableDiskSpace2", available_space);
-    UMA_HISTOGRAM_PERCENTAGE(
-        "Quota.PercentDiskAvailable2",
-        std::min(100, static_cast<int>((available_space * 100 / total_space))));
-  }
-
-  GetGlobalUsage(
-      StorageType::kPersistent,
-      base::BindOnce(&QuotaManager::DidGetPersistentGlobalUsageForHistogram,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::DidGetPersistentGlobalUsageForHistogram(
-    int64_t usage,
-    int64_t unlimited_usage) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfPersistentStorage", usage);
-
-  // We DumpOriginInfoTable last to ensure the trackers caches are loaded.
-  DumpOriginInfoTable(
-      base::BindOnce(&QuotaManager::DidDumpOriginInfoTableForHistogram,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::DidDumpOriginInfoTableForHistogram(
-    const OriginInfoTableEntries& entries) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::map<url::Origin, int64_t> usage_map =
-      GetUsageTracker(StorageType::kTemporary)->GetCachedOriginsUsage();
-  base::Time now = base::Time::Now();
-  for (const auto& info : entries) {
-    if (info.type != StorageType::kTemporary)
-      continue;
-
-    // Ignore stale database entries. If there is no map entry, the origin's
-    // data has been deleted.
-    auto it = usage_map.find(info.origin);
-    if (it == usage_map.end() || it->second == 0)
-      continue;
-
-    base::TimeDelta age = now - std::max(info.last_access_time,
-                                         info.last_modified_time);
-    UMA_HISTOGRAM_COUNTS_1000("Quota.AgeOfOriginInDays", age.InDays());
-
-    int64_t kilobytes = std::max(it->second / INT64_C(1024), INT64_C(1));
-    base::Histogram::FactoryGet(
-        "Quota.AgeOfDataInDays", 1, 1000, 50,
-        base::HistogramBase::kUmaTargetedHistogramFlag)->
-            AddCount(age.InDays(),
-                     base::saturated_cast<int>(kilobytes));
-  }
-}
-
-std::set<url::Origin> QuotaManager::GetEvictionOriginExceptions() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::set<url::Origin> exceptions;
-  for (const auto& p : origins_in_use_) {
-    if (p.second > 0)
-      exceptions.insert(p.first);
-  }
-
-  for (const auto& p : origins_in_error_) {
-    if (p.second > QuotaManager::kThresholdOfErrorsToBeDenylisted)
-      exceptions.insert(p.first);
-  }
-
-  return exceptions;
-}
-
-void QuotaManager::DidGetEvictionOrigin(
-    GetOriginCallback callback,
-    const base::Optional<url::Origin>& origin) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // Make sure the returned origin is (still) not in the origin_in_use_ set
-  // and has not been accessed since we posted the task.
-  DCHECK(!origin.has_value() || !origin->GetURL().is_empty());
-  if (origin.has_value() &&
-      (base::Contains(origins_in_use_, *origin) ||
-       base::Contains(access_notified_origins_, *origin))) {
-    std::move(callback).Run(base::nullopt);
-  } else {
-    std::move(callback).Run(origin);
-  }
-  access_notified_origins_.clear();
-
-  is_getting_eviction_origin_ = false;
-}
-
-void QuotaManager::GetEvictionOrigin(
-    StorageType type,
-    int64_t global_quota,
-    GetOriginCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  // This must not be called while there's an in-flight task.
-  DCHECK(!is_getting_eviction_origin_);
-  is_getting_eviction_origin_ = true;
-
-  auto did_get_origin_callback =
-      base::BindOnce(&QuotaManager::DidGetEvictionOrigin,
-                     weak_factory_.GetWeakPtr(), std::move(callback));
-
-  if (!is_database_bootstrapped_ && !eviction_disabled_) {
-    // Once bootstrapped, GetLRUOrigin will be called.
-    GetGlobalUsage(StorageType::kTemporary,
-                   base::BindOnce(&QuotaManager::BootstrapDatabaseForEviction,
-                                  weak_factory_.GetWeakPtr(),
-                                  std::move(did_get_origin_callback)));
-    return;
-  }
-
-  GetLRUOrigin(type, std::move(did_get_origin_callback));
-}
-
-void QuotaManager::EvictOriginData(const url::Origin& origin,
-                                   StorageType type,
-                                   StatusCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-  DCHECK_EQ(type, StorageType::kTemporary);
-
-  eviction_context_.evicted_origin = origin;
-  eviction_context_.evicted_type = type;
-  eviction_context_.evict_origin_data_callback = std::move(callback);
-
-  DeleteOriginDataInternal(origin, type, AllQuotaClientTypes(), true,
-                           base::BindOnce(&QuotaManager::DidOriginDataEvicted,
-                                          weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::GetEvictionRoundInfo(EvictionRoundInfoCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(io_thread_->BelongsToCurrentThread());
-  LazyInitialize();
-  EvictionRoundInfoHelper* helper =
-      new EvictionRoundInfoHelper(this, std::move(callback));
-  helper->Start();
-}
-
-void QuotaManager::GetLRUOrigin(StorageType type, GetOriginCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  LazyInitialize();
-  // This must not be called while there's an in-flight task.
-  DCHECK(lru_origin_callback_.is_null());
-  lru_origin_callback_ = std::move(callback);
-  if (db_disabled_) {
-    std::move(lru_origin_callback_).Run(base::nullopt);
-    return;
-  }
-
-  auto origin = std::make_unique<base::Optional<url::Origin>>();
-  auto* origin_ptr = origin.get();
-  PostTaskAndReplyWithResultForDBThread(
-      FROM_HERE,
-      base::BindOnce(&GetLRUOriginOnDBThread, type,
-                     GetEvictionOriginExceptions(),
-                     base::RetainedRef(special_storage_policy_),
-                     base::Unretained(origin_ptr)),
-      base::BindOnce(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(),
-                     std::move(origin)));
-}
-
-void QuotaManager::DidGetPersistentHostQuota(const std::string& host,
-                                             const int64_t* quota,
-                                             bool success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DidDatabaseWork(success);
-  persistent_host_quota_callbacks_.Run(
-      host, blink::mojom::QuotaStatusCode::kOk,
-      std::min(*quota, kPerHostPersistentQuotaLimit));
-}
-
-void QuotaManager::DidSetPersistentHostQuota(const std::string& host,
-                                             QuotaCallback callback,
-                                             const int64_t* new_quota,
-                                             bool success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DidDatabaseWork(success);
-  std::move(callback).Run(
-      success ? blink::mojom::QuotaStatusCode::kOk
-              : blink::mojom::QuotaStatusCode::kErrorInvalidAccess,
-      *new_quota);
-}
-
-void QuotaManager::DidGetLRUOrigin(
-    std::unique_ptr<base::Optional<url::Origin>> origin,
-    bool success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DidDatabaseWork(success);
-
-  std::move(lru_origin_callback_).Run(*origin);
-}
-
-namespace {
-void DidGetSettingsThreadAdapter(base::TaskRunner* task_runner,
-                                 OptionalQuotaSettingsCallback callback,
-                                 base::Optional<QuotaSettings> settings) {
-  task_runner->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), std::move(settings)));
-}
-}  // namespace
-
-void QuotaManager::GetQuotaSettings(QuotaSettingsCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (base::TimeTicks::Now() - settings_timestamp_ <
-      settings_.refresh_interval) {
-    std::move(callback).Run(settings_);
-    return;
-  }
-
-  if (!settings_callbacks_.Add(std::move(callback)))
-    return;
-
-  // We invoke our clients GetQuotaSettingsFunc on the
-  // UI thread and plumb the resulting value back to this thread.
-  get_settings_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(
-          get_settings_function_,
-          base::BindOnce(&DidGetSettingsThreadAdapter,
-                         base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
-                         base::BindOnce(&QuotaManager::DidGetSettings,
-                                        weak_factory_.GetWeakPtr()))));
-}
-
-void QuotaManager::DidGetSettings(base::Optional<QuotaSettings> settings) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!settings) {
-    settings = settings_;
-    settings->refresh_interval = base::TimeDelta::FromMinutes(1);
-  }
-  SetQuotaSettings(*settings);
-  settings_callbacks_.Run(*settings);
-  UMA_HISTOGRAM_MBYTES("Quota.GlobalTemporaryPoolSize", settings->pool_size);
-  LOG_IF(WARNING, settings->pool_size == 0)
-      << "No storage quota provided in QuotaSettings.";
-}
-
-void QuotaManager::GetStorageCapacity(StorageCapacityCallback callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!storage_capacity_callbacks_.Add(std::move(callback)))
-    return;
-  if (is_incognito_) {
-    GetQuotaSettings(
-        base::BindOnce(&QuotaManager::ContinueIncognitoGetStorageCapacity,
-                       weak_factory_.GetWeakPtr()));
-    return;
-  }
-  base::PostTaskAndReplyWithResult(
-      db_runner_.get(), FROM_HERE,
-      base::BindOnce(&QuotaManager::CallGetVolumeInfo, get_volume_info_fn_,
-                     profile_path_),
-      base::BindOnce(&QuotaManager::DidGetStorageCapacity,
-                     weak_factory_.GetWeakPtr()));
-}
-
-void QuotaManager::ContinueIncognitoGetStorageCapacity(
-    const QuotaSettings& settings) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  int64_t current_usage =
-      GetUsageTracker(StorageType::kTemporary)->GetCachedUsage();
-  current_usage += GetUsageTracker(StorageType::kPersistent)->GetCachedUsage();
-  int64_t available_space =
-      std::max(INT64_C(0), settings.pool_size - current_usage);
-  DidGetStorageCapacity(std::make_tuple(settings.pool_size, available_space));
-}
-
-void QuotaManager::DidGetStorageCapacity(
-    const std::tuple<int64_t, int64_t>& total_and_available) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  int64_t total_space = std::get<0>(total_and_available);
-  int64_t available_space = std::get<1>(total_and_available);
-  cached_disk_stats_for_storage_pressure_ =
-      std::make_tuple(base::TimeTicks::Now(), total_space, available_space);
-  storage_capacity_callbacks_.Run(total_space, available_space);
-  DetermineStoragePressure(total_space, available_space);
-}
-
-void QuotaManager::DidDatabaseWork(bool success) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  db_disabled_ = !success;
-}
-
-void QuotaManager::PostTaskAndReplyWithResultForDBThread(
-    const base::Location& from_here,
-    base::OnceCallback<bool(QuotaDatabase*)> task,
-    base::OnceCallback<void(bool)> reply) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // Deleting manager will post another task to DB sequence to delete
-  // |database_|, therefore we can be sure that database_ is alive when this
-  // task runs.
-  base::PostTaskAndReplyWithResult(
-      db_runner_.get(), from_here,
-      base::BindOnce(std::move(task), base::Unretained(database_.get())),
-      std::move(reply));
-}
-
-// static
-std::tuple<int64_t, int64_t> QuotaManager::CallGetVolumeInfo(
-    GetVolumeInfoFn get_volume_info_fn,
-    const base::FilePath& path) {
-  if (!base::CreateDirectory(path)) {
-    LOG(WARNING) << "Create directory failed for path" << path.value();
-    return std::make_tuple<int64_t, int64_t>(0, 0);
-  }
-  int64_t total;
-  int64_t available;
-  std::tie(total, available) = get_volume_info_fn(path);
-  if (total < 0 || available < 0) {
-    LOG(WARNING) << "Unable to get volume info: " << path.value();
-    return std::make_tuple<int64_t, int64_t>(0, 0);
-  }
-  UMA_HISTOGRAM_MBYTES("Quota.TotalDiskSpace", total);
-  UMA_HISTOGRAM_MBYTES("Quota.AvailableDiskSpace", available);
-  if (total > 0) {
-    UMA_HISTOGRAM_PERCENTAGE("Quota.PercentDiskAvailable",
-        std::min(100, static_cast<int>((available * 100) / total)));
-  }
-  return std::make_tuple(total, available);
-}
-
-// static
-std::tuple<int64_t, int64_t> QuotaManager::GetVolumeInfo(
-    const base::FilePath& path) {
-  return std::make_tuple(base::SysInfo::AmountOfTotalDiskSpace(path),
-                         base::SysInfo::AmountOfFreeDiskSpace(path));
-}
-
-}  // namespace storage
diff --git a/storage/browser/quota/quota_manager.h b/storage/browser/quota/quota_manager.h
index 3276a81..dc5f209 100644
--- a/storage/browser/quota/quota_manager.h
+++ b/storage/browser/quota/quota_manager.h
@@ -1,611 +1,10 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_H_
 #define STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_H_
 
-#include <stdint.h>
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/component_export.h"
-#include "base/containers/contains.h"
-#include "base/containers/flat_set.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/ref_counted_delete_on_sequence.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/sequence_checker.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "components/services/storage/public/mojom/quota_client.mojom.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "storage/browser/quota/quota_callbacks.h"
-#include "storage/browser/quota/quota_client.h"
-#include "storage/browser/quota/quota_client_type.h"
-#include "storage/browser/quota/quota_database.h"
-#include "storage/browser/quota/quota_settings.h"
-#include "storage/browser/quota/quota_task.h"
-#include "storage/browser/quota/special_storage_policy.h"
-#include "third_party/blink/public/mojom/quota/quota_types.mojom-forward.h"
-#include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
-#include "url/origin.h"
-
-namespace base {
-class SequencedTaskRunner;
-class SingleThreadTaskRunner;
-class TaskRunner;
-}  // namespace base
-
-namespace quota_internals {
-class QuotaInternalsProxy;
-}  // namespace quota_internals
-
-namespace storage {
-
-class QuotaManagerProxy;
-class QuotaOverrideHandle;
-class QuotaTemporaryStorageEvictor;
-class UsageTracker;
-
-// An interface called by QuotaTemporaryStorageEvictor. This is a grab bag of
-// methods called by QuotaTemporaryStorageEvictor that need to be stubbed for
-// testing.
-class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaEvictionHandler {
- public:
-  using EvictionRoundInfoCallback =
-      base::OnceCallback<void(blink::mojom::QuotaStatusCode status,
-                              const QuotaSettings& settings,
-                              int64_t available_space,
-                              int64_t total_space,
-                              int64_t global_usage,
-                              bool global_usage_is_complete)>;
-
-  // Called at the beginning of an eviction round to gather the info about
-  // the current settings, capacity, and usage.
-  virtual void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) = 0;
-
-  // Returns next origin to evict, or nullopt if there are no evictable
-  // origins.
-  virtual void GetEvictionOrigin(blink::mojom::StorageType type,
-                                 int64_t global_quota,
-                                 GetOriginCallback callback) = 0;
-
-  // Called to evict an origin.
-  virtual void EvictOriginData(const url::Origin& origin,
-                               blink::mojom::StorageType type,
-                               StatusCallback callback) = 0;
-
- protected:
-  virtual ~QuotaEvictionHandler() = default;
-};
-
-struct UsageInfo {
-  UsageInfo(std::string host, blink::mojom::StorageType type, int64_t usage)
-      : host(std::move(host)), type(type), usage(usage) {}
-  const std::string host;
-  const blink::mojom::StorageType type;
-  const int64_t usage;
-};
-
-// Entry point into the Quota System
-//
-// Each StoragePartition has exactly one QuotaManager instance, which
-// coordinates quota across the Web platform features subject to quota.
-// Each storage system interacts with quota via their own implementations of
-// the QuotaClient interface.
-//
-// The class sets limits and defines the parameters of the systems heuristics.
-// QuotaManager coordinates clients to orchestrate the collection of usage
-// information, enforce quota limits, and evict stale data.
-//
-// The constructor and proxy() methods can be called on any thread. All other
-// methods must be called on the IO thread.
-class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaManager
-    : public QuotaTaskObserver,
-      public QuotaEvictionHandler,
-      public base::RefCountedDeleteOnSequence<QuotaManager> {
- public:
-  using UsageAndQuotaCallback = base::OnceCallback<
-      void(blink::mojom::QuotaStatusCode, int64_t usage, int64_t quota)>;
-
-  using UsageAndQuotaWithBreakdownCallback =
-      base::OnceCallback<void(blink::mojom::QuotaStatusCode,
-                              int64_t usage,
-                              int64_t quota,
-                              blink::mojom::UsageBreakdownPtr usage_breakdown)>;
-
-  using UsageAndQuotaForDevtoolsCallback =
-      base::OnceCallback<void(blink::mojom::QuotaStatusCode,
-                              int64_t usage,
-                              int64_t quota,
-                              bool is_override_enabled,
-                              blink::mojom::UsageBreakdownPtr usage_breakdown)>;
-
-  // Function pointer type used to store the function which returns
-  // information about the volume containing the given FilePath.
-  // The value returned is std::tuple<total_space, available_space>.
-  using GetVolumeInfoFn =
-      std::tuple<int64_t, int64_t> (*)(const base::FilePath&);
-
-  static constexpr int64_t kGBytes = 1024 * 1024 * 1024;
-  static constexpr int64_t kNoLimit = INT64_MAX;
-  static constexpr int64_t kMBytes = 1024 * 1024;
-  static constexpr int kMinutesInMilliSeconds = 60 * 1000;
-
-  QuotaManager(bool is_incognito,
-               const base::FilePath& profile_path,
-               scoped_refptr<base::SingleThreadTaskRunner> io_thread,
-               base::RepeatingClosure quota_change_callback,
-               scoped_refptr<SpecialStoragePolicy> special_storage_policy,
-               const GetQuotaSettingsFunc& get_settings_function);
-  QuotaManager(const QuotaManager&) = delete;
-  QuotaManager& operator=(const QuotaManager&) = delete;
-
-  const QuotaSettings& settings() const { return settings_; }
-  void SetQuotaSettings(const QuotaSettings& settings);
-
-  // Returns a proxy object that can be used on any thread.
-  QuotaManagerProxy* proxy() { return proxy_.get(); }
-
-  // Called by clients or webapps. Returns usage per host.
-  void GetUsageInfo(GetUsageInfoCallback callback);
-
-  // Called by Web Apps (deprecated quota API).
-  // This method is declared as virtual to allow test code to override it.
-  virtual void GetUsageAndQuotaForWebApps(const url::Origin& origin,
-                                          blink::mojom::StorageType type,
-                                          UsageAndQuotaCallback callback);
-
-  // Called by Web Apps (navigator.storage.estimate())
-  // This method is declared as virtual to allow test code to override it.
-  virtual void GetUsageAndQuotaWithBreakdown(
-      const url::Origin& origin,
-      blink::mojom::StorageType type,
-      UsageAndQuotaWithBreakdownCallback callback);
-
-  // Called by DevTools.
-  virtual void GetUsageAndQuotaForDevtools(
-      const url::Origin& origin,
-      blink::mojom::StorageType type,
-      UsageAndQuotaForDevtoolsCallback callback);
-
-  // Called by storage backends.
-  //
-  // For UnlimitedStorage origins, this version skips usage and quota handling
-  // to avoid extra query cost. Do not call this method for apps/user-facing
-  // code.
-  //
-  // This method is declared as virtual to allow test code to override it.
-  virtual void GetUsageAndQuota(const url::Origin& origin,
-                                blink::mojom::StorageType type,
-                                UsageAndQuotaCallback callback);
-
-  // Called by storage backends via proxy.
-  //
-  // Quota-managed storage backends should call this method when storage is
-  // accessed. Used to maintain LRU ordering.
-  void NotifyStorageAccessed(const url::Origin& origin,
-                             blink::mojom::StorageType type,
-                             base::Time access_time);
-
-  // Called by storage backends via proxy.
-  //
-  // Quota-managed storage backends must call this method when they have made
-  // any modifications that change the amount of data stored in their storage.
-  void NotifyStorageModified(QuotaClientType client_id,
-                             const url::Origin& origin,
-                             blink::mojom::StorageType type,
-                             int64_t delta,
-                             base::Time modification_time);
-
-  // Called by storage backends via proxy.
-  //
-  // Client storage must call this method whenever they run into disk
-  // write errors. Used as a hint to determine if the storage partition is out
-  // of space, and trigger actions if deemed appropriate.
-  //
-  // This method is declared as virtual to allow test code to override it.
-  virtual void NotifyWriteFailed(const url::Origin& origin);
-
-  // Used to avoid evicting origins with open pages.
-  // A call to NotifyOriginInUse must be balanced by a later call
-  // to NotifyOriginNoLongerInUse.
-  void NotifyOriginInUse(const url::Origin& origin);
-  void NotifyOriginNoLongerInUse(const url::Origin& origin);
-  bool IsOriginInUse(const url::Origin& origin) const {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    return base::Contains(origins_in_use_, origin);
-  }
-
-  void SetUsageCacheEnabled(QuotaClientType client_id,
-                            const url::Origin& origin,
-                            blink::mojom::StorageType type,
-                            bool enabled);
-
-  // DeleteOriginData and DeleteHostData (surprisingly enough) delete data of a
-  // particular blink::mojom::StorageType associated with either a specific
-  // origin or set of origins. Each method additionally requires a
-  // |quota_client_types| which specifies the types of QuotaClients to delete
-  // from the origin. Pass in QuotaClientType::AllClients() to remove all
-  // clients from the origin, regardless of type.
-  virtual void DeleteOriginData(const url::Origin& origin,
-                                blink::mojom::StorageType type,
-                                QuotaClientTypes quota_client_types,
-                                StatusCallback callback);
-  void DeleteHostData(const std::string& host,
-                      blink::mojom::StorageType type,
-                      QuotaClientTypes quota_client_types,
-                      StatusCallback callback);
-
-  // Instructs each QuotaClient to remove possible traces of deleted
-  // data on the disk.
-  void PerformStorageCleanup(blink::mojom::StorageType type,
-                             QuotaClientTypes quota_client_types,
-                             base::OnceClosure callback);
-
-  // Called by UI and internal modules.
-  void GetPersistentHostQuota(const std::string& host, QuotaCallback callback);
-  void SetPersistentHostQuota(const std::string& host,
-                              int64_t new_quota,
-                              QuotaCallback callback);
-  void GetGlobalUsage(blink::mojom::StorageType type,
-                      GlobalUsageCallback callback);
-  void GetHostUsageWithBreakdown(const std::string& host,
-                                 blink::mojom::StorageType type,
-                                 UsageWithBreakdownCallback callback);
-
-  std::map<std::string, std::string> GetStatistics();
-
-  bool IsStorageUnlimited(const url::Origin& origin,
-                          blink::mojom::StorageType type) const;
-
-  virtual void GetOriginsModifiedBetween(blink::mojom::StorageType type,
-                                         base::Time begin,
-                                         base::Time end,
-                                         GetOriginsCallback callback);
-
-  bool ResetUsageTracker(blink::mojom::StorageType type);
-
-  // Called when StoragePartition is initialized if embedder has an
-  // implementation of StorageNotificationService.
-  void SetStoragePressureCallback(
-      base::RepeatingCallback<void(url::Origin)> storage_pressure_callback);
-
-  // DevTools Quota Override methods:
-  int GetOverrideHandleId();
-  void OverrideQuotaForOrigin(int handle_id,
-                              const url::Origin& origin,
-                              base::Optional<int64_t> quota_size);
-  // Called when a DevTools client releases all overrides, however, overrides
-  // will not be disabled for any origins for which there are other DevTools
-  // clients/QuotaOverrideHandle with an active override.
-  void WithdrawOverridesForHandle(int handle_id);
-
-  // Cap size for per-host persistent quota determined by the histogram.
-  // Cap size for per-host persistent quota determined by the histogram.
-  // This is a bit lax value because the histogram says nothing about per-host
-  // persistent storage usage and we determined by global persistent storage
-  // usage that is less than 10GB for almost all users.
-  static constexpr int64_t kPerHostPersistentQuotaLimit = 10 * 1024 * kMBytes;
-
-  static constexpr int kEvictionIntervalInMilliSeconds =
-      30 * kMinutesInMilliSeconds;
-  static constexpr int kThresholdOfErrorsToBeDenylisted = 3;
-  static constexpr int kThresholdRandomizationPercent = 5;
-
-  static constexpr char kDatabaseName[] = "QuotaManager";
-  static constexpr char kDaysBetweenRepeatedOriginEvictionsHistogram[] =
-      "Quota.DaysBetweenRepeatedOriginEvictions";
-  static constexpr char kEvictedOriginAccessedCountHistogram[] =
-      "Quota.EvictedOriginAccessCount";
-  static constexpr char kEvictedOriginDaysSinceAccessHistogram[] =
-      "Quota.EvictedOriginDaysSinceAccess";
-
-  // Kept non-const so that test code can change the value.
-  // TODO(kinuko): Make this a real const value and add a proper way to set
-  // the quota for syncable storage. (http://crbug.com/155488)
-  static int64_t kSyncableStorageDefaultHostQuota;
-
-  void DisableDatabaseForTesting() { db_disabled_ = true; }
-
-  void SetGetVolumeInfoFnForTesting(GetVolumeInfoFn fn) {
-    get_volume_info_fn_ = fn;
-  }
-
- protected:
-  ~QuotaManager() override;
-  void SetQuotaChangeCallbackForTesting(
-      base::RepeatingClosure storage_pressure_event_callback);
-
- private:
-  friend class base::DeleteHelper<QuotaManager>;
-  friend class base::RefCountedDeleteOnSequence<QuotaManager>;
-  friend class quota_internals::QuotaInternalsProxy;
-  friend class MockQuotaManager;
-  friend class MockQuotaClient;
-  friend class QuotaManagerProxy;
-  friend class QuotaManagerTest;
-  friend class QuotaTemporaryStorageEvictor;
-
-  class EvictionRoundInfoHelper;
-  class UsageAndQuotaInfoGatherer;
-  class GetUsageInfoTask;
-  class OriginDataDeleter;
-  class HostDataDeleter;
-  class GetModifiedSinceHelper;
-  class DumpQuotaTableHelper;
-  class DumpOriginInfoTableHelper;
-  class StorageCleanupHelper;
-
-  struct QuotaOverride {
-    QuotaOverride();
-    ~QuotaOverride();
-
-    QuotaOverride(const QuotaOverride& quota_override) = delete;
-    QuotaOverride& operator=(const QuotaOverride&) = delete;
-
-    int64_t quota_size;
-
-    // Keeps track of the DevTools clients that have an active override.
-    std::set<int> active_override_session_ids;
-  };
-
-  using QuotaTableEntry = QuotaDatabase::QuotaTableEntry;
-  using OriginInfoTableEntry = QuotaDatabase::OriginInfoTableEntry;
-  using QuotaTableEntries = std::vector<QuotaTableEntry>;
-  using OriginInfoTableEntries = std::vector<OriginInfoTableEntry>;
-
-  using QuotaSettingsCallback = base::OnceCallback<void(const QuotaSettings&)>;
-
-  using DumpQuotaTableCallback =
-      base::OnceCallback<void(const QuotaTableEntries&)>;
-  using DumpOriginInfoTableCallback =
-      base::OnceCallback<void(const OriginInfoTableEntries&)>;
-
-  // The values returned total_space, available_space.
-  using StorageCapacityCallback = base::OnceCallback<void(int64_t, int64_t)>;
-
-  struct EvictionContext {
-    EvictionContext();
-    ~EvictionContext();
-    url::Origin evicted_origin;
-    blink::mojom::StorageType evicted_type;
-    StatusCallback evict_origin_data_callback;
-  };
-
-  // Lazily called on the IO thread when the first quota manager API is called.
-  //
-  // Initialize() must be called after all quota clients are added to the
-  // manager by RegisterClient().
-  void LazyInitialize();
-  void FinishLazyInitialize(bool is_database_bootstraped);
-  void BootstrapDatabaseForEviction(GetOriginCallback did_get_origin_callback,
-                                    int64_t unused_usage,
-                                    int64_t unused_unlimited_usage);
-  void DidBootstrapDatabase(GetOriginCallback did_get_origin_callback,
-                            bool success);
-
-  // Called by clients via proxy.
-  // Registers a quota client to the manager.
-  void RegisterClient(
-      mojo::PendingRemote<mojom::QuotaClient> client,
-      QuotaClientType client_type,
-      const std::vector<blink::mojom::StorageType>& storage_types);
-
-  // Legacy overload for QuotaClients that have not been mojofied yet.
-  //
-  // TODO(crbug.com/1163009): Remove this overload after all QuotaClients have
-  //                          been mojofied.
-  void RegisterLegacyClient(
-      scoped_refptr<QuotaClient> client,
-      QuotaClientType client_type,
-      const std::vector<blink::mojom::StorageType>& storage_types);
-
-  UsageTracker* GetUsageTracker(blink::mojom::StorageType type) const;
-
-  // Extract cached origins list from the usage tracker.
-  // (Might return empty list if no origin is tracked by the tracker.)
-  std::set<url::Origin> GetCachedOrigins(blink::mojom::StorageType type);
-
-  void DumpQuotaTable(DumpQuotaTableCallback callback);
-  void DumpOriginInfoTable(DumpOriginInfoTableCallback callback);
-
-  void DeleteOriginDataInternal(const url::Origin& origin,
-                                blink::mojom::StorageType type,
-                                QuotaClientTypes quota_client_types,
-                                bool is_eviction,
-                                StatusCallback callback);
-
-  // Methods for eviction logic.
-  void StartEviction();
-  void DeleteOriginFromDatabase(const url::Origin& origin,
-                                blink::mojom::StorageType type,
-                                bool is_eviction);
-
-  void DidOriginDataEvicted(blink::mojom::QuotaStatusCode status);
-
-  void ReportHistogram();
-  void DidGetTemporaryGlobalUsageForHistogram(int64_t usage,
-                                              int64_t unlimited_usage);
-  void DidGetStorageCapacityForHistogram(int64_t usage,
-                                         int64_t total_space,
-                                         int64_t available_space);
-  void DidGetPersistentGlobalUsageForHistogram(int64_t usage,
-                                               int64_t unlimited_usage);
-  void DidDumpOriginInfoTableForHistogram(
-      const OriginInfoTableEntries& entries);
-
-  std::set<url::Origin> GetEvictionOriginExceptions();
-  void DidGetEvictionOrigin(GetOriginCallback callback,
-                            const base::Optional<url::Origin>& origin);
-
-  // QuotaEvictionHandler.
-  void GetEvictionOrigin(blink::mojom::StorageType type,
-                         int64_t global_quota,
-                         GetOriginCallback callback) override;
-  void EvictOriginData(const url::Origin& origin,
-                       blink::mojom::StorageType type,
-                       StatusCallback callback) override;
-  void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) override;
-
-  void GetLRUOrigin(blink::mojom::StorageType type, GetOriginCallback callback);
-
-  void DidGetPersistentHostQuota(const std::string& host,
-                                 const int64_t* quota,
-                                 bool success);
-  void DidSetPersistentHostQuota(const std::string& host,
-                                 QuotaCallback callback,
-                                 const int64_t* new_quota,
-                                 bool success);
-  void DidGetLRUOrigin(std::unique_ptr<base::Optional<url::Origin>> origin,
-                       bool success);
-  void GetQuotaSettings(QuotaSettingsCallback callback);
-  void DidGetSettings(base::Optional<QuotaSettings> settings);
-  void GetStorageCapacity(StorageCapacityCallback callback);
-  void ContinueIncognitoGetStorageCapacity(const QuotaSettings& settings);
-  void DidGetStorageCapacity(
-      const std::tuple<int64_t, int64_t>& total_and_available);
-
-  void DidDatabaseWork(bool success);
-
-  void DeleteOnCorrectThread() const;
-
-  void MaybeRunStoragePressureCallback(const url::Origin& origin,
-                                       int64_t total_space,
-                                       int64_t available_space);
-  // Used from quota-internals page to test behavior of the storage pressure
-  // callback.
-  void SimulateStoragePressure(const url::Origin origin);
-
-  // Evaluates disk statistics to identify storage pressure
-  // (low disk space availability) and starts the storage
-  // pressure event dispatch if appropriate.
-  // TODO(crbug.com/1088004): Implement UsageAndQuotaInfoGatherer::Completed()
-  // to use DetermineStoragePressure().
-  // TODO(crbug.com/1102433): Define and explain StoragePressure in the README.
-  void DetermineStoragePressure(int64_t free_space, int64_t total_space);
-
-  base::Optional<int64_t> GetQuotaOverrideForOrigin(const url::Origin&);
-
-  void PostTaskAndReplyWithResultForDBThread(
-      const base::Location& from_here,
-      base::OnceCallback<bool(QuotaDatabase*)> task,
-      base::OnceCallback<void(bool)> reply);
-
-  static std::tuple<int64_t, int64_t> CallGetVolumeInfo(
-      GetVolumeInfoFn get_volume_info_fn,
-      const base::FilePath& path);
-  static std::tuple<int64_t, int64_t> GetVolumeInfo(const base::FilePath& path);
-
-  const bool is_incognito_;
-  const base::FilePath profile_path_;
-
-  // This member is thread-safe. The scoped_refptr is immutable (the object it
-  // points to never changes), and the underlying object is thread-safe.
-  const scoped_refptr<QuotaManagerProxy> proxy_;
-
-  bool db_disabled_;
-  bool eviction_disabled_;
-  base::Optional<url::Origin> origin_for_pending_storage_pressure_callback_;
-  scoped_refptr<base::SingleThreadTaskRunner> io_thread_;
-  scoped_refptr<base::SequencedTaskRunner> db_runner_;
-  mutable std::unique_ptr<QuotaDatabase> database_;
-  bool is_database_bootstrapped_ = false;
-
-  GetQuotaSettingsFunc get_settings_function_;
-  scoped_refptr<base::TaskRunner> get_settings_task_runner_;
-  base::RepeatingCallback<void(url::Origin)> storage_pressure_callback_;
-  base::RepeatingClosure quota_change_callback_;
-  QuotaSettings settings_;
-  base::TimeTicks settings_timestamp_;
-  std::tuple<base::TimeTicks, int64_t, int64_t>
-      cached_disk_stats_for_storage_pressure_;
-  CallbackQueue<QuotaSettingsCallback, const QuotaSettings&>
-      settings_callbacks_;
-  CallbackQueue<StorageCapacityCallback, int64_t, int64_t>
-      storage_capacity_callbacks_;
-
-  GetOriginCallback lru_origin_callback_;
-  std::set<url::Origin> access_notified_origins_;
-
-  std::map<url::Origin, QuotaOverride> devtools_overrides_;
-  int next_override_handle_id_ = 0;
-
-  // Owns the QuotaClient remotes registered via RegisterClient().
-  //
-  // Iterating over this list is almost always incorrect. Most algorithms should
-  // iterate over an entry in |client_types_|.
-  //
-  // TODO(crbug.com/1016065): Handle Storage Service crashes. Will likely entail
-  //                          using a mojo::RemoteSet here.
-  std::vector<mojo::Remote<mojom::QuotaClient>> clients_for_ownership_;
-
-  // Owns the QuotaClient instances registered by RegisterLegacyClient() and
-  // their wrappers.
-  //
-  // TODO(crbug.com/1163009): Remove this member after all QuotaClients have
-  //                          been mojofied.
-  std::vector<scoped_refptr<QuotaClient>> legacy_clients_for_ownership_;
-
-  // Maps QuotaClient instances to client types.
-  //
-  // The QuotaClient instances pointed to by the map keys are guaranteed to be
-  // alive, because they are owned by `legacy_clients_for_ownership_`.
-  //
-  // TODO(crbug.com/1163009): Replace the map key with mojom::QuotaClient* after
-  //                          all QuotaClients have been mojofied.
-  base::flat_map<blink::mojom::StorageType,
-                 base::flat_map<QuotaClient*, QuotaClientType>>
-      client_types_;
-
-  std::unique_ptr<UsageTracker> temporary_usage_tracker_;
-  std::unique_ptr<UsageTracker> persistent_usage_tracker_;
-  std::unique_ptr<UsageTracker> syncable_usage_tracker_;
-  // TODO(michaeln): Need a way to clear the cache, drop and
-  // reinstantiate the trackers when they're not handling requests.
-
-  std::unique_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_;
-  EvictionContext eviction_context_;
-  bool is_getting_eviction_origin_;
-
-  CallbackQueueMap<QuotaCallback,
-                   std::string,
-                   blink::mojom::QuotaStatusCode,
-                   int64_t>
-      persistent_host_quota_callbacks_;
-
-  // Map from origin to count.
-  std::map<url::Origin, int> origins_in_use_;
-  // Map from origin to error count.
-  std::map<url::Origin, int> origins_in_error_;
-
-  scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
-
-  base::RepeatingTimer histogram_timer_;
-
-  // Pointer to the function used to get volume information. This is
-  // overwritten by QuotaManagerTest in order to attain deterministic reported
-  // values. The default value points to QuotaManager::GetVolumeInfo.
-  GetVolumeInfoFn get_volume_info_fn_;
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  base::WeakPtrFactory<QuotaManager> weak_factory_{this};
-};
-
-}  // namespace storage
+#include "storage/browser/quota/quota_manager_impl.h"
 
 #endif  // STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_H_
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc
new file mode 100644
index 0000000..fdefd32
--- /dev/null
+++ b/storage/browser/quota/quota_manager_impl.cc
@@ -0,0 +1,1983 @@
+// Copyright 2013 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 "storage/browser/quota/quota_manager_impl.h"
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <functional>
+#include <limits>
+#include <memory>
+#include <utility>
+
+#include "base/barrier_closure.h"
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+#include "base/command_line.h"
+#include "base/files/file_util.h"
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/rand_util.h"
+#include "base/sequence_checker.h"
+#include "base/sequenced_task_runner.h"
+#include "base/single_thread_task_runner.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/system/sys_info.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
+#include "base/task_runner_util.h"
+#include "base/threading/thread_restrictions.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "base/trace_event/trace_event.h"
+#include "base/types/pass_key.h"
+#include "components/services/storage/public/mojom/quota_client.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "storage/browser/quota/client_usage_tracker.h"
+#include "storage/browser/quota/mojo_quota_client_wrapper.h"
+#include "storage/browser/quota/quota_client_type.h"
+#include "storage/browser/quota/quota_features.h"
+#include "storage/browser/quota/quota_macros.h"
+#include "storage/browser/quota/quota_manager_proxy.h"
+#include "storage/browser/quota/quota_override_handle.h"
+#include "storage/browser/quota/quota_temporary_storage_evictor.h"
+#include "storage/browser/quota/usage_tracker.h"
+#include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
+
+using blink::mojom::StorageType;
+
+namespace storage {
+
+namespace {
+
+constexpr int64_t kReportHistogramInterval = 60 * 60 * 1000;  // 1 hour
+
+// Take action on write errors if there is <= 2% disk space
+// available.
+constexpr double kStoragePressureThresholdRatio = 0.02;
+
+// Limit how frequently QuotaManager polls for free disk space when
+// only using that information to identify storage pressure.
+constexpr base::TimeDelta kStoragePressureCheckDiskStatsInterval =
+    base::TimeDelta::FromMinutes(5);
+
+// Modifies a given value by a uniformly random amount from
+// -percent to +percent.
+int64_t RandomizeByPercent(int64_t value, int percent) {
+  double random_percent = (base::RandDouble() - 0.5) * percent * 2;
+  return value * (1 + (random_percent / 100.0));
+}
+}  // namespace
+
+// Heuristics: assuming average cloud server allows a few Gigs storage
+// on the server side and the storage needs to be shared for user data
+// and by multiple apps.
+int64_t QuotaManager::kSyncableStorageDefaultHostQuota = 500 * kMBytes;
+
+namespace {
+
+bool IsSupportedType(StorageType type) {
+  return type == StorageType::kTemporary || type == StorageType::kPersistent ||
+         type == StorageType::kSyncable;
+}
+
+bool IsSupportedIncognitoType(StorageType type) {
+  return type == StorageType::kTemporary || type == StorageType::kPersistent;
+}
+
+bool GetPersistentHostQuotaOnDBThread(const std::string& host,
+                                      int64_t* quota,
+                                      QuotaDatabase* database) {
+  DCHECK(database);
+  database->GetHostQuota(host, StorageType::kPersistent, quota);
+  return true;
+}
+
+bool SetPersistentHostQuotaOnDBThread(const std::string& host,
+                                      int64_t* new_quota,
+                                      QuotaDatabase* database) {
+  DCHECK(database);
+  if (database->SetHostQuota(host, StorageType::kPersistent, *new_quota))
+    return true;
+  *new_quota = 0;
+  return false;
+}
+
+bool GetLRUOriginOnDBThread(StorageType type,
+                            const std::set<url::Origin>& exceptions,
+                            SpecialStoragePolicy* policy,
+                            base::Optional<url::Origin>* origin,
+                            QuotaDatabase* database) {
+  DCHECK(database);
+  database->GetLRUOrigin(type, exceptions, policy, origin);
+  return true;
+}
+
+bool DeleteOriginInfoOnDBThread(const url::Origin& origin,
+                                StorageType type,
+                                bool is_eviction,
+                                QuotaDatabase* database) {
+  DCHECK(database);
+
+  base::Time now = base::Time::Now();
+
+  if (is_eviction) {
+    QuotaDatabase::OriginInfoTableEntry entry;
+    database->GetOriginInfo(origin, type, &entry);
+    UMA_HISTOGRAM_COUNTS_1M(QuotaManager::kEvictedOriginAccessedCountHistogram,
+                            entry.used_count);
+    UMA_HISTOGRAM_COUNTS_1000(
+        QuotaManager::kEvictedOriginDaysSinceAccessHistogram,
+        (now - entry.last_access_time).InDays());
+  }
+
+  if (!database->DeleteOriginInfo(origin, type))
+    return false;
+
+  // If the deletion is not due to an eviction, delete the entry in the eviction
+  // table as well due to privacy concerns.
+  if (!is_eviction)
+    return database->DeleteOriginLastEvictionTime(origin, type);
+
+  base::Time last_eviction_time;
+  database->GetOriginLastEvictionTime(origin, type, &last_eviction_time);
+
+  if (last_eviction_time != base::Time()) {
+    UMA_HISTOGRAM_COUNTS_1000(
+        QuotaManager::kDaysBetweenRepeatedOriginEvictionsHistogram,
+        (now - last_eviction_time).InDays());
+  }
+
+  return database->SetOriginLastEvictionTime(origin, type, now);
+}
+
+bool BootstrapDatabaseOnDBThread(std::set<url::Origin> origins,
+                                 QuotaDatabase* database) {
+  DCHECK(database);
+  if (database->IsOriginDatabaseBootstrapped())
+    return true;
+
+  // Register existing origins with 0 last time access.
+  if (database->RegisterInitialOriginInfo(origins, StorageType::kTemporary)) {
+    database->SetOriginDatabaseBootstrapped(true);
+    return true;
+  }
+  return false;
+}
+
+bool UpdateAccessTimeOnDBThread(const url::Origin& origin,
+                                StorageType type,
+                                base::Time accessed_time,
+                                QuotaDatabase* database) {
+  DCHECK(database);
+  return database->SetOriginLastAccessTime(origin, type, accessed_time);
+}
+
+bool UpdateModifiedTimeOnDBThread(const url::Origin& origin,
+                                  StorageType type,
+                                  base::Time modified_time,
+                                  QuotaDatabase* database) {
+  DCHECK(database);
+  return database->SetOriginLastModifiedTime(origin, type, modified_time);
+}
+
+void DidGetUsageAndQuotaStripBreakdown(
+    QuotaManager::UsageAndQuotaCallback callback,
+    blink::mojom::QuotaStatusCode status,
+    int64_t usage,
+    int64_t quota,
+    blink::mojom::UsageBreakdownPtr usage_breakdown) {
+  std::move(callback).Run(status, usage, quota);
+}
+
+void DidGetUsageAndQuotaStripOverride(
+    QuotaManager::UsageAndQuotaWithBreakdownCallback callback,
+    blink::mojom::QuotaStatusCode status,
+    int64_t usage,
+    int64_t quota,
+    bool is_override_enabled,
+    blink::mojom::UsageBreakdownPtr usage_breakdown) {
+  std::move(callback).Run(status, usage, quota, std::move(usage_breakdown));
+}
+
+}  // namespace
+
+constexpr int64_t QuotaManager::kGBytes;
+constexpr int64_t QuotaManager::kNoLimit;
+constexpr int64_t QuotaManager::kPerHostPersistentQuotaLimit;
+constexpr int QuotaManager::kEvictionIntervalInMilliSeconds;
+constexpr int QuotaManager::kThresholdOfErrorsToBeDenylisted;
+constexpr int QuotaManager::kThresholdRandomizationPercent;
+constexpr char QuotaManager::kDatabaseName[];
+constexpr char QuotaManager::kDaysBetweenRepeatedOriginEvictionsHistogram[];
+constexpr char QuotaManager::kEvictedOriginAccessedCountHistogram[];
+constexpr char QuotaManager::kEvictedOriginDaysSinceAccessHistogram[];
+
+QuotaManager::QuotaOverride::QuotaOverride() = default;
+QuotaManager::QuotaOverride::~QuotaOverride() = default;
+
+class QuotaManager::UsageAndQuotaInfoGatherer : public QuotaTask {
+ public:
+  UsageAndQuotaInfoGatherer(QuotaManager* manager,
+                            const url::Origin& origin,
+                            StorageType type,
+                            bool is_unlimited,
+                            bool is_session_only,
+                            bool is_incognito,
+                            base::Optional<int64_t> quota_override_size,
+                            UsageAndQuotaForDevtoolsCallback callback)
+      : QuotaTask(manager),
+        origin_(origin),
+        callback_(std::move(callback)),
+        type_(type),
+        is_unlimited_(is_unlimited),
+        is_session_only_(is_session_only),
+        is_incognito_(is_incognito),
+        is_override_enabled_(quota_override_size.has_value()),
+        quota_override_size_(quota_override_size) {}
+
+ protected:
+  void Run() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    // Start the async process of gathering the info we need.
+    // Gather 4 pieces of info before computing an answer:
+    // settings, device_storage_capacity, host_usage, and host_quota.
+    base::RepeatingClosure barrier = base::BarrierClosure(
+        4, base::BindOnce(&UsageAndQuotaInfoGatherer::OnBarrierComplete,
+                          weak_factory_.GetWeakPtr()));
+
+    const std::string& host = origin_.host();
+
+    manager()->GetQuotaSettings(
+        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotSettings,
+                       weak_factory_.GetWeakPtr(), barrier));
+    manager()->GetStorageCapacity(
+        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotCapacity,
+                       weak_factory_.GetWeakPtr(), barrier));
+    manager()->GetHostUsageWithBreakdown(
+        host, type_,
+        base::BindOnce(&UsageAndQuotaInfoGatherer::OnGotHostUsage,
+                       weak_factory_.GetWeakPtr(), barrier));
+
+    // Determine host_quota differently depending on type.
+    if (is_unlimited_) {
+      SetDesiredHostQuota(barrier, blink::mojom::QuotaStatusCode::kOk,
+                          kNoLimit);
+    } else if (type_ == StorageType::kSyncable) {
+      SetDesiredHostQuota(barrier, blink::mojom::QuotaStatusCode::kOk,
+                          kSyncableStorageDefaultHostQuota);
+    } else if (type_ == StorageType::kPersistent) {
+      manager()->GetPersistentHostQuota(
+          host, base::BindOnce(&UsageAndQuotaInfoGatherer::SetDesiredHostQuota,
+                               weak_factory_.GetWeakPtr(), barrier));
+    } else {
+      DCHECK_EQ(StorageType::kTemporary, type_);
+      // For temporary storage,  OnGotSettings will set the host quota.
+    }
+  }
+
+  void Aborted() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    weak_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort,
+                             /*usage=*/0,
+                             /*quota=*/0,
+                             /*is_override_enabled=*/false,
+                             /*usage_breakdown=*/nullptr);
+    DeleteSoon();
+  }
+
+  void Completed() override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    weak_factory_.InvalidateWeakPtrs();
+
+    int64_t host_quota = quota_override_size_.has_value()
+                             ? quota_override_size_.value()
+                             : desired_host_quota_;
+    int64_t temp_pool_free_space =
+        std::max(static_cast<int64_t>(0),
+                 available_space_ - settings_.must_remain_available);
+
+    // Constrain the desired |host_quota| to something that fits.
+    if (host_quota > temp_pool_free_space) {
+      if (is_unlimited_) {
+        host_quota = available_space_ + host_usage_;
+      }
+    }
+
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, host_usage_,
+                             host_quota, is_override_enabled_,
+                             std::move(host_usage_breakdown_));
+    if (type_ == StorageType::kTemporary && !is_incognito_ &&
+        !is_unlimited_) {
+      UMA_HISTOGRAM_MBYTES("Quota.QuotaForOrigin", host_quota);
+      UMA_HISTOGRAM_MBYTES("Quota.UsageByOrigin", host_usage_);
+      if (host_quota > 0) {
+        UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedByOrigin",
+            std::min(100, static_cast<int>((host_usage_ * 100) / host_quota)));
+      }
+    }
+    DeleteSoon();
+  }
+
+ private:
+  QuotaManager* manager() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  void OnGotSettings(base::RepeatingClosure barrier_closure,
+                     const QuotaSettings& settings) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    settings_ = settings;
+    barrier_closure.Run();
+    if (type_ == StorageType::kTemporary && !is_unlimited_) {
+      int64_t host_quota = is_session_only_
+                               ? settings.session_only_per_host_quota
+                               : settings.per_host_quota;
+      SetDesiredHostQuota(barrier_closure, blink::mojom::QuotaStatusCode::kOk,
+                          host_quota);
+    }
+  }
+
+  void OnGotCapacity(base::OnceClosure barrier_closure,
+                     int64_t total_space,
+                     int64_t available_space) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    total_space_ = total_space;
+    available_space_ = available_space;
+    std::move(barrier_closure).Run();
+  }
+
+  void OnGotHostUsage(base::OnceClosure barrier_closure,
+                      int64_t usage,
+                      blink::mojom::UsageBreakdownPtr usage_breakdown) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    host_usage_ = usage;
+    host_usage_breakdown_ = std::move(usage_breakdown);
+    std::move(barrier_closure).Run();
+  }
+
+  void SetDesiredHostQuota(base::OnceClosure barrier_closure,
+                           blink::mojom::QuotaStatusCode status,
+                           int64_t quota) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    desired_host_quota_ = quota;
+    std::move(barrier_closure).Run();
+  }
+
+  void OnBarrierComplete() { CallCompleted(); }
+
+  const url::Origin origin_;
+  QuotaManager::UsageAndQuotaForDevtoolsCallback callback_;
+  const StorageType type_;
+  const bool is_unlimited_;
+  const bool is_session_only_;
+  const bool is_incognito_;
+  int64_t available_space_ = 0;
+  int64_t total_space_ = 0;
+  int64_t desired_host_quota_ = 0;
+  int64_t host_usage_ = 0;
+  const bool is_override_enabled_;
+  base::Optional<int64_t> quota_override_size_;
+  blink::mojom::UsageBreakdownPtr host_usage_breakdown_;
+  QuotaSettings settings_;
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  // Weak pointers are used to support cancelling work.
+  base::WeakPtrFactory<UsageAndQuotaInfoGatherer> weak_factory_{this};
+};
+
+class QuotaManager::EvictionRoundInfoHelper : public QuotaTask {
+ public:
+  EvictionRoundInfoHelper(QuotaManager* manager,
+                          EvictionRoundInfoCallback callback)
+      : QuotaTask(manager), callback_(std::move(callback)) {}
+
+ protected:
+  void Run() override {
+    // Gather 2 pieces of info before deciding if we need to get GlobalUsage:
+    // settings and device_storage_capacity.
+    base::RepeatingClosure barrier = base::BarrierClosure(
+        2, base::BindOnce(&EvictionRoundInfoHelper::OnBarrierComplete,
+                          weak_factory_.GetWeakPtr()));
+
+    manager()->GetQuotaSettings(
+        base::BindOnce(&EvictionRoundInfoHelper::OnGotSettings,
+                       weak_factory_.GetWeakPtr(), barrier));
+    manager()->GetStorageCapacity(
+        base::BindOnce(&EvictionRoundInfoHelper::OnGotCapacity,
+                       weak_factory_.GetWeakPtr(), barrier));
+  }
+
+  void Aborted() override {
+    weak_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort,
+                             QuotaSettings(), 0, 0, 0, false);
+    DeleteSoon();
+  }
+
+  void Completed() override {
+    weak_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk, settings_,
+                             available_space_, total_space_, global_usage_,
+                             global_usage_is_complete_);
+    DeleteSoon();
+  }
+
+ private:
+  QuotaManager* manager() const {
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  void OnGotSettings(base::OnceClosure barrier_closure,
+                     const QuotaSettings& settings) {
+    settings_ = settings;
+    std::move(barrier_closure).Run();
+  }
+
+  void OnGotCapacity(base::OnceClosure barrier_closure,
+                     int64_t total_space,
+                     int64_t available_space) {
+    total_space_ = total_space;
+    available_space_ = available_space;
+    std::move(barrier_closure).Run();
+  }
+
+  void OnBarrierComplete() {
+    // Avoid computing the full current_usage when there's no pressure.
+    int64_t consumed_space = total_space_ - available_space_;
+    if (consumed_space < settings_.pool_size &&
+        available_space_ > settings_.should_remain_available) {
+      DCHECK(!global_usage_is_complete_);
+      global_usage_ =
+          manager()->GetUsageTracker(StorageType::kTemporary)->GetCachedUsage();
+      CallCompleted();
+      return;
+    }
+    manager()->GetGlobalUsage(
+        StorageType::kTemporary,
+        base::BindOnce(&EvictionRoundInfoHelper::OnGotGlobalUsage,
+                       weak_factory_.GetWeakPtr()));
+  }
+
+  void OnGotGlobalUsage(int64_t usage, int64_t unlimited_usage) {
+    global_usage_ = std::max(INT64_C(0), usage - unlimited_usage);
+    global_usage_is_complete_ = true;
+    CallCompleted();
+  }
+
+  EvictionRoundInfoCallback callback_;
+  QuotaSettings settings_;
+  int64_t available_space_ = 0;
+  int64_t total_space_ = 0;
+  int64_t global_usage_ = 0;
+  bool global_usage_is_complete_ = false;
+  base::WeakPtrFactory<EvictionRoundInfoHelper> weak_factory_{this};
+};
+
+class QuotaManager::GetUsageInfoTask : public QuotaTask {
+ public:
+  GetUsageInfoTask(QuotaManager* manager, GetUsageInfoCallback callback)
+      : QuotaTask(manager), callback_(std::move(callback)) {}
+
+ protected:
+  void Run() override {
+    remaining_trackers_ = 3;
+    // This will populate cached hosts and usage info.
+    manager()
+        ->GetUsageTracker(StorageType::kTemporary)
+        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
+                                        weak_factory_.GetWeakPtr(),
+                                        StorageType::kTemporary));
+    manager()
+        ->GetUsageTracker(StorageType::kPersistent)
+        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
+                                        weak_factory_.GetWeakPtr(),
+                                        StorageType::kPersistent));
+    manager()
+        ->GetUsageTracker(StorageType::kSyncable)
+        ->GetGlobalUsage(base::BindOnce(&GetUsageInfoTask::DidGetGlobalUsage,
+                                        weak_factory_.GetWeakPtr(),
+                                        StorageType::kSyncable));
+  }
+
+  void Completed() override {
+    std::move(callback_).Run(std::move(entries_));
+    DeleteSoon();
+  }
+
+  void Aborted() override {
+    std::move(callback_).Run(UsageInfoEntries());
+    DeleteSoon();
+  }
+
+ private:
+  void AddEntries(StorageType type, UsageTracker* tracker) {
+    std::map<std::string, int64_t> host_usage = tracker->GetCachedHostsUsage();
+    for (const auto& host_usage_pair : host_usage) {
+      entries_.emplace_back(host_usage_pair.first, type,
+                            host_usage_pair.second);
+    }
+    if (--remaining_trackers_ == 0)
+      CallCompleted();
+  }
+
+  void DidGetGlobalUsage(StorageType type, int64_t, int64_t) {
+    DCHECK(manager()->GetUsageTracker(type));
+    AddEntries(type, manager()->GetUsageTracker(type));
+  }
+
+  QuotaManager* manager() const {
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  GetUsageInfoCallback callback_;
+  UsageInfoEntries entries_;
+  int remaining_trackers_;
+  base::WeakPtrFactory<GetUsageInfoTask> weak_factory_{this};
+
+};
+
+class QuotaManager::OriginDataDeleter : public QuotaTask {
+ public:
+  OriginDataDeleter(QuotaManager* manager,
+                    const url::Origin& origin,
+                    StorageType type,
+                    QuotaClientTypes quota_client_types,
+                    bool is_eviction,
+                    StatusCallback callback)
+      : QuotaTask(manager),
+        origin_(origin),
+        type_(type),
+        quota_client_types_(std::move(quota_client_types)),
+        error_count_(0),
+        remaining_clients_(0),
+        skipped_clients_(0),
+        is_eviction_(is_eviction),
+        callback_(std::move(callback)) {}
+
+ protected:
+  void Run() override {
+    DCHECK(manager()->client_types_.contains(type_));
+    remaining_clients_ = manager()->client_types_[type_].size();
+
+    for (const auto& client_and_type : manager()->client_types_[type_]) {
+      QuotaClient* client = client_and_type.first;
+      QuotaClientType client_type = client_and_type.second;
+      if (quota_client_types_.contains(client_type)) {
+        static int tracing_id = 0;
+        TRACE_EVENT_ASYNC_BEGIN2(
+            "browsing_data", "QuotaManager::OriginDataDeleter", ++tracing_id,
+            "client_type", client_type, "origin", origin_.Serialize());
+        client->DeleteOriginData(
+            origin_, type_,
+            base::BindOnce(&OriginDataDeleter::DidDeleteOriginData,
+                           weak_factory_.GetWeakPtr(), tracing_id));
+      } else {
+        ++skipped_clients_;
+        --remaining_clients_;
+      }
+    }
+
+    if (remaining_clients_ == 0)
+      CallCompleted();
+  }
+
+  void Completed() override {
+    if (error_count_ == 0) {
+      // Only remove the entire origin if we didn't skip any client types.
+      if (skipped_clients_ == 0)
+        manager()->DeleteOriginFromDatabase(origin_, type_, is_eviction_);
+      std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk);
+    } else {
+      std::move(callback_).Run(
+          blink::mojom::QuotaStatusCode::kErrorInvalidModification);
+    }
+    DeleteSoon();
+  }
+
+  void Aborted() override {
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort);
+    DeleteSoon();
+  }
+
+ private:
+  void DidDeleteOriginData(int tracing_id,
+                           blink::mojom::QuotaStatusCode status) {
+    DCHECK_GT(remaining_clients_, 0U);
+    TRACE_EVENT_ASYNC_END0("browsing_data", "QuotaManager::OriginDataDeleter",
+                           tracing_id);
+
+    if (status != blink::mojom::QuotaStatusCode::kOk)
+      ++error_count_;
+
+    if (--remaining_clients_ == 0)
+      CallCompleted();
+  }
+
+  QuotaManager* manager() const {
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  const url::Origin origin_;
+  const StorageType type_;
+  const QuotaClientTypes quota_client_types_;
+  int error_count_;
+  size_t remaining_clients_;
+  int skipped_clients_;
+  const bool is_eviction_;
+  StatusCallback callback_;
+
+  base::WeakPtrFactory<OriginDataDeleter> weak_factory_{this};
+};
+
+class QuotaManager::HostDataDeleter : public QuotaTask {
+ public:
+  HostDataDeleter(QuotaManager* manager,
+                  const std::string& host,
+                  StorageType type,
+                  QuotaClientTypes quota_client_types,
+                  StatusCallback callback)
+      : QuotaTask(manager),
+        host_(host),
+        type_(type),
+        quota_client_types_(std::move(quota_client_types)),
+        error_count_(0),
+        remaining_clients_(0),
+        remaining_deleters_(0),
+        callback_(std::move(callback)) {}
+
+ protected:
+  void Run() override {
+    DCHECK(manager()->client_types_.contains(type_));
+    remaining_clients_ = manager()->client_types_[type_].size();
+
+    for (const auto& client_and_type : manager()->client_types_[type_]) {
+      client_and_type.first->GetOriginsForHost(
+          type_, host_,
+          base::BindOnce(&HostDataDeleter::DidGetOriginsForHost,
+                         weak_factory_.GetWeakPtr()));
+    }
+  }
+
+  void Completed() override {
+    if (error_count_ == 0) {
+      std::move(callback_).Run(blink::mojom::QuotaStatusCode::kOk);
+    } else {
+      std::move(callback_).Run(
+          blink::mojom::QuotaStatusCode::kErrorInvalidModification);
+    }
+    DeleteSoon();
+  }
+
+  void Aborted() override {
+    std::move(callback_).Run(blink::mojom::QuotaStatusCode::kErrorAbort);
+    DeleteSoon();
+  }
+
+ private:
+  void DidGetOriginsForHost(const std::vector<url::Origin>& origins) {
+    DCHECK_GT(remaining_clients_, 0U);
+
+    for (const auto& origin : origins)
+      origins_.insert(origin);
+
+    if (--remaining_clients_ == 0) {
+      if (!origins_.empty())
+        ScheduleOriginsDeletion();
+      else
+        CallCompleted();
+    }
+  }
+
+  void ScheduleOriginsDeletion() {
+    remaining_deleters_ = origins_.size();
+    for (const auto& origin : origins_) {
+      OriginDataDeleter* deleter = new OriginDataDeleter(
+          manager(), origin, type_, std::move(quota_client_types_), false,
+          base::BindOnce(&HostDataDeleter::DidDeleteOriginData,
+                         weak_factory_.GetWeakPtr()));
+      deleter->Start();
+    }
+  }
+
+  void DidDeleteOriginData(blink::mojom::QuotaStatusCode status) {
+    DCHECK_GT(remaining_deleters_, 0U);
+
+    if (status != blink::mojom::QuotaStatusCode::kOk)
+      ++error_count_;
+
+    if (--remaining_deleters_ == 0)
+      CallCompleted();
+  }
+
+  QuotaManager* manager() const {
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  const std::string host_;
+  const StorageType type_;
+  const QuotaClientTypes quota_client_types_;
+  std::set<url::Origin> origins_;
+  int error_count_;
+  size_t remaining_clients_;
+  size_t remaining_deleters_;
+  StatusCallback callback_;
+
+  base::WeakPtrFactory<HostDataDeleter> weak_factory_{this};
+};
+
+class QuotaManager::StorageCleanupHelper : public QuotaTask {
+ public:
+  StorageCleanupHelper(QuotaManager* manager,
+                       StorageType type,
+                       QuotaClientTypes quota_client_types,
+                       base::OnceClosure callback)
+      : QuotaTask(manager),
+        type_(type),
+        quota_client_types_(std::move(quota_client_types)),
+        callback_(std::move(callback)) {
+    DCHECK(manager->client_types_.contains(type_));
+  }
+
+ protected:
+  void Run() override {
+    DCHECK(manager()->client_types_.contains(type_));
+    base::RepeatingClosure barrier = base::BarrierClosure(
+        manager()->client_types_[type_].size(),
+        base::BindOnce(&StorageCleanupHelper::CallCompleted,
+                       weak_factory_.GetWeakPtr()));
+
+    // This may synchronously trigger |callback_| at the end of the for loop,
+    // make sure we do nothing after this block.
+    for (const auto& client_and_type : manager()->client_types_[type_]) {
+      QuotaClient* client = client_and_type.first;
+      QuotaClientType client_type = client_and_type.second;
+      if (quota_client_types_.contains(client_type)) {
+        client->PerformStorageCleanup(type_, barrier);
+      } else {
+        barrier.Run();
+      }
+    }
+  }
+
+  void Aborted() override {
+    weak_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run();
+    DeleteSoon();
+  }
+
+  void Completed() override {
+    weak_factory_.InvalidateWeakPtrs();
+    std::move(callback_).Run();
+    DeleteSoon();
+  }
+
+ private:
+  QuotaManager* manager() const {
+    return static_cast<QuotaManager*>(observer());
+  }
+
+  const StorageType type_;
+  const QuotaClientTypes quota_client_types_;
+  base::OnceClosure callback_;
+  base::WeakPtrFactory<StorageCleanupHelper> weak_factory_{this};
+};
+
+// Fetch origins that have been modified since the specified time. This is used
+// to clear data for origins that have been modified within the user specified
+// time frame.
+//
+// This class is granted ownership of itself when it is passed to
+// DidGetModifiedBetween() via base::Owned(). When the closure for said
+// function goes out of scope, the object is deleted. This is a thread-safe
+// class.
+class QuotaManager::GetModifiedSinceHelper {
+ public:
+  bool GetModifiedBetweenOnDBThread(StorageType type,
+                                    base::Time begin,
+                                    base::Time end,
+                                    QuotaDatabase* database) {
+    DCHECK(database);
+    return database->GetOriginsModifiedBetween(type, &origins_, begin, end);
+  }
+
+  void DidGetModifiedBetween(const base::WeakPtr<QuotaManager>& manager,
+                             GetOriginsCallback callback,
+                             StorageType type,
+                             bool success) {
+    if (!manager) {
+      // The operation was aborted.
+      std::move(callback).Run(std::set<url::Origin>(), type);
+      return;
+    }
+    manager->DidDatabaseWork(success);
+    std::move(callback).Run(origins_, type);
+  }
+
+ private:
+  std::set<url::Origin> origins_;
+};
+
+// Gather origin info table for quota-internals page.
+//
+// This class is granted ownership of itself when it is passed to
+// DidDumpQuotaTable() via base::Owned(). When the closure for said function
+// goes out of scope, the object is deleted.
+// This class is not thread-safe because there can be a race when entries_ is
+// modified.
+class QuotaManager::DumpQuotaTableHelper {
+ public:
+  bool DumpQuotaTableOnDBThread(QuotaDatabase* database) {
+    DCHECK(database);
+    return database->DumpQuotaTable(base::BindRepeating(
+        &DumpQuotaTableHelper::AppendEntry, base::Unretained(this)));
+  }
+
+  void DidDumpQuotaTable(const base::WeakPtr<QuotaManager>& manager,
+                         DumpQuotaTableCallback callback,
+                         bool success) {
+    if (!manager) {
+      // The operation was aborted.
+      std::move(callback).Run(QuotaTableEntries());
+      return;
+    }
+    manager->DidDatabaseWork(success);
+    std::move(callback).Run(entries_);
+  }
+
+ private:
+  bool AppendEntry(const QuotaTableEntry& entry) {
+    entries_.push_back(entry);
+    return true;
+  }
+
+  QuotaTableEntries entries_;
+};
+
+// Gather origin info table for quota-internals page.
+//
+// This class is granted ownership of itself when it is passed to
+// DidDumpQuotaTable() via base::Owned(). When the closure for said function
+// goes out of scope, the object is deleted.
+// This class is not thread-safe because there can be races when entries_ is
+// modified.
+class QuotaManager::DumpOriginInfoTableHelper {
+ public:
+  bool DumpOriginInfoTableOnDBThread(QuotaDatabase* database) {
+    DCHECK(database);
+    return database->DumpOriginInfoTable(base::BindRepeating(
+        &DumpOriginInfoTableHelper::AppendEntry, base::Unretained(this)));
+  }
+
+  void DidDumpOriginInfoTable(const base::WeakPtr<QuotaManager>& manager,
+                              DumpOriginInfoTableCallback callback,
+                              bool success) {
+    if (!manager) {
+      // The operation was aborted.
+      std::move(callback).Run(OriginInfoTableEntries());
+      return;
+    }
+    manager->DidDatabaseWork(success);
+    std::move(callback).Run(entries_);
+  }
+
+ private:
+  bool AppendEntry(const OriginInfoTableEntry& entry) {
+    entries_.push_back(entry);
+    return true;
+  }
+
+  OriginInfoTableEntries entries_;
+};
+
+// QuotaManager ---------------------------------------------------------------
+
+QuotaManager::QuotaManager(
+    bool is_incognito,
+    const base::FilePath& profile_path,
+    scoped_refptr<base::SingleThreadTaskRunner> io_thread,
+    base::RepeatingClosure quota_change_callback,
+    scoped_refptr<SpecialStoragePolicy> special_storage_policy,
+    const GetQuotaSettingsFunc& get_settings_function)
+    : RefCountedDeleteOnSequence<QuotaManager>(io_thread),
+      is_incognito_(is_incognito),
+      profile_path_(profile_path),
+      proxy_(base::MakeRefCounted<QuotaManagerProxy>(this, io_thread)),
+      db_disabled_(false),
+      eviction_disabled_(false),
+      io_thread_(std::move(io_thread)),
+      db_runner_(base::ThreadPool::CreateSequencedTaskRunner(
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+           base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
+      get_settings_function_(get_settings_function),
+      quota_change_callback_(std::move(quota_change_callback)),
+      is_getting_eviction_origin_(false),
+      special_storage_policy_(std::move(special_storage_policy)),
+      get_volume_info_fn_(&QuotaManager::GetVolumeInfo) {
+  DCHECK_EQ(settings_.refresh_interval, base::TimeDelta::Max());
+  if (!get_settings_function.is_null()) {
+    // Reset the interval to ensure we use the get_settings_function
+    // the first times settings_ is needed.
+    settings_.refresh_interval = base::TimeDelta();
+    get_settings_task_runner_ = base::ThreadTaskRunnerHandle::Get();
+  }
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
+
+void QuotaManager::SetQuotaSettings(const QuotaSettings& settings) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  settings_ = settings;
+  settings_timestamp_ = base::TimeTicks::Now();
+}
+
+void QuotaManager::GetUsageInfo(GetUsageInfoCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  GetUsageInfoTask* get_usage_info =
+      new GetUsageInfoTask(this, std::move(callback));
+  get_usage_info->Start();
+}
+
+void QuotaManager::GetUsageAndQuotaForWebApps(const url::Origin& origin,
+                                              StorageType type,
+                                              UsageAndQuotaCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  GetUsageAndQuotaWithBreakdown(
+      origin, type,
+      base::BindOnce(&DidGetUsageAndQuotaStripBreakdown, std::move(callback)));
+}
+
+void QuotaManager::GetUsageAndQuotaWithBreakdown(
+    const url::Origin& origin,
+    StorageType type,
+    UsageAndQuotaWithBreakdownCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  GetUsageAndQuotaForDevtools(
+      origin, type,
+      base::BindOnce(&DidGetUsageAndQuotaStripOverride, std::move(callback)));
+}
+
+void QuotaManager::GetUsageAndQuotaForDevtools(
+    const url::Origin& origin,
+    StorageType type,
+    UsageAndQuotaForDevtoolsCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!IsSupportedType(type) ||
+      (is_incognito_ && !IsSupportedIncognitoType(type))) {
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported,
+                            /*usage=*/0,
+                            /*quota=*/0,
+                            /*is_override_enabled=*/false,
+                            /*usage_breakdown=*/nullptr);
+    return;
+  }
+  LazyInitialize();
+
+  bool is_session_only =
+      type == StorageType::kTemporary && special_storage_policy_ &&
+      special_storage_policy_->IsStorageSessionOnly(origin.GetURL());
+
+  base::Optional<int64_t> quota_override = GetQuotaOverrideForOrigin(origin);
+
+  UsageAndQuotaInfoGatherer* helper = new UsageAndQuotaInfoGatherer(
+      this, origin, type, IsStorageUnlimited(origin, type), is_session_only,
+      is_incognito_, quota_override, std::move(callback));
+  helper->Start();
+}
+
+void QuotaManager::GetUsageAndQuota(const url::Origin& origin,
+                                    StorageType type,
+                                    UsageAndQuotaCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (IsStorageUnlimited(origin, type)) {
+    // TODO(michaeln): This seems like a non-obvious odd behavior, probably for
+    // apps/extensions, but it would be good to eliminate this special case.
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0, kNoLimit);
+    return;
+  }
+
+  if (!IsSupportedType(type) ||
+      (is_incognito_ && !IsSupportedIncognitoType(type))) {
+    std::move(callback).Run(
+        /*status*/ blink::mojom::QuotaStatusCode::kErrorNotSupported,
+        /*usage*/ 0,
+        /*quota*/ 0);
+    return;
+  }
+  LazyInitialize();
+
+  bool is_session_only =
+      type == StorageType::kTemporary && special_storage_policy_ &&
+      special_storage_policy_->IsStorageSessionOnly(origin.GetURL());
+
+  base::Optional<int64_t> quota_override = GetQuotaOverrideForOrigin(origin);
+
+  UsageAndQuotaInfoGatherer* helper = new UsageAndQuotaInfoGatherer(
+      this, origin, type, IsStorageUnlimited(origin, type), is_session_only,
+      is_incognito_, quota_override,
+      base::BindOnce(&DidGetUsageAndQuotaStripOverride,
+                     base::BindOnce(&DidGetUsageAndQuotaStripBreakdown,
+                                    std::move(callback))));
+  helper->Start();
+}
+
+void QuotaManager::NotifyWriteFailed(const url::Origin& origin) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto age_of_disk_stats = base::TimeTicks::Now() -
+                           std::get<0>(cached_disk_stats_for_storage_pressure_);
+
+  // Avoid polling for free disk space if disk stats have been recently
+  // queried.
+  if (age_of_disk_stats < kStoragePressureCheckDiskStatsInterval) {
+    int64_t total_space = std::get<1>(cached_disk_stats_for_storage_pressure_);
+    int64_t available_space =
+        std::get<2>(cached_disk_stats_for_storage_pressure_);
+    MaybeRunStoragePressureCallback(origin, total_space, available_space);
+  }
+
+  GetStorageCapacity(
+      base::BindOnce(&QuotaManager::MaybeRunStoragePressureCallback,
+                     weak_factory_.GetWeakPtr(), origin));
+}
+
+void QuotaManager::NotifyOriginInUse(const url::Origin& origin) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+  origins_in_use_[origin]++;
+}
+
+void QuotaManager::NotifyOriginNoLongerInUse(const url::Origin& origin) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+  DCHECK(IsOriginInUse(origin));
+  int& count = origins_in_use_[origin];
+  if (--count == 0)
+    origins_in_use_.erase(origin);
+}
+
+void QuotaManager::SetUsageCacheEnabled(QuotaClientType client_id,
+                                        const url::Origin& origin,
+                                        StorageType type,
+                                        bool enabled) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  DCHECK(GetUsageTracker(type));
+  GetUsageTracker(type)->SetUsageCacheEnabled(client_id, origin, enabled);
+}
+
+void QuotaManager::DeleteOriginData(const url::Origin& origin,
+                                    StorageType type,
+                                    QuotaClientTypes quota_client_types,
+                                    StatusCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DeleteOriginDataInternal(origin, type, std::move(quota_client_types), false,
+                           std::move(callback));
+}
+
+void QuotaManager::PerformStorageCleanup(StorageType type,
+                                         QuotaClientTypes quota_client_types,
+                                         base::OnceClosure callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  StorageCleanupHelper* deleter = new StorageCleanupHelper(
+      this, type, std::move(quota_client_types), std::move(callback));
+  deleter->Start();
+}
+
+void QuotaManager::DeleteHostData(const std::string& host,
+                                  StorageType type,
+                                  QuotaClientTypes quota_client_types,
+                                  StatusCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+
+  DCHECK(client_types_.contains(type));
+  if (host.empty() || client_types_[type].empty()) {
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
+    return;
+  }
+
+  HostDataDeleter* deleter = new HostDataDeleter(
+      this, host, type, std::move(quota_client_types), std::move(callback));
+  deleter->Start();
+}
+
+void QuotaManager::GetPersistentHostQuota(const std::string& host,
+                                          QuotaCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  if (host.empty()) {
+    // This could happen if we are called on file:///.
+    // TODO(kinuko) We may want to respect --allow-file-access-from-files
+    // command line switch.
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk, 0);
+    return;
+  }
+
+  if (!persistent_host_quota_callbacks_.Add(host, std::move(callback)))
+    return;
+
+  int64_t* quota_ptr = new int64_t(0);
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&GetPersistentHostQuotaOnDBThread, host,
+                     base::Unretained(quota_ptr)),
+      base::BindOnce(&QuotaManager::DidGetPersistentHostQuota,
+                     weak_factory_.GetWeakPtr(), host, base::Owned(quota_ptr)));
+}
+
+void QuotaManager::SetPersistentHostQuota(const std::string& host,
+                                          int64_t new_quota,
+                                          QuotaCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  if (host.empty()) {
+    // This could happen if we are called on file:///.
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorNotSupported,
+                            0);
+    return;
+  }
+
+  if (new_quota < 0) {
+    std::move(callback).Run(
+        blink::mojom::QuotaStatusCode::kErrorInvalidModification, -1);
+    return;
+  }
+
+  // Cap the requested size at the per-host quota limit.
+  new_quota = std::min(new_quota, kPerHostPersistentQuotaLimit);
+
+  if (db_disabled_) {
+    std::move(callback).Run(blink::mojom::QuotaStatusCode::kErrorInvalidAccess,
+                            -1);
+    return;
+  }
+
+  int64_t* new_quota_ptr = new int64_t(new_quota);
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&SetPersistentHostQuotaOnDBThread, host,
+                     base::Unretained(new_quota_ptr)),
+      base::BindOnce(&QuotaManager::DidSetPersistentHostQuota,
+                     weak_factory_.GetWeakPtr(), host, std::move(callback),
+                     base::Owned(new_quota_ptr)));
+}
+
+void QuotaManager::GetGlobalUsage(StorageType type,
+                                  GlobalUsageCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  DCHECK(GetUsageTracker(type));
+  GetUsageTracker(type)->GetGlobalUsage(std::move(callback));
+}
+
+void QuotaManager::GetHostUsageWithBreakdown(
+    const std::string& host,
+    StorageType type,
+    UsageWithBreakdownCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  DCHECK(GetUsageTracker(type));
+  GetUsageTracker(type)->GetHostUsageWithBreakdown(host, std::move(callback));
+}
+
+std::map<std::string, std::string> QuotaManager::GetStatistics() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::map<std::string, std::string> statistics;
+  if (temporary_storage_evictor_) {
+    std::map<std::string, int64_t> stats;
+    temporary_storage_evictor_->GetStatistics(&stats);
+    for (const auto& origin_usage_pair : stats) {
+      statistics[origin_usage_pair.first] =
+          base::NumberToString(origin_usage_pair.second);
+    }
+  }
+  return statistics;
+}
+
+bool QuotaManager::IsStorageUnlimited(const url::Origin& origin,
+                                      StorageType type) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // For syncable storage we should always enforce quota (since the
+  // quota must be capped by the server limit).
+  if (type == StorageType::kSyncable)
+    return false;
+  if (type == StorageType::kQuotaNotManaged)
+    return true;
+  return special_storage_policy_.get() &&
+         special_storage_policy_->IsStorageUnlimited(origin.GetURL());
+}
+
+void QuotaManager::GetOriginsModifiedBetween(StorageType type,
+                                             base::Time begin,
+                                             base::Time end,
+                                             GetOriginsCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  GetModifiedSinceHelper* helper = new GetModifiedSinceHelper;
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&GetModifiedSinceHelper::GetModifiedBetweenOnDBThread,
+                     base::Unretained(helper), type, begin, end),
+      base::BindOnce(&GetModifiedSinceHelper::DidGetModifiedBetween,
+                     base::Owned(helper), weak_factory_.GetWeakPtr(),
+                     std::move(callback), type));
+}
+
+bool QuotaManager::ResetUsageTracker(StorageType type) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(GetUsageTracker(type));
+  if (GetUsageTracker(type)->IsWorking())
+    return false;
+
+  auto usage_tracker = std::make_unique<UsageTracker>(
+      client_types_[type], type, special_storage_policy_.get());
+  switch (type) {
+    case StorageType::kTemporary:
+      temporary_usage_tracker_ = std::move(usage_tracker);
+      return true;
+    case StorageType::kPersistent:
+      persistent_usage_tracker_ = std::move(usage_tracker);
+      return true;
+    case StorageType::kSyncable:
+      syncable_usage_tracker_ = std::move(usage_tracker);
+      return true;
+    default:
+      NOTREACHED();
+  }
+  return true;
+}
+
+QuotaManager::~QuotaManager() {
+  proxy_->InvalidateQuotaManager(base::PassKey<QuotaManager>());
+
+  // Iterating over `legacy_clients_for_ownership_` is correct here because we
+  // want to call OnQuotaManagerDestroyed() once per QuotaClient.
+  for (const auto& client : legacy_clients_for_ownership_)
+    client->OnQuotaManagerDestroyed();
+
+  if (database_)
+    db_runner_->DeleteSoon(FROM_HERE, database_.release());
+}
+
+QuotaManager::EvictionContext::EvictionContext()
+    : evicted_type(StorageType::kUnknown) {}
+
+QuotaManager::EvictionContext::~EvictionContext() = default;
+
+void QuotaManager::LazyInitialize() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+  if (database_) {
+    // Already initialized.
+    return;
+  }
+
+  // Use an empty path to open an in-memory only database for incognito.
+  database_ = std::make_unique<QuotaDatabase>(
+      is_incognito_ ? base::FilePath()
+                    : profile_path_.AppendASCII(kDatabaseName));
+
+  temporary_usage_tracker_ = std::make_unique<UsageTracker>(
+      client_types_[StorageType::kTemporary], StorageType::kTemporary,
+      special_storage_policy_.get());
+  persistent_usage_tracker_ = std::make_unique<UsageTracker>(
+      client_types_[StorageType::kPersistent], StorageType::kPersistent,
+      special_storage_policy_.get());
+  syncable_usage_tracker_ = std::make_unique<UsageTracker>(
+      client_types_[StorageType::kSyncable], StorageType::kSyncable,
+      special_storage_policy_.get());
+
+  if (!is_incognito_) {
+    histogram_timer_.Start(
+        FROM_HERE, base::TimeDelta::FromMilliseconds(kReportHistogramInterval),
+        this, &QuotaManager::ReportHistogram);
+  }
+
+  base::PostTaskAndReplyWithResult(
+      db_runner_.get(), FROM_HERE,
+      base::BindOnce(&QuotaDatabase::IsOriginDatabaseBootstrapped,
+                     base::Unretained(database_.get())),
+      base::BindOnce(&QuotaManager::FinishLazyInitialize,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::FinishLazyInitialize(bool is_database_bootstrapped) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  is_database_bootstrapped_ = is_database_bootstrapped;
+  StartEviction();
+}
+
+void QuotaManager::BootstrapDatabaseForEviction(
+    GetOriginCallback did_get_origin_callback,
+    int64_t usage,
+    int64_t unlimited_usage) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // The usage cache should be fully populated now so we can
+  // seed the database with origins we know about.
+  std::set<url::Origin> origins = temporary_usage_tracker_->GetCachedOrigins();
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&BootstrapDatabaseOnDBThread, std::move(origins)),
+      base::BindOnce(&QuotaManager::DidBootstrapDatabase,
+                     weak_factory_.GetWeakPtr(),
+                     std::move(did_get_origin_callback)));
+}
+
+void QuotaManager::DidBootstrapDatabase(
+    GetOriginCallback did_get_origin_callback,
+    bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  is_database_bootstrapped_ = success;
+  DidDatabaseWork(success);
+  GetLRUOrigin(StorageType::kTemporary, std::move(did_get_origin_callback));
+}
+
+void QuotaManager::RegisterClient(
+    mojo::PendingRemote<mojom::QuotaClient> client,
+    QuotaClientType client_type,
+    const std::vector<blink::mojom::StorageType>& storage_types) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!database_.get())
+      << "All clients must be registered before the database is initialized";
+
+  clients_for_ownership_.emplace_back(std::move(client));
+  mojom::QuotaClient* client_ptr = clients_for_ownership_.back().get();
+
+  // TODO(crbug.com/1163009): Remove this block after all QuotaClients have been
+  //                          mojofied.
+  legacy_clients_for_ownership_.push_back(
+      base::MakeRefCounted<MojoQuotaClientWrapper>(client_ptr));
+  QuotaClient* legacy_client_ptr = legacy_clients_for_ownership_.back().get();
+
+  // TODO(crbug.com/1163009): Use client_ptr instead of legacy_client_ptr after
+  //                          all QuotaClients have been mojofied.
+  for (blink::mojom::StorageType storage_type : storage_types)
+    client_types_[storage_type].insert({legacy_client_ptr, client_type});
+}
+
+void QuotaManager::RegisterLegacyClient(
+    scoped_refptr<QuotaClient> client,
+    QuotaClientType client_type,
+    const std::vector<blink::mojom::StorageType>& storage_types) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!database_.get())
+      << "All clients must be registered before the database is initialized";
+  DCHECK(client.get());
+
+  for (blink::mojom::StorageType storage_type : storage_types)
+    client_types_[storage_type].insert({client.get(), client_type});
+  legacy_clients_for_ownership_.push_back(std::move(client));
+}
+
+UsageTracker* QuotaManager::GetUsageTracker(StorageType type) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  switch (type) {
+    case StorageType::kTemporary:
+      return temporary_usage_tracker_.get();
+    case StorageType::kPersistent:
+      return persistent_usage_tracker_.get();
+    case StorageType::kSyncable:
+      return syncable_usage_tracker_.get();
+    case StorageType::kQuotaNotManaged:
+      return nullptr;
+    case StorageType::kUnknown:
+      NOTREACHED();
+  }
+  return nullptr;
+}
+
+std::set<url::Origin> QuotaManager::GetCachedOrigins(StorageType type) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  DCHECK(GetUsageTracker(type));
+  return GetUsageTracker(type)->GetCachedOrigins();
+}
+
+void QuotaManager::NotifyStorageAccessed(const url::Origin& origin,
+                                         StorageType type,
+                                         base::Time access_time) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  if (type == StorageType::kTemporary && is_getting_eviction_origin_) {
+    // Record the accessed origins while GetLRUOrigin task is runing
+    // to filter out them from eviction.
+    access_notified_origins_.insert(origin);
+  }
+
+  if (db_disabled_)
+    return;
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&UpdateAccessTimeOnDBThread, origin, type, access_time),
+      base::BindOnce(&QuotaManager::DidDatabaseWork,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::NotifyStorageModified(QuotaClientType client_id,
+                                         const url::Origin& origin,
+                                         StorageType type,
+                                         int64_t delta,
+                                         base::Time modification_time) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  DCHECK(GetUsageTracker(type));
+  GetUsageTracker(type)->UpdateUsageCache(client_id, origin, delta);
+
+  if (db_disabled_)
+    return;
+
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&UpdateModifiedTimeOnDBThread, origin, type,
+                     modification_time),
+      base::BindOnce(&QuotaManager::DidDatabaseWork,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::DumpQuotaTable(DumpQuotaTableCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DumpQuotaTableHelper* helper = new DumpQuotaTableHelper;
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&DumpQuotaTableHelper::DumpQuotaTableOnDBThread,
+                     base::Unretained(helper)),
+      base::BindOnce(&DumpQuotaTableHelper::DidDumpQuotaTable,
+                     base::Owned(helper), weak_factory_.GetWeakPtr(),
+                     std::move(callback)));
+}
+
+void QuotaManager::DumpOriginInfoTable(DumpOriginInfoTableCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DumpOriginInfoTableHelper* helper = new DumpOriginInfoTableHelper;
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&DumpOriginInfoTableHelper::DumpOriginInfoTableOnDBThread,
+                     base::Unretained(helper)),
+      base::BindOnce(&DumpOriginInfoTableHelper::DidDumpOriginInfoTable,
+                     base::Owned(helper), weak_factory_.GetWeakPtr(),
+                     std::move(callback)));
+}
+
+void QuotaManager::StartEviction() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!temporary_storage_evictor_.get());
+  if (eviction_disabled_)
+    return;
+  temporary_storage_evictor_ = std::make_unique<QuotaTemporaryStorageEvictor>(
+      this, kEvictionIntervalInMilliSeconds);
+  temporary_storage_evictor_->Start();
+}
+
+void QuotaManager::DeleteOriginFromDatabase(const url::Origin& origin,
+                                            StorageType type,
+                                            bool is_eviction) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  if (db_disabled_)
+    return;
+
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&DeleteOriginInfoOnDBThread, origin, type, is_eviction),
+      base::BindOnce(&QuotaManager::DidDatabaseWork,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::DidOriginDataEvicted(blink::mojom::QuotaStatusCode status) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+
+  // We only try evict origins that are not in use, so basically
+  // deletion attempt for eviction should not fail.  Let's record
+  // the origin if we get error and exclude it from future eviction
+  // if the error happens consistently (> kThresholdOfErrorsToBeDenylisted).
+  if (status != blink::mojom::QuotaStatusCode::kOk)
+    origins_in_error_[eviction_context_.evicted_origin]++;
+
+  std::move(eviction_context_.evict_origin_data_callback).Run(status);
+}
+
+void QuotaManager::DeleteOriginDataInternal(const url::Origin& origin,
+                                            StorageType type,
+                                            QuotaClientTypes quota_client_types,
+                                            bool is_eviction,
+                                            StatusCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+
+  OriginDataDeleter* deleter =
+      new OriginDataDeleter(this, origin, type, std::move(quota_client_types),
+                            is_eviction, std::move(callback));
+  deleter->Start();
+}
+
+void QuotaManager::MaybeRunStoragePressureCallback(const url::Origin& origin,
+                                                   int64_t total_space,
+                                                   int64_t available_space) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // TODO(https://crbug.com/1059560): Figure out what 0 total_space means
+  // and how to handle the storage pressure callback in these cases.
+  if (total_space == 0)
+    return;
+
+  if (!storage_pressure_callback_) {
+    // Quota will hold onto a storage pressure notification if no storage
+    // pressure callback is set.
+    origin_for_pending_storage_pressure_callback_ = std::move(origin);
+    return;
+  }
+
+  if (available_space < kStoragePressureThresholdRatio * total_space) {
+    storage_pressure_callback_.Run(std::move(origin));
+  }
+}
+
+void QuotaManager::SimulateStoragePressure(const url::Origin origin) {
+  storage_pressure_callback_.Run(origin);
+}
+
+void QuotaManager::DetermineStoragePressure(int64_t total_space,
+                                            int64_t free_space) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!base::FeatureList::IsEnabled(features::kStoragePressureEvent)) {
+    return;
+  }
+  int64_t threshold_bytes =
+      RandomizeByPercent(kGBytes, kThresholdRandomizationPercent);
+  int64_t threshold = RandomizeByPercent(
+      static_cast<int64_t>(total_space *
+                           (kThresholdRandomizationPercent / 100.0)),
+      kThresholdRandomizationPercent);
+  threshold = std::min(threshold_bytes, threshold);
+  if (free_space < threshold && !quota_change_callback_.is_null()) {
+    quota_change_callback_.Run();
+  }
+}
+
+void QuotaManager::SetStoragePressureCallback(
+    base::RepeatingCallback<void(url::Origin)> storage_pressure_callback) {
+  storage_pressure_callback_ = storage_pressure_callback;
+  if (origin_for_pending_storage_pressure_callback_.has_value()) {
+    storage_pressure_callback_.Run(
+        std::move(origin_for_pending_storage_pressure_callback_.value()));
+    origin_for_pending_storage_pressure_callback_ = base::nullopt;
+  }
+}
+
+int QuotaManager::GetOverrideHandleId() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return ++next_override_handle_id_;
+}
+
+void QuotaManager::OverrideQuotaForOrigin(int handle_id,
+                                          const url::Origin& origin,
+                                          base::Optional<int64_t> quota_size) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (quota_size.has_value()) {
+    DCHECK_GE(next_override_handle_id_, handle_id);
+    // Bracket notation is safe here because we want to construct a new
+    // QuotaOverride in the case that one does not exist for origin.
+    devtools_overrides_[origin].active_override_session_ids.insert(handle_id);
+    devtools_overrides_[origin].quota_size = quota_size.value();
+  } else {
+    devtools_overrides_.erase(origin);
+  }
+}
+
+void QuotaManager::WithdrawOverridesForHandle(int handle_id) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::vector<url::Origin> origins_to_clear;
+  for (auto& devtools_override : devtools_overrides_) {
+    auto& quota_override = devtools_override.second;
+    auto& origin = devtools_override.first;
+
+    quota_override.active_override_session_ids.erase(handle_id);
+
+    if (!quota_override.active_override_session_ids.size()) {
+      origins_to_clear.push_back(origin);
+    }
+  }
+
+  for (auto& origin : origins_to_clear) {
+    devtools_overrides_.erase(origin);
+  }
+}
+
+base::Optional<int64_t> QuotaManager::GetQuotaOverrideForOrigin(
+    const url::Origin& origin) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!base::Contains(devtools_overrides_, origin)) {
+    return base::nullopt;
+  }
+  return devtools_overrides_[origin].quota_size;
+}
+
+void QuotaManager::SetQuotaChangeCallbackForTesting(
+    base::RepeatingClosure storage_pressure_event_callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  quota_change_callback_ = std::move(storage_pressure_event_callback);
+}
+
+void QuotaManager::ReportHistogram() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!is_incognito_);
+  GetGlobalUsage(
+      StorageType::kTemporary,
+      base::BindOnce(&QuotaManager::DidGetTemporaryGlobalUsageForHistogram,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::DidGetTemporaryGlobalUsageForHistogram(
+    int64_t usage,
+    int64_t unlimited_usage) {
+  GetStorageCapacity(
+      base::BindOnce(&QuotaManager::DidGetStorageCapacityForHistogram,
+                     weak_factory_.GetWeakPtr(), usage));
+}
+
+void QuotaManager::DidGetStorageCapacityForHistogram(int64_t usage,
+                                                     int64_t total_space,
+                                                     int64_t available_space) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage);
+  if (total_space > 0) {
+    UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedForTemporaryStorage2",
+                             static_cast<int>((usage * 100) / total_space));
+    UMA_HISTOGRAM_MBYTES("Quota.AvailableDiskSpace2", available_space);
+    UMA_HISTOGRAM_PERCENTAGE(
+        "Quota.PercentDiskAvailable2",
+        std::min(100, static_cast<int>((available_space * 100 / total_space))));
+  }
+
+  GetGlobalUsage(
+      StorageType::kPersistent,
+      base::BindOnce(&QuotaManager::DidGetPersistentGlobalUsageForHistogram,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::DidGetPersistentGlobalUsageForHistogram(
+    int64_t usage,
+    int64_t unlimited_usage) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfPersistentStorage", usage);
+
+  // We DumpOriginInfoTable last to ensure the trackers caches are loaded.
+  DumpOriginInfoTable(
+      base::BindOnce(&QuotaManager::DidDumpOriginInfoTableForHistogram,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::DidDumpOriginInfoTableForHistogram(
+    const OriginInfoTableEntries& entries) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::map<url::Origin, int64_t> usage_map =
+      GetUsageTracker(StorageType::kTemporary)->GetCachedOriginsUsage();
+  base::Time now = base::Time::Now();
+  for (const auto& info : entries) {
+    if (info.type != StorageType::kTemporary)
+      continue;
+
+    // Ignore stale database entries. If there is no map entry, the origin's
+    // data has been deleted.
+    auto it = usage_map.find(info.origin);
+    if (it == usage_map.end() || it->second == 0)
+      continue;
+
+    base::TimeDelta age = now - std::max(info.last_access_time,
+                                         info.last_modified_time);
+    UMA_HISTOGRAM_COUNTS_1000("Quota.AgeOfOriginInDays", age.InDays());
+
+    int64_t kilobytes = std::max(it->second / INT64_C(1024), INT64_C(1));
+    base::Histogram::FactoryGet(
+        "Quota.AgeOfDataInDays", 1, 1000, 50,
+        base::HistogramBase::kUmaTargetedHistogramFlag)->
+            AddCount(age.InDays(),
+                     base::saturated_cast<int>(kilobytes));
+  }
+}
+
+std::set<url::Origin> QuotaManager::GetEvictionOriginExceptions() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::set<url::Origin> exceptions;
+  for (const auto& p : origins_in_use_) {
+    if (p.second > 0)
+      exceptions.insert(p.first);
+  }
+
+  for (const auto& p : origins_in_error_) {
+    if (p.second > QuotaManager::kThresholdOfErrorsToBeDenylisted)
+      exceptions.insert(p.first);
+  }
+
+  return exceptions;
+}
+
+void QuotaManager::DidGetEvictionOrigin(
+    GetOriginCallback callback,
+    const base::Optional<url::Origin>& origin) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Make sure the returned origin is (still) not in the origin_in_use_ set
+  // and has not been accessed since we posted the task.
+  DCHECK(!origin.has_value() || !origin->GetURL().is_empty());
+  if (origin.has_value() &&
+      (base::Contains(origins_in_use_, *origin) ||
+       base::Contains(access_notified_origins_, *origin))) {
+    std::move(callback).Run(base::nullopt);
+  } else {
+    std::move(callback).Run(origin);
+  }
+  access_notified_origins_.clear();
+
+  is_getting_eviction_origin_ = false;
+}
+
+void QuotaManager::GetEvictionOrigin(
+    StorageType type,
+    int64_t global_quota,
+    GetOriginCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  // This must not be called while there's an in-flight task.
+  DCHECK(!is_getting_eviction_origin_);
+  is_getting_eviction_origin_ = true;
+
+  auto did_get_origin_callback =
+      base::BindOnce(&QuotaManager::DidGetEvictionOrigin,
+                     weak_factory_.GetWeakPtr(), std::move(callback));
+
+  if (!is_database_bootstrapped_ && !eviction_disabled_) {
+    // Once bootstrapped, GetLRUOrigin will be called.
+    GetGlobalUsage(StorageType::kTemporary,
+                   base::BindOnce(&QuotaManager::BootstrapDatabaseForEviction,
+                                  weak_factory_.GetWeakPtr(),
+                                  std::move(did_get_origin_callback)));
+    return;
+  }
+
+  GetLRUOrigin(type, std::move(did_get_origin_callback));
+}
+
+void QuotaManager::EvictOriginData(const url::Origin& origin,
+                                   StorageType type,
+                                   StatusCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+  DCHECK_EQ(type, StorageType::kTemporary);
+
+  eviction_context_.evicted_origin = origin;
+  eviction_context_.evicted_type = type;
+  eviction_context_.evict_origin_data_callback = std::move(callback);
+
+  DeleteOriginDataInternal(origin, type, AllQuotaClientTypes(), true,
+                           base::BindOnce(&QuotaManager::DidOriginDataEvicted,
+                                          weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::GetEvictionRoundInfo(EvictionRoundInfoCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(io_thread_->BelongsToCurrentThread());
+  LazyInitialize();
+  EvictionRoundInfoHelper* helper =
+      new EvictionRoundInfoHelper(this, std::move(callback));
+  helper->Start();
+}
+
+void QuotaManager::GetLRUOrigin(StorageType type, GetOriginCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  LazyInitialize();
+  // This must not be called while there's an in-flight task.
+  DCHECK(lru_origin_callback_.is_null());
+  lru_origin_callback_ = std::move(callback);
+  if (db_disabled_) {
+    std::move(lru_origin_callback_).Run(base::nullopt);
+    return;
+  }
+
+  auto origin = std::make_unique<base::Optional<url::Origin>>();
+  auto* origin_ptr = origin.get();
+  PostTaskAndReplyWithResultForDBThread(
+      FROM_HERE,
+      base::BindOnce(&GetLRUOriginOnDBThread, type,
+                     GetEvictionOriginExceptions(),
+                     base::RetainedRef(special_storage_policy_),
+                     base::Unretained(origin_ptr)),
+      base::BindOnce(&QuotaManager::DidGetLRUOrigin, weak_factory_.GetWeakPtr(),
+                     std::move(origin)));
+}
+
+void QuotaManager::DidGetPersistentHostQuota(const std::string& host,
+                                             const int64_t* quota,
+                                             bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DidDatabaseWork(success);
+  persistent_host_quota_callbacks_.Run(
+      host, blink::mojom::QuotaStatusCode::kOk,
+      std::min(*quota, kPerHostPersistentQuotaLimit));
+}
+
+void QuotaManager::DidSetPersistentHostQuota(const std::string& host,
+                                             QuotaCallback callback,
+                                             const int64_t* new_quota,
+                                             bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DidDatabaseWork(success);
+  std::move(callback).Run(
+      success ? blink::mojom::QuotaStatusCode::kOk
+              : blink::mojom::QuotaStatusCode::kErrorInvalidAccess,
+      *new_quota);
+}
+
+void QuotaManager::DidGetLRUOrigin(
+    std::unique_ptr<base::Optional<url::Origin>> origin,
+    bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DidDatabaseWork(success);
+
+  std::move(lru_origin_callback_).Run(*origin);
+}
+
+namespace {
+void DidGetSettingsThreadAdapter(base::TaskRunner* task_runner,
+                                 OptionalQuotaSettingsCallback callback,
+                                 base::Optional<QuotaSettings> settings) {
+  task_runner->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), std::move(settings)));
+}
+}  // namespace
+
+void QuotaManager::GetQuotaSettings(QuotaSettingsCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (base::TimeTicks::Now() - settings_timestamp_ <
+      settings_.refresh_interval) {
+    std::move(callback).Run(settings_);
+    return;
+  }
+
+  if (!settings_callbacks_.Add(std::move(callback)))
+    return;
+
+  // We invoke our clients GetQuotaSettingsFunc on the
+  // UI thread and plumb the resulting value back to this thread.
+  get_settings_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(
+          get_settings_function_,
+          base::BindOnce(&DidGetSettingsThreadAdapter,
+                         base::RetainedRef(base::ThreadTaskRunnerHandle::Get()),
+                         base::BindOnce(&QuotaManager::DidGetSettings,
+                                        weak_factory_.GetWeakPtr()))));
+}
+
+void QuotaManager::DidGetSettings(base::Optional<QuotaSettings> settings) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!settings) {
+    settings = settings_;
+    settings->refresh_interval = base::TimeDelta::FromMinutes(1);
+  }
+  SetQuotaSettings(*settings);
+  settings_callbacks_.Run(*settings);
+  UMA_HISTOGRAM_MBYTES("Quota.GlobalTemporaryPoolSize", settings->pool_size);
+  LOG_IF(WARNING, settings->pool_size == 0)
+      << "No storage quota provided in QuotaSettings.";
+}
+
+void QuotaManager::GetStorageCapacity(StorageCapacityCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!storage_capacity_callbacks_.Add(std::move(callback)))
+    return;
+  if (is_incognito_) {
+    GetQuotaSettings(
+        base::BindOnce(&QuotaManager::ContinueIncognitoGetStorageCapacity,
+                       weak_factory_.GetWeakPtr()));
+    return;
+  }
+  base::PostTaskAndReplyWithResult(
+      db_runner_.get(), FROM_HERE,
+      base::BindOnce(&QuotaManager::CallGetVolumeInfo, get_volume_info_fn_,
+                     profile_path_),
+      base::BindOnce(&QuotaManager::DidGetStorageCapacity,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void QuotaManager::ContinueIncognitoGetStorageCapacity(
+    const QuotaSettings& settings) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  int64_t current_usage =
+      GetUsageTracker(StorageType::kTemporary)->GetCachedUsage();
+  current_usage += GetUsageTracker(StorageType::kPersistent)->GetCachedUsage();
+  int64_t available_space =
+      std::max(INT64_C(0), settings.pool_size - current_usage);
+  DidGetStorageCapacity(std::make_tuple(settings.pool_size, available_space));
+}
+
+void QuotaManager::DidGetStorageCapacity(
+    const std::tuple<int64_t, int64_t>& total_and_available) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  int64_t total_space = std::get<0>(total_and_available);
+  int64_t available_space = std::get<1>(total_and_available);
+  cached_disk_stats_for_storage_pressure_ =
+      std::make_tuple(base::TimeTicks::Now(), total_space, available_space);
+  storage_capacity_callbacks_.Run(total_space, available_space);
+  DetermineStoragePressure(total_space, available_space);
+}
+
+void QuotaManager::DidDatabaseWork(bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  db_disabled_ = !success;
+}
+
+void QuotaManager::PostTaskAndReplyWithResultForDBThread(
+    const base::Location& from_here,
+    base::OnceCallback<bool(QuotaDatabase*)> task,
+    base::OnceCallback<void(bool)> reply) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Deleting manager will post another task to DB sequence to delete
+  // |database_|, therefore we can be sure that database_ is alive when this
+  // task runs.
+  base::PostTaskAndReplyWithResult(
+      db_runner_.get(), from_here,
+      base::BindOnce(std::move(task), base::Unretained(database_.get())),
+      std::move(reply));
+}
+
+// static
+std::tuple<int64_t, int64_t> QuotaManager::CallGetVolumeInfo(
+    GetVolumeInfoFn get_volume_info_fn,
+    const base::FilePath& path) {
+  if (!base::CreateDirectory(path)) {
+    LOG(WARNING) << "Create directory failed for path" << path.value();
+    return std::make_tuple<int64_t, int64_t>(0, 0);
+  }
+  int64_t total;
+  int64_t available;
+  std::tie(total, available) = get_volume_info_fn(path);
+  if (total < 0 || available < 0) {
+    LOG(WARNING) << "Unable to get volume info: " << path.value();
+    return std::make_tuple<int64_t, int64_t>(0, 0);
+  }
+  UMA_HISTOGRAM_MBYTES("Quota.TotalDiskSpace", total);
+  UMA_HISTOGRAM_MBYTES("Quota.AvailableDiskSpace", available);
+  if (total > 0) {
+    UMA_HISTOGRAM_PERCENTAGE("Quota.PercentDiskAvailable",
+        std::min(100, static_cast<int>((available * 100) / total)));
+  }
+  return std::make_tuple(total, available);
+}
+
+// static
+std::tuple<int64_t, int64_t> QuotaManager::GetVolumeInfo(
+    const base::FilePath& path) {
+  return std::make_tuple(base::SysInfo::AmountOfTotalDiskSpace(path),
+                         base::SysInfo::AmountOfFreeDiskSpace(path));
+}
+
+}  // namespace storage
diff --git a/storage/browser/quota/quota_manager_impl.h b/storage/browser/quota/quota_manager_impl.h
new file mode 100644
index 0000000..9d72d69
--- /dev/null
+++ b/storage/browser/quota/quota_manager_impl.h
@@ -0,0 +1,611 @@
+// Copyright 2013 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 STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_IMPL_H_
+#define STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_IMPL_H_
+
+#include <stdint.h>
+
+#include <list>
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <tuple>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/component_export.h"
+#include "base/containers/contains.h"
+#include "base/containers/flat_set.h"
+#include "base/files/file_path.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/ref_counted_delete_on_sequence.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/sequence_checker.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "components/services/storage/public/mojom/quota_client.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "storage/browser/quota/quota_callbacks.h"
+#include "storage/browser/quota/quota_client.h"
+#include "storage/browser/quota/quota_client_type.h"
+#include "storage/browser/quota/quota_database.h"
+#include "storage/browser/quota/quota_settings.h"
+#include "storage/browser/quota/quota_task.h"
+#include "storage/browser/quota/special_storage_policy.h"
+#include "third_party/blink/public/mojom/quota/quota_types.mojom-forward.h"
+#include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
+#include "url/origin.h"
+
+namespace base {
+class SequencedTaskRunner;
+class SingleThreadTaskRunner;
+class TaskRunner;
+}  // namespace base
+
+namespace quota_internals {
+class QuotaInternalsProxy;
+}  // namespace quota_internals
+
+namespace storage {
+
+class QuotaManagerProxy;
+class QuotaOverrideHandle;
+class QuotaTemporaryStorageEvictor;
+class UsageTracker;
+
+// An interface called by QuotaTemporaryStorageEvictor. This is a grab bag of
+// methods called by QuotaTemporaryStorageEvictor that need to be stubbed for
+// testing.
+class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaEvictionHandler {
+ public:
+  using EvictionRoundInfoCallback =
+      base::OnceCallback<void(blink::mojom::QuotaStatusCode status,
+                              const QuotaSettings& settings,
+                              int64_t available_space,
+                              int64_t total_space,
+                              int64_t global_usage,
+                              bool global_usage_is_complete)>;
+
+  // Called at the beginning of an eviction round to gather the info about
+  // the current settings, capacity, and usage.
+  virtual void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) = 0;
+
+  // Returns next origin to evict, or nullopt if there are no evictable
+  // origins.
+  virtual void GetEvictionOrigin(blink::mojom::StorageType type,
+                                 int64_t global_quota,
+                                 GetOriginCallback callback) = 0;
+
+  // Called to evict an origin.
+  virtual void EvictOriginData(const url::Origin& origin,
+                               blink::mojom::StorageType type,
+                               StatusCallback callback) = 0;
+
+ protected:
+  virtual ~QuotaEvictionHandler() = default;
+};
+
+struct UsageInfo {
+  UsageInfo(std::string host, blink::mojom::StorageType type, int64_t usage)
+      : host(std::move(host)), type(type), usage(usage) {}
+  const std::string host;
+  const blink::mojom::StorageType type;
+  const int64_t usage;
+};
+
+// Entry point into the Quota System
+//
+// Each StoragePartition has exactly one QuotaManager instance, which
+// coordinates quota across the Web platform features subject to quota.
+// Each storage system interacts with quota via their own implementations of
+// the QuotaClient interface.
+//
+// The class sets limits and defines the parameters of the systems heuristics.
+// QuotaManager coordinates clients to orchestrate the collection of usage
+// information, enforce quota limits, and evict stale data.
+//
+// The constructor and proxy() methods can be called on any thread. All other
+// methods must be called on the IO thread.
+class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaManager
+    : public QuotaTaskObserver,
+      public QuotaEvictionHandler,
+      public base::RefCountedDeleteOnSequence<QuotaManager> {
+ public:
+  using UsageAndQuotaCallback = base::OnceCallback<
+      void(blink::mojom::QuotaStatusCode, int64_t usage, int64_t quota)>;
+
+  using UsageAndQuotaWithBreakdownCallback =
+      base::OnceCallback<void(blink::mojom::QuotaStatusCode,
+                              int64_t usage,
+                              int64_t quota,
+                              blink::mojom::UsageBreakdownPtr usage_breakdown)>;
+
+  using UsageAndQuotaForDevtoolsCallback =
+      base::OnceCallback<void(blink::mojom::QuotaStatusCode,
+                              int64_t usage,
+                              int64_t quota,
+                              bool is_override_enabled,
+                              blink::mojom::UsageBreakdownPtr usage_breakdown)>;
+
+  // Function pointer type used to store the function which returns
+  // information about the volume containing the given FilePath.
+  // The value returned is std::tuple<total_space, available_space>.
+  using GetVolumeInfoFn =
+      std::tuple<int64_t, int64_t> (*)(const base::FilePath&);
+
+  static constexpr int64_t kGBytes = 1024 * 1024 * 1024;
+  static constexpr int64_t kNoLimit = INT64_MAX;
+  static constexpr int64_t kMBytes = 1024 * 1024;
+  static constexpr int kMinutesInMilliSeconds = 60 * 1000;
+
+  QuotaManager(bool is_incognito,
+               const base::FilePath& profile_path,
+               scoped_refptr<base::SingleThreadTaskRunner> io_thread,
+               base::RepeatingClosure quota_change_callback,
+               scoped_refptr<SpecialStoragePolicy> special_storage_policy,
+               const GetQuotaSettingsFunc& get_settings_function);
+  QuotaManager(const QuotaManager&) = delete;
+  QuotaManager& operator=(const QuotaManager&) = delete;
+
+  const QuotaSettings& settings() const { return settings_; }
+  void SetQuotaSettings(const QuotaSettings& settings);
+
+  // Returns a proxy object that can be used on any thread.
+  QuotaManagerProxy* proxy() { return proxy_.get(); }
+
+  // Called by clients or webapps. Returns usage per host.
+  void GetUsageInfo(GetUsageInfoCallback callback);
+
+  // Called by Web Apps (deprecated quota API).
+  // This method is declared as virtual to allow test code to override it.
+  virtual void GetUsageAndQuotaForWebApps(const url::Origin& origin,
+                                          blink::mojom::StorageType type,
+                                          UsageAndQuotaCallback callback);
+
+  // Called by Web Apps (navigator.storage.estimate())
+  // This method is declared as virtual to allow test code to override it.
+  virtual void GetUsageAndQuotaWithBreakdown(
+      const url::Origin& origin,
+      blink::mojom::StorageType type,
+      UsageAndQuotaWithBreakdownCallback callback);
+
+  // Called by DevTools.
+  virtual void GetUsageAndQuotaForDevtools(
+      const url::Origin& origin,
+      blink::mojom::StorageType type,
+      UsageAndQuotaForDevtoolsCallback callback);
+
+  // Called by storage backends.
+  //
+  // For UnlimitedStorage origins, this version skips usage and quota handling
+  // to avoid extra query cost. Do not call this method for apps/user-facing
+  // code.
+  //
+  // This method is declared as virtual to allow test code to override it.
+  virtual void GetUsageAndQuota(const url::Origin& origin,
+                                blink::mojom::StorageType type,
+                                UsageAndQuotaCallback callback);
+
+  // Called by storage backends via proxy.
+  //
+  // Quota-managed storage backends should call this method when storage is
+  // accessed. Used to maintain LRU ordering.
+  void NotifyStorageAccessed(const url::Origin& origin,
+                             blink::mojom::StorageType type,
+                             base::Time access_time);
+
+  // Called by storage backends via proxy.
+  //
+  // Quota-managed storage backends must call this method when they have made
+  // any modifications that change the amount of data stored in their storage.
+  void NotifyStorageModified(QuotaClientType client_id,
+                             const url::Origin& origin,
+                             blink::mojom::StorageType type,
+                             int64_t delta,
+                             base::Time modification_time);
+
+  // Called by storage backends via proxy.
+  //
+  // Client storage must call this method whenever they run into disk
+  // write errors. Used as a hint to determine if the storage partition is out
+  // of space, and trigger actions if deemed appropriate.
+  //
+  // This method is declared as virtual to allow test code to override it.
+  virtual void NotifyWriteFailed(const url::Origin& origin);
+
+  // Used to avoid evicting origins with open pages.
+  // A call to NotifyOriginInUse must be balanced by a later call
+  // to NotifyOriginNoLongerInUse.
+  void NotifyOriginInUse(const url::Origin& origin);
+  void NotifyOriginNoLongerInUse(const url::Origin& origin);
+  bool IsOriginInUse(const url::Origin& origin) const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return base::Contains(origins_in_use_, origin);
+  }
+
+  void SetUsageCacheEnabled(QuotaClientType client_id,
+                            const url::Origin& origin,
+                            blink::mojom::StorageType type,
+                            bool enabled);
+
+  // DeleteOriginData and DeleteHostData (surprisingly enough) delete data of a
+  // particular blink::mojom::StorageType associated with either a specific
+  // origin or set of origins. Each method additionally requires a
+  // |quota_client_types| which specifies the types of QuotaClients to delete
+  // from the origin. Pass in QuotaClientType::AllClients() to remove all
+  // clients from the origin, regardless of type.
+  virtual void DeleteOriginData(const url::Origin& origin,
+                                blink::mojom::StorageType type,
+                                QuotaClientTypes quota_client_types,
+                                StatusCallback callback);
+  void DeleteHostData(const std::string& host,
+                      blink::mojom::StorageType type,
+                      QuotaClientTypes quota_client_types,
+                      StatusCallback callback);
+
+  // Instructs each QuotaClient to remove possible traces of deleted
+  // data on the disk.
+  void PerformStorageCleanup(blink::mojom::StorageType type,
+                             QuotaClientTypes quota_client_types,
+                             base::OnceClosure callback);
+
+  // Called by UI and internal modules.
+  void GetPersistentHostQuota(const std::string& host, QuotaCallback callback);
+  void SetPersistentHostQuota(const std::string& host,
+                              int64_t new_quota,
+                              QuotaCallback callback);
+  void GetGlobalUsage(blink::mojom::StorageType type,
+                      GlobalUsageCallback callback);
+  void GetHostUsageWithBreakdown(const std::string& host,
+                                 blink::mojom::StorageType type,
+                                 UsageWithBreakdownCallback callback);
+
+  std::map<std::string, std::string> GetStatistics();
+
+  bool IsStorageUnlimited(const url::Origin& origin,
+                          blink::mojom::StorageType type) const;
+
+  virtual void GetOriginsModifiedBetween(blink::mojom::StorageType type,
+                                         base::Time begin,
+                                         base::Time end,
+                                         GetOriginsCallback callback);
+
+  bool ResetUsageTracker(blink::mojom::StorageType type);
+
+  // Called when StoragePartition is initialized if embedder has an
+  // implementation of StorageNotificationService.
+  void SetStoragePressureCallback(
+      base::RepeatingCallback<void(url::Origin)> storage_pressure_callback);
+
+  // DevTools Quota Override methods:
+  int GetOverrideHandleId();
+  void OverrideQuotaForOrigin(int handle_id,
+                              const url::Origin& origin,
+                              base::Optional<int64_t> quota_size);
+  // Called when a DevTools client releases all overrides, however, overrides
+  // will not be disabled for any origins for which there are other DevTools
+  // clients/QuotaOverrideHandle with an active override.
+  void WithdrawOverridesForHandle(int handle_id);
+
+  // Cap size for per-host persistent quota determined by the histogram.
+  // Cap size for per-host persistent quota determined by the histogram.
+  // This is a bit lax value because the histogram says nothing about per-host
+  // persistent storage usage and we determined by global persistent storage
+  // usage that is less than 10GB for almost all users.
+  static constexpr int64_t kPerHostPersistentQuotaLimit = 10 * 1024 * kMBytes;
+
+  static constexpr int kEvictionIntervalInMilliSeconds =
+      30 * kMinutesInMilliSeconds;
+  static constexpr int kThresholdOfErrorsToBeDenylisted = 3;
+  static constexpr int kThresholdRandomizationPercent = 5;
+
+  static constexpr char kDatabaseName[] = "QuotaManager";
+  static constexpr char kDaysBetweenRepeatedOriginEvictionsHistogram[] =
+      "Quota.DaysBetweenRepeatedOriginEvictions";
+  static constexpr char kEvictedOriginAccessedCountHistogram[] =
+      "Quota.EvictedOriginAccessCount";
+  static constexpr char kEvictedOriginDaysSinceAccessHistogram[] =
+      "Quota.EvictedOriginDaysSinceAccess";
+
+  // Kept non-const so that test code can change the value.
+  // TODO(kinuko): Make this a real const value and add a proper way to set
+  // the quota for syncable storage. (http://crbug.com/155488)
+  static int64_t kSyncableStorageDefaultHostQuota;
+
+  void DisableDatabaseForTesting() { db_disabled_ = true; }
+
+  void SetGetVolumeInfoFnForTesting(GetVolumeInfoFn fn) {
+    get_volume_info_fn_ = fn;
+  }
+
+ protected:
+  ~QuotaManager() override;
+  void SetQuotaChangeCallbackForTesting(
+      base::RepeatingClosure storage_pressure_event_callback);
+
+ private:
+  friend class base::DeleteHelper<QuotaManager>;
+  friend class base::RefCountedDeleteOnSequence<QuotaManager>;
+  friend class quota_internals::QuotaInternalsProxy;
+  friend class MockQuotaManager;
+  friend class MockQuotaClient;
+  friend class QuotaManagerProxy;
+  friend class QuotaManagerTest;
+  friend class QuotaTemporaryStorageEvictor;
+
+  class EvictionRoundInfoHelper;
+  class UsageAndQuotaInfoGatherer;
+  class GetUsageInfoTask;
+  class OriginDataDeleter;
+  class HostDataDeleter;
+  class GetModifiedSinceHelper;
+  class DumpQuotaTableHelper;
+  class DumpOriginInfoTableHelper;
+  class StorageCleanupHelper;
+
+  struct QuotaOverride {
+    QuotaOverride();
+    ~QuotaOverride();
+
+    QuotaOverride(const QuotaOverride& quota_override) = delete;
+    QuotaOverride& operator=(const QuotaOverride&) = delete;
+
+    int64_t quota_size;
+
+    // Keeps track of the DevTools clients that have an active override.
+    std::set<int> active_override_session_ids;
+  };
+
+  using QuotaTableEntry = QuotaDatabase::QuotaTableEntry;
+  using OriginInfoTableEntry = QuotaDatabase::OriginInfoTableEntry;
+  using QuotaTableEntries = std::vector<QuotaTableEntry>;
+  using OriginInfoTableEntries = std::vector<OriginInfoTableEntry>;
+
+  using QuotaSettingsCallback = base::OnceCallback<void(const QuotaSettings&)>;
+
+  using DumpQuotaTableCallback =
+      base::OnceCallback<void(const QuotaTableEntries&)>;
+  using DumpOriginInfoTableCallback =
+      base::OnceCallback<void(const OriginInfoTableEntries&)>;
+
+  // The values returned total_space, available_space.
+  using StorageCapacityCallback = base::OnceCallback<void(int64_t, int64_t)>;
+
+  struct EvictionContext {
+    EvictionContext();
+    ~EvictionContext();
+    url::Origin evicted_origin;
+    blink::mojom::StorageType evicted_type;
+    StatusCallback evict_origin_data_callback;
+  };
+
+  // Lazily called on the IO thread when the first quota manager API is called.
+  //
+  // Initialize() must be called after all quota clients are added to the
+  // manager by RegisterClient().
+  void LazyInitialize();
+  void FinishLazyInitialize(bool is_database_bootstraped);
+  void BootstrapDatabaseForEviction(GetOriginCallback did_get_origin_callback,
+                                    int64_t unused_usage,
+                                    int64_t unused_unlimited_usage);
+  void DidBootstrapDatabase(GetOriginCallback did_get_origin_callback,
+                            bool success);
+
+  // Called by clients via proxy.
+  // Registers a quota client to the manager.
+  void RegisterClient(
+      mojo::PendingRemote<mojom::QuotaClient> client,
+      QuotaClientType client_type,
+      const std::vector<blink::mojom::StorageType>& storage_types);
+
+  // Legacy overload for QuotaClients that have not been mojofied yet.
+  //
+  // TODO(crbug.com/1163009): Remove this overload after all QuotaClients have
+  //                          been mojofied.
+  void RegisterLegacyClient(
+      scoped_refptr<QuotaClient> client,
+      QuotaClientType client_type,
+      const std::vector<blink::mojom::StorageType>& storage_types);
+
+  UsageTracker* GetUsageTracker(blink::mojom::StorageType type) const;
+
+  // Extract cached origins list from the usage tracker.
+  // (Might return empty list if no origin is tracked by the tracker.)
+  std::set<url::Origin> GetCachedOrigins(blink::mojom::StorageType type);
+
+  void DumpQuotaTable(DumpQuotaTableCallback callback);
+  void DumpOriginInfoTable(DumpOriginInfoTableCallback callback);
+
+  void DeleteOriginDataInternal(const url::Origin& origin,
+                                blink::mojom::StorageType type,
+                                QuotaClientTypes quota_client_types,
+                                bool is_eviction,
+                                StatusCallback callback);
+
+  // Methods for eviction logic.
+  void StartEviction();
+  void DeleteOriginFromDatabase(const url::Origin& origin,
+                                blink::mojom::StorageType type,
+                                bool is_eviction);
+
+  void DidOriginDataEvicted(blink::mojom::QuotaStatusCode status);
+
+  void ReportHistogram();
+  void DidGetTemporaryGlobalUsageForHistogram(int64_t usage,
+                                              int64_t unlimited_usage);
+  void DidGetStorageCapacityForHistogram(int64_t usage,
+                                         int64_t total_space,
+                                         int64_t available_space);
+  void DidGetPersistentGlobalUsageForHistogram(int64_t usage,
+                                               int64_t unlimited_usage);
+  void DidDumpOriginInfoTableForHistogram(
+      const OriginInfoTableEntries& entries);
+
+  std::set<url::Origin> GetEvictionOriginExceptions();
+  void DidGetEvictionOrigin(GetOriginCallback callback,
+                            const base::Optional<url::Origin>& origin);
+
+  // QuotaEvictionHandler.
+  void GetEvictionOrigin(blink::mojom::StorageType type,
+                         int64_t global_quota,
+                         GetOriginCallback callback) override;
+  void EvictOriginData(const url::Origin& origin,
+                       blink::mojom::StorageType type,
+                       StatusCallback callback) override;
+  void GetEvictionRoundInfo(EvictionRoundInfoCallback callback) override;
+
+  void GetLRUOrigin(blink::mojom::StorageType type, GetOriginCallback callback);
+
+  void DidGetPersistentHostQuota(const std::string& host,
+                                 const int64_t* quota,
+                                 bool success);
+  void DidSetPersistentHostQuota(const std::string& host,
+                                 QuotaCallback callback,
+                                 const int64_t* new_quota,
+                                 bool success);
+  void DidGetLRUOrigin(std::unique_ptr<base::Optional<url::Origin>> origin,
+                       bool success);
+  void GetQuotaSettings(QuotaSettingsCallback callback);
+  void DidGetSettings(base::Optional<QuotaSettings> settings);
+  void GetStorageCapacity(StorageCapacityCallback callback);
+  void ContinueIncognitoGetStorageCapacity(const QuotaSettings& settings);
+  void DidGetStorageCapacity(
+      const std::tuple<int64_t, int64_t>& total_and_available);
+
+  void DidDatabaseWork(bool success);
+
+  void DeleteOnCorrectThread() const;
+
+  void MaybeRunStoragePressureCallback(const url::Origin& origin,
+                                       int64_t total_space,
+                                       int64_t available_space);
+  // Used from quota-internals page to test behavior of the storage pressure
+  // callback.
+  void SimulateStoragePressure(const url::Origin origin);
+
+  // Evaluates disk statistics to identify storage pressure
+  // (low disk space availability) and starts the storage
+  // pressure event dispatch if appropriate.
+  // TODO(crbug.com/1088004): Implement UsageAndQuotaInfoGatherer::Completed()
+  // to use DetermineStoragePressure().
+  // TODO(crbug.com/1102433): Define and explain StoragePressure in the README.
+  void DetermineStoragePressure(int64_t free_space, int64_t total_space);
+
+  base::Optional<int64_t> GetQuotaOverrideForOrigin(const url::Origin&);
+
+  void PostTaskAndReplyWithResultForDBThread(
+      const base::Location& from_here,
+      base::OnceCallback<bool(QuotaDatabase*)> task,
+      base::OnceCallback<void(bool)> reply);
+
+  static std::tuple<int64_t, int64_t> CallGetVolumeInfo(
+      GetVolumeInfoFn get_volume_info_fn,
+      const base::FilePath& path);
+  static std::tuple<int64_t, int64_t> GetVolumeInfo(const base::FilePath& path);
+
+  const bool is_incognito_;
+  const base::FilePath profile_path_;
+
+  // This member is thread-safe. The scoped_refptr is immutable (the object it
+  // points to never changes), and the underlying object is thread-safe.
+  const scoped_refptr<QuotaManagerProxy> proxy_;
+
+  bool db_disabled_;
+  bool eviction_disabled_;
+  base::Optional<url::Origin> origin_for_pending_storage_pressure_callback_;
+  scoped_refptr<base::SingleThreadTaskRunner> io_thread_;
+  scoped_refptr<base::SequencedTaskRunner> db_runner_;
+  mutable std::unique_ptr<QuotaDatabase> database_;
+  bool is_database_bootstrapped_ = false;
+
+  GetQuotaSettingsFunc get_settings_function_;
+  scoped_refptr<base::TaskRunner> get_settings_task_runner_;
+  base::RepeatingCallback<void(url::Origin)> storage_pressure_callback_;
+  base::RepeatingClosure quota_change_callback_;
+  QuotaSettings settings_;
+  base::TimeTicks settings_timestamp_;
+  std::tuple<base::TimeTicks, int64_t, int64_t>
+      cached_disk_stats_for_storage_pressure_;
+  CallbackQueue<QuotaSettingsCallback, const QuotaSettings&>
+      settings_callbacks_;
+  CallbackQueue<StorageCapacityCallback, int64_t, int64_t>
+      storage_capacity_callbacks_;
+
+  GetOriginCallback lru_origin_callback_;
+  std::set<url::Origin> access_notified_origins_;
+
+  std::map<url::Origin, QuotaOverride> devtools_overrides_;
+  int next_override_handle_id_ = 0;
+
+  // Owns the QuotaClient remotes registered via RegisterClient().
+  //
+  // Iterating over this list is almost always incorrect. Most algorithms should
+  // iterate over an entry in |client_types_|.
+  //
+  // TODO(crbug.com/1016065): Handle Storage Service crashes. Will likely entail
+  //                          using a mojo::RemoteSet here.
+  std::vector<mojo::Remote<mojom::QuotaClient>> clients_for_ownership_;
+
+  // Owns the QuotaClient instances registered by RegisterLegacyClient() and
+  // their wrappers.
+  //
+  // TODO(crbug.com/1163009): Remove this member after all QuotaClients have
+  //                          been mojofied.
+  std::vector<scoped_refptr<QuotaClient>> legacy_clients_for_ownership_;
+
+  // Maps QuotaClient instances to client types.
+  //
+  // The QuotaClient instances pointed to by the map keys are guaranteed to be
+  // alive, because they are owned by `legacy_clients_for_ownership_`.
+  //
+  // TODO(crbug.com/1163009): Replace the map key with mojom::QuotaClient* after
+  //                          all QuotaClients have been mojofied.
+  base::flat_map<blink::mojom::StorageType,
+                 base::flat_map<QuotaClient*, QuotaClientType>>
+      client_types_;
+
+  std::unique_ptr<UsageTracker> temporary_usage_tracker_;
+  std::unique_ptr<UsageTracker> persistent_usage_tracker_;
+  std::unique_ptr<UsageTracker> syncable_usage_tracker_;
+  // TODO(michaeln): Need a way to clear the cache, drop and
+  // reinstantiate the trackers when they're not handling requests.
+
+  std::unique_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_;
+  EvictionContext eviction_context_;
+  bool is_getting_eviction_origin_;
+
+  CallbackQueueMap<QuotaCallback,
+                   std::string,
+                   blink::mojom::QuotaStatusCode,
+                   int64_t>
+      persistent_host_quota_callbacks_;
+
+  // Map from origin to count.
+  std::map<url::Origin, int> origins_in_use_;
+  // Map from origin to error count.
+  std::map<url::Origin, int> origins_in_error_;
+
+  scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
+
+  base::RepeatingTimer histogram_timer_;
+
+  // Pointer to the function used to get volume information. This is
+  // overwritten by QuotaManagerTest in order to attain deterministic reported
+  // values. The default value points to QuotaManager::GetVolumeInfo.
+  GetVolumeInfoFn get_volume_info_fn_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  base::WeakPtrFactory<QuotaManager> weak_factory_{this};
+};
+
+}  // namespace storage
+
+#endif  // STORAGE_BROWSER_QUOTA_QUOTA_MANAGER_IMPL_H_
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index f2a833f..278f19cd 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -256,11 +256,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -270,7 +270,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -334,11 +334,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -348,7 +348,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -471,7 +471,7 @@
       },
       {
         "args": [
-          "--webview-apk-path=apks/AOSP_SystemWebView.apk",
+          "--webview-apk-path=apks/AOSP_SystemWebview.apk",
           "--test-runner-outdir",
           ".",
           "--client-outdir",
@@ -490,11 +490,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -504,7 +504,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -549,7 +549,7 @@
       },
       {
         "args": [
-          "--webview-apk-path=apks/AOSP_SystemWebView.apk",
+          "--webview-apk-path=apks/AOSP_SystemWebview.apk",
           "--test-runner-outdir",
           ".",
           "--client-outdir",
@@ -568,11 +568,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -582,7 +582,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -728,11 +728,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -742,7 +742,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -806,11 +806,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -820,7 +820,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -943,7 +943,7 @@
       },
       {
         "args": [
-          "--webview-apk-path=apks/AOSP_SystemWebView.apk",
+          "--webview-apk-path=apks/AOSP_SystemWebview.apk",
           "--test-runner-outdir",
           ".",
           "--client-outdir",
@@ -962,11 +962,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -976,7 +976,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1021,7 +1021,7 @@
       },
       {
         "args": [
-          "--webview-apk-path=apks/AOSP_SystemWebView.apk",
+          "--webview-apk-path=apks/AOSP_SystemWebview.apk",
           "--test-runner-outdir",
           ".",
           "--client-outdir",
@@ -1040,11 +1040,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -1054,7 +1054,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1263,11 +1263,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -1277,7 +1277,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1341,11 +1341,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -1355,7 +1355,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1497,11 +1497,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -1511,7 +1511,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1575,11 +1575,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -1589,7 +1589,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1798,11 +1798,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -1812,7 +1812,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1876,11 +1876,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -1890,7 +1890,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -2032,11 +2032,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.101",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.118",
         "resultdb": {
           "enable": true
         },
@@ -2046,7 +2046,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.101"
+              "revision": "version:88.0.4324.118"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -2110,11 +2110,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.9",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 89.0.4389.23",
         "resultdb": {
           "enable": true
         },
@@ -2124,7 +2124,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.9"
+              "revision": "version:89.0.4389.23"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 7d04946e..9b01a03 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1,6 +1,19 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
+  "Linux Builder (reclient)": {
+    "additional_compile_targets": [
+      "all"
+    ],
+    "scripts": [
+      {
+        "isolate_profile_data": true,
+        "name": "check_network_annotations",
+        "script": "check_network_annotations.py",
+        "swarming": {}
+      }
+    ]
+  },
   "Linux Viz": {
     "additional_compile_targets": [
       "all"
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 966cc54..99227ee 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -309,7 +309,7 @@
   },
   'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MILESTONE': {
     'args': [
-      '--webview-apk-path=apks/AOSP_SystemWebView.apk',
+      '--webview-apk-path=apks/AOSP_SystemWebview.apk',
       '--test-runner-outdir',
       '.',
       '--client-outdir',
@@ -320,20 +320,20 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=89',
     ],
-    'identifier': 'Implementation Tests For 89.0.4389.9',
+    'identifier': 'Implementation Tests For 89.0.4389.23',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.9',
+          'revision': 'version:89.0.4389.23',
         }
       ],
     },
   },
   'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': {
     'args': [
-      '--webview-apk-path=apks/AOSP_SystemWebView.apk',
+      '--webview-apk-path=apks/AOSP_SystemWebview.apk',
       '--test-runner-outdir',
       '.',
       '--client-outdir',
@@ -344,13 +344,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=88',
     ],
-    'identifier': 'Implementation Tests For 88.0.4324.101',
+    'identifier': 'Implementation Tests For 88.0.4324.118',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.101',
+          'revision': 'version:88.0.4324.118',
         }
       ],
     },
@@ -392,13 +392,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=89',
     ],
-    'identifier': 'Implementation Tests For 89.0.4389.9',
+    'identifier': 'Implementation Tests For 89.0.4389.23',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.9',
+          'revision': 'version:89.0.4389.23',
         }
       ],
     },
@@ -416,13 +416,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=88',
     ],
-    'identifier': 'Implementation Tests For 88.0.4324.101',
+    'identifier': 'Implementation Tests For 88.0.4324.118',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.101',
+          'revision': 'version:88.0.4324.118',
         }
       ],
     },
@@ -464,13 +464,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=89',
     ],
-    'identifier': 'Client Tests For 89.0.4389.9',
+    'identifier': 'Client Tests For 89.0.4389.23',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.9',
+          'revision': 'version:89.0.4389.23',
         }
       ],
     },
@@ -488,13 +488,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=88',
     ],
-    'identifier': 'Client Tests For 88.0.4324.101',
+    'identifier': 'Client Tests For 88.0.4324.118',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.101',
+          'revision': 'version:88.0.4324.118',
         }
       ],
     },
@@ -538,4 +538,4 @@
     },
     'identifier': 'OCTOPUS_TOT-1',
   },
-}
+}
\ No newline at end of file
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 7cb6720b..47e63eed 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2485,6 +2485,19 @@
     'name': 'chromium.fyi',
     'mixins': ['chromium-tester-service-account'],
     'machines': {
+      'Linux Builder (reclient)': {
+        # Copied from
+        # https://source.chromium.org/chromium/chromium/src/+/master:testing/buildbot/waterfalls.pyl;l=4844-4854;drc=75f767e92e86611728189739fb26f4e2cdf212d9
+        'mixins': [
+          'isolate_profile_data',
+        ],
+        'additional_compile_targets': [
+          'all'
+        ],
+        'test_suites': {
+          'scripts': 'check_network_annotations_script',
+        }
+      },
       'Linux Viz': {
         'mixins': [
           'linux-xenial',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index efcc923..ae0ada2 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -355,6 +355,45 @@
             ]
         }
     ],
+    "AndroidInProductHelpPwaInstall": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "WithToolbar",
+                    "params": {
+                        "availability": "any",
+                        "event_trigger": "name:pwa_install_iph_trigger;comparator:<10;window:1;storage:360",
+                        "event_used": "name:pwa_install_menu_clicked;comparator:<3;window:90;storage:360",
+                        "session_rate": "any",
+                        "session_rate_impact": "none",
+                        "x_iph_replaces_toolbar": "false",
+                        "x_min_engagement_for_iph": "2"
+                    },
+                    "enable_features": [
+                        "IPH_PwaInstallAvailableFeature"
+                    ]
+                },
+                {
+                    "name": "WithoutToolbar",
+                    "params": {
+                        "availability": "any",
+                        "event_trigger": "name:pwa_install_iph_trigger;comparator:<10;window:1;storage:360",
+                        "event_used": "name:pwa_install_menu_clicked;comparator:<3;window:90;storage:360",
+                        "session_rate": "any",
+                        "session_rate_impact": "none",
+                        "x_iph_replaces_toolbar": "true",
+                        "x_min_engagement_for_iph": "2"
+                    },
+                    "enable_features": [
+                        "IPH_PwaInstallAvailableFeature"
+                    ]
+                }
+            ]
+        }
+    ],
     "AndroidInProductHelpReengagementNotification": [
         {
             "platforms": [
@@ -4074,24 +4113,6 @@
             ]
         }
     ],
-    "MuteNotifications": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "MuteNotificationsDuringScreenShare"
-                    ]
-                }
-            ]
-        }
-    ],
     "NTPPopularSites": [
         {
             "platforms": [
@@ -5780,6 +5801,7 @@
         {
             "platforms": [
                 "android",
+                "android_weblayer",
                 "chromeos",
                 "linux",
                 "mac",
diff --git a/third_party/blink/common/manifest/manifest_mojom_traits.cc b/third_party/blink/common/manifest/manifest_mojom_traits.cc
index a6ce609..8b0216c0 100644
--- a/third_party/blink/common/manifest/manifest_mojom_traits.cc
+++ b/third_party/blink/common/manifest/manifest_mojom_traits.cc
@@ -59,9 +59,6 @@
     return false;
   out->description = std::move(string.string);
 
-  if (!data.ReadCategories(&out->categories))
-    return false;
-
   if (!data.ReadGcmSenderId(&string))
     return false;
   out->gcm_sender_id = std::move(string.string);
diff --git a/third_party/blink/common/privacy_budget/README.md b/third_party/blink/common/privacy_budget/README.md
index 8b9efcc..15ba5ae 100644
--- a/third_party/blink/common/privacy_budget/README.md
+++ b/third_party/blink/common/privacy_budget/README.md
@@ -1,6 +1,6 @@
 # Privacy Budget: Core Metrics and Aggregation
 
 See [Privacy Budget: Code
-Locations](../../../../docs/privacy_budget_code_locations.md) for
+Locations](../../../../docs/privacy_budget/privacy_budget_code_locations.md) for
 details.
 
diff --git a/third_party/blink/public/common/font_access/font_enumeration_table.proto b/third_party/blink/public/common/font_access/font_enumeration_table.proto
index 15e55e4..5b85f57 100644
--- a/third_party/blink/public/common/font_access/font_enumeration_table.proto
+++ b/third_party/blink/public/common/font_access/font_enumeration_table.proto
@@ -14,6 +14,7 @@
     required string postscript_name = 10;
     required string full_name = 20;
     required string family = 30;
+    required string style = 40;
   }
 
   repeated FontMetadata fonts = 10;
diff --git a/third_party/blink/public/common/manifest/manifest.h b/third_party/blink/public/common/manifest/manifest.h
index d1eda10..370844bc 100644
--- a/third_party/blink/public/common/manifest/manifest.h
+++ b/third_party/blink/public/common/manifest/manifest.h
@@ -157,10 +157,6 @@
   // Null if the parsing failed or the field was not present.
   base::Optional<base::string16> description;
 
-  // Empty if the parsing failed, the field was not present, or all the
-  // values inside the JSON array were invalid.
-  std::vector<base::string16> categories;
-
   // Empty if the parsing failed or the field was not present.
   GURL start_url;
 
diff --git a/third_party/blink/public/common/manifest/manifest_mojom_traits.h b/third_party/blink/public/common/manifest/manifest_mojom_traits.h
index 1691f5c..855ace6 100644
--- a/third_party/blink/public/common/manifest/manifest_mojom_traits.h
+++ b/third_party/blink/public/common/manifest/manifest_mojom_traits.h
@@ -60,11 +60,6 @@
     return internal::TruncateOptionalString16(manifest.description);
   }
 
-  static const std::vector<base::string16>& categories(
-      const ::blink::Manifest& manifest) {
-    return manifest.categories;
-  }
-
   static base::Optional<base::StringPiece16> gcm_sender_id(
       const ::blink::Manifest& manifest) {
     return internal::TruncateOptionalString16(manifest.gcm_sender_id);
diff --git a/third_party/blink/public/common/privacy_budget/README.md b/third_party/blink/public/common/privacy_budget/README.md
index 1fdb8d8..832a955 100644
--- a/third_party/blink/public/common/privacy_budget/README.md
+++ b/third_party/blink/public/common/privacy_budget/README.md
@@ -1,6 +1,6 @@
 # Privacy Budget: Core Metrics and Aggregation
 
 See [Privacy Budget: Code
-Locations](../../../../../docs/privacy_budget_code_locations.md) for
+Locations](../../../../../docs/privacy_budget/privacy_budget_code_locations.md) for
 details.
 
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index ad458b9..09f0e013 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -645,6 +645,7 @@
 
   type SourceCodeLocation extends object
     properties
+      optional Runtime.ScriptId scriptId
       string url
       integer lineNumber
       integer columnNumber
diff --git a/third_party/blink/public/mojom/devtools/inspector_issue.mojom b/third_party/blink/public/mojom/devtools/inspector_issue.mojom
index 6a90e97..991867ea 100644
--- a/third_party/blink/public/mojom/devtools/inspector_issue.mojom
+++ b/third_party/blink/public/mojom/devtools/inspector_issue.mojom
@@ -7,7 +7,6 @@
 import "url/mojom/url.mojom";
 import "services/network/public/mojom/cookie_manager.mojom";
 import "services/network/public/mojom/blocked_by_response_reason.mojom";
-import "services/network/public/mojom/source_location.mojom";
 import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom";
 
 // A code that uniquely identifies an issue. This type should be descriptive
@@ -37,6 +36,13 @@
   string frame_id;
 };
 
+struct AffectedLocation {
+  string? script_id;
+  string? url;
+  uint32 line = 0;  // Zero-based as the DevTools front-end expects it.
+  uint32 column = 0;
+};
+
 struct BlockedByResponseIssueDetails {
   AffectedRequest request;
   AffectedFrame? parentFrame;
@@ -84,7 +90,7 @@
   bool is_report_only;
   ContentSecurityPolicyViolationType content_security_policy_violation_type;
   AffectedFrame? frame_ancestor;
-  network.mojom.SourceLocation? source_location;
+  AffectedLocation? affected_location;
   // 0 is not a valid node id and is used to indicate absence.
   int32 violating_node_id = 0;
 };
@@ -128,7 +134,7 @@
 };
 
 struct SharedArrayBufferIssueDetails {
-  network.mojom.SourceLocation? source_location;
+  AffectedLocation? affected_location;
   bool is_warning;
   SharedArrayBufferIssueType type;
 };
diff --git a/third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom b/third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom
index f0f41cd..a878641 100644
--- a/third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom
+++ b/third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom
@@ -23,7 +23,6 @@
   kDirDesktop,
   kDirDocuments,
   kDirDownloads,
-  kDirHome,
   kDirMusic,
   kDirPictures,
   kDirVideos,
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index 393558d..cd461640 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -482,6 +482,11 @@
       int32 line_number,
       mojo_base.mojom.String16? source_id,
       mojo_base.mojom.BigString16? untrusted_stack_trace);
+
+  // The frame's size is replicated in the browser so that the browser can
+  // correctly set the initial size of the frame in case of a cross-process
+  // navigation.
+  FrameSizeChanged(gfx.mojom.Size size);
 };
 
 // Implemented in Blink, this interface defines frame-specific methods that will
diff --git a/third_party/blink/public/mojom/manifest/manifest.mojom b/third_party/blink/public/mojom/manifest/manifest.mojom
index da1c4fb..c6eaca5 100644
--- a/third_party/blink/public/mojom/manifest/manifest.mojom
+++ b/third_party/blink/public/mojom/manifest/manifest.mojom
@@ -24,8 +24,6 @@
 
   mojo_base.mojom.String16? description;
 
-  array<mojo_base.mojom.String16> categories;
-
   url.mojom.Url start_url;
 
   DisplayMode display;
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index c9fb30f..507da809 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -466,9 +466,6 @@
   virtual void ShowContextMenu(const ContextMenuData&,
                                const base::Optional<gfx::Point>&) {}
 
-  // Called when the frame rects changed.
-  virtual void FrameRectsChanged(const gfx::Rect&) {}
-
   // Called when a new element gets focused. |from_element| is the previously
   // focused element, |to_element| is the newly focused one. Either can be null.
   virtual void FocusedElementChanged(const WebElement& element) {}
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h
index fb648cd..e8212d45 100644
--- a/third_party/blink/public/web/web_view.h
+++ b/third_party/blink/public/web/web_view.h
@@ -366,13 +366,6 @@
       mojom::PageVisibilityState visibility,
       mojom::PagehideDispatch pagehide_dispatch) = 0;
 
-  // i18n -----------------------------------------------------------------
-
-  // Inform the WebView that the accept languages have changed.
-  // If the WebView wants to get the accept languages value, it will have
-  // to call the WebViewClient::acceptLanguages().
-  virtual void AcceptLanguagesChanged() = 0;
-
   // Lifecycle state ------------------------------------------------------
 
   // Freezes or unfreezes the page and all the local frames.
diff --git a/third_party/blink/public/web/web_view_client.h b/third_party/blink/public/web/web_view_client.h
index 87ae826..4492468 100644
--- a/third_party/blink/public/web/web_view_client.h
+++ b/third_party/blink/public/web/web_view_client.h
@@ -121,9 +121,6 @@
   // notification unless the view did not need a layout.
   virtual void DidUpdateMainFrameLayout() {}
 
-  // Returns comma separated list of accept languages.
-  virtual WebString AcceptLanguages() { return WebString(); }
-
   // Called when the View has changed size as a result of an auto-resize.
   virtual void DidAutoResize(const gfx::Size& new_size) {}
 
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_tester.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_tester.cc
index 41600d39..b7e053a 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_tester.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_tester.cc
@@ -10,7 +10,6 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 #include "v8/include/v8.h"
 
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_tester.h b/third_party/blink/renderer/bindings/core/v8/script_promise_tester.h
index ee5315a..8419792 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_tester.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_tester.h
@@ -7,13 +7,13 @@
 
 #include "base/memory/weak_ptr.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace blink {
 
 class ScriptState;
 class ScriptPromise;
-class Visitor;
 
 // Utility for writing unit tests involving promises.
 // Typical usage:
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index 39384e4b..0991806 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -317,6 +317,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_security_policy_violation_event_init.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_shadow_root_init.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_shadow_root_init.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_static_range_init.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_static_range_init.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_stream_pipe_options.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_stream_pipe_options.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_submit_event_init.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index a4c6e43..8d24a1a 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -170,6 +170,7 @@
           "//third_party/blink/renderer/core/dom/shadow_root.idl",
           "//third_party/blink/renderer/core/dom/shadow_root_init.idl",
           "//third_party/blink/renderer/core/dom/static_range.idl",
+          "//third_party/blink/renderer/core/dom/static_range_init.idl",
           "//third_party/blink/renderer/core/dom/text.idl",
           "//third_party/blink/renderer/core/dom/tree_walker.idl",
           "//third_party/blink/renderer/core/dom/void_function.idl",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index cabae94..fc4cb888 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -396,7 +396,7 @@
             or isinstance(default_value, web_idl.LiteralConstant))
     assert default_value.is_type_compatible_with(idl_type)
 
-    class DefaultValueExpr:
+    class DefaultValueExpr(object):
         _ALLOWED_SYMBOLS_IN_DEPS = ("isolate")
 
         def __init__(self, initializer_expr, initializer_deps,
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
index b0ac3cd3..9104f7f2 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py
@@ -177,7 +177,7 @@
          prop_install_mode=PropInstallMode.UNCONDITIONAL,
          trampoline_var_name=None,
          attribute_entries=[],
-         constant_entries=filter(is_unconditional, constant_entries),
+         constant_entries=list(filter(is_unconditional, constant_entries)),
          exposed_construct_entries=[],
          operation_entries=[])
     (install_interface_template_decl, install_interface_template_def,
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py b/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
index e252c0b..e5ae9d9 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py
@@ -721,7 +721,7 @@
             if not scope_chains:
                 return counts
 
-            self_index = iter(scope_chains).next().index(self)
+            self_index = next(iter(scope_chains)).index(self)
             scope_chains = map(
                 lambda scope_chain: scope_chain[self_index + 1:], scope_chains)
             scope_to_likeliness = {}
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py b/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
index b4c7055..f3a2fcd7 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py
@@ -105,7 +105,7 @@
             on_error = self._caller_stack_on_error
             if (len(current) <= len(on_error)
                     and all(current[i] == on_error[i]
-                            for i in xrange(len(current)))):
+                            for i in range(len(current)))):
                 pass  # Error happened in a deeper caller.
             else:
                 self._caller_stack_on_error = list(self._caller_stack)
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py b/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
index 0fab5c28..ab569ee2 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import functools
 import multiprocessing
 
 from .package_initializer import package_initializer
@@ -77,7 +78,7 @@
         def report_worker_task_progress():
             if not report_progress:
                 return
-            done_count = reduce(
+            done_count = functools.reduce(
                 lambda count, worker_task: count + bool(worker_task.ready()),
                 self._worker_tasks, 0)
             report_progress(len(self._worker_tasks), done_count)
diff --git a/third_party/blink/renderer/bindings/scripts/idl_definitions.py b/third_party/blink/renderer/bindings/scripts/idl_definitions.py
index 0fc86d4..3db6074 100644
--- a/third_party/blink/renderer/bindings/scripts/idl_definitions.py
+++ b/third_party/blink/renderer/bindings/scripts/idl_definitions.py
@@ -394,7 +394,8 @@
             else:
                 raise ValueError('Unrecognized node class: %s' % child_class)
 
-        if len(filter(None, [self.iterable, self.maplike, self.setlike])) > 1:
+        if len(list(filter(None,
+                           [self.iterable, self.maplike, self.setlike]))) > 1:
             raise ValueError(
                 'Interface can only have one of iterable<>, maplike<> and setlike<>.'
             )
@@ -512,6 +513,9 @@
     def accept(self, visitor):
         visitor.visit_attribute(self)
 
+    def __lt__(self, other):
+        return self.name < other.name
+
 
 ################################################################################
 # Constants
@@ -852,7 +856,7 @@
 ################################################################################
 
 
-class Exposure:
+class Exposure(object):
     """An Exposure holds one Exposed or RuntimeEnabled condition.
     Each exposure has two properties: exposed and runtime_enabled.
     Exposure(e, r) corresponds to [Exposed(e r)]. Exposure(e) corresponds to
diff --git a/third_party/blink/renderer/bindings/scripts/v8_interface.py b/third_party/blink/renderer/bindings/scripts/v8_interface.py
index aaf5d8f..a85b03a 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_interface.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_interface.py
@@ -189,7 +189,7 @@
         return sorted([
             member for member in members
             if member.get(KEY) and not member.get('exposed_test')
-        ])
+        ], key=lambda item: item['name'])
 
     def member_filter_by_name(members, name):
         return [member for member in members if member[KEY] == name]
@@ -612,7 +612,8 @@
         sorted(
             origin_trial_features(interface, context['constants'],
                                   context['attributes'], context['methods']) +
-            context_enabled_features(context['attributes'])),
+            context_enabled_features(context['attributes']),
+            key=lambda item: item['name']),
     })
     if context['optional_features']:
         includes.add('platform/bindings/v8_per_context_data.h')
diff --git a/third_party/blink/renderer/bindings/scripts/v8_utilities.py b/third_party/blink/renderer/bindings/scripts/v8_utilities.py
index 2ecd692..fcfc483 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_utilities.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_utilities.py
@@ -271,7 +271,7 @@
 ])
 
 
-class ExposureSet:
+class ExposureSet(object):
     """An ExposureSet is a collection of Exposure instructions."""
 
     def __init__(self, exposures=None):
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py b/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
index abaeef3..e36cf74 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py
@@ -8,8 +8,11 @@
 class _Feature(str):
     """Represents a runtime-enabled feature."""
 
+    def __new__(cls, value):
+        return str.__new__(cls, value)
+
     def __init__(self, value):
-        str.__init__(self, value)
+        str.__init__(self)
         self._is_context_dependent = (
             RuntimeEnabledFeatures.is_context_dependent(self))
 
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py b/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
index 4ccb0e49..1712f19 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py
@@ -71,8 +71,9 @@
     def num_of_required_arguments(self):
         """Returns the number of required arguments."""
         return len(
-            filter(lambda arg: not (arg.is_optional or arg.is_variadic),
-                   self.arguments))
+            list(
+                filter(lambda arg: not (arg.is_optional or arg.is_variadic),
+                       self.arguments)))
 
 
 class OverloadGroup(WithIdentifier):
@@ -191,17 +192,17 @@
                     list(map(lambda arg: arg.optionality, X.arguments))))
 
             if X.is_variadic:
-                for i in xrange(n, max(maxarg, N)):
+                for i in range(n, max(maxarg, N)):
                     t = list(map(lambda arg: arg.idl_type, X.arguments))
                     o = list(map(lambda arg: arg.optionality, X.arguments))
-                    for _ in xrange(n, i + 1):
+                    for _ in range(n, i + 1):
                         t.append(X.arguments[-1].idl_type)
                         o.append(X.arguments[-1].optionality)
                     S.append(OverloadGroup.EffectiveOverloadItem(X, t, o))
 
             t = list(map(lambda arg: arg.idl_type, X.arguments))
             o = list(map(lambda arg: arg.optionality, X.arguments))
-            for i in xrange(n - 1, -1, -1):
+            for i in range(n - 1, -1, -1):
                 if X.arguments[i].optionality == IdlType.Optionality.REQUIRED:
                     break
                 S.append(OverloadGroup.EffectiveOverloadItem(X, t[:i], o[:i]))
@@ -221,7 +222,7 @@
             for item in items)
         assert len(items) > 1
 
-        for index in xrange(len(items[0].type_list)):
+        for index in range(len(items[0].type_list)):
             # Assume that the given items are valid, and we only need to test
             # the two types.
             if OverloadGroup.are_distinguishable_types(
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 4327d0e7..290de4d 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1386,6 +1386,7 @@
     "layout/ng/ng_length_utils_test.cc",
     "layout/ng/ng_out_of_flow_layout_part_test.cc",
     "layout/ng/ng_physical_box_fragment_test.cc",
+    "layout/ng/ng_physical_fragment_test.cc",
     "layout/ng/ng_relative_utils_test.cc",
     "layout/ng/table/ng_table_layout_algorithm_helpers_test.cc",
     "layout/overflow_model_test.cc",
diff --git a/third_party/blink/renderer/core/animation/svg_path_interpolation_type.cc b/third_party/blink/renderer/core/animation/svg_path_interpolation_type.cc
index 9c256e7..2162168 100644
--- a/third_party/blink/renderer/core/animation/svg_path_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/svg_path_interpolation_type.cc
@@ -47,7 +47,7 @@
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue* non_interpolable_value) const {
   return MakeGarbageCollected<SVGPath>(
-      MakeGarbageCollected<cssvalue::CSSPathValue>(
+      *MakeGarbageCollected<cssvalue::CSSPathValue>(
           PathInterpolationFunctions::AppliedValue(interpolable_value,
                                                    non_interpolable_value)));
 }
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni
index 42a15714..a541401 100644
--- a/third_party/blink/renderer/core/core_idl_files.gni
+++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -663,6 +663,7 @@
                     "dom/mutation_observer_init.idl",
                     "dom/pointer_lock_options.idl",
                     "dom/shadow_root_init.idl",
+                    "dom/static_range_init.idl",
                     "dom/events/add_event_listener_options.idl",
                     "dom/events/custom_event_init.idl",
                     "dom/events/event_init.idl",
diff --git a/third_party/blink/renderer/core/css/css_path_value.cc b/third_party/blink/renderer/core/css/css_path_value.cc
index d4f7425..83d50df9 100644
--- a/third_party/blink/renderer/core/css/css_path_value.cc
+++ b/third_party/blink/renderer/core/css/css_path_value.cc
@@ -41,7 +41,7 @@
 
 }  // namespace
 
-CSSPathValue& CSSPathValue::EmptyPathValue() {
+const CSSPathValue& CSSPathValue::EmptyPathValue() {
   DEFINE_STATIC_LOCAL(Persistent<CSSPathValue>, empty, (CreatePathValue()));
   return *empty;
 }
diff --git a/third_party/blink/renderer/core/css/css_path_value.h b/third_party/blink/renderer/core/css/css_path_value.h
index 2642b31..493b56e8 100644
--- a/third_party/blink/renderer/core/css/css_path_value.h
+++ b/third_party/blink/renderer/core/css/css_path_value.h
@@ -21,7 +21,7 @@
 
 class CSSPathValue : public CSSValue {
  public:
-  static CSSPathValue& EmptyPathValue();
+  static const CSSPathValue& EmptyPathValue();
 
   explicit CSSPathValue(scoped_refptr<StylePath>,
                         PathSerializationFormat = kNoTransformation);
diff --git a/third_party/blink/renderer/core/css/css_value.h b/third_party/blink/renderer/core/css/css_value.h
index 03dba55..4867a74 100644
--- a/third_party/blink/renderer/core/css/css_value.h
+++ b/third_party/blink/renderer/core/css/css_value.h
@@ -24,6 +24,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/style/data_equivalency.h"
+#include "third_party/blink/renderer/platform/heap/custom_spaces.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
 namespace blink {
@@ -33,6 +34,7 @@
 
 class CORE_EXPORT CSSValue : public GarbageCollected<CSSValue> {
  public:
+#if !BUILDFLAG(USE_V8_OILPAN)
   template <typename T>
   static void* AllocateObject(size_t size) {
     ThreadState* state =
@@ -42,6 +44,7 @@
         state, size, BlinkGC::kCSSValueArenaIndex,
         GCInfoTrait<GCInfoFoldedType<CSSValue>>::Index(), type_name);
   }
+#endif  // !USE_V8_OILPAN
 
   // TODO(sashab): Remove this method and move logic to the caller.
   static CSSValue* Create(const Length& value, float zoom);
@@ -340,4 +343,16 @@
 
 }  // namespace blink
 
+#if BUILDFLAG(USE_V8_OILPAN)
+namespace cppgc {
+// Assign CSSValue to be allocated on custom CSSValueSpace.
+template <typename T>
+struct SpaceTrait<
+    T,
+    std::enable_if_t<std::is_base_of<blink::CSSValue, T>::value>> {
+  using Space = blink::CSSValueSpace;
+};
+}  // namespace cppgc
+#endif  // !USE_V8_OILPAN
+
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_VALUE_H_
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index 817cf29..e810b9c 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -616,7 +616,6 @@
       TextDirection text_direction =
           html_element->DirectionalityIfhasDirAutoAttribute(is_auto);
       if (is_auto) {
-        state.SetHasDirAutoAttribute(true);
         collector.AddElementStyleProperties(
             text_direction == TextDirection::kLtr ? LeftToRightDeclaration()
                                                   : RightToLeftDeclaration());
@@ -896,9 +895,6 @@
           element->GetComputedStyle()->TextAutosizingMultiplier());
     }
 
-    if (state.HasDirAutoAttribute())
-      state.Style()->SetSelfOrAncestorHasDirAutoAttribute(true);
-
     CascadeAndApplyMatchedProperties(state, cascade);
 
     if (collector.MatchedResult().DependsOnContainerQueries())
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.h b/third_party/blink/renderer/core/css/resolver/style_resolver_state.h
index a22916f..e07ef98 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.h
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.h
@@ -165,9 +165,6 @@
   void SetWritingMode(WritingMode);
   void SetTextOrientation(ETextOrientation);
 
-  void SetHasDirAutoAttribute(bool value) { has_dir_auto_attribute_ = value; }
-  bool HasDirAutoAttribute() const { return has_dir_auto_attribute_; }
-
   CSSParserMode GetParserMode() const;
 
   // If the input CSSValue is a CSSLightDarkValuePair, return the light or dark
@@ -258,7 +255,6 @@
 
   CSSAnimationUpdate animation_update_;
   bool is_animation_interpolation_map_ready_ = false;
-  bool has_dir_auto_attribute_ = false;
   PseudoElementStyleRequest::RequestType pseudo_request_type_;
 
   FontBuilder font_builder_;
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.cc b/third_party/blink/renderer/core/document_transition/document_transition.cc
index 484a5e9..6ad6380 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition.cc
+++ b/third_party/blink/renderer/core/document_transition/document_transition.cc
@@ -120,6 +120,7 @@
   pending_request_ = Request::CreateStart(ConvertToBaseOnceCallback(
       CrossThreadBindOnce(&DocumentTransition::NotifyStartCommitted,
                           WrapCrossThreadWeakPersistent(this))));
+  NotifyHasChangesToCommit();
 }
 
 void DocumentTransition::NotifyHasChangesToCommit() {
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_test.cc b/third_party/blink/renderer/core/document_transition/document_transition_test.cc
index e64383c..cd5262a 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition_test.cc
+++ b/third_party/blink/renderer/core/document_transition/document_transition_test.cc
@@ -227,4 +227,33 @@
   EXPECT_FALSE(transition->TakePendingRequest());
 }
 
+TEST_F(DocumentTransitionTest, StartIsPropagated) {
+  auto* transition =
+      DocumentTransitionSupplement::documentTransition(GetDocument());
+
+  V8TestingScope v8_scope;
+  ScriptState* script_state = v8_scope.GetScriptState();
+
+  DocumentTransitionInit init;
+  ScriptPromiseTester prepare_tester(script_state,
+                                     transition->prepare(script_state, &init));
+  EXPECT_EQ(GetState(transition), State::kPreparing);
+
+  UpdateAllLifecyclePhasesAndSimulateCommit();
+  prepare_tester.WaitUntilSettled();
+  EXPECT_TRUE(prepare_tester.IsFulfilled());
+  EXPECT_EQ(GetState(transition), State::kPrepared);
+
+  transition->start();
+
+  EXPECT_EQ(GetState(transition), State::kStarted);
+  UpdateAllLifecyclePhasesAndSimulateCommit();
+
+  // TODO(vmpstr): This test relies on the fact that the commit callback will
+  // switch the state to kIdle. Long term, the state should only switch to
+  // kStarted here, and have a separate callback for when the transition is
+  // finished. When that happens, the expectations of this test should change.
+  EXPECT_EQ(GetState(transition), State::kIdle);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/dom/beforeunload_event_listener.cc b/third_party/blink/renderer/core/dom/beforeunload_event_listener.cc
index 38a80e26eb..243f202d 100644
--- a/third_party/blink/renderer/core/dom/beforeunload_event_listener.cc
+++ b/third_party/blink/renderer/core/dom/beforeunload_event_listener.cc
@@ -7,7 +7,6 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/event_type_names.h"
 #include "third_party/blink/renderer/core/events/before_unload_event.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/dom/beforeunload_event_listener.h b/third_party/blink/renderer/core/dom/beforeunload_event_listener.h
index 75586b00..c1342db2 100644
--- a/third_party/blink/renderer/core/dom/beforeunload_event_listener.h
+++ b/third_party/blink/renderer/core/dom/beforeunload_event_listener.h
@@ -7,13 +7,13 @@
 
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class Document;
 class Event;
 class ExecutionContext;
-class Visitor;
 
 // Helper class used to setup beforeunload listener for certain documents which
 // include plugins that are handled externally and need user verification before
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 788e521..de0d7be 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -759,9 +759,14 @@
   ExplicitlySetAttrElementsMap* explicitly_set_attr_elements_map =
       GetDocument().GetExplicitlySetAttrElementsMap(this);
 
-  // If the reflected element is explicitly null then we remove the content
+  // If the reflected element is explicitly null, or is not a member of this
+  // elements shadow including ancestor tree, then we remove the content
   // attribute and the explicitly set attr-element.
-  if (!element) {
+  // Note this means that explicitly set elements can cross ancestral shadow
+  // boundaries, but not descendant ones. See the spec for more details:
+  // https://whatpr.org/html/3917/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:concept-shadow-including-ancestor
+  if (!element ||
+      !ElementIsDescendantOfShadowIncludingAncestor(*this, *element)) {
     explicitly_set_attr_elements_map->erase(name);
     removeAttribute(name);
     return;
@@ -769,15 +774,13 @@
 
   const AtomicString id = element->GetIdAttribute();
 
-  // In order to sprout a non-empty content attribute from an explicitly set
-  // attr-element, |element| must:
-  //  1) have a valid ID attribute, and
-  //  2) be the first element in tree order with this ID.
-  // Otherwise the content attribute will reflect the empty string.
-  //
-  // Note that the explicitly set attr-element is still set. See the spec for
-  // more details:
-  // https://whatpr.org/html/3917/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes
+  // Explicitly set attr-elements must have a valid id attribute, and also
+  // refer to the first element in tree order of |this| elements node tree in
+  // order for the content attribute to reflect the ID. Where these conditions
+  // aren't met, the content attribute should reflect the empty string. Note
+  // that the explicitly set attr-element is still set. See the spec for more
+  // details:
+  // https://whatpr.org/html/3917/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:root-2
   if (id.IsNull() || GetTreeScope() != element->GetTreeScope() ||
       GetTreeScope().getElementById(id) != element)
     setAttribute(name, g_empty_atom);
@@ -805,19 +808,12 @@
   if (element_attribute_vector) {
     DCHECK_EQ(element_attribute_vector->size(), 1u);
     Element* explicitly_set_element = element_attribute_vector->at(0);
-    if (!explicitly_set_element)
-      return nullptr;
-
-    // Only return the explicit element if it still exists within a valid scope.
-    if (!ElementIsDescendantOfShadowIncludingAncestor(*this,
-                                                      *explicitly_set_element))
-      return nullptr;
-
-    return explicitly_set_element;
+    // Only return the explicit element if it still exists in the same scope.
+    if (explicitly_set_element)
+      return explicitly_set_element;
   }
 
-  // Compute the attr-associated element from the content attribute if present,
-  // id can be null.
+  // Compute the attr-associated element, this can be null.
   AtomicString id = getAttribute(name);
   if (id.IsNull())
     return nullptr;
@@ -850,10 +846,14 @@
   SpaceSplitString value;
 
   for (auto element : given_elements.value()) {
-    // If |value| is null and |elements| is non-empty, then a previous element
-    // must have been invalid wrt. the content attribute string rules, and
-    // therefore the content attribute string should reflect the empty string.
-    // This means we can stop trying to compute the content attribute string.
+    // Elements that are not descendants of this element's shadow including
+    // ancestors are dropped.
+    if (!ElementIsDescendantOfShadowIncludingAncestor(*this, *element))
+      continue;
+
+    // If |value| is null, this means a previous element must have been invalid,
+    // and the content attribute should reflect the empty string, so we don't
+    // continue trying to compute it.
     if (value.IsNull() && !elements->IsEmpty()) {
       elements->push_back(element);
       continue;
@@ -888,23 +888,16 @@
 
 base::Optional<HeapVector<Member<Element>>> Element::GetElementArrayAttribute(
     const QualifiedName& name) {
-  HeapVector<Member<Element>> result_elements;
   HeapVector<Member<Element>>* explicitly_set_elements =
       GetExplicitlySetElementsForAttr(this, name);
 
   if (explicitly_set_elements) {
-    for (auto attrElement : *explicitly_set_elements) {
-      if (ElementIsDescendantOfShadowIncludingAncestor(*this, *attrElement))
-        result_elements.push_back(attrElement);
-    }
-    return result_elements;
+    return *explicitly_set_elements;
   }
 
   QualifiedName attr = name;
 
   // Account for labelled vs labeled spelling
-  // TODO(chrishall): should this be refactored into a method?
-  // e.g. hasAttributeAccountForSpelling(...) ?
   if (attr == html_names::kAriaLabelledbyAttr) {
     attr = hasAttribute(html_names::kAriaLabeledbyAttr) &&
                    !hasAttribute(html_names::kAriaLabelledbyAttr)
@@ -913,22 +906,20 @@
   }
 
   String attribute_value = getAttribute(attr).GetString();
+  HeapVector<Member<Element>> content_elements;
+
   Vector<String> tokens;
   attribute_value = attribute_value.SimplifyWhiteSpace();
   attribute_value.Split(' ', tokens);
 
-  // Lookup each id within the same root.
-  // Since this is based on ID we know it cannot cross shadow boundaries, so we
-  // don't need to include additional logic to check that.
-  for (auto id : tokens) {
-    Element* candidate = GetTreeScope().getElementById(AtomicString(id));
+  for (auto token : tokens) {
+    Element* candidate = GetTreeScope().getElementById(AtomicString(token));
     if (candidate)
-      result_elements.push_back(candidate);
+      content_elements.push_back(candidate);
   }
-  if (result_elements.IsEmpty())
+  if (content_elements.IsEmpty())
     return base::nullopt;
-
-  return result_elements;
+  return content_elements;
 }
 
 NamedNodeMap* Element::attributesForBindings() const {
@@ -4840,32 +4831,6 @@
   return style.Display() == EDisplay::kContents;
 }
 
-bool Element::ComputeInheritedDirPseudoClass(TextDirection direction) const {
-  const Node* n = this;
-  // The dir property is inherited, so we iterate over the parents to find
-  // the first dir attribute.
-  do {
-    if (auto* element_node = DynamicTo<Element>(n)) {
-      AtomicString dir_attribute_value =
-          element_node->FastGetAttribute(html_names::kDirAttr);
-      if ((IsA<HTMLBDIElement>(*element_node) && !dir_attribute_value) ||
-          (IsHTMLElement() &&
-           EqualIgnoringASCIICase(dir_attribute_value, "auto"))) {
-        return element_node->MatchesDirPseudoClassForDirAutoAttribute(
-            direction);
-      }
-
-      if (EqualIgnoringASCIICase(dir_attribute_value, "ltr"))
-        return IsLtr(direction);
-      else if (EqualIgnoringASCIICase(dir_attribute_value, "rtl"))
-        return IsRtl(direction);
-    }
-    n = n->ParentOrShadowHostNode();
-  } while (n);
-
-  return IsLtr(direction);
-}
-
 AtomicString Element::ComputeInheritedLanguage() const {
   const Node* n = this;
   AtomicString value;
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 5f6452fb..cac7878 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -592,12 +592,6 @@
            GetCustomElementState() == CustomElementState::kCustom;
   }
 
-  bool ComputeInheritedDirPseudoClass(TextDirection direction) const;
-  virtual bool MatchesDirPseudoClassForDirAutoAttribute(
-      TextDirection direction) const {
-    return false;
-  }
-
   AtomicString ComputeInheritedLanguage() const;
   Locale& GetLocale() const;
 
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index 7c61750..1d461454 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -895,6 +895,16 @@
   void SetHasDisplayLockContext() { SetFlag(kHasDisplayLockContext); }
   bool HasDisplayLockContext() const { return GetFlag(kHasDisplayLockContext); }
 
+  bool SelfOrAncestorHasDirAutoAttribute() const {
+    return GetFlag(kSelfOrAncestorHasDirAutoAttribute);
+  }
+  void SetSelfOrAncestorHasDirAutoAttribute() {
+    SetFlag(kSelfOrAncestorHasDirAutoAttribute);
+  }
+  void ClearSelfOrAncestorHasDirAutoAttribute() {
+    ClearFlag(kSelfOrAncestorHasDirAutoAttribute);
+  }
+
   void Trace(Visitor*) const override;
 
  private:
@@ -942,9 +952,11 @@
 
     kHasDisplayLockContext = 1 << 26,
 
+    kSelfOrAncestorHasDirAutoAttribute = 1 << 27,
+
     kDefaultNodeFlags = kIsFinishedParsingChildrenFlag,
 
-    // 6 bits remaining.
+    // 5 bits remaining.
   };
 
   ALWAYS_INLINE bool GetFlag(NodeFlags mask) const {
diff --git a/third_party/blink/renderer/core/dom/slot_assignment.cc b/third_party/blink/renderer/core/dom/slot_assignment.cc
index 82d2364b..6845a1bf 100644
--- a/third_party/blink/renderer/core/dom/slot_assignment.cc
+++ b/third_party/blink/renderer/core/dom/slot_assignment.cc
@@ -340,10 +340,15 @@
       candidate_assigned_slot_map_.swap(candidate_map);
   }
 
+  // Update an dir=auto flag from a host of slots to its all descendants.
+  // We should call below functions outside FlatTreeTraversalForbiddenScope
+  // because we can go a tree walk to either their ancestors or descendants
+  // if needed.
+  if (auto* element = DynamicTo<HTMLElement>(owner_->host())) {
+    element->UpdateDescendantsHasDirAutoAttribute(
+        element->SelfOrAncestorHasDirAutoAttribute());
+  }
   // Resolve the directionality of elements deferred their adjustment.
-  // We should call AdjustCandidateDirectionalityForSlot below outside
-  // FlatTreeTraversalForbiddenScope because we can go a tree walk to either
-  // their ancestors or descendants if needed.
   HTMLElement::AdjustCandidateDirectionalityForSlot(
       std::move(candidate_directionality_set_));
 }
diff --git a/third_party/blink/renderer/core/dom/static_range.cc b/third_party/blink/renderer/core/dom/static_range.cc
index 1643e26..c800def 100644
--- a/third_party/blink/renderer/core/dom/static_range.cc
+++ b/third_party/blink/renderer/core/dom/static_range.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/dom/static_range.h"
 
 #include "third_party/blink/renderer/core/dom/range.h"
+#include "third_party/blink/renderer/core/dom/static_range_init.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -40,6 +41,27 @@
       range.EndPosition().ComputeOffsetInContainerNode());
 }
 
+StaticRange* StaticRange::Create(Document& document,
+                                 const StaticRangeInit* static_range_init,
+                                 ExceptionState& exception_state) {
+  DCHECK(static_range_init);
+
+  if (static_range_init->startContainer()->IsDocumentTypeNode() ||
+      static_range_init->startContainer()->IsAttributeNode() ||
+      static_range_init->endContainer()->IsDocumentTypeNode() ||
+      static_range_init->endContainer()->IsAttributeNode()) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kInvalidNodeTypeError,
+        "Neither startContainer nor endContainer can be a DocumentType or "
+        "Attribute node.");
+  }
+
+  return MakeGarbageCollected<StaticRange>(
+      document, static_range_init->startContainer(),
+      static_range_init->startOffset(), static_range_init->endContainer(),
+      static_range_init->endOffset());
+}
+
 void StaticRange::setStart(Node* container, unsigned offset) {
   start_container_ = container;
   start_offset_ = offset;
diff --git a/third_party/blink/renderer/core/dom/static_range.h b/third_party/blink/renderer/core/dom/static_range.h
index 274536d..a1e45bf 100644
--- a/third_party/blink/renderer/core/dom/static_range.h
+++ b/third_party/blink/renderer/core/dom/static_range.h
@@ -16,6 +16,7 @@
 
 class Document;
 class ExceptionState;
+class StaticRangeInit;
 
 class CORE_EXPORT StaticRange final : public AbstractRange {
   DEFINE_WRAPPERTYPEINFO();
@@ -27,6 +28,9 @@
         range->endContainer(), range->endOffset());
   }
   static StaticRange* Create(const EphemeralRange&);
+  static StaticRange* Create(Document&,
+                             const StaticRangeInit*,
+                             ExceptionState&);
 
   explicit StaticRange(Document&);
   StaticRange(Document&,
diff --git a/third_party/blink/renderer/core/dom/static_range.idl b/third_party/blink/renderer/core/dom/static_range.idl
index 87474eb1..462ddecd 100644
--- a/third_party/blink/renderer/core/dom/static_range.idl
+++ b/third_party/blink/renderer/core/dom/static_range.idl
@@ -4,7 +4,7 @@
 
 // https://w3c.github.io/staticrange/#interface-staticrange
 
-[
-    Exposed=Window
-] interface StaticRange : AbstractRange {
-};
+[Exposed=Window]
+interface StaticRange : AbstractRange {
+  [CallWith=Document, RaisesException] constructor(StaticRangeInit init);
+};
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/dom/static_range_init.idl b/third_party/blink/renderer/core/dom/static_range_init.idl
new file mode 100644
index 0000000..33ef064
--- /dev/null
+++ b/third_party/blink/renderer/core/dom/static_range_init.idl
@@ -0,0 +1,12 @@
+// 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.
+
+// https://w3c.github.io/staticrange/#interface-staticrange
+
+dictionary StaticRangeInit {
+  required Node startContainer;
+  required unsigned long startOffset;
+  required Node endContainer;
+  required unsigned long endOffset;
+};
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
index 0a84851..90e152455 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -193,11 +193,13 @@
     const SourceLocation* source_location) {
   auto details = mojom::blink::InspectorIssueDetails::New();
   auto issue_details = mojom::blink::SharedArrayBufferIssueDetails::New();
-  auto mojo_source_location = network::mojom::blink::SourceLocation::New();
-  mojo_source_location->url = source_location->Url();
-  mojo_source_location->line = source_location->LineNumber();
-  mojo_source_location->column = source_location->ColumnNumber();
-  issue_details->source_location = std::move(mojo_source_location);
+  auto affected_location = mojom::blink::AffectedLocation::New();
+  affected_location->url = source_location->Url();
+  affected_location->line = source_location->LineNumber() - 1;
+  affected_location->column = source_location->ColumnNumber();
+  affected_location->script_id =
+      WTF::String::Number(source_location->ScriptId());
+  issue_details->affected_location = std::move(affected_location);
   details->sab_issue_details = std::move(issue_details);
   return mojom::blink::InspectorIssueInfo::New(
       mojom::blink::InspectorIssueCode::kSharedArrayBufferIssue,
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index 2e55811..ca28680 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -73,6 +73,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/keyboard_codes.h"
+#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/text/text_direction.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
 #include "third_party/blink/renderer/platform/widget/frame_widget.h"
@@ -173,9 +174,12 @@
     // do not wish to actually do anything.
     if (popup_->closing_)
       return;
-    if (WebTestSupport::IsRunningWebTest()) {
+
+    // When the renderer has a compositor thread we need to follow the
+    // normal code path.
+    if (WebTestSupport::IsRunningWebTest() && !Thread::CompositorThread()) {
       // In single-threaded web tests, the owner frame tree runs the composite
-      // step for the popup. Popup widgets don't runany composite step on their
+      // step for the popup. Popup widgets don't run any composite step on their
       // own. And we don't run popup tests with a compositor thread, so no need
       // to check for that.
       Document& opener_document =
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 019a679..509a0dc 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -642,8 +642,8 @@
 }
 
 void WebViewImpl::AcceptLanguagesChanged() {
-  if (web_view_client_)
-    FontCache::AcceptLanguagesChanged(web_view_client_->AcceptLanguages());
+  FontCache::AcceptLanguagesChanged(
+      String::FromUTF8(renderer_preferences_.accept_languages));
 
   if (!GetPage())
     return;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 3ecf7a1..40b74bd 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -187,7 +187,6 @@
   void DidCloseContextMenu() override;
   void CancelPagePopup() override;
   WebPagePopupImpl* GetPagePopup() const override { return page_popup_.get(); }
-  void AcceptLanguagesChanged() override;
   void SetPageFrozen(bool frozen) override;
   WebFrameWidget* MainFrameWidget() override;
   void SetBaseBackgroundColor(SkColor) override;
@@ -546,6 +545,7 @@
   friend class WebView;  // So WebView::Create can call our constructor
   friend class WTF::RefCounted<WebViewImpl>;
 
+  void AcceptLanguagesChanged();
   void ThemeChanged();
 
   // Update the target url locally and tell the browser that the target URL has
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
index 980f36f8..0809c5a 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -1508,12 +1508,13 @@
     cspDetails->frame_ancestor = std::move(affected_frame);
   }
   if (violation_data.sourceFile() && violation_data.lineNumber()) {
-    auto source_location = network::mojom::blink::SourceLocation::New();
-    source_location->url = violation_data.sourceFile();
+    // TODO(chromium:1158782): Try to get a scriptId here as well.
+    auto affected_location = mojom::blink::AffectedLocation::New();
+    affected_location->url = violation_data.sourceFile();
     // The frontend expects 0-based line numbers.
-    source_location->line = violation_data.lineNumber() - 1;
-    source_location->column = violation_data.columnNumber();
-    cspDetails->source_location = std::move(source_location);
+    affected_location->line = violation_data.lineNumber() - 1;
+    affected_location->column = violation_data.columnNumber();
+    cspDetails->affected_location = std::move(affected_location);
   }
   if (element) {
     cspDetails->violating_node_id = DOMNodeIds::IdForNode(element);
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h
index c19c394a..9a526ac4 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -356,8 +356,6 @@
 
   virtual Frame* FindFrame(const AtomicString& name) const = 0;
 
-  virtual void FrameRectsChanged(const IntRect&) {}
-
   virtual void OnOverlayPopupAdDetected() {}
 
   virtual void OnLargeStickyAdDetected() {}
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
index af8a0e8d4..0e71a094 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -1048,11 +1048,6 @@
   return ToCoreFrame(web_frame_->Client()->FindFrame(name));
 }
 
-void LocalFrameClientImpl::FrameRectsChanged(const IntRect& frame_rect) {
-  DCHECK(web_frame_->Client());
-  web_frame_->Client()->FrameRectsChanged(frame_rect);
-}
-
 void LocalFrameClientImpl::FocusedElementChanged(Element* element) {
   DCHECK(web_frame_->Client());
   web_frame_->ResetHasScrolledFocusedEditableIntoView();
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.h b/third_party/blink/renderer/core/frame/local_frame_client_impl.h
index f6da466..28d83f8 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client_impl.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.h
@@ -237,8 +237,6 @@
 
   Frame* FindFrame(const AtomicString& name) const override;
 
-  void FrameRectsChanged(const IntRect&) override;
-
   void FocusedElementChanged(Element* element) override;
 
   void OnMainFrameIntersectionChanged(
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 b5beceaa..78732fda 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3851,7 +3851,15 @@
     }
   });
 
-  GetFrame().Client()->FrameRectsChanged(FrameRect());
+  // To limit the number of Mojo communications, only notify the browser when
+  // the rect's size changes, not when the position changes. The size needs to
+  // be replicated if the iframe goes out-of-process.
+  IntSize frame_size = FrameRect().Size();
+  if (!frame_size_ || *frame_size_ != frame_size) {
+    frame_size_ = frame_size;
+    GetFrame().GetLocalFrameHostRemote().FrameSizeChanged(
+        gfx::Size(frame_size));
+  }
 
   // It's possible for changing the frame rect to not generate a layout
   // or any other event tracked by accessibility, we've seen this with
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index 240ab2d..055d99f2 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -1014,6 +1014,10 @@
   IntSize last_viewport_size_;
   float last_zoom_factor_;
 
+  // Used for tracking the frame's size and replicating it to the browser
+  // process when it changes.
+  base::Optional<IntSize> frame_size_;
+
   AtomicString media_type_;
   AtomicString media_type_when_not_printing_;
 
diff --git a/third_party/blink/renderer/core/frame/navigation_rate_limiter.h b/third_party/blink/renderer/core/frame/navigation_rate_limiter.h
index 7ff7bc34..9b78c25 100644
--- a/third_party/blink/renderer/core/frame/navigation_rate_limiter.h
+++ b/third_party/blink/renderer/core/frame/navigation_rate_limiter.h
@@ -6,9 +6,9 @@
 
 #include "base/time/time.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
-class Visitor;
 class Frame;
 
 // TODO(https://crbug.com/394296, https://crbug.com/882238)
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 628f4b1..a1faa296 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -1124,7 +1124,8 @@
 static inline bool ElementAffectsDirectionality(const Node* node) {
   auto* html_element = DynamicTo<HTMLElement>(node);
   return html_element && (IsA<HTMLBDIElement>(*html_element) ||
-                          html_element->FastHasAttribute(html_names::kDirAttr));
+                          IsValidDirAttribute(html_element->FastGetAttribute(
+                              html_names::kDirAttr)));
 }
 
 void HTMLElement::ChildrenChanged(const ChildrenChange& change) {
@@ -1204,15 +1205,6 @@
   return TextDirection::kLtr;
 }
 
-bool HTMLElement::SelfOrAncestorHasDirAutoAttribute() const {
-  // TODO(esprehn): Storing this state in the computed style is bad, we
-  // should be able to answer questions about the shape of the DOM and the
-  // text contained inside it without having style.
-  if (const ComputedStyle* style = GetComputedStyle())
-    return style->SelfOrAncestorHasDirAutoAttribute();
-  return false;
-}
-
 void HTMLElement::AdjustDirectionalityIfNeededAfterChildAttributeChanged(
     Element* child) {
   DCHECK(SelfOrAncestorHasDirAutoAttribute());
@@ -1267,16 +1259,20 @@
   if (!SelfOrAncestorHasDirAutoAttribute())
     return;
 
+  UpdateDescendantsHasDirAutoAttribute(true /* has_dir_auto */);
+
   for (Element* element_to_adjust = this; element_to_adjust;
        element_to_adjust =
            FlatTreeTraversal::ParentElement(*element_to_adjust)) {
     if (ElementAffectsDirectionality(element_to_adjust)) {
-      if (To<HTMLElement>(element_to_adjust)
-              ->CalculateAndAdjustAutoDirectionality() &&
-          RuntimeEnabledFeatures::CSSPseudoDirEnabled()) {
-        SetNeedsStyleRecalc(kLocalStyleChange,
-                            StyleChangeReasonForTracing::Create(
-                                style_change_reason::kPseudoClass));
+      if (RuntimeEnabledFeatures::CSSPseudoDirEnabled()) {
+        if (To<HTMLElement>(element_to_adjust)
+                ->CalculateAndAdjustAutoDirectionality()) {
+          SetNeedsStyleRecalc(kLocalStyleChange,
+                              StyleChangeReasonForTracing::Create(
+                                  style_change_reason::kPseudoClass));
+        }
+        element_to_adjust->PseudoStateChanged(CSSSelector::kPseudoDir);
       }
       return;
     }
@@ -1646,18 +1642,76 @@
   return layout_object->OffsetParent(this);
 }
 
+void HTMLElement::UpdateDescendantsHasDirAutoAttribute(bool has_dir_auto) {
+  Node* node = FlatTreeTraversal::FirstChild(*this);
+  while (node) {
+    if (auto* element = DynamicTo<Element>(node)) {
+      AtomicString dir_attribute_value =
+          element->FastGetAttribute(html_names::kDirAttr);
+      if (IsValidDirAttribute(dir_attribute_value)) {
+        node = FlatTreeTraversal::NextSkippingChildren(*node, this);
+        continue;
+      }
+
+      if (auto* slot = ToHTMLSlotElementIfSupportsAssignmentOrNull(node)) {
+        ShadowRoot* root = slot->ContainingShadowRoot();
+        // Defer to adjust the directionality to avoid recalcuating slot
+        // assignment in FlatTreeTraversal when updating slot.
+        // Slot and its children will be updated after recalculating children.
+        if (root->NeedsSlotAssignmentRecalc()) {
+          node = FlatTreeTraversal::NextSkippingChildren(*node, this);
+          continue;
+        }
+      }
+
+      if (!has_dir_auto) {
+        if (!element->SelfOrAncestorHasDirAutoAttribute()) {
+          node = FlatTreeTraversal::NextSkippingChildren(*node, this);
+          continue;
+        }
+
+        element->ClearSelfOrAncestorHasDirAutoAttribute();
+      } else {
+        if (element->SelfOrAncestorHasDirAutoAttribute()) {
+          node = FlatTreeTraversal::NextSkippingChildren(*node, this);
+          continue;
+        }
+        element->SetSelfOrAncestorHasDirAutoAttribute();
+      }
+    }
+    node = FlatTreeTraversal::Next(*node, this);
+  }
+}
+
 void HTMLElement::OnDirAttrChanged(const AttributeModificationParams& params) {
   // If an ancestor has dir=auto, and this node has the first character,
   // changes to dir attribute may affect the ancestor.
   if (!CanParticipateInFlatTree())
     return;
-  auto* parent =
-      DynamicTo<HTMLElement>(FlatTreeTraversal::ParentElement(*this));
-  if (parent && parent->SelfOrAncestorHasDirAutoAttribute()) {
-    parent->AdjustDirectionalityIfNeededAfterChildAttributeChanged(this);
+
+  if (!IsValidDirAttribute(params.old_value) &&
+      !IsValidDirAttribute(params.new_value))
+    return;
+
+  bool is_old_auto = SelfOrAncestorHasDirAutoAttribute();
+  bool is_new_auto = HasDirectionAuto();
+  if (!is_old_auto || !is_new_auto) {
+    auto* parent =
+        DynamicTo<HTMLElement>(FlatTreeTraversal::ParentElement(*this));
+    if (parent && parent->SelfOrAncestorHasDirAutoAttribute()) {
+      parent->AdjustDirectionalityIfNeededAfterChildAttributeChanged(this);
+    }
   }
 
-  if (EqualIgnoringASCIICase(params.new_value, "auto"))
+  if (is_old_auto && !is_new_auto) {
+    ClearSelfOrAncestorHasDirAutoAttribute();
+    UpdateDescendantsHasDirAutoAttribute(false /* has_dir_auto */);
+  } else if (!is_old_auto && is_new_auto) {
+    SetSelfOrAncestorHasDirAutoAttribute();
+    UpdateDescendantsHasDirAutoAttribute(true /* has_dir_auto */);
+  }
+
+  if (is_new_auto)
     CalculateAndAdjustAutoDirectionality();
 
   if (RuntimeEnabledFeatures::CSSPseudoDirEnabled()) {
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h
index ed44adb..961b9b0d 100644
--- a/third_party/blink/renderer/core/html/html_element.h
+++ b/third_party/blink/renderer/core/html/html_element.h
@@ -157,6 +157,7 @@
   void AddCandidateDirectionalityForSlot();
   static void AdjustCandidateDirectionalityForSlot(
       HeapHashSet<Member<HTMLElement>> candidate_set);
+  void UpdateDescendantsHasDirAutoAttribute(bool has_dir_auto);
 
  protected:
   enum AllowPercentage { kDontAllowPercentageValues, kAllowPercentageValues };
@@ -211,7 +212,6 @@
 
   DocumentFragment* TextToFragment(const String&, ExceptionState&);
 
-  bool SelfOrAncestorHasDirAutoAttribute() const;
   void AdjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child);
   void AdjustDirectionalityIfNeededAfterChildrenChanged();
   TextDirection ResolveAutoDirectionality(bool& is_deferred) const;
diff --git a/third_party/blink/renderer/core/html/lazy_load_frame_observer.cc b/third_party/blink/renderer/core/html/lazy_load_frame_observer.cc
index 1be3d25fd..1128a3f 100644
--- a/third_party/blink/renderer/core/html/lazy_load_frame_observer.cc
+++ b/third_party/blink/renderer/core/html/lazy_load_frame_observer.cc
@@ -23,7 +23,6 @@
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/geometry/length.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
 #include "third_party/blink/renderer/platform/network/network_state_notifier.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/core/html/lazy_load_frame_observer.h b/third_party/blink/renderer/core/html/lazy_load_frame_observer.h
index d27af3e..32ba21826 100644
--- a/third_party/blink/renderer/core/html/lazy_load_frame_observer.h
+++ b/third_party/blink/renderer/core/html/lazy_load_frame_observer.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
@@ -18,7 +19,6 @@
 class IntersectionObserverEntry;
 class HTMLFrameOwnerElement;
 class ResourceRequestHead;
-class Visitor;
 
 class LazyLoadFrameObserver final
     : public GarbageCollected<LazyLoadFrameObserver> {
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer.h b/third_party/blink/renderer/core/html/lazy_load_image_observer.h
index 5d23677..7f19c88 100644
--- a/third_party/blink/renderer/core/html/lazy_load_image_observer.h
+++ b/third_party/blink/renderer/core/html/lazy_load_image_observer.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
@@ -16,7 +17,6 @@
 class HTMLImageElement;
 class IntersectionObserver;
 class IntersectionObserverEntry;
-class Visitor;
 
 class LazyLoadImageObserver final
     : public GarbageCollected<LazyLoadImageObserver> {
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc b/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
index 503e83d..c761c04 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
@@ -441,6 +441,19 @@
   }
 }
 
+std::unique_ptr<protocol::Audits::SourceCodeLocation> BuildAffectedLocation(
+    const blink::mojom::blink::AffectedLocationPtr& affected_location) {
+  auto protocol_affected_location =
+      protocol::Audits::SourceCodeLocation::create()
+          .setUrl(affected_location->url)
+          .setColumnNumber(affected_location->column)
+          .setLineNumber(affected_location->line)
+          .build();
+  if (!affected_location->script_id.IsEmpty())
+    protocol_affected_location->setScriptId(affected_location->script_id);
+  return protocol_affected_location;
+}
+
 }  // namespace
 
 void InspectorAuditsAgent::InspectorIssueAdded(InspectorIssue* issue) {
@@ -520,13 +533,9 @@
     }
     if (d->frame_ancestor)
       cspDetails.setFrameAncestor(BuildAffectedFrame(d->frame_ancestor));
-    if (d->source_location) {
-      auto source_location = protocol::Audits::SourceCodeLocation::create()
-                                 .setUrl(d->source_location->url)
-                                 .setColumnNumber(d->source_location->column)
-                                 .setLineNumber(d->source_location->line)
-                                 .build();
-      cspDetails.setSourceCodeLocation(std::move(source_location));
+    if (d->affected_location) {
+      cspDetails.setSourceCodeLocation(
+          BuildAffectedLocation(d->affected_location));
     }
     if (d->violating_node_id)
       cspDetails.setViolatingNodeId(d->violating_node_id);
@@ -535,16 +544,12 @@
 
   if (issue->Details()->sab_issue_details) {
     const auto* d = issue->Details()->sab_issue_details.get();
-    auto source_location = protocol::Audits::SourceCodeLocation::create()
-                               .setUrl(d->source_location->url)
-                               .setColumnNumber(d->source_location->column)
-                               .setLineNumber(d->source_location->line)
-                               .build();
-    auto details = protocol::Audits::SharedArrayBufferIssueDetails::create()
-                       .setIsWarning(d->is_warning)
-                       .setType(BuildSABIssueType(d->type))
-                       .setSourceCodeLocation(std::move(source_location))
-                       .build();
+    auto details =
+        protocol::Audits::SharedArrayBufferIssueDetails::create()
+            .setIsWarning(d->is_warning)
+            .setType(BuildSABIssueType(d->type))
+            .setSourceCodeLocation(BuildAffectedLocation(d->affected_location))
+            .build();
     issueDetails.setSharedArrayBufferIssueDetails(std::move(details));
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 5f9ccd2..40021a3 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -4308,9 +4308,16 @@
     if (!IsInLayoutNGInlineFormattingContext())
       return false;
   }
+  // The NG paint system currently doesn't support replaced content.
+  if (IsLayoutReplaced())
+    return false;
   // The NG paint system currently doesn't support table-cells.
   if (IsTableCellLegacy())
     return false;
+  // Text controls have some logic in the layout objects that will be missed if
+  // we traverse the fragment tree when hit-testing.
+  if (IsTextControlIncludingNG())
+    return false;
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index e729b1f..471cce6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -141,22 +141,7 @@
         if (flags_ & NGPhysicalFragment::DumpLegacyDescendants &&
             layout_object && !layout_object->IsLayoutNGObject()) {
           DCHECK(box->Children().empty());
-          for (const LayoutObject* descendant = layout_object->SlowFirstChild();
-               descendant;) {
-            if (!descendant->IsLayoutNGObject()) {
-              descendant = descendant->NextInPreOrder(layout_object);
-              continue;
-            }
-            if (flags_ & NGPhysicalFragment::DumpHeaderText) {
-              AppendIndentation(indent + 2);
-              builder_->Append("(NG fragment root inside legacy subtree:)\n");
-            }
-            const LayoutBox* box_descendant = To<LayoutBox>(descendant);
-            DCHECK_EQ(box_descendant->PhysicalFragmentCount(), 1u);
-            Append(box_descendant->GetPhysicalFragment(0), base::nullopt,
-                   indent + 4);
-            descendant = descendant->NextInPreOrderAfterChildren(layout_object);
-          }
+          AppendLegacySubtree(*layout_object, indent);
           return;
         }
         for (auto& child : box->Children()) {
@@ -192,6 +177,42 @@
     builder_->Append("\n");
   }
 
+  void AppendLegacySubtree(const LayoutObject& layout_object,
+                           unsigned indent = 0) {
+    for (const LayoutObject* descendant = &layout_object; descendant;) {
+      if (!descendant->IsLayoutNGObject()) {
+        if (const auto* block = DynamicTo<LayoutBlock>(descendant)) {
+          if (const auto* positioned_descendants = block->PositionedObjects()) {
+            for (const auto* positioned_object : *positioned_descendants) {
+              if (positioned_object->IsLayoutNGObject())
+                AppendNGRootInLegacySubtree(*positioned_object, indent);
+              else
+                AppendLegacySubtree(*positioned_object, indent);
+            }
+          }
+        }
+        if (descendant->IsOutOfFlowPositioned() && descendant != &layout_object)
+          descendant = descendant->NextInPreOrderAfterChildren(&layout_object);
+        else
+          descendant = descendant->NextInPreOrder(&layout_object);
+        continue;
+      }
+      AppendNGRootInLegacySubtree(*descendant, indent);
+      descendant = descendant->NextInPreOrderAfterChildren(&layout_object);
+    }
+  }
+
+  void AppendNGRootInLegacySubtree(const LayoutObject& layout_object,
+                                   unsigned indent) {
+    if (flags_ & NGPhysicalFragment::DumpHeaderText) {
+      AppendIndentation(indent + 2);
+      builder_->Append("(NG fragment root inside legacy subtree:)\n");
+    }
+    const LayoutBox& box_descendant = To<LayoutBox>(layout_object);
+    DCHECK_EQ(box_descendant.PhysicalFragmentCount(), 1u);
+    Append(box_descendant.GetPhysicalFragment(0), base::nullopt, indent + 4);
+  }
+
  private:
   void Append(NGInlineCursor* cursor, unsigned indent) {
     for (; *cursor; cursor->MoveToNextSkippingChildren()) {
@@ -621,11 +642,34 @@
   return string_builder.ToString();
 }
 
+String NGPhysicalFragment::DumpFragmentTree(const LayoutObject& root,
+                                            DumpFlags flags) {
+  if (root.IsLayoutNGObject()) {
+    const LayoutBox& root_box = To<LayoutBox>(root);
+    DCHECK_EQ(root_box.PhysicalFragmentCount(), 1u);
+    return root_box.GetPhysicalFragment(0)->DumpFragmentTree(flags);
+  }
+  StringBuilder string_builder;
+  if (flags & DumpHeaderText) {
+    string_builder.Append(
+        ".:: LayoutNG Physical Fragment Tree at legacy root ");
+    string_builder.Append(root.DebugName());
+    string_builder.Append(" ::.\n");
+  }
+  FragmentTreeDumper(&string_builder, flags).AppendLegacySubtree(root);
+  return string_builder.ToString();
+}
+
 #if DCHECK_IS_ON()
 void NGPhysicalFragment::ShowFragmentTree() const {
   DumpFlags dump_flags = DumpAll;
   LOG(INFO) << "\n" << DumpFragmentTree(dump_flags).Utf8();
 }
+
+void NGPhysicalFragment::ShowFragmentTree(const LayoutObject& root) {
+  DumpFlags dump_flags = DumpAll;
+  LOG(INFO) << "\n" << DumpFragmentTree(root, dump_flags).Utf8();
+}
 #endif
 
 PhysicalRect NGPhysicalFragmentWithOffset::RectInContainerBox() const {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index 85f21c8d9..112d7764 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -455,8 +455,11 @@
                           base::Optional<PhysicalOffset> = base::nullopt,
                           unsigned indent = 2) const;
 
+  static String DumpFragmentTree(const LayoutObject& root, DumpFlags);
+
 #if DCHECK_IS_ON()
   void ShowFragmentTree() const;
+  static void ShowFragmentTree(const LayoutObject& root);
 #endif
 
  protected:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc
new file mode 100644
index 0000000..544d2ff
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment_test.cc
@@ -0,0 +1,185 @@
+// 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 "third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h"
+
+#include "third_party/blink/renderer/core/layout/layout_view.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_layout_test.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+
+namespace blink {
+
+class NGPhysicalFragmentTest : public NGLayoutTest {
+ public:
+  String DumpAll() const {
+    return NGPhysicalFragment::DumpFragmentTree(*GetDocument().GetLayoutView(),
+                                                NGPhysicalFragment::DumpAll);
+  }
+};
+
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeBasic) {
+  SetBodyInnerHTML(R"HTML(
+    <div id="block"></div>
+  )HTML");
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x8 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+        Box (block-flow) offset:0,0 size:784x0 LayoutNGBlockFlow DIV id='block'
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// LayoutView is the containing block of an absolutely positioned descendant.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbspos) {
+  SetBodyInnerHTML(R"HTML(
+    <div id="abs" style="position:absolute;"></div>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (out-of-flow-positioned block-flow)(self paint) offset:unplaced size:0x0 LayoutNGBlockFlow (positioned) DIV id='abs'
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x8 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// An NG object is the containing block of an absolutely positioned descendant.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbsposInRelpos) {
+  SetBodyInnerHTML(R"HTML(
+    <div id="rel" style="position:relative;">
+      <div id="abs" style="position:absolute; left:10px; top:20px;"></div>
+    </div>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x8 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+        Box (block-flow)(self paint) offset:0,0 size:784x0 LayoutNGBlockFlow (relative positioned) DIV id='rel'
+          Box (out-of-flow-positioned block-flow)(self paint) offset:10,20 size:0x0 LayoutNGBlockFlow (positioned) DIV id='abs'
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// A legacy table is the containing block of an absolutely positioned
+// descendant.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithTableWithAbspos) {
+  if (RuntimeEnabledFeatures::LayoutNGTableEnabled())
+    return;
+  SetBodyInnerHTML(R"HTML(
+    <table style="position:relative;">
+      <td>
+        <div id="abs" style="position:absolute; left:10px; top:20px;"></div>
+        <div id="inflow">
+          <div id="inflowchild"></div>
+        </div>
+      </td>
+    </table>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x22 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x6 LayoutNGBlockFlow BODY
+        Box (block-flow-root legacy-layout-root)(self paint) offset:0,0 size:6x6 LayoutTable (relative positioned) TABLE
+          (NG fragment root inside legacy subtree:)
+            Box (out-of-flow-positioned block-flow)(self paint) offset:unplaced size:0x0 LayoutNGBlockFlow (positioned) DIV id='abs'
+          (NG fragment root inside legacy subtree:)
+            Box (block-flow-root block-flow) offset:unplaced size:2x2 LayoutNGTableCell TD
+              Box (block-flow) offset:1,1 size:0x0 LayoutNGBlockFlow DIV id='inflow'
+                Box (block-flow) offset:0,0 size:0x0 LayoutNGBlockFlow DIV id='inflowchild'
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// LayoutView is the containing block of an absolutely positioned legacy
+// table. The table has no fragment, so it won't show up in the fragment dump.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbsposTable) {
+  if (RuntimeEnabledFeatures::LayoutNGTableEnabled())
+    return;
+  SetBodyInnerHTML(R"HTML(
+    <div id="abs" style="display:table; position:absolute;"></div>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x8 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// LayoutView is the containing block of an absolutely positioned legacy table
+// with a child. The table has no fragment, so it won't show up in the fragment
+// dump, but its NG descendants will.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithAbsposTableWithChild) {
+  if (RuntimeEnabledFeatures::LayoutNGTableEnabled())
+    return;
+  SetBodyInnerHTML(R"HTML(
+    <div id="abs" style="display:table; position:absolute;">
+      <div id="child"></div>
+    </div>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow) offset:unplaced size:0x0 LayoutNGTableCell (anonymous)
+      Box (block-flow) offset:0,0 size:0x0 LayoutNGBlockFlow DIV id='child'
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x8 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// A legacy grid with another legacy grid inside, and some NG objects, too.
+TEST_F(NGPhysicalFragmentTest, DumpFragmentTreeWithGrid) {
+  if (RuntimeEnabledFeatures::LayoutNGGridEnabled())
+    return;
+  SetBodyInnerHTML(R"HTML(
+    <div id="outer-grid" style="display:grid;">
+      <div id="grid-as-item" style="display:grid;">
+        <div id="inner-grid-item">
+          <div id="foo"></div>
+        </div>
+      </div>
+      <div id="block-container-item">
+        <div id="bar"></div>
+      </div>
+    </div>
+  )HTML");
+
+  String dump = DumpAll();
+  String expectation =
+      R"DUMP(.:: LayoutNG Physical Fragment Tree at legacy root LayoutView #document ::.
+  (NG fragment root inside legacy subtree:)
+    Box (block-flow-root block-flow)(self paint) offset:unplaced size:800x16 LayoutNGBlockFlow HTML
+      Box (block-flow) offset:8,8 size:784x0 LayoutNGBlockFlow BODY
+        Box (block-flow-root legacy-layout-root) offset:0,0 size:784x0 LayoutGrid DIV id='outer-grid'
+          (NG fragment root inside legacy subtree:)
+            Box (block-flow-root block-flow) offset:unplaced size:784x0 LayoutNGBlockFlow DIV id='inner-grid-item'
+              Box (block-flow) offset:0,0 size:784x0 LayoutNGBlockFlow DIV id='foo'
+          (NG fragment root inside legacy subtree:)
+            Box (block-flow-root block-flow) offset:unplaced size:784x0 LayoutNGBlockFlow DIV id='block-container-item'
+              Box (block-flow) offset:0,0 size:784x0 LayoutNGBlockFlow DIV id='bar'
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
index 6b70f22..f9e2ce8 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
@@ -9,9 +9,9 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
-class Visitor;
 class LocalFrameView;
 class LayoutObject;
 struct ViewportDescription;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 8b8e020..3302166 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -731,7 +731,7 @@
 }
 
 String ChromeClientImpl::AcceptLanguages() {
-  return web_view_->Client()->AcceptLanguages();
+  return String::FromUTF8(web_view_->GetRendererPreferences().accept_languages);
 }
 
 void ChromeClientImpl::AttachRootLayer(scoped_refptr<cc::Layer> root_layer,
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
index 401a1904..3333664 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -301,8 +301,10 @@
     }
 #endif
 
-    Walk(*view, /* iterator */ nullptr,
-         base::FeatureList::IsEnabled(::features::kWheelEventRegions));
+    is_wheel_event_regions_enabled_ =
+        base::FeatureList::IsEnabled(::features::kWheelEventRegions);
+
+    Walk(*view, /* iterator */ nullptr);
 #if DCHECK_IS_ON()
     view->AssertSubtreeClearedPaintInvalidationFlags();
 #endif
@@ -570,8 +572,7 @@
 
 void PrePaintTreeWalk::WalkInternal(const LayoutObject& object,
                                     const NGFragmentChildIterator* iterator,
-                                    PrePaintTreeWalkContext& context,
-                                    bool is_wheel_event_regions_enabled) {
+                                    PrePaintTreeWalkContext& context) {
   PaintInvalidatorContext& paint_invalidator_context =
       context.paint_invalidator_context;
 
@@ -613,7 +614,7 @@
   // depends on the effective allowed touch action and blocking wheel event
   // handlers.
   UpdateEffectiveAllowedTouchAction(object, context);
-  if (is_wheel_event_regions_enabled)
+  if (is_wheel_event_regions_enabled_)
     UpdateBlockingWheelEventHandler(object, context);
 
   if (paint_invalidator_.InvalidatePaint(
@@ -701,16 +702,14 @@
 }
 
 void PrePaintTreeWalk::WalkNGChildren(const LayoutObject* parent,
-                                      NGFragmentChildIterator* iterator,
-                                      bool is_wheel_event_regions_enabled) {
+                                      NGFragmentChildIterator* iterator) {
   for (; !iterator->IsAtEnd(); iterator->Advance()) {
     const LayoutObject* object = (*iterator)->GetLayoutObject();
     if (const auto* fragment_item = (*iterator)->FragmentItem()) {
       // Line boxes are not interesting. They have no paint effects. Descend
       // directly into children.
       if (fragment_item->Type() == NGFragmentItem::kLine) {
-        WalkChildren(/* parent */ nullptr, iterator,
-                     is_wheel_event_regions_enabled);
+        WalkChildren(/* parent */ nullptr, iterator);
         continue;
       }
     } else if (!object) {
@@ -732,13 +731,12 @@
         containing_block_context = &context.current;
         containing_block_context->paint_offset += offset;
       }
-      WalkChildren(/* parent */ nullptr, iterator,
-                   is_wheel_event_regions_enabled);
+      WalkChildren(/* parent */ nullptr, iterator);
       if (containing_block_context)
         containing_block_context->paint_offset -= offset;
       continue;
     }
-    Walk(*object, iterator, is_wheel_event_regions_enabled);
+    Walk(*object, iterator);
   }
 
   const LayoutBlockFlow* parent_block = DynamicTo<LayoutBlockFlow>(parent);
@@ -754,8 +752,7 @@
   }
 }
 
-void PrePaintTreeWalk::WalkLegacyChildren(const LayoutObject& object,
-                                          bool is_wheel_event_regions_enabled) {
+void PrePaintTreeWalk::WalkLegacyChildren(const LayoutObject& object) {
   if (const auto* layout_box = DynamicTo<LayoutBox>(&object)) {
     if (layout_box->CanTraversePhysicalFragments()) {
       // Enter NG child fragment traversal. We'll stay in this mode for all
@@ -768,7 +765,7 @@
           To<NGPhysicalBoxFragment>(*layout_box->GetPhysicalFragment(0));
       DCHECK(!fragment.BreakToken());
       NGFragmentChildIterator child_iterator(fragment);
-      WalkNGChildren(&object, &child_iterator, is_wheel_event_regions_enabled);
+      WalkNGChildren(&object, &child_iterator);
       return;
     }
   }
@@ -781,7 +778,7 @@
     // way).
     if (const LayoutBox* legend =
             LayoutFieldset::FindInFlowLegend(To<LayoutBlock>(object)))
-      Walk(*legend, /* iterator */ nullptr, is_wheel_event_regions_enabled);
+      Walk(*legend, /* iterator */ nullptr);
   }
 
   for (const LayoutObject* child = object.SlowFirstChild(); child;
@@ -809,7 +806,7 @@
     if (UNLIKELY(child->IsRenderedLegend()))
       continue;
 
-    Walk(*child, /* iterator */ nullptr, is_wheel_event_regions_enabled);
+    Walk(*child, /* iterator */ nullptr);
   }
 
   if (!RuntimeEnabledFeatures::LayoutNGFragmentTraversalEnabled())
@@ -853,18 +850,17 @@
         !ObjectRequiresTreeBuilderContext(*box))
       continue;
     DCHECK_EQ(box->Container(), &object);
-    Walk(*box, /* iterator */ nullptr, is_wheel_event_regions_enabled);
+    Walk(*box, /* iterator */ nullptr);
   }
 }
 
 void PrePaintTreeWalk::WalkChildren(const LayoutObject* object,
-                                    const NGFragmentChildIterator* iterator,
-                                    bool is_wheel_event_regions_enabled) {
+                                    const NGFragmentChildIterator* iterator) {
   DCHECK(iterator || object);
 
   if (!iterator) {
     // We're not doing LayoutNG fragment traversal of this object.
-    WalkLegacyChildren(*object, is_wheel_event_regions_enabled);
+    WalkLegacyChildren(*object);
     return;
   }
 
@@ -878,18 +874,17 @@
            (object->IsBox() &&
             To<LayoutBox>(object)->GetNGPaginationBreakability() ==
                 LayoutBox::kForbidBreaks));
-    WalkLegacyChildren(*object, is_wheel_event_regions_enabled);
+    WalkLegacyChildren(*object);
     return;
   }
 
   // Traverse child NG fragments.
   NGFragmentChildIterator child_iterator(iterator->Descend());
-  WalkNGChildren(object, &child_iterator, is_wheel_event_regions_enabled);
+  WalkNGChildren(object, &child_iterator);
 }
 
 void PrePaintTreeWalk::Walk(const LayoutObject& object,
-                            const NGFragmentChildIterator* iterator,
-                            bool is_wheel_event_regions_enabled) {
+                            const NGFragmentChildIterator* iterator) {
   const NGPhysicalBoxFragment* physical_fragment = nullptr;
   bool is_last_fragment = true;
   if (iterator) {
@@ -944,7 +939,7 @@
       context().tree_builder_context->clip_changed = false;
   }
 
-  WalkInternal(object, iterator, context(), is_wheel_event_regions_enabled);
+  WalkInternal(object, iterator, context());
 
   bool child_walk_blocked = object.ChildPrePaintBlockedByDisplayLock();
   // If we need a subtree walk due to context flags, we need to store that
@@ -964,7 +959,7 @@
   }
 
   if (!child_walk_blocked) {
-    WalkChildren(&object, iterator, is_wheel_event_regions_enabled);
+    WalkChildren(&object, iterator);
 
     if (const auto* layout_embedded_content =
             DynamicTo<LayoutEmbeddedContent>(object)) {
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
index e0a2f5f0..f0b77ec 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
@@ -130,24 +130,13 @@
   // very big stack frames. Splitting the heavy lifting to a separate function
   // makes sure the stack frame is freed prior to making a recursive call.
   // See https://crbug.com/781301 .
-
-  // TODO(https://crbug.com/841364): Remove is_wheel_event_regions_enabled
-  // argument once kWheelEventRegions feature flag is removed.
   NOINLINE void WalkInternal(const LayoutObject&,
                              const NGFragmentChildIterator*,
-                             PrePaintTreeWalkContext&,
-                             bool is_wheel_event_regions_enabled);
-  void WalkNGChildren(const LayoutObject* parent,
-                      NGFragmentChildIterator*,
-                      bool is_wheel_event_regions_enabled);
-  void WalkLegacyChildren(const LayoutObject&,
-                          bool is_wheel_event_regions_enabled);
-  void WalkChildren(const LayoutObject*,
-                    const NGFragmentChildIterator*,
-                    bool is_wheel_event_regions_enabled);
-  void Walk(const LayoutObject&,
-            const NGFragmentChildIterator*,
-            bool is_wheel_event_regions_enabled);
+                             PrePaintTreeWalkContext&);
+  void WalkNGChildren(const LayoutObject* parent, NGFragmentChildIterator*);
+  void WalkLegacyChildren(const LayoutObject&);
+  void WalkChildren(const LayoutObject*, const NGFragmentChildIterator*);
+  void Walk(const LayoutObject&, const NGFragmentChildIterator*);
 
   bool NeedsTreeBuilderContextUpdate(const LocalFrameView&,
                                      const PrePaintTreeWalkContext&);
@@ -176,6 +165,10 @@
   PaintInvalidator paint_invalidator_;
   Vector<PrePaintTreeWalkContext> context_storage_;
 
+  // TODO(https://crbug.com/841364): Remove is_wheel_event_regions_enabled
+  // argument once kWheelEventRegions feature flag is removed.
+  bool is_wheel_event_regions_enabled_ = false;
+
   bool needs_invalidate_chrome_client_ = false;
 
   FRIEND_TEST_ALL_PREFIXES(PrePaintTreeWalkTest, ClipRects);
diff --git a/third_party/blink/renderer/core/streams/queue_with_sizes.cc b/third_party/blink/renderer/core/streams/queue_with_sizes.cc
index 280c8b5..13f04af 100644
--- a/third_party/blink/renderer/core/streams/queue_with_sizes.cc
+++ b/third_party/blink/renderer/core/streams/queue_with_sizes.cc
@@ -8,7 +8,6 @@
 
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/streams/queue_with_sizes.h b/third_party/blink/renderer/core/streams/queue_with_sizes.h
index 343134e..49b3dea 100644
--- a/third_party/blink/renderer/core/streams/queue_with_sizes.h
+++ b/third_party/blink/renderer/core/streams/queue_with_sizes.h
@@ -10,12 +10,12 @@
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
 
 class ExceptionState;
-class Visitor;
 
 // Implementation of the "Queue-with-sizes" operations from the standard. Unlike
 // the standard, these operations do not operate polymorphically on the
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc
index 965a6bc..6473b218 100644
--- a/third_party/blink/renderer/core/streams/readable_stream.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -42,7 +42,6 @@
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/deque.h"
diff --git a/third_party/blink/renderer/core/streams/readable_stream.h b/third_party/blink/renderer/core/streams/readable_stream.h
index 7bf0f04..de62350 100644
--- a/third_party/blink/renderer/core/streams/readable_stream.h
+++ b/third_party/blink/renderer/core/streams/readable_stream.h
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -37,7 +38,6 @@
 class StreamPromiseResolver;
 class StreamStartAlgorithm;
 class UnderlyingSourceBase;
-class Visitor;
 class WritableStream;
 
 // C++ implementation of ReadableStream.
diff --git a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h
index 825bdda..9843b82e 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h
+++ b/third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h
@@ -8,13 +8,13 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
 
 class ReadableStreamDefaultController;
 class ScriptState;
-class Visitor;
 
 class CORE_EXPORT ReadableStreamDefaultControllerWithScriptScope
     : public GarbageCollected<ReadableStreamDefaultControllerWithScriptScope> {
diff --git a/third_party/blink/renderer/core/streams/readable_stream_generic_reader.h b/third_party/blink/renderer/core/streams/readable_stream_generic_reader.h
index 1fe26a2b..dc3b7535 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_generic_reader.h
+++ b/third_party/blink/renderer/core/streams/readable_stream_generic_reader.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -17,7 +18,6 @@
 class ScriptPromise;
 class ScriptState;
 class StreamPromiseResolver;
-class Visitor;
 
 // The specification sometimes treats ReadableStreamDefaultReader and
 // ReadableStreamBYOBReader generically. Currently ReadableStreamBYOBReader
diff --git a/third_party/blink/renderer/core/streams/stream_algorithms.h b/third_party/blink/renderer/core/streams/stream_algorithms.h
index c56a8ff..5362af4 100644
--- a/third_party/blink/renderer/core/streams/stream_algorithms.h
+++ b/third_party/blink/renderer/core/streams/stream_algorithms.h
@@ -8,13 +8,13 @@
 #include "base/optional.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
 
 class ExceptionState;
 class ScriptState;
-class Visitor;
 
 // Base class for algorithms that calculate the size of a given chunk as part of
 // the stream's queuing strategy. This is the type for the
diff --git a/third_party/blink/renderer/core/streams/stream_promise_resolver.cc b/third_party/blink/renderer/core/streams/stream_promise_resolver.cc
index 505c7b6..9cb2089 100644
--- a/third_party/blink/renderer/core/streams/stream_promise_resolver.cc
+++ b/third_party/blink/renderer/core/streams/stream_promise_resolver.cc
@@ -7,7 +7,6 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/streams/stream_promise_resolver.h b/third_party/blink/renderer/core/streams/stream_promise_resolver.h
index b4528cf6..38f8fa7 100644
--- a/third_party/blink/renderer/core/streams/stream_promise_resolver.h
+++ b/third_party/blink/renderer/core/streams/stream_promise_resolver.h
@@ -8,13 +8,13 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
 
 class ScriptPromise;
 class ScriptState;
-class Visitor;
 
 // A thin wrapper around v8::Promise::Resolver that matches the semantics used
 // for promises in the standard. StreamPromiseResolver is used for promises that
diff --git a/third_party/blink/renderer/core/streams/transform_stream.cc b/third_party/blink/renderer/core/streams/transform_stream.cc
index bd1659b..884e518 100644
--- a/third_party/blink/renderer/core/streams/transform_stream.cc
+++ b/third_party/blink/renderer/core/streams/transform_stream.cc
@@ -21,7 +21,6 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/to_v8.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
diff --git a/third_party/blink/renderer/core/streams/transform_stream.h b/third_party/blink/renderer/core/streams/transform_stream.h
index 56f14c3..64b8fa71 100644
--- a/third_party/blink/renderer/core/streams/transform_stream.h
+++ b/third_party/blink/renderer/core/streams/transform_stream.h
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -23,7 +24,6 @@
 class StreamStartAlgorithm;
 class TransformStreamDefaultController;
 class TransformStreamTransformer;
-class Visitor;
 class WritableStream;
 
 // Implementation of TransformStream for Blink.  See
diff --git a/third_party/blink/renderer/core/streams/transform_stream_default_controller.cc b/third_party/blink/renderer/core/streams/transform_stream_default_controller.cc
index a85ce1d..2929929 100644
--- a/third_party/blink/renderer/core/streams/transform_stream_default_controller.cc
+++ b/third_party/blink/renderer/core/streams/transform_stream_default_controller.cc
@@ -16,7 +16,6 @@
 #include "third_party/blink/renderer/platform/bindings/to_v8.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 
diff --git a/third_party/blink/renderer/core/streams/transform_stream_default_controller.h b/third_party/blink/renderer/core/streams/transform_stream_default_controller.h
index 70130dc..b274e19f 100644
--- a/third_party/blink/renderer/core/streams/transform_stream_default_controller.h
+++ b/third_party/blink/renderer/core/streams/transform_stream_default_controller.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -17,7 +18,6 @@
 class ScriptState;
 class StreamAlgorithm;
 class TransformStream;
-class Visitor;
 
 class CORE_EXPORT TransformStreamDefaultController : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
diff --git a/third_party/blink/renderer/core/streams/transform_stream_transformer.h b/third_party/blink/renderer/core/streams/transform_stream_transformer.h
index 48ac197..530b2c9 100644
--- a/third_party/blink/renderer/core/streams/transform_stream_transformer.h
+++ b/third_party/blink/renderer/core/streams/transform_stream_transformer.h
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -17,7 +18,6 @@
 class ScriptPromise;
 class ScriptState;
 class TransformStreamDefaultController;
-class Visitor;
 
 // Interface to be implemented by C++ code that needs to create a
 // TransformStream. Based on the JavaScript [Transformer
diff --git a/third_party/blink/renderer/core/streams/writable_stream_default_controller.cc b/third_party/blink/renderer/core/streams/writable_stream_default_controller.cc
index d366fe4..cc76647 100644
--- a/third_party/blink/renderer/core/streams/writable_stream_default_controller.cc
+++ b/third_party/blink/renderer/core/streams/writable_stream_default_controller.cc
@@ -16,7 +16,6 @@
 #include "third_party/blink/renderer/platform/bindings/to_v8.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/streams/writable_stream_default_controller.h b/third_party/blink/renderer/core/streams/writable_stream_default_controller.h
index 191a06da..3351dcd 100644
--- a/third_party/blink/renderer/core/streams/writable_stream_default_controller.h
+++ b/third_party/blink/renderer/core/streams/writable_stream_default_controller.h
@@ -7,6 +7,7 @@
 
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -18,7 +19,6 @@
 class StrategySizeAlgorithm;
 class StreamAlgorithm;
 class StreamStartAlgorithm;
-class Visitor;
 class WritableStreamDefaultWriter;
 class WritableStream;
 
diff --git a/third_party/blink/renderer/core/streams/writable_stream_default_writer.cc b/third_party/blink/renderer/core/streams/writable_stream_default_writer.cc
index 940f5a9..d3e696f1f 100644
--- a/third_party/blink/renderer/core/streams/writable_stream_default_writer.cc
+++ b/third_party/blink/renderer/core/streams/writable_stream_default_writer.cc
@@ -13,7 +13,6 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
diff --git a/third_party/blink/renderer/core/streams/writable_stream_default_writer.h b/third_party/blink/renderer/core/streams/writable_stream_default_writer.h
index f81f40b..c9ae03f8 100644
--- a/third_party/blink/renderer/core/streams/writable_stream_default_writer.h
+++ b/third_party/blink/renderer/core/streams/writable_stream_default_writer.h
@@ -8,6 +8,7 @@
 #include "base/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -17,7 +18,6 @@
 class ScriptState;
 class ScriptValue;
 class StreamPromiseResolver;
-class Visitor;
 class WritableStream;
 class WritableStream;
 
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index 48612ba6..ed6d10f 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -384,14 +384,6 @@
       default_value: "false",
       field_group: "*",
     },
-    {
-      name: "SelfOrAncestorHasDirAutoAttribute",
-      inherited: true,
-      field_template: "primitive",
-      type_name: "bool",
-      default_value: "false",
-      field_group: "*",
-    },
     // Though position: sticky is not itself an inherited property, being a
     // descendent of a sticky element changes some document lifecycle logic.
     {
diff --git a/third_party/blink/renderer/core/svg/svg_animated_path.cc b/third_party/blink/renderer/core/svg/svg_animated_path.cc
index 5bacbfdb..5e5723c 100644
--- a/third_party/blink/renderer/core/svg/svg_animated_path.cc
+++ b/third_party/blink/renderer/core/svg/svg_animated_path.cc
@@ -46,10 +46,10 @@
 SVGAnimatedPath::~SVGAnimatedPath() = default;
 
 const CSSValue& SVGAnimatedPath::CssValue() const {
-  const cssvalue::CSSPathValue* path_value = CurrentValue()->PathValue();
-  if (path_value->GetStylePath()->ByteStream().IsEmpty())
+  const cssvalue::CSSPathValue& path_value = CurrentValue()->PathValue();
+  if (path_value.GetStylePath()->ByteStream().IsEmpty())
     return *CSSIdentifierValue::Create(CSSValueID::kNone);
-  return *path_value;
+  return path_value;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_path.cc b/third_party/blink/renderer/core/svg/svg_path.cc
index e2dd56c..dabcc69 100644
--- a/third_party/blink/renderer/core/svg/svg_path.cc
+++ b/third_party/blink/renderer/core/svg/svg_path.cc
@@ -82,9 +82,7 @@
 
 SVGPath::SVGPath() : path_value_(CSSPathValue::EmptyPathValue()) {}
 
-SVGPath::SVGPath(CSSPathValue* path_value) : path_value_(path_value) {
-  DCHECK(path_value_);
-}
+SVGPath::SVGPath(const CSSPathValue& path_value) : path_value_(path_value) {}
 
 SVGPath::~SVGPath() = default;
 
@@ -93,7 +91,7 @@
 }
 
 SVGPath* SVGPath::Clone() const {
-  return MakeGarbageCollected<SVGPath>(path_value_);
+  return MakeGarbageCollected<SVGPath>(*path_value_);
 }
 
 SVGParsingError SVGPath::SetValueAsString(const String& string) {
@@ -110,7 +108,7 @@
       std::make_unique<SVGPathByteStream>();
   BuildByteStreamFromString(value, *byte_stream);
   return MakeGarbageCollected<SVGPath>(
-      MakeGarbageCollected<CSSPathValue>(std::move(byte_stream)));
+      *MakeGarbageCollected<CSSPathValue>(std::move(byte_stream)));
 }
 
 void SVGPath::Add(const SVGPropertyBase* other, const SVGElement*) {
diff --git a/third_party/blink/renderer/core/svg/svg_path.h b/third_party/blink/renderer/core/svg/svg_path.h
index 481529cb..f185337 100644
--- a/third_party/blink/renderer/core/svg/svg_path.h
+++ b/third_party/blink/renderer/core/svg/svg_path.h
@@ -44,14 +44,14 @@
   typedef void TearOffType;
 
   SVGPath();
-  explicit SVGPath(cssvalue::CSSPathValue*);
+  explicit SVGPath(const cssvalue::CSSPathValue&);
   ~SVGPath() override;
 
   const SVGPathByteStream& ByteStream() const {
     return path_value_->ByteStream();
   }
   StylePath* GetStylePath() const { return path_value_->GetStylePath(); }
-  cssvalue::CSSPathValue* PathValue() const { return path_value_.Get(); }
+  const cssvalue::CSSPathValue& PathValue() const { return *path_value_; }
 
   // SVGPropertyBase:
   SVGPath* Clone() const;
@@ -77,7 +77,7 @@
   void Trace(Visitor*) const override;
 
  private:
-  Member<cssvalue::CSSPathValue> path_value_;
+  Member<const cssvalue::CSSPathValue> path_value_;
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
index e3dc2bb..283659c 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
@@ -214,6 +214,8 @@
     const WTF::String& source_id,
     const WTF::String& untrusted_stack_trace) {}
 
+void FakeLocalFrameHost::FrameSizeChanged(const gfx::Size& frame_size) {}
+
 void FakeLocalFrameHost::BindFrameHostReceiver(
     mojo::ScopedInterfaceEndpointHandle handle) {
   receiver_.Bind(mojo::PendingAssociatedReceiver<mojom::blink::LocalFrameHost>(
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.h b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
index 73dcbb9..b4933c5e 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.h
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
@@ -140,6 +140,7 @@
       int32_t line_no,
       const WTF::String& source_id,
       const WTF::String& untrusted_stack_trace) override;
+  void FrameSizeChanged(const gfx::Size& frame_size) override;
 
  private:
   void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.h b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.h
index 432a8273..1c1ba14c 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.h
@@ -71,6 +71,10 @@
   bool IsLineBreakingObject() const override;
   int TextLength() const override;
 
+  // Always a leaf.
+  bool CanHaveChildren() const override { return false; }
+  void AddChildren() override {}
+
  private:
   bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
index 4a6df3e..164cc02 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
@@ -58,18 +58,20 @@
 }
 
 void AXMenuList::ClearChildren() {
-  children_dirty_ = false;
   if (children_.IsEmpty())
     return;
 
-  // There's no reason to clear our AXMenuListPopup child. If we get a
-  // call to clearChildren, it's because the options might have changed,
-  // so call it on our popup. Clearing the AXMenuListPopup child would cause
-  // additional thrashing and events that the AT would need to process,
-  // potentially causing the AT to believe that the popup had closed and a
-  // new popup and reopened.
+  // Unless the menu list is detached, there's no reason to clear our
+  // AXMenuListPopup child. If we get a call to clearChildren, it's because the
+  // options might have changed, so call it on our popup. Clearing the
+  // AXMenuListPopup child would cause additional thrashing and events that the
+  // AT would need to process, potentially causing the AT to believe that the
+  // popup had closed and a new popup and reopened.
   DCHECK_EQ(children_.size(), 1U);
   children_[0]->ClearChildren();
+
+  if (IsDetached())
+    AXObject::ClearChildren();
 }
 
 void AXMenuList::AddChildren() {
@@ -77,20 +79,30 @@
   DCHECK(!IsDetached());
   DCHECK(!is_adding_children_) << " Reentering method on " << GetNode();
   base::AutoReset<bool> reentrancy_protector(&is_adding_children_, true);
-  DCHECK_EQ(children_.size(), 0U)
+  // ClearChildren() does not clear the menulist popup chld.
+  DCHECK_LE(children_.size(), 1U)
       << "Parent still has " << children_.size() << " children before adding:"
       << "\nParent is " << ToString(true, true) << "\nFirst child is "
       << children_[0]->ToString(true, true);
 #endif
-  have_children_ = true;
 
-  AXObjectCacheImpl& cache = AXObjectCache();
-  AXObject* popup =
-      cache.CreateAndInit(ax::mojom::blink::Role::kMenuListPopup, this);
-  DCHECK(popup);
-  DCHECK(!popup->IsDetached());
-  children_.push_back(popup);
-  popup->AddChildren();
+  DCHECK(children_dirty_);
+  children_dirty_ = false;
+
+  // Ensure mock AXMenuListPopup exists.
+  if (children_.IsEmpty()) {
+    AXObjectCacheImpl& cache = AXObjectCache();
+    AXObject* popup =
+        cache.CreateAndInit(ax::mojom::blink::Role::kMenuListPopup, this);
+    DCHECK(popup);
+    DCHECK(!popup->IsDetached());
+    DCHECK(popup->CachedParentObject());
+    children_.push_back(popup);
+  }
+
+  // Update mock AXMenuListPopup children.
+  children_[0]->SetNeedsToUpdateChildren();
+  children_[0]->UpdateChildrenIfNecessary();
 }
 
 bool AXMenuList::IsCollapsed() const {
@@ -113,7 +125,10 @@
   bool suppress_notifications =
       (GetNode() && !GetNode()->IsFinishedParsingChildren());
 
-  if (HasChildren()) {
+  // TODO(aleventhal) The  NeedsToUpdateChildren() check is necessary to avoid a
+  // illegal lifecycle while adding children, since this can be called at any
+  // time by AXObjectCacheImpl(). Look into calling with clean layout.
+  if (!NeedsToUpdateChildren()) {
     const auto& child_objects = ChildrenIncludingIgnored();
     if (!child_objects.IsEmpty()) {
       DCHECK_EQ(child_objects.size(), 1ul);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc
index 57e1be17..0e9b8ae 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc
@@ -73,9 +73,10 @@
   if (!menu_list)
     return select_ax_object;
 
-  if (!menu_list->HasChildren()) {
+  // In order to return the popup, which is a mock object, we need to grab
+  // the AXMenuList itself, and get its only child.
+  if (menu_list->NeedsToUpdateChildren())
     menu_list->UpdateChildrenIfNecessary();
-  }
 
   const auto& child_objects = menu_list->ChildrenIncludingIgnored();
   if (child_objects.IsEmpty())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc
index 595053f..3497a6a69 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.cc
@@ -107,7 +107,8 @@
   if (!html_select_element)
     return;
 
-  have_children_ = true;
+  DCHECK(children_dirty_);
+  children_dirty_ = false;
 
   if (active_index_ == -1)
     active_index_ = GetSelectedIndex();
@@ -121,14 +122,6 @@
   }
 }
 
-void AXMenuListPopup::UpdateChildrenIfNecessary() {
-  if (have_children_ && parent_ && parent_->NeedsToUpdateChildren())
-    ClearChildren();
-
-  if (!have_children_)
-    AddChildren();
-}
-
 void AXMenuListPopup::DidUpdateActiveOption(int option_index,
                                             bool fire_notifications) {
   UpdateChildrenIfNecessary();
@@ -165,8 +158,7 @@
 }
 
 void AXMenuListPopup::DidShow() {
-  if (!have_children_)
-    AddChildren();
+  UpdateChildrenIfNecessary();
 
   AXObjectCacheImpl& cache = AXObjectCache();
   cache.PostNotification(this, ax::mojom::Event::kShow);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.h b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.h
index fc180737..852a05bd 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list_popup.h
@@ -46,7 +46,6 @@
   void DidShow();
   void DidHide();
   AXObject* ActiveDescendant() final;
-  void UpdateChildrenIfNecessary() override;
 
  private:
   bool IsMenuListPopup() const override { return true; }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 523b1f4..8dea022 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -198,7 +198,6 @@
 
 AXNodeObject::AXNodeObject(Node* node, AXObjectCacheImpl& ax_object_cache)
     : AXObject(ax_object_cache),
-      children_dirty_(false),
       native_role_(ax::mojom::blink::Role::kUnknown),
       node_(node) {}
 
@@ -3122,7 +3121,7 @@
   if (GetLayoutObject()->IsText()) {
     ClearChildren();
     AddInlineTextBoxChildren(true);
-    have_children_ = true;  // Avoid adding these children twice.
+    children_dirty_ = false;  // Avoid adding these children twice.
     return;
   }
 
@@ -3256,6 +3255,10 @@
   DCHECK(!IsDetached());
   DCHECK(!is_adding_children_) << " Reentering method on " << GetNode();
   base::AutoReset<bool> reentrancy_protector(&is_adding_children_, true);
+  // If the need to add more children in addition to existing children arises,
+  // childrenChanged should have been called, which leads to children_dirty_
+  // being true, then UpdateChildrenIfNecessary() clears the children before
+  // calling AddChildren().
   DCHECK_EQ(children_.size(), 0U)
       << "\nParent still has " << children_.size() << " children before adding:"
       << "\nParent is " << ToString(true, true) << "\nFirst child is "
@@ -3264,12 +3267,8 @@
 #define CHECK_ATTACHED() \
   DCHECK(!IsDetached()) << "Detached adding children: " << ToString(true, true)
 
-  // If the need to add more children in addition to existing children arises,
-  // childrenChanged should have been called, leaving the object with no
-  // children.
-  DCHECK(!have_children_);
-
-  have_children_ = true;
+  DCHECK(children_dirty_);
+  children_dirty_ = false;
 
   if (!CanHaveChildren())
     return;
@@ -3438,11 +3437,6 @@
   }
 }
 
-void AXNodeObject::ClearChildren() {
-  AXObject::ClearChildren();
-  children_dirty_ = false;
-}
-
 bool AXNodeObject::CanHaveChildren() const {
   // If this is an AXLayoutObject, then it's okay if this object
   // doesn't have a node - there are some layoutObjects that don't have
@@ -3853,73 +3847,6 @@
                                    ax::mojom::blink::Event::kChildrenChanged);
 }
 
-void AXNodeObject::UpdateChildrenIfNecessary() {
-#if DCHECK_IS_ON()
-  DCHECK(GetDocument());
-  DCHECK(GetDocument()->IsActive());
-  DCHECK(!GetDocument()->IsDetached());
-  DCHECK(GetDocument()->GetPage());
-  DCHECK(GetDocument()->View());
-  DCHECK(!AXObjectCache().HasBeenDisposed());
-
-  // Store previous children for DCHECK to ensure no lost children, left
-  // without parents.
-  HashSet<AXID> prev_children_axids;
-  for (const auto& child : children_) {
-    if (!child->IsDetached()) {
-      AXID prev_child_axid = child->AXObjectID();
-      prev_children_axids.insert(prev_child_axid);
-      DCHECK(AXObjectCache().ObjectFromAXID(prev_child_axid));
-    }
-  }
-#endif
-
-  // Clear current children and get new children.
-  // TODO(accessibility) is it necessary to have a separate
-  // NeedsToUpdateChildren() from HasChildren()?
-  if (NeedsToUpdateChildren()) {
-    ClearChildren();
-    if (!IsMenuList()) {  // AXMenuList is special and keeps its popup child.
-      // Ensure children have been correctly cleared.
-      DCHECK(!HasChildren())
-          << GetNode() << "  with " << children_.size() << " children";
-      DCHECK_EQ(children_.size(), 0U);
-    }
-  } else if (HasChildren()) {
-    return;  // Keep existing children.
-  } else {
-    // Will update children even though NeedsToUpdateChildren() was not true.
-    // Cannot have children otherwise will end up adding to them.
-    DCHECK_EQ(children_.size(), 0U);
-  }
-
-  AXObject::UpdateChildrenIfNecessary();
-
-#if DCHECK_IS_ON()
-  // Remove current children's AXIDs from set so that we can see what children
-  // have been lost.
-  for (const auto& child : children_)
-    prev_children_axids.erase(child->AXObjectID());
-
-  // Report lost children. These are children that had |this| as a parent at
-  // the start of this method, but no longer do, yet the cache still considers
-  // them alive.
-  bool has_last_children = false;
-  for (AXID prev_child_axid : prev_children_axids) {
-    AXObject* prev_child = nullptr;
-    if (prev_child_axid)
-      AXObjectCache().ObjectFromAXID(prev_child_axid);
-    if (prev_child) {
-      has_last_children = true;
-      LOG(ERROR) << "Lost child: " << prev_child->ToString(true, true)
-                 << "\nThis: " << ToString(true, true);
-    }
-  }
-
-  DCHECK(!has_last_children);
-#endif
-}
-
 void AXNodeObject::SelectedOptions(AXObjectVector& options) const {
   if (auto* select = DynamicTo<HTMLSelectElement>(GetNode())) {
     for (auto* const option : *select->selectedOptions()) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
index b322fd1..d2e5b1d 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -48,7 +48,6 @@
   void Trace(Visitor*) const override;
 
  protected:
-  bool children_dirty_;
 #if DCHECK_IS_ON()
   bool initialized_ = false;
 #endif
@@ -208,7 +207,6 @@
                          bool* clips_children = nullptr) const override;
 
   void AddChildren() override;
-
   bool CanHaveChildren() const override;
   // Set is_from_aria_owns to true if the child is being added because it was
   // pointed to from aria-owns.
@@ -220,10 +218,6 @@
   // Set is_from_aria_owns to true if the child is being insert because it was
   // pointed to from aria-owns.
   void InsertChild(AXObject*, unsigned index, bool is_from_aria_owns = false);
-  void ClearChildren() override;
-  bool NeedsToUpdateChildren() const override { return children_dirty_; }
-  void SetNeedsToUpdateChildren() override { children_dirty_ = true; }
-  void UpdateChildrenIfNecessary() override;
   void SelectedOptions(AXObjectVector&) const override;
 
   // Properties of the object's owning document or page.
@@ -280,9 +274,6 @@
     return dom_role;
   }
 
-  FRIEND_TEST_ALL_PREFIXES(AccessibilityTest, SetNeedsToUpdateChildren);
-  FRIEND_TEST_ALL_PREFIXES(AccessibilityTest, UpdateChildrenIfNecessary);
-
  private:
   bool HasInternalsAttribute(Element&, const QualifiedName&) const;
   const AtomicString& GetInternalsAttribute(Element&,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index ef9fd81..a9eec38 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -609,7 +609,7 @@
 AXObject::AXObject(AXObjectCacheImpl& ax_object_cache)
     : id_(0),
       parent_(nullptr),
-      have_children_(false),
+      children_dirty_(true),
       role_(ax::mojom::blink::Role::kUnknown),
       aria_role_(ax::mojom::blink::Role::kUnknown),
       explicit_container_id_(0),
@@ -3708,8 +3708,64 @@
 }
 
 void AXObject::UpdateChildrenIfNecessary() {
-  if (!HasChildren())
-    AddChildren();
+#if DCHECK_IS_ON()
+  DCHECK(GetDocument());
+  DCHECK(GetDocument()->IsActive());
+  DCHECK(!GetDocument()->IsDetached());
+  DCHECK(GetDocument()->GetPage());
+  DCHECK(GetDocument()->View());
+  DCHECK(!AXObjectCache().HasBeenDisposed());
+
+  // Store previous children for DCHECK to ensure no lost children, left
+  // without parents.
+  HashSet<AXID> prev_children_axids;
+  for (const auto& child : children_) {
+    if (!child->IsDetached()) {
+      AXID prev_child_axid = child->AXObjectID();
+      prev_children_axids.insert(prev_child_axid);
+      DCHECK(AXObjectCache().ObjectFromAXID(prev_child_axid));
+    }
+  }
+#endif
+
+  if (!NeedsToUpdateChildren())
+    return;
+
+  // Clear current children and get new children.
+  ClearChildren();
+  if (IsMenuList()) {
+    // AXMenuList is special and keeps its popup child.
+    DCHECK_LE(children_.size(), 1U);
+  } else {
+    // Ensure children have been correctly cleared.
+    DCHECK_EQ(children_.size(), 0U)
+        << GetNode() << "  with " << children_.size() << " children";
+  }
+  AddChildren();
+
+#if DCHECK_IS_ON()
+  // Remove current children's AXIDs from set so that we can see what children
+  // have been lost.
+  for (const auto& child : children_)
+    prev_children_axids.erase(child->AXObjectID());
+
+  // Report lost children. These are children that had |this| as a parent at
+  // the start of this method, but no longer do, yet the cache still considers
+  // them alive.
+  bool has_lost_children = false;
+  for (AXID prev_child_axid : prev_children_axids) {
+    AXObject* prev_child = nullptr;
+    if (prev_child_axid)
+      AXObjectCache().ObjectFromAXID(prev_child_axid);
+    if (prev_child) {
+      has_lost_children = true;
+      LOG(ERROR) << "Lost child: " << prev_child->ToString(true, true)
+                 << "\nThis: " << ToString(true, true);
+    }
+  }
+
+  DCHECK(!has_lost_children);
+#endif
 }
 
 void AXObject::ClearChildren() {
@@ -3728,11 +3784,6 @@
 
   // Loop through AXObject children.
 
-  if (!have_children_) {
-    DCHECK_EQ(children_.size(), 0U);
-    return;
-  }
-
   for (const auto& child : children_) {
     if (child->CachedParentObject() == this)
       child->DetachFromParent();
@@ -3758,7 +3809,6 @@
   }
 
   children_.clear();
-  have_children_ = false;
 }
 
 Element* AXObject::GetElement() const {
@@ -5022,8 +5072,12 @@
     }
     if (AriaHiddenRoot())
       string_builder = string_builder + " isAriaHidden";
-    if (IsHiddenViaStyle())
+    if (GetDocument() && GetDocument()->Lifecycle().GetState() <
+                             DocumentLifecycle::kLayoutClean) {
+      string_builder = string_builder + " styleInfoUnavailable";
+    } else if (IsHiddenViaStyle()) {
       string_builder = string_builder + " isHiddenViaCSS";
+    }
     if (GetNode() && GetNode()->IsInert())
       string_builder = string_builder + " isInert";
     if (NeedsToUpdateChildren())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 6b40093..d22ca0b7 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -1073,19 +1073,17 @@
   AXObject* ContainerWidget() const;
   bool IsContainerWidget() const;
 
-  virtual void AddChildren() {}
   // There are two types of traversal for obtaining children:
   // 1. LayoutTreeBuilderTraversal. Despite the name, this traverses a flattened
   // DOM tree that includes pseudo element children such as ::before, and where
   // shadow DOM slotting has been run.
   // 2. LayoutObject traversal. This is necessary if there is no parent node,
-  // or if the parent node is a pseudo element.
+  // or in a pseudo element subtree.
   bool ShouldUseLayoutObjectTraversalForChildren() const;
   virtual bool CanHaveChildren() const { return true; }
-  bool HasChildren() const { return have_children_; }
-  virtual void UpdateChildrenIfNecessary();
-  virtual bool NeedsToUpdateChildren() const { return false; }
-  virtual void SetNeedsToUpdateChildren() {}
+  void UpdateChildrenIfNecessary();
+  bool NeedsToUpdateChildren() const { return children_dirty_; }
+  void SetNeedsToUpdateChildren() { children_dirty_ = true; }
   virtual void ClearChildren();
   void DetachFromParent() { parent_ = nullptr; }
   virtual void SelectedOptions(AXObjectVector&) const {}
@@ -1245,12 +1243,14 @@
   mutable Member<AXObject> parent_;
   // Only children that are included in tree, maybe rename to children_in_tree_.
   AXObjectVector children_;
-  mutable bool have_children_;
+  bool children_dirty_;
   ax::mojom::blink::Role role_;
   ax::mojom::blink::Role aria_role_;
   LayoutRect explicit_element_rect_;
   AXID explicit_container_id_;
 
+  virtual void AddChildren() = 0;
+
   // Used only inside textAlternative():
   static String CollapseWhitespace(const String&);
   static String RecursiveTextAlternative(const AXObject&,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 3ce4624d..1e918e6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1418,6 +1418,7 @@
 
 #if DCHECK_IS_ON()
   Document* document = obj ? obj->GetDocument() : &optional_node->GetDocument();
+  DCHECK(document);
   DCHECK(document->Lifecycle().GetState() >= DocumentLifecycle::kLayoutClean)
       << "Unclean document at lifecycle " << document->Lifecycle().ToString();
 #endif  // DCHECK_IS_ON()
@@ -2537,7 +2538,7 @@
   // If it's a slider, invalidate the thumb's bounding box.
   AXObject* ax_object = Get(node);
   if (ax_object && ax_object->RoleValue() == ax::mojom::blink::Role::kSlider &&
-      ax_object->HasChildren() && !ax_object->NeedsToUpdateChildren() &&
+      !ax_object->NeedsToUpdateChildren() &&
       ax_object->ChildCountIncludingIgnored() == 1) {
     changed_bounds_ids_.insert(
         ax_object->ChildAtIncludingIgnored(0)->AXObjectID());
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
index 33dd355..bed8a94 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
@@ -66,6 +66,7 @@
   void ChildrenChanged() final { num_children_changed_calls_++; }
   AXObject* ComputeParentImpl() const final { return nullptr; }
   Document* GetDocument() const final { return &AXObjectCache().GetDocument(); }
+  void AddChildren() final {}
 };
 
 unsigned MockAXObject::num_children_changed_calls_ = 0;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_validation_message.h b/third_party/blink/renderer/modules/accessibility/ax_validation_message.h
index fd174fdb..1e3c7622 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_validation_message.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_validation_message.h
@@ -24,7 +24,9 @@
 
  private:
   // AXObject:
+  // Always a leaf.
   bool CanHaveChildren() const override { return false; }
+  void AddChildren() override {}
   bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
   void GetRelativeBounds(AXObject** out_container,
                          FloatRect& out_bounds_in_container,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc
index b31a2e63..5c87be6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc
@@ -39,8 +39,8 @@
   if (!accessible_node_)
     return;
 
-  DCHECK(!have_children_);
-  have_children_ = true;
+  DCHECK(children_dirty_);
+  children_dirty_ = false;
 
   for (const auto& child : accessible_node_->GetChildren()) {
     AXObject* ax_child = AXObjectCache().GetOrCreate(child, this);
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
index 3d770bf1a..242ab35a 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
@@ -17,7 +17,6 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
index 8fd5d01..fa733f0c7 100644
--- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
+++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.h
@@ -12,13 +12,13 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class ScriptState;
 class ReadableStream;
 class ReadableStreamDefaultControllerWithScriptScope;
-class Visitor;
 
 // Helper class to read from a mojo consumer handle
 class MODULES_EXPORT TCPReadableStreamWrapper final
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.h b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
index 5af8a94..81fb7731 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
+++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/streams/transform_stream.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
@@ -17,7 +18,6 @@
 class ReadableStream;
 class ScriptState;
 class TextDecoderOptions;
-class Visitor;
 class WritableStream;
 
 // Implements the TextDecoderStream interface as specified at
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.h b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
index 4ba6eced..a9c21a4 100644
--- a/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
+++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/streams/transform_stream.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
@@ -16,7 +17,6 @@
 class ReadableStream;
 class ScriptState;
 class WritableStream;
-class Visitor;
 
 // Implements the TextEncoderStream interface as specified at
 // https://encoding.spec.whatwg.org/#interface-textencoderstream.
diff --git a/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl b/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl
index 3279e8a..0b73e5cd 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl
+++ b/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl
@@ -6,7 +6,6 @@
   "desktop",
   "documents",
   "downloads",
-  "home",
   "music",
   "pictures",
   "videos",
diff --git a/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc
index ba70723..5f6b72d 100644
--- a/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc
+++ b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc
@@ -179,8 +179,6 @@
     return mojom::blink::CommonDirectory::kDirDocuments;
   else if (starting_directory == "downloads")
     return mojom::blink::CommonDirectory::kDirDownloads;
-  else if (starting_directory == "home")
-    return mojom::blink::CommonDirectory::kDirHome;
   else if (starting_directory == "music")
     return mojom::blink::CommonDirectory::kDirMusic;
   else if (starting_directory == "pictures")
diff --git a/third_party/blink/renderer/modules/font_access/font_manager.cc b/third_party/blink/renderer/modules/font_access/font_manager.cc
index c585f21..d73b1e4 100644
--- a/third_party/blink/renderer/modules/font_access/font_manager.cc
+++ b/third_party/blink/renderer/modules/font_access/font_manager.cc
@@ -116,7 +116,8 @@
     auto entry = FontEnumerationEntry{
         String::FromUTF8(element.postscript_name().c_str()),
         String::FromUTF8(element.full_name().c_str()),
-        String::FromUTF8(element.family().c_str())};
+        String::FromUTF8(element.family().c_str()),
+        String::FromUTF8(element.style().c_str())};
     entries.push_back(FontMetadata::Create(std::move(entry)));
   }
 
diff --git a/third_party/blink/renderer/modules/font_access/font_metadata.cc b/third_party/blink/renderer/modules/font_access/font_metadata.cc
index aae742f1..9dadce3 100644
--- a/third_party/blink/renderer/modules/font_access/font_metadata.cc
+++ b/third_party/blink/renderer/modules/font_access/font_metadata.cc
@@ -42,7 +42,8 @@
 FontMetadata::FontMetadata(const FontEnumerationEntry& entry)
     : postscriptName_(entry.postscript_name),
       fullName_(entry.full_name),
-      family_(entry.family) {}
+      family_(entry.family),
+      style_(entry.style) {}
 
 FontMetadata* FontMetadata::Create(const FontEnumerationEntry& entry) {
   return MakeGarbageCollected<FontMetadata>(entry);
diff --git a/third_party/blink/renderer/modules/font_access/font_metadata.h b/third_party/blink/renderer/modules/font_access/font_metadata.h
index 3ed9c162..62a46db 100644
--- a/third_party/blink/renderer/modules/font_access/font_metadata.h
+++ b/third_party/blink/renderer/modules/font_access/font_metadata.h
@@ -19,6 +19,7 @@
   String postscript_name;
   String full_name;
   String family;
+  String style;
 };
 
 class BLINK_EXPORT FontMetadata final : public ScriptWrappable {
@@ -42,12 +43,14 @@
   //  +----------------+---------+-----------+
   //  | postscriptName |       6 | No        |
   //  | family         |       1 | No        |
+  //  | style          |       2 | No        |
   //  | fullName       |       4 | Yes       |
   //  +----------------+---------+-----------+
 
   String postscriptName() const { return postscriptName_; }
   String fullName() const { return fullName_; }
   String family() const { return family_; }
+  String style() const { return style_; }
 
   ScriptPromise blob(ScriptState*);
 
@@ -59,6 +62,7 @@
   String postscriptName_;
   String fullName_;
   String family_;
+  String style_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/font_access/font_metadata.idl b/third_party/blink/renderer/modules/font_access/font_metadata.idl
index 14cde9c1..9079faf 100644
--- a/third_party/blink/renderer/modules/font_access/font_metadata.idl
+++ b/third_party/blink/renderer/modules/font_access/font_metadata.idl
@@ -11,5 +11,6 @@
   readonly attribute USVString postscriptName;
   readonly attribute USVString fullName;
   readonly attribute USVString family;
+  readonly attribute USVString style;
   [CallWith=ScriptState, Measure] Promise<Blob> blob();
 };
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
index c28f7640..fa6fa4a 100644
--- a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
+++ b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
@@ -8,7 +8,6 @@
 #include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h"
 #include "third_party/blink/renderer/modules/launch/launch_params.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h
index 51ae6529..a764f39 100644
--- a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h
+++ b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/supplementable.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -18,7 +19,6 @@
 namespace blink {
 
 class LocalDOMWindow;
-class Visitor;
 
 class DOMWindowLaunchQueue final
     : public GarbageCollected<DOMWindowLaunchQueue>,
diff --git a/third_party/blink/renderer/modules/launch/launch_params.cc b/third_party/blink/renderer/modules/launch/launch_params.cc
index 733f82f..7c9d1fa 100644
--- a/third_party/blink/renderer/modules/launch/launch_params.cc
+++ b/third_party/blink/renderer/modules/launch/launch_params.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/modules/launch/launch_params.h"
 
 #include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/launch/launch_params.h b/third_party/blink/renderer/modules/launch/launch_params.h
index 07b1805..29e8b6a6 100644
--- a/third_party/blink/renderer/modules/launch/launch_params.h
+++ b/third_party/blink/renderer/modules/launch/launch_params.h
@@ -9,11 +9,10 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
-class Visitor;
-
 class LaunchParams final : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
 
diff --git a/third_party/blink/renderer/modules/launch/launch_queue.cc b/third_party/blink/renderer/modules/launch/launch_queue.cc
index 20fe597..328e00c 100644
--- a/third_party/blink/renderer/modules/launch/launch_queue.cc
+++ b/third_party/blink/renderer/modules/launch/launch_queue.cc
@@ -6,7 +6,6 @@
 
 #include "third_party/blink/renderer/bindings/modules/v8/v8_launch_consumer.h"
 #include "third_party/blink/renderer/modules/launch/launch_params.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/launch/launch_queue.h b/third_party/blink/renderer/modules/launch/launch_queue.h
index 7651232..bd4086bf 100644
--- a/third_party/blink/renderer/modules/launch/launch_queue.h
+++ b/third_party/blink/renderer/modules/launch/launch_queue.h
@@ -9,11 +9,11 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class V8LaunchConsumer;
-class Visitor;
 
 class LaunchQueue final : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.cc b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
index b82ba21..bcc6511 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
@@ -84,7 +84,6 @@
   manifest_->name = ParseName(root_object.get());
   manifest_->short_name = ParseShortName(root_object.get());
   manifest_->description = ParseDescription(root_object.get());
-  manifest_->categories = ParseCategories(root_object.get());
   manifest_->start_url = ParseStartURL(root_object.get());
   manifest_->scope = ParseScope(root_object.get(), manifest_->start_url);
   manifest_->display = ParseDisplay(root_object.get());
@@ -277,28 +276,6 @@
   return description.has_value() ? *description : String();
 }
 
-Vector<String> ManifestParser::ParseCategories(const JSONObject* object) {
-  Vector<String> categories;
-
-  JSONValue* json_value = object->Get("categories");
-  if (!json_value)
-    return categories;
-
-  JSONArray* categories_list = object->GetArray("categories");
-  if (!categories_list) {
-    AddErrorInfo("property 'categories' ignored, type array expected.");
-    return categories;
-  }
-
-  for (wtf_size_t i = 0; i < categories_list->size(); ++i) {
-    String category_string;
-    categories_list->at(i)->AsString(&category_string);
-    categories.push_back(category_string.StripWhiteSpace().LowerASCII());
-  }
-
-  return categories;
-}
-
 KURL ManifestParser::ParseStartURL(const JSONObject* object) {
   return ParseURL(object, "start_url", manifest_url_,
                   ParseURLRestrictions::kSameOriginOnly);
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.h b/third_party/blink/renderer/modules/manifest/manifest_parser.h
index 21f54100..0b84159 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.h
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.h
@@ -119,12 +119,6 @@
   // Returns the parsed string if any, a null string if the parsing failed.
   String ParseDescription(const JSONObject* object);
 
-  // Parses the 'categories' field of the manifest, as defined in:
-  // https://w3c.github.io/manifest/#dfn-processing-the-categories-member
-  // Returns a vector of the parsed strings if any, or empty if the parsing
-  // failed.
-  Vector<String> ParseCategories(const JSONObject* object);
-
   // Parses the 'scope' field of the manifest, as defined in:
   // https://w3c.github.io/manifest/#scope-member. Returns the parsed KURL if
   // any, or start URL (falling back to document URL) without filename, path,
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
index 73066da9..d3f026b 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -207,53 +207,6 @@
   }
 }
 
-TEST_F(ManifestParserTest, CategoriesParseRules) {
-  // Smoke test.
-  {
-    auto& manifest = ParseManifest(R"({ "categories": ["cats", "memes"] })");
-    ASSERT_EQ(2u, manifest->categories.size());
-    ASSERT_EQ(manifest->categories[0], "cats");
-    ASSERT_EQ(manifest->categories[1], "memes");
-    ASSERT_FALSE(IsManifestEmpty(manifest));
-    EXPECT_EQ(0u, GetErrorCount());
-  }
-
-  // Trim whitespaces.
-  {
-    auto& manifest =
-        ParseManifest(R"({ "categories": ["  cats  ", "  memes  "] })");
-    ASSERT_EQ(2u, manifest->categories.size());
-    ASSERT_EQ(manifest->categories[0], "cats");
-    ASSERT_EQ(manifest->categories[1], "memes");
-    EXPECT_EQ(0u, GetErrorCount());
-  }
-
-  // Categories should be lower-cased.
-  {
-    auto& manifest = ParseManifest(R"({ "categories": ["CaTs", "Memes"] })");
-    ASSERT_EQ(2u, manifest->categories.size());
-    ASSERT_EQ(manifest->categories[0], "cats");
-    ASSERT_EQ(manifest->categories[1], "memes");
-    EXPECT_EQ(0u, GetErrorCount());
-  }
-
-  // Empty array.
-  {
-    auto& manifest = ParseManifest(R"({ "categories": [] })");
-    ASSERT_EQ(0u, manifest->categories.size());
-    EXPECT_EQ(0u, GetErrorCount());
-  }
-
-  // Detect error if categories isn't an array.
-  {
-    auto& manifest = ParseManifest(R"({ "categories": {} })");
-    ASSERT_EQ(0u, manifest->categories.size());
-    ASSERT_EQ(1u, GetErrorCount());
-    EXPECT_EQ("property 'categories' ignored, type array expected.",
-              errors()[0]);
-  }
-}
-
 TEST_F(ManifestParserTest, ShortNameParseRules) {
   // Smoke test.
   {
diff --git a/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h b/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h
index f1a6c0b..fd0b44a 100644
--- a/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h
+++ b/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h
@@ -8,11 +8,11 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class ScriptState;
-class Visitor;
 
 class DigitalGoodsService final : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
diff --git a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
index c1c2766..76b618e 100644
--- a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
+++ b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
@@ -8,13 +8,13 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/supplementable.h"
 
 namespace blink {
 
 class LocalDOMWindow;
 class ScriptState;
-class Visitor;
 
 class DOMWindowDigitalGoods final
     : public GarbageCollected<DOMWindowDigitalGoods>,
diff --git a/third_party/blink/renderer/modules/webcodecs/encoder_base.h b/third_party/blink/renderer/modules/webcodecs/encoder_base.h
index c07a14a35..196b71a 100644
--- a/third_party/blink/renderer/modules/webcodecs/encoder_base.h
+++ b/third_party/blink/renderer/modules/webcodecs/encoder_base.h
@@ -17,12 +17,12 @@
 #include "third_party/blink/renderer/modules/webcodecs/codec_logger.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/context_lifecycle_observer.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class ExceptionState;
 enum class DOMExceptionCode;
-class Visitor;
 
 template <typename Traits>
 class MODULES_EXPORT EncoderBase
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_object.h b/third_party/blink/renderer/modules/webgpu/dawn_object.h
index f9455440..c44571e 100644
--- a/third_party/blink/renderer/modules/webgpu/dawn_object.h
+++ b/third_party/blink/renderer/modules/webgpu/dawn_object.h
@@ -11,6 +11,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 #define DAWN_OBJECTS                          \
   X(BindGroup, bindGroup)                     \
@@ -60,7 +61,6 @@
 #undef X
 
 class GPUDevice;
-class Visitor;
 
 // This class allows objects to hold onto a DawnControlClientHolder.
 // The DawnControlClientHolder is used to hold the WebGPUInterface and keep
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.cc b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
index ee7fad3..ed584d2 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_stream.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
@@ -33,7 +33,6 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.h b/third_party/blink/renderer/modules/websockets/websocket_stream.h
index a2ec431..0e8cbae 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_stream.h
+++ b/third_party/blink/renderer/modules/websockets/websocket_stream.h
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 #include "v8/include/v8.h"
 
@@ -24,7 +25,6 @@
 class ScriptPromiseResolver;
 class ScriptState;
 class ScriptValue;
-class Visitor;
 class WebSocketChannel;
 class WebSocketCloseInfo;
 class WebSocketStreamOptions;
diff --git a/third_party/blink/renderer/modules/webtransport/incoming_stream.cc b/third_party/blink/renderer/modules/webtransport/incoming_stream.cc
index 29dba03..3b072d4 100644
--- a/third_party/blink/renderer/modules/webtransport/incoming_stream.cc
+++ b/third_party/blink/renderer/modules/webtransport/incoming_stream.cc
@@ -28,7 +28,6 @@
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "v8/include/v8.h"
diff --git a/third_party/blink/renderer/modules/webtransport/incoming_stream.h b/third_party/blink/renderer/modules/webtransport/incoming_stream.h
index 3bae558..924fce1 100644
--- a/third_party/blink/renderer/modules/webtransport/incoming_stream.h
+++ b/third_party/blink/renderer/modules/webtransport/incoming_stream.h
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
@@ -25,7 +26,6 @@
 class StreamAbortInfo;
 class ReadableStream;
 class ReadableStreamDefaultControllerWithScriptScope;
-class Visitor;
 
 // Implementation of the IncomingStream mixin from the standard:
 // https://wicg.github.io/web-transport/#incoming-stream. ReceiveStream and
diff --git a/third_party/blink/renderer/modules/webtransport/send_stream.cc b/third_party/blink/renderer/modules/webtransport/send_stream.cc
index c9f73db..3ee1506 100644
--- a/third_party/blink/renderer/modules/webtransport/send_stream.cc
+++ b/third_party/blink/renderer/modules/webtransport/send_stream.cc
@@ -9,7 +9,6 @@
 #include "base/notreached.h"
 #include "third_party/blink/renderer/modules/webtransport/quic_transport.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/webtransport/send_stream.h b/third_party/blink/renderer/modules/webtransport/send_stream.h
index d79444d2..cd48cd7 100644
--- a/third_party/blink/renderer/modules/webtransport/send_stream.h
+++ b/third_party/blink/renderer/modules/webtransport/send_stream.h
@@ -13,12 +13,12 @@
 #include "third_party/blink/renderer/modules/webtransport/web_transport_stream.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 
 namespace blink {
 
 class QuicTransport;
 class ScriptState;
-class Visitor;
 
 class MODULES_EXPORT SendStream final : public ScriptWrappable,
                                         public WebTransportStream,
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
index 08d609b4..58963c8 100644
--- a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
+++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
 
+#include "third_party/blink/renderer/platform/heap/trace_traits.h"
 #include "third_party/blink/renderer/platform/wtf/buildflags.h"
 
 #if BUILDFLAG(USE_V8_OILPAN)
@@ -13,4 +14,217 @@
 #include "third_party/blink/renderer/platform/heap/impl/collection_support/heap_hash_table_backing.h"
 #endif  // !USE_V8_OILPAN
 
+namespace blink {
+
+// Helper for processing ephemerons represented as KeyValuePair. Reorders
+// parameters if needed so that KeyType is always weak.
+template <typename _KeyType,
+          typename _ValueType,
+          typename _KeyTraits,
+          typename _ValueTraits,
+          bool = WTF::IsWeak<_ValueType>::value>
+struct EphemeronKeyValuePair {
+  using KeyType = _KeyType;
+  using ValueType = _ValueType;
+  using KeyTraits = _KeyTraits;
+  using ValueTraits = _ValueTraits;
+
+  // Ephemerons have different weakness for KeyType and ValueType. If weakness
+  // is equal, we either have Strong/Strong, or Weak/Weak, which would indicate
+  // a full strong or fully weak pair.
+  static constexpr bool is_ephemeron =
+      WTF::IsWeak<KeyType>::value != WTF::IsWeak<ValueType>::value;
+
+  static_assert(!WTF::IsWeak<KeyType>::value ||
+                    WTF::IsWeakMemberType<KeyType>::value,
+                "Weakness must be encoded using WeakMember.");
+
+  EphemeronKeyValuePair(const KeyType* k, const ValueType* v)
+      : key(k), value(v) {}
+  const KeyType* key;
+  const ValueType* value;
+};
+
+template <typename _KeyType,
+          typename _ValueType,
+          typename _KeyTraits,
+          typename _ValueTraits>
+struct EphemeronKeyValuePair<_KeyType,
+                             _ValueType,
+                             _KeyTraits,
+                             _ValueTraits,
+                             true> : EphemeronKeyValuePair<_ValueType,
+                                                           _KeyType,
+                                                           _ValueTraits,
+                                                           _KeyTraits,
+                                                           false> {
+  EphemeronKeyValuePair(const _KeyType* k, const _ValueType* v)
+      : EphemeronKeyValuePair<_ValueType,
+                              _KeyType,
+                              _ValueTraits,
+                              _KeyTraits,
+                              false>(v, k) {}
+};
+
+}  // namespace blink
+
+namespace WTF {
+
+template <typename Table>
+struct TraceInCollectionTrait<kNoWeakHandling,
+                              blink::HeapHashTableBacking<Table>,
+                              void> {
+  static void Trace(blink::Visitor* visitor, const void* self) {
+    TraceHashTableBackingInCollectionTrait<kNoWeakHandling, Table>::Trace(
+        visitor, self);
+  }
+};
+
+template <typename Table>
+struct TraceInCollectionTrait<kWeakHandling,
+                              blink::HeapHashTableBacking<Table>,
+                              void> {
+  static void Trace(blink::Visitor* visitor, const void* self) {
+    TraceHashTableBackingInCollectionTrait<kWeakHandling, Table>::Trace(visitor,
+                                                                        self);
+  }
+};
+
+// This trace method is for tracing a HashTableBacking either through regular
+// tracing (via the relevant TraceTraits) or when finding a HashTableBacking
+// through conservative stack scanning (which will treat all references in the
+// backing strongly).
+template <WTF::WeakHandlingFlag WeakHandling,
+          typename Key,
+          typename Value,
+          typename Traits>
+struct TraceKeyValuePairInCollectionTrait {
+  using EphemeronHelper =
+      blink::EphemeronKeyValuePair<Key,
+                                   Value,
+                                   typename Traits::KeyTraits,
+                                   typename Traits::ValueTraits>;
+
+  static void Trace(blink::Visitor* visitor,
+                    const Key* key,
+                    const Value* value) {
+    TraceImpl::Trace(visitor, key, value);
+  }
+
+ private:
+  struct TraceImplEphemerons {
+    // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
+    static void Trace(blink::Visitor* visitor,
+                      const Key* key,
+                      const Value* value) {
+      // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
+      // The helper ensures that helper.key always refers to the weak part and
+      // helper.value always refers to the dependent part.
+      // We distinguish ephemeron from Weak/Weak and Strong/Strong to allow
+      // users to override visitation behavior. An example is creating a heap
+      // snapshot, where it is useful to annotate values as being kept alive
+      // from keys rather than the table.
+      EphemeronHelper helper(key, value);
+      if (WeakHandling == kNoWeakHandling) {
+        // Strongify the weak part.
+        blink::TraceCollectionIfEnabled<
+            kNoWeakHandling, typename EphemeronHelper::KeyType,
+            typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key);
+      }
+      // The following passes on kNoWeakHandling for tracing value as the value
+      // callback is only invoked to keep value alive iff key is alive,
+      // following ephemeron semantics.
+      visitor->TraceEphemeron(*helper.key, helper.value);
+    }
+  };
+
+  struct TraceImplDefault {
+    static void Trace(blink::Visitor* visitor,
+                      const Key* key,
+                      const Value* value) {
+      // Strongification of non-ephemeron KVP, i.e., Strong/Strong or Weak/Weak.
+      // Order does not matter here.
+      blink::TraceCollectionIfEnabled<
+          kNoWeakHandling, Key, typename Traits::KeyTraits>::Trace(visitor,
+                                                                   key);
+      blink::TraceCollectionIfEnabled<
+          kNoWeakHandling, Value, typename Traits::ValueTraits>::Trace(visitor,
+                                                                       value);
+    }
+  };
+
+  using TraceImpl = typename std::conditional<
+      EphemeronHelper::is_ephemeron &&
+          WTF::IsTraceable<typename EphemeronHelper::ValueType>::value,
+      TraceImplEphemerons,
+      TraceImplDefault>::type;
+};
+
+// Trait for strong treatment of KeyValuePair. This is used to handle regular
+// KVP but also for strongification of otherwise weakly handled KVPs.
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<kNoWeakHandling,
+                              KeyValuePair<Key, Value>,
+                              Traits> {
+  static void Trace(blink::Visitor* visitor,
+                    const KeyValuePair<Key, Value>& self) {
+    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, &self.key,
+                                                      &self.value);
+  }
+};
+
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<kWeakHandling, KeyValuePair<Key, Value>, Traits> {
+  static bool IsAlive(const blink::LivenessBroker& info,
+                      const KeyValuePair<Key, Value>& self) {
+    // Needed for Weak/Weak, Strong/Weak (reverse ephemeron), and Weak/Strong
+    // (ephemeron). Order of invocation does not matter as tracing weak key or
+    // value does not have any side effects.
+    return blink::TraceCollectionIfEnabled<
+               WeakHandlingTrait<Key>::value, Key,
+               typename Traits::KeyTraits>::IsAlive(info, self.key) &&
+           blink::TraceCollectionIfEnabled<
+               WeakHandlingTrait<Value>::value, Value,
+               typename Traits::ValueTraits>::IsAlive(info, self.value);
+  }
+
+  static void Trace(blink::Visitor* visitor,
+                    const KeyValuePair<Key, Value>& self) {
+    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, &self.key,
+                                                      &self.value);
+  }
+};
+
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<
+    kNoWeakHandling,
+    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
+    Traits> {
+  static void Trace(
+      blink::Visitor* visitor,
+      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
+    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, self.key(),
+                                                      self.value());
+  }
+};
+
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<
+    kWeakHandling,
+    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
+    Traits> {
+  static void Trace(
+      blink::Visitor* visitor,
+      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
+    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, self.key(),
+                                                      self.value());
+  }
+};
+
+}  // namespace WTF
+
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
diff --git a/third_party/blink/renderer/platform/heap/handle.h b/third_party/blink/renderer/platform/heap/handle.h
index ee07268..5f745e7 100644
--- a/third_party/blink/renderer/platform/heap/handle.h
+++ b/third_party/blink/renderer/platform/heap/handle.h
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/heap_traits.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
 #include "third_party/blink/renderer/platform/heap/thread_state_scopes.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
diff --git a/third_party/blink/renderer/platform/heap/impl/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/impl/collection_support/heap_hash_table_backing.h
index 51fa1f8..1e81ebc 100644
--- a/third_party/blink/renderer/platform/heap/impl/collection_support/heap_hash_table_backing.h
+++ b/third_party/blink/renderer/platform/heap/impl/collection_support/heap_hash_table_backing.h
@@ -71,6 +71,9 @@
 template <typename Table>
 struct MakeGarbageCollectedTrait<HeapHashTableBacking<Table>> {
   static HeapHashTableBacking<Table>* Call(size_t num_elements) {
+    static_assert(!std::is_polymorphic<HeapHashTableBacking<Table>>::value,
+                  "HeapHashTableBacking must not be polymorphic as it is "
+                  "converted to a raw array of buckets for certain operation");
     CHECK_GT(num_elements, 0u);
     void* memory = HeapHashTableBacking<Table>::template AllocateObject<
         HeapHashTableBacking<Table>>(num_elements *
@@ -275,161 +278,6 @@
   }
 };
 
-template <typename Table>
-struct TraceInCollectionTrait<kNoWeakHandling,
-                              blink::HeapHashTableBacking<Table>,
-                              void> {
-  static void Trace(blink::Visitor* visitor, const void* self) {
-    TraceHashTableBackingInCollectionTrait<kNoWeakHandling, Table>::Trace(
-        visitor, self);
-  }
-};
-
-template <typename Table>
-struct TraceInCollectionTrait<kWeakHandling,
-                              blink::HeapHashTableBacking<Table>,
-                              void> {
-  static void Trace(blink::Visitor* visitor, const void* self) {
-    TraceHashTableBackingInCollectionTrait<kWeakHandling, Table>::Trace(visitor,
-                                                                        self);
-  }
-};
-
-// This trace method is for tracing a HashTableBacking either through regular
-// tracing (via the relevant TraceTraits) or when finding a HashTableBacking
-// through conservative stack scanning (which will treat all references in the
-// backing strongly).
-template <WTF::WeakHandlingFlag WeakHandling,
-          typename Key,
-          typename Value,
-          typename Traits>
-struct TraceKeyValuePairInCollectionTrait {
-  using EphemeronHelper =
-      blink::EphemeronKeyValuePair<Key,
-                                   Value,
-                                   typename Traits::KeyTraits,
-                                   typename Traits::ValueTraits>;
-
-  static void Trace(blink::Visitor* visitor,
-                    const Key* key,
-                    const Value* value) {
-    TraceImpl::Trace(visitor, key, value);
-  }
-
- private:
-  struct TraceImplEphemerons {
-    // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
-    static void Trace(blink::Visitor* visitor,
-                      const Key* key,
-                      const Value* value) {
-      // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
-      // The helper ensures that helper.key always refers to the weak part and
-      // helper.value always refers to the dependent part.
-      // We distinguish ephemeron from Weak/Weak and Strong/Strong to allow
-      // users to override visitation behavior. An example is creating a heap
-      // snapshot, where it is useful to annotate values as being kept alive
-      // from keys rather than the table.
-      EphemeronHelper helper(key, value);
-      if (WeakHandling == kNoWeakHandling) {
-        // Strongify the weak part.
-        blink::TraceCollectionIfEnabled<
-            kNoWeakHandling, typename EphemeronHelper::KeyType,
-            typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key);
-      }
-      // The following passes on kNoWeakHandling for tracing value as the value
-      // callback is only invoked to keep value alive iff key is alive,
-      // following ephemeron semantics.
-      visitor->TraceEphemeron(*helper.key, helper.value);
-    }
-  };
-
-  struct TraceImplDefault {
-    static void Trace(blink::Visitor* visitor,
-                      const Key* key,
-                      const Value* value) {
-      // Strongification of non-ephemeron KVP, i.e., Strong/Strong or Weak/Weak.
-      // Order does not matter here.
-      blink::TraceCollectionIfEnabled<
-          kNoWeakHandling, Key, typename Traits::KeyTraits>::Trace(visitor,
-                                                                   key);
-      blink::TraceCollectionIfEnabled<
-          kNoWeakHandling, Value, typename Traits::ValueTraits>::Trace(visitor,
-                                                                       value);
-    }
-  };
-
-  using TraceImpl = typename std::conditional<
-      EphemeronHelper::is_ephemeron &&
-          WTF::IsTraceable<typename EphemeronHelper::ValueType>::value,
-      TraceImplEphemerons,
-      TraceImplDefault>::type;
-};
-
-// Trait for strong treatment of KeyValuePair. This is used to handle regular
-// KVP but also for strongification of otherwise weakly handled KVPs.
-template <typename Key, typename Value, typename Traits>
-struct TraceInCollectionTrait<kNoWeakHandling,
-                              KeyValuePair<Key, Value>,
-                              Traits> {
-  static void Trace(blink::Visitor* visitor,
-                    const KeyValuePair<Key, Value>& self) {
-    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
-                                       Traits>::Trace(visitor, &self.key,
-                                                      &self.value);
-  }
-};
-
-template <typename Key, typename Value, typename Traits>
-struct TraceInCollectionTrait<kWeakHandling, KeyValuePair<Key, Value>, Traits> {
-  static bool IsAlive(const blink::LivenessBroker& info,
-                      const KeyValuePair<Key, Value>& self) {
-    // Needed for Weak/Weak, Strong/Weak (reverse ephemeron), and Weak/Strong
-    // (ephemeron). Order of invocation does not matter as tracing weak key or
-    // value does not have any side effects.
-    return blink::TraceCollectionIfEnabled<
-               WeakHandlingTrait<Key>::value, Key,
-               typename Traits::KeyTraits>::IsAlive(info, self.key) &&
-           blink::TraceCollectionIfEnabled<
-               WeakHandlingTrait<Value>::value, Value,
-               typename Traits::ValueTraits>::IsAlive(info, self.value);
-  }
-
-  static void Trace(blink::Visitor* visitor,
-                    const KeyValuePair<Key, Value>& self) {
-    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
-                                       Traits>::Trace(visitor, &self.key,
-                                                      &self.value);
-  }
-};
-
-template <typename Key, typename Value, typename Traits>
-struct TraceInCollectionTrait<
-    kNoWeakHandling,
-    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
-    Traits> {
-  static void Trace(
-      blink::Visitor* visitor,
-      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
-    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
-                                       Traits>::Trace(visitor, self.key(),
-                                                      self.value());
-  }
-};
-
-template <typename Key, typename Value, typename Traits>
-struct TraceInCollectionTrait<
-    kWeakHandling,
-    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
-    Traits> {
-  static void Trace(
-      blink::Visitor* visitor,
-      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
-    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
-                                       Traits>::Trace(visitor, self.key(),
-                                                      self.value());
-  }
-};
-
 }  // namespace WTF
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
diff --git a/third_party/blink/renderer/platform/heap/impl/collection_support/heap_vector_backing.h b/third_party/blink/renderer/platform/heap/impl/collection_support/heap_vector_backing.h
index 06a05bc..c7b75ba 100644
--- a/third_party/blink/renderer/platform/heap/impl/collection_support/heap_vector_backing.h
+++ b/third_party/blink/renderer/platform/heap/impl/collection_support/heap_vector_backing.h
@@ -80,6 +80,9 @@
 template <typename T>
 struct MakeGarbageCollectedTrait<HeapVectorBacking<T>> {
   static HeapVectorBacking<T>* Call(size_t num_elements) {
+    static_assert(!std::is_polymorphic<HeapVectorBacking<T>>::value,
+                  "HeapVectorBacking must not be polymorphic as it is "
+                  "converted to a raw array of buckets for certain operation");
     CHECK_GT(num_elements, 0u);
     void* memory =
         HeapVectorBacking<T>::template AllocateObject<HeapVectorBacking<T>>(
diff --git a/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h
index eb08c7b..1a118f3 100644
--- a/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h
+++ b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h
@@ -55,9 +55,11 @@
 
   template <typename T, typename HashTable>
   static T* AllocateHashTableBacking(size_t size) {
+    static_assert(sizeof(T) == sizeof(typename HashTable::ValueType),
+                  "T must match ValueType.");
     return reinterpret_cast<T*>(
-        MakeGarbageCollected<HeapHashTableBacking<HashTable>>(
-            size / sizeof(typename HashTable::ValueType)));
+        MakeGarbageCollected<HeapHashTableBacking<HashTable>>(size /
+                                                              sizeof(T)));
   }
   template <typename T, typename HashTable>
   static T* AllocateZeroedHashTableBacking(size_t size) {
diff --git a/third_party/blink/renderer/platform/heap/impl/trace_traits.h b/third_party/blink/renderer/platform/heap/impl/trace_traits.h
index 37aa0be..375fc48b 100644
--- a/third_party/blink/renderer/platform/heap/impl/trace_traits.h
+++ b/third_party/blink/renderer/platform/heap/impl/trace_traits.h
@@ -24,8 +24,6 @@
 
 template <typename T>
 struct TraceTrait;
-template <typename T>
-class WeakMember;
 
 template <typename T, bool = NeedsAdjustPointer<T>::value>
 struct AdjustPointerTrait;
@@ -73,67 +71,6 @@
   static void Trace(Visitor* visitor, const T& t) { visitor->Trace(t); }
 };
 
-template <WTF::WeakHandlingFlag weakness,
-          typename T,
-          typename Traits,
-          bool = WTF::IsTraceableInCollectionTrait<Traits>::value,
-          WTF::WeakHandlingFlag = WTF::WeakHandlingTrait<T>::value>
-struct TraceCollectionIfEnabled;
-
-template <WTF::WeakHandlingFlag weakness, typename T, typename Traits>
-struct TraceCollectionIfEnabled<weakness,
-                                T,
-                                Traits,
-                                false,
-                                WTF::kNoWeakHandling> {
-  STATIC_ONLY(TraceCollectionIfEnabled);
-
-  static bool IsAlive(const blink::LivenessBroker& info, const T&) {
-    return true;
-  }
-
-  static void Trace(Visitor*, const void*) {
-    static_assert(!WTF::IsTraceableInCollectionTrait<Traits>::value,
-                  "T should not be traced");
-  }
-};
-
-template <typename T, typename Traits>
-struct TraceCollectionIfEnabled<WTF::kNoWeakHandling,
-                                T,
-                                Traits,
-                                false,
-                                WTF::kWeakHandling> {
-  STATIC_ONLY(TraceCollectionIfEnabled);
-
-  static void Trace(Visitor* visitor, const void* t) {
-    WTF::TraceInCollectionTrait<WTF::kNoWeakHandling, T, Traits>::Trace(
-        visitor, *reinterpret_cast<const T*>(t));
-  }
-};
-
-template <WTF::WeakHandlingFlag weakness,
-          typename T,
-          typename Traits,
-          bool,
-          WTF::WeakHandlingFlag>
-struct TraceCollectionIfEnabled {
-  STATIC_ONLY(TraceCollectionIfEnabled);
-
-  static bool IsAlive(const blink::LivenessBroker& info, const T& traceable) {
-    return WTF::TraceInCollectionTrait<weakness, T, Traits>::IsAlive(info,
-                                                                     traceable);
-  }
-
-  static void Trace(Visitor* visitor, const void* t) {
-    static_assert(WTF::IsTraceableInCollectionTrait<Traits>::value ||
-                      weakness == WTF::kWeakHandling,
-                  "Traits should be traced");
-    WTF::TraceInCollectionTrait<weakness, T, Traits>::Trace(
-        visitor, *reinterpret_cast<const T*>(t));
-  }
-};
-
 // The TraceTrait is used to specify how to trace and object for Oilpan and
 // wrapper tracing.
 //
@@ -186,56 +123,6 @@
   }
 };
 
-// Helper for processing ephemerons represented as KeyValuePair. Reorders
-// parameters if needed so that KeyType is always weak.
-template <typename _KeyType,
-          typename _ValueType,
-          typename _KeyTraits,
-          typename _ValueTraits,
-          bool = WTF::IsWeak<_ValueType>::value>
-struct EphemeronKeyValuePair {
-  using KeyType = _KeyType;
-  using ValueType = _ValueType;
-  using KeyTraits = _KeyTraits;
-  using ValueTraits = _ValueTraits;
-
-  // Ephemerons have different weakness for KeyType and ValueType. If weakness
-  // is equal, we either have Strong/Strong, or Weak/Weak, which would indicate
-  // a full strong or fully weak pair.
-  static constexpr bool is_ephemeron =
-      WTF::IsWeak<KeyType>::value != WTF::IsWeak<ValueType>::value;
-
-  static_assert(!WTF::IsWeak<KeyType>::value ||
-                    WTF::IsSubclassOfTemplate<KeyType, WeakMember>::value,
-                "Weakness must be encoded using WeakMember.");
-
-  EphemeronKeyValuePair(const KeyType* k, const ValueType* v)
-      : key(k), value(v) {}
-  const KeyType* key;
-  const ValueType* value;
-};
-
-template <typename _KeyType,
-          typename _ValueType,
-          typename _KeyTraits,
-          typename _ValueTraits>
-struct EphemeronKeyValuePair<_KeyType,
-                             _ValueType,
-                             _KeyTraits,
-                             _ValueTraits,
-                             true> : EphemeronKeyValuePair<_ValueType,
-                                                           _KeyType,
-                                                           _ValueTraits,
-                                                           _KeyTraits,
-                                                           false> {
-  EphemeronKeyValuePair(const _KeyType* k, const _ValueType* v)
-      : EphemeronKeyValuePair<_ValueType,
-                              _KeyType,
-                              _ValueTraits,
-                              _KeyTraits,
-                              false>(v, k) {}
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_TRACE_TRAITS_H_
diff --git a/third_party/blink/renderer/platform/heap/trace_traits.h b/third_party/blink/renderer/platform/heap/trace_traits.h
index cd76bb1..76b89917 100644
--- a/third_party/blink/renderer/platform/heap/trace_traits.h
+++ b/third_party/blink/renderer/platform/heap/trace_traits.h
@@ -17,6 +17,71 @@
 #include "third_party/blink/renderer/platform/heap/impl/trace_traits.h"
 #endif  // !USE_V8_OILPAN
 
+namespace blink {
+
+template <WTF::WeakHandlingFlag weakness,
+          typename T,
+          typename Traits,
+          bool = WTF::IsTraceableInCollectionTrait<Traits>::value,
+          WTF::WeakHandlingFlag = WTF::WeakHandlingTrait<T>::value>
+struct TraceCollectionIfEnabled;
+
+template <WTF::WeakHandlingFlag weakness, typename T, typename Traits>
+struct TraceCollectionIfEnabled<weakness,
+                                T,
+                                Traits,
+                                false,
+                                WTF::kNoWeakHandling> {
+  STATIC_ONLY(TraceCollectionIfEnabled);
+
+  static bool IsAlive(const blink::LivenessBroker& info, const T&) {
+    return true;
+  }
+
+  static void Trace(Visitor*, const void*) {
+    static_assert(!WTF::IsTraceableInCollectionTrait<Traits>::value,
+                  "T should not be traced");
+  }
+};
+
+template <typename T, typename Traits>
+struct TraceCollectionIfEnabled<WTF::kNoWeakHandling,
+                                T,
+                                Traits,
+                                false,
+                                WTF::kWeakHandling> {
+  STATIC_ONLY(TraceCollectionIfEnabled);
+
+  static void Trace(Visitor* visitor, const void* t) {
+    WTF::TraceInCollectionTrait<WTF::kNoWeakHandling, T, Traits>::Trace(
+        visitor, *reinterpret_cast<const T*>(t));
+  }
+};
+
+template <WTF::WeakHandlingFlag weakness,
+          typename T,
+          typename Traits,
+          bool,
+          WTF::WeakHandlingFlag>
+struct TraceCollectionIfEnabled {
+  STATIC_ONLY(TraceCollectionIfEnabled);
+
+  static bool IsAlive(const blink::LivenessBroker& info, const T& traceable) {
+    return WTF::TraceInCollectionTrait<weakness, T, Traits>::IsAlive(info,
+                                                                     traceable);
+  }
+
+  static void Trace(Visitor* visitor, const void* t) {
+    static_assert(WTF::IsTraceableInCollectionTrait<Traits>::value ||
+                      weakness == WTF::kWeakHandling,
+                  "Traits should be traced");
+    WTF::TraceInCollectionTrait<weakness, T, Traits>::Trace(
+        visitor, *reinterpret_cast<const T*>(t));
+  }
+};
+
+}  // namespace blink
+
 namespace WTF {
 
 // Catch-all for types that have a way to trace that don't have special
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/blink_gc.h b/third_party/blink/renderer/platform/heap/v8_wrapper/blink_gc.h
index 8c8598f5..e2d376d9 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/blink_gc.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/blink_gc.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_BLINK_GC_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_BLINK_GC_H_
 
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "v8/include/cppgc/liveness-broker.h"
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_hash_table_backing.h
index 918a583cd..5cafa84f 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_hash_table_backing.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_hash_table_backing.h
@@ -5,8 +5,16 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
 
+#include <type_traits>
+#include "third_party/blink/renderer/platform/heap/custom_spaces.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/trace_traits.h"
+#include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/wtf/conditional_destructor.h"
+#include "third_party/blink/renderer/platform/wtf/hash_table.h"
+#include "third_party/blink/renderer/platform/wtf/hash_traits.h"
+#include "v8/include/cppgc/custom-space.h"
+#include "v8/include/cppgc/object-size-trait.h"
 
 namespace blink {
 
@@ -27,9 +35,218 @@
   static_assert(
       !std::is_trivially_destructible<Value>::value,
       "Finalization of trivially destructible classes should not happen.");
-  // TODO(1056170): Implement.
+  const size_t object_size =
+      cppgc::subtle::ObjectSizeTrait<HeapHashTableBacking<Table>>::GetSize(
+          *this);
+  const size_t length = object_size / sizeof(Value);
+  Value* table = reinterpret_cast<Value*>(this);
+  for (unsigned i = 0; i < length; ++i) {
+    if (!Table::IsEmptyOrDeletedBucket(table[i]))
+      table[i].~Value();
+  }
 }
 
 }  // namespace blink
 
+namespace WTF {
+
+namespace internal {
+
+// ConcurrentBucket is a wrapper for HashTable buckets for concurrent marking.
+// It is used to provide a snapshot view of the bucket key and guarantee
+// that the same key is used for checking empty/deleted buckets and tracing.
+template <typename T>
+class ConcurrentBucket {
+  using KeyExtractionCallback = void (*)(const T&, void*);
+
+ public:
+  using BucketType = T;
+
+  ConcurrentBucket(const T& t, KeyExtractionCallback extract_key) {
+    extract_key(t, &buf_);
+  }
+
+  // for HashTable that don't use KeyValuePair (i.e. *HashSets), the key
+  // and the value are the same.
+  const T* key() const { return reinterpret_cast<const T*>(&buf_); }
+  const T* value() const { return key(); }
+  const T* bucket() const { return key(); }
+
+ private:
+  // Alignment is needed for atomic accesses to |buf_| and to assure |buf_|
+  // can be accessed the same as objects of type T
+  static constexpr size_t boundary = std::max(alignof(T), sizeof(size_t));
+  alignas(boundary) char buf_[sizeof(T)];
+};
+
+template <typename Key, typename Value>
+class ConcurrentBucket<KeyValuePair<Key, Value>> {
+  using KeyExtractionCallback = void (*)(const KeyValuePair<Key, Value>&,
+                                         void*);
+
+ public:
+  using BucketType = ConcurrentBucket;
+
+  ConcurrentBucket(const KeyValuePair<Key, Value>& pair,
+                   KeyExtractionCallback extract_key)
+      : value_(&pair.value) {
+    extract_key(pair, &buf_);
+  }
+
+  const Key* key() const { return reinterpret_cast<const Key*>(&buf_); }
+  const Value* value() const { return value_; }
+  const ConcurrentBucket* bucket() const { return this; }
+
+ private:
+  // Alignment is needed for atomic accesses to |buf_| and to assure |buf_|
+  // can be accessed the same as objects of type Key
+  static constexpr size_t boundary = std::max(alignof(Key), sizeof(size_t));
+  alignas(boundary) char buf_[sizeof(Key)];
+  const Value* value_;
+};
+
+}  // namespace internal
+
+template <WTF::WeakHandlingFlag weak_handling, typename Table>
+struct TraceHashTableBackingInCollectionTrait {
+  using Value = typename Table::ValueType;
+  using Traits = typename Table::ValueTraits;
+  using Extractor = typename Table::ExtractorType;
+
+  static void Trace(blink::Visitor* visitor, const void* self) {
+    static_assert(IsTraceableInCollectionTrait<Traits>::value ||
+                      WTF::IsWeak<Value>::value,
+                  "Table should not be traced");
+    const Value* array = reinterpret_cast<const Value*>(self);
+    const size_t length =
+        cppgc::subtle::
+            ObjectSizeTrait<const blink::HeapHashTableBacking<Table>>::GetSize(
+                *reinterpret_cast<const blink::HeapHashTableBacking<Table>*>(
+                    self)) /
+        sizeof(Value);
+    for (size_t i = 0; i < length; ++i) {
+      internal::ConcurrentBucket<Value> concurrent_bucket(
+          array[i], Extractor::ExtractSafe);
+      if (!HashTableHelper<Value, Extractor, typename Table::KeyTraitsType>::
+              IsEmptyOrDeletedBucketForKey(*concurrent_bucket.key())) {
+        blink::TraceCollectionIfEnabled<
+            weak_handling,
+            typename internal::ConcurrentBucket<Value>::BucketType,
+            Traits>::Trace(visitor, concurrent_bucket.bucket());
+      }
+    }
+  }
+};
+
+}  // namespace WTF
+
+namespace cppgc {
+
+// Assign HeapVector to the custom HeapVectorBackingSpace.
+template <typename Table>
+struct SpaceTrait<blink::HeapHashTableBacking<Table>> {
+  using Space = blink::HeapHashTableBackingSpace;
+};
+
+// Custom allocation accounts for inlined storage of the actual elements of the
+// backing table.
+template <typename Table>
+class MakeGarbageCollectedTrait<blink::HeapHashTableBacking<Table>>
+    : public MakeGarbageCollectedTraitBase<blink::HeapHashTableBacking<Table>> {
+ public:
+  using Backing = blink::HeapHashTableBacking<Table>;
+
+  template <typename... Args>
+  static Backing* Call(AllocationHandle& handle, size_t num_elements) {
+    static_assert(
+        !std::is_polymorphic<blink::HeapHashTableBacking<Table>>::value,
+        "HeapHashTableBacking must not be polymorphic as it is converted to a "
+        "raw array of buckets for certain operation");
+    CHECK_GT(num_elements, 0u);
+    // Allocate automatically considers the custom space via SpaceTrait.
+    void* memory = MakeGarbageCollectedTraitBase<Backing>::Allocate(
+        handle, sizeof(typename Table::ValueType) * num_elements);
+    Backing* object = ::new (memory) Backing();
+    MakeGarbageCollectedTraitBase<Backing>::MarkObjectAsFullyConstructed(
+        object);
+    return object;
+  }
+};
+
+template <typename Table>
+struct TraceTrait<blink::HeapHashTableBacking<Table>> {
+  using Backing = blink::HeapHashTableBacking<Table>;
+  using Traits = typename Table::ValueTraits;
+  using ValueType = typename Table::ValueTraits::TraitType;
+
+  static TraceDescriptor GetTraceDescriptor(const void* self) {
+    return {self, Trace<WTF::kNoWeakHandling>};
+  }
+
+  static TraceDescriptor GetWeakTraceDescriptor(const void* self) {
+    return GetWeakTraceDescriptorImpl<ValueType>::GetWeakTraceDescriptor(self);
+  }
+
+  template <WTF::WeakHandlingFlag weak_handling = WTF::kNoWeakHandling>
+  static void Trace(Visitor* visitor, const void* self) {
+    if (!Traits::kCanTraceConcurrently && self) {
+      if (visitor->DeferTraceToMutatorThreadIfConcurrent(
+              self, &Trace<weak_handling>,
+              cppgc::subtle::ObjectSizeTrait<const Backing>::GetSize(
+                  *reinterpret_cast<const Backing*>(self)))) {
+        return;
+      }
+    }
+
+    static_assert(WTF::IsTraceableInCollectionTrait<Traits>::value ||
+                      WTF::IsWeak<ValueType>::value,
+                  "T should not be traced");
+    WTF::TraceInCollectionTrait<weak_handling, Backing, void>::Trace(visitor,
+                                                                     self);
+  }
+
+ private:
+  // Default setting for HashTable is without weak trace descriptor.
+  template <typename ValueType>
+  struct GetWeakTraceDescriptorImpl {
+    static TraceDescriptor GetWeakTraceDescriptor(const void* self) {
+      return {self, nullptr};
+    }
+  };
+
+  // Specialization for WTF::KeyValuePair, which is default bucket storage type.
+  template <typename K, typename V>
+  struct GetWeakTraceDescriptorImpl<WTF::KeyValuePair<K, V>> {
+    static TraceDescriptor GetWeakTraceDescriptor(const void* backing) {
+      return GetWeakTraceDescriptorKVPImpl<K, V>::GetWeakTraceDescriptor(
+          backing);
+    }
+
+    // Default setting for KVP without ephemeron semantics.
+    template <typename KeyType,
+              typename ValueType,
+              bool ephemeron_semantics = (WTF::IsWeak<KeyType>::value &&
+                                          !WTF::IsWeak<ValueType>::value &&
+                                          WTF::IsTraceable<ValueType>::value) ||
+                                         (WTF::IsWeak<ValueType>::value &&
+                                          !WTF::IsWeak<KeyType>::value &&
+                                          WTF::IsTraceable<KeyType>::value)>
+    struct GetWeakTraceDescriptorKVPImpl {
+      static TraceDescriptor GetWeakTraceDescriptor(const void* backing) {
+        return {backing, nullptr};
+      }
+    };
+
+    // Specialization for KVP with ephemeron semantics.
+    template <typename KeyType, typename ValueType>
+    struct GetWeakTraceDescriptorKVPImpl<KeyType, ValueType, true> {
+      static TraceDescriptor GetWeakTraceDescriptor(const void* backing) {
+        return {backing, Trace<WTF::kWeakHandling>};
+      }
+    };
+  };
+};
+
+}  // namespace cppgc
+
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_COLLECTION_SUPPORT_HEAP_HASH_TABLE_BACKING_H_
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_vector_backing.h b/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_vector_backing.h
index 9a49f94c..185a1d5 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_vector_backing.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/collection_support/heap_vector_backing.h
@@ -154,16 +154,22 @@
 // backing array.
 template <typename T>
 class MakeGarbageCollectedTrait<blink::HeapVectorBacking<T>>
-    : public MakeGarbageCollectedTraitBase<T> {
+    : public MakeGarbageCollectedTraitBase<blink::HeapVectorBacking<T>> {
+  using Backing = blink::HeapVectorBacking<T>;
+
  public:
   template <typename... Args>
-  static T* Call(AllocationHandle& handle, size_t num_elements) {
+  static Backing* Call(AllocationHandle& handle, size_t num_elements) {
+    static_assert(!std::is_polymorphic<blink::HeapVectorBacking<T>>::value,
+                  "HeapVectorBacking must not be polymorphic as it is "
+                  "converted to a raw array of buckets for certain operation");
     CHECK_GT(num_elements, 0u);
     // Allocate automatically considers the custom space via SpaceTrait.
-    void* memory = MakeGarbageCollectedTraitBase<T>::Allocate(
+    void* memory = MakeGarbageCollectedTraitBase<Backing>::Allocate(
         handle, sizeof(T) * num_elements);
-    T* object = ::new (memory) T();
-    MakeGarbageCollectedTraitBase<T>::MarkObjectAsFullyConstructed(object);
+    Backing* object = ::new (memory) Backing();
+    MakeGarbageCollectedTraitBase<Backing>::MarkObjectAsFullyConstructed(
+        object);
     return object;
   }
 };
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/custom_spaces.h b/third_party/blink/renderer/platform/heap/v8_wrapper/custom_spaces.h
index 331e342..9802dc8 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/custom_spaces.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/custom_spaces.h
@@ -22,11 +22,23 @@
   static constexpr bool kSupportsCompaction = true;
 };
 
+class HeapHashTableBackingSpace
+    : public cppgc::CustomSpace<HeapHashTableBackingSpace> {
+ public:
+  static constexpr cppgc::CustomSpaceIndex kSpaceIndex = 1;
+  static constexpr bool kSupportsCompaction = true;
+};
+
 class NodeSpace : public cppgc::CustomSpace<NodeSpace> {
  public:
   static constexpr cppgc::CustomSpaceIndex kSpaceIndex = 2;
 };
 
+class CSSValueSpace : public cppgc::CustomSpace<CSSValueSpace> {
+ public:
+  static constexpr cppgc::CustomSpaceIndex kSpaceIndex = 3;
+};
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_CUSTOM_SPACES_H_
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/heap_allocator_impl.h b/third_party/blink/renderer/platform/heap/v8_wrapper/heap_allocator_impl.h
index 2177554..ab14364 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/heap_allocator_impl.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/heap_allocator_impl.h
@@ -40,9 +40,9 @@
   }
 
   template <typename T>
-  static T* AllocateVectorBacking(size_t) {
-    // TODO(1056170): Implement.
-    return nullptr;
+  static T* AllocateVectorBacking(size_t size) {
+    return reinterpret_cast<T*>(
+        MakeGarbageCollected<HeapVectorBacking<T>>(size / sizeof(T)));
   }
 
   static void FreeVectorBacking(void*) {
@@ -60,9 +60,12 @@
   }
 
   template <typename T, typename HashTable>
-  static T* AllocateHashTableBacking(size_t) {
-    // TODO(1056170): Implement.
-    return nullptr;
+  static T* AllocateHashTableBacking(size_t size) {
+    static_assert(sizeof(T) == sizeof(typename HashTable::ValueType),
+                  "T must match ValueType.");
+    return reinterpret_cast<T*>(
+        MakeGarbageCollected<HeapHashTableBacking<HashTable>>(size /
+                                                              sizeof(T)));
   }
 
   template <typename T, typename HashTable>
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/persistent.h b/third_party/blink/renderer/platform/heap/v8_wrapper/persistent.h
index e46f0f8d..a9dd776 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/persistent.h
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/persistent.h
@@ -43,7 +43,7 @@
 }
 
 template <typename T>
-CrossThreadPersistent<T> WrapCrossthreadPersistent(
+CrossThreadPersistent<T> WrapCrossThreadPersistent(
     T* value,
     const cppgc::SourceLocation& loc = cppgc::SourceLocation::Current()) {
   return CrossThreadPersistent<T>(value, loc);
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc
index 87e3bc2..c4cb507 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc
@@ -258,6 +258,8 @@
       kDefaultSize, media::EmptyExtraData(),
       media::EncryptionScheme::kUnencrypted);
 
+  config.set_is_rtc(true);
+
   // InitializeSync doesn't really initialize anything; it just posts the work
   // to the media thread.  If init fails, then we'll fall back on the first
   // decode after we notice.
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter_test.cc
index eb84aad..75c53dc2 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter_test.cc
@@ -79,6 +79,7 @@
   bool NeedsBitstreamConversion() const override { return false; }
   bool CanReadWithoutStalling() const override { return true; }
   int GetMaxDecodeRequests() const override { return 1; }
+  bool IsOptimizedForRTC() const override { return true; }
 };
 
 class MockDecoderFactory : public media::DecoderFactory {
diff --git a/third_party/blink/renderer/platform/video_capture/DEPS b/third_party/blink/renderer/platform/video_capture/DEPS
index ab4b0ea..0937cb2 100644
--- a/third_party/blink/renderer/platform/video_capture/DEPS
+++ b/third_party/blink/renderer/platform/video_capture/DEPS
@@ -21,6 +21,7 @@
 specific_include_rules = {
     "video_capture_impl_test.cc": [
         "+third_party/blink/renderer/platform/testing/gpu_memory_buffer_test_support.h",
+        "+third_party/blink/renderer/platform/testing/histogram_tester.h",
     ],
     "gpu_memory_buffer_test_support.cc": [
         "+components/viz/test/test_context_provider.h",
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
index 39f4106..b88adeb 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -19,6 +19,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/macros.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/trace_event/trace_event.h"
@@ -502,6 +503,7 @@
       // a frame refresh to start the video call with.
       // Capture device will make a decision if it should refresh a frame.
       RequestRefreshFrame();
+      RecordStartOutcomeUMA(VideoCaptureStartOutcome::kStarted);
       break;
     case media::mojom::VideoCaptureState::STOPPED:
       OnLog("VideoCaptureImpl changing state to VIDEO_CAPTURE_STATE_STOPPED");
@@ -527,6 +529,10 @@
         client.second.state_update_cb.Run(blink::VIDEO_CAPTURE_STATE_ERROR);
       clients_.clear();
       state_ = VIDEO_CAPTURE_STATE_ERROR;
+
+      RecordStartOutcomeUMA(start_timedout_
+                                ? VideoCaptureStartOutcome::kTimedout
+                                : VideoCaptureStartOutcome::kFailed);
       break;
     case media::mojom::VideoCaptureState::ENDED:
       OnLog("VideoCaptureImpl changing state to VIDEO_CAPTURE_STATE_ENDED");
@@ -852,6 +858,9 @@
                            base::BindOnce(&VideoCaptureImpl::OnStartTimedout,
                                           base::Unretained(this)));
   }
+  start_timedout_ = false;
+  start_outcome_reported_ = false;
+  base::UmaHistogramBoolean("Media.VideoCapture.Start", true);
 
   GetVideoCaptureHost()->Start(device_id_, session_id_, params_,
                                observer_receiver_.BindNewPipeAndPassRemote());
@@ -860,6 +869,9 @@
 void VideoCaptureImpl::OnStartTimedout() {
   DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_);
   OnLog("VideoCaptureImpl timed out during starting");
+
+  start_timedout_ = true;
+
   OnStateChanged(media::mojom::VideoCaptureState::FAILED);
 }
 
@@ -899,6 +911,15 @@
   return video_capture_host_.get();
 }
 
+void VideoCaptureImpl::RecordStartOutcomeUMA(VideoCaptureStartOutcome outcome) {
+  // Record the success or failure of starting only the first time we transition
+  // into such a state, not eg when resuming after pausing.
+  if (!start_outcome_reported_) {
+    base::UmaHistogramEnumeration("Media.VideoCapture.StartOutcome", outcome);
+    start_outcome_reported_ = true;
+  }
+}
+
 // static
 void VideoCaptureImpl::DidFinishConsumingFrame(
     BufferFinishedCallback callback_to_io_thread) {
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
index 16a3dd38..d84f0d5e 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.h
@@ -36,6 +36,15 @@
 
 extern const PLATFORM_EXPORT base::Feature kTimeoutHangingVideoCaptureStarts;
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class VideoCaptureStartOutcome {
+  kStarted = 0,
+  kTimedout = 1,
+  kFailed = 2,
+  kMaxValue = kFailed,
+};
+
 // VideoCaptureImpl represents a capture device in renderer process. It provides
 // an interface for clients to command the capture (Start, Stop, etc), and
 // communicates back to these clients e.g. the capture state or incoming
@@ -154,6 +163,8 @@
 
   void OnStartTimedout();
 
+  void RecordStartOutcomeUMA(VideoCaptureStartOutcome outcome);
+
   // Callback for when GPU context lost is detected. The method fetches the new
   // GPU factories handle on |main_task_runner_| and sets |gpu_factories_| to
   // the new handle.
@@ -193,6 +204,8 @@
   base::TimeTicks first_frame_ref_time_;
 
   VideoCaptureState state_;
+  bool start_timedout_ = false;
+  bool start_outcome_reported_ = false;
 
   int num_first_frame_logs_ = 0;
 
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
index 10be4ef..8f2ba41 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl_test.cc
@@ -11,6 +11,7 @@
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "media/capture/mojom/video_capture.mojom-blink.h"
@@ -19,6 +20,7 @@
 #include "mojo/public/cpp/system/platform_handle.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/testing/histogram_tester.h"
 #include "third_party/blink/renderer/platform/video_capture/gpu_memory_buffer_test_support.h"
 #include "third_party/blink/renderer/platform/video_capture/video_capture_impl.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -248,6 +250,7 @@
 };
 
 TEST_F(VideoCaptureImplTest, Simple) {
+  base::HistogramTester histogram_tester;
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STARTED));
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STOPPED));
   EXPECT_CALL(mock_video_capture_host_, DoStart(_, session_id_, params_small_));
@@ -255,6 +258,9 @@
 
   StartCapture(0, params_small_);
   StopCapture(0);
+
+  histogram_tester.ExpectUniqueSample("Media.VideoCapture.StartOutcome",
+                                      VideoCaptureStartOutcome::kStarted, 1);
 }
 
 TEST_F(VideoCaptureImplTest, TwoClientsInSequence) {
@@ -535,6 +541,8 @@
 }
 
 TEST_F(VideoCaptureImplTest, AlreadyStarted) {
+  base::HistogramTester histogram_tester;
+
   media::VideoCaptureParams params = {};
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STARTED));
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STOPPED))
@@ -552,6 +560,9 @@
   StopCapture(0);
   StopCapture(1);
   DCHECK(params.requested_format == params_small_.requested_format);
+
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.Start", 1);
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.StartOutcome", 1);
 }
 
 TEST_F(VideoCaptureImplTest, EndedBeforeStop) {
@@ -567,6 +578,8 @@
 }
 
 TEST_F(VideoCaptureImplTest, ErrorBeforeStop) {
+  base::HistogramTester histogram_tester;
+
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STARTED));
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_ERROR));
   EXPECT_CALL(mock_video_capture_host_, DoStart(_, session_id_, params_small_));
@@ -576,6 +589,11 @@
   OnStateChanged(media::mojom::VideoCaptureState::FAILED);
 
   StopCapture(0);
+
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.Start", 1);
+  // Successful start before the error, so StartOutcome is kStarted.
+  histogram_tester.ExpectUniqueSample("Media.VideoCapture.StartOutcome",
+                                      VideoCaptureStartOutcome::kStarted, 1);
 }
 
 TEST_F(VideoCaptureImplTest, BufferReceivedBeforeOnStarted) {
@@ -691,6 +709,8 @@
 }
 
 TEST_F(VideoCaptureImplTest, StartTimeout) {
+  base::HistogramTester histogram_tester;
+
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_ERROR));
   EXPECT_CALL(mock_video_capture_host_, DoStart(_, session_id_, params_small_));
 
@@ -701,9 +721,14 @@
 
   StartCapture(0, params_small_);
   task_environment_.FastForwardBy(VideoCaptureImpl::kCaptureStartTimeout);
+
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.Start", 1);
+  histogram_tester.ExpectUniqueSample("Media.VideoCapture.StartOutcome",
+                                      VideoCaptureStartOutcome::kTimedout, 1);
 }
 
 TEST_F(VideoCaptureImplTest, StartTimeout_FeatureDisabled) {
+  base::HistogramTester histogram_tester;
   feature_list_.InitAndDisableFeature(kTimeoutHangingVideoCaptureStarts);
 
   EXPECT_CALL(mock_video_capture_host_, DoStart(_, session_id_, params_small_));
@@ -723,6 +748,29 @@
   EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_STOPPED));
   EXPECT_CALL(mock_video_capture_host_, Stop(_));
   StopCapture(0);
+
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.Start", 1);
+  histogram_tester.ExpectUniqueSample("Media.VideoCapture.StartOutcome",
+                                      VideoCaptureStartOutcome::kStarted, 1);
+}
+
+TEST_F(VideoCaptureImplTest, ErrorBeforeStart) {
+  base::HistogramTester histogram_tester;
+
+  EXPECT_CALL(*this, OnStateUpdate(blink::VIDEO_CAPTURE_STATE_ERROR));
+  EXPECT_CALL(mock_video_capture_host_, DoStart(_, session_id_, params_small_));
+  ON_CALL(mock_video_capture_host_, DoStart(_, _, _))
+      .WillByDefault(InvokeWithoutArgs([this]() {
+        // Go straight to Failed. Do not pass Go. Do not collect £200.
+        video_capture_impl_->OnStateChanged(
+            media::mojom::VideoCaptureState::FAILED);
+      }));
+
+  StartCapture(0, params_small_);
+
+  histogram_tester.ExpectTotalCount("Media.VideoCapture.Start", 1);
+  histogram_tester.ExpectUniqueSample("Media.VideoCapture.StartOutcome",
+                                      VideoCaptureStartOutcome::kFailed, 1);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/type_traits.h b/third_party/blink/renderer/platform/wtf/type_traits.h
index fbc44c76..4cfd33a 100644
--- a/third_party/blink/renderer/platform/wtf/type_traits.h
+++ b/third_party/blink/renderer/platform/wtf/type_traits.h
@@ -129,14 +129,18 @@
 struct IsWeak : cppgc::internal::IsWeak<T> {};
 
 template <typename T>
+struct IsMemberType : std::integral_constant<bool, cppgc::IsMemberTypeV<T>> {};
+
+template <typename T>
+struct IsWeakMemberType
+    : std::integral_constant<bool, cppgc::IsWeakMemberTypeV<T>> {};
+
+template <typename T>
 struct IsMemberOrWeakMemberType
     : std::integral_constant<bool,
                              cppgc::IsMemberTypeV<T> ||
                                  cppgc::IsWeakMemberTypeV<T>> {};
 
-template <typename T>
-struct IsMemberType : std::integral_constant<bool, cppgc::IsMemberTypeV<T>> {};
-
 #else  // !USE_V8_OILPAN
 
 namespace internal {
@@ -218,18 +222,23 @@
 struct IsWeak : std::false_type {};
 
 template <typename T>
-struct IsMemberOrWeakMemberType
-    : std::integral_constant<
-          bool,
-          WTF::IsSubclassOfTemplate<T, blink::Member>::value ||
-              WTF::IsSubclassOfTemplate<T, blink::WeakMember>::value> {};
-
-template <typename T>
 struct IsMemberType : std::integral_constant<
                           bool,
                           WTF::IsSubclassOfTemplate<T, blink::Member>::value> {
 };
 
+template <typename T>
+struct IsWeakMemberType
+    : std::integral_constant<
+          bool,
+          WTF::IsSubclassOfTemplate<T, blink::WeakMember>::value> {};
+
+template <typename T>
+struct IsMemberOrWeakMemberType
+    : std::integral_constant<bool,
+                             IsMemberType<T>::value ||
+                                 IsWeakMemberType<T>::value> {};
+
 #endif  // !USE_V8_OILPAN
 
 template <typename T, typename U>
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 24b9aa6..2b74d89 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1152,6 +1152,9 @@
 crbug.com/958381 [ Mac ] virtual/layout_ng_block_frag/fragmentation/fragmented-table-cell.html [ Failure ]
 crbug.com/958381 [ Mac ] fragmentation/single-line-cells-paginated-with-text.html [ Failure ]
 
+# Asan underinvalidation failure. Skip while investigating
+crbug.com/958381 paint/tables/huge-table-composited-scroll-collapsed-borders.html [ Skip ]
+
 # TablesNG ends
 
 # ====== LayoutNG-only failures until here ======
@@ -2464,6 +2467,9 @@
 crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Linux ] virtual/threaded/external/wpt/css/css-animations/nested-scale-animations.html [ Failure ]
+crbug.com/626703 external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-1.html [ Failure ]
+crbug.com/626703 external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-2.html [ Failure ]
 crbug.com/1170337 [ Mac ] external/wpt/html/canvas/element/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.small.html [ Pass Timeout ]
 crbug.com/1170337 [ Mac ] external/wpt/html/canvas/offscreen/text/2d.text.draw.fill.maxWidth.NaN.html [ Pass Timeout ]
 crbug.com/1170337 [ Mac ] external/wpt/html/canvas/offscreen/text/2d.text.draw.fill.maxWidth.small.html [ Pass Timeout ]
@@ -2613,7 +2619,6 @@
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-non-collapsed-selection.tentative.html?TypingA [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-non-collapsed-selection.tentative.html?Delete [ Timeout ]
 crbug.com/626703 external/wpt/screen-capture/feature-policy.https.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/testdriver/actions/wheelScroll.html [ Timeout ]
 crbug.com/626703 [ Fuchsia ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-pause-immediately.https.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-pause-immediately.https.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/web-locks/query-ordering.tentative.https.html [ Pass Failure ]
@@ -2624,7 +2629,6 @@
 crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller.https.html [ Failure ]
 crbug.com/626703 [ Mac10.14 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/valid-image-before-load.https.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/html/cross-origin-embedder-policy/reporting-subresource-corp.https.html [ Failure Timeout ]
-crbug.com/626703 external/wpt/content-security-policy/frame-src/frame-src-same-document.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-backspace.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-forwarddelete.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/streams/transform-streams/patched-global.any.serviceworker.html [ Timeout ]
@@ -5809,3 +5813,6 @@
 
 crbug.com/1170062 [ Linux ] external/wpt/html/canvas/element/manual/shadows/canvas_shadows_001.htm [ Timeout Pass ]
 crbug.com/1170062 [ mac ] external/wpt/html/canvas/element/manual/shadows/canvas_shadows_001.htm [ Timeout Pass ]
+
+# Sheriff 2021-01-27
+crbug.com/1171331 tables/mozilla_expected_failures/bugs/bug89315.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 7824740..5c33ac84 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -790,7 +790,9 @@
   },
   {
     "prefix": "scroll-unification",
-    "bases": ["fast/scrolling/scrollbars"],
+    "bases": ["fast/scrolling/scrollbars",
+              "fast/forms/select-popup",
+              "fast/forms/suggestion-picker"],
     "args": ["--enable-features=ScrollUnification",
              "--enable-threaded-compositing"]
   },
diff --git a/third_party/blink/web_tests/W3CImportExpectations b/third_party/blink/web_tests/W3CImportExpectations
index a3b2da873..c6062df 100644
--- a/third_party/blink/web_tests/W3CImportExpectations
+++ b/third_party/blink/web_tests/W3CImportExpectations
@@ -376,24 +376,6 @@
 external/wpt/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html [ Skip ]
 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-novalue-manual.html [ Skip ]
 external/wpt/html/webappapis/scripting/event-loops/task_microtask_ordering-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_multiple_primary_pointers_boundary_events-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_pointerId_scope-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html [ Skip ]
-external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html [ Skip ]
-external/wpt/touch-events/multi-touch-interactions-manual.html [ Skip ]
-external/wpt/touch-events/multi-touch-interfaces-manual.html [ Skip ]
-external/wpt/touch-events/single-touch-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/focus-events/focus-contained-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/focus-events/legacy-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/click-on-body-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/click-on-div-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/click-on-html-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/click-order-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/mouseevents-mousemove-manual.htm [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/mousemove-across-manual.html [ Skip ]
-external/wpt/uievents/order-of-events/mouse-events/mousemove-between-manual.html [ Skip ]
 
 # TODO(crbug.com/974254): Remove the following once we can handle spaces in test names.
 external/wpt/webdriver/tests/element_clear/clear.py [ Skip ]
diff --git a/third_party/blink/web_tests/android/WeblayerWPTExpectations b/third_party/blink/web_tests/android/WeblayerWPTExpectations
index 38c2c291..6e7d1a27a 100644
--- a/third_party/blink/web_tests/android/WeblayerWPTExpectations
+++ b/third_party/blink/web_tests/android/WeblayerWPTExpectations
@@ -598,10 +598,6 @@
 crbug.com/1050754 external/wpt/cookies/samesite/setcookie-lax.https.html?legacy-samesite [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/window-open-reload.https.html [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/window-open-reload.https.html?legacy-samesite [ Failure ]
-crbug.com/1050754 external/wpt/cookies/schemeful-same-site/schemeful-iframe-subresource.tentative.html [ Failure ]
-crbug.com/1050754 external/wpt/cookies/schemeful-same-site/schemeful-navigation.tentative.html [ Failure ]
-crbug.com/1050754 external/wpt/cookies/schemeful-same-site/schemeful-subresource.tentative.html [ Failure ]
-crbug.com/1050754 external/wpt/cookies/schemeful-same-site/schemeful-websockets.sub.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/cors-rfc1918/address-space.https.window.html [ Failure ]
 crbug.com/1050754 external/wpt/cors-rfc1918/address-space.window.html [ Failure ]
 crbug.com/1050754 external/wpt/cors/304.htm [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 3ad273e..e7c17de 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -45934,6 +45934,32 @@
     },
     "css-backgrounds": {
      "animations": {
+      "animation-fallback-missing-100-percent.html": [
+       "0f1ef1e87728e1d37b1975ee00198c876aee0c80",
+       [
+        null,
+        [
+         [
+          "/css/css-backgrounds/animations/animation-fallback-missing-100-percent-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "animation-fallback-replace.html": [
+       "61330686631374307c2cca3eaab19d25ae9dffcd",
+       [
+        null,
+        [
+         [
+          "/css/css-backgrounds/animations/animation-fallback-replace-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "one-element-animation.html": [
        "36696fcaf8b9fb5ea18efb030dc5c56c5c2eee01",
        [
@@ -70660,6 +70686,19 @@
        {}
       ]
      ],
+     "grid-flex-item-006.html": [
+      "b5d49c4824c794513c823a9c949789f565476cd0",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "image-items-flake-001.html": [
       "90319f1ad83d26d414d8ddcd4a9ab59042a4bd62",
       [
@@ -166916,6 +166955,47 @@
       {}
      ]
     ],
+    "focus": {
+     "focus-pseudo-on-shadow-host-1.html": [
+      "ba900d6a6d27b84b37de14f26ad2d8ed1a42adc9",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "focus-pseudo-on-shadow-host-2.html": [
+      "a605aca5a63a56d6d03aa743a5d8fee010fb6729",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "focus-pseudo-on-shadow-host-3.html": [
+      "e72d1b39d4c23fc9c6e43ab04aae6b525d957bbb",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ]
+    },
     "layout-slot-no-longer-assigned.html": [
      "dfcac99da023ec2bbd94835f71efaef952a62341",
      [
@@ -175690,7 +175770,7 @@
       "338bea13b84a2f5c4d95b778637409e2bf8d3263",
       []
      ],
-     "frame-src-same-document.html.headers": [
+     "frame-src-same-document.sub.html.headers": [
       "6502444407f59e6ea08da63c8dcdb22978e5ae83",
       []
      ],
@@ -182855,6 +182935,14 @@
       []
      ],
      "animations": {
+      "animation-fallback-missing-100-percent-ref.html": [
+       "7a0046f27b2bd432944e61aee3bb900300093019",
+       []
+      ],
+      "animation-fallback-replace-ref.html": [
+       "271281cf8842d48c5ff9c325a8189388936be45f",
+       []
+      ],
       "background-image-interpolation-expected.txt": [
        "0d58012bada5a4860f1ba038b0a33f5d0f977318",
        []
@@ -199872,10 +199960,6 @@
       "d4649f2d5abc240f09551cc9efebfa2029406101",
       []
      ],
-     "position-absolute-table-001-expected.txt": [
-      "b02f749fafe6b78ea759369cb65b318609af8317",
-      []
-     ],
      "position-fixed-root-element-ref.html": [
       "96dfe200fb0dbae31906305e1536cf32f4d96c09",
       []
@@ -202666,16 +202750,8 @@
       "f19032171b8a0d8e33a78c1f53388a19c79b757d",
       []
      ],
-     "bounding-box-computation-1-expected.txt": [
-      "7005162d2e34d4c1d3b6fb99dd630f8ccca865bb",
-      []
-     ],
-     "bounding-box-computation-2-expected.txt": [
-      "1468c66ea14893fc150b6df9dac5598f622a26e2",
-      []
-     ],
      "bounding-box-computation-3-expected.txt": [
-      "d02228d6f36716d8f9a3bcc5b5e7246fa10fd8e0",
+      "385f27cfe39282dd476ed78a1bbeaeda8fbd52fd",
       []
      ],
      "calc-percent-plus-0px-fixed-ref.html": [
@@ -202690,10 +202766,6 @@
       "ab9d83927458d5b9881b07bc7fd8a1d31e471b33",
       []
      ],
-     "fixed-layout-excess-width-distribution-001-expected.txt": [
-      "503b52fc1bb0d3e1748d8434fba7ca434d778094",
-      []
-     ],
      "floats": {
       "floats-wrap-bfc-006b-ref.xht": [
        "93cdd3e51cab23bd4f20fb1794ae7eeeb5ff21b1",
@@ -202705,10 +202777,6 @@
       ]
      },
      "height-distribution": {
-      "computing-row-measure-0-expected.txt": [
-       "f1f68cd2cfb93e1b849206e65cf258f902013f8b",
-       []
-      ],
       "percentage-sizing-of-table-cell-children-002-ref.html": [
        "f2ed9e15dd2269fcb3d85ba25f7e2b423c9f92ea",
        []
@@ -202741,15 +202809,7 @@
       []
      ],
      "html5-table-formatting-1-expected.txt": [
-      "f158fbdaa72834bf28b3208482f68a0fb03203e1",
-      []
-     ],
-     "html5-table-formatting-2-expected.txt": [
-      "dc0a25c4f3cdb05704889e1cfcadbffdfeb745e7",
-      []
-     ],
-     "html5-table-formatting-fixed-layout-1-expected.txt": [
-      "6b9c17fb888cf5675815463978b126f1490d72c7",
+      "8910d66e2e0a3fcdf228d46feb602b6a9d86a5e9",
       []
      ],
      "max-height-table-ref.html": [
@@ -202813,18 +202873,6 @@
       []
      ],
      "tentative": {
-      "caption-expected.txt": [
-       "06e4ddeb81fd1d41df4d17d268998ff5e2a58249",
-       []
-      ],
-      "colspan-redistribution-expected.txt": [
-       "0e697f7ab4ca5f115bfb3d87f1c767c4e311700a",
-       []
-      ],
-      "column-widths-expected.txt": [
-       "b44c757e9bcd46a435d11c41483b60fd1ddc3002",
-       []
-      ],
       "paint": {
        "background-image-column-collapsed-ref.html": [
         "b3b1ce9ff37d19c2d43851399d22f299cb1608cf",
@@ -202860,12 +202908,6 @@
       "27eceb19b5a41355f288f94dbfa4daba574cbfde",
       []
      ],
-     "width-distribution": {
-      "computing-column-measure-1-expected.txt": [
-       "8d96bcf39dddd701f55ecedbe43f6c4c012b158f",
-       []
-      ]
-     },
      "zero-rowspan-001-ref.html": [
       "4f1dbdf96d301579da7fe3e9e493318e1920b705",
       []
@@ -213023,15 +213065,11 @@
       ]
      },
      "table-client-props-expected.txt": [
-      "426862ee614f7255ea73add366272c1b2bf11636",
-      []
-     ],
-     "table-offset-props-expected.txt": [
-      "d0c5f6793eae7dad22a91870d7413d7b6c285d32",
+      "a832cb95f22729d9625dd91775515958d1746ab9",
       []
      ],
      "table-scroll-props-expected.txt": [
-      "d978adab30da42b1f7b036dd6d0c10984dfd3607",
+      "0942e682714c36492e3639391ff2d686c3778ffd",
       []
      ]
     },
@@ -215772,6 +215810,26 @@
      []
     ],
     "experimental-features": {
+     "document-domain": {
+      "resources": {
+       "document-domain-disabled.html": [
+        "124ee143eee08b46b7effdb25e81cde65a1c16a8",
+        []
+       ],
+       "document-domain-disabled.html.headers": [
+        "57b46a600c0f4d5790767b74828a0ef56a34ba59",
+        []
+       ],
+       "document-domain-enabled.html": [
+        "fe03af0dbbe5dbb559b647a9fd2976b8035835b3",
+        []
+       ],
+       "document-domain-enabled.html.headers": [
+        "89ccbe756dfb39e50e8894eb791ee7626f18f59c",
+        []
+       ]
+      }
+     },
      "layout-animations-disabled-tentative.html.headers": [
       "745da550ee5162cffcdf3913a37efa6d355ca47e",
       []
@@ -216893,7 +216951,7 @@
       []
      ],
      "delete_5001-6000-expected.txt": [
-      "0a39854f1c4b019a265eff98f68a83dc38658cf1",
+      "699e4ef25de0e47e4ed2cdd217db617e5fac390e",
       []
      ],
      "delete_6001-last-expected.txt": [
@@ -216997,7 +217055,7 @@
       []
      ],
      "forwarddelete_5001-6000-expected.txt": [
-      "ce9671b24926400abd71ebb8ff82e3eaa6c7c020",
+      "e4d171b105114b634553bb41106847f6147d4321",
       []
      ],
      "forwarddelete_6001-last-expected.txt": [
@@ -217029,7 +217087,7 @@
       []
      ],
      "insertlinebreak-expected.txt": [
-      "388c9d39c81150d1b34bbef1db5ce9db93870a3e",
+      "7cc8915477a736717a129a526764dab1bb8226d2",
       []
      ],
      "insertorderedlist-expected.txt": [
@@ -217041,7 +217099,7 @@
       []
      ],
      "insertparagraph_1-1000-expected.txt": [
-      "5ee0e5a47b65338ebaae6187884cb396561cf4ad",
+      "474ffa54a7714c62868ed28c113f04c8f8e776fe",
       []
      ],
      "insertparagraph_1001-2000-expected.txt": [
@@ -217197,7 +217255,7 @@
       []
      ],
      "outdent_2001-last-expected.txt": [
-      "bc71d649ed58c1e1bd5dfeb0a46ff6ff871d985c",
+      "f25b169c55873cebd55561b5b7da36f6490880a9",
       []
      ],
      "removeformat-expected.txt": [
@@ -220849,7 +220907,7 @@
     ],
     "resources": {
      "test-expectations.js": [
-      "cc9b4ca3d121413ca4fa4bae5f255ff1e6dbe68e",
+      "844eb92f95eaf5f2406eb60a8cccb78a5c8484b3",
       []
      ],
      "window-tests-blob.js": [
@@ -225296,7 +225354,7 @@
        []
       ],
       "gentestutils.py": [
-       "b6861db5f9ef72bf5ed02087411e2c3694865d75",
+       "1ff2c77939695039601bb8d31e11d10b5962e3fe",
        []
       ],
       "name2dir-offscreen.yaml": [
@@ -225312,7 +225370,7 @@
        []
       ],
       "templates-offscreen.yaml": [
-       "58cec883c6a07443084905c939348a2221d587f6",
+       "b9d78567cc20afb8ff45826b307412d8a1190dfd",
        []
       ],
       "templates.yaml": [
@@ -225436,7 +225494,7 @@
          []
         ],
         "text.yaml": [
-         "b218d2d8b8b8bf253d9f471b1cb58aa8f21d3293",
+         "66a5b7cf9421933874202263de782726a48406f9",
          []
         ],
         "the-canvas-state.yaml": [
@@ -229645,12 +229703,6 @@
         []
        ]
       },
-      "synthetic": {
-       "001-expected.txt": [
-        "008e019cfd2cb7b8d3dd55b617cd575262e471d4",
-        []
-       ]
-      },
       "target-origin": {
        "004-1.html": [
         "94e43087434ec4d55dbff13b4bb9f56f4c9a1c54",
@@ -247482,6 +247534,10 @@
      []
     ],
     "focus": {
+     "focus-pseudo-matches-on-shadow-host-expected.txt": [
+      "3eea1c306839b2199b2cdf861b4b7333b11f304f",
+      []
+     ],
      "focus-selector-delegatesFocus-expected.txt": [
       "362512535d5a56b7a54725207a512fc5ef10376b",
       []
@@ -309744,6 +309800,15 @@
    },
    "document-policy": {
     "experimental-features": {
+     "document-domain": {
+      "document-domain.tentative.sub.html": [
+       "65de95c9a3899a884b9ccb47a626701799950bfa",
+       [
+        null,
+        {}
+       ]
+      ]
+     },
      "document-write.tentative.html": [
       "551703c6f56b74856e2b7b465760fc57c2fe95dc",
       [
@@ -324624,7 +324689,7 @@
      ]
     ],
     "textdecoder-labels.any.js": [
-     "ed407a3254792398d5109d0d1ee5fbee5e9ef093",
+     "efc4ae2d2ea586cf15d2e89369c9bb337b765cfa",
      [
       "encoding/textdecoder-labels.any.html",
       {
@@ -324636,8 +324701,13 @@
         [
          "script",
          "resources/encodings.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ],
      [
@@ -324651,8 +324721,13 @@
         [
          "script",
          "resources/encodings.js"
+        ],
+        [
+         "timeout",
+         "long"
         ]
-       ]
+       ],
+       "timeout": "long"
       }
      ]
     ],
@@ -348604,10 +348679,18 @@
         ]
        ],
        "2d.composite.uncovered.fill.destination-in.worker.js": [
-        "ed191da99a747d57b3efcd2dffe67e3e51c72aa1",
+        "f4555f7d1dbbfe6ff203ef4cad5239b770e5ccb2",
         [
          "html/canvas/offscreen/compositing/2d.composite.uncovered.fill.destination-in.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.composite.uncovered.fill.source-in.html": [
@@ -348904,10 +348987,18 @@
         ]
        ],
        "2d.drawImage.3arg.worker.js": [
-        "b89beed86fbc3a631544154e4c0cecb3dd382acb",
+        "219e90d36d8c18233745cbba7fc578aad71c9b9b",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.3arg.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.5arg.html": [
@@ -348920,10 +349011,18 @@
         ]
        ],
        "2d.drawImage.5arg.worker.js": [
-        "4d8b4bafd7fe0200478f85e39f2efb9981623e03",
+        "005235a24353e4354d5a9c5b2e331f56be318b61",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.5arg.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.9arg.basic.html": [
@@ -348936,10 +349035,18 @@
         ]
        ],
        "2d.drawImage.9arg.basic.worker.js": [
-        "9d6913aae9322ee110e3258bbe37b688dfd12e57",
+        "3f26c729ce8c584d57c9cdd1032ca1d54aa87ee2",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.9arg.destpos.html": [
@@ -348952,10 +349059,18 @@
         ]
        ],
        "2d.drawImage.9arg.destpos.worker.js": [
-        "b4a2402df76e90d06a984289f189885ecc3139d2",
+        "ed9a7256709f203afa47ee06ae572825e74d5ee3",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.9arg.destpos.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.9arg.destsize.html": [
@@ -348968,10 +349083,18 @@
         ]
        ],
        "2d.drawImage.9arg.destsize.worker.js": [
-        "5ad01d6715d645778e29e53adecc0899ea71a97c",
+        "8cc7748930489bbc83c3e2014e9b3b4f20ad4411",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.9arg.destsize.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.9arg.sourcepos.html": [
@@ -348984,10 +349107,18 @@
         ]
        ],
        "2d.drawImage.9arg.sourcepos.worker.js": [
-        "9679ee4cfac06ef88c818c22f480e5af62e20eec",
+        "6697bfeb8d783c1c2d288f9b433b43f373fa35d0",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcepos.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.9arg.sourcesize.html": [
@@ -349000,10 +349131,18 @@
         ]
        ],
        "2d.drawImage.9arg.sourcesize.worker.js": [
-        "bfcafa951225c5416b17912cacab5a0bff489c91",
+        "7079998786c8249af7544cb29f593044d080c1c4",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.alpha.html": [
@@ -349016,10 +349155,18 @@
         ]
        ],
        "2d.drawImage.alpha.worker.js": [
-        "2621c5f8e12baa77a4c8eda79a938c21b525777c",
+        "791665c9daf9ab3259ccde5bd874105571fa88b5",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.alpha.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.animated.poster.html": [
@@ -349032,10 +349179,18 @@
         ]
        ],
        "2d.drawImage.animated.poster.worker.js": [
-        "4678ba3c5c2c96e41a200f63de34ab0a4351fc30",
+        "e92ffd652e94f934450f84fd4854654d59eba7f8",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.broken.html": [
@@ -349048,10 +349203,18 @@
         ]
        ],
        "2d.drawImage.broken.worker.js": [
-        "31e1241ab51af895c33d01d5e5937a2cbbd0216c",
+        "ab5f2d67d5c1d53d7a41dae542ef58708596a57b",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.broken.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.canvas.html": [
@@ -349064,10 +349227,18 @@
         ]
        ],
        "2d.drawImage.canvas.worker.js": [
-        "09985f437e69b26ebfca9cfa16d8708ceedfb552",
+        "8ab99fe152f6a1404baa22e20754a62c8b38b4a9",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.clip.html": [
@@ -349080,10 +349251,18 @@
         ]
        ],
        "2d.drawImage.clip.worker.js": [
-        "886a84d1a4f95086a2cb794d007ecd6c86404b4d",
+        "39e6a924345680e98ede28499e06cd02051d74a1",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.clip.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.composite.html": [
@@ -349096,10 +349275,18 @@
         ]
        ],
        "2d.drawImage.composite.worker.js": [
-        "ec2185b13d82a6a8784ee7346027cd1ea74db963",
+        "cf3b6c7129bb6207c1f3314af8194818d816edf9",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.composite.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.floatsource.html": [
@@ -349112,10 +349299,18 @@
         ]
        ],
        "2d.drawImage.floatsource.worker.js": [
-        "95da2113bbe870c6fdd28e85530acc619a1539cb",
+        "28a74799136e6a23981681e00da8579de2e8d96d",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.floatsource.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.negativedest.html": [
@@ -349128,10 +349323,18 @@
         ]
        ],
        "2d.drawImage.negativedest.worker.js": [
-        "29c64a3c13301bc35d22b91cf6d9e51106a9e952",
+        "95749c437598ca92625863eb99bbb1a4ad6c7132",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.negativedest.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.negativedir.html": [
@@ -349144,10 +349347,18 @@
         ]
        ],
        "2d.drawImage.negativedir.worker.js": [
-        "a1a64c34a352372b09b1e71bb62898d36ed52044",
+        "23eb5a21bbd90a06cdca86fb4e5b5805dd09101b",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.negativedir.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.negativesource.html": [
@@ -349160,10 +349371,18 @@
         ]
        ],
        "2d.drawImage.negativesource.worker.js": [
-        "19353c38c81683f46e2ec4e9a1021c8788c4f031",
+        "b27638554bd31d36429c105546483fee8b9acdaa",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.negativesource.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.nonfinite.html": [
@@ -349176,10 +349395,18 @@
         ]
        ],
        "2d.drawImage.nonfinite.worker.js": [
-        "91ef15c8bc32e651ee112c8c7c65977945486124",
+        "0daa4c687e807e137e690e0c2cbb89c827185499",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.nonfinite.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.nowrap.html": [
@@ -349192,10 +349419,18 @@
         ]
        ],
        "2d.drawImage.nowrap.worker.js": [
-        "a4be66b950ec47c6d93b97c0b4aa299a5803a957",
+        "cd1bc0b8ba51c2a9235d785ca4b99ddba63219b4",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.nowrap.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.null.html": [
@@ -349208,10 +349443,18 @@
         ]
        ],
        "2d.drawImage.null.worker.js": [
-        "5c9d774900672a8ab67acfa27315508850983c94",
+        "0572dd5addbd47827f8066d8e14207e6573ee705",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.null.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.path.html": [
@@ -349224,10 +349467,18 @@
         ]
        ],
        "2d.drawImage.path.worker.js": [
-        "497b837579b5e4b86a112af6e437132155d73cbe",
+        "1916238531a25575ef9c6761fa6a03f3ef1d48ad",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.path.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.self.1.html": [
@@ -349240,10 +349491,18 @@
         ]
        ],
        "2d.drawImage.self.1.worker.js": [
-        "fbcf171f606ff557ed3d5a5094cd0ebd54ba537c",
+        "17fcd2ad49d08dfa89b9a4c1820a8e76d1f9162f",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.self.1.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.self.2.html": [
@@ -349256,10 +349515,18 @@
         ]
        ],
        "2d.drawImage.self.2.worker.js": [
-        "524e91c8f0bb5a8b361b9e546bf8a4424201b919",
+        "adfeea5d93b464006453fb4058e8186464b6ec3f",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.self.2.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.svg.html": [
@@ -349272,10 +349539,18 @@
         ]
        ],
        "2d.drawImage.svg.worker.js": [
-        "6fc5e84345813d3f8bd6a1ac4969ace638a7fa1f",
+        "6189edc5c3855c71bd4113df989bf9578cd3f720",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.svg.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.transform.html": [
@@ -349288,10 +349563,18 @@
         ]
        ],
        "2d.drawImage.transform.worker.js": [
-        "a8b8b9aa1f80f20e1cc8c5fb245fb35abfd421bb",
+        "791c710270263001b4b7391d73abaab007e5b232",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.transform.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.wrongtype.html": [
@@ -349304,10 +349587,18 @@
         ]
        ],
        "2d.drawImage.wrongtype.worker.js": [
-        "418c9b2ebe310da20d5d8b099fec8d19b9b2fded",
+        "c3b945ca0e786b307839df340cb217b6e2e5cf6a",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.wrongtype.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.zerocanvas.html": [
@@ -349320,10 +349611,18 @@
         ]
        ],
        "2d.drawImage.zerocanvas.worker.js": [
-        "fb23cee4b4967b37cc3feedd0386ee6f74287ac7",
+        "7d6f9767dcb05eca94091bd77d1732361b51bb1a",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.zerosource.html": [
@@ -349345,17 +349644,33 @@
         ]
        ],
        "2d.drawImage.zerosource.image.worker.js": [
-        "200a311f7b24bbc517aba78925787a58b7e6a3cb",
+        "8901d7207d7a5d595afc67a220ef39a69818f3c5",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.zerosource.image.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.drawImage.zerosource.worker.js": [
-        "37ef6d87352571d49d9c7d30f08c5e52b87dab16",
+        "7d5994edb3a24d96238c06c63707ae56e839e292",
         [
          "html/canvas/offscreen/drawing-images-to-the-canvas/2d.drawImage.zerosource.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ]
       },
@@ -357071,17 +357386,27 @@
         ]
        ],
        "2d.text.draw.fill.maxWidth.zero.html": [
-        "a5c6645bbb3ed870d76a08350f4316dbc5854681",
+        "6174ddeb1e1562741eff5fa74372c4f5425626f8",
         [
          null,
-         {}
+         {
+          "timeout": "long"
+         }
         ]
        ],
        "2d.text.draw.fill.maxWidth.zero.worker.js": [
-        "4c326be75774ff375757f1c7397046b088baf0bd",
+        "eaeb45829e572157c4ac82f8626ffd1d11d02f80",
         [
          "html/canvas/offscreen/text/2d.text.draw.fill.maxWidth.zero.worker.html",
-         {}
+         {
+          "script_metadata": [
+           [
+            "timeout",
+            "long"
+           ]
+          ],
+          "timeout": "long"
+         }
         ]
        ],
        "2d.text.draw.fill.unaffected.html": [
@@ -360696,7 +361021,7 @@
       ],
       "synthetic": {
        "001.html": [
-        "f90c345740df3f9c4366d01a3d47e323b30069fc",
+        "c0bf8a5776a53954d2e40945cc4ddf6577910236",
         [
          null,
          {}
@@ -369541,6 +369866,13 @@
          null,
          {}
         ]
+       ],
+       "popup-stacking.tentative.html": [
+        "bcba6f064c033aa25291fa7ff4df4ddb4f63d29d",
+        [
+         null,
+         {}
+        ]
        ]
       },
       "the-summary-element": {
@@ -410022,6 +410354,13 @@
        }
       ]
      ],
+     "focus-pseudo-matches-on-shadow-host.html": [
+      "245e338a3b8f9226f8fd896692c1dfa45caa79ef",
+      [
+       null,
+       {}
+      ]
+     ],
      "focus-selector-delegatesFocus.html": [
       "3702f8e2ba63228cba5c483a76f2b77372e68c4d",
       [
@@ -422768,14 +423107,30 @@
      ]
     ],
     "url-constructor.any.js": [
-     "153d985ff6796183fd01b66437549544c497d02b",
+     "3f4af56d2a9654f323f912c5a6e64686c415da42",
      [
       "url/url-constructor.any.html",
-      {}
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ]
+       ],
+       "timeout": "long"
+      }
      ],
      [
       "url/url-constructor.any.worker.html",
-      {}
+      {
+       "script_metadata": [
+        [
+         "timeout",
+         "long"
+        ]
+       ],
+       "timeout": "long"
+      }
      ]
     ],
     "url-origin.any.js": [
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/frame-src/frame-src-same-document.html.headers b/third_party/blink/web_tests/external/wpt/content-security-policy/frame-src/frame-src-same-document.sub.html.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/content-security-policy/frame-src/frame-src-same-document.html.headers
rename to third_party/blink/web_tests/external/wpt/content-security-policy/frame-src/frame-src-same-document.sub.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/selectors-dir-selector-auto-direction-change-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-dir-selector-auto-direction-change-001.html
new file mode 100644
index 0000000..f6c6393b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-dir-selector-auto-direction-change-001.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<html>
+<head>
+    <title>CSS Selectors Level 4 Test: Check for correctly updating :dir=auto when the the directionality is changed in a display:none subtree </title>
+    <meta charset="utf8">
+    <link rel="author" title="Miyoung Shin" href="mailto:myid.shin@igalia.com">
+    <link rel="help" href="http://www.w3.org/TR/selectors4/#dir-pseudo">
+    <link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+    <style>
+        #target {
+          width: 100px;
+          height: 100px;
+          background-color: red;
+        }
+        :dir(ltr) + #target {
+          background-color: green;
+        }
+    </style>
+</head>
+
+<body>
+    <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+    <div dir="auto" style="display:none">
+        <div>
+          <div id="inner">رسمية</div>
+        </div>
+    </div>
+    <div id="target"></div>
+    <script>
+        inner.offsetTop;
+        inner.firstChild.data = "LTR";
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/dom/idlharness.window_exclude=Node-expected.txt b/third_party/blink/web_tests/external/wpt/dom/idlharness.window_exclude=Node-expected.txt
index 8614c5c..aab09e1 100644
--- a/third_party/blink/web_tests/external/wpt/dom/idlharness.window_exclude=Node-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/dom/idlharness.window_exclude=Node-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1252 tests; 1247 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1252 tests; 1248 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface Window: original interface defined
@@ -896,7 +896,7 @@
 PASS AbstractRange interface: attribute endOffset
 PASS AbstractRange interface: attribute collapsed
 PASS StaticRange interface: existence and properties of interface object
-FAIL StaticRange interface object length assert_equals: wrong value for StaticRange.length expected 1 but got 0
+PASS StaticRange interface object length
 PASS StaticRange interface object name
 PASS StaticRange interface: existence and properties of interface prototype object
 PASS StaticRange interface: existence and properties of interface prototype object's "constructor" property
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
index fc20df6..9073e52 100644
--- a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-element-reflection.tentative.html
@@ -181,8 +181,10 @@
     deletionParent.ariaActiveDescendantElement = idlAttrElement;
     assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idlAttrElement");
 
+    // The element is still retrieved because it was explicitly set, and was at that point
+    // in a valid scope.
     deletionParent.removeChild(idlAttrElement);
-    assert_equals(deletionParent.ariaActiveDescendantElement, null);
+    assert_equals(deletionParent.ariaActiveDescendantElement, idlAttrElement);
 
     // The content attribute will still reflect the id.
     assert_equals(deletionParent.getAttribute("aria-activedescendant"), "idlAttrElement");
@@ -219,9 +221,8 @@
   }, "Changing the ID of an element causes the content attribute to become out of sync.");
   </script>
 
-  <!-- TODO(chrishall): change naming scheme to inner/outer -->
   <div id="lightParent" role="listbox">
-    <div id="lightElement" role="option">Hello world!</div>
+    <div role="option" id="lightElement">Hello world!</div>
   </div>
   <div id="shadowHostElement"></div>
 
@@ -230,104 +231,23 @@
     const lightElement = document.getElementById("lightElement");
     const shadowRoot = shadowHostElement.attachShadow({mode: "open"});
 
-    assert_equals(lightParent.ariaActiveDescendantElement, null, 'null before');
-    assert_equals(lightParent.getAttribute('aria-activedescendant'), null, 'null before');
-
     lightParent.ariaActiveDescendantElement = lightElement;
     assert_equals(lightParent.ariaActiveDescendantElement, lightElement);
-    assert_equals(lightParent.getAttribute('aria-activedescendant'), "lightElement");
 
-    // Move the referenced element into shadow DOM.
-    // This will cause the computed attr-associated element to be null as the
-    // referenced element will no longer be in a valid scope.
-    // The underlying reference is kept intact, so if the referenced element is
-    // later restored to a valid scope the computed attr-associated element will
-    // then reflect
+    // Move the referenced element into shadow DOM. As it was explicitly set,
+    // it is still able to be gotten even though it is in a different scope.
     shadowRoot.appendChild(lightElement);
-    assert_equals(lightParent.ariaActiveDescendantElement, null, "computed attr-assoc element should be null as referenced element is in an invalid scope");
+    assert_equals(lightParent.ariaActiveDescendantElement, lightElement);
     assert_equals(lightParent.getAttribute("aria-activedescendant"), "lightElement");
 
     // Move the referenced element back into light DOM.
-    // Since the underlying reference was kept intact, after moving the
-    // referenced element back to a valid scope should be reflected in the
-    // computed attr-associated element.
     lightParent.appendChild(lightElement);
-    assert_equals(lightParent.ariaActiveDescendantElement, lightElement, "computed attr-assoc element should be restored as referenced element is back in a valid scope");
+    assert_equals(lightParent.ariaActiveDescendantElement, lightElement);
     assert_equals(lightParent.getAttribute("aria-activedescendant"), "lightElement");
-  }, "Reparenting an element into a descendant shadow scope hides the element reference.");
+  }, "Reparenting an element into a descendant shadow scope nullifies the element reference.");
   </script>
 
-  <div id='fruitbowl' role='listbox'>
-    <div id='apple' role='option'>I am an apple</div>
-    <div id='pear' role='option'>I am a pear</div>
-    <div id='banana' role='option'>I am a banana</div>
-  </div>
-  <div id='shadowFridge'></div>
-
-  <script>
-  test(function(t) {
-    const shadowRoot = shadowFridge.attachShadow({mode: "open"});
-    const banana = document.getElementById("banana");
-
-    fruitbowl.ariaActiveDescendantElement = apple;
-    assert_equals(fruitbowl.ariaActiveDescendantElement, apple);
-    assert_equals(fruitbowl.getAttribute("aria-activedescendant"), "apple");
-
-    // Move the referenced element into shadow DOM.
-    shadowRoot.appendChild(apple);
-    assert_equals(fruitbowl.ariaActiveDescendantElement, null, "computed attr-assoc element should be null as referenced element is in an invalid scope");
-    // Note that the content attribute is NOT cleared.
-    assert_equals(fruitbowl.getAttribute("aria-activedescendant"), "apple");
-
-    // let us rename our banana to an apple
-    banana.setAttribute("id", "apple");
-    const lyingBanana = document.getElementById("apple");
-    assert_equals(lyingBanana, banana);
-
-    // our ariaActiveDescendantElement thankfully isn't tricked.
-    // this is thanks to the underlying reference being kept intact, it is
-    // checked and found to be in an invalid scope and therefore the content
-    // attribute fallback isn't used.
-    assert_equals(fruitbowl.ariaActiveDescendantElement, null);
-    // our content attribute still returns "apple",
-    // even though fetching that by id would give us our lying banana.
-    assert_equals(fruitbowl.getAttribute("aria-activedescendant"), "apple");
-
-    // when we remove our IDL attribute, the content attribute is also thankfully cleared.
-    fruitbowl.ariaActiveDescendantElement = null;
-    assert_equals(fruitbowl.ariaActiveDescendantElement, null);
-    assert_equals(fruitbowl.getAttribute("aria-activedescendant"), null);
-  }, "Reparenting referenced element cannot cause retargeting of reference.");
-  </script>
-
-  <div id='toaster' role='listbox'></div>
-  <div id='shadowPantry'></div>
-
-  <script>
-  test(function(t) {
-    const shadowRoot = shadowPantry.attachShadow({mode: "open"});
-
-    // Our toast starts in the shadowPantry.
-    const toast = document.createElement("div");
-    toast.setAttribute("id", "toast");
-    shadowRoot.appendChild(toast);
-
-    // Prepare my toast for toasting
-    toaster.ariaActiveDescendantElement = toast;
-    assert_equals(toaster.ariaActiveDescendantElement, null);
-    assert_equals(toaster.getAttribute("aria-activedescendant"), "");
-
-    // Time to make some toast
-    toaster.appendChild(toast);
-    assert_equals(toaster.ariaActiveDescendantElement, toast);
-    // Current spec behaviour:
-    assert_equals(toaster.getAttribute("aria-activedescendant"), "");
-  }, "Element reference set in invalid scope remains intact throughout move to valid scope.");
-  </script>
-
-  <div id="billingElementContainer">
-      <div id="billingElement">Billing</div>
-  </div>
+  <div id="billingElement">Billing</div>
   <div>
       <div id="nameElement">Name</div>
       <input type="text" id="input1" aria-labelledby="billingElement nameElement"/>
@@ -347,15 +267,9 @@
     assert_array_equals(input2.ariaLabelledByElements, [billingElement, addressElement], "Testing IDL setter/getter.");
     assert_equals(input2.getAttribute("aria-labelledby"), "billingElement addressElement");
 
-    // Remove the billingElement from the DOM.
-    // As it was explicitly set the underlying association will remain intact,
-    // but it will be hidden until the element is moved back into a valid scope.
+    // Remove the element from the DOM, but as it was explicitly set whilst in a valid scope
+    // it can still be retrieved.
     billingElement.remove();
-    assert_array_equals(input2.ariaLabelledByElements, [addressElement]);
-
-    // Insert the billingElement back into the DOM and check that it is visible
-    // again, as the underlying association should have been kept intact.
-    billingElementContainer.appendChild(billingElement);
     assert_array_equals(input2.ariaLabelledByElements, [billingElement, addressElement]);
 
     input2.ariaLabelledByElements = [];
@@ -531,8 +445,8 @@
     // Elements that cross into shadow DOM are dropped, only reflect the valid
     // elements in IDL and in the content attribute.
     lightDomHeading.ariaFlowToElements = [shadowChild1, shadowChild2, lightDomText1, lightDomText2];
-    assert_array_equals(lightDomHeading.ariaFlowToElements, [lightDomText1, lightDomText2], "IDL should only include valid elements");
-    assert_equals(lightDomHeading.getAttribute("aria-flowto"), "", "empty content attribute if any given elements cross shadow boundaries");
+    assert_array_equals(lightDomHeading.ariaFlowToElements, [lightDomText1, lightDomText2]);
+    assert_equals(lightDomHeading.getAttribute("aria-flowto"), "lightDomText1 lightDomText2", "empty content attribute if any given elements cross shadow boundaries");
 
     // Using a mixture of elements in the same scope and in a shadow including
     // ancestor should set the IDL attribute, but should reflect the empty
@@ -565,28 +479,29 @@
     describedElement.ariaDescribedByElements = [description1, description2];
 
     // All elements were in the same scope, so elements are gettable and the content attribute reflects the ids.
-    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2], "same scope reference");
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
     assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
 
     outerShadowRoot.appendChild(describedElement);
 
     // Explicitly set attr-associated-elements should still be gettable because we are referencing elements in a lighter scope.
     // The content attr still reflects the ids from the explicit elements because they were in a valid scope at the time of setting.
-    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2], "lighter scope reference");
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
     assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
 
     // Move the explicitly set elements into a deeper shadow DOM to test the relationship should not be gettable.
     innerShadowRoot.appendChild(description1);
     innerShadowRoot.appendChild(description2);
 
-    // Explicitly set elements are no longer retrievable, because they are no longer in a valid scope.
-    assert_array_equals(describedElement.ariaDescribedByElements, [], "invalid scope reference");
+    // Explicitly set elements are still retrieved, because they were in a valid scope when they were set.
+    // The content attribute still reflects the ids.
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
     assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
 
     // Move into the same shadow scope as the explicitly set elements to test that the elements are gettable
     // and reflect the correct IDs onto the content attribute.
     innerShadowRoot.appendChild(describedElement);
-    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2], "restored valid scope reference");
+    assert_array_equals(describedElement.ariaDescribedByElements, [description1, description2]);
     assert_equals(describedElement.getAttribute("aria-describedby"), "buttonDescription1 buttonDescription2");
   }, "Moving explicitly set elements across shadow DOM boundaries.");
   </script>
@@ -624,21 +539,20 @@
       headingElement.ariaLabelledByElements = [headingLabel1, headingLabel2];
       assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2", "Elements are set again, so the content attribute is updated.");
 
-      // Remove the referring element from the DOM, elements are no longer longer exposed,
-      // underlying internal reference is still kept intact.
+      // Remove the referring element from the DOM, elements are gettable.
       headingElement.remove();
-      assert_array_equals(headingElement.ariaLabelledByElements, [], "Element is no longer in the document, so references should no longer be exposed.");
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2], "Element is no longer in the document, but references should be gettable.");
       assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
 
       // Insert it back in.
       sameScopeContainer.appendChild(headingElement);
-      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2], "Element is restored to valid scope, so should be gettable.");
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2]);
       assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
 
-      // Remove everything from the DOM, nothing is exposed again.
+      // Remove everything from the DOM, everything is still gettable.
       headingLabel1.remove();
       headingLabel2.remove();
-      assert_array_equals(headingElement.ariaLabelledByElements, []);
+      assert_array_equals(headingElement.ariaLabelledByElements, [headingLabel1, headingLabel2]);
       assert_equals(headingElement.getAttribute("aria-labelledby"), "headingLabel1 headingLabel2");
       assert_equals(document.getElementById("headingLabel1"), null);
       assert_equals(document.getElementById("headingLabel2"), null);
@@ -665,47 +579,4 @@
       // See: https://github.com/whatwg/html/pull/3917#issuecomment-527263562
       assert_equals(input.ariaActiveDescendantElement, first);
     }, "Reparenting.");
-  </script>
-
-  <div id='fromDiv'></div>
-
-  <script>
-    test(function(t) {
-      const toSpan = document.createElement('span');
-      toSpan.setAttribute("id", "toSpan");
-      fromDiv.ariaActiveDescendantElement = toSpan;
-
-      assert_equals(fromDiv.ariaActiveDescendantElement, null, "Referenced element not inserted into document, so is in an invalid scope.");
-      assert_equals(fromDiv.getAttribute("aria-activedescendant"), "", "Invalid scope, so content attribute not set.");
-
-      fromDiv.appendChild(toSpan);
-      assert_equals(fromDiv.ariaActiveDescendantElement, toSpan, "Referenced element now inserted into the document.");
-      assert_equals(fromDiv.getAttribute("aria-activedescendant"), "", "Content attribute remains empty, as it is only updated at set time.");
-
-    }, "Attaching element reference before it's inserted into the DOM.");
-  </script>
-
-  <div id='originalDocumentDiv'></div>
-
-  <script>
-    test(function(t) {
-      const newDoc = document.implementation.createHTMLDocument('new document');
-      const newDocSpan = newDoc.createElement('span');
-      newDoc.body.appendChild(newDocSpan);
-
-      // Create a reference across documents.
-      originalDocumentDiv.ariaActiveDescendantElement = newDocSpan;
-
-      assert_equals(originalDocumentDiv.ariaActiveDescendantElement, null, "Cross-document is an invalid scope, so reference will not be visible.");
-      assert_equals(fromDiv.getAttribute("aria-activedescendant"), "", "Invalid scope when set, so content attribute not set.");
-
-      // "Move" span to first document.
-      originalDocumentDiv.appendChild(newDocSpan);
-
-      // Implementation defined: moving object into same document from other document may cause reference to become visible.
-      assert_equals(originalDocumentDiv.ariaActiveDescendantElement, newDocSpan, "Implementation defined: moving object back *may* make reference visible.");
-      assert_equals(fromDiv.getAttribute("aria-activedescendant"), "", "Invalid scope when set, so content attribute not set.");
-    }, "Cross-document references and moves.");
-  </script>
-
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/dom/ranges/StaticRange-constructor-expected.txt b/third_party/blink/web_tests/external/wpt/dom/ranges/StaticRange-constructor-expected.txt
deleted file mode 100644
index 8df10da..0000000
--- a/third_party/blink/web_tests/external/wpt/dom/ranges/StaticRange-constructor-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-This is a testharness.js-based test.
-FAIL Construct static range with Element container Illegal constructor
-FAIL Construct static range with Text container Illegal constructor
-FAIL Construct static range with Element startContainer and Text endContainer Illegal constructor
-FAIL Construct static range with Text startContainer and Element endContainer Illegal constructor
-FAIL Construct static range with ProcessingInstruction container Illegal constructor
-FAIL Construct static range with Comment container Illegal constructor
-FAIL Construct static range with CDATASection container Illegal constructor
-FAIL Construct static range with Document container Illegal constructor
-FAIL Construct static range with DocumentFragment container Illegal constructor
-FAIL Construct collapsed static range Illegal constructor
-FAIL Construct inverted static range Illegal constructor
-FAIL Construct static range with offset greater than length Illegal constructor
-FAIL Construct static range with standalone Node container Illegal constructor
-FAIL Construct static range with endpoints in disconnected trees Illegal constructor
-FAIL Construct static range with endpoints in disconnected documents Illegal constructor
-FAIL Throw on DocumentType or Attr container assert_throws_dom: throw a InvalidNodeTypeError when a DocumentType is passed as a startContainer or endContainer function "function() {
-        const staticRange = new StaticRange({startContainer: document.doctype, startOffset: 0, endContainer: document.doctype, endOffset: 0});
-    }" threw object "TypeError: Illegal constructor" that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to undefined, expected 24
-PASS Throw on missing or invalid arguments
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/font-access/resources/test-expectations.js b/third_party/blink/web_tests/external/wpt/font-access/resources/test-expectations.js
index cc9b4ca..844eb92 100644
--- a/third_party/blink/web_tests/external/wpt/font-access/resources/test-expectations.js
+++ b/third_party/blink/web_tests/external/wpt/font-access/resources/test-expectations.js
@@ -14,37 +14,54 @@
     postscriptName: 'Monaco',
     fullName: 'Monaco',
     family: 'Monaco',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
       // Tables related to TrueType.
-      'cvt ', 'glyf', 'loca', 'prep', 'gasp',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
+      'gasp',
     ],
   },
   {
     postscriptName: 'Menlo-Regular',
     fullName: 'Menlo Regular',
     family: 'Menlo',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
     postscriptName: 'Menlo-Bold',
     fullName: 'Menlo Bold',
     family: 'Menlo',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
     postscriptName: 'Menlo-BoldItalic',
     fullName: 'Menlo Bold Italic',
     family: 'Menlo',
+    style: 'Bold Italic',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   // Indic.
@@ -52,36 +69,52 @@
     postscriptName: 'GujaratiMT',
     fullName: 'Gujarati MT',
     family: 'Gujarati MT',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
     postscriptName: 'GujaratiMT-Bold',
     fullName: 'Gujarati MT Bold',
     family: 'Gujarati MT',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
     postscriptName: 'DevanagariMT',
     fullName: 'Devanagari MT',
     family: 'Devanagari MT',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
     postscriptName: 'DevanagariMT-Bold',
     fullName: 'Devanagari MT Bold',
     family: 'Devanagari MT',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   // Japanese.
@@ -89,18 +122,22 @@
     postscriptName: 'HiraMinProN-W3',
     fullName: 'Hiragino Mincho ProN W3',
     family: 'Hiragino Mincho ProN',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'CFF ', 'VORG',
+      'CFF ',
+      'VORG',
     ],
   },
   {
     postscriptName: 'HiraMinProN-W6',
     fullName: 'Hiragino Mincho ProN W6',
     family: 'Hiragino Mincho ProN',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'CFF ', 'VORG',
+      'CFF ',
+      'VORG',
     ],
   },
   // Korean.
@@ -108,18 +145,24 @@
     postscriptName: 'AppleGothic',
     fullName: 'AppleGothic Regular',
     family: 'AppleGothic',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'cvt ', 'glyf', 'loca',
+      'cvt ',
+      'glyf',
+      'loca',
     ],
   },
   {
     postscriptName: 'AppleMyungjo',
     fullName: 'AppleMyungjo Regular',
     family: 'AppleMyungjo',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
-      'cvt ', 'glyf', 'loca',
+      'cvt ',
+      'glyf',
+      'loca',
     ],
   },
   // Chinese.
@@ -127,18 +170,26 @@
     postscriptName: 'STHeitiTC-Light',
     fullName: 'Heiti TC Light',
     family: 'Heiti TC',
+    style: 'Light',
     label: TEST_SIZE_CATEGORY.large,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   {
-   postscriptName: 'STHeitiTC-Medium',
+    postscriptName: 'STHeitiTC-Medium',
     fullName: 'Heiti TC Medium',
     family: 'Heiti TC',
+    style: 'Medium',
     label: TEST_SIZE_CATEGORY.large,
     expectedTables: [
-      'cvt ', 'glyf', 'loca', 'prep',
+      'cvt ',
+      'glyf',
+      'loca',
+      'prep',
     ],
   },
   // Bitmap.
@@ -146,9 +197,11 @@
     postscriptName: 'AppleColorEmoji',
     fullName: 'Apple Color Emoji',
     family: 'Apple Color Emoji',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.large,
     expectedTables: [
-      'glyf', 'loca',
+      'glyf',
+      'loca',
       // Tables related to Bitmap Glyphs.
       'sbix',
     ],
@@ -160,6 +213,7 @@
     postscriptName: 'Verdana',
     fullName: 'Verdana',
     family: 'Verdana',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
       // Tables related to TrueType.
@@ -174,6 +228,7 @@
     postscriptName: 'Verdana-Bold',
     fullName: 'Verdana Bold',
     family: 'Verdana',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
       // Tables related to TrueType.
@@ -188,6 +243,7 @@
     postscriptName: 'Verdana-Italic',
     fullName: 'Verdana Italic',
     family: 'Verdana',
+    style: 'Italic',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
       // Tables related to TrueType.
@@ -203,6 +259,7 @@
     postscriptName: 'MalgunGothicBold',
     fullName: 'Malgun Gothic Bold',
     family: 'Malgun Gothic',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.medium,
     expectedTables: [
       // Tables related to TrueType.
@@ -218,12 +275,14 @@
     postscriptName: 'MicrosoftYaHei',
     fullName: 'Microsoft YaHei',
     family: 'Microsoft YaHei',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.medium,
   },
   {
     postscriptName: 'MicrosoftYaHei-Bold',
     fullName: 'Microsoft YaHei Bold',
     family: 'Microsoft YaHei',
+    style: 'Bold',
     label: TEST_SIZE_CATEGORY.medium,
   },
 ];
@@ -233,6 +292,7 @@
     postscriptName: 'Ahem',
     fullName: 'Ahem',
     family: 'Ahem',
+    style: 'Regular',
     label: TEST_SIZE_CATEGORY.small,
     expectedTables: [
       // Tables related to TrueType.
@@ -330,17 +390,20 @@
   const postscriptNameSet = new Set();
   const fullNameSet = new Set();
   const familySet = new Set();
+  const styleSet = new Set();
 
   for (const f of expectedFonts) {
     postscriptNameSet.add(f.postscriptName);
     fullNameSet.add(f.fullName);
     familySet.add(f.family);
+    styleSet.add(f.style);
   }
 
   for (const f of availableFonts) {
     postscriptNameSet.delete(f.postscriptName);
     fullNameSet.delete(f.fullName);
     familySet.delete(f.family);
+    styleSet.delete(f.style);
   }
 
   assert_equals(postscriptNameSet.size, 0,
@@ -349,6 +412,7 @@
               `Missing Full names: ${setToString(fullNameSet)}.`);
   assert_equals(familySet.size, 0,
               `Missing Families: ${setToString(familySet)}.`);
+  assert_equals(styleSet.size, 0, `Missing Styles: ${setToString(styleSet)}.`);
 }
 
 function assert_postscript_name_exists(
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/204-no-content.asis b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/204-no-content.asis
new file mode 100644
index 0000000..58e46ab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/204-no-content.asis
@@ -0,0 +1 @@
+HTTP/1.1 204 No Content
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/executor.html b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/executor.html
new file mode 100644
index 0000000..89bd268
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/resources/executor.html
@@ -0,0 +1,5 @@
+<script>
+  // Execute arbitrary code from somewhere else, via postMessage.
+  window.addEventListener("message", event => eval(event.data));
+  window.opener.postMessage("ready", "*");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/window-open-blank-from-different-initiator.html b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/window-open-blank-from-different-initiator.html
new file mode 100644
index 0000000..aa269fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/window-open-blank-from-different-initiator.html
@@ -0,0 +1,91 @@
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/common/utils.js"></script>
+<script>
+
+// This is a regression test for https://crbug.com/1170038.
+//
+// A document creates a popup and makes it navigate elsewhere. The navigation
+// will never commit. The popup has not completed any real load outside of the
+// initial empty document. Then from a different window with a different CSP
+// policy, make it navigate to about:blank.
+//
+// Web browser behavior might change depending on whether a pending navigation
+// exists for in the popup or not. Both are tested here.
+
+const same_origin = get_host_info().HTTP_ORIGIN;
+
+// Return a promise, resolving when |element| triggers |event_name| event.
+const future = (element, event_name) => {
+  return new Promise(resolve => element.addEventListener(event_name, resolve));
+};
+
+// `createNewPopup` is a function returning a new window that has not committed
+// any real load in its frame, outside of the initial empty document. The two
+// tests below vary depending on whether there is a pending navigation in the
+// frame or not.
+const runTest = (description, createNewPopup) => {
+  promise_test(async test => {
+    // Open a same-origin window with a different CSP.
+    const executor_path =
+      "/html/browsers/sandboxing/resources/executor.html?pipe=";
+    const csp = "|header(Content-Security-Policy, " +
+                "sandbox" +
+                " allow-scripts" +
+                " allow-popups" +
+                " allow-same-origin" +
+                " allow-popups-to-escape-sandbox";
+    const executor = window.open(same_origin + executor_path + csp);
+    const executor_reply = await future(window, "message");
+    assert_equals(executor_reply.data, "ready");
+
+    const popup_name = token();
+    const popup = await createNewPopup(test, popup_name);
+
+    // Request the first real load from a DIFFERENT window with different CSPs.
+    const first_real_load = future(popup, "load");
+    executor.postMessage(`window.open("about:blank", "${popup_name}");`);
+    await first_real_load;
+
+    // The new blank document in the popup must inherit CSPs from |executor|:
+    let is_sandboxed = future(window, "message");
+    popup.document.write(`
+      <script>
+        try {
+          document.domain = document.domain;
+          opener.opener.postMessage("not sandboxed", "*");
+        } catch (error) {
+          opener.opener.postMessage("sandboxed", "*");
+        }
+      </scr`+`ipt>
+    `);
+    assert_equals((await is_sandboxed).data, "sandboxed");
+  }, description);
+}
+
+// Open a new window and start loading from an unresponsive server. The frame
+// will be left with the initial empty document and a pending navigation.
+runTest("One pending navigation", async (test, popup_name) => {
+  const unresponsive_path =
+    "/fetch/api/resources/infinite-slow-response.py";
+  return window.open(same_origin + unresponsive_path, popup_name);
+});
+
+// Open a new window and start loading. The response is a 204 and the navigation
+// is canceled. As a result, the frame will be left with the initial empty
+// document and NO pending navigation.
+runTest("No pending navigation", async (test, popup_name) => {
+  const no_content_path =
+    "/html/browsers/sandboxing/resources/204-no-content.asis";
+  const popup = window.open(same_origin + no_content_path, popup_name);
+
+  // Unfortunately, there are no web API to detect a navigation has been
+  // canceled. Waiting using setTimeout is the only possible way to wait for it.
+  await new Promise(r => test.step_timeout(r, 1000));
+
+  return popup;
+});
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001.html b/third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001.html
index f90c345..c0bf8a5 100644
--- a/third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001.html
+++ b/third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001.html
@@ -12,11 +12,6 @@
   assert_own_property(window,'DragEvent');
 }, 'window.DragEvent should be exposed' );
 test(function() {
-  assert_throws_dom('NOT_SUPPORTED_ERR', function() {
-    var evt = document.createEvent('DragEvent');
-  });
-}, 'createEvent should not be able to create a DragEvent' );
-test(function() {
   var evt = new DragEvent('dragstart');
   assert_false( !!evt.initDragEvent, 'initDragEvent' );
   assert_true( !!evt.initMouseEvent, 'initMouseEvent' );
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host-expected.txt
new file mode 100644
index 0000000..3eea1c3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+PASS :focus must not match a shadow host with open mode shadow root that does not contain the focused element
+FAIL :focus must match a shadow host with open mode shadow root that contains the focused element assert_true: expected true got false
+PASS :focus must not match a shadow host with open mode shadow root contains the focused element assigned to a slot
+PASS :focus must not match a shadow host with closed mode shadow root that does not contain the focused element
+FAIL :focus must match a shadow host with closed mode shadow root that contains the focused element assert_true: expected true got false
+PASS :focus must not match a shadow host with closed mode shadow root contains the focused element assigned to a slot
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host.html b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host.html
new file mode 100644
index 0000000..245e338
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-matches-on-shadow-host.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content=":focus should match a shadow host which contains the focused element">
+<link rel="help" href="https://html.spec.whatwg.org/#element-has-the-focus">
+<link rel="help=" href="https://bugs.webkit.org/show_bug.cgi?id=202432">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<input id="defaultFocus" autofocus>
+<div id="log"></div>
+<div id="container"></div>
+<script>
+
+let focusedDefault = false;
+function didFocusDefault() { }
+function checkFocusMatch() {
+    focusedDefault = true;
+    didFocusDefault();
+}
+defaultFocus.addEventListener('focus', checkFocusMatch);
+
+function prepare(test)
+{
+    test.add_cleanup(() => {
+        defaultFocus.focus();
+        container.textContent = '';
+    });
+    return new Promise((resolve) => {
+        if (focusedDefault)
+            resolve();
+        else
+            didFocusDefault = resolve;
+    });
+}
+
+function testInMode(mode) {
+    promise_test(async function () {
+        await prepare(this);
+        const host = document.createElement('div');
+        container.appendChild(host);
+        const shadowRoot = host.attachShadow({mode});
+        shadowRoot.innerHTML = '<input>';
+        assert_equals(document.activeElement, defaultFocus);
+        assert_equals(shadowRoot.activeElement, null);
+        assert_false(host.matches(':focus'));
+    }, `:focus must not match a shadow host with ${mode} mode shadow root that does not contain the focused element`);
+
+    promise_test(async function () {
+        await prepare(this);
+        const host = document.createElement('div');
+        document.body.appendChild(host);
+        const shadowRoot = host.attachShadow({mode});
+        shadowRoot.innerHTML = '<input>';
+        shadowRoot.firstChild.focus();
+        assert_equals(document.activeElement, host);
+        assert_equals(shadowRoot.activeElement, shadowRoot.firstChild);
+        assert_true(host.matches(':focus'));
+    }, `:focus must match a shadow host with ${mode} mode shadow root that contains the focused element`);
+
+    promise_test(async function () {
+        await prepare(this);
+        const host = document.createElement('div');
+        container.appendChild(host);
+        const shadowRoot = host.attachShadow({mode});
+        shadowRoot.innerHTML = '<slot>';
+        host.innerHTML = '<input>';
+        host.firstChild.focus();
+        assert_equals(document.activeElement, host.firstChild);
+        assert_equals(shadowRoot.activeElement, null);
+        assert_false(host.matches(':focus'));
+    }, `:focus must not match a shadow host with ${mode} mode shadow root contains the focused element assigned to a slot`);
+
+}
+
+testInMode('open');
+testInMode('closed');
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-1.html b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-1.html
new file mode 100644
index 0000000..ba900d6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-1.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content=":focus should match a shadow host which contains the focused element">
+<link rel="help" href="https://html.spec.whatwg.org/#element-has-the-focus">
+<link rel="help=" href="https://bugs.webkit.org/show_bug.cgi?id=202432">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
+</head>
+<body>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="host"></div>
+<style>
+#host { background: red; width: 100px; height: 100px; }
+#host:focus { background: green; }
+</style>
+<script>
+
+const shadowRoot = host.attachShadow({mode: 'closed'});
+shadowRoot.innerHTML = '<div tabindex="0" style="outline: none;"></div>';
+shadowRoot.firstChild.focus();
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-2.html b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-2.html
new file mode 100644
index 0000000..a605aca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-2.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content=":focus should match a shadow host which contains the focused element">
+<link rel="help" href="https://html.spec.whatwg.org/#element-has-the-focus">
+<link rel="help=" href="https://bugs.webkit.org/show_bug.cgi?id=202432">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
+</head>
+<body>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="host"><span>FAIL</span></div>
+<style>
+#host { background: green; width: 100px; height: 100px; }
+#host span { background: red; }
+#host:focus span { background: green; color: green; }
+</style>
+<script>
+
+const shadowRoot = host.attachShadow({mode: 'closed'});
+shadowRoot.innerHTML = '<div tabindex="0" style="outline: none;"><slot></slot></div>';
+shadowRoot.firstChild.focus();
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-3.html b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-3.html
new file mode 100644
index 0000000..e72d1b39
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/focus/focus-pseudo-on-shadow-host-3.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content=":focus should not match a shadow host if the focused element is a slotted content">
+<link rel="help" href="https://html.spec.whatwg.org/#element-has-the-focus">
+<link rel="help=" href="https://bugs.webkit.org/show_bug.cgi?id=202432">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
+</head>
+<body>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="host"><div id="target" tabindex="0"></div></div>
+<style>
+#host { background: green; width: 100px; height: 100px; }
+#host:focus #target { background: red; width: 100px; height: 100px; }
+#target { outline: none; }
+</style>
+<script>
+
+const shadowRoot = host.attachShadow({mode: 'closed'});
+shadowRoot.innerHTML = '<slot></slot>';
+target.focus();
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-creation-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-creation-issue-expected.txt
index c9bcbe4..7c4dd89b 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-creation-issue-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-creation-issue-expected.txt
@@ -8,7 +8,8 @@
                 isWarning : true
                 sourceCodeLocation : {
                     columnNumber : 9
-                    lineNumber : 1
+                    lineNumber : 0
+                    scriptId : <string>
                     url : 
                 }
                 type : CreationIssue
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-postMessage-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-postMessage-issue-expected.txt
index 2549b7d1..63e16f6 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-postMessage-issue-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/sab-postMessage-issue-expected.txt
@@ -8,7 +8,8 @@
                 isWarning : true
                 sourceCodeLocation : {
                     columnNumber : 13
-                    lineNumber : 1
+                    lineNumber : 0
+                    scriptId : <string>
                     url : 
                 }
                 type : CreationIssue
@@ -24,7 +25,8 @@
                 isWarning : true
                 sourceCodeLocation : {
                     columnNumber : 1
-                    lineNumber : 1
+                    lineNumber : 0
+                    scriptId : <string>
                     url : 
                 }
                 type : TransferIssue
diff --git a/third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/editing/dnd/synthetic/001-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/editing/dnd/synthetic/001-expected.txt
rename to third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/editing/dnd/synthetic/001-expected.txt
diff --git a/third_party/blink/web_tests/resources/testdriver-vendor.js b/third_party/blink/web_tests/resources/testdriver-vendor.js
index 091618b..a3bebdd2 100644
--- a/third_party/blink/web_tests/resources/testdriver-vendor.js
+++ b/third_party/blink/web_tests/resources/testdriver-vendor.js
@@ -222,7 +222,9 @@
           }
         }
 
-        if (actions[i].actions[j].type == "pointerDown" || actions[i].actions[j].type == "pointerMove") {
+        if (actions[i].actions[j].type == "pointerDown" ||
+            actions[i].actions[j].type == "pointerMove" ||
+            actions[i].actions[j].type == "scroll") {
           actions[i].actions[j].x = last_x_position;
           actions[i].actions[j].y = last_y_position;
         }
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index ec3ed59a..1de72dc 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-10-4-131-gc7cc947c0
-Revision: c7cc947c0f3225a5b01e14456c65a8e3162dfd4c
+Version: VER-2-10-4-133-g601c5a611
+Revision: 601c5a611e4ce90bfdb1b113759d903baf88698e
 CPEPrefix: cpe:/a:freetype:freetype:2.10.4
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index 54f1e97..b1dbe7b 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -174,6 +174,19 @@
   configs += [ "//build/config/compiler:no_chromium_code" ]
 }
 
+source_set("platform_base_cancellation_flag") {
+  public_configs = [ ":nearby_include_config" ]
+  sources = [ "src/cpp/platform/base/cancellation_flag.cc" ]
+  public = [ "src/cpp/platform/base/cancellation_flag.h" ]
+  public_deps = [
+    ":platform_base",
+    ":platform_base_util",
+    "//third_party/abseil-cpp:absl",
+  ]
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [ "//build/config/compiler:no_chromium_code" ]
+}
+
 # src/cpp/platform/public
 
 source_set("platform_public_types") {
@@ -204,6 +217,7 @@
     ":platform_api_platform",
     ":platform_api_types",
     ":platform_base",
+    ":platform_base_cancellation_flag",
     ":platform_base_logging",
     ":platform_base_util",
     ":platform_public_logging",
@@ -370,6 +384,7 @@
     ":core_types",
     ":offline_wire_formats_proto",
     ":platform_base",
+    ":platform_base_cancellation_flag",
     ":platform_base_util",
     ":platform_public_comm",
     ":platform_public_logging",
@@ -429,6 +444,7 @@
     ":core_internal_mediums_webrtc",
     ":core_types",
     ":platform_base",
+    ":platform_base_cancellation_flag",
     ":platform_base_util",
     ":platform_public_comm",
     ":platform_public_logging",
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index a07a9c9..f7b4ff5 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby-connections
-Version: 437f5f6f8dee3ec4ec886939b87ab4ab9ccbe3d0
+Version: 544c161e542a4d9eb0f11e91dde2ff3d1773572b
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index 5a0d889e..91e764e 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -159,6 +159,10 @@
     "META": {"sizes": {"includes": [200]}},
     "includes": [1680],
   },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/ntp4/apps_resources.grd": {
+    "META": {"sizes": {"includes": [40]}},
+    "includes": [1705],
+  },
   "chrome/browser/resources/preinstalled_web_apps/resources.grd": {
     "includes": [1710],
   },
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 0a79330..0f155a7e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -43271,6 +43271,7 @@
   <int value="-1480926949" label="MaterialDesignBookmarks:enabled"/>
   <int value="-1480866718" label="ash-disable-login-dim-and-blur"/>
   <int value="-1480606359" label="AssistantIntentPageUrl:enabled"/>
+  <int value="-1478929417" label="MojoLinuxChannelSharedMem:enabled"/>
   <int value="-1478876902" label="disable-permission-action-reporting"/>
   <int value="-1478137998" label="lite-video-default-downlink-bandwidth-kbps"/>
   <int value="-1477686864" label="OmniboxRichAutocompletion:enabled"/>
@@ -43499,6 +43500,7 @@
   <int value="-1302859198" label="enable-stylus-virtual-keyboard:disabled"/>
   <int value="-1301804101"
       label="AutofillEnableInfoBarAccountIndicationFooterForSingleAccountUsers:disabled"/>
+  <int value="-1301167148" label="WebViewZeroCopyVideo:disabled"/>
   <int value="-1297079591" label="EnableRemovingAllThirdPartyCookies:disabled"/>
   <int value="-1294050129" label="ContentFullscreen:disabled"/>
   <int value="-1293987566" label="OmniboxZeroSuggestionsOnNTPRealbox:disabled"/>
@@ -44365,6 +44367,7 @@
   <int value="-492864618" label="NTPForeignSessionsSuggestions:disabled"/>
   <int value="-491546546" label="MeteredShowToggle:enabled"/>
   <int value="-491131428" label="OmniboxNewAnswerLayout:disabled"/>
+  <int value="-490652941" label="WebViewZeroCopyVideo:enabled"/>
   <int value="-488779992" label="blink-settings"/>
   <int value="-488744544" label="PromoBrowserCommands:disabled"/>
   <int value="-488449930" label="SafetyCheckAndroid:enabled"/>
@@ -45725,6 +45728,7 @@
   <int value="792884862" label="EnableSharedImageForWebview:enabled"/>
   <int value="798696013" label="ImeInputLogicMozc:enabled"/>
   <int value="799680074" label="ContextualSearchTranslationModel:enabled"/>
+  <int value="802463708" label="WebViewSurfaceControl:enabled"/>
   <int value="803282885" label="PreferHtmlOverPlugins:disabled"/>
   <int value="805882800" label="SafetyCheckChromeCleanerChild:disabled"/>
   <int value="806035639" label="EnableNeuralPalmDetectionFilter:disabled"/>
@@ -46732,6 +46736,7 @@
       label="OmniboxUIExperimentVerticalMarginLimitToNonTouchOnly:disabled"/>
   <int value="1760946944" label="MacViewsAutofillPopup:disabled"/>
   <int value="1762320532" label="AutofillKeyboardAccessory:enabled"/>
+  <int value="1764618580" label="MojoLinuxChannelSharedMem:disabled"/>
   <int value="1766676896" label="affiliation-based-matching:disabled"/>
   <int value="1767411597" label="DisallowUnsafeHttpDownloads:enabled"/>
   <int value="1768759000" label="AutofillProfileServerValidation:disabled"/>
@@ -47127,6 +47132,7 @@
   <int value="2121550859" label="PreferHtmlOverPlugins:enabled"/>
   <int value="2121776031" label="auto-virtual-keyboard"/>
   <int value="2122023503" label="enable-win32k-lockdown-mimetypes"/>
+  <int value="2122863344" label="WebViewSurfaceControl:disabled"/>
   <int value="2122876605" label="enable-bleeding-edge-rendering-fast-paths"/>
   <int value="2123183411" label="BlinkHeapIncrementalMarking:enabled"/>
   <int value="2123567684" label="OptimizeLoadingIPCForSmallResources:enabled"/>
@@ -77207,6 +77213,12 @@
   <int value="9" label="Video capture service timeout canceled"/>
 </enum>
 
+<enum name="VideoCaptureStartOutcome">
+  <int value="0" label="kStarted"/>
+  <int value="1" label="kTimedout"/>
+  <int value="2" label="kFailed"/>
+</enum>
+
 <enum name="VideoCaptureWinBackendUsed">
   <int value="0" label="Using DirectShow as default"/>
   <int value="1" label="Using MediaFoundation as default"/>
diff --git a/tools/metrics/histograms/histograms_xml/media/histograms.xml b/tools/metrics/histograms/histograms_xml/media/histograms.xml
index cd2acf0e..da7c58d 100644
--- a/tools/metrics/histograms/histograms_xml/media/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/media/histograms.xml
@@ -4033,6 +4033,26 @@
   </summary>
 </histogram>
 
+<histogram name="Media.VideoCapture.Start" enum="Boolean"
+    expires_after="2022-01-26">
+  <owner>toprice@chromium.org</owner>
+  <owner>guidou@chromium.org</owner>
+  <summary>
+    Counts the start attempts for video capture, to be compared with the
+    StartOutcome enum histogram.
+  </summary>
+</histogram>
+
+<histogram name="Media.VideoCapture.StartOutcome"
+    enum="VideoCaptureStartOutcome" expires_after="2022-01-26">
+  <owner>toprice@chromium.org</owner>
+  <owner>guidou@chromium.org</owner>
+  <summary>
+    Counts the times Starting video capture results in success or failure (due
+    to eg timeouts etc).
+  </summary>
+</histogram>
+
 <histogram name="Media.VideoCapture.Width" units="pixels" expires_after="M99">
   <owner>mcasas@chromium.org</owner>
   <owner>handellm@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml
index 28acc50..43e4ec85 100644
--- a/tools/metrics/histograms/histograms_xml/others/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -6112,6 +6112,32 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Graphics.Smoothness.Diagnostics.DroppedFrameAfterScrollStart.Frames"
+    units="vsyncs" expires_after="2021-09-01">
+  <owner>sadrul@chromium.org</owner>
+  <owner>behdadb@chromium.org</owner>
+  <summary>
+    Diagnostic metric to measure how long after scroll-start a frame is dropped.
+
+    For every frame dropped during a scroll, this metric reports how long after
+    scroll started the frame dropped (in number of vsyncs).
+  </summary>
+</histogram>
+
+<histogram
+    name="Graphics.Smoothness.Diagnostics.DroppedFrameAfterScrollStart.Time"
+    units="ms" expires_after="2021-09-01">
+  <owner>sadrul@chromium.org</owner>
+  <owner>behdadb@chromium.org</owner>
+  <summary>
+    Diagnostic metric to measure how long after scroll-start a frame is dropped.
+
+    For every frame dropped during a scroll, this metric reports how long after
+    scroll started the frame dropped (in milliseconds).
+  </summary>
+</histogram>
+
 <histogram name="Graphics.Smoothness.FrameSequenceLength" units="count"
     expires_after="2021-06-13">
   <owner>sadrul@chromium.org</owner>
@@ -12604,6 +12630,17 @@
   <summary>Number of unread entries in reading list.</summary>
 </histogram>
 
+<histogram name="ReadingList.WebUI.InitialEntriesRenderTime" units="ms"
+    expires_after="M92">
+  <owner>corising@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records the time taken to load the Read Later WebUI and render (at least)
+    the initial list of entries. This is roughly equivalent to 'time to first
+    meaningful paint' for the Read Later UI.
+  </summary>
+</histogram>
+
 <histogram name="ReadingList.WebUI.LoadCompletedTime" units="ms"
     expires_after="M92">
   <owner>corising@chromium.org</owner>
@@ -12625,6 +12662,18 @@
   </summary>
 </histogram>
 
+<histogram name="ReadingList.WebUI.ReadingListDataReceived" units="ms"
+    expires_after="M92">
+  <owner>corising@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    The time taken for the WebUI in the renderer to receive the full list of
+    entries for the current user profile. This is measured as the time from when
+    the data was first requested by the WebUI to when the data was received by
+    the WebUI.
+  </summary>
+</histogram>
+
 <histogram name="ReadingList.WindowDisplayedDuration" units="ms"
     expires_after="M92">
   <owner>corising@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/password/histograms.xml b/tools/metrics/histograms/histograms_xml/password/histograms.xml
index 58f6254..0c2518da 100644
--- a/tools/metrics/histograms/histograms_xml/password/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/password/histograms.xml
@@ -1033,9 +1033,9 @@
 </histogram>
 
 <histogram name="PasswordManager.EditsInSaveBubble"
-    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2021-01-30">
-  <owner>battre@chromium.org</owner>
+    enum="PasswordManagerEditsInSaveBubbleEnum" expires_after="2021-06-30">
   <owner>vasilii@chromium.org</owner>
+  <owner>jdoerrie@chromium.org</owner>
   <summary>
     Indication whether users change the credentials (username and password) in
     the save bubble of the password manager, considering only cases where the
diff --git a/tools/metrics/histograms/histograms_xml/permissions/histograms.xml b/tools/metrics/histograms/histograms_xml/permissions/histograms.xml
index d9a46b6..1dcaaa2 100644
--- a/tools/metrics/histograms/histograms_xml/permissions/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/permissions/histograms.xml
@@ -152,8 +152,26 @@
   </summary>
 </histogram>
 
+<histogram name="Permissions.CrowdDeny.PreloadData.DelayedPushNotification"
+    units="ms" expires_after="2021-06-06">
+  <owner>elklm@chromium.org</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Record, for each incoming push notification, a delay caused by loading Crowd
+    Deny component during abusive an origin verification. It's recorded only for
+    non-abusive origins and only if the Crowd Deny request was made while the
+    preload data is in the process of being loaded. Timing starts at requesting
+    CrowdDenyPreloadData::GetReputationDataForSiteAsync, and timing ends after
+    Crowd Deny returns result to
+    AbusiveOriginPermissionRevocationRequest::OnSiteReputationReady.
+  </summary>
+</histogram>
+
 <histogram name="Permissions.CrowdDeny.PreloadData.IsLoadedAtAbuseCheckTime"
     enum="Boolean" expires_after="2021-06-06">
+  <obsolete>
+    Removed in January 2021.
+  </obsolete>
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/profile/histograms.xml b/tools/metrics/histograms/histograms_xml/profile/histograms.xml
index e3f9387..0a02e674 100644
--- a/tools/metrics/histograms/histograms_xml/profile/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/profile/histograms.xml
@@ -461,7 +461,7 @@
 </histogram>
 
 <histogram name="Profile.PercentageOfManagedProfiles" units="units"
-    expires_after="2021-01-24">
+    expires_after="2022-01-24">
   <owner>agawronska@chromium.org</owner>
   <owner>michaelpg@chromium.org</owner>
   <owner>cros-families@google.com</owner>
diff --git a/tools/metrics/histograms/histograms_xml/stability/histograms.xml b/tools/metrics/histograms/histograms_xml/stability/histograms.xml
index 12b4e9ce..2b459c37 100644
--- a/tools/metrics/histograms/histograms_xml/stability/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/stability/histograms.xml
@@ -239,6 +239,20 @@
   </summary>
 </histogram>
 
+<histogram name="Stability.Counts2" enum="StabilityEventType"
+    expires_after="never">
+<!--
+  expires-never: Critical stability metrics. go/chrome-browser-guardian-metrics
+  -->
+
+  <owner>rkaplow@chromium.org</owner>
+  <owner>chrome-metrics-team@google.com</owner>
+  <summary>
+    Collects various counters related to stability. The majority of them are
+    crash types.
+  </summary>
+</histogram>
+
 <histogram name="Stability.ExitFunnel" units="ms" expires_after="M85">
   <obsolete>
     Removed 10/2020 although this has been dead for many years.
@@ -252,6 +266,9 @@
 
 <histogram name="Stability.Experimental.Counts" enum="StabilityEventType"
     expires_after="2021-01-15">
+  <obsolete>
+    Removed 01/2021, replaced with Stability.Counts2.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <owner>chrome-metrics-team@google.com</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 11015ce..283653a 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "mac": {
             "hash": "00cb959b2ba9ee787a9088e969bc7f7786ddf050",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/d7ace570d9f4fafcf08bbe07587bbf40698269cb/trace_processor_shell"
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/17fea3e29e06aa364b040a696c78251fc44bc2cd/trace_processor_shell"
         },
         "linux": {
             "hash": "8e4c7dab0fef6554d44caed2a12f248503d6b57b",
diff --git a/ui/accessibility/ax_node_position.cc b/ui/accessibility/ax_node_position.cc
index bdefd82..885b0e82 100644
--- a/ui/accessibility/ax_node_position.cc
+++ b/ui/accessibility/ax_node_position.cc
@@ -189,7 +189,7 @@
   // don't expose that character to assistive software that tries to retrieve
   // the node's inner text.
   if (IsEmptyObjectReplacedByCharacter())
-    return base::string16(1, kEmbeddedCharacter);
+    return AXNode::kEmbeddedCharacter;
 
   const AXNode* anchor = GetAnchor();
   DCHECK(anchor);
diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc
index ed13fa9..7246aed 100644
--- a/ui/accessibility/ax_node_position_unittest.cc
+++ b/ui/accessibility/ax_node_position_unittest.cc
@@ -9334,14 +9334,12 @@
 
 TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
   g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter;
-  const base::string16 embedded_character_str(
-      1, AXNodePosition::kEmbeddedCharacter);
 
   // ++1 kRootWebArea
   // ++++2 kStaticText
   // ++++++3 kInlineTextBox
   // ++++4 kTextField
-  // ++++++5 kGenericContainer
+  // ++++++5 kGenericContainer ignored
   // ++++6 kStaticText
   // ++++++7 kInlineTextBox
   // ++++8 kHeading
@@ -9406,9 +9404,11 @@
                                    std::vector<int32_t>{6});
 
   text_field_4.role = ax::mojom::Role::kTextField;
+  text_field_4.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
   text_field_4.child_ids = {generic_container_5.id};
 
   generic_container_5.role = ax::mojom::Role::kGenericContainer;
+  generic_container_5.AddState(ax::mojom::State::kIgnored);
 
   static_text_6.role = ax::mojom::Role::kStaticText;
   static_text_6.SetName(" world");
@@ -9467,10 +9467,10 @@
   TestPositionType result_position =
       position->CreateNextWordStartPosition(AXBoundaryBehavior::CrossBoundary);
   EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+  EXPECT_EQ(text_field_4.id, result_position->anchor_id());
   EXPECT_EQ(0, result_position->text_offset());
   EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(embedded_character_str, result_position->GetText());
+  EXPECT_EQ(AXNode::kEmbeddedCharacter, result_position->GetText());
 
   position = std::move(result_position);
   result_position =
@@ -9486,10 +9486,10 @@
   result_position = position->CreatePreviousWordStartPosition(
       AXBoundaryBehavior::CrossBoundary);
   EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+  EXPECT_EQ(text_field_4.id, result_position->anchor_id());
   EXPECT_EQ(0, result_position->text_offset());
   EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(embedded_character_str, result_position->GetText());
+  EXPECT_EQ(AXNode::kEmbeddedCharacter, result_position->GetText());
 
   position = std::move(result_position);
   result_position = position->CreatePreviousWordStartPosition(
@@ -9514,10 +9514,10 @@
   result_position =
       position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary);
   EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+  EXPECT_EQ(text_field_4.id, result_position->anchor_id());
   EXPECT_EQ(1, result_position->text_offset());
   EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(embedded_character_str, result_position->GetText());
+  EXPECT_EQ(AXNode::kEmbeddedCharacter, result_position->GetText());
 
   position = std::move(result_position);
   result_position =
@@ -9533,10 +9533,10 @@
   result_position = position->CreatePreviousWordEndPosition(
       AXBoundaryBehavior::CrossBoundary);
   EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+  EXPECT_EQ(text_field_4.id, result_position->anchor_id());
   EXPECT_EQ(1, result_position->text_offset());
   EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(embedded_character_str, result_position->GetText());
+  EXPECT_EQ(AXNode::kEmbeddedCharacter, result_position->GetText());
 
   position = std::move(result_position);
   result_position = position->CreatePreviousWordEndPosition(
@@ -9547,62 +9547,48 @@
   EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
   EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
 
-  // GetText() with embedded object replacement character test.
+  // Positions on descendants of nodes that we classify as empty for the
+  // purposes of text navigation, are invalid.
   position = AXNodePosition::CreateTextPosition(
       GetTreeID(), generic_container_5.id, 0 /* text_offset */,
       ax::mojom::TextAffinity::kDownstream);
+  EXPECT_TRUE(position->IsNullPosition());
+  EXPECT_TRUE(position->GetText().empty());
 
-  EXPECT_EQ(embedded_character_str, position->GetText());
-
-  // GetText() on a node that is the parent of a set of text nodes and a
-  // non-text node, the latter represented by an embedded object replacement
-  // character.
+  // `AXPosition::GetText()` on a node that is the parent of a set of text nodes
+  // and a non-text node, the latter represented by an embedded object
+  // replacement character.
   position = AXNodePosition::CreateTextPosition(
       GetTreeID(), root_1.id, 0 /* text_offset */,
       ax::mojom::TextAffinity::kDownstream);
 
   base::string16 expected_text =
-      base::WideToUTF16(L"Hello ") + AXNodePosition::kEmbeddedCharacter +
-      base::WideToUTF16(L" world") + AXNodePosition::kEmbeddedCharacter +
-      AXNodePosition::kEmbeddedCharacter + base::WideToUTF16(L"hey") +
-      AXNodePosition::kEmbeddedCharacter + AXNodePosition::kEmbeddedCharacter;
+      base::WideToUTF16(L"Hello ") + AXNode::kEmbeddedCharacter +
+      base::WideToUTF16(L" world") + AXNode::kEmbeddedCharacter +
+      AXNode::kEmbeddedCharacter + base::WideToUTF16(L"hey") +
+      AXNode::kEmbeddedCharacter + AXNode::kEmbeddedCharacter;
   EXPECT_EQ(expected_text, position->GetText());
 
-  // MaxTextOffset() on a non-text node. This is represented by an embedded
-  // object replacement character.
+  // A position on an empty object that has been replaced by an "object
+  // replacement character".
   position = AXNodePosition::CreateTextPosition(
-      GetTreeID(), generic_container_5.id, 0 /* text_offset */,
+      GetTreeID(), text_field_4.id, 0 /* text_offset */,
       ax::mojom::TextAffinity::kDownstream);
-  EXPECT_EQ(1, position->MaxTextOffset());
-
-  // Parent positions created from a position inside a node represented by an
-  // embedded object replacement character.
-  position = position->CreateParentPosition();
-  EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
-  EXPECT_EQ(6, result_position->text_offset());
-  EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
-  EXPECT_EQ(1, position->MaxTextOffset());
+  EXPECT_EQ(1, position->MaxTextOffset()) << *position;
 
   position = position->CreateParentPosition();
-  EXPECT_TRUE(result_position->IsTextPosition());
-  EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
-  EXPECT_EQ(6, result_position->text_offset());
-  EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
-  EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
-  EXPECT_EQ(22, position->MaxTextOffset());
+  EXPECT_EQ(22, position->MaxTextOffset()) << *position;
 
-  // MaxTextOffset() on a node which is the parent of a set of text nodes and an
-  // a non-text node, the latter represented by an embedded object replacement
-  // character.
+  // `AXPosition::MaxTextOffset()` on a node which is the parent of a set of
+  // text nodes and non-text nodes, the latter represented by "embedded object
+  // replacement characters".
   position = AXNodePosition::CreateTextPosition(
       GetTreeID(), root_1.id, 0 /* text_offset */,
       ax::mojom::TextAffinity::kDownstream);
-  EXPECT_EQ(22, position->MaxTextOffset());
+  EXPECT_EQ(22, position->MaxTextOffset()) << *position;
 
   // The following is to test a specific edge case with heading navigation,
-  // occurring in AXPosition::CreatePreviousFormatStartPosition.
+  // occurring in `AXPosition::CreatePreviousFormatStartPosition`.
   //
   // When the position is at the beginning of an unignored empty object,
   // preceded by an ignored empty object, which is itself preceded by a heading
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h
index 6b0c316..addd117 100644
--- a/ui/accessibility/ax_position.h
+++ b/ui/accessibility/ax_position.h
@@ -93,16 +93,20 @@
   kRightFirst
 };
 
-// Some platforms require empty objects to be represented by a replacement
-// character in order for text navigation to work correctly. This enum controls
-// whether a replacement character will be exposed for such objects.
+// Some platforms require most objects, including empty objects, to be
+// represented by an "embedded object character" in order for text navigation to
+// work correctly. This enum controls whether a replacement character will be
+// exposed for such objects.
 //
-// When an embedded object is replaced by a real character, the expectations
-// are the same with this character as with other ordinary characters.
+// When an embedded object is replaced by this special character, the
+// expectations are the same with this character as with other ordinary
+// characters.
+//
 // For example, with UIA on Windows, we need to be able to navigate inside and
 // outside of this character as if it was an ordinary character, using the
-// AXPlatformNodeTextRangeProvider methods. Since an embedded object character
-// is the only character in a node, we also treat this character as a word.
+// `AXPlatformNodeTextRangeProvider` methods. Since an "embedded object
+// character" is the only character in a node, we also treat this character as a
+// word.
 enum class AXEmbeddedObjectBehavior {
   kExposeCharacter,
   kSuppressCharacter,
@@ -111,6 +115,14 @@
 // Controls whether embedded objects are represented by a replacement
 // character. This is initialized to a per-platform default but can be
 // overridden for testing.
+//
+// On some platforms, most objects are represented in the text of their parents
+// with a special "embedded object character" and not with their actual text
+// contents. Also on the same platforms, if a node has only ignored descendants,
+// i.e., it appears to be empty to assistive software, we need to treat it as a
+// character and a word boundary. For example, an empty text field should act as
+// a character and a word boundary when a screen reader user tries to navigate
+// through it, otherwise the text field would be missed by the user.
 AX_EXPORT extern AXEmbeddedObjectBehavior g_ax_embedded_object_behavior;
 
 // Forward declarations.
@@ -172,13 +184,6 @@
   static const int INVALID_INDEX = -2;
   static const int INVALID_OFFSET = -1;
 
-  // Replacement character used to represent an empty object. See
-  // AXEmbeddedObjectBehavior for more information.
-  //
-  // Duplicate of AXPlatformNodeBase::kEmbeddedCharacter because we don't want
-  // to include platform specific code in here.
-  static constexpr base::char16 kEmbeddedCharacter = L'\xfffc';
-
   static AXPositionInstance CreateNullPosition() {
     AXPositionInstance new_position(new AXPositionType());
     new_position->Initialize(
@@ -356,10 +361,11 @@
 
         // If this position is an "after children" position, consider the
         // position to be ignored if the last child is ignored. This is because
-        // the last child will not be visible in the unignored tree. If the
-        // position is not adjusted, the resulting position would erroneously
-        // point before the second child in the unignored subtree rooted at the
-        // last child.
+        // the last child will not be visible in the unignored tree.
+        //
+        // For example, in the following tree if the position is not adjusted,
+        // the resulting position would erroneously point before the second
+        // child in the unignored subtree rooted at the last child.
         //
         // 1 kRootWebArea
         // ++2 kGenericContainer ignored
@@ -409,7 +415,6 @@
   bool IsLeaf() const {
     if (IsNullPosition())
       return false;
-
     return !AnchorChildCount() || IsEmptyObjectReplacedByCharacter();
   }
 
@@ -1070,12 +1075,23 @@
           return CreateNullPosition();
 
         if (AXNodeType* empty_object_node = GetEmptyObjectAncestorNode()) {
-          // In this class and on certain platforms, we define the empty object
-          // as one that doesn't expose its underlying content. Its content is
-          // replaced by the empty object character (string of length 1). A
-          // position on a descendant of an empty object is invalid. To make it
-          // valid we move the position from the descendant to the empty object
-          // node itself.
+          // In this class, (but only on certain platforms), we define the empty
+          // node as a leaf node (see `AXNode::IsLeaf()`) that doesn't have any
+          // content. So that such nodes will act as a character and a word
+          // boundary, we insert an "embedded object replacement character" in
+          // their text contents. This character is a string of length
+          // `AXNode::kEmbeddedCharacterLength`. For example, an empty text
+          // field should act as a character and a word boundary when a screen
+          // reader user tries to navigate through it, otherwise the text field
+          // would be missed by the user.
+          //
+          // Since we just explained that empty leaf nodes expose the "embedded
+          // object replacement character" in their text contents, and since we
+          // assume that all text is found only on leaf nodes, we should hide
+          // any descendants. Thus, a position on a descendant of an empty
+          // object is defined as invalid. To make it valid we move the position
+          // from the descendant to the empty leaf node itself. Otherwise,
+          // character and word navigation won't work properly.
           return CreateTreePosition(
               position->tree_id(), GetAnchorID(empty_object_node),
               position->child_index() == BEFORE_TEXT ? BEFORE_TEXT : 0);
@@ -1100,14 +1116,15 @@
           // exposed. See comment above in similar implementation for
           // AXPositionKind::TREE_POSITION.
           //
-          // We set the |text_offset_| to either 0 or 1 here because the
-          // MaxTextOffset of an empty object is 1 (the empty object character,
-          // a string of length 1). If the invalid position was already at the
-          // start of the node, we set it to 0.
-          return CreateTextPosition(position->tree_id(),
-                                    GetAnchorID(empty_object_node),
-                                    position->text_offset() > 0 ? 1 : 0,
-                                    ax::mojom::TextAffinity::kDownstream);
+          // We set the |text_offset_| to either 0 or the length of the embedded
+          // object character here because the MaxTextOffset of an empty object
+          // is `AXNode::kEmbeddedCharacterLength`. If the invalid position was
+          // already at the start of the node, we set it to 0.
+          return CreateTextPosition(
+              position->tree_id(), GetAnchorID(empty_object_node),
+              position->text_offset() > 0 ? AXNode::kEmbeddedCharacterLength
+                                          : 0,
+              ax::mojom::TextAffinity::kDownstream);
         }
 
         if (position->text_offset_ <= 0) {
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm
index 93a3618..3ef8956 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -287,6 +287,10 @@
        NSAccessibilityFocusedUIElementChangedNotification},
       {ax::mojom::Event::kFocusContext,
        NSAccessibilityFocusedUIElementChangedNotification},
+      {ax::mojom::Event::kMenuStart, (id)kAXMenuOpenedNotification},
+      {ax::mojom::Event::kMenuEnd, (id)kAXMenuClosedNotification},
+      {ax::mojom::Event::kMenuPopupStart, (id)kAXMenuOpenedNotification},
+      {ax::mojom::Event::kMenuPopupEnd, (id)kAXMenuClosedNotification},
       {ax::mojom::Event::kTextChanged, NSAccessibilityTitleChangedNotification},
       {ax::mojom::Event::kValueChanged,
        NSAccessibilityValueChangedNotification},
diff --git a/ui/display/win/color_profile_reader.cc b/ui/display/win/color_profile_reader.cc
index f24a830..2a577844 100644
--- a/ui/display/win/color_profile_reader.cc
+++ b/ui/display/win/color_profile_reader.cc
@@ -68,9 +68,11 @@
 
   // Enumerate device profile paths on a background thread.  When this
   // completes it will run another task on a background thread to read
-  // the profiles.
+  // the profiles. This can impact the color of the browser so we want
+  // to set this to a higher priority to complete the task earlier
+  // during startup.
   base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(
           &ColorProfileReader::BuildDeviceToPathMapOnBackgroundThread),
       base::BindOnce(&ColorProfileReader::BuildDeviceToPathMapCompleted,
@@ -100,7 +102,7 @@
   device_to_path_map_ = new_device_to_path_map;
 
   base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(&ColorProfileReader::ReadProfilesOnBackgroundThread,
                      new_device_to_path_map),
       base::BindOnce(&ColorProfileReader::ReadProfilesCompleted,
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc
index facdc5a..d6494eb 100644
--- a/ui/gl/init/gl_factory.cc
+++ b/ui/gl/init/gl_factory.cc
@@ -22,8 +22,6 @@
 
 namespace {
 
-bool g_is_angle_enabled = true;
-
 bool ShouldFallbackToSoftwareGL() {
   const base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
   std::string requested_implementation_name =
@@ -59,7 +57,7 @@
   }
 
   // If the passthrough command decoder is enabled, put ANGLE first if allowed
-  if (g_is_angle_enabled && gl::UsePassthroughCommandDecoder(cmd)) {
+  if (gl::UsePassthroughCommandDecoder(cmd)) {
     auto iter = std::find(allowed_impls.begin(), allowed_impls.end(),
                           kGLImplementationEGLANGLE);
     if (iter != allowed_impls.end()) {
@@ -209,10 +207,5 @@
   return CreateOffscreenGLSurfaceWithFormat(size, GLSurfaceFormat());
 }
 
-void DisableANGLE() {
-  DCHECK_NE(GetGLImplementation(), kGLImplementationEGLANGLE);
-  g_is_angle_enabled = false;
-}
-
 }  // namespace init
 }  // namespace gl
diff --git a/ui/gl/init/gl_factory.h b/ui/gl/init/gl_factory.h
index 43028f7b..f741c89 100644
--- a/ui/gl/init/gl_factory.h
+++ b/ui/gl/init/gl_factory.h
@@ -102,9 +102,6 @@
 GL_INIT_EXPORT void SetDisabledExtensionsPlatform(
     const std::string& disabled_extensions);
 
-// Disable ANGLE and force to use native or other GL implementation.
-GL_INIT_EXPORT void DisableANGLE();
-
 }  // namespace init
 }  // namespace gl
 
diff --git a/ui/message_center/views/message_view_factory.cc b/ui/message_center/views/message_view_factory.cc
index e391549..c073771 100644
--- a/ui/message_center/views/message_view_factory.cc
+++ b/ui/message_center/views/message_view_factory.cc
@@ -79,7 +79,7 @@
 }
 
 // static
-void MessageViewFactory::ClearCustomNotificationViewFactoryForTest(
+void MessageViewFactory::ClearCustomNotificationViewFactory(
     const std::string& custom_view_type) {
   g_custom_view_factories.Get().erase(custom_view_type);
 }
diff --git a/ui/message_center/views/message_view_factory.h b/ui/message_center/views/message_view_factory.h
index 301dc6fa..8081691 100644
--- a/ui/message_center/views/message_view_factory.h
+++ b/ui/message_center/views/message_view_factory.h
@@ -41,7 +41,7 @@
       const CustomMessageViewFactoryFunction& factory_function);
   static bool HasCustomNotificationViewFactory(
       const std::string& custom_view_type);
-  static void ClearCustomNotificationViewFactoryForTest(
+  static void ClearCustomNotificationViewFactory(
       const std::string& custom_view_type);
 };
 
diff --git a/ui/message_center/views/notification_view_md.h b/ui/message_center/views/notification_view_md.h
index f913177..528b642b 100644
--- a/ui/message_center/views/notification_view_md.h
+++ b/ui/message_center/views/notification_view_md.h
@@ -213,6 +213,9 @@
   void OnNotificationInputSubmit(size_t index,
                                  const base::string16& text) override;
 
+ protected:
+  views::View* image_container_view() { return image_container_view_; }
+
  private:
   FRIEND_TEST_ALL_PREFIXES(NotificationViewMDTest, AppNameExtension);
   FRIEND_TEST_ALL_PREFIXES(NotificationViewMDTest, AppNameSystemNotification);
diff --git a/ui/ozone/platform/wayland/host/wayland_event_source.cc b/ui/ozone/platform/wayland/host/wayland_event_source.cc
index 15eb6b6e..ed6b912 100644
--- a/ui/ozone/platform/wayland/host/wayland_event_source.cc
+++ b/ui/ozone/platform/wayland/host/wayland_event_source.cc
@@ -17,6 +17,8 @@
 #include "ui/events/keycodes/dom/dom_key.h"
 #include "ui/events/keycodes/keyboard_code_conversion.h"
 #include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/ozone/layout/keyboard_layout_engine.h"
+#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/pointer_details.h"
 #include "ui/events/types/event_type.h"
 #include "ui/gfx/geometry/point_f.h"
@@ -85,17 +87,6 @@
   return event_watcher_->StopProcessingEvents();
 }
 
-void WaylandEventSource::OnKeyboardCreated(WaylandKeyboard* keyboard) {
-  DCHECK(keyboard);
-  keyboard_ = keyboard;
-}
-
-void WaylandEventSource::OnKeyboardDestroyed(WaylandKeyboard* keyboard) {
-  DCHECK_EQ(keyboard_, keyboard);
-  keyboard_modifiers_ = 0;
-  keyboard_ = nullptr;
-}
-
 void WaylandEventSource::OnKeyboardFocusChanged(WaylandWindow* window,
                                                 bool focused) {
   DCHECK(window);
@@ -109,14 +100,15 @@
 uint32_t WaylandEventSource::OnKeyboardKeyEvent(EventType type,
                                                 DomCode dom_code,
                                                 bool repeat,
-                                                base::TimeTicks timestamp) {
+                                                base::TimeTicks timestamp,
+                                                int device_id) {
   DCHECK(type == ET_KEY_PRESSED || type == ET_KEY_RELEASED);
-  if (!keyboard_)
-    return POST_DISPATCH_NONE;
 
   DomKey dom_key;
   KeyboardCode key_code;
-  if (!keyboard_->Decode(dom_code, keyboard_modifiers_, &dom_key, &key_code)) {
+  auto* layout_engine = KeyboardLayoutEngineManager::GetKeyboardLayoutEngine();
+  if (!layout_engine || !layout_engine->Lookup(dom_code, keyboard_modifiers_,
+                                               &dom_key, &key_code)) {
     LOG(ERROR) << "Failed to decode key event.";
     return POST_DISPATCH_NONE;
   }
@@ -128,7 +120,7 @@
 
   KeyEvent event(type, key_code, dom_code, keyboard_modifiers_, dom_key,
                  timestamp);
-  event.set_source_device_id(keyboard_->device_id());
+  event.set_source_device_id(device_id);
   return DispatchEvent(&event);
 }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_event_source.h b/ui/ozone/platform/wayland/host/wayland_event_source.h
index dfda628..8f4323e 100644
--- a/ui/ozone/platform/wayland/host/wayland_event_source.h
+++ b/ui/ozone/platform/wayland/host/wayland_event_source.h
@@ -81,14 +81,13 @@
 
  protected:
   // WaylandKeyboard::Delegate
-  void OnKeyboardCreated(WaylandKeyboard* keyboard) override;
-  void OnKeyboardDestroyed(WaylandKeyboard* keyboard) override;
   void OnKeyboardFocusChanged(WaylandWindow* window, bool focused) override;
   void OnKeyboardModifiersChanged(int modifiers) override;
   uint32_t OnKeyboardKeyEvent(EventType type,
                               DomCode dom_code,
                               bool repeat,
-                              base::TimeTicks timestamp) override;
+                              base::TimeTicks timestamp,
+                              int device_id) override;
 
   // WaylandPointer::Delegate
   void OnPointerCreated(WaylandPointer* pointer) override;
@@ -147,7 +146,6 @@
   WaylandWindowManager* const window_manager_;
 
   // Input device objects. Owned by WaylandConnection.
-  WaylandKeyboard* keyboard_ = nullptr;
   WaylandPointer* pointer_ = nullptr;
   WaylandTouch* touch_ = nullptr;
 
diff --git a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
index 74dff262..b7e3c6b 100644
--- a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
+++ b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
@@ -25,6 +25,7 @@
 #include "ui/ozone/public/ozone_switches.h"
 
 #if BUILDFLAG(USE_XKBCOMMON)
+#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
 #endif
 
@@ -255,16 +256,24 @@
                                          uint32_t state,
                                          uint32_t modifiers) {
 #if BUILDFLAG(USE_XKBCOMMON)
+  auto* layout_engine = KeyboardLayoutEngineManager::GetKeyboardLayoutEngine();
+  if (!layout_engine)
+    return;
+
   // TODO(crbug.com/1079353): Handle modifiers.
-  DomCode dom_code =
-      connection_->keyboard()->layout_engine()->GetDomCodeByKeysym(keysym);
+  DomCode dom_code = static_cast<XkbKeyboardLayoutEngine*>(layout_engine)
+                         ->GetDomCodeByKeysym(keysym);
   if (dom_code == DomCode::NONE)
     return;
 
+  // Keyboard might not exist.
+  int device_id =
+      connection_->keyboard() ? connection_->keyboard()->device_id() : 0;
+
   EventType type =
       state == WL_KEYBOARD_KEY_STATE_PRESSED ? ET_KEY_PRESSED : ET_KEY_RELEASED;
   key_delegate_->OnKeyboardKeyEvent(type, dom_code, /*repeat=*/false,
-                                    EventTimeForNow());
+                                    EventTimeForNow(), device_id);
 #else
   NOTIMPLEMENTED();
 #endif
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
index 7b1e06e..812bdfc 100644
--- a/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+++ b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -51,9 +51,6 @@
       &WaylandKeyboard::Modifiers, &WaylandKeyboard::RepeatInfo,
   };
 
-  DCHECK(delegate_);
-  delegate_->OnKeyboardCreated(this);
-
   wl_keyboard_add_listener(obj_.get(), &listener, this);
   // TODO(tonikitoo): Default auto-repeat to ON here?
 
@@ -63,7 +60,8 @@
 }
 
 WaylandKeyboard::~WaylandKeyboard() {
-  delegate_->OnKeyboardDestroyed(this);
+  // Reset keyboard modifiers on destruction.
+  delegate_->OnKeyboardModifiersChanged(0);
 }
 
 void WaylandKeyboard::Keymap(void* data,
@@ -194,8 +192,9 @@
 
   // Pass empty DomKey and KeyboardCode here so the delegate can pre-process
   // and decode it when needed.
-  uint32_t result = delegate_->OnKeyboardKeyEvent(
-      down ? ET_KEY_PRESSED : ET_KEY_RELEASED, dom_code, repeat, timestamp);
+  uint32_t result =
+      delegate_->OnKeyboardKeyEvent(down ? ET_KEY_PRESSED : ET_KEY_RELEASED,
+                                    dom_code, repeat, timestamp, device_id);
 
   if (extended_keyboard_v1_) {
     bool handled = result & POST_DISPATCH_STOP_PROPAGATION;
@@ -204,15 +203,6 @@
   }
 }
 
-bool WaylandKeyboard::Decode(DomCode dom_code,
-                             int modifiers,
-                             DomKey* out_dom_key,
-                             KeyboardCode* out_key_code) {
-  DCHECK(out_dom_key);
-  DCHECK(out_key_code);
-  return layout_engine_->Lookup(dom_code, modifiers, out_dom_key, out_key_code);
-}
-
 void WaylandKeyboard::SyncCallback(void* data,
                                    struct wl_callback* cb,
                                    uint32_t time) {
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.h b/ui/ozone/platform/wayland/host/wayland_keyboard.h
index d655dc09..d6f0b0b 100644
--- a/ui/ozone/platform/wayland/host/wayland_keyboard.h
+++ b/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -17,7 +17,6 @@
 
 namespace ui {
 
-class DomKey;
 class KeyboardLayoutEngine;
 class WaylandConnection;
 class WaylandWindow;
@@ -29,14 +28,6 @@
  public:
   class Delegate;
 
-  using LayoutEngine =
-#if BUILDFLAG(USE_XKBCOMMON)
-      XkbKeyboardLayoutEngine
-#else
-      KeyboardLayoutEngine
-#endif
-      ;
-
   WaylandKeyboard(wl_keyboard* keyboard,
                   zcr_keyboard_extension_v1* keyboard_extension_v1,
                   WaylandConnection* connection,
@@ -45,13 +36,16 @@
   virtual ~WaylandKeyboard();
 
   int device_id() const { return obj_.id(); }
-  bool Decode(DomCode dom_code,
-              int modifiers,
-              DomKey* out_dom_key,
-              KeyboardCode* out_key_code);
-  LayoutEngine* layout_engine() const { return layout_engine_; }
 
  private:
+  using LayoutEngine =
+#if BUILDFLAG(USE_XKBCOMMON)
+      XkbKeyboardLayoutEngine
+#else
+      KeyboardLayoutEngine
+#endif
+      ;
+
   // wl_keyboard_listener
   static void Keymap(void* data,
                      wl_keyboard* obj,
@@ -113,8 +107,6 @@
 
 class WaylandKeyboard::Delegate {
  public:
-  virtual void OnKeyboardCreated(WaylandKeyboard* keyboard) = 0;
-  virtual void OnKeyboardDestroyed(WaylandKeyboard* keyboard) = 0;
   virtual void OnKeyboardFocusChanged(WaylandWindow* window, bool focused) = 0;
   virtual void OnKeyboardModifiersChanged(int modifiers) = 0;
   // Returns a mask of ui::PostDispatchAction indicating how the event was
@@ -122,7 +114,8 @@
   virtual uint32_t OnKeyboardKeyEvent(EventType type,
                                       DomCode dom_code,
                                       bool repeat,
-                                      base::TimeTicks timestamp) = 0;
+                                      base::TimeTicks timestamp,
+                                      int device_id) = 0;
 
  protected:
   // Prevent deletion through a WaylandKeyboard::Delegate pointer.
diff --git a/ui/ozone/platform/x11/x11_clipboard_ozone.cc b/ui/ozone/platform/x11/x11_clipboard_ozone.cc
index 5d8d5e3..5944973e 100644
--- a/ui/ozone/platform/x11/x11_clipboard_ozone.cc
+++ b/ui/ozone/platform/x11/x11_clipboard_ozone.cc
@@ -354,6 +354,14 @@
     std::move(callback).Run(selection_state.data);
     return;
   }
+
+  // If we know the available mime types, and it is not this, send empty now.
+  if (!selection_state.mime_types.empty() &&
+      !Contains(selection_state.mime_types, mime_type)) {
+    std::move(callback).Run(PlatformClipboard::Data());
+    return;
+  }
+
   selection_state.data_mime_type = mime_type;
   selection_state.request_data_map = data_map;
   DCHECK(selection_state.request_clipboard_data_callback.is_null());
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html b/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html
index b3fa0b94..629b572 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html
@@ -12,7 +12,7 @@
       <cr-policy-indicator indicator-type="[[getPolicyIndicatorType_(model)]]">
       </cr-policy-indicator>
       <cr-expand-button expanded="{{expanded_}}"
-          alt="[[i18n('certificateManagerExpandA11yLabel')]]">
+          aria-label="[[i18n('certificateManagerExpandA11yLabel')]]">
       </cr-expand-button>
     </div>
     <template is="dom-if" if="[[expanded_]]">
diff --git a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js
index 6a31d91..b85fa392 100644
--- a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js
+++ b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js
@@ -32,9 +32,9 @@
     },
 
     /** A11y text descriptor for this control. */
-    alt: {
+    ariaLabel: {
       type: String,
-      observer: 'onAltChange_',
+      observer: 'onAriaLabelChange_',
     },
 
     tabIndex: {
@@ -66,10 +66,10 @@
   },
 
   /** @private */
-  onAltChange_() {
-    if (this.alt) {
+  onAriaLabelChange_() {
+    if (this.ariaLabel) {
       this.$.icon.removeAttribute('aria-labelledby');
-      this.$.icon.setAttribute('aria-label', this.alt);
+      this.$.icon.setAttribute('aria-label', this.ariaLabel);
     } else {
       this.$.icon.removeAttribute('aria-label');
       this.$.icon.setAttribute('aria-labelledby', 'label');
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index ab8cc7b..c7e7f44 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -16,6 +16,13 @@
       <include name="IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS"
                file="../../../third_party/jstemplate/jstemplate_compiled.js"
                resource_path="js/jstemplate_compiled.js" type="BINDATA"/>
+      <if expr="chromeos">
+        <include name="IDR_WEBUI_CROS_COLORS_CSS"
+                 file="${root_gen_dir}/ui/chromeos/colors/cros_colors.generated.css"
+                 resource_path="chromeos/colors/cros_colors.generated.css"
+                 type="chrome_html"
+                 use_base_dir="false" />
+      </if>
     </includes>
     <structures>
       <structure name="IDR_WEBUI_CSS_MENU_CSS"
@@ -37,13 +44,6 @@
                  file="css/widgets.css" type="chrome_html"
                  flattenhtml="true" />
 
-      <if expr="chromeos">
-        <structure name="IDR_WEBUI_CROS_COLORS_CSS"
-                   file="${root_gen_dir}/ui/chromeos/colors/cros_colors.generated.css"
-                   type="chrome_html"
-                   use_base_dir="false" />
-      </if>
-
       <if expr="not is_android and not is_ios">
         <structure name="IDR_LOTTIE_LOTTIE_WORKER_MIN_JS"
                    file="../../../third_party/lottie/lottie_worker.min.js"
diff --git a/weblayer/README.md b/weblayer/README.md
index 38735188..ca653b1c 100644
--- a/weblayer/README.md
+++ b/weblayer/README.md
@@ -117,7 +117,7 @@
 ```
     $ autoninja -C out/Default monochrome_public_apk
     $ out/Default/bin/monochrome_public_apk install
-    $ testing/scripts/run_android_wpt.py --webdriver-binary=out/Default/clang_x64/chromedriver --product chrome_android --package-name org.chromium.chrome --isolated-script-test-output /tmp/weblayer_out.json --include ./third_party/blink/web_tests/external/wpt/$WPT_TEST
+    $ testing/scripts/run_android_wpt.py --webdriver-binary=out/Default/clang_x64/chromedriver --product chrome_android --chrome-package-name org.chromium.chrome --isolated-script-test-output /tmp/clank_out.json --include ./third_party/blink/web_tests/external/wpt/$WPT_TEST
 ```
 
 Passing in `-vvvv` may be useful if you want to see loads of information about
diff --git a/weblayer/browser/DEPS b/weblayer/browser/DEPS
index 03165f2..67666ef 100644
--- a/weblayer/browser/DEPS
+++ b/weblayer/browser/DEPS
@@ -29,6 +29,7 @@
   "+components/infobars/content",
   "+components/infobars/core",
   "+components/javascript_dialogs",
+  "+components/keep_alive_registry",
   "+components/keyed_service/content",
   "+components/keyed_service/core",
   "+components/language/core/browser",
diff --git a/weblayer/browser/background_sync/background_sync_browsertest.cc b/weblayer/browser/background_sync/background_sync_browsertest.cc
index 3816bdd..a2ea49b 100644
--- a/weblayer/browser/background_sync/background_sync_browsertest.cc
+++ b/weblayer/browser/background_sync/background_sync_browsertest.cc
@@ -23,6 +23,43 @@
 #include "weblayer/test/weblayer_browser_test.h"
 #include "weblayer/test/weblayer_browser_test_utils.h"
 
+#if !defined(OS_ANDROID)
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_state_observer.h"
+
+namespace {
+class TestKeepAliveStateObserver : public KeepAliveStateObserver {
+ public:
+  TestKeepAliveStateObserver() {
+    KeepAliveRegistry::GetInstance()->AddObserver(this);
+  }
+
+  ~TestKeepAliveStateObserver() override {
+    KeepAliveRegistry::GetInstance()->RemoveObserver(this);
+  }
+
+  void OnKeepAliveStateChanged(bool is_keeping_alive) override {
+    if (is_keeping_alive_loop_ && !is_keeping_alive)
+      is_keeping_alive_loop_->Quit();
+  }
+
+  void OnKeepAliveRestartStateChanged(bool can_restart) override {}
+
+  void WaitUntilNoKeepAlives() {
+    if (!KeepAliveRegistry::GetInstance()->IsKeepingAlive())
+      return;
+    is_keeping_alive_loop_ = std::make_unique<base::RunLoop>();
+    is_keeping_alive_loop_->Run();
+    is_keeping_alive_loop_ = nullptr;
+    CHECK(!KeepAliveRegistry::GetInstance()->IsKeepingAlive());
+  }
+
+ private:
+  std::unique_ptr<base::RunLoop> is_keeping_alive_loop_;
+};
+}  // namespace
+#endif  // !defined(OS_ANDROID)
+
 namespace {
 const char kExampleUrl[] = "https://www.example.com/";
 const char kTag[] = "test_tag";
@@ -61,6 +98,13 @@
     return nullptr;
   }
 
+#if !defined(OS_ANDROID)
+  void PostRunTestOnMainThread() override {
+    keep_alive_observer_.WaitUntilNoKeepAlives();
+    WebLayerBrowserTest::PostRunTestOnMainThread();
+  }
+#endif  // !defined(OS_ANDROID)
+
  protected:
   content::WebContents* web_contents() {
     return static_cast<TabImpl*>(shell()->tab())->web_contents();
@@ -68,6 +112,9 @@
 
   std::unique_ptr<base::RunLoop> sync_event_received_;
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
+#if !defined(OS_ANDROID)
+  TestKeepAliveStateObserver keep_alive_observer_;
+#endif  // !defined(OS_ANDROID)
 };
 
 IN_PROC_BROWSER_TEST_F(BackgroundSyncBrowserTest, GetBackgroundSyncController) {
@@ -176,4 +223,4 @@
   EXPECT_TRUE(delegate->IsProfileOffTheRecord());
 }
 
-}  // namespace weblayer
\ No newline at end of file
+}  // namespace weblayer
diff --git a/weblayer/browser/no_state_prefetch/prerender_controller_impl.cc b/weblayer/browser/no_state_prefetch/prerender_controller_impl.cc
index bd63e03c..7c7687b 100644
--- a/weblayer/browser/no_state_prefetch/prerender_controller_impl.cc
+++ b/weblayer/browser/no_state_prefetch/prerender_controller_impl.cc
@@ -5,8 +5,8 @@
 #include "weblayer/browser/no_state_prefetch/prerender_controller_impl.h"
 
 #include "build/build_config.h"
+#include "components/no_state_prefetch/browser/no_state_prefetch_handle.h"
 #include "components/no_state_prefetch/browser/no_state_prefetch_manager.h"
-#include "components/no_state_prefetch/browser/prerender_handle.h"
 #include "content/public/browser/browser_context.h"
 #include "ui/gfx/geometry/rect.h"
 #include "url/gurl.h"
diff --git a/weblayer/browser/webrtc/media_stream_manager.cc b/weblayer/browser/webrtc/media_stream_manager.cc
index a92c955..a025d45a 100644
--- a/weblayer/browser/webrtc/media_stream_manager.cc
+++ b/weblayer/browser/webrtc/media_stream_manager.cc
@@ -77,7 +77,12 @@
 
   bool streaming_video() const { return streaming_video_; }
 
-  void Stop() { std::move(stop_).Run(); }
+  void Stop() {
+    // The `stop_` callback does async processing. This means Stop() may be
+    // called multiple times.
+    if (stop_)
+      std::move(stop_).Run();
+  }
 
  private:
   base::WeakPtr<MediaStreamManager> manager_;
diff --git a/weblayer/test/BUILD.gn b/weblayer/test/BUILD.gn
index f17fa008..57f1c4eb 100644
--- a/weblayer/test/BUILD.gn
+++ b/weblayer/test/BUILD.gn
@@ -260,6 +260,8 @@
       "../browser/persistence/browser_persister_browsertest.cc",
       "../browser/persistence/minimal_browser_persister_browsertest.cc",
     ]
+
+    deps += [ "//components/keep_alive_registry" ]
   }
 }