diff --git a/.gitignore b/.gitignore
index 7bcfd2ff..fa545ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,7 +33,6 @@
 .*.sw?
 .DS_Store
 .cipd
-.clang-coverage
 .classpath
 .code-coverage
 .cproject
diff --git a/BUILD.gn b/BUILD.gn
index 5e2f6b9..4615fe0 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -841,6 +841,7 @@
       "//chrome/credential_provider",
       "//chrome/installer/gcapi",
       "//chrome/installer/mini_installer",
+      "//chrome/updater/win/installer",
       "//cloud_print",
       "//cloud_print/virtual_driver/win/port_monitor:copy_gcp_portmon_binaries",
       "//components/policy:pack_policy_templates",
diff --git a/DEPS b/DEPS
index 1b09616..0385c33 100644
--- a/DEPS
+++ b/DEPS
@@ -162,11 +162,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': '73b8376b302ac3fd61ef4010f2bcc4fc2a48b5bc',
+  'skia_revision': '9e5c47936b171e03978bfe2611e71157d34bc539',
   # 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': '03038a48b48ea52bba10fd8c97b286c7802ee25b',
+  'v8_revision': 'e6d242c02cbb0bf0290a766678c754e941c747d8',
   # 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.
@@ -174,15 +174,15 @@
   # 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': '4f431ad17465c3ffd53262171bde3de7e4f76941',
+  'angle_revision': '58c5b07b47cf30cf970e27d39fc88d08f51a5907',
   # 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': '44e6523d7ff3e77d82b55e09fb2ef169839b9200',
+  'swiftshader_revision': 'cebb9635a5d54578385edb8cf5c4794703dc8f30',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'eb590e0e22e9119779befd7d5d6763b0dac91119',
+  'pdfium_revision': 'b07dda63ef03210de6e439cd3c49e573303e06ff',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -197,7 +197,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling googletest
   # and whatever else without interference from each other.
-  'googletest_revision': '3f05f651ae3621db58468153e32016bc1397800b',
+  'googletest_revision': '3a45039862471cc2785e92bd19bd146c70344986',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lighttpd
   # and whatever else without interference from each other.
@@ -225,7 +225,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': '3c6c057c3feb7069a3240d243611b49e45da9ef8',
+  'catapult_revision': '884c81e1703f23320657fab45aaeca226f64de25',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -293,7 +293,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.
-  'shaderc_revision': '9cb02b61806990ce2667d9721ef8c4d6bbf7cdc2',
+  'shaderc_revision': '4baa46a5d104f7de5aaee77b73b309d786e03288',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -301,7 +301,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.
-  'quiche_revision': '43652ca1735ad8b913dd37de2ae0f5d69789c116',
+  'quiche_revision': 'fa2746c4a1fdda8b938eebe5b6dc6e821a9158ef',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -316,7 +316,7 @@
   # revisions.
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:152c5144ceed9592c20f0c8fd55769646077569b',
+  'gn_version': 'git_revision:ad9e442d92dcd9ee73a557428cfc336b55cbd533',
 
   # Also, if you change these, update buildtools/DEPS too. Also update the
   # libc++ svn_revision in //buildtools/deps_revisions.gni.
@@ -501,7 +501,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'c6a260a763ca01e11144543b5d9a80fa38acab09',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '8e8b719e061c1f3a6c214fea4ab90aad0e980d4e',
       'condition': 'checkout_ios',
   },
 
@@ -867,7 +867,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'efce0d1b7657c440c90f0f4bce614b96672b9e0b',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e5641be5fe309f40aad850d4d1e1ca607768572c',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1135,7 +1135,7 @@
   },
 
   'src/third_party/libvpx/source/libvpx':
-    Var('chromium_git') + '/webm/libvpx.git' + '@' +  '305a5283c5b4a3ff5321dc51d121ef21d071e980',
+    Var('chromium_git') + '/webm/libvpx.git' + '@' +  '5a0242ba5c8fddbf32766bfa2ffbbd25f3cd6167',
 
   'src/third_party/libwebm/source':
     Var('chromium_git') + '/webm/libwebm.git' + '@' + '51ca718c3adf0ddedacd7df25fe45f67dc5a9ce1',
@@ -1246,7 +1246,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a0b94071e6bd0db3c4ab7740235b9103666a005d',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '23d211c88c92518846537e05293ab015b25af940',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1414,7 +1414,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'abaae129d9a0c6e1e092067e0b105475df43352e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2aaf66e4644af9edfacf4fc1a9785194715e4762',
+    Var('webrtc_git') + '/src.git' + '@' + 'c77df78931bca91f3e35343b038ba4ad986b1ab4',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1455,7 +1455,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4273c0b008413f8a960540fe19618448b944e0c5',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b09e9fc89fa7507f180b1bec9e6663458f91120e',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 4bc8ea4..3381ab7 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -753,7 +753,13 @@
   ]
 }
 
-android_library("android_webview_java") {
+java_group("android_webview_java") {
+  deps = [
+    ":browser_java",
+  ]
+}
+
+android_library("browser_java") {
   java_files = [
     "java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
     "java/src/org/chromium/android_webview/AutofillActionModeCallback.java",
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
index 0e4b2e73..6e9ff2b 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
@@ -51,7 +51,6 @@
 import org.chromium.base.test.util.InMemorySharedPreferences;
 import org.chromium.components.safe_browsing.SafeBrowsingApiBridge;
 import org.chromium.components.safe_browsing.SafeBrowsingApiHandler;
-import org.chromium.components.safe_browsing.SafeBrowsingApiHandler.Observer;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.util.Criteria;
@@ -194,6 +193,11 @@
                         callbackId, SafeBrowsingResult.SUCCESS, metadata, CHECK_DELTA_US));
             // clang-format on
         }
+
+        @Override
+        public boolean startAllowlistLookup(final String uri, int[] threatsOfInterest) {
+            return false;
+        }
     }
 
     /**
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 8e8c2c1..4585b56 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -57,6 +57,7 @@
     "public/cpp/multi_user_window_manager_delegate.h",
     "public/cpp/multi_user_window_manager_observer.h",
     "public/cpp/overview_test_api.h",
+    "public/cpp/shelf_config.h",
     "public/cpp/split_view_test_api.h",
     "public/cpp/window_finder.h",
     "public/cpp/window_tree_host_lookup.h",
@@ -64,7 +65,6 @@
     "screenshot_delegate.h",
     "session/session_controller_impl.h",
     "shelf/shelf.h",
-    "shelf/shelf_constants.h",
     "shelf/shelf_widget.h",
     "shell.h",
     "shell_delegate.h",
@@ -587,6 +587,7 @@
     "shelf/shelf_button_delegate.h",
     "shelf/shelf_button_pressed_metric_tracker.cc",
     "shelf/shelf_button_pressed_metric_tracker.h",
+    "shelf/shelf_config.cc",
     "shelf/shelf_container_view.cc",
     "shelf/shelf_container_view.h",
     "shelf/shelf_context_menu_model.cc",
diff --git a/ash/accessibility/accessibility_panel_layout_manager_unittest.cc b/ash/accessibility/accessibility_panel_layout_manager_unittest.cc
index a9ab7b5..d761ff2 100644
--- a/ash/accessibility/accessibility_panel_layout_manager_unittest.cc
+++ b/ash/accessibility/accessibility_panel_layout_manager_unittest.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ui/display/display.h"
@@ -130,7 +130,7 @@
 
   gfx::Rect expected_work_area = screen->GetPrimaryDisplay().bounds();
   expected_work_area.Inset(0, kDefaultPanelHeight, 0,
-                           ShelfConstants::shelf_size());
+                           ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(screen->GetPrimaryDisplay().work_area(), expected_work_area);
 }
 
diff --git a/ash/accessibility/layer_animation_info.cc b/ash/accessibility/layer_animation_info.cc
index c0204e4..09c19042 100644
--- a/ash/accessibility/layer_animation_info.cc
+++ b/ash/accessibility/layer_animation_info.cc
@@ -4,6 +4,8 @@
 
 #include "ash/accessibility/layer_animation_info.h"
 
+#include "base/numerics/ranges.h"
+
 namespace ash {
 
 void ComputeOpacity(LayerAnimationInfo* animation_info,
@@ -33,7 +35,7 @@
   }
 
   // Layer::SetOpacity will throw an error if we're not within 0...1.
-  opacity = std::min(std::max(opacity, 0.0f), 1.0f);
+  opacity = base::ClampToRange(opacity, 0.0f, 1.0f);
 
   animation_info->opacity = opacity;
 }
diff --git a/ash/assistant/assistant_alarm_timer_controller.cc b/ash/assistant/assistant_alarm_timer_controller.cc
index 70ecf43..37263a8 100644
--- a/ash/assistant/assistant_alarm_timer_controller.cc
+++ b/ash/assistant/assistant_alarm_timer_controller.cc
@@ -11,11 +11,14 @@
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_notification_controller.h"
 #include "ash/assistant/util/deep_link_util.h"
+#include "ash/public/mojom/assistant_controller.mojom.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/i18n/message_formatter.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/services/assistant/public/features.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace ash {
@@ -137,7 +140,7 @@
 
 AssistantAlarmTimerController::AssistantAlarmTimerController(
     AssistantController* assistant_controller)
-    : assistant_controller_(assistant_controller), binding_(this) {
+    : assistant_controller_(assistant_controller) {
   AddModelObserver(this);
   assistant_controller_->AddObserver(this);
 }
@@ -147,10 +150,10 @@
   RemoveModelObserver(this);
 }
 
-void AssistantAlarmTimerController::BindRequest(
-    mojom::AssistantAlarmTimerControllerRequest request) {
+void AssistantAlarmTimerController::BindReceiver(
+    mojo::PendingReceiver<mojom::AssistantAlarmTimerController> receiver) {
   DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled());
-  binding_.Bind(std::move(request));
+  receiver_.Bind(std::move(receiver));
 }
 
 void AssistantAlarmTimerController::AddModelObserver(
diff --git a/ash/assistant/assistant_alarm_timer_controller.h b/ash/assistant/assistant_alarm_timer_controller.h
index a0357f4..4ec45dc 100644
--- a/ash/assistant/assistant_alarm_timer_controller.h
+++ b/ash/assistant/assistant_alarm_timer_controller.h
@@ -5,6 +5,9 @@
 #ifndef ASH_ASSISTANT_ASSISTANT_ALARM_TIMER_CONTROLLER_H_
 #define ASH_ASSISTANT_ASSISTANT_ALARM_TIMER_CONTROLLER_H_
 
+#include <map>
+#include <string>
+
 #include "ash/assistant/assistant_controller_observer.h"
 #include "ash/assistant/model/assistant_alarm_timer_model.h"
 #include "ash/assistant/model/assistant_alarm_timer_model_observer.h"
@@ -13,7 +16,8 @@
 #include "base/macros.h"
 #include "base/timer/timer.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 
 namespace ash {
 
@@ -37,7 +41,8 @@
       AssistantController* assistant_controller);
   ~AssistantAlarmTimerController() override;
 
-  void BindRequest(mojom::AssistantAlarmTimerControllerRequest request);
+  void BindReceiver(
+      mojo::PendingReceiver<mojom::AssistantAlarmTimerController> receiver);
 
   // Returns the underlying model.
   const AssistantAlarmTimerModel* model() const { return &model_; }
@@ -84,7 +89,7 @@
 
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
-  mojo::Binding<mojom::AssistantAlarmTimerController> binding_;
+  mojo::Receiver<mojom::AssistantAlarmTimerController> receiver_{this};
 
   AssistantAlarmTimerModel model_;
 
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc
index c81e082..ba4d4b68 100644
--- a/ash/assistant/assistant_controller.cc
+++ b/ash/assistant/assistant_controller.cc
@@ -342,13 +342,13 @@
 
 void AssistantController::BindAlarmTimerController(
     mojo::PendingReceiver<mojom::AssistantAlarmTimerController> receiver) {
-  Shell::Get()->assistant_controller()->alarm_timer_controller()->BindRequest(
+  Shell::Get()->assistant_controller()->alarm_timer_controller()->BindReceiver(
       std::move(receiver));
 }
 
 void AssistantController::BindNotificationController(
     mojo::PendingReceiver<mojom::AssistantNotificationController> receiver) {
-  Shell::Get()->assistant_controller()->notification_controller()->BindRequest(
+  Shell::Get()->assistant_controller()->notification_controller()->BindReceiver(
       std::move(receiver));
 }
 
@@ -357,7 +357,7 @@
   Shell::Get()
       ->assistant_controller()
       ->screen_context_controller()
-      ->BindRequest(std::move(receiver));
+      ->BindReceiver(std::move(receiver));
 }
 
 void AssistantController::BindStateController(
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc
index b3e1012..d426b558 100644
--- a/ash/assistant/assistant_notification_controller.cc
+++ b/ash/assistant/assistant_notification_controller.cc
@@ -12,9 +12,12 @@
 #include "ash/assistant/util/deep_link_util.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
+#include "ash/public/mojom/assistant_controller.mojom.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/strings/utf_string_conversions.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/notification.h"
@@ -79,7 +82,6 @@
 AssistantNotificationController::AssistantNotificationController(
     AssistantController* assistant_controller)
     : assistant_controller_(assistant_controller),
-      binding_(this),
       expiry_monitor_(this),
       notifier_id_(GetNotifierId()) {
   AddModelObserver(this);
@@ -93,9 +95,9 @@
   RemoveModelObserver(this);
 }
 
-void AssistantNotificationController::BindRequest(
-    mojom::AssistantNotificationControllerRequest request) {
-  binding_.Bind(std::move(request));
+void AssistantNotificationController::BindReceiver(
+    mojo::PendingReceiver<mojom::AssistantNotificationController> receiver) {
+  receiver_.Bind(std::move(receiver));
 }
 
 void AssistantNotificationController::AddModelObserver(
diff --git a/ash/assistant/assistant_notification_controller.h b/ash/assistant/assistant_notification_controller.h
index f46b6b6..cbad2ff 100644
--- a/ash/assistant/assistant_notification_controller.h
+++ b/ash/assistant/assistant_notification_controller.h
@@ -16,7 +16,8 @@
 #include "ash/public/mojom/assistant_controller.mojom.h"
 #include "base/macros.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/message_center/message_center_observer.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
 
@@ -43,7 +44,8 @@
       AssistantController* assistant_controller);
   ~AssistantNotificationController() override;
 
-  void BindRequest(mojom::AssistantNotificationControllerRequest request);
+  void BindReceiver(
+      mojo::PendingReceiver<mojom::AssistantNotificationController> receiver);
 
   // Returns the underlying model.
   const AssistantNotificationModel* model() const { return &model_; }
@@ -95,7 +97,7 @@
  private:
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
-  mojo::Binding<mojom::AssistantNotificationController> binding_;
+  mojo::Receiver<mojom::AssistantNotificationController> receiver_{this};
 
   AssistantNotificationModel model_;
   AssistantNotificationExpiryMonitor expiry_monitor_;
diff --git a/ash/assistant/assistant_screen_context_controller.cc b/ash/assistant/assistant_screen_context_controller.cc
index 7785b5a902c..a3df6e01 100644
--- a/ash/assistant/assistant_screen_context_controller.cc
+++ b/ash/assistant/assistant_screen_context_controller.cc
@@ -12,12 +12,15 @@
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_properties.h"
+#include "ash/public/mojom/assistant_controller.mojom.h"
 #include "ash/shell.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "base/bind.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/stl_util.h"
 #include "base/task/post_task.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/gfx/codec/jpeg_codec.h"
@@ -160,7 +163,7 @@
 
 AssistantScreenContextController::AssistantScreenContextController(
     AssistantController* assistant_controller)
-    : assistant_controller_(assistant_controller), binding_(this) {
+    : assistant_controller_(assistant_controller) {
   assistant_controller_->AddObserver(this);
 }
 
@@ -168,9 +171,9 @@
   assistant_controller_->RemoveObserver(this);
 }
 
-void AssistantScreenContextController::BindRequest(
-    mojom::AssistantScreenContextControllerRequest request) {
-  binding_.Bind(std::move(request));
+void AssistantScreenContextController::BindReceiver(
+    mojo::PendingReceiver<mojom::AssistantScreenContextController> receiver) {
+  receiver_.Bind(std::move(receiver));
 }
 
 void AssistantScreenContextController::SetAssistant(
diff --git a/ash/assistant/assistant_screen_context_controller.h b/ash/assistant/assistant_screen_context_controller.h
index 9ef0a07..5b36c21 100644
--- a/ash/assistant/assistant_screen_context_controller.h
+++ b/ash/assistant/assistant_screen_context_controller.h
@@ -14,7 +14,8 @@
 #include "ash/public/mojom/assistant_controller.mojom.h"
 #include "base/macros.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace ui {
@@ -35,7 +36,8 @@
       AssistantController* assistant_controller);
   ~AssistantScreenContextController() override;
 
-  void BindRequest(mojom::AssistantScreenContextControllerRequest request);
+  void BindReceiver(
+      mojo::PendingReceiver<mojom::AssistantScreenContextController> receiver);
 
   // Provides a pointer to the |assistant| owned by AssistantController.
   void SetAssistant(chromeos::assistant::mojom::Assistant* assistant);
@@ -72,7 +74,7 @@
  private:
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
-  mojo::Binding<mojom::AssistantScreenContextController> binding_;
+  mojo::Receiver<mojom::AssistantScreenContextController> receiver_{this};
 
   // Owned by AssistantController.
   chromeos::assistant::mojom::Assistant* assistant_ = nullptr;
diff --git a/ash/components/strings/ash_components_strings_am.xtb b/ash/components/strings/ash_components_strings_am.xtb
index eafb009..105d227 100644
--- a/ash/components/strings/ash_components_strings_am.xtb
+++ b/ash/components/strings/ash_components_strings_am.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="am">
 <translation id="1036550831858290950">የአሁኑን ትርዎን እንደ እልባት ያስቀምጡ</translation>
 <translation id="104962181688258143">የፋይሎች መተግበሪያን ይክፈቱ</translation>
-<translation id="1098295134904615027">በቀኝ በኩል ምናባዊውን ዴስክ አግብር</translation>
 <translation id="1122869341872663659"><ph name="N" /> ፍለጋ ውጤቶችን ለ<ph name="QUERY" /> በማሳየት ላይ</translation>
 <translation id="1195667586424773550">አገናኙን ወደ የትሩ አድራሻ አሞሌ ይጎትቱት</translation>
 <translation id="1204450209689312104">አዲስ ትር ማንነት በማያሳውቅ ሁነታ ውስጥ ይክፈቱ</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">በአድራሻ አሞሌው ላይ ወዳለው ግቤትዎ www. እና .com ያክሉ፣ ከዚያ ገጹን ይክፈቱ</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />፣ ከዚያ <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ወይም <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">በግራ በኩል ምናባዊውን ዴስክ አግብር</translation>
 <translation id="1996162290124031907">ወደ የሚቀጥለው ትር ይሂዱ</translation>
 <translation id="2010818616644390445">በመስኮቱ ውስጥ ያለው የመጨረሻ ትር ይሂዱ</translation>
 <translation id="2040706009561734834">አስጀማሪውን ይክፈቱ/ይዝጉ</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">ቅጽበታዊ ገጽ እይታን ያነሳል</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">የአድራሻ አሞሌ ላይ አተኩር</translation>
-<translation id="3165428420335997629">አዲስ ምናባዊ ዴስክ ፍጠር</translation>
 <translation id="3256109297135787951">በእርስዎ መደርደሪያ ላይ በንጥሉ ላይ ያለውን ማድመቂያ ያስወግዱ</translation>
 <translation id="3288816184963444640">የአሁኑን መስኮት ይዝጉ</translation>
 <translation id="3407560819924487926">የተግባር አስተዳዳሪን ያምጡት</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">ማያ ገጽን 90 ዲግሪ አሽከርክር</translation>
 <translation id="8241665785394195545">ቅንፍ ቀኝ</translation>
 <translation id="8264941229485248811">የገንቢ መሣሪያዎች መርማሪን አሳይ ወይም ደብቅ</translation>
-<translation id="8355937569537581904">አሁን ያለውን ምናባዊ ዴክክ አስወግድ</translation>
 <translation id="836869401750819675">የውርዶች ገጽን ይክፈቱ</translation>
 <translation id="8388247778047144397">አገናኙን በትሩ ድርድር ላይ ወዳለ ባዶ ቦታ ይጎትቱት</translation>
 <translation id="8389638407792712197">አዲስ መስኮት ይክፈቱ</translation>
diff --git a/ash/components/strings/ash_components_strings_ar.xtb b/ash/components/strings/ash_components_strings_ar.xtb
index 8dcc6ea3..d1340ff 100644
--- a/ash/components/strings/ash_components_strings_ar.xtb
+++ b/ash/components/strings/ash_components_strings_ar.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ar">
 <translation id="1036550831858290950">حفظ علامة التبويب الحالية كإشارة مرجعية</translation>
 <translation id="104962181688258143">فتح تطبيق الملفات</translation>
-<translation id="1098295134904615027">تفعيل سطح المكتب الافتراضي الأيسر</translation>
 <translation id="1122869341872663659">الاطّلاع <ph name="N" /> على نتائج بحث <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">اسحب الرابط إلى شريط عناوين علامة التبويب</translation>
 <translation id="1204450209689312104">فتح نافذة جديدة في وضع التصفح المتخفي</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">‏إضافة .www وcom. إلى الإدخال في شريط العناوين، ثم فتح الصفحة</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />، ثم <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> أو <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">تفعيل سطح المكتب الافتراضي الأيمن</translation>
 <translation id="1996162290124031907">الانتقال إلى علامة التبويب التالية</translation>
 <translation id="2010818616644390445">الانتقال إلى علامة التبويب الأخيرة في النافذة</translation>
 <translation id="2040706009561734834">فتح مشغِّل التطبيقات أو إغلاقه</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">أخذ لقطة شاشة</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">تركيز شريط العناوين</translation>
-<translation id="3165428420335997629">إنشاء سطح مكتب افتراضي جديد</translation>
 <translation id="3256109297135787951">إزالة التحديد عن عنصر على الرف</translation>
 <translation id="3288816184963444640">إغلاق النافذة الحالية</translation>
 <translation id="3407560819924487926">استدعاء إدارة المهام</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">تدوير الشاشة بزاوية 90 درجة</translation>
 <translation id="8241665785394195545">القوس الأيمن</translation>
 <translation id="8264941229485248811">إظهار مراقب "أدوات المطوِّرين" أو إخفاؤه</translation>
-<translation id="8355937569537581904">إزالة سطح المكتب الافتراضي الحالي</translation>
 <translation id="836869401750819675">فتح صفحة "التنزيلات"</translation>
 <translation id="8388247778047144397">اسحب الرابط إلى منطقة فارغة على شريط علامات التبويب</translation>
 <translation id="8389638407792712197">فتح نافذة جديدة</translation>
diff --git a/ash/components/strings/ash_components_strings_bg.xtb b/ash/components/strings/ash_components_strings_bg.xtb
index b5257fd..479e8959 100644
--- a/ash/components/strings/ash_components_strings_bg.xtb
+++ b/ash/components/strings/ash_components_strings_bg.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="bg">
 <translation id="1036550831858290950">Запазване на текущия раздел като отметка</translation>
 <translation id="104962181688258143">Отваряне на приложението Файлове</translation>
-<translation id="1098295134904615027">Активиране на виртуалния работен кът отдясно</translation>
 <translation id="1122869341872663659">Показват се <ph name="N" /> резултата от търсенето на „<ph name="QUERY" />“</translation>
 <translation id="1195667586424773550">Преместете с плъзгане връзката в адресната лента на раздела</translation>
 <translation id="1204450209689312104">Отваряне на нов прозорец в режим „инкогнито“</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Добавяне на www. и .com към въведеното в адресната лента и отваряне на съответната страница</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> и след това <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> или <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Активиране на виртуалния работен кът отляво</translation>
 <translation id="1996162290124031907">Към следващия раздел</translation>
 <translation id="2010818616644390445">Преминаване към последния раздел в прозореца</translation>
 <translation id="2040706009561734834">Отваряне/затваряне на стартовия панел</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Създаване на екранна снимка</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Преместване на фокуса върху адресната лента</translation>
-<translation id="3165428420335997629">Създаване на нов виртуален работен кът</translation>
 <translation id="3256109297135787951">Премахване на фокуса от елемент в лавицата</translation>
 <translation id="3288816184963444640">Затваряне на текущия прозорец</translation>
 <translation id="3407560819924487926">Показване на диспечера на задачите</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Завъртане на екрана на 90 градуса</translation>
 <translation id="8241665785394195545">дясна квадратна скоба</translation>
 <translation id="8264941229485248811">Показване или скриване на панела за проверка в инструментите за програмисти</translation>
-<translation id="8355937569537581904">Премахване на текущия виртуален работен кът</translation>
 <translation id="836869401750819675">Отваряне на страницата „Изтегляния“</translation>
 <translation id="8388247778047144397">Преместете с плъзгане връзката до празен участък на лентата с раздели</translation>
 <translation id="8389638407792712197">Отваряне на нов прозорец</translation>
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb
index c43e527..85f5307 100644
--- a/ash/components/strings/ash_components_strings_bn.xtb
+++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="bn">
 <translation id="1036550831858290950">আপনার বর্তমান ট্যাবটি বুকমার্ক হিসেবে সেভ করে রাখুন</translation>
 <translation id="104962181688258143">ফাইল অ্যাপ খুলুন</translation>
-<translation id="1098295134904615027">ডানদিকের ভার্চুয়াল ডেস্ক চালু করুন</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> এর জন্যে <ph name="N" />টি ফলাফল দেখানো হচ্ছে</translation>
 <translation id="1195667586424773550">ট্যাব অ্যাড্রেস বারে লিঙ্কটি টেনে আনুন</translation>
 <translation id="1204450209689312104">ছদ্মবেশী মোডে একটি নতুন উইন্ডো খুলুন</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">অ্যাড্রেস বারে আপনার ইনপুটে www. এবং .com যোগ করে পৃষ্ঠা খুলুন</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, তারপর <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> অথবা <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">বাঁদিকের ভার্চুয়াল ডেস্ক চালু করুন</translation>
 <translation id="1996162290124031907">পরের ট্যাবে যান</translation>
 <translation id="2010818616644390445">উইন্ডোটির শেষ ট্যাবে যান</translation>
 <translation id="2040706009561734834">লঞ্চার খুলুন/বন্ধ করুন</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">স্ক্রিনশট নিন</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">ফোকাস অ্যাড্রেস বার</translation>
-<translation id="3165428420335997629">একটি নতুন ভার্চুয়াল ডেস্ক তৈরি করুন</translation>
 <translation id="3256109297135787951">আপনার শেল্ফে আইটেম থেকে হাইলাইট সরিয়ে দিন</translation>
 <translation id="3288816184963444640">বর্তমান উইন্ডোটি বন্ধ করুন</translation>
 <translation id="3407560819924487926">টাস্ক ম্যানেজার আনুন</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">স্ক্রিনকে ৯০ ডিগ্রি ঘোরান</translation>
 <translation id="8241665785394195545">ডানদিকের ব্র্যাকেট দেওয়ার বোতাম</translation>
 <translation id="8264941229485248811">ডেভেলপার টুল পরিদর্শক দেখান বা লুকান</translation>
-<translation id="8355937569537581904">বর্তমানের ভার্চুয়াল ডেস্কটি সরিয়ে দিন</translation>
 <translation id="836869401750819675">ডাউনলোড হওয়া পৃষ্ঠাটি খুলুন</translation>
 <translation id="8388247778047144397">ট্যাব বারের ফাঁকা অঞ্চলে একটি লিঙ্ক টেনে আনুন</translation>
 <translation id="8389638407792712197">নতুন উইন্ডো খুলুন</translation>
diff --git a/ash/components/strings/ash_components_strings_ca.xtb b/ash/components/strings/ash_components_strings_ca.xtb
index 6d15ff29..4dbf1f5 100644
--- a/ash/components/strings/ash_components_strings_ca.xtb
+++ b/ash/components/strings/ash_components_strings_ca.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ca">
 <translation id="1036550831858290950">Desa la pestanya actual a les adreces d'interès</translation>
 <translation id="104962181688258143">Obre l'aplicació Fitxers</translation>
-<translation id="1098295134904615027">Activa l'escriptori virtual de la dreta</translation>
 <translation id="1122869341872663659">Es mostren <ph name="N" /> resultats de cerca per a <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Arrossega l'enllaç a la barra d'adreces de la pestanya</translation>
 <translation id="1204450209689312104">Obre una finestra nova en mode d'incògnit</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Afegeix www. i .com al text de la barra d'adreces i obre la pàgina</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> i després <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activa l'escriptori virtual de l'esquerra</translation>
 <translation id="1996162290124031907">Ves a la pestanya següent</translation>
 <translation id="2010818616644390445">Ves a l'última pestanya de la finestra</translation>
 <translation id="2040706009561734834">Obre/tanca el menú d'aplicacions</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Fes una captura de pantalla</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Mou el focus a la barra d'adreces</translation>
-<translation id="3165428420335997629">Crea un escriptori virtual nou</translation>
 <translation id="3256109297135787951">Deixa de destacar un element del prestatge</translation>
 <translation id="3288816184963444640">Tanca la finestra actual</translation>
 <translation id="3407560819924487926">Obre el gestor de tasques</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Gira la pantalla 90 graus</translation>
 <translation id="8241665785394195545">claudàtor de tancament</translation>
 <translation id="8264941229485248811">Mostra o amaga l'inspector d'eines per a desenvolupadors</translation>
-<translation id="8355937569537581904">Suprimeix l'escriptori virtual actual</translation>
 <translation id="836869401750819675">Obre la pàgina Baixades</translation>
 <translation id="8388247778047144397">Arrossega l'enllaç a una àrea buida de la barra de pestanyes</translation>
 <translation id="8389638407792712197">Obre una finestra nova</translation>
diff --git a/ash/components/strings/ash_components_strings_cs.xtb b/ash/components/strings/ash_components_strings_cs.xtb
index be07253..66eb0da 100644
--- a/ash/components/strings/ash_components_strings_cs.xtb
+++ b/ash/components/strings/ash_components_strings_cs.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="cs">
 <translation id="1036550831858290950">Uložit aktuální kartu jako záložku</translation>
 <translation id="104962181688258143">Otevřít aplikaci Soubory</translation>
-<translation id="1098295134904615027">Aktivovat virtuální plochu vpravo</translation>
 <translation id="1122869341872663659">Zobrazují se výsledky vyhledávání (<ph name="N" />) na téma <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Přetáhněte odkaz na adresní řádek na kartě</translation>
 <translation id="1204450209689312104">Otevřít nové okno v anonymním režimu</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Přidat k zadanému řetězci na adresním řádku www. a .com a poté otevřít stránku</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> a poté <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> nebo <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivovat virtuální plochu vlevo</translation>
 <translation id="1996162290124031907">Přejít na další kartu</translation>
 <translation id="2010818616644390445">Přejít na poslední kartu v okně</translation>
 <translation id="2040706009561734834">Otevřít/zavřít spouštěč</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Pořídit snímek obrazovky</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Přepnout do adresního řádku</translation>
-<translation id="3165428420335997629">Vytvořit novou virtuální plochu</translation>
 <translation id="3256109297135787951">Odebrat zvýraznění z položky na poličce</translation>
 <translation id="3288816184963444640">Zavřít aktuální okno</translation>
 <translation id="3407560819924487926">Otevřít správce úloh</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Otočit obrazovku o 90 stupňů</translation>
 <translation id="8241665785394195545">pravá hranatá závorka</translation>
 <translation id="8264941229485248811">Zobrazit nebo skrýt panel Nástroje pro vývojáře</translation>
-<translation id="8355937569537581904">Odstranit aktuální virtuální plochu</translation>
 <translation id="836869401750819675">Otevřít stránku Stažené soubory</translation>
 <translation id="8388247778047144397">Přetáhněte odkaz na prázdné místo na liště karet</translation>
 <translation id="8389638407792712197">Otevřít nové okno</translation>
diff --git a/ash/components/strings/ash_components_strings_da.xtb b/ash/components/strings/ash_components_strings_da.xtb
index 405ab20..6c0bd67 100644
--- a/ash/components/strings/ash_components_strings_da.xtb
+++ b/ash/components/strings/ash_components_strings_da.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="da">
 <translation id="1036550831858290950">Gem den aktuelle fane som et bogmærke</translation>
 <translation id="104962181688258143">Åbn appen Filer</translation>
-<translation id="1098295134904615027">Aktivér det virtuelle skrivebord til højre</translation>
 <translation id="1122869341872663659">Viser <ph name="N" /> søgeresultater for <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Træk linket til adresselinjen på fanen</translation>
 <translation id="1204450209689312104">Åbn et nyt vindue i inkognitotilstand</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Føj www. og .com til dit input i adresselinjen, og åbn siden</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> og derefter <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> eller <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivér det virtuelle skrivebord til venstre</translation>
 <translation id="1996162290124031907">Gå til næste fane</translation>
 <translation id="2010818616644390445">Gå til den sidste fane i vinduet</translation>
 <translation id="2040706009561734834">Åbn/luk applisten</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Tag screenshot</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokuser på adresselinje</translation>
-<translation id="3165428420335997629">Opret et nyt virtuelt skrivebord</translation>
 <translation id="3256109297135787951">Fjern fremhævningen af et element på din hylde</translation>
 <translation id="3288816184963444640">Luk det aktuelle vindue</translation>
 <translation id="3407560819924487926">Se Jobliste</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Roter skærmen 90 grader</translation>
 <translation id="8241665785394195545">højre vinkelparentes</translation>
 <translation id="8264941229485248811">Vis eller skjul kontrolløren i Udviklerværktøjer</translation>
-<translation id="8355937569537581904">Fjern det aktuelle virtuelle skrivebord</translation>
 <translation id="836869401750819675">Åbn siden Downloads</translation>
 <translation id="8388247778047144397">Træk linket til et tomt område på fanelinjen</translation>
 <translation id="8389638407792712197">Åbn et nyt vindue</translation>
diff --git a/ash/components/strings/ash_components_strings_de.xtb b/ash/components/strings/ash_components_strings_de.xtb
index d4989f7..c55ec2d 100644
--- a/ash/components/strings/ash_components_strings_de.xtb
+++ b/ash/components/strings/ash_components_strings_de.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="de">
 <translation id="1036550831858290950">Aktuellen Tab als Lesezeichen speichern</translation>
 <translation id="104962181688258143">App "Dateien" öffnen</translation>
-<translation id="1098295134904615027">Rechten virtuellen Arbeitsbereich aktivieren</translation>
 <translation id="1122869341872663659"><ph name="N" /> Suchergebnisse für <ph name="QUERY" /> werden angezeigt</translation>
 <translation id="1195667586424773550">Link in Adressleiste des Tabs ziehen</translation>
 <translation id="1204450209689312104">Neues Fenster im Inkognitomodus öffnen</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435">"<ph name="MODIFIER1" />" <ph name="SEPARATOR1" /> "<ph name="MODIFIER2" />" <ph name="SEPARATOR2" /> "<ph name="KEY" />"</translation>
 <translation id="1733525068429116555">"www." und ".com" zur Eingabe in der Adressleiste hinzufügen und die Seite dann öffnen</translation>
 <translation id="1920446759863417809">"<ph name="SHIFT1" />" <ph name="SEPARATOR1" /> "<ph name="ALT" />" <ph name="SEPARATOR2" /> "<ph name="L" />", dann "<ph name="SHIFT2" />" <ph name="SEPARATOR3" /> "<ph name="TAB" />" oder "<ph name="LEFT" />"</translation>
-<translation id="1929866390202038233">Linken virtuellen Arbeitsbereich aktivieren</translation>
 <translation id="1996162290124031907">Auf den nächsten Tab klicken</translation>
 <translation id="2010818616644390445">Auf den letzten Tab im Fenster klicken</translation>
 <translation id="2040706009561734834">Launcher öffnen/schließen</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Screenshot aufnehmen</translation>
 <translation id="3126026824346185272">Strg</translation>
 <translation id="3140353188828248647">Adressleiste fokussieren</translation>
-<translation id="3165428420335997629">Neuen virtuellen Arbeitsbereich erstellen</translation>
 <translation id="3256109297135787951">Markierung eines Elements in der Ablage entfernen</translation>
 <translation id="3288816184963444640">Aktuelles Fenster schließen</translation>
 <translation id="3407560819924487926">Task-Manager aufrufen</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Bildschirm um 90 Grad drehen</translation>
 <translation id="8241665785394195545">schließende eckige Klammer</translation>
 <translation id="8264941229485248811">Entwicklertools-Inspector ein- oder ausblenden</translation>
-<translation id="8355937569537581904">Aktuellen virtuellen Arbeitsbereich entfernen</translation>
 <translation id="836869401750819675">Seite "Downloads" öffnen</translation>
 <translation id="8388247778047144397">Link in einen leeren Bereich auf der Tableiste ziehen</translation>
 <translation id="8389638407792712197">Neues Fenster öffnen</translation>
diff --git a/ash/components/strings/ash_components_strings_el.xtb b/ash/components/strings/ash_components_strings_el.xtb
index ccadfc8..2916bf6 100644
--- a/ash/components/strings/ash_components_strings_el.xtb
+++ b/ash/components/strings/ash_components_strings_el.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="el">
 <translation id="1036550831858290950">Αποθήκευση της τρέχουσας καρτέλας ως σελιδοδείκτη</translation>
 <translation id="104962181688258143">Άνοιγμα εφαρμογής Αρχεία</translation>
-<translation id="1098295134904615027">Ενεργοποιήστε το εικονικό γραφείο στα δεξιά</translation>
 <translation id="1122869341872663659">Εμφάνιση <ph name="N" /> αποτελεσμάτων αναζήτησης για <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Σύρετε τον σύνδεσμο στη γραμμή διευθύνσεων της καρτέλας</translation>
 <translation id="1204450209689312104">Άνοιγμα νέου παραθύρου σε κατάσταση ανώνυμης περιήγησης</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Προσθέστε το www. και το .com στο κείμενο που έχετε πληκτρολογήσει στη γραμμή διευθύνσεων και έπειτα ανοίξτε τη σελίδα</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> και έπειτα <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ή <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Ενεργοποιήστε το εικονικό γραφείο στα αριστερά</translation>
 <translation id="1996162290124031907">Μετάβαση στην επόμενη καρτέλα</translation>
 <translation id="2010818616644390445">Μετάβαση στην τελευταία καρτέλα στο παράθυρο</translation>
 <translation id="2040706009561734834">Άνοιγμα/κλείσιμο εφαρμογής εκκίνησης</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Λήψη στιγμιότυπου οθόνης</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Εστίαση γραμμής διευθύνσεων</translation>
-<translation id="3165428420335997629">Δημιουργήστε νέο εικονικό γραφείο</translation>
 <translation id="3256109297135787951">Κατάργηση της επισήμανσης από κάποιο στοιχείο στο ράφι σας</translation>
 <translation id="3288816184963444640">Κλείσιμο τρέχοντος παραθύρου</translation>
 <translation id="3407560819924487926">Εμφάνιση της Διαχείρισης Εργασιών</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Περιστροφή οθόνης κατά 90 μοίρες</translation>
 <translation id="8241665785394195545">Δεξιά αγκύλη</translation>
 <translation id="8264941229485248811">Εμφάνιση ή απόκρυψη του πλαισίου επιθεώρησης "Εργαλεία για προγραμματιστές"</translation>
-<translation id="8355937569537581904">Καταργήστε το τρέχον εικονικό γραφείο</translation>
 <translation id="836869401750819675">Άνοιγμα σελίδας "Λήψεις"</translation>
 <translation id="8388247778047144397">Σύρετε τον σύνδεσμο σε μια κενή περιοχή της γραμμής καρτελών</translation>
 <translation id="8389638407792712197">Άνοιγμα νέου παραθύρου</translation>
diff --git a/ash/components/strings/ash_components_strings_en-GB.xtb b/ash/components/strings/ash_components_strings_en-GB.xtb
index c3d1164..66bb5cd 100644
--- a/ash/components/strings/ash_components_strings_en-GB.xtb
+++ b/ash/components/strings/ash_components_strings_en-GB.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="en-GB">
 <translation id="1036550831858290950">Save your current tab as a bookmark</translation>
 <translation id="104962181688258143">Open the Files app</translation>
-<translation id="1098295134904615027">Activate the virtual desk on the right</translation>
 <translation id="1122869341872663659">Displaying <ph name="N" /> search results for <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Drag the link to the tab's address bar</translation>
 <translation id="1204450209689312104">Open a new window in incognito mode</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Add www. and .com to your input in the address bar, then open the page</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, then <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> or <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activate the virtual desk on the left</translation>
 <translation id="1996162290124031907">Go to next tab</translation>
 <translation id="2010818616644390445">Go to the last tab in the window</translation>
 <translation id="2040706009561734834">Open/close the launcher</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Take screenshot</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Focus address bar</translation>
-<translation id="3165428420335997629">Create a new virtual desk</translation>
 <translation id="3256109297135787951">Remove the highlight from an item on your shelf</translation>
 <translation id="3288816184963444640">Close the current window</translation>
 <translation id="3407560819924487926">Bring up task manager</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rotate screen 90 degrees</translation>
 <translation id="8241665785394195545">bracket right</translation>
 <translation id="8264941229485248811">Show or hide the Developer Tools inspector</translation>
-<translation id="8355937569537581904">Remove the current virtual desk</translation>
 <translation id="836869401750819675">Open the Downloads page</translation>
 <translation id="8388247778047144397">Drag the link to a blank area on the tab strip</translation>
 <translation id="8389638407792712197">Open new window</translation>
diff --git a/ash/components/strings/ash_components_strings_es-419.xtb b/ash/components/strings/ash_components_strings_es-419.xtb
index fa7dbca..82df8a2 100644
--- a/ash/components/strings/ash_components_strings_es-419.xtb
+++ b/ash/components/strings/ash_components_strings_es-419.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="es-419">
 <translation id="1036550831858290950">Guarda la pestaña actual en Favoritos</translation>
 <translation id="104962181688258143">Abrir la app de Archivos</translation>
-<translation id="1098295134904615027">Activa el escritorio virtual de la derecha</translation>
 <translation id="1122869341872663659">Se muestran <ph name="N" /> resultados de búsqueda para <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Arrastrar el vínculo a la barra de direcciones de la pestaña</translation>
 <translation id="1204450209689312104">Abrir una ventana nueva en modo de navegación incógnito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Agregar www. y .com a la entrada en la barra de direcciones y, luego, abrir la página</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, luego <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activa el escritorio virtual de la izquierda</translation>
 <translation id="1996162290124031907">Ir a la pestaña siguiente</translation>
 <translation id="2010818616644390445">Ir a la última pestaña de la ventana</translation>
 <translation id="2040706009561734834">Abrir y cerrar el selector</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Tomar captura de pantalla</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Enfoque en la barra de direcciones</translation>
-<translation id="3165428420335997629">Crea un nuevo escritorio virtual</translation>
 <translation id="3256109297135787951">Dejar de destacar un elemento en la biblioteca</translation>
 <translation id="3288816184963444640">Cerrar la ventana actual</translation>
 <translation id="3407560819924487926">Mostrar el Administrador de tareas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rotar la pantalla 90 grados</translation>
 <translation id="8241665785394195545">corchete de cierre</translation>
 <translation id="8264941229485248811">Mostrar u ocultar el inspector de Herramientas para desarrolladores</translation>
-<translation id="8355937569537581904">Quita el escritorio virtual actual</translation>
 <translation id="836869401750819675">Abrir la página de descargas</translation>
 <translation id="8388247778047144397">Arrastra el vínculo al área en blanco de la barra de pestañas</translation>
 <translation id="8389638407792712197">Abrir una ventana nueva</translation>
diff --git a/ash/components/strings/ash_components_strings_es.xtb b/ash/components/strings/ash_components_strings_es.xtb
index 825c21d..53fadcf 100644
--- a/ash/components/strings/ash_components_strings_es.xtb
+++ b/ash/components/strings/ash_components_strings_es.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="es">
 <translation id="1036550831858290950">Añadir la pestaña actual a marcadores</translation>
 <translation id="104962181688258143">Abrir la aplicación Archivos</translation>
-<translation id="1098295134904615027">Activa el escritorio virtual de la derecha</translation>
 <translation id="1122869341872663659">Mostrando <ph name="N" /> resultados de búsqueda de <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Arrastra el enlace a la barra de direcciones de la pestaña</translation>
 <translation id="1204450209689312104">Abrir una ventana nueva en modo de incógnito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Añadir www. y .com al texto introducido en la barra de direcciones y abrir la página</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> y <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activa el escritorio virtual de la izquierda</translation>
 <translation id="1996162290124031907">Ir a la siguiente pestaña</translation>
 <translation id="2010818616644390445">Ir a la última pestaña de la ventana</translation>
 <translation id="2040706009561734834">Abrir/cerrar el menú de aplicaciones</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Hacer una captura de pantalla</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Activar barra de direcciones</translation>
-<translation id="3165428420335997629">Crea un escritorio virtual</translation>
 <translation id="3256109297135787951">Dejar de destacar un elemento de la estantería</translation>
 <translation id="3288816184963444640">Cerrar la ventana actual</translation>
 <translation id="3407560819924487926">Abrir el administrador de tareas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Girar la pantalla 90 grados</translation>
 <translation id="8241665785394195545">corchete derecho</translation>
 <translation id="8264941229485248811">Mostrar u ocultar el inspector de herramientas para desarrolladores</translation>
-<translation id="8355937569537581904">Quita el escritorio virtual actual</translation>
 <translation id="836869401750819675">Abrir la página Descargas</translation>
 <translation id="8388247778047144397">Arrastra el enlace a un área en blanco de la barra de pestañas</translation>
 <translation id="8389638407792712197">Abrir nueva ventana</translation>
diff --git a/ash/components/strings/ash_components_strings_et.xtb b/ash/components/strings/ash_components_strings_et.xtb
index 8e172b79..cccdc2f 100644
--- a/ash/components/strings/ash_components_strings_et.xtb
+++ b/ash/components/strings/ash_components_strings_et.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="et">
 <translation id="1036550831858290950">Praeguse vahelehe salvestamine järjehoidjana</translation>
 <translation id="104962181688258143">Rakenduse Failid avamine</translation>
-<translation id="1098295134904615027">Parempoolse virtuaalse töölaua aktiveerimine</translation>
 <translation id="1122869341872663659">Kuvatud on päringu <ph name="QUERY" /> <ph name="N" /> otsingutulemust</translation>
 <translation id="1195667586424773550">Lohistage link vahelehe aadressiribale</translation>
 <translation id="1204450209689312104">Uue akna avamine inkognito režiimis</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /> <ph name="SEPARATOR1" /> <ph name="MODIFIER2" /> <ph name="SEPARATOR2" /> <ph name="KEY" /></translation>
 <translation id="1733525068429116555">Laiendite www. ja .com lisamine aadressiribale ning siis lehe avamine</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /> <ph name="SEPARATOR1" /> <ph name="ALT" /> <ph name="SEPARATOR2" /> <ph name="L" />, seejärel <ph name="SHIFT2" /> <ph name="SEPARATOR3" /> <ph name="TAB" /> või <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Vasakpoolse virtuaalse töölaua aktiveerimine</translation>
 <translation id="1996162290124031907">Järgmisele vahelehele liikumine</translation>
 <translation id="2010818616644390445">Aknas viimasele vahelehele liikumine</translation>
 <translation id="2040706009561734834">Avab/suleb käivitusprogrammi</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Teeb kuvatõmmise</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Keskendub aadressiribale</translation>
-<translation id="3165428420335997629">Uue virtuaalse töölaua loomine</translation>
 <translation id="3256109297135787951">Riiulis oleva üksuse esiletõstu eemaldamine</translation>
 <translation id="3288816184963444640">Praeguse akna sulgemine</translation>
 <translation id="3407560819924487926">Tegumihalduri esiletoomine</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Ekraani pööramine 90 kraadi</translation>
 <translation id="8241665785394195545">Parem nurksulg</translation>
 <translation id="8264941229485248811">Kuvab või peidab arendajatööriistade inspektori</translation>
-<translation id="8355937569537581904">Praeguse virtuaalse töölaua eemaldamine</translation>
 <translation id="836869401750819675">Allalaadimiste lehe avamine</translation>
 <translation id="8388247778047144397">Lohistage link vahelehtede ribal tühjale alale</translation>
 <translation id="8389638407792712197">Uue akna avamine</translation>
diff --git a/ash/components/strings/ash_components_strings_fa.xtb b/ash/components/strings/ash_components_strings_fa.xtb
index 6ae0e54..9c3c48d 100644
--- a/ash/components/strings/ash_components_strings_fa.xtb
+++ b/ash/components/strings/ash_components_strings_fa.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="fa">
 <translation id="1036550831858290950">ذخیره برگه کنونی به‌عنوان نشانک</translation>
 <translation id="104962181688258143">‏باز کردن برنامه Files</translation>
-<translation id="1098295134904615027">میز مجازی در سمت چپ فعال شود</translation>
 <translation id="1122869341872663659">درحال نمایش <ph name="N" /> نتیجه جستجو برای <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">کشیدن پیوند به نوار نشانی برگه</translation>
 <translation id="1204450209689312104">باز کردن پنجره جدید در حالت ناشناس</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">‏افزودن www.‎ و ‎.com به ورودی‌تان در نوار نشانی و سپس باز کردن صفحه</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> و سپس <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> یا <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">میز مجازی در سمت راست فعال شود</translation>
 <translation id="1996162290124031907">رفتن به برگه بعدی</translation>
 <translation id="2010818616644390445">رفتن به آخرین برگه در پنجره</translation>
 <translation id="2040706009561734834">باز کردن/بستن راه‌انداز</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">گرفتن عکس صفحه‌نمایش</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">فوکوس نوار آدرس</translation>
-<translation id="3165428420335997629">میز مجازی جدیدی ایجاد شود</translation>
 <translation id="3256109297135787951">حذف برجسته‌سازی از مورد روی قفسه</translation>
 <translation id="3288816184963444640">بستن پنجره فعلی</translation>
 <translation id="3407560819924487926">باز کردن مدیر فعالیت‌ها</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">چرخاندن ۹۰ درجه‌ای صفحه</translation>
 <translation id="8241665785394195545">کمانک راست</translation>
 <translation id="8264941229485248811">نمایش یا پنهان کردن بازرس «ابزارهای برنامه‌نویس»</translation>
-<translation id="8355937569537581904">میز مجازی کنونی حذف شود</translation>
 <translation id="836869401750819675">باز کردن صفحه بارگیری</translation>
 <translation id="8388247778047144397">کشیدن پیوند به قسمتی خالی در نوار برگه</translation>
 <translation id="8389638407792712197">باز کردن پنجره جدید</translation>
diff --git a/ash/components/strings/ash_components_strings_fi.xtb b/ash/components/strings/ash_components_strings_fi.xtb
index a62c3b49..3825906 100644
--- a/ash/components/strings/ash_components_strings_fi.xtb
+++ b/ash/components/strings/ash_components_strings_fi.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="fi">
 <translation id="1036550831858290950">Tallenna nykyinen välilehti kirjanmerkiksi</translation>
 <translation id="104962181688258143">Avaa Tiedostot-sovellus</translation>
-<translation id="1098295134904615027">Aktivoi oikealla oleva virtuaalityöpöytä</translation>
 <translation id="1122869341872663659">Näytetään <ph name="N" /> hakutulosta kyselylle <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Vedä linkki välilehden osoitepalkkiin.</translation>
 <translation id="1204450209689312104">Avaa uusi ikkuna incognito-tilassa</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Lisää osoitekentässä olevaan tekstiin www. ja .com, ja avaa sitten sivu</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, sitten <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> tai <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivoi vasemmalla oleva virtuaalityöpöytä</translation>
 <translation id="1996162290124031907">Siirry seuraavalle välilehdelle</translation>
 <translation id="2010818616644390445">Siirry ikkunan viimeiselle välilehdelle</translation>
 <translation id="2040706009561734834">Avaa/sulkee käynnistysohjelman</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ota kuvakaappaus</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Keskitä osoitepalkkiin</translation>
-<translation id="3165428420335997629">Luo uusi virtuaalityöpöytä</translation>
 <translation id="3256109297135787951">Poista korostus hyllyssä olevasta kohteesta</translation>
 <translation id="3288816184963444640">Sulje nykyinen ikkuna</translation>
 <translation id="3407560819924487926">Aktivoi tehtävänhallinta</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Kierrä näyttöä 90 astetta</translation>
 <translation id="8241665785394195545">oikeanpuoleinen hakasulje</translation>
 <translation id="8264941229485248811">Näyttää tai piilottaa Kehittäjien työkalut ‑tarkastajan</translation>
-<translation id="8355937569537581904">Poista nykyinen virtuaalityöpöytä</translation>
 <translation id="836869401750819675">Avaa Lataukset-sivu</translation>
 <translation id="8388247778047144397">Vedä linkki välilehtirivin tyhjään kohtaan.</translation>
 <translation id="8389638407792712197">Avaa uusi ikkuna</translation>
diff --git a/ash/components/strings/ash_components_strings_fil.xtb b/ash/components/strings/ash_components_strings_fil.xtb
index dfca16f..e21ed90 100644
--- a/ash/components/strings/ash_components_strings_fil.xtb
+++ b/ash/components/strings/ash_components_strings_fil.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="fil">
 <translation id="1036550831858290950">I-save ang iyong kasalukuyang tab bilang bookmark</translation>
 <translation id="104962181688258143">Buksan ang app na Mga File</translation>
-<translation id="1098295134904615027">I-activate ang virtual desk sa kanan</translation>
 <translation id="1122869341872663659">Nagpapakita ng <ph name="N" /> (na) resulta ng paghahanap para sa <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">I-drag ang link sa address bar ng tab</translation>
 <translation id="1204450209689312104">Magbukas ng bagong window sa incognito mode</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Idagdag ang www. at .com sa iyong input sa address bar, pagkatapos ay buksan ang page</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, pagkatapos ay <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">I-activate ang virtual desk sa kaliwa</translation>
 <translation id="1996162290124031907">Pumunta sa susunod na tab</translation>
 <translation id="2010818616644390445">Pumunta sa huling tab sa window</translation>
 <translation id="2040706009561734834">Buksan/isara ang launcher</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Kunin screenshot</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Address bar sa pagtuon</translation>
-<translation id="3165428420335997629">Gumawa ng bagong virtual desk</translation>
 <translation id="3256109297135787951">Nag-aalis ng highlight sa isang item sa iyong shelf</translation>
 <translation id="3288816184963444640">Isara ang kasalukuyang window</translation>
 <translation id="3407560819924487926">Palabasin ang task manager</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">I-rotate ang screen nang 90 degrees</translation>
 <translation id="8241665785394195545">kanang bracket</translation>
 <translation id="8264941229485248811">Ipakita o itago ang inspector ng Mga Tool ng Developer</translation>
-<translation id="8355937569537581904">Alisin ang kasalukuyang virtual desk</translation>
 <translation id="836869401750819675">Buksan ang page ng Mga Download</translation>
 <translation id="8388247778047144397">I-drag ang link sa isang blankong bahagi sa tab strip</translation>
 <translation id="8389638407792712197">Magbukas ng bagong window</translation>
diff --git a/ash/components/strings/ash_components_strings_fr.xtb b/ash/components/strings/ash_components_strings_fr.xtb
index 77f0c2b2f..e1243df7 100644
--- a/ash/components/strings/ash_components_strings_fr.xtb
+++ b/ash/components/strings/ash_components_strings_fr.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="fr">
 <translation id="1036550831858290950">Enregistrer l'onglet actif dans les favoris</translation>
 <translation id="104962181688258143">Ouvrir l'application Fichiers</translation>
-<translation id="1098295134904615027">Activez le bureau virtuel à droite</translation>
 <translation id="1122869341872663659">Afficher <ph name="N" /> résultats de recherche pour <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Faites glisser le lien vers la barre d'adresse de l'onglet</translation>
 <translation id="1204450209689312104">Ouvrir une nouvelle fenêtre en mode navigation privée</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Ajouter "www." et ".com" à votre saisie dans la barre d'adresse et ouvrir la page</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, puis <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ou <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activez le bureau virtuel à gauche</translation>
 <translation id="1996162290124031907">Accéder à l'onglet suivant</translation>
 <translation id="2010818616644390445">Accéder au dernier onglet dans la fenêtre</translation>
 <translation id="2040706009561734834">Ouvrir ou fermer le lanceur d'applications</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Faire une capture d'écran</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Activer la barre d'adresse</translation>
-<translation id="3165428420335997629">Créez un bureau virtuel</translation>
 <translation id="3256109297135787951">Supprimer la mise en surbrillance d'un élément sur l'étagère</translation>
 <translation id="3288816184963444640">Fermer la fenêtre active</translation>
 <translation id="3407560819924487926">Ouvrir le gestionnaire de tâches</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Faire pivoter l'écran de 90 degrés</translation>
 <translation id="8241665785394195545">crochet droit</translation>
 <translation id="8264941229485248811">Afficher ou masquer l'inspecteur des Outils pour les développeurs</translation>
-<translation id="8355937569537581904">Supprimez le bureau virtuel actuel</translation>
 <translation id="836869401750819675">Ouvrir la page "Téléchargements"</translation>
 <translation id="8388247778047144397">Faites glisser le lien vers une zone vierge de la barre d'onglets</translation>
 <translation id="8389638407792712197">Ouvrir une nouvelle fenêtre</translation>
diff --git a/ash/components/strings/ash_components_strings_gu.xtb b/ash/components/strings/ash_components_strings_gu.xtb
index 29edf3f..431e8e3 100644
--- a/ash/components/strings/ash_components_strings_gu.xtb
+++ b/ash/components/strings/ash_components_strings_gu.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="gu">
 <translation id="1036550831858290950">તમારા વર્તમાન ટૅબને બુકમાર્ક તરીકે સાચવો</translation>
 <translation id="104962181688258143">Files ઍપ ખોલો</translation>
-<translation id="1098295134904615027">જમણી બાજુના વર્ચ્યુયલ ડેસ્કને સક્રિય કરો</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> માટે <ph name="N" /> શોધ પરિણામો ડિસ્પ્લે કરી રહ્યાં છીએ</translation>
 <translation id="1195667586424773550">ટૅબના ઍડ્રેસ બારમાં લિંકને ખેંચો</translation>
 <translation id="1204450209689312104">છૂપા મોડમાં એક નવી વિંડો ખોલો</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">ઍડ્રેસ બારમાંના તમારા ઇનપુટમાં www. અને .com ઉમેરો, પછી પેજ ખોલો</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, પછી <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> અથવા <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">ડાબી બાજુના વર્ચ્યુયલ ડેસ્કને સક્રિય કરો</translation>
 <translation id="1996162290124031907">આગળના ટૅબ પર જાઓ</translation>
 <translation id="2010818616644390445">વિંડોમાં છેલ્લા ટૅબ પર જાઓ</translation>
 <translation id="2040706009561734834">લૉન્ચર ખોલો/બંધ કરો</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">સ્ક્રીનશૉટ લો</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">સરનામાં બાર પર ફોકસ કરો</translation>
-<translation id="3165428420335997629">નવું વર્ચ્યુયલ ડેસ્ક બનાવો</translation>
 <translation id="3256109297135787951">તમારા શેલ્ફ પર આઇટમમાંથી હાઇલાઇટ કાઢી નાખો</translation>
 <translation id="3288816184963444640">વર્તમાન વિંડો બંધ કરો</translation>
 <translation id="3407560819924487926">કાર્ય મેનેજર લાવો</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">સ્ક્રીનને 90 ડિગ્રીએ ફેરવો</translation>
 <translation id="8241665785394195545">જમણો કૌંસ</translation>
 <translation id="8264941229485248811">ડેવલપર સાધનો ઇન્સ્પેક્ટર બતાવો અથવા છુપાવો</translation>
-<translation id="8355937569537581904">વર્તમાન વર્ચ્યુઅલ ડેસ્ક કાઢી નાખો</translation>
 <translation id="836869401750819675">ડાઉનલોડ પેજ ખોલો</translation>
 <translation id="8388247778047144397">લિંકને ટૅબ સ્ટ્રિપ પરના ખાલી વિસ્તારમાં ખેંચો</translation>
 <translation id="8389638407792712197">નવી વિંડો ખોલો</translation>
diff --git a/ash/components/strings/ash_components_strings_hi.xtb b/ash/components/strings/ash_components_strings_hi.xtb
index f632439..b44f5567 100644
--- a/ash/components/strings/ash_components_strings_hi.xtb
+++ b/ash/components/strings/ash_components_strings_hi.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="hi">
 <translation id="1036550831858290950">अपना मौजूदा टैब बुकमार्क के रूप में सेव करें</translation>
 <translation id="104962181688258143">Files ऐप्लिकेशन खोलें</translation>
-<translation id="1098295134904615027">दाईं ओर मौजूद वर्चुअल डेस्क चालू करें</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> के लिए <ph name="N" /> खोज नतीजे दिखाए जा रहे हैं</translation>
 <translation id="1195667586424773550">लिंक को टैब के पता बार में खींचें और छोड़ें</translation>
 <translation id="1204450209689312104">गुप्त मोड में नई विंडो खोलें</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">पता बार में अपने इनपुट में www. और .com जोड़ें, फिर पेज खोलें</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, फिर <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> या <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">बाईं ओर मौजूद वर्चुअल डेस्क चालू करें</translation>
 <translation id="1996162290124031907">अगले टैब पर जाएं</translation>
 <translation id="2010818616644390445">विंडो में आखिरी टैब पर जाएंं</translation>
 <translation id="2040706009561734834">लॉन्चर खोलें/बंद करें</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">स्क्रीनशॉट लें</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">पता बार को फ़ोकस करें</translation>
-<translation id="3165428420335997629">नया वर्चुअल डेस्क बनाएं</translation>
 <translation id="3256109297135787951">अपने शेल्फ़ पर मौजूद किसी आइटम से हाइलाइट हटाएं</translation>
 <translation id="3288816184963444640">अभी वाली विंडो बंद करें</translation>
 <translation id="3407560819924487926">काम का प्रबंधक सामने लाएं</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">स्‍क्रीन को 90 डिग्री पर घुमाएं</translation>
 <translation id="8241665785394195545">दायां ब्रैकेट</translation>
 <translation id="8264941229485248811">डेवलपर टूल इंस्पेक्टर दिखाएं या छिपाएं</translation>
-<translation id="8355937569537581904">मौजूदा वर्चुअल डेस्क हटाएं</translation>
 <translation id="836869401750819675">डाउनलोड पेज खोलें</translation>
 <translation id="8388247778047144397">लिंक को टैब स्‍ट्रिप पर खाली जगह में खींचें और छोड़ें</translation>
 <translation id="8389638407792712197">नई विंडो खोलें</translation>
diff --git a/ash/components/strings/ash_components_strings_hr.xtb b/ash/components/strings/ash_components_strings_hr.xtb
index 4390ff95..561984cf 100644
--- a/ash/components/strings/ash_components_strings_hr.xtb
+++ b/ash/components/strings/ash_components_strings_hr.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="hr">
 <translation id="1036550831858290950">Spremanje trenutačne kartice kao oznake</translation>
 <translation id="104962181688258143">Otvaranje aplikacije Datoteke</translation>
-<translation id="1098295134904615027">Aktiviranje virtualne radne površine zdesna</translation>
 <translation id="1122869341872663659">Prikazuju se rezultati pretraživanja (<ph name="N" />) za upit <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Povlačenje veze na adresnu traku kartice</translation>
 <translation id="1204450209689312104">Otvaranje novog prozora u anonimnom načinu</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Dodavanje elementa www. ili .com unosu u adresnoj traci i otvaranje stranice</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, a zatim <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ili <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktiviranje virtualne radne površine slijeva</translation>
 <translation id="1996162290124031907">Prelazak na sljedeću karticu</translation>
 <translation id="2010818616644390445">Prelazak na zadnju karticu u prozoru</translation>
 <translation id="2040706009561734834">Otvori/zatvori pokretač</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Snimi zaslon</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokusiraj adresnu traku</translation>
-<translation id="3165428420335997629">Izrada nove virtualne radne površine</translation>
 <translation id="3256109297135787951">Poništavanje isticanja neke stavke na polici</translation>
 <translation id="3288816184963444640">Zatvaranje trenutačnog prozora</translation>
 <translation id="3407560819924487926">Prikazivanje upravitelja zadataka</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Zakretanje zaslona za 90 stupnjeva</translation>
 <translation id="8241665785394195545">desna zagrada</translation>
 <translation id="8264941229485248811">Prikaz ili sakrivanje inspektora Alata za razvojne programere</translation>
-<translation id="8355937569537581904">Uklanjanje trenutačne virtualne radne površine</translation>
 <translation id="836869401750819675">Otvaranje stranice preuzimanja</translation>
 <translation id="8388247778047144397">Povucite vezu na prazno područje na vrpci kartica</translation>
 <translation id="8389638407792712197">Otvaranje novog prozora</translation>
diff --git a/ash/components/strings/ash_components_strings_hu.xtb b/ash/components/strings/ash_components_strings_hu.xtb
index de4b4cd..21981618 100644
--- a/ash/components/strings/ash_components_strings_hu.xtb
+++ b/ash/components/strings/ash_components_strings_hu.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="hu">
 <translation id="1036550831858290950">Az aktuális lap elmentése könyvjelzőként</translation>
 <translation id="104962181688258143">A Fájlok alkalmazás megnyitása</translation>
-<translation id="1098295134904615027">A jobb oldali virtuális asztal aktiválása</translation>
 <translation id="1122869341872663659"><ph name="N" /> keresési találat megjelenítve a következőre: <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">A link húzása a lap címsávjára</translation>
 <translation id="1204450209689312104">Új ablak megnyitása inkognitómódban</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">www. és .com hozzáadása a címsávba beírt szöveghez, majd az oldal megnyitása</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, majd <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> vagy <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">A bal oldali virtuális asztal aktiválása</translation>
 <translation id="1996162290124031907">Ugrás a következő lapra</translation>
 <translation id="2010818616644390445">Ugrás az ablak utolsó lapjára</translation>
 <translation id="2040706009561734834">Az indító megnyitása, illetve bezárása</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Képernyőkép készítése</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fókuszálás a címsávra</translation>
-<translation id="3165428420335997629">Új virtuális asztal létrehozása</translation>
 <translation id="3256109297135787951">A kiemelés eltávolítása a polcon található elemről</translation>
 <translation id="3288816184963444640">A jelenlegi ablak bezárása</translation>
 <translation id="3407560819924487926">Feladatkezelő megnyitása</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Képernyő elforgatása 90 fokkal</translation>
 <translation id="8241665785394195545">jobb oldali szögletes zárójel</translation>
 <translation id="8264941229485248811">A Fejlesztői eszközök ellenőrző panelének megjelenítése vagy elrejtése</translation>
-<translation id="8355937569537581904">A jelenlegi virtuális asztal eltávolítása</translation>
 <translation id="836869401750819675">A Letöltések oldal megnyitása</translation>
 <translation id="8388247778047144397">A link húzása a lapsor egy üres területére</translation>
 <translation id="8389638407792712197">Új ablak megnyitása</translation>
diff --git a/ash/components/strings/ash_components_strings_id.xtb b/ash/components/strings/ash_components_strings_id.xtb
index 1a5179e..9045ebc 100644
--- a/ash/components/strings/ash_components_strings_id.xtb
+++ b/ash/components/strings/ash_components_strings_id.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="id">
 <translation id="1036550831858290950">Menyimpan tab saat ini sebagai bookmark</translation>
 <translation id="104962181688258143">Membuka aplikasi File</translation>
-<translation id="1098295134904615027">Aktifkan halaman kerja virtual di sebelah kanan</translation>
 <translation id="1122869341872663659">Menampilkan hasil penelusuran <ph name="N" /> untuk <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Tarik link ke kolom URL tab</translation>
 <translation id="1204450209689312104">Membuka jendela baru dalam mode samaran</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Menambahkan www. dan .com ke masukan Anda dalam kolom URL, lalu membuka halaman</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, lalu <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> atau <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktifkan halaman kerja virtual di sebelah kiri</translation>
 <translation id="1996162290124031907">Membuka tab berikutnya</translation>
 <translation id="2010818616644390445">Membuka tab terakhir di jendela</translation>
 <translation id="2040706009561734834">Membuka/menutup peluncur</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ambil screenshot</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokus ke bilah alamat</translation>
-<translation id="3165428420335997629">Buat halaman kerja virtual baru</translation>
 <translation id="3256109297135787951">Menghapus tanda dari item di rak</translation>
 <translation id="3288816184963444640">Menutup jendela aktif</translation>
 <translation id="3407560819924487926">Memunculkan pengelola tugas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Memutar layar 90 derajat</translation>
 <translation id="8241665785394195545">tanda kurung siku tutup</translation>
 <translation id="8264941229485248811">Menampilkan atau menyembunyikan pemeriksa Developer Tools</translation>
-<translation id="8355937569537581904">Hapus halaman kerja virtual saat ini</translation>
 <translation id="836869401750819675">Membuka halaman Download</translation>
 <translation id="8388247778047144397">Tarik link ke area kosong di tab setrip</translation>
 <translation id="8389638407792712197">Membuka jendela baru</translation>
diff --git a/ash/components/strings/ash_components_strings_it.xtb b/ash/components/strings/ash_components_strings_it.xtb
index 5c10626..a920ef048 100644
--- a/ash/components/strings/ash_components_strings_it.xtb
+++ b/ash/components/strings/ash_components_strings_it.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="it">
 <translation id="1036550831858290950">Salva la scheda corrente nei preferiti</translation>
 <translation id="104962181688258143">Apre l'app File</translation>
-<translation id="1098295134904615027">Attiva il desktop virtuale a destra</translation>
 <translation id="1122869341872663659">Sono visualizzati <ph name="N" /> risultati di ricerca relativi a <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Trascina il link nella barra degli indirizzi della scheda</translation>
 <translation id="1204450209689312104">Apre una nuova finestra in modalità di navigazione in incognito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Aggiunge www. e .com all'indirizzo inserito nella barra degli indirizzi, quindi apre la pagina</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, quindi <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> o <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Attiva il desktop virtuale a sinistra</translation>
 <translation id="1996162290124031907">Passa alla scheda successiva</translation>
 <translation id="2010818616644390445">Passa all'ultima scheda della finestra</translation>
 <translation id="2040706009561734834">Consente di aprire/chiudere Avvio app</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Acquisisce uno screenshot</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Area attiva nella barra degli indirizzi</translation>
-<translation id="3165428420335997629">Crea un nuovo desktop virtuale</translation>
 <translation id="3256109297135787951">Consente di rimuovere l'evidenziazione da un elemento sulla shelf</translation>
 <translation id="3288816184963444640">Chiude la finestra corrente</translation>
 <translation id="3407560819924487926">Apre il Task Manager</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Ruota lo schermo di 90 gradi</translation>
 <translation id="8241665785394195545">parentesi quadra chiusa</translation>
 <translation id="8264941229485248811">Consente di mostrare o nascondere il controllo Strumenti per sviluppatori</translation>
-<translation id="8355937569537581904">Rimuovi l'attuale desktop virtuale</translation>
 <translation id="836869401750819675">Apre la pagina Download</translation>
 <translation id="8388247778047144397">Trascina il link in un'area vuota della tabstrip</translation>
 <translation id="8389638407792712197">Apre una nuova finestra</translation>
diff --git a/ash/components/strings/ash_components_strings_iw.xtb b/ash/components/strings/ash_components_strings_iw.xtb
index 70cb3814..8a6b65e 100644
--- a/ash/components/strings/ash_components_strings_iw.xtb
+++ b/ash/components/strings/ash_components_strings_iw.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="iw">
 <translation id="1036550831858290950">שמירת הכרטיסייה הנוכחית כסימנייה</translation>
 <translation id="104962181688258143">פתיחת האפליקציה 'קבצים'</translation>
-<translation id="1098295134904615027">הפעלת שולחן העבודה הווירטואלי בצד ימין</translation>
 <translation id="1122869341872663659">מוצגות <ph name="N" /> תוצאות חיפוש לגבי <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">גרירת הקישור אל שורת כתובת האתר של הכרטיסייה</translation>
 <translation id="1204450209689312104">פתיחת חלון חדש במצב גלישה בסתר</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">‏הוספת www. ו-‎ .comלקלט בשורת כתובת האתר, ולאחר מכן פתיחת הדף</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> ואז <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> או <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">הפעלת שולחן העבודה הווירטואלי בצד שמאל</translation>
 <translation id="1996162290124031907">מעבר לכרטיסייה הבאה</translation>
 <translation id="2010818616644390445">מעבר לכרטיסייה האחרונה בחלון</translation>
 <translation id="2040706009561734834">פתיחה/סגירה של מרכז האפליקציות</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">ביצוע של צילום מסך</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">התמקדות בשורת כתובת האתר</translation>
-<translation id="3165428420335997629">יצירה של שולחן עבודה וירטואלי חדש</translation>
 <translation id="3256109297135787951">הסרת הסימון מפריט במדף</translation>
 <translation id="3288816184963444640">סגירת החלון הנוכחי</translation>
 <translation id="3407560819924487926">פתיחת מנהל המשימות</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">סיבוב המסך ב-90 מעלות</translation>
 <translation id="8241665785394195545">סוגר ימני</translation>
 <translation id="8264941229485248811">הצגה או הסתרה של בודק 'כלים למפתחים'</translation>
-<translation id="8355937569537581904">הסרה של שולחן העבודה הווירטואלי הנוכחי</translation>
 <translation id="836869401750819675">פתיחת הדף 'הורדות'</translation>
 <translation id="8388247778047144397">גרירת הקישור לאזור ריק בשורת הכרטיסיות</translation>
 <translation id="8389638407792712197">פתיחת חלון חדש</translation>
diff --git a/ash/components/strings/ash_components_strings_ja.xtb b/ash/components/strings/ash_components_strings_ja.xtb
index 4e9009d4..91d68a4 100644
--- a/ash/components/strings/ash_components_strings_ja.xtb
+++ b/ash/components/strings/ash_components_strings_ja.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ja">
 <translation id="1036550831858290950">現在のタブをブックマークとして保存する</translation>
 <translation id="104962181688258143">ファイルアプリを起動する</translation>
-<translation id="1098295134904615027">右の仮想デスクを有効にします</translation>
 <translation id="1122869341872663659">「<ph name="QUERY" />」の検索結果 <ph name="N" /> 件を表示しています</translation>
 <translation id="1195667586424773550">リンクをドラッグしてタブのアドレスバーに移動する</translation>
 <translation id="1204450209689312104">新しいウィンドウをシークレット モードで開く</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /> キーを押す</translation>
 <translation id="1733525068429116555">アドレスバーに入力した語句に www. と .com を追加してページを開く</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> キーを押した状態で <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> キーまたは <ph name="LEFT" /> キーを押す</translation>
-<translation id="1929866390202038233">左の仮想デスクを有効にします</translation>
 <translation id="1996162290124031907">次のタブに移動する</translation>
 <translation id="2010818616644390445">ウィンドウ内の最後のタブに移動する</translation>
 <translation id="2040706009561734834">ランチャーを開くか閉じます</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">スクリーンショットを撮る</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">アドレスバーにフォーカスを移す</translation>
-<translation id="3165428420335997629">新しい仮想デスクを作成します</translation>
 <translation id="3256109297135787951">シェルフのアイテムのハイライト表示を解除します</translation>
 <translation id="3288816184963444640">現在のウィンドウを閉じる</translation>
 <translation id="3407560819924487926">タスク マネージャを表示する</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">画面を 90 度回転させる</translation>
 <translation id="8241665785394195545">右角かっこ</translation>
 <translation id="8264941229485248811">デベロッパー ツール インスペクタの表示と非表示を切り替えます</translation>
-<translation id="8355937569537581904">現在の仮想デスクを削除します</translation>
 <translation id="836869401750819675">ダウンロード ページを開く</translation>
 <translation id="8388247778047144397">リンクをドラッグしてタブストリップの空白領域に移動する</translation>
 <translation id="8389638407792712197">新しいウィンドウを開く</translation>
diff --git a/ash/components/strings/ash_components_strings_kn.xtb b/ash/components/strings/ash_components_strings_kn.xtb
index 5397d5c..ecee5b7 100644
--- a/ash/components/strings/ash_components_strings_kn.xtb
+++ b/ash/components/strings/ash_components_strings_kn.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="kn">
 <translation id="1036550831858290950">ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ ಅನ್ನು ಬುಕ್‌ಮಾರ್ಕ್‌ ಆಗಿ ಉಳಿಸಿ</translation>
 <translation id="104962181688258143">ಫೈಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ</translation>
-<translation id="1098295134904615027">ಬಲಬದಿಯಲ್ಲಿರುವ ವರ್ಚುವಲ್ ಡೆಸ್ಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> ಗಾಗಿ <ph name="N" /> ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="1195667586424773550">ಟ್ಯಾಬ್‌ನ ವಿಳಾಸ ಪಟ್ಟಿಗೆ ಲಿಂಕ್‌ ಅನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ</translation>
 <translation id="1204450209689312104">ಅಜ್ಞಾತ ಮೋಡ್‌ನಲ್ಲಿ ಹೊಸ ವಿಂಡೋ ತೆರೆಯಿರಿ</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ನಿಮ್ಮ ಇನ್‌ಪುಟ್‌ಗೆ www. ಮತ್ತು .com ಅನ್ನು ಸೇರಿಸಿ, ನಂತರ ಪುಟವನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, ನಂತರ <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ಅಥವಾ <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">ಎಡಬದಿಯಲ್ಲಿರುವ ವರ್ಚುವಲ್ ಡೆಸ್ಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1996162290124031907">ಮುಂದಿನ ಟ್ಯಾಬ್‌ಗೆ ಹೋಗಿ</translation>
 <translation id="2010818616644390445">ವಿಂಡೋದಲ್ಲಿ ಕೊನೆಯ ಟ್ಯಾಬ್‌ಗೆ ಹೋಗಿ</translation>
 <translation id="2040706009561734834">ಲಾಂಚರ್ ಅನ್ನು ತೆರೆಯಿರಿ/ಮುಚ್ಚಿ</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">ವಿಳಾಸ ಪಟ್ಟಿಯನ್ನು ಗಮನಿಸಿ</translation>
-<translation id="3165428420335997629">ಹೊಸ ವರ್ಚುವಲ್ ಡೆಸ್ಕ್ ಅನ್ನು ರಚಿಸಿ</translation>
 <translation id="3256109297135787951">ನಿಮ್ಮ ಶೆಲ್ಫ್‌ನಲ್ಲಿರುವ ಐಟಂನಿಂದ ಹೈಲೈಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="3288816184963444640">ಪ್ರಸ್ತುತ ವಿಂಡೋ ಮುಚ್ಚಿ</translation>
 <translation id="3407560819924487926">ಹೊಸ ಕಾರ್ಯ ನಿರ್ವಾಹಕವನ್ನು ತೆರೆಯುತ್ತದೆ</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">ಪರದೆಯನ್ನು 90 ಡಿಗ್ರಿಗಳಲ್ಲಿ ತಿರುಗಿಸಿ</translation>
 <translation id="8241665785394195545">ಬಲ ಆವರಣ</translation>
 <translation id="8264941229485248811">ಡೆವಲಪರ್ ಪರಿಕರಗಳ ಪರೀಕ್ಷಕವನ್ನು ತೋರಿಸಿ ಅಥವಾ ಮರೆಮಾಡಿ</translation>
-<translation id="8355937569537581904">ಪ್ರಸ್ತುತ ವರ್ಚುವಲ್ ಡೆಸ್ಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="836869401750819675">ಡೌನ್‌ಲೋಡ್‌ಗಳ ಪುಟ ತೆರೆಯಿರಿ</translation>
 <translation id="8388247778047144397">ಟ್ಯಾಬ್ ಪಟ್ಟಿಯಲ್ಲಿನ ಖಾಲಿ ವಲಯಕ್ಕೆ ಲಿಂಕ್ ಎಳೆಯಿರಿ</translation>
 <translation id="8389638407792712197">ಹೊಸ ವಿಂಡೋವನ್ನು ತೆರೆಯಿರಿ</translation>
diff --git a/ash/components/strings/ash_components_strings_ko.xtb b/ash/components/strings/ash_components_strings_ko.xtb
index 00e6478a..ed11d4e 100644
--- a/ash/components/strings/ash_components_strings_ko.xtb
+++ b/ash/components/strings/ash_components_strings_ko.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ko">
 <translation id="1036550831858290950">현재 탭을 북마크로 저장</translation>
 <translation id="104962181688258143">파일 앱 열기</translation>
-<translation id="1098295134904615027">오른쪽에서 가상 데스크를 활성화합니다.</translation>
 <translation id="1122869341872663659"><ph name="QUERY" />에 관한 검색결과 <ph name="N" />개 표시 중</translation>
 <translation id="1195667586424773550">링크를 탭의 검색주소창으로 드래그하세요.</translation>
 <translation id="1204450209689312104">시크릿 모드로 새 창 열기</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">검색주소창에 입력한 주소에 www. 및 .com을 추가한 후 페이지 열기</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />을 누르고 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 또는 <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">왼쪽에서 가상 데스크를 활성화합니다.</translation>
 <translation id="1996162290124031907">다음 탭으로 이동</translation>
 <translation id="2010818616644390445">창의 마지막 탭으로 이동</translation>
 <translation id="2040706009561734834">런처 열기/닫기</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">스크린샷 찍기</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">주소 표시줄로 이동</translation>
-<translation id="3165428420335997629">새로운 가상 데스크를 만듭니다.</translation>
 <translation id="3256109297135787951">실행기에 있는 항목에서 강조표시를 삭제합니다.</translation>
 <translation id="3288816184963444640">현재 창 닫기</translation>
 <translation id="3407560819924487926">작업 관리자 호출</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">화면 90도 회전</translation>
 <translation id="8241665785394195545">오른쪽 대괄호</translation>
 <translation id="8264941229485248811">Developer Tools 검사기 표시 또는 숨기기</translation>
-<translation id="8355937569537581904">현재 가상 데스크를 삭제합니다.</translation>
 <translation id="836869401750819675">다운로드 페이지 열기</translation>
 <translation id="8388247778047144397">링크를 탭 표시줄의 빈 영역으로 드래그</translation>
 <translation id="8389638407792712197">새 창 열기</translation>
diff --git a/ash/components/strings/ash_components_strings_lt.xtb b/ash/components/strings/ash_components_strings_lt.xtb
index 3b2f2ba6..bdd20f43 100644
--- a/ash/components/strings/ash_components_strings_lt.xtb
+++ b/ash/components/strings/ash_components_strings_lt.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="lt">
 <translation id="1036550831858290950">Išsaugoti dabartinį skirtuką kaip žymę</translation>
 <translation id="104962181688258143">Atidaryti Failų programą</translation>
-<translation id="1098295134904615027">Aktyvinamas virtualusis pultas dešinėje</translation>
 <translation id="1122869341872663659">Rodomi paieškos rezultatai (<ph name="N" />) pagal užklausą „<ph name="QUERY" />“</translation>
 <translation id="1195667586424773550">Nuvilkite nuorodą į skirtuko adreso juostą</translation>
 <translation id="1204450209689312104">Atidaryti naują langą inkognito režimu</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Pridėkite „www.“ ir „.com“ prie įvesties adreso juostoje, tada atidarykite puslapį</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, tada <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> arba <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktyvinamas virtualusis pultas kairėje</translation>
 <translation id="1996162290124031907">Eiti į kitą skirtuką</translation>
 <translation id="2010818616644390445">Eiti į paskutinį skirtuką lange</translation>
 <translation id="2040706009561734834">Atidaryti / uždaryti paleidimo priemonę</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Padaryti ekrano kopiją</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokusuoti adreso juostą</translation>
-<translation id="3165428420335997629">Sukuriamas naujas virtualusis pultas</translation>
 <translation id="3256109297135787951">Pašalinti elemento lentynoje paryškinimą</translation>
 <translation id="3288816184963444640">Uždaryti esamą langą</translation>
 <translation id="3407560819924487926">Rodyti užduočių tvarkytuvę</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Pasukti ekraną 90 laipsnių kampu</translation>
 <translation id="8241665785394195545">uždaromasis laužtinis skliaustas</translation>
 <translation id="8264941229485248811">Rodyti arba slėpti kūrėjo įrankių tikrinimo priemonę</translation>
-<translation id="8355937569537581904">Pašalinamas dabartinis virtualusis pultas</translation>
 <translation id="836869401750819675">Atidaryti atsisiuntimų puslapį</translation>
 <translation id="8388247778047144397">Nuvilkite nuorodą į tuščią sritį skirtuko juostelėje</translation>
 <translation id="8389638407792712197">Atidaryti naują langą</translation>
diff --git a/ash/components/strings/ash_components_strings_lv.xtb b/ash/components/strings/ash_components_strings_lv.xtb
index e0430a87..9767e69 100644
--- a/ash/components/strings/ash_components_strings_lv.xtb
+++ b/ash/components/strings/ash_components_strings_lv.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="lv">
 <translation id="1036550831858290950">Saglabājiet pašreizējo cilni kā grāmatzīmi</translation>
 <translation id="104962181688258143">Atvērt lietotni Faili</translation>
-<translation id="1098295134904615027">Aktivizēt virtuālo darbvietu labajā pusē</translation>
 <translation id="1122869341872663659">Tiek rādīti <ph name="N" /> meklēšanas rezultāti vaicājumam “<ph name="QUERY" />”.</translation>
 <translation id="1195667586424773550">Vilkt saiti uz cilnes adreses joslu</translation>
 <translation id="1204450209689312104">Atvērt jaunu logu inkognito režīmā</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Pievienot www. un .com ievadītajam tekstam adreses joslā, pēc tam atvērt lapu</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, pēc tam <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> vai <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivizēt virtuālo darbvietu kreisajā pusē</translation>
 <translation id="1996162290124031907">Pāriet uz nākamo cilni</translation>
 <translation id="2010818616644390445">Pāriet uz loga pēdējo cilni</translation>
 <translation id="2040706009561734834">Atvērt/aizvērt palaidēju</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Uzņemt ekrānuzņēmumu</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Iezīmēt adreses joslu</translation>
-<translation id="3165428420335997629">Izveidot jaunu virtuālo darbvietu</translation>
 <translation id="3256109297135787951">Noņemt plauktā izceltā vienuma izcelšanu</translation>
 <translation id="3288816184963444640">Aizvērt pašreizējo logu</translation>
 <translation id="3407560819924487926">Parādīt uzdevumu pārvaldnieku</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Pagriezt ekrānu par 90 grādiem</translation>
 <translation id="8241665785394195545">labā iekava</translation>
 <translation id="8264941229485248811">Rādīt vai paslēpt izstrādātāja rīku kontrolieri</translation>
-<translation id="8355937569537581904">Noņemt virtuālo darbvietu</translation>
 <translation id="836869401750819675">Atvērt lapu Lejupielādes</translation>
 <translation id="8388247778047144397">Vilkt saiti uz tukšu apgabalu ciļņu joslā</translation>
 <translation id="8389638407792712197">Atvērt jaunu logu</translation>
diff --git a/ash/components/strings/ash_components_strings_ml.xtb b/ash/components/strings/ash_components_strings_ml.xtb
index 5a6d61f..b0bb87f 100644
--- a/ash/components/strings/ash_components_strings_ml.xtb
+++ b/ash/components/strings/ash_components_strings_ml.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ml">
 <translation id="1036550831858290950">നിങ്ങളുടെ നിലവിലെ ടാബ് ഒരു ബുക്ക്‌മാർക്ക് ആയി സംരക്ഷിക്കുക</translation>
 <translation id="104962181688258143">'ഫയലുകൾ' ആപ്പ് തുറക്കുക</translation>
-<translation id="1098295134904615027">വലതുവശത്ത് വെർച്വൽ ഡെസ്‌ക് സജീവമാക്കുക</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> എന്നതിനായി <ph name="N" /> തിരയൽ ഫലങ്ങൾ കാണിക്കുന്നു</translation>
 <translation id="1195667586424773550">ടാബിന്റെ വിലാസ ബാറിലേക്ക് ലിങ്ക് വലിച്ചിടുക</translation>
 <translation id="1204450209689312104">അദൃശ്യ മോഡിൽ പുതിയൊരു വിൻഡോ തുറക്കുക</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">വിലാസ ബാറിലെ നിങ്ങളുടെ ഇന്‍‌പുട്ടിൽ www., .com എന്നിവ ചേർത്ത ശേഷം പേജ് തുറക്കുക</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, തുടർന്ന് <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> അല്ലെങ്കിൽ <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">ഇടതുവശത്ത് വെർച്വൽ ഡെസ്‌ക് സജീവമാക്കുക</translation>
 <translation id="1996162290124031907">അടുത്ത ടാബിലേക്ക് പോവുക</translation>
 <translation id="2010818616644390445">വിൻഡോയിലെ അവസാന ടാബിലേക്ക് പോവുക</translation>
 <translation id="2040706009561734834">ലോഞ്ചർ തുറക്കുക/അടയ്ക്കുക</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">സ്ക്രീന്‍ഷോട്ട് എടുക്കുക</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">വിലാസ ബാര്‍ ഫോക്കസ് ചെയ്യുക</translation>
-<translation id="3165428420335997629">പുതിയ വെർച്വൽ ഡെസ്‌ക് സൃഷ്‌ടിക്കുക</translation>
 <translation id="3256109297135787951">നിങ്ങളുടെ ഷെൽഫിലെ ഒരു ഇനത്തിൽ നിന്ന് ഹൈലൈറ്റ് നീക്കം ചെയ്യുക</translation>
 <translation id="3288816184963444640">നിലവിലെ വിൻഡോ അടയ്‌ക്കുക</translation>
 <translation id="3407560819924487926">ടാസ്‌ക് മാനേജർ ഉപയോഗപ്പെടുത്തുക</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">സ്‌ക്രീൻ 90 ഡിഗ്രി തിരിക്കുക</translation>
 <translation id="8241665785394195545">വലത് ബ്രാക്കറ്റ്</translation>
 <translation id="8264941229485248811">ഡെവലപ്പര്‍ ടൂൾസ് ഇൻസ്‌പെക്‌ടർ കാണിക്കുക അല്ലെങ്കിൽ അദൃശ്യമാക്കുക</translation>
-<translation id="8355937569537581904">നിലവിലെ വെർച്വൽ ഡെസ്‌ക് നീക്കം ചെയ്യുക</translation>
 <translation id="836869401750819675">ഡൗൺലോഡുകളുടെ പേജ് തുറക്കുക</translation>
 <translation id="8388247778047144397">ടാബ് സ്‌ട്രിപ്പിലെ ശൂന്യമായ ഏരിയയിലേക്ക് ലിങ്ക് വലിച്ചിടുക</translation>
 <translation id="8389638407792712197">പുതിയ വിൻഡോ തുറക്കുക</translation>
diff --git a/ash/components/strings/ash_components_strings_mr.xtb b/ash/components/strings/ash_components_strings_mr.xtb
index 0fdfab1..8369b6b 100644
--- a/ash/components/strings/ash_components_strings_mr.xtb
+++ b/ash/components/strings/ash_components_strings_mr.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="mr">
 <translation id="1036550831858290950">तुमचा सध्याचा टॅब बुकमार्क म्हणून सेव्ह करा</translation>
 <translation id="104962181688258143">फायली अ‍ॅप उघडा</translation>
-<translation id="1098295134904615027">व्हर्च्युअल डेस्क उजवीकडे सुरू करा</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> साठी <ph name="N" /> शोध परिणाम दाखवत आहे</translation>
 <translation id="1195667586424773550">लिंक ड्रॅग करून टॅबच्या अ‍ॅड्रेस बारवर आणा</translation>
 <translation id="1204450209689312104">एक नवीन विंडो गुप्त मोडमध्ये उघडा</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">अ‍ॅड्रेस बारमधील तुमच्या इनपुटमध्ये www. आणि .com जोडा, त्यानंतर पेज उघडा</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, त्यानंतर <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> किंवा <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">व्हर्च्युअल डेस्क डावीकडे सुरू करा</translation>
 <translation id="1996162290124031907">पुढील टॅबवर जा</translation>
 <translation id="2010818616644390445">विंडोमधील अंतिम टॅबवर जा</translation>
 <translation id="2040706009561734834">लाँचर उघडा/बंद करा</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">स्क्रीनशॉट घ्या</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">अ‍ॅड्रेस बारवर फोकस करा</translation>
-<translation id="3165428420335997629">नवीन व्हर्च्युअल डेस्क तयार करा</translation>
 <translation id="3256109297135787951">तुमच्या शेल्फवरील आयटमवरील हायलाइट काढून टाका</translation>
 <translation id="3288816184963444640">ही विंडो बंद करा</translation>
 <translation id="3407560819924487926">टास्क मॅनेजर वर आणा</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">स्क्रीन ९० अंशात फिरवा</translation>
 <translation id="8241665785394195545">उजवा कंस</translation>
 <translation id="8264941229485248811">डेव्हलपर टूल परीक्षक दाखवा किंवा लपवा</translation>
-<translation id="8355937569537581904">सध्याचा व्हर्च्युअल डेस्क काढून टाका</translation>
 <translation id="836869401750819675">डाउनलोड पेज उघडा</translation>
 <translation id="8388247778047144397">टॅब स्ट्रिपवरील एका रिक्त भागावर एखादी लिंक ड्रॅग करा</translation>
 <translation id="8389638407792712197">नवीन विंडो उघडा</translation>
diff --git a/ash/components/strings/ash_components_strings_ms.xtb b/ash/components/strings/ash_components_strings_ms.xtb
index 4c814842..e2f1871 100644
--- a/ash/components/strings/ash_components_strings_ms.xtb
+++ b/ash/components/strings/ash_components_strings_ms.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ms">
 <translation id="1036550831858290950">Simpan tab semasa anda sebagai penanda halaman</translation>
 <translation id="104962181688258143">Buka apl Fail</translation>
-<translation id="1098295134904615027">Aktifkan meja maya di sebelah kanan</translation>
 <translation id="1122869341872663659">Memaparkan <ph name="N" /> hasil carian untuk <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Seret pautan ke bar alamat tab</translation>
 <translation id="1204450209689312104">Buka tetingkap baharu dalam mod inkognito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Tambahkan www. dan .com pada input dalam bar alamat, kemudian buka halaman</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, kemudian <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> atau <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktifkan meja maya di sebelah kiri</translation>
 <translation id="1996162290124031907">Pergi ke tab seterusnya</translation>
 <translation id="2010818616644390445">Pergi ke tab terakhir dalam tetingkap</translation>
 <translation id="2040706009561734834">Buka/tutup pelancar</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ambil tangkapan skrin</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Tumpukan bar alamat</translation>
-<translation id="3165428420335997629">Buat meja maya baharu</translation>
 <translation id="3256109297135787951">Buang serlahan daripada item pada rak anda</translation>
 <translation id="3288816184963444640">Tutup tetingkap semasa</translation>
 <translation id="3407560819924487926">Paparkan pengurus tugas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Putar skrin 90 darjah</translation>
 <translation id="8241665785394195545">tanda kurung kanan</translation>
 <translation id="8264941229485248811">Tunjukkan atau sembunyikan pemeriksa Alat Pembangun</translation>
-<translation id="8355937569537581904">Alih keluar meja maya semasa</translation>
 <translation id="836869401750819675">Buka halaman Muat Turun</translation>
 <translation id="8388247778047144397">Seret pautan ke bahagian kosong pada jalur tab</translation>
 <translation id="8389638407792712197">Buka tetingkap baharu</translation>
diff --git a/ash/components/strings/ash_components_strings_nl.xtb b/ash/components/strings/ash_components_strings_nl.xtb
index ec559b62..8cbd2ca 100644
--- a/ash/components/strings/ash_components_strings_nl.xtb
+++ b/ash/components/strings/ash_components_strings_nl.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="nl">
 <translation id="1036550831858290950">Het huidige tabblad als bladwijzer opslaan</translation>
 <translation id="104962181688258143">De app Bestanden openen</translation>
-<translation id="1098295134904615027">Het virtuele bureau aan de rechterkant activeren</translation>
 <translation id="1122869341872663659">Er worden <ph name="N" /> zoekresultaten voor <ph name="QUERY" /> getoond</translation>
 <translation id="1195667586424773550">Sleep de link naar de adresbalk van het tabblad</translation>
 <translation id="1204450209689312104">Een nieuw venster openen in de incognitomodus</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">www. en .com toevoegen aan je invoer in de adresbalk en de pagina vervolgens openen</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, en dan <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> of <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Het virtuele bureaublad aan de linkerkant activeren</translation>
 <translation id="1996162290124031907">Naar het volgende tabblad gaan</translation>
 <translation id="2010818616644390445">Naar het laatste tabblad in het venster gaan</translation>
 <translation id="2040706009561734834">De launcher openen/sluiten</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Screenshot maken</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Adresbalk activeren</translation>
-<translation id="3165428420335997629">Een nieuw virtueel bureau maken</translation>
 <translation id="3256109297135787951">De markering voor een item op je plank verwijderen</translation>
 <translation id="3288816184963444640">Het huidige venster sluiten</translation>
 <translation id="3407560819924487926">Taakbeheer weergeven</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Scherm 90 graden draaien</translation>
 <translation id="8241665785394195545">rechte haak rechts</translation>
 <translation id="8264941229485248811">De Developer Tools-inspector weergeven of verbergen</translation>
-<translation id="8355937569537581904">Het huidige virtuele bureaublad verwijderen</translation>
 <translation id="836869401750819675">De pagina Downloads openen</translation>
 <translation id="8388247778047144397">Sleep de link naar een blanco gedeelte van de tabbladstrook</translation>
 <translation id="8389638407792712197">Nieuw venster openen</translation>
diff --git a/ash/components/strings/ash_components_strings_no.xtb b/ash/components/strings/ash_components_strings_no.xtb
index 149f2067..5d24698 100644
--- a/ash/components/strings/ash_components_strings_no.xtb
+++ b/ash/components/strings/ash_components_strings_no.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="no">
 <translation id="1036550831858290950">Lagre den aktive fanen som bokmerke</translation>
 <translation id="104962181688258143">Åpne Filer-appen</translation>
-<translation id="1098295134904615027">Aktivér det virtuelle skrivebordet til høyre</translation>
 <translation id="1122869341872663659">Viser <ph name="N" /> søkeresultater for <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Dra linken til adressefeltet i fanen</translation>
 <translation id="1204450209689312104">Åpne et nytt vindu i inkognitomodus</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Legg til www. og .com i det du har skrevet i adressefeltet, og åpne siden</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> og så <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> eller <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivér det virtuelle skrivebordet til venstre</translation>
 <translation id="1996162290124031907">Gå til neste fane</translation>
 <translation id="2010818616644390445">Gå til den siste fanen i vinduet</translation>
 <translation id="2040706009561734834">Åpne/lukk appoversikten</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ta skjermdump</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokuser adressefelt</translation>
-<translation id="3165428420335997629">Opprett et nytt virtuelt skrivebord</translation>
 <translation id="3256109297135787951">Fjern fremhevingen av et element på hyllen</translation>
 <translation id="3288816184963444640">Lukk det aktive vinduet</translation>
 <translation id="3407560819924487926">Hent frem oppgavebehandlingen</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rotér skjermen 90 grader</translation>
 <translation id="8241665785394195545">høyre hakeparentes</translation>
 <translation id="8264941229485248811">Vis eller skjul inspektøren for utviklerverktøy</translation>
-<translation id="8355937569537581904">Fjern det gjeldende virtuelle skrivebordet</translation>
 <translation id="836869401750819675">Åpne nedlastingssiden</translation>
 <translation id="8388247778047144397">Dra linken til et tomt område på faneraden.</translation>
 <translation id="8389638407792712197">Åpne et nytt vindu</translation>
diff --git a/ash/components/strings/ash_components_strings_pl.xtb b/ash/components/strings/ash_components_strings_pl.xtb
index ffe209b..48ee79b 100644
--- a/ash/components/strings/ash_components_strings_pl.xtb
+++ b/ash/components/strings/ash_components_strings_pl.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="pl">
 <translation id="1036550831858290950">Zapisz bieżącą kartę jako zakładkę</translation>
 <translation id="104962181688258143">Otwórz aplikację Pliki</translation>
-<translation id="1098295134904615027">Aktywuj wirtualne biurko po prawej</translation>
 <translation id="1122869341872663659">Wyświetlam wyniki wyszukiwania (<ph name="N" />) dla: <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Przeciągnij link na pasek adresu na karcie</translation>
 <translation id="1204450209689312104">Otwórz nowe okno w trybie incognito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Dodaj www. i .com do ciągu wpisanego w pasku adresu i otwórz stronę</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, a następnie <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> lub <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktywuj wirtualne biurko po lewej</translation>
 <translation id="1996162290124031907">Przejdź do następnej karty</translation>
 <translation id="2010818616644390445">Przejdź do ostatniej karty w oknie</translation>
 <translation id="2040706009561734834">Otwórz/zamknij menu z aplikacjami</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Zapisz zrzut ekranu</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Zaznacz pasek adresu</translation>
-<translation id="3165428420335997629">Utwórz nowe wirtualne biurko</translation>
 <translation id="3256109297135787951">Anuluj zaznaczenia elementu na półce</translation>
 <translation id="3288816184963444640">Zamknij bieżące okno</translation>
 <translation id="3407560819924487926">Otwórz menedżera zadań</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Obróć ekran o 90 stopni</translation>
 <translation id="8241665785394195545">prawy nawias</translation>
 <translation id="8264941229485248811">Pokaż lub ukryj inspektora z Narzędzi dla deweloperów</translation>
-<translation id="8355937569537581904">Usuń bieżące wirtualne biurko</translation>
 <translation id="836869401750819675">Otwórz stronę Pobrane pliki</translation>
 <translation id="8388247778047144397">Przeciągnij link na pusty obszar na pasku kart</translation>
 <translation id="8389638407792712197">Otwórz nowe okno</translation>
diff --git a/ash/components/strings/ash_components_strings_pt-BR.xtb b/ash/components/strings/ash_components_strings_pt-BR.xtb
index ec060c1b..6b19327 100644
--- a/ash/components/strings/ash_components_strings_pt-BR.xtb
+++ b/ash/components/strings/ash_components_strings_pt-BR.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="pt-BR">
 <translation id="1036550831858290950">Salvar a guia atual nos favoritos</translation>
 <translation id="104962181688258143">Abrir o app Arquivos</translation>
-<translation id="1098295134904615027">Ativar a área de trabalho à direita</translation>
 <translation id="1122869341872663659">Exibindo <ph name="N" /> resultados da pesquisa para <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Arrastar o link até a barra de endereço da guia</translation>
 <translation id="1204450209689312104">Abrir uma nova janela no modo de navegação anônima</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Adicionar www. e .com à entrada na barra de endereço e depois abrir a página</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> e depois <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ou <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Ativar a área de trabalho à esquerda</translation>
 <translation id="1996162290124031907">Ir para a próxima guia</translation>
 <translation id="2010818616644390445">Ir para a última guia da janela</translation>
 <translation id="2040706009561734834">Abrir/fechar o acesso rápido</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Faça uma captura de tela</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Foco na barra de endereço</translation>
-<translation id="3165428420335997629">Criar uma nova área de trabalho virtual</translation>
 <translation id="3256109297135787951">Remover o destaque de um item na estante</translation>
 <translation id="3288816184963444640">Fechar a janela atual</translation>
 <translation id="3407560819924487926">Abrir o gerenciador de tarefas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Girar a tela em 90 graus</translation>
 <translation id="8241665785394195545">colchete direito</translation>
 <translation id="8264941229485248811">Mostrar ou ocultar o inspetor de Ferramentas para Desenvolvedores</translation>
-<translation id="8355937569537581904">Remover área de trabalho virtual atual</translation>
 <translation id="836869401750819675">Abrir Downloads</translation>
 <translation id="8388247778047144397">Arrastar o link até uma área em branco na barra de guias</translation>
 <translation id="8389638407792712197">Abrir nova janela</translation>
diff --git a/ash/components/strings/ash_components_strings_pt-PT.xtb b/ash/components/strings/ash_components_strings_pt-PT.xtb
index 96ae1215..bdc29c4 100644
--- a/ash/components/strings/ash_components_strings_pt-PT.xtb
+++ b/ash/components/strings/ash_components_strings_pt-PT.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="pt-PT">
 <translation id="1036550831858290950">Guarde o separador atual como um marcador</translation>
 <translation id="104962181688258143">Abrir a aplicação Ficheiros</translation>
-<translation id="1098295134904615027">Ative o espaço de trabalho virtual à direita.</translation>
 <translation id="1122869341872663659">A apresentar <ph name="N" /> resultados da pesquisa para <ph name="QUERY" />.</translation>
 <translation id="1195667586424773550">Arraste o link para a barra de endereço do separador.</translation>
 <translation id="1204450209689312104">Abrir uma nova janela em modo de navegação anónima</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Adicionar www. e .com à informação introduzida na barra de endereço e, em seguida, abrir a página</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> e, em seguida, <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> ou <ph name="LEFT" />.</translation>
-<translation id="1929866390202038233">Ative o espaço de trabalho virtual à esquerda.</translation>
 <translation id="1996162290124031907">Aceder ao separador seguinte</translation>
 <translation id="2010818616644390445">Ir para o último separador na janela</translation>
 <translation id="2040706009561734834">Abrir/fechar o iniciador</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Criar captura de ecrã</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Focar barra de endereço</translation>
-<translation id="3165428420335997629">Crie um novo espaço de trabalho virtual.</translation>
 <translation id="3256109297135787951">Remover o realce de um item na prateleira</translation>
 <translation id="3288816184963444640">Fechar a janela atual</translation>
 <translation id="3407560819924487926">Abrir o Gestor de tarefas</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rodar o ecrã 90 graus</translation>
 <translation id="8241665785394195545">parêntese reto direito</translation>
 <translation id="8264941229485248811">Mostrar ou ocultar o inspetor das Ferramentas do programador</translation>
-<translation id="8355937569537581904">Remova o espaço de trabalho virtual atual.</translation>
 <translation id="836869401750819675">Abrir a página Transferências</translation>
 <translation id="8388247778047144397">Arraste o link para uma área em branco na Faixa de separadores.</translation>
 <translation id="8389638407792712197">Abrir nova janela</translation>
diff --git a/ash/components/strings/ash_components_strings_ro.xtb b/ash/components/strings/ash_components_strings_ro.xtb
index e1a0b664..f26f45e 100644
--- a/ash/components/strings/ash_components_strings_ro.xtb
+++ b/ash/components/strings/ash_components_strings_ro.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ro">
 <translation id="1036550831858290950">Salvează fila actuală ca marcaj</translation>
 <translation id="104962181688258143">Deschide aplicația Fișiere</translation>
-<translation id="1098295134904615027">Activează desktopul virtual din dreapta</translation>
 <translation id="1122869341872663659">Se afișează <ph name="N" /> rezultate ale căutării pentru <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Trage linkul în bara de adrese a filei</translation>
 <translation id="1204450209689312104">Deschide o fereastră nouă în modul incognito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Adăugă www. și .com la ce ai introdus în bara de adrese, apoi deschide pagina</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, apoi <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> sau <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Activează desktopul virtual din stânga</translation>
 <translation id="1996162290124031907">Accesează fila următoare</translation>
 <translation id="2010818616644390445">Accesează ultima filă din fereastră</translation>
 <translation id="2040706009561734834">Deschide/închide lansatorul</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Realizează o captură de ecran</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Focalizează pe bara de adrese</translation>
-<translation id="3165428420335997629">Creează un nou desktop virtual</translation>
 <translation id="3256109297135787951">Elimină evidențierea de pe un element de pe raft</translation>
 <translation id="3288816184963444640">Închide fereastra curentă</translation>
 <translation id="3407560819924487926">Afișează managerul de activități</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rotește ecranul la 90 de grade</translation>
 <translation id="8241665785394195545">paranteză de dreapta</translation>
 <translation id="8264941229485248811">Afișează sau ascunde inspectorul Developer Tools</translation>
-<translation id="8355937569537581904">Elimină desktopul virtual actual</translation>
 <translation id="836869401750819675">Deschide pagina Descărcări</translation>
 <translation id="8388247778047144397">Trage linkul într-o zonă liberă a barei de file</translation>
 <translation id="8389638407792712197">Deschide o fereastră nouă</translation>
diff --git a/ash/components/strings/ash_components_strings_ru.xtb b/ash/components/strings/ash_components_strings_ru.xtb
index df89400..0a80acb 100644
--- a/ash/components/strings/ash_components_strings_ru.xtb
+++ b/ash/components/strings/ash_components_strings_ru.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ru">
 <translation id="1036550831858290950">Сохранить текущую вкладку в закладках</translation>
 <translation id="104962181688258143">Открыть приложение "Файлы"</translation>
-<translation id="1098295134904615027">Включить виртуальный рабочий стол справа</translation>
 <translation id="1122869341872663659">Результатов поиска по запросу "<ph name="QUERY" />": <ph name="N" /></translation>
 <translation id="1195667586424773550">Перетащить ссылку в адресную строку вкладки</translation>
 <translation id="1204450209689312104">Открыть новое окно в режиме инкогнито</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Добавить www. и .com к тексту в адресной строке и открыть веб-страницу</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, затем <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> или <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Включить виртуальный рабочий стол слева</translation>
 <translation id="1996162290124031907">Перейти на следующую вкладку</translation>
 <translation id="2010818616644390445">Перейти на последнюю вкладку в окне</translation>
 <translation id="2040706009561734834">Открыть или закрыть панель запуска</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Скриншот</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Курсор в адресную строку</translation>
-<translation id="3165428420335997629">Создать виртуальный рабочий стол</translation>
 <translation id="3256109297135787951">Снять выделение с объекта на панели запуска.</translation>
 <translation id="3288816184963444640">Закрыть активное окно</translation>
 <translation id="3407560819924487926">Открыть диспетчер задач</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Повернуть экран на 90 градусов</translation>
 <translation id="8241665785394195545">правая скобка</translation>
 <translation id="8264941229485248811">Показать или скрыть инспектор инструментов разработчика</translation>
-<translation id="8355937569537581904">Удалить текущий виртуальный рабочий стол</translation>
 <translation id="836869401750819675">Открыть страницу "Скачанные файлы"</translation>
 <translation id="8388247778047144397">Перетащить ссылку в пустую область на панели вкладок</translation>
 <translation id="8389638407792712197">Открыть новое окно</translation>
diff --git a/ash/components/strings/ash_components_strings_sk.xtb b/ash/components/strings/ash_components_strings_sk.xtb
index 34b0297..3e7bcc4 100644
--- a/ash/components/strings/ash_components_strings_sk.xtb
+++ b/ash/components/strings/ash_components_strings_sk.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="sk">
 <translation id="1036550831858290950">Uložiť aktuálnu kartu ako záložku</translation>
 <translation id="104962181688258143">Otvorenie aplikácie Súbory</translation>
-<translation id="1098295134904615027">Aktivovať virtuálne pracovné prostredie napravo</translation>
 <translation id="1122869341872663659">Zobrazujú sa výsledky vyhľadávania (<ph name="N" />) na tému <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Presunutie odkazu na panel s adresou na karte</translation>
 <translation id="1204450209689312104">Otvorenie nového okna v režime inkognito</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Pridanie predpony www. a prípony .com k zadanému vstupu v paneli s adresou a následné otvorenie stránky</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, potom <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> alebo <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivovať virtuálne pracovné prostredie naľavo</translation>
 <translation id="1996162290124031907">Prechod na ďalšiu kartu</translation>
 <translation id="2010818616644390445">Prechod na poslednú kartu v okne</translation>
 <translation id="2040706009561734834">Otvoriť/zavrieť spúšťač</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Nasnímať obrazovku</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Zamerať na panel s adresou</translation>
-<translation id="3165428420335997629">Vytvoriť nové virtuálne pracovné prostredie</translation>
 <translation id="3256109297135787951">Odstránenie zvýraznenia položky na poličke</translation>
 <translation id="3288816184963444640">Zavretie aktuálneho okna</translation>
 <translation id="3407560819924487926">Zobrazenie správcu úloh</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Otočenie obrazovky o 90 stupňov</translation>
 <translation id="8241665785394195545">pravá hranatá zátvorka</translation>
 <translation id="8264941229485248811">Zobrazenie alebo skrytie kontroly s nástrojmi pre vývojárov</translation>
-<translation id="8355937569537581904">Odstrániť aktuálne virtuálne pracovné prostredie</translation>
 <translation id="836869401750819675">Otvorenie stránky Stiahnuté súbory</translation>
 <translation id="8388247778047144397">Presunutie odkazu do prázdnej oblasti na paneli kariet</translation>
 <translation id="8389638407792712197">Otvorenie nového okna</translation>
diff --git a/ash/components/strings/ash_components_strings_sl.xtb b/ash/components/strings/ash_components_strings_sl.xtb
index d6d3345..6b98f87 100644
--- a/ash/components/strings/ash_components_strings_sl.xtb
+++ b/ash/components/strings/ash_components_strings_sl.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="sl">
 <translation id="1036550831858290950">Shranjevanje trenutnega zavihka kot zaznamka</translation>
 <translation id="104962181688258143">Odpiranje aplikacije Datoteke</translation>
-<translation id="1098295134904615027">Aktiviranje navideznega namizja na desni</translation>
 <translation id="1122869341872663659">Prikaz toliko rezultatov iskanja za poizvedbo <ph name="QUERY" />: <ph name="N" /></translation>
 <translation id="1195667586424773550">Povlecite povezavo v naslovno vrstico zavihka</translation>
 <translation id="1204450209689312104">Odpiranje novega okna v načinu brez beleženja zgodovine</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /> <ph name="SEPARATOR1" /> <ph name="MODIFIER2" /> <ph name="SEPARATOR2" /> <ph name="KEY" /></translation>
 <translation id="1733525068429116555">Dodajanje www. in .com vnosu v naslovni vrstici, nato pa odpiranje strani</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /> <ph name="SEPARATOR1" /> <ph name="ALT" /> <ph name="SEPARATOR2" /> <ph name="L" />, nato <ph name="SHIFT2" /> <ph name="SEPARATOR3" /> <ph name="TAB" /> ali <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktiviranje navideznega namizja na levi</translation>
 <translation id="1996162290124031907">Premik na naslednji zavihek</translation>
 <translation id="2010818616644390445">Premik na zadnji zavihek v oknu</translation>
 <translation id="2040706009561734834">Odpiranje/zapiranje zaganjalnika</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Izdelava posnetka zaslona</translation>
 <translation id="3126026824346185272">CTRL</translation>
 <translation id="3140353188828248647">Preklopi na naslovno vrstico</translation>
-<translation id="3165428420335997629">Ustvarjanje novega navideznega namizja</translation>
 <translation id="3256109297135787951">Opustitev označevanja elementa na polici</translation>
 <translation id="3288816184963444640">Zapiranje trenutnega okna</translation>
 <translation id="3407560819924487926">Prikazovanje upravitelja opravil</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Sukanje zaslona za 90 stopinj</translation>
 <translation id="8241665785394195545">zaklepaj</translation>
 <translation id="8264941229485248811">Prikaz ali skrivanje nadzornika orodij za razvijalce</translation>
-<translation id="8355937569537581904">Odstranitev trenutnega navideznega namizja</translation>
 <translation id="836869401750819675">Odpiranje strani s prenosi</translation>
 <translation id="8388247778047144397">Povlecite povezavo na prazno območje na traku z zavihki</translation>
 <translation id="8389638407792712197">Odpiranje novega okna</translation>
diff --git a/ash/components/strings/ash_components_strings_sr.xtb b/ash/components/strings/ash_components_strings_sr.xtb
index 7f63333..3f0b55a 100644
--- a/ash/components/strings/ash_components_strings_sr.xtb
+++ b/ash/components/strings/ash_components_strings_sr.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="sr">
 <translation id="1036550831858290950">Сачувајте тренутну картицу као обележивач</translation>
 <translation id="104962181688258143">Отворите апликацију Датотеке</translation>
-<translation id="1098295134904615027">Активирајте виртуелну радну површину на десној страни</translation>
 <translation id="1122869341872663659">Приказује резултате претраге (<ph name="N" />) за упит <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Превуците линк у траку за адресу картице</translation>
 <translation id="1204450209689312104">Отворите нови прозор у режиму без архивирања</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Додајте елементе www. и .com уносу у траци за адресу, па отворите страницу</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, па <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> или <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Активирајте виртуелну радну површину на левој страни</translation>
 <translation id="1996162290124031907">Идите на следећу картицу</translation>
 <translation id="2010818616644390445">Идите на последњу картицу у прозору</translation>
 <translation id="2040706009561734834">Отворите/затворите покретач</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Сними екран</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Фокусирање траке за адресу</translation>
-<translation id="3165428420335997629">Направите нову вуртуелну радну површину</translation>
 <translation id="3256109297135787951">Уклоните истицање са ставке на полици</translation>
 <translation id="3288816184963444640">Затворите тренутно отворени прозор</translation>
 <translation id="3407560819924487926">Покрените менаџер задатка</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Ротирајте екран за 90 степени</translation>
 <translation id="8241665785394195545">десна заграда</translation>
 <translation id="8264941229485248811">Прикажите или сакријте инспектор Алатке за програмере</translation>
-<translation id="8355937569537581904">Уклоните актуелну виртуелну радну површину</translation>
 <translation id="836869401750819675">Отворите страницу Преузимања</translation>
 <translation id="8388247778047144397">Превуците линк у празну област на траци са картицама</translation>
 <translation id="8389638407792712197">Отворите нови прозор</translation>
diff --git a/ash/components/strings/ash_components_strings_sv.xtb b/ash/components/strings/ash_components_strings_sv.xtb
index fea6388..adbf641 100644
--- a/ash/components/strings/ash_components_strings_sv.xtb
+++ b/ash/components/strings/ash_components_strings_sv.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="sv">
 <translation id="1036550831858290950">Spara den aktuella fliken som ett bokmärke</translation>
 <translation id="104962181688258143">Öppna appen Filer</translation>
-<translation id="1098295134904615027">Aktivera det virtuella skrivbordet till höger</translation>
 <translation id="1122869341872663659">Visar <ph name="N" /> sökresultat för <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Dra länken till flikens adressfält</translation>
 <translation id="1204450209689312104">Öppna ett nytt fönster i inkognitoläge</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Lägg till www. och .com före och efter det du skriver i adressfältet och öppna sedan sidan</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, sedan <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> eller <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Aktivera det virtuella skrivbordet till vänster</translation>
 <translation id="1996162290124031907">Öppna nästa flik</translation>
 <translation id="2010818616644390445">Öppna den sista fliken i fönstret</translation>
 <translation id="2040706009561734834">Öppna eller stäng översikten</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ta skärmbild</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Fokusera på adressfältet</translation>
-<translation id="3165428420335997629">Skapa ett nytt virtuellt skrivbord</translation>
 <translation id="3256109297135787951">Ta bort markeringen från ett objekt på hyllan</translation>
 <translation id="3288816184963444640">Stäng aktuellt fönster</translation>
 <translation id="3407560819924487926">Öppna aktivitetshanteraren</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Rotera skärmen 90 grader</translation>
 <translation id="8241665785394195545">höger parentes</translation>
 <translation id="8264941229485248811">Visa eller dölj Utvecklarverktyg-inspektören</translation>
-<translation id="8355937569537581904">Ta bort det aktuella virtuella skrivbordet</translation>
 <translation id="836869401750819675">Öppna sidan Nedladdningar</translation>
 <translation id="8388247778047144397">Dra länken till ett tomt område i flikhuvudet</translation>
 <translation id="8389638407792712197">Öppna nytt fönster</translation>
diff --git a/ash/components/strings/ash_components_strings_sw.xtb b/ash/components/strings/ash_components_strings_sw.xtb
index 0e9df505..c6b107e 100644
--- a/ash/components/strings/ash_components_strings_sw.xtb
+++ b/ash/components/strings/ash_components_strings_sw.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="sw">
 <translation id="1036550831858290950">Hifadhi kichupo cha sasa kiwe alamisho</translation>
 <translation id="104962181688258143">Fungua programu ya Faili</translation>
-<translation id="1098295134904615027">Washa kiolesura cha kulia</translation>
 <translation id="1122869341872663659">Inaonyesha matokeo <ph name="N" /> ya utafutaji wa <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Buruta kiungo hadi kwenye sehemu ya anwani katika kichupo</translation>
 <translation id="1204450209689312104">Fungua dirisha jipya katika hali fiche</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Ongeza www. na .com kwenye maandishi uliyoandika katika sehemu ya anwani, kisha ufungue ukurasa</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, kisha <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> au <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Washa kiolesura cha kushoto</translation>
 <translation id="1996162290124031907">Nenda kwenye kichupo kinachofuata</translation>
 <translation id="2010818616644390445">Nenda kwenye kichupo cha mwisho katika dirisha</translation>
 <translation id="2040706009561734834">Fungua au ufunge kifungua programu</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Piga picha ya skrini</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Lenga upau anwani</translation>
-<translation id="3165428420335997629">Weka kiolesura kipya</translation>
 <translation id="3256109297135787951">Acha kuangazia kipengee kwenye rafu yako</translation>
 <translation id="3288816184963444640">Funga dirisha la sasa</translation>
 <translation id="3407560819924487926">Fungua kidhibiti cha shughuli kwenye Chrome</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Zungusha skrini kwa digrii 90</translation>
 <translation id="8241665785394195545">bano la kulia</translation>
 <translation id="8264941229485248811">Onyesha au ufiche kikaguzi cha Zana za Wasanidi Programu</translation>
-<translation id="8355937569537581904">Ondoa kiolesura cha sasa</translation>
 <translation id="836869401750819675">Fungua ukurasa wa Vipakuliwa</translation>
 <translation id="8388247778047144397">Buruta kiungo kwenye sehemu tupu katika ukanda wa vichupo</translation>
 <translation id="8389638407792712197">Fungua dirisha jipya</translation>
diff --git a/ash/components/strings/ash_components_strings_ta.xtb b/ash/components/strings/ash_components_strings_ta.xtb
index 7f5c6e7..1c4e901 100644
--- a/ash/components/strings/ash_components_strings_ta.xtb
+++ b/ash/components/strings/ash_components_strings_ta.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="ta">
 <translation id="1036550831858290950">தற்போதைய தாவலை புக்மார்க்காகச் சேமிக்கும்</translation>
 <translation id="104962181688258143">கோப்புகள் பயன்பாட்டைத் திறக்கும்</translation>
-<translation id="1098295134904615027">விர்ச்சுவல் டெஸ்க்கை வலதுபுறத்தில் இயக்கும்</translation>
 <translation id="1122869341872663659"><ph name="QUERY" />க்கான <ph name="N" /> தேடல் முடிவுகளைக் காட்டுகிறது</translation>
 <translation id="1195667586424773550">தாவலின் முகவரிப் பட்டிக்கு இணைப்பை இழுக்கவும்</translation>
 <translation id="1204450209689312104">புதிய சாளரத்தை மறைநிலையில் திறக்கும்</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">முகவரிப் பட்டியில் உங்கள் உள்ளீட்டில் www., .com ஆகியவற்றைச் சேர்த்து, பின்னர் பக்கத்தைத் திறக்கும்</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, பின்னர் <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> அல்லது <ph name="LEFT" />ஐ அழுத்தவும்</translation>
-<translation id="1929866390202038233">விர்ச்சுவல் டெஸ்க்கை இடதுபுறத்தில் இயக்கும்</translation>
 <translation id="1996162290124031907">அடுத்த தாவலுக்குச் செல்லும்</translation>
 <translation id="2010818616644390445">சாளரத்தில் கடைசித் தாவலுக்குச் செல்லும்</translation>
 <translation id="2040706009561734834">தொடக்கியைத் திறக்கும்/மூடும்</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">ஸ்கிரீன் ஷாட்டை எடுக்கும்</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">முகவரிப் பட்டியைக் கவனித்திடுங்கள்</translation>
-<translation id="3165428420335997629">புதிய விர்ச்சுவல் டெஸ்க்கை உருவாக்கும்</translation>
 <translation id="3256109297135787951">உங்கள் ஷெல்ஃபில் உருப்படியைத் தனிப்படுத்தியதை அகற்றும்</translation>
 <translation id="3288816184963444640">தற்போதைய சாளரத்தை மூடும்</translation>
 <translation id="3407560819924487926">செயல் நிர்வாகியைத் திறக்கும்</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">திரையை 90 டிகிரிக்குச் சுழற்றும்</translation>
 <translation id="8241665785394195545">வலது அடைப்புக்குறி</translation>
 <translation id="8264941229485248811">டெவெலப்பர் கருவிகள் கண்காணிப்பானைக் காட்டும் அல்லது மறைக்கும்</translation>
-<translation id="8355937569537581904">தற்போதைய விர்ச்சுவல் டெஸ்க்கை அகற்றும்</translation>
 <translation id="836869401750819675">பதிவிறக்கங்கள் பக்கத்தைத் திறக்கும்</translation>
 <translation id="8388247778047144397">தாவல் பட்டையில் உள்ள வெற்றுப் பகுதியில் இணைப்பை இழுக்கவும்</translation>
 <translation id="8389638407792712197">புதிய சாளரத்தைத் திறக்கும்</translation>
diff --git a/ash/components/strings/ash_components_strings_te.xtb b/ash/components/strings/ash_components_strings_te.xtb
index 2307837..2d4f3c41 100644
--- a/ash/components/strings/ash_components_strings_te.xtb
+++ b/ash/components/strings/ash_components_strings_te.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="te">
 <translation id="1036550831858290950">మీ ప్రస్తుత ట్యాబ్‌ను బుక్‌మార్క్‌గా సేవ్ చేయండి</translation>
 <translation id="104962181688258143">ఫైల్స్ యాప్‌ను తెరవండి</translation>
-<translation id="1098295134904615027">కుడివైపు గల వర్చువల్ డెస్క్‌ను యాక్టివేట్ చేస్తుంది</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> కోసం <ph name="N" /> ఫలితాలను చూపుతోంది</translation>
 <translation id="1195667586424773550">ట్యాబ్ యొక్క చిరునామా బార్‌లోకి లింక్‌ను లాగండి</translation>
 <translation id="1204450209689312104">కొత్త విండోను అజ్ఞాత మోడ్‌లో తెరవండి</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">చిరునామా బార్‌లో మీరు నమోదు చేసే దానికి www. మరియు .com జోడించి, ఆపై పేజీని తెరవండి</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, ఆపై <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> లేదా <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">ఎడమవైపు గల వర్చువల్ డెస్క్‌ను యాక్టివేట్ చేస్తుంది</translation>
 <translation id="1996162290124031907">తదుపరి ట్యాబ్‌కు వెళ్లండి</translation>
 <translation id="2010818616644390445">విండోలో చివరి ట్యాబ్‌కు వెళ్లండి</translation>
 <translation id="2040706009561734834">లాంచర్‌ని తెరవండి/మూసివేయండి</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">స్క్రీన్‌షాట్ తీయండి</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">ఫోకస్ చిరునామా బార్</translation>
-<translation id="3165428420335997629">కొత్త వర్చువల్ డెస్క్‌ను సృష్టిస్తుంది</translation>
 <translation id="3256109297135787951">మీ అరలోని ఒక అంశానికి ఉన్న హైలైట్‌ను తీసివేయండి</translation>
 <translation id="3288816184963444640">ప్రస్తుత విండోను మూసివేయండి</translation>
 <translation id="3407560819924487926">కార్య నిర్వాహకుడిని తెరవండి</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">స్క్రీన్‌ని 90 డిగ్రీలు తిప్పండి</translation>
 <translation id="8241665785394195545">కుడి బ్రాకెట్</translation>
 <translation id="8264941229485248811">డెవలపర్ సాధనాల ఇన్‌స్పెక్టర్‌ను చూపండి లేదా దాచండి</translation>
-<translation id="8355937569537581904">ప్రస్తుత వర్చువల్ డెస్క్‌ను తీసివేస్తుంది</translation>
 <translation id="836869401750819675">డౌన్‌లోడ్‌ల పేజీని తెరవండి</translation>
 <translation id="8388247778047144397">లింక్‌ను ట్యాబ్ స్ట్రిప్‌లోని ఖాళీ ప్రాంతంలోకి లాగండి</translation>
 <translation id="8389638407792712197">కొత్త విండోను తెరవండి</translation>
diff --git a/ash/components/strings/ash_components_strings_th.xtb b/ash/components/strings/ash_components_strings_th.xtb
index 962fb02..fe81a7f4 100644
--- a/ash/components/strings/ash_components_strings_th.xtb
+++ b/ash/components/strings/ash_components_strings_th.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="th">
 <translation id="1036550831858290950">บันทึกแท็บปัจจุบันเป็นบุ๊กมาร์ก</translation>
 <translation id="104962181688258143">เปิดแอปไฟล์</translation>
-<translation id="1098295134904615027">เปิดใช้งานพื้นที่ทำงานเสมือนทางด้านขวา</translation>
 <translation id="1122869341872663659">กำลังแสดงผลการค้นหา <ph name="QUERY" /> <ph name="N" /> รายการ</translation>
 <translation id="1195667586424773550">ลากลิงก์ไปยังแถบที่อยู่ของแท็บ</translation>
 <translation id="1204450209689312104">เปิดหน้าต่างใหม่ในโหมดไม่ระบุตัวตน</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">เพิ่ม www. และ .com ในข้อมูลที่คุณป้อนลงในแถบที่อยู่ แล้วเปิดหน้าเว็บนั้น</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> แล้วกด <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> หรือ <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">เปิดใช้งานพื้นที่ทำงานเสมือนทางด้านซ้าย</translation>
 <translation id="1996162290124031907">ไปที่แท็บถัดไป</translation>
 <translation id="2010818616644390445">ไปที่แท็บสุดท้ายในหน้าต่าง</translation>
 <translation id="2040706009561734834">เปิด/ปิด Launcher</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">จับภาพหน้าจอ</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">โฟกัสแถบที่อยู่</translation>
-<translation id="3165428420335997629">สร้างพื้นที่ทำงานเสมือนใหม่</translation>
 <translation id="3256109297135787951">นำไฮไลต์ออกจากรายการบนชั้นวาง</translation>
 <translation id="3288816184963444640">ปิดหน้าต่างปัจจุบัน</translation>
 <translation id="3407560819924487926">เรียกใช้ตัวจัดการงาน</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">หมุนหน้าจอ 90 องศา</translation>
 <translation id="8241665785394195545">วงเล็บปิด</translation>
 <translation id="8264941229485248811">แสดงหรือซ่อนตัวตรวจสอบเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation>
-<translation id="8355937569537581904">นำพื้นที่ทำงานเสมือนที่ใช้อยู่ออก</translation>
 <translation id="836869401750819675">เปิดหน้าดาวน์โหลด</translation>
 <translation id="8388247778047144397">ลากลิงก์ไปยังพื้นที่ว่างบนแนวแท็บ</translation>
 <translation id="8389638407792712197">เปิดหน้าต่างใหม่</translation>
diff --git a/ash/components/strings/ash_components_strings_tr.xtb b/ash/components/strings/ash_components_strings_tr.xtb
index 6df0acf..062c524 100644
--- a/ash/components/strings/ash_components_strings_tr.xtb
+++ b/ash/components/strings/ash_components_strings_tr.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="tr">
 <translation id="1036550831858290950">Geçerli sekmenizi yer işareti olarak kaydeder</translation>
 <translation id="104962181688258143">Dosyalar uygulamasını açar</translation>
-<translation id="1098295134904615027">Sağdaki sanal masayı etkinleştir</translation>
 <translation id="1122869341872663659"><ph name="QUERY" /> için <ph name="N" /> arama sonucu gösteriliyor</translation>
 <translation id="1195667586424773550">Bağlantıyı sekmenin adres çubuğuna sürükleyin</translation>
 <translation id="1204450209689312104">Gizli modda yeni bir pencere açar</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Adres çubuğuna yazdığınız metnin başına www. ve sonuna .com ifadelerini ekleyip sayfayı açar</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, daha sonra <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> veya <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Soldaki sanal masayı etkinleştir</translation>
 <translation id="1996162290124031907">Sonraki sekmeye gider</translation>
 <translation id="2010818616644390445">Penceredeki son sekmeye gider</translation>
 <translation id="2040706009561734834">Başlatıcıyı açar/kapatır</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Ekran görüntüsü al</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Adres çubuğuna odaklan</translation>
-<translation id="3165428420335997629">Yeni bir sanal masa oluştur</translation>
 <translation id="3256109297135787951">Rafınızdaki bir öğenin vurgusunu kaldırır</translation>
 <translation id="3288816184963444640">Geçerli pencereyi kapatır</translation>
 <translation id="3407560819924487926">Görev yöneticisini açar</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Ekranı 90 derece döndürür</translation>
 <translation id="8241665785394195545">sağ parantez</translation>
 <translation id="8264941229485248811">Geliştirici Araçları denetleyicisini gösterir veya gizler</translation>
-<translation id="8355937569537581904">Mevcut sanal masayı kaldır</translation>
 <translation id="836869401750819675">İndirilenler sayfasını açar</translation>
 <translation id="8388247778047144397">Bağlantıyı sekme şeridindeki boş bir alana sürükleyin</translation>
 <translation id="8389638407792712197">Yeni pencere açar</translation>
diff --git a/ash/components/strings/ash_components_strings_uk.xtb b/ash/components/strings/ash_components_strings_uk.xtb
index bd825c53..05b49ef9 100644
--- a/ash/components/strings/ash_components_strings_uk.xtb
+++ b/ash/components/strings/ash_components_strings_uk.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="uk">
 <translation id="1036550831858290950">Зробити закладку для поточної вкладки</translation>
 <translation id="104962181688258143">Відкрити додаток Файли</translation>
-<translation id="1098295134904615027">Активувати віртуальний робочий стіл праворуч</translation>
 <translation id="1122869341872663659">Показано результати пошуку (<ph name="N" />) за запитом "<ph name="QUERY" />"</translation>
 <translation id="1195667586424773550">Перетягніть посилання в адресний рядок вкладки</translation>
 <translation id="1204450209689312104">Відкрити нове вікно в режимі анонімного перегляду</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Додати www. та .com до тексту в адресному рядку й відкрити сторінку</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, а тоді <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> або <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Активувати віртуальний робочий стіл ліворуч</translation>
 <translation id="1996162290124031907">Перейти на наступну вкладку</translation>
 <translation id="2010818616644390445">Перейти на останню вкладку у вікні</translation>
 <translation id="2040706009561734834">Відкрити чи закрити панель запуску</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Зробити знімок екрана</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Активувати адресний рядок</translation>
-<translation id="3165428420335997629">Створити новий віртуальний робочий стіл</translation>
 <translation id="3256109297135787951">Скасувати виділення елемента на полиці</translation>
 <translation id="3288816184963444640">Закрити поточне вікно</translation>
 <translation id="3407560819924487926">Відкрити Диспетчер завдань</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Обернути екран на 90 градусів</translation>
 <translation id="8241665785394195545">права квадратна дужка</translation>
 <translation id="8264941229485248811">Показати чи сховати інспектор Інструментів розробника</translation>
-<translation id="8355937569537581904">Видалити поточний віртуальний робочий стіл</translation>
 <translation id="836869401750819675">Відкрити сторінку завантажень</translation>
 <translation id="8388247778047144397">Перетягніть посилання на порожнє місце на панелі вкладок</translation>
 <translation id="8389638407792712197">Відкрити нове вікно</translation>
diff --git a/ash/components/strings/ash_components_strings_vi.xtb b/ash/components/strings/ash_components_strings_vi.xtb
index 823132a..d9cd74e4 100644
--- a/ash/components/strings/ash_components_strings_vi.xtb
+++ b/ash/components/strings/ash_components_strings_vi.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="vi">
 <translation id="1036550831858290950">Lưu tab hiện tại làm dấu trang</translation>
 <translation id="104962181688258143">Mở ứng dụng Tệp</translation>
-<translation id="1098295134904615027">Kích hoạt không gian làm việc ảo ở bên phải</translation>
 <translation id="1122869341872663659">Hiển thị <ph name="N" /> kết quả tìm kiếm cho <ph name="QUERY" /></translation>
 <translation id="1195667586424773550">Kéo liên kết vào thanh địa chỉ của tab</translation>
 <translation id="1204450209689312104">Mở cửa sổ mới ở chế độ ẩn danh</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">Thêm www. và .com vào nội dung mà bạn nhập trên thanh địa chỉ rồi mở trang</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />, rồi đến <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> hoặc <ph name="LEFT" /></translation>
-<translation id="1929866390202038233">Kích hoạt không gian làm việc ảo ở bên trái</translation>
 <translation id="1996162290124031907">Chuyển sang tab tiếp theo</translation>
 <translation id="2010818616644390445">Chuyển đến tab cuối cùng trong cửa sổ</translation>
 <translation id="2040706009561734834">Mở/đóng trình chạy</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">Chụp ảnh màn hình</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">Thanh địa chỉ chính</translation>
-<translation id="3165428420335997629">Tạo không gian làm việc ảo mới</translation>
 <translation id="3256109297135787951">Xóa mục đã đánh dấu trên giá</translation>
 <translation id="3288816184963444640">Đóng cửa sổ hiện tại</translation>
 <translation id="3407560819924487926">Hiển thị trình quản lý tác vụ</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">Xoay màn hình 90 độ</translation>
 <translation id="8241665785394195545">dấu ngoặc vuông phải</translation>
 <translation id="8264941229485248811">Hiển thị hoặc ẩn trình kiểm tra Công cụ dành cho nhà phát triển</translation>
-<translation id="8355937569537581904">Xóa không gian làm việc ảo hiện tại</translation>
 <translation id="836869401750819675">Mở trang Tệp đã tải xuống</translation>
 <translation id="8388247778047144397">Kéo liên kết vào một vùng trống trên thanh tab</translation>
 <translation id="8389638407792712197">Mở cửa sổ mới</translation>
diff --git a/ash/components/strings/ash_components_strings_zh-CN.xtb b/ash/components/strings/ash_components_strings_zh-CN.xtb
index f3c039a..7f11e93 100644
--- a/ash/components/strings/ash_components_strings_zh-CN.xtb
+++ b/ash/components/strings/ash_components_strings_zh-CN.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="zh-CN">
 <translation id="1036550831858290950">将当前标签页保存为书签</translation>
 <translation id="104962181688258143">打开“文件”应用</translation>
-<translation id="1098295134904615027">启用右侧的虚拟桌面</translation>
 <translation id="1122869341872663659">目前显示的是与“<ph name="QUERY" />”相符的 <ph name="N" /> 条搜索结果</translation>
 <translation id="1195667586424773550">将链接拖到标签页的地址栏中</translation>
 <translation id="1204450209689312104">在无痕模式下打开新窗口</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /></translation>
 <translation id="1733525068429116555">将 www. 和 .com 添加到您在搜索栏内输入的内容中,然后打开相应网页</translation>
 <translation id="1920446759863417809"><ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" />,然后按 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 或<ph name="LEFT" />键</translation>
-<translation id="1929866390202038233">启用左侧的虚拟桌面</translation>
 <translation id="1996162290124031907">转到下一个标签页</translation>
 <translation id="2010818616644390445">转到窗口中的最后一个标签页</translation>
 <translation id="2040706009561734834">打开/关闭启动器</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">生成屏幕截图</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">将地址栏设为焦点</translation>
-<translation id="3165428420335997629">创建新的虚拟桌面</translation>
 <translation id="3256109297135787951">取消任务栏中某项内容的突出显示状态</translation>
 <translation id="3288816184963444640">关闭当前窗口</translation>
 <translation id="3407560819924487926">启动任务管理器</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">将屏幕旋转 90 度</translation>
 <translation id="8241665785394195545">右中括号</translation>
 <translation id="8264941229485248811">显示或隐藏开发者工具检查器</translation>
-<translation id="8355937569537581904">移除当前的虚拟桌面</translation>
 <translation id="836869401750819675">打开“下载内容”页面</translation>
 <translation id="8388247778047144397">将链接拖到标签栏的空白区域中</translation>
 <translation id="8389638407792712197">打开新窗口</translation>
diff --git a/ash/components/strings/ash_components_strings_zh-TW.xtb b/ash/components/strings/ash_components_strings_zh-TW.xtb
index df4256b9..32550f82 100644
--- a/ash/components/strings/ash_components_strings_zh-TW.xtb
+++ b/ash/components/strings/ash_components_strings_zh-TW.xtb
@@ -3,7 +3,6 @@
 <translationbundle lang="zh-TW">
 <translation id="1036550831858290950">將目前的分頁儲存為書籤</translation>
 <translation id="104962181688258143">開啟「檔案」應用程式</translation>
-<translation id="1098295134904615027">啟用右側的虛擬桌面</translation>
 <translation id="1122869341872663659">目前顯示 <ph name="N" /> 項與「<ph name="QUERY" />」相符的搜尋結果</translation>
 <translation id="1195667586424773550">將連結拖曳至該分頁的網址列</translation>
 <translation id="1204450209689312104">以無痕模式開啟新視窗</translation>
@@ -25,7 +24,6 @@
 <translation id="1732295673545939435"><ph name="MODIFIER1" /><ph name="SEPARATOR1" /><ph name="MODIFIER2" /><ph name="SEPARATOR2" /><ph name="KEY" /> 鍵</translation>
 <translation id="1733525068429116555">為你在網址列中輸入的字串加上 www. 和 .com 並開啟網頁</translation>
 <translation id="1920446759863417809">按下 <ph name="SHIFT1" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> 鍵,然後按下 <ph name="SHIFT2" /><ph name="SEPARATOR3" /><ph name="TAB" /> 鍵或 <ph name="LEFT" /> 鍵</translation>
-<translation id="1929866390202038233">啟用左側的虛擬桌面</translation>
 <translation id="1996162290124031907">前往下一個分頁</translation>
 <translation id="2010818616644390445">前往視窗中的最後一個分頁</translation>
 <translation id="2040706009561734834">開啟/關閉啟動器</translation>
@@ -64,7 +62,6 @@
 <translation id="3105917916468784889">擷取螢幕畫面</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3140353188828248647">將焦點移至網址列</translation>
-<translation id="3165428420335997629">建立新的虛擬桌面</translation>
 <translation id="3256109297135787951">取消檔案櫃項目的醒目顯示狀態</translation>
 <translation id="3288816184963444640">關閉目前的視窗</translation>
 <translation id="3407560819924487926">開啟工作管理員</translation>
@@ -181,7 +178,6 @@
 <translation id="8234414138295101081">將畫面旋轉 90 度</translation>
 <translation id="8241665785394195545">右方括號</translation>
 <translation id="8264941229485248811">顯示或隱藏開發人員工具檢查器</translation>
-<translation id="8355937569537581904">移除目前的虛擬桌面</translation>
 <translation id="836869401750819675">開啟下載內容頁面</translation>
 <translation id="8388247778047144397">將連結拖曳至分頁列中的空白區域</translation>
 <translation id="8389638407792712197">開啟新視窗</translation>
diff --git a/ash/dip_unittest.cc b/ash/dip_unittest.cc
index 6faa324..8dac6190 100644
--- a/ash/dip_unittest.cc
+++ b/ash/dip_unittest.cc
@@ -5,8 +5,8 @@
 #include <algorithm>
 #include <vector>
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -33,13 +33,13 @@
   aura::Window* root = Shell::GetPrimaryRootWindow();
   const display::Display display =
       display::Screen::GetScreen()->GetDisplayNearestWindow(root);
-  const int shelf_inset = 900 - ShelfConstants::shelf_size();
+  const int shelf_inset = 900 - ShelfConfig::Get()->shelf_size();
 
   EXPECT_EQ("0,0 1000x900", display.bounds().ToString());
   gfx::Rect work_area = display.work_area();
   EXPECT_EQ(gfx::Rect(0, 0, 1000, shelf_inset).ToString(),
             work_area.ToString());
-  EXPECT_EQ(gfx::Insets(0, 0, ShelfConstants::shelf_size(), 0).ToString(),
+  EXPECT_EQ(gfx::Insets(0, 0, ShelfConfig::Get()->shelf_size(), 0).ToString(),
             display.bounds().InsetsFrom(work_area).ToString());
 
   UpdateDisplay("2000x1800*2.0f");
@@ -57,7 +57,7 @@
   work_area = display_2x.work_area();
   EXPECT_EQ(gfx::Rect(0, 0, 1000, shelf_inset).ToString(),
             work_area.ToString());
-  EXPECT_EQ(gfx::Insets(0, 0, ShelfConstants::shelf_size(), 0).ToString(),
+  EXPECT_EQ(gfx::Insets(0, 0, ShelfConfig::Get()->shelf_size(), 0).ToString(),
             display_2x.bounds().InsetsFrom(work_area).ToString());
 
   // Sanity check if the workarea's inset hight is same as
diff --git a/ash/display/display_move_window_util_unittest.cc b/ash/display/display_move_window_util_unittest.cc
index 9f71630..3a08bd0 100644
--- a/ash/display/display_move_window_util_unittest.cc
+++ b/ash/display/display_move_window_util_unittest.cc
@@ -7,9 +7,9 @@
 #include "ash/accelerators/accelerator_controller_impl.h"
 #include "ash/accelerators/accelerator_table.h"
 #include "ash/accessibility/test_accessibility_controller_client.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/mru_window_tracker.h"
@@ -244,7 +244,7 @@
   //     |   |
   //     +---+
   UpdateDisplay("400x300,400x600");
-  const int shelf_inset = 300 - ShelfConstants::shelf_size();
+  const int shelf_inset = 300 - ShelfConfig::Get()->shelf_size();
   // Create and activate window on display [1].
   aura::Window* window =
       CreateTestWindowInShellWithBounds(gfx::Rect(410, 20, 200, 400));
@@ -436,11 +436,11 @@
 
   WindowState* window_state = WindowState::Get(w);
   window_state->Maximize();
-  EXPECT_EQ(gfx::Rect(0, 0, 400, 300 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(0, 0, 400, 300 - ShelfConfig::Get()->shelf_size()),
             w->GetBoundsInScreen());
 
   PerformMoveWindowAccel();
-  EXPECT_EQ(gfx::Rect(400, 0, 400, 300 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(400, 0, 400, 300 - ShelfConfig::Get()->shelf_size()),
             w->GetBoundsInScreen());
   window_state->Restore();
   EXPECT_EQ(gfx::Rect(410, 20, 200, 100), w->GetBoundsInScreen());
diff --git a/ash/display/window_tree_host_manager_unittest.cc b/ash/display/window_tree_host_manager_unittest.cc
index a106420..9ac1c26 100644
--- a/ash/display/window_tree_host_manager_unittest.cc
+++ b/ash/display/window_tree_host_manager_unittest.cc
@@ -7,9 +7,9 @@
 #include <memory>
 
 #include "ash/display/display_util.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -711,8 +711,8 @@
       Shell::Get()->window_tree_host_manager();
 
   UpdateDisplay("200x200,300x300");
-  const int shelf_inset_first = 200 - ShelfConstants::shelf_size();
-  const int shelf_inset_second = 300 - ShelfConstants::shelf_size();
+  const int shelf_inset_first = 200 - ShelfConfig::Get()->shelf_size();
+  const int shelf_inset_second = 300 - ShelfConfig::Get()->shelf_size();
   display::Display primary_display =
       display::Screen::GetScreen()->GetPrimaryDisplay();
   display::Display secondary_display = display_manager()->GetSecondaryDisplay();
diff --git a/ash/login/ui/login_button.cc b/ash/login/ui/login_button.cc
index d00e40f..c5c1c85 100644
--- a/ash/login/ui/login_button.cc
+++ b/ash/login/ui/login_button.cc
@@ -4,7 +4,7 @@
 
 #include "ash/login/ui/login_button.h"
 
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_highlight.h"
 #include "ui/views/animation/ink_drop_impl.h"
@@ -28,7 +28,7 @@
   SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
   SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
   SetInstallFocusRingOnFocus(true);
-  focus_ring()->SetColor(kShelfFocusBorderColor);
+  focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   SetInkDropMode(InkDropMode::ON);
   set_has_ink_drop_action_on_click(true);
 }
diff --git a/ash/login/ui/login_pin_view.cc b/ash/login/ui/login_pin_view.cc
index 0053281..29920b6a 100644
--- a/ash/login/ui/login_pin_view.cc
+++ b/ash/login/ui/login_pin_view.cc
@@ -9,8 +9,8 @@
 #include "ash/login/ui/login_button.h"
 #include "ash/public/cpp/ash_constants.h"
 #include "ash/public/cpp/login_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/bind.h"
 #include "base/callback.h"
@@ -108,7 +108,7 @@
     SetInkDropMode(InkDropMode::ON_NO_GESTURE_HANDLER);
 
     focus_ring_ = views::FocusRing::Install(this);
-    focus_ring_->SetColor(kShelfFocusBorderColor);
+    focus_ring_->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   }
 
   ~BasePinButton() override = default;
diff --git a/ash/login/ui/login_user_menu_view.cc b/ash/login/ui/login_user_menu_view.cc
index 7263964..8d6e4d8 100644
--- a/ash/login/ui/login_user_menu_view.cc
+++ b/ash/login/ui/login_user_menu_view.cc
@@ -5,7 +5,7 @@
 #include "ash/login/ui/login_user_menu_view.h"
 #include "ash/login/ui/non_accessible_view.h"
 #include "ash/login/ui/views_utils.h"
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/accessibility/ax_node_data.h"
@@ -65,7 +65,7 @@
         gfx::Insets(kUserMenuMarginAroundRemoveUserButtonDp,
                     kUserMenuMarginAroundRemoveUserButtonDp)));
     SetInstallFocusRingOnFocus(true);
-    focus_ring()->SetColor(kShelfFocusBorderColor);
+    focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   }
 
   ~RemoveUserButton() override = default;
diff --git a/ash/login/ui/note_action_launch_button.cc b/ash/login/ui/note_action_launch_button.cc
index e4f1dd6..4c5c3e52 100644
--- a/ash/login/ui/note_action_launch_button.cc
+++ b/ash/login/ui/note_action_launch_button.cc
@@ -6,9 +6,9 @@
 
 #include <memory>
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/mojom/tray_action.mojom.h"
 #include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/i18n/rtl.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -187,9 +187,9 @@
         event_targeter_delegate_(kLargeBubbleRadiusDp, kSmallBubbleRadiusDp) {
     SetAccessibleName(
         l10n_util::GetStringUTF16(IDS_ASH_STYLUS_TOOLS_CREATE_NOTE_ACTION));
-    SetImage(
-        views::Button::STATE_NORMAL,
-        CreateVectorIcon(kTrayActionNewLockScreenNoteIcon, kShelfIconColor));
+    SetImage(views::Button::STATE_NORMAL,
+             CreateVectorIcon(kTrayActionNewLockScreenNoteIcon,
+                              ShelfConfig::Get()->shelf_icon_color()));
     SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
     SetFocusPainter(nullptr);
     EnableCanvasFlippingForRTLUI(true);
diff --git a/ash/login/ui/parent_access_view.cc b/ash/login/ui/parent_access_view.cc
index 47663d7..d0745af 100644
--- a/ash/login/ui/parent_access_view.cc
+++ b/ash/login/ui/parent_access_view.cc
@@ -14,9 +14,9 @@
 #include "ash/login/ui/login_pin_view.h"
 #include "ash/login/ui/non_accessible_view.h"
 #include "ash/public/cpp/login_types.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
@@ -231,7 +231,7 @@
                        const base::string16& text)
       : views::LabelButton(listener, text) {
     SetInstallFocusRingOnFocus(true);
-    focus_ring()->SetColor(kShelfFocusBorderColor);
+    focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   }
   ~FocusableLabelButton() override = default;
 
diff --git a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc
index 5baed06..74f6f7f 100644
--- a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc
+++ b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc
@@ -14,9 +14,9 @@
 #include "ash/magnifier/magnifier_test_utils.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/session/test_session_controller_client.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/ash_test_helper.h"
@@ -241,7 +241,7 @@
   const gfx::Rect disp_1_bounds(0, 0, 800, 600);
   EXPECT_EQ(disp_1_bounds, display_1.bounds());
   gfx::Rect disp_1_workarea_no_magnifier = disp_1_bounds;
-  disp_1_workarea_no_magnifier.Inset(0, 0, 0, ShelfConstants::shelf_size());
+  disp_1_workarea_no_magnifier.Inset(0, 0, 0, ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(disp_1_workarea_no_magnifier, display_1.work_area());
   // At this point, normal mouse cursor confinement should be used.
   AshWindowTreeHost* host1 =
@@ -255,7 +255,7 @@
   const gfx::Rect disp_2_bounds(800, 0, 400, 300);
   EXPECT_EQ(disp_2_bounds, display_2.bounds());
   gfx::Rect disp_2_workarea_no_magnifier = disp_2_bounds;
-  disp_2_workarea_no_magnifier.Inset(0, 0, 0, ShelfConstants::shelf_size());
+  disp_2_workarea_no_magnifier.Inset(0, 0, 0, ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(disp_2_workarea_no_magnifier, display_2.work_area());
   AshWindowTreeHost* host2 =
       Shell::Get()
@@ -356,7 +356,7 @@
   const display::Display& display = display_manager()->GetDisplayAt(0);
   gfx::Rect workarea = display.bounds();
   const int magnifier_height = GetMagnifierHeight(display.bounds().height());
-  workarea.Inset(0, magnifier_height, 0, ShelfConstants::shelf_size());
+  workarea.Inset(0, magnifier_height, 0, ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(workarea, display.work_area());
   EXPECT_EQ(workarea, window->bounds());
   EXPECT_TRUE(WindowState::Get(window.get())->IsMaximized());
@@ -398,7 +398,7 @@
   const display::Display& display = display_manager()->GetDisplayAt(0);
   const int magnifier_height = GetMagnifierHeight(display.bounds().height());
   gfx::Rect work_area = display.bounds();
-  work_area.Inset(0, magnifier_height, 0, ShelfConstants::shelf_size());
+  work_area.Inset(0, magnifier_height, 0, ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(work_area, display.work_area());
   EXPECT_EQ(work_area, window->bounds());
   EXPECT_TRUE(WindowState::Get(window.get())->IsMaximized());
@@ -440,7 +440,7 @@
   const display::Display& display = display_manager()->GetDisplayAt(0);
   const int magnifier_height = GetMagnifierHeight(display.bounds().height());
   gfx::Rect work_area = display.bounds();
-  work_area.Inset(0, magnifier_height, 0, ShelfConstants::shelf_size());
+  work_area.Inset(0, magnifier_height, 0, ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(work_area, display.work_area());
   EXPECT_EQ(work_area.height(), window1->bounds().height());
   EXPECT_EQ(work_area.height(), window2->bounds().height());
diff --git a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc b/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc
index c38550c0..cf84b3ea 100644
--- a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc
+++ b/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc
@@ -15,6 +15,7 @@
 #include "ash/public/cpp/window_properties.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
+#include "base/numerics/ranges.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -98,7 +99,7 @@
 // animations to the expected range so that gfx::Tween::CalculateValue() can be
 // used.
 double CapAnimationValue(double value) {
-  return std::min(1.0, std::max(0.0, value));
+  return base::ClampToRange(value, 0.0, 1.0);
 }
 
 // Returns a |views::BoxLayout| layout manager with the settings needed by
diff --git a/ash/public/cpp/pagination/pagination_model.cc b/ash/public/cpp/pagination/pagination_model.cc
index e8f1006..51ab3ef 100644
--- a/ash/public/cpp/pagination/pagination_model.cc
+++ b/ash/public/cpp/pagination/pagination_model.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "ash/public/cpp/pagination/pagination_model_observer.h"
+#include "base/numerics/ranges.h"
 #include "ui/gfx/animation/slide_animation.h"
 
 namespace ash {
@@ -245,7 +246,7 @@
   else if (target_page > end_page && selected_page_ == end_page)
     end_page = total_pages_;
 
-  return std::max(start_page, std::min(end_page, target_page));
+  return base::ClampToRange(target_page, start_page, end_page);
 }
 
 base::TimeDelta PaginationModel::GetTransitionAnimationSlideDuration() const {
diff --git a/ash/public/cpp/shelf_config.h b/ash/public/cpp/shelf_config.h
new file mode 100644
index 0000000..6ee26c24
--- /dev/null
+++ b/ash/public/cpp/shelf_config.h
@@ -0,0 +1,193 @@
+// Copyright (c) 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 ASH_PUBLIC_CPP_SHELF_CONFIG_H_
+#define ASH_PUBLIC_CPP_SHELF_CONFIG_H_
+
+#include "ash/ash_export.h"
+#include "base/macros.h"
+#include "third_party/skia/include/core/SkColor.h"
+
+namespace ash {
+
+// Provides layout and drawing config for the Shelf. Note That some of these
+// values could change at runtime.
+class ASH_EXPORT ShelfConfig {
+ public:
+  ShelfConfig();
+  ~ShelfConfig();
+
+  static ShelfConfig* Get();
+
+  // Size of the shelf when visible (height when the shelf is horizontal and
+  // width when the shelf is vertical).
+  int shelf_size() const;
+
+  // Size allocated for each app button on the shelf.
+  int button_size() const;
+
+  // Size of the space between buttons on the shelf.
+  int button_spacing() const;
+
+  // Size of the icons within shelf buttons.
+  int button_icon_size() const;
+
+  // Size for controls like the home button, back button, etc.
+  int control_size() const;
+
+  // The radius of shelf control buttons.
+  int control_border_radius() const;
+
+  // The margin around the overflow button on the shelf.
+  int overflow_button_margin() const;
+
+  // The distance between the edge of the shelf and the home and back button.
+  int home_button_edge_spacing() const;
+
+  int app_icon_group_margin() const { return app_icon_group_margin_; }
+  SkColor shelf_control_permanent_highlight_background() const {
+    return shelf_control_permanent_highlight_background_;
+  }
+  SkColor shelf_focus_border_color() const { return shelf_focus_border_color_; }
+  int workspace_area_visible_inset() const {
+    return workspace_area_visible_inset_;
+  }
+  int workspace_area_auto_hide_inset() const {
+    return workspace_area_auto_hide_inset_;
+  }
+  int hidden_shelf_in_screen_portion() const {
+    return hidden_shelf_in_screen_portion_;
+  }
+  SkColor shelf_default_base_color() const { return shelf_default_base_color_; }
+  SkColor shelf_ink_drop_base_color() const {
+    return shelf_ink_drop_base_color_;
+  }
+  float shelf_ink_drop_visible_opacity() const {
+    return shelf_ink_drop_visible_opacity_;
+  }
+  SkColor shelf_icon_color() const { return shelf_icon_color_; }
+  int shelf_translucent_over_app_list() const {
+    return shelf_translucent_over_app_list_;
+  }
+  int shelf_translucent_alpha() const { return shelf_translucent_alpha_; }
+  int shelf_translucent_maximized_window() const {
+    return shelf_translucent_maximized_window_;
+  }
+  int shelf_translucent_color_darken_alpha() const {
+    return shelf_translucent_color_darken_alpha_;
+  }
+  int shelf_opaque_color_darken_alpha() const {
+    return shelf_opaque_color_darken_alpha_;
+  }
+  int status_indicator_offset_from_shelf_edge() const {
+    return status_indicator_offset_from_shelf_edge_;
+  }
+  int shelf_tooltip_preview_height() const {
+    return shelf_tooltip_preview_height_;
+  }
+  int shelf_tooltip_preview_max_width() const {
+    return shelf_tooltip_preview_max_width_;
+  }
+  float shelf_tooltip_preview_max_ratio() const {
+    return shelf_tooltip_preview_max_ratio_;
+  }
+  float shelf_tooltip_preview_min_ratio() const {
+    return shelf_tooltip_preview_min_ratio_;
+  }
+
+ private:
+  // Whether shelf is currently standard or dense.
+  const bool is_dense_;
+
+  // Size of the shelf when visible (height when the shelf is horizontal and
+  // width when the shelf is vertical).
+  const int shelf_size_;
+  const int shelf_size_dense_;
+
+  // Size of the icons within shelf buttons.
+  const int shelf_button_icon_size_;
+  const int shelf_button_icon_size_dense_;
+
+  // Size for controls like the home button, back button, etc.
+  const int shelf_control_size_;
+  const int shelf_control_size_dense_;
+
+  // Size allocated for each app button on the shelf.
+  const int shelf_button_size_;
+  const int shelf_button_size_dense_;
+
+  // Size of the space between buttons on the shelf.
+  const int shelf_button_spacing_;
+
+  // Size of the space between edge of screen and home button.
+  const int shelf_home_button_edge_spacing_;
+  const int shelf_home_button_edge_spacing_dense_;
+
+  // The margin around the overflow button on the shelf.
+  const int shelf_overflow_button_margin_;
+  const int shelf_overflow_button_margin_dense_;
+
+  // The margin on either side of the group of app icons (including the overflow
+  // button).
+  const int app_icon_group_margin_;
+
+  const SkColor shelf_control_permanent_highlight_background_;
+
+  const SkColor shelf_focus_border_color_;
+
+  // We reserve a small area on the edge of the workspace area to ensure that
+  // the resize handle at the edge of the window can be hit.
+  const int workspace_area_visible_inset_;
+
+  // When autohidden we extend the touch hit target onto the screen so that the
+  // user can drag the shelf out.
+  const int workspace_area_auto_hide_inset_;
+
+  // Portion of the shelf that's within the screen bounds when auto-hidden.
+  const int hidden_shelf_in_screen_portion_;
+
+  // The default base color of the shelf to which different alpha values are
+  // applied based on the desired shelf opacity level.
+  const SkColor shelf_default_base_color_;
+
+  // Ink drop color for shelf items.
+  const SkColor shelf_ink_drop_base_color_;
+
+  // Opacity of the ink drop ripple for shelf items when the ripple is visible.
+  const float shelf_ink_drop_visible_opacity_;
+
+  // The foreground color of the icons used in the shelf (launcher,
+  // notifications, etc).
+  const SkColor shelf_icon_color_;
+
+  // The alpha value for the shelf background.
+  const int shelf_translucent_over_app_list_;
+  const int shelf_translucent_alpha_;
+  // Using 0xFF causes clipping on the overlay candidate content, which prevent
+  // HW overlay, probably due to a bug in compositor. Fix it and use 0xFF.
+  // crbug.com/901538
+  const int shelf_translucent_maximized_window_;
+
+  // The alpha value used to darken a colorized shelf when the shelf is
+  // translucent.
+  const int shelf_translucent_color_darken_alpha_;
+
+  // The alpha value used to darken a colorized shelf when the shelf is opaque.
+  const int shelf_opaque_color_darken_alpha_;
+
+  // The distance between the edge of the shelf and the status indicators.
+  const int status_indicator_offset_from_shelf_edge_;
+
+  // Dimensions for hover previews.
+  const int shelf_tooltip_preview_height_;
+  const int shelf_tooltip_preview_max_width_;
+  const float shelf_tooltip_preview_max_ratio_;
+  const float shelf_tooltip_preview_min_ratio_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShelfConfig);
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_SHELF_CONFIG_H_
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index d65c1dc..20d5cb77 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -72,6 +72,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/time/time.h"
 #include "chromeos/constants/chromeos_switches.h"
@@ -347,8 +348,8 @@
 
   gfx::Point FitPointToBounds(const gfx::Point p, const gfx::Rect& bounds) {
     return gfx::Point(
-        std::min(std::max(bounds.x(), p.x()), bounds.right() - 1),
-        std::min(std::max(bounds.y(), p.y()), bounds.bottom() - 1));
+        base::ClampToRange(p.x(), bounds.x(), bounds.right() - 1),
+        base::ClampToRange(p.y(), bounds.y(), bounds.bottom() - 1));
   }
 
   ui::EventType last_mouse_event_type_ = ui::ET_UNKNOWN;
diff --git a/ash/root_window_controller_unittest.cc b/ash/root_window_controller_unittest.cc
index fd7ec91c..0c381f3 100644
--- a/ash/root_window_controller_unittest.cc
+++ b/ash/root_window_controller_unittest.cc
@@ -11,10 +11,10 @@
 #include "ash/keyboard/ui/keyboard_util.h"
 #include "ash/keyboard/ui/test/keyboard_test_util.h"
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/session/test_session_controller_client.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/window_factory.h"
@@ -146,7 +146,7 @@
   UpdateDisplay("600x600,300x300");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
 
-  int bottom_inset = 300 - ShelfConstants::shelf_size();
+  int bottom_inset = 300 - ShelfConfig::Get()->shelf_size();
   views::Widget* normal = CreateTestWidget(gfx::Rect(650, 10, 100, 100));
   EXPECT_EQ(root_windows[1], normal->GetNativeView()->GetRootWindow());
   EXPECT_EQ("650,10 100x100", normal->GetWindowBoundsInScreen().ToString());
@@ -210,7 +210,7 @@
   EXPECT_EQ("100,20 100x100",
             normal->GetNativeView()->GetBoundsInRootWindow().ToString());
 
-  bottom_inset = 600 - ShelfConstants::shelf_size();
+  bottom_inset = 600 - ShelfConfig::Get()->shelf_size();
 
   // First clear fullscreen status, since both fullscreen and maximized windows
   // share the same desktop workspace, which cancels the shelf status.
diff --git a/ash/screen_util_unittest.cc b/ash/screen_util_unittest.cc
index 75464fa..c40a069 100644
--- a/ash/screen_util_unittest.cc
+++ b/ash/screen_util_unittest.cc
@@ -7,9 +7,9 @@
 #include <memory>
 
 #include "ash/magnifier/docked_magnifier_controller_impl.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/desks/desks_util.h"
@@ -38,8 +38,8 @@
   secondary->Show();
 
   // Maximized bounds.
-  const int bottom_inset_first = 600 - ShelfConstants::shelf_size();
-  const int bottom_inset_second = 500 - ShelfConstants::shelf_size();
+  const int bottom_inset_first = 600 - ShelfConfig::Get()->shelf_size();
+  const int bottom_inset_second = 500 - ShelfConfig::Get()->shelf_size();
   EXPECT_EQ(
       gfx::Rect(0, 0, 600, bottom_inset_first).ToString(),
       screen_util::GetMaximizedWindowBoundsInParent(primary->GetNativeView())
diff --git a/ash/shelf/assistant_overlay.cc b/ash/shelf/assistant_overlay.cc
index 069743e0..8367cc0 100644
--- a/ash/shelf/assistant_overlay.cc
+++ b/ash/shelf/assistant_overlay.cc
@@ -13,7 +13,6 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shelf/home_button.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc
index 5655e4d..2f62ab7 100644
--- a/ash/shelf/home_button.cc
+++ b/ash/shelf/home_button.cc
@@ -7,9 +7,9 @@
 #include <math.h>  // std::ceil
 
 #include "ash/app_list/app_list_controller_impl.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_focus_cycler.h"
 #include "ash/shell.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
@@ -136,7 +136,7 @@
     cc::PaintFlags fg_flags;
     fg_flags.setAntiAlias(true);
     fg_flags.setStyle(cc::PaintFlags::kStroke_Style);
-    fg_flags.setColor(kShelfIconColor);
+    fg_flags.setColor(ShelfConfig::Get()->shelf_icon_color());
 
     if (controller_.IsVoiceInteractionAvailable()) {
       // active: 100% alpha, inactive: 54% alpha
@@ -168,8 +168,9 @@
   // Increase clickable area for the button from
   // (kShelfControlSize x kShelfButtonSize) to
   // (kShelfButtonSize x kShelfButtonSize).
-  int left_offset = button_bounds.width() - ShelfConstants::button_size();
-  int bottom_offset = button_bounds.height() - ShelfConstants::button_size();
+  int left_offset = button_bounds.width() - ShelfConfig::Get()->button_size();
+  int bottom_offset =
+      button_bounds.height() - ShelfConfig::Get()->button_size();
   button_bounds.Inset(gfx::Insets(0, left_offset, bottom_offset, 0));
   return button_bounds.Intersects(rect);
 }
diff --git a/ash/shelf/home_button_unittest.cc b/ash/shelf/home_button_unittest.cc
index fe022017..5613267b 100644
--- a/ash/shelf/home_button_unittest.cc
+++ b/ash/shelf/home_button_unittest.cc
@@ -16,7 +16,6 @@
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_view_test_api.h"
@@ -167,6 +166,7 @@
           ->shelf_widget()
           ->navigation_widget()
           ->get_bounds_animator_for_testing());
+
   // Visual space around the home button is set at the widget level.
   EXPECT_EQ(0, home_button()->bounds().x());
 }
diff --git a/ash/shelf/hotseat_widget.cc b/ash/shelf/hotseat_widget.cc
index 9656a31..925efcf 100644
--- a/ash/shelf/hotseat_widget.cc
+++ b/ash/shelf/hotseat_widget.cc
@@ -8,7 +8,6 @@
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/shelf/scrollable_shelf_view.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_widget.h"
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc
index 8d8aa3e..61753f74 100644
--- a/ash/shelf/login_shelf_view.cc
+++ b/ash/shelf/login_shelf_view.cc
@@ -15,11 +15,11 @@
 #include "ash/login/ui/lock_screen.h"
 #include "ash/public/cpp/ash_constants.h"
 #include "ash/public/cpp/login_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -153,12 +153,13 @@
                                    login_constants::kButtonDisabledAlpha)));
     SetFocusBehavior(FocusBehavior::ALWAYS);
     SetInstallFocusRingOnFocus(true);
-    focus_ring()->SetColor(kShelfFocusBorderColor);
+    focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
     SetFocusPainter(nullptr);
     SetInkDropMode(InkDropMode::ON);
     set_has_ink_drop_action_on_click(true);
-    set_ink_drop_base_color(kShelfInkDropBaseColor);
-    set_ink_drop_visible_opacity(kShelfInkDropVisibleOpacity);
+    set_ink_drop_base_color(ShelfConfig::Get()->shelf_ink_drop_base_color());
+    set_ink_drop_visible_opacity(
+        ShelfConfig::Get()->shelf_ink_drop_visible_opacity());
 
     // Layer rendering is required when the shelf background is visible, which
     // happens when the wallpaper is not blurred.
@@ -268,12 +269,13 @@
         ui::SimpleMenuModel(this) {
     SetFocusBehavior(FocusBehavior::ALWAYS);
     SetInstallFocusRingOnFocus(true);
-    focus_ring()->SetColor(kShelfFocusBorderColor);
+    focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
     SetFocusPainter(nullptr);
     SetInkDropMode(InkDropMode::ON);
     set_has_ink_drop_action_on_click(true);
-    set_ink_drop_base_color(kShelfInkDropBaseColor);
-    set_ink_drop_visible_opacity(kShelfInkDropVisibleOpacity);
+    set_ink_drop_base_color(ShelfConfig::Get()->shelf_ink_drop_base_color());
+    set_ink_drop_visible_opacity(
+        ShelfConfig::Get()->shelf_ink_drop_visible_opacity());
 
     // Layer rendering is required when the shelf background is visible, which
     // happens when the wallpaper is not blurred.
diff --git a/ash/shelf/overflow_bubble_view.cc b/ash/shelf/overflow_bubble_view.cc
index 18c83bf78..a47745ac 100644
--- a/ash/shelf/overflow_bubble_view.cc
+++ b/ash/shelf/overflow_bubble_view.cc
@@ -6,10 +6,10 @@
 
 #include <algorithm>
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shelf/scroll_arrow_view.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_container_view.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_widget.h"
@@ -31,7 +31,7 @@
 // Padding between the end of the shelf in overflow mode and the arrow button
 // (if any).
 int GetDistanceToArrowButton() {
-  return ShelfConstants::button_spacing();
+  return ShelfConfig::Get()->button_spacing();
 }
 
 // Distance between overflow bubble and the main shelf.
@@ -39,17 +39,18 @@
 
 // Sum of the shelf button size and the gap between shelf buttons.
 int GetUnit() {
-  return ShelfConstants::button_size() + ShelfConstants::button_spacing();
+  return ShelfConfig::Get()->button_size() +
+         ShelfConfig::Get()->button_spacing();
 }
 
 // Decides whether the current first visible shelf icon of the overflow shelf
 // should be hidden or fully shown when gesture scroll ends.
 int GetGestureDragTheshold() {
-  return ShelfConstants::button_size() / 2;
+  return ShelfConfig::Get()->button_size() / 2;
 }
 
 int GetBubbleCornerRadius() {
-  return ShelfConstants::button_size() / 2;
+  return ShelfConfig::Get()->button_size() / 2;
 }
 
 }  // namespace
@@ -81,7 +82,8 @@
       const float dsf = canvas->UndoDeviceScaleFactor();
       cc::PaintFlags fg_flags;
       fg_flags.setAntiAlias(true);
-      fg_flags.setColor(kShelfControlPermanentHighlightBackground);
+      fg_flags.setColor(
+          ShelfConfig::Get()->shelf_control_permanent_highlight_background());
 
       const float radius = std::ceil(ring_radius_dp * dsf);
       canvas->DrawCircle(gfx::ScalePoint(circle_center, dsf), radius, fg_flags);
@@ -228,7 +230,7 @@
   DCHECK(shelf_view_);
   DCHECK(GetShelf());
 
-  set_border_radius(ShelfConstants::shelf_size() / 2);
+  set_border_radius(ShelfConfig::Get()->shelf_size() / 2);
   SetArrow(views::BubbleBorder::NONE);
   SetBackground(nullptr);
   set_shadow(views::BubbleBorder::NO_ASSETS);
@@ -488,8 +490,8 @@
 void OverflowBubbleView::Layout() {
   UpdateLayoutStrategy();
 
-  const gfx::Size shelf_button_size(ShelfConstants::button_size(),
-                                    ShelfConstants::button_size());
+  const gfx::Size shelf_button_size(ShelfConfig::Get()->button_size(),
+                                    ShelfConfig::Get()->button_size());
   const gfx::Size arrow_button_size(GetArrowButtonSize(), GetArrowButtonSize());
 
   bool is_horizontal = GetShelf()->IsHorizontalAlignment();
@@ -513,7 +515,7 @@
       layout_strategy_ == SHOW_BUTTONS) {
     left_arrow_bounds = gfx::Rect(shelf_button_size);
     left_arrow_bounds.ClampToCenteredSize(arrow_button_size);
-    shelf_container_bounds.Inset(ShelfConstants::button_size() +
+    shelf_container_bounds.Inset(ShelfConfig::Get()->button_size() +
                                      GetDistanceToArrowButton() -
                                      fading_zone_inset,
                                  0, 0, 0);
@@ -521,7 +523,7 @@
 
   if (layout_strategy_ == SHOW_RIGHT_ARROW_BUTTON ||
       layout_strategy_ == SHOW_BUTTONS) {
-    shelf_container_bounds.Inset(0, 0, ShelfConstants::button_size(), 0);
+    shelf_container_bounds.Inset(0, 0, ShelfConfig::Get()->button_size(), 0);
     right_arrow_bounds =
         gfx::Rect(shelf_container_bounds.top_right(), shelf_button_size);
     right_arrow_bounds.ClampToCenteredSize(arrow_button_size);
@@ -647,7 +649,8 @@
   const gfx::Rect anchor_rect = GetAnchorRect();
   const int distance_to_overflow_button =
       kDistanceToMainShelf +
-      (ShelfConstants::shelf_size() - ShelfConstants::control_size()) / 2;
+      (ShelfConfig::Get()->shelf_size() - ShelfConfig::Get()->control_size()) /
+          2;
   gfx::Rect monitor_rect =
       display::Screen::GetScreen()
           ->GetDisplayNearestPoint(anchor_rect.CenterPoint())
@@ -709,7 +712,7 @@
 }
 
 int OverflowBubbleView::GetArrowButtonSize() {
-  static int kArrowButtonSize = ShelfConstants::control_size();
+  static int kArrowButtonSize = ShelfConfig::Get()->control_size();
   return kArrowButtonSize;
 }
 
diff --git a/ash/shelf/overflow_button.cc b/ash/shelf/overflow_button.cc
index 923b995..5fd1b00e 100644
--- a/ash/shelf/overflow_button.cc
+++ b/ash/shelf/overflow_button.cc
@@ -6,10 +6,10 @@
 
 #include <memory>
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "chromeos/constants/chromeos_switches.h"
@@ -30,7 +30,8 @@
 
   horizontal_dots_image_view_ = new views::ImageView();
   horizontal_dots_image_view_->SetImage(
-      gfx::CreateVectorIcon(kShelfOverflowHorizontalDotsIcon, kShelfIconColor));
+      gfx::CreateVectorIcon(kShelfOverflowHorizontalDotsIcon,
+                            ShelfConfig::Get()->shelf_icon_color()));
   SetLayoutManager(std::make_unique<views::FillLayout>());
   AddChildView(horizontal_dots_image_view_);
 }
diff --git a/ash/shelf/scroll_arrow_view.cc b/ash/shelf/scroll_arrow_view.cc
index cb70415..3f80e3a 100644
--- a/ash/shelf/scroll_arrow_view.cc
+++ b/ash/shelf/scroll_arrow_view.cc
@@ -4,9 +4,9 @@
 
 #include "ash/shelf/scroll_arrow_view.h"
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image_skia_operations.h"
@@ -69,8 +69,9 @@
   gfx::Rect bounds = gfx::Rect(size());
   return std::make_unique<views::FloodFillInkDropRipple>(
       size(), GetLocalBounds().InsetsFrom(bounds),
-      GetInkDropCenterBasedOnLastEvent(), kShelfInkDropBaseColor,
-      kShelfInkDropVisibleOpacity);
+      GetInkDropCenterBasedOnLastEvent(),
+      ShelfConfig::Get()->shelf_ink_drop_base_color(),
+      ShelfConfig::Get()->shelf_ink_drop_visible_opacity());
 }
 
 }  // namespace ash
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc
index 4685595..004049e 100644
--- a/ash/shelf/scrollable_shelf_view.cc
+++ b/ash/shelf/scrollable_shelf_view.cc
@@ -4,10 +4,11 @@
 
 #include "ash/shelf/scrollable_shelf_view.h"
 
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf_focus_cycler.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
+#include "base/numerics/ranges.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/geometry/insets.h"
@@ -40,7 +41,8 @@
 
 // Sum of the shelf button size and the gap between shelf buttons.
 int GetUnit() {
-  return ShelfConstants::button_size() + ShelfConstants::button_spacing();
+  return ShelfConfig::Get()->button_size() +
+         ShelfConfig::Get()->button_spacing();
 }
 
 // Length of the fade in/out zone.
@@ -51,7 +53,7 @@
 // Decides whether the current first visible shelf icon of the scrollable shelf
 // should be hidden or fully shown when gesture scroll ends.
 int GetGestureDragThreshold() {
-  return ShelfConstants::button_size() / 2;
+  return ShelfConfig::Get()->button_size() / 2;
 }
 
 // Returns the padding between the app icon and the end of the ScrollableShelf.
@@ -64,7 +66,7 @@
 // Calculates the padding for overflow.
 int CalculateOverflowPadding(int available_size) {
   return (available_size - kArrowButtonGroupWidth -
-          ShelfConstants::button_size() - GetAppIconEndPadding()) %
+          ShelfConfig::Get()->button_size() - GetAppIconEndPadding()) %
          GetUnit();
 }
 
@@ -328,7 +330,7 @@
 
 float ScrollableShelfView::CalculateClampedScrollOffset(float scroll) const {
   const float scroll_upper_bound = CalculateScrollUpperBound();
-  scroll = std::min(scroll_upper_bound, std::max(0.f, scroll));
+  scroll = base::ClampToRange(scroll, 0.0f, scroll_upper_bound);
   return scroll;
 }
 
@@ -395,11 +397,11 @@
 
 void ScrollableShelfView::Layout() {
   const bool is_horizontal = GetShelf()->IsHorizontalAlignment();
-  const int adjusted_length =
-      (is_horizontal ? width() : height()) - 2 * kAppIconGroupMargin;
+  const int adjusted_length = (is_horizontal ? width() : height()) -
+                              2 * ShelfConfig::Get()->app_icon_group_margin();
   UpdateLayoutStrategy(adjusted_length);
 
-  // Both |left_padding| and |right_padding| include kAppIconGroupMargin.
+  // Both |left_padding| and |right_padding| include the app icon group margin.
   gfx::Insets padding_insets = CalculateEdgePadding();
   const int left_padding = padding_insets.left();
   const int right_padding = padding_insets.right();
@@ -563,12 +565,13 @@
 gfx::Insets ScrollableShelfView::CalculateEdgePadding() const {
   const int available_size_for_app_icons =
       (GetShelf()->IsHorizontalAlignment() ? width() : height()) -
-      2 * kAppIconGroupMargin;
+      2 * ShelfConfig::Get()->app_icon_group_margin();
   const int icons_size = shelf_view_->GetSizeOfAppIcons(
       shelf_view_->number_of_visible_apps(), false);
 
-  gfx::Insets padding_insets(/*vertical= */ 0,
-                             /*horizontal= */ kAppIconGroupMargin);
+  gfx::Insets padding_insets(
+      /*vertical= */ 0,
+      /*horizontal= */ ShelfConfig::Get()->app_icon_group_margin());
   int gap = layout_strategy_ == kNotShowArrowButtons
                 ? available_size_for_app_icons - icons_size -
                       2 * GetAppIconEndPadding()
@@ -736,7 +739,7 @@
   // Implement the arrow button handler in the same way with the gesture
   // scrolling. The key is to calculate the suitable scroll distance.
   float offset = space_for_icons_ - kArrowButtonGroupWidth -
-                 ShelfConstants::button_size() - GetAppIconEndPadding();
+                 ShelfConfig::Get()->button_size() - GetAppIconEndPadding();
   if (layout_strategy_ == kShowRightArrowButton)
     offset -= (kArrowButtonGroupWidth - GetAppIconEndPadding());
   DCHECK_GT(offset, 0);
diff --git a/ash/shelf/shelf_app_button.cc b/ash/shelf/shelf_app_button.cc
index cc9c0a2..d4daa3de 100644
--- a/ash/shelf/shelf_app_button.cc
+++ b/ash/shelf/shelf_app_button.cc
@@ -8,10 +8,10 @@
 #include <memory>
 
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
@@ -351,7 +351,7 @@
     return;
   }
 
-  const int icon_size = ShelfConstants::button_icon_size();
+  const int icon_size = ShelfConfig::Get()->button_icon_size();
 
   // Resize the image maintaining our aspect ratio.
   float aspect_ratio =
@@ -555,12 +555,13 @@
 void ShelfAppButton::Layout() {
   // TODO: Find out why there is an extra pixel of padding between each item
   // and the inner side of the shelf.
-  int icon_padding =
-      (ShelfConstants::shelf_size() - ShelfConstants::button_icon_size()) / 2 -
-      1;
-  const int icon_size = ShelfConstants::button_icon_size();
+  // clang-format off
+  int icon_padding = (ShelfConfig::Get()->shelf_size() -
+                      ShelfConfig::Get()->button_icon_size()) / 2 - 1;
+  // clang-format on
+  const int icon_size = ShelfConfig::Get()->button_icon_size();
   const int status_indicator_offet_from_shelf_edge =
-      ShelfConstants::status_indicator_offset_from_edge();
+      ShelfConfig::Get()->status_indicator_offset_from_shelf_edge();
 
   const gfx::Rect button_bounds(GetContentsBounds());
   Shelf* shelf = shelf_view_->shelf();
@@ -715,7 +716,7 @@
 
 std::unique_ptr<views::InkDropRipple> ShelfAppButton::CreateInkDropRipple()
     const {
-  const int ink_drop_small_size = ash::ShelfConstants::shelf_size();
+  const int ink_drop_small_size = ash::ShelfConfig::Get()->shelf_size();
   return std::make_unique<views::SquareInkDropRipple>(
       gfx::Size(kInkDropLargeSize, kInkDropLargeSize),
       ink_drop_large_corner_radius(),
diff --git a/ash/shelf/shelf_background_animator.cc b/ash/shelf/shelf_background_animator.cc
index 97f21d6..f5a2aa3 100644
--- a/ash/shelf/shelf_background_animator.cc
+++ b/ash/shelf/shelf_background_animator.cc
@@ -9,10 +9,11 @@
 
 #include "ash/animation/animation_change_type.h"
 #include "ash/public/cpp/login_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/wallpaper_types.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_background_animator_observer.h"
-#include "ash/shelf/shelf_constants.h"
+#include "ash/shell.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/color_analysis.h"
@@ -55,10 +56,20 @@
 }
 
 ShelfBackgroundAnimator::ShelfBackgroundAnimator(
-    ShelfBackgroundType background_type,
     Shelf* shelf,
     WallpaperControllerImpl* wallpaper_controller)
-    : shelf_(shelf), wallpaper_controller_(wallpaper_controller) {
+    : shelf_(shelf),
+      wallpaper_controller_(wallpaper_controller),
+      shelf_config_(Shell::HasInstance() ? ShelfConfig::Get() : nullptr) {}
+
+ShelfBackgroundAnimator::~ShelfBackgroundAnimator() {
+  if (wallpaper_controller_)
+    wallpaper_controller_->RemoveObserver(this);
+  if (shelf_)
+    shelf_->RemoveObserver(this);
+}
+
+void ShelfBackgroundAnimator::Init(ShelfBackgroundType background_type) {
   if (wallpaper_controller_)
     wallpaper_controller_->AddObserver(this);
   if (shelf_)
@@ -69,13 +80,6 @@
   AnimateBackground(background_type, AnimationChangeType::IMMEDIATE);
 }
 
-ShelfBackgroundAnimator::~ShelfBackgroundAnimator() {
-  if (wallpaper_controller_)
-    wallpaper_controller_->RemoveObserver(this);
-  if (shelf_)
-    shelf_->RemoveObserver(this);
-}
-
 void ShelfBackgroundAnimator::AddObserver(
     ShelfBackgroundAnimatorObserver* observer) {
   observers_.AddObserver(observer);
@@ -122,12 +126,12 @@
   switch (background_type) {
     case SHELF_BACKGROUND_DEFAULT:
     case SHELF_BACKGROUND_OVERVIEW:
-      return kShelfTranslucentAlpha;
+      return shelf_config_->shelf_translucent_alpha();
     case SHELF_BACKGROUND_MAXIMIZED:
-      return kShelfTranslucentMaximizedWindow;
+      return shelf_config_->shelf_translucent_maximized_window();
     case SHELF_BACKGROUND_APP_LIST:
     case SHELF_BACKGROUND_MAXIMIZED_WITH_APP_LIST:
-      return kShelfTranslucentOverAppList;
+      return shelf_config_->shelf_translucent_over_app_list();
     case SHELF_BACKGROUND_OOBE:
       return SK_AlphaTRANSPARENT;
     case SHELF_BACKGROUND_LOGIN:
@@ -138,6 +142,10 @@
   return SK_AlphaTRANSPARENT;
 }
 
+void ShelfBackgroundAnimator::SetShelfConfigForTest(ShelfConfig* shelf_config) {
+  shelf_config_ = shelf_config;
+}
+
 void ShelfBackgroundAnimator::OnWallpaperColorsChanged() {
   AnimateBackground(target_background_type_, AnimationChangeType::ANIMATE);
 }
@@ -233,25 +241,28 @@
   // Fetches wallpaper color and darkens it.
   auto darken_wallpaper = [&](int darkening_alpha) {
     if (!wallpaper_controller_)
-      return kShelfDefaultBaseColor;
+      return shelf_config_->shelf_default_base_color();
     SkColor target_color =
         wallpaper_controller_->GetProminentColor(GetShelfColorProfile());
     if (target_color == kInvalidWallpaperColor)
-      return kShelfDefaultBaseColor;
+      return shelf_config_->shelf_default_base_color();
     return color_utils::GetResultingPaintColor(
-        SkColorSetA(kShelfDefaultBaseColor, darkening_alpha), target_color);
+        SkColorSetA(shelf_config_->shelf_default_base_color(), darkening_alpha),
+        target_color);
   };
 
-  SkColor shelf_target_color = kShelfDefaultBaseColor;
+  SkColor shelf_target_color = shelf_config_->shelf_default_base_color();
   switch (background_type) {
     case SHELF_BACKGROUND_DEFAULT:
     case SHELF_BACKGROUND_APP_LIST:
     case SHELF_BACKGROUND_MAXIMIZED_WITH_APP_LIST:
     case SHELF_BACKGROUND_OVERVIEW:
-      shelf_target_color = darken_wallpaper(kShelfTranslucentColorDarkenAlpha);
+      shelf_target_color = darken_wallpaper(
+          shelf_config_->shelf_translucent_color_darken_alpha());
       break;
     case SHELF_BACKGROUND_MAXIMIZED:
-      shelf_target_color = darken_wallpaper(kShelfOpaqueColorDarkenAlpha);
+      shelf_target_color =
+          darken_wallpaper(shelf_config_->shelf_opaque_color_darken_alpha());
       break;
     case SHELF_BACKGROUND_OOBE:
       shelf_target_color = SK_ColorTRANSPARENT;
diff --git a/ash/shelf/shelf_background_animator.h b/ash/shelf/shelf_background_animator.h
index d43884c..0281039 100644
--- a/ash/shelf/shelf_background_animator.h
+++ b/ash/shelf/shelf_background_animator.h
@@ -25,6 +25,7 @@
 
 enum class AnimationChangeType;
 class Shelf;
+class ShelfConfig;
 class ShelfBackgroundAnimatorObserver;
 class ShelfBackgroundAnimatorTestApi;
 class WallpaperControllerImpl;
@@ -46,13 +47,14 @@
   // The maximum alpha value that can be used.
   static const int kMaxAlpha = SK_AlphaOPAQUE;
 
+  ShelfBackgroundAnimator(Shelf* shelf,
+                          WallpaperControllerImpl* wallpaper_controller);
+  ~ShelfBackgroundAnimator() override;
+
   // Initializes this with the given |background_type|. This will observe the
   // |shelf| for background type changes and the |wallpaper_controller| for
   // wallpaper changes if not null.
-  ShelfBackgroundAnimator(ShelfBackgroundType background_type,
-                          Shelf* shelf,
-                          WallpaperControllerImpl* wallpaper_controller);
-  ~ShelfBackgroundAnimator() override;
+  void Init(ShelfBackgroundType background_type);
 
   ShelfBackgroundType target_background_type() const {
     return target_background_type_;
@@ -85,6 +87,9 @@
   // Gets the alpha value of |background_type|.
   int GetBackgroundAlphaValue(ShelfBackgroundType background_type) const;
 
+  // Set the shelf_config to use for tests when there is no Shell instance.
+  void SetShelfConfigForTest(ShelfConfig* shelf_config);
+
  protected:
   // ShelfObserver:
   void OnBackgroundTypeChanged(ShelfBackgroundType background_type,
@@ -176,6 +181,9 @@
   // Tracks the item background animation values.
   AnimationValues item_background_values_;
 
+  // The shelf config to access the needed shelf constants.
+  ShelfConfig* shelf_config_ = nullptr;
+
   base::ObserverList<ShelfBackgroundAnimatorObserver>::Unchecked observers_;
 
   DISALLOW_COPY_AND_ASSIGN(ShelfBackgroundAnimator);
diff --git a/ash/shelf/shelf_background_animator_unittest.cc b/ash/shelf/shelf_background_animator_unittest.cc
index d8fc943..bbe28df 100644
--- a/ash/shelf/shelf_background_animator_unittest.cc
+++ b/ash/shelf/shelf_background_animator_unittest.cc
@@ -8,10 +8,10 @@
 
 #include "ash/animation/animation_change_type.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_background_animator_observer.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -116,6 +116,9 @@
   // Used to control the animations.
   scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
 
+  // Used to access shelf constants without instantiating a shell.
+  std::unique_ptr<ShelfConfig> shelf_config_;
+
  private:
   std::unique_ptr<base::ThreadTaskRunnerHandle> task_runner_handle_;
 
@@ -126,8 +129,11 @@
   task_runner_ = new base::TestMockTimeTaskRunner();
   task_runner_handle_.reset(new base::ThreadTaskRunnerHandle(task_runner_));
 
-  animator_.reset(
-      new ShelfBackgroundAnimator(SHELF_BACKGROUND_DEFAULT, nullptr, nullptr));
+  shelf_config_ = std::make_unique<ShelfConfig>();
+
+  animator_ = std::make_unique<ShelfBackgroundAnimator>(nullptr, nullptr);
+  animator_->SetShelfConfigForTest(shelf_config_.get());
+  animator_->Init(SHELF_BACKGROUND_DEFAULT);
   animator_->AddObserver(&observer_);
 
   test_api_.reset(new ShelfBackgroundAnimatorTestApi(animator_.get()));
@@ -197,7 +203,8 @@
   PaintBackground(SHELF_BACKGROUND_DEFAULT);
 
   EXPECT_EQ(SHELF_BACKGROUND_DEFAULT, animator_->target_background_type());
-  EXPECT_EQ(kShelfTranslucentAlpha, observer_.GetBackgroundAlpha());
+  EXPECT_EQ(shelf_config_->shelf_translucent_alpha(),
+            observer_.GetBackgroundAlpha());
 }
 
 // Verify the alpha values for the SHELF_BACKGROUND_MAXIMIZED state.
@@ -205,7 +212,8 @@
   PaintBackground(SHELF_BACKGROUND_MAXIMIZED);
 
   EXPECT_EQ(SHELF_BACKGROUND_MAXIMIZED, animator_->target_background_type());
-  EXPECT_EQ(kShelfTranslucentMaximizedWindow, observer_.GetBackgroundAlpha());
+  EXPECT_EQ(shelf_config_->shelf_translucent_maximized_window(),
+            observer_.GetBackgroundAlpha());
 }
 
 // Verify the alpha values for the SHELF_BACKGROUND_APP_LIST state.
@@ -213,7 +221,8 @@
   PaintBackground(SHELF_BACKGROUND_APP_LIST);
 
   EXPECT_EQ(SHELF_BACKGROUND_APP_LIST, animator_->target_background_type());
-  EXPECT_EQ(kShelfTranslucentOverAppList, observer_.GetBackgroundAlpha());
+  EXPECT_EQ(shelf_config_->shelf_translucent_over_app_list(),
+            observer_.GetBackgroundAlpha());
 }
 
 TEST_F(ShelfBackgroundAnimatorTest,
@@ -302,7 +311,8 @@
 
   NotifySessionStateChanged(session_manager::SessionState::ACTIVE);
   EXPECT_EQ(test_api.shelf_background_target_color(),
-            SkColorSetA(kShelfDefaultBaseColor, kShelfTranslucentAlpha));
+            SkColorSetA(ShelfConfig::Get()->shelf_default_base_color(),
+                        ShelfConfig::Get()->shelf_translucent_alpha()));
 }
 
 // Verify the target color of the shelf background is updated based on session
@@ -324,7 +334,8 @@
 
   NotifySessionStateChanged(session_manager::SessionState::ACTIVE);
   EXPECT_EQ(test_api.shelf_background_target_color(),
-            SkColorSetA(kShelfDefaultBaseColor, kShelfTranslucentAlpha));
+            SkColorSetA(ShelfConfig::Get()->shelf_default_base_color(),
+                        ShelfConfig::Get()->shelf_translucent_alpha()));
 }
 
 }  // namespace ash
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc
index 69e1c1ea..6e252bb 100644
--- a/ash/shelf/shelf_bubble.cc
+++ b/ash/shelf/shelf_bubble.cc
@@ -32,11 +32,11 @@
                          ShelfAlignment alignment,
                          SkColor background_color)
     : views::BubbleDialogDelegateView(anchor, GetArrow(alignment)),
-      background_animator_(SHELF_BACKGROUND_DEFAULT,
-                           // Don't pass the Shelf so the translucent color is
-                           // always used.
-                           nullptr,
-                           Shell::Get()->wallpaper_controller()) {
+      background_animator_(
+          /* Don't pass the Shelf so the translucent color is always used. */
+          nullptr,
+          Shell::Get()->wallpaper_controller()) {
+  background_animator_.Init(SHELF_BACKGROUND_DEFAULT);
   background_animator_.AddObserver(this);
 
   // Place the bubble in the same display as the anchor.
diff --git a/ash/shelf/shelf_button.cc b/ash/shelf/shelf_button.cc
index 6b4714b..5efa24b 100644
--- a/ash/shelf/shelf_button.cc
+++ b/ash/shelf/shelf_button.cc
@@ -5,9 +5,9 @@
 #include "ash/shelf/shelf_button.h"
 
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/views/animation/ink_drop_impl.h"
 
@@ -20,12 +20,14 @@
       shelf_button_delegate_(shelf_button_delegate) {
   DCHECK(shelf_button_delegate_);
   set_hide_ink_drop_when_showing_context_menu(false);
-  set_ink_drop_base_color(kShelfInkDropBaseColor);
-  set_ink_drop_visible_opacity(kShelfInkDropVisibleOpacity);
+  set_ink_drop_base_color(ShelfConfig::Get()->shelf_ink_drop_base_color());
+  set_ink_drop_visible_opacity(
+      ShelfConfig::Get()->shelf_ink_drop_visible_opacity());
   SetFocusBehavior(FocusBehavior::ALWAYS);
   SetInkDropMode(InkDropMode::ON_NO_GESTURE_HANDLER);
   SetFocusPainter(views::Painter::CreateSolidFocusPainter(
-      kShelfFocusBorderColor, kFocusBorderThickness, gfx::InsetsF()));
+      ShelfConfig::Get()->shelf_focus_border_color(), kFocusBorderThickness,
+      gfx::InsetsF()));
 }
 
 ShelfButton::~ShelfButton() = default;
diff --git a/ash/shelf/shelf_config.cc b/ash/shelf/shelf_config.cc
new file mode 100644
index 0000000..54b6b0e
--- /dev/null
+++ b/ash/shelf/shelf_config.cc
@@ -0,0 +1,94 @@
+// Copyright (c) 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 "ash/public/cpp/shelf_config.h"
+
+#include "ash/shell.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "ui/gfx/color_palette.h"
+
+namespace ash {
+
+ShelfConfig::ShelfConfig()
+    : is_dense_(chromeos::switches::ShouldShowShelfDenseClamshell()),
+      shelf_size_(56),
+      shelf_size_dense_(48),
+      shelf_button_icon_size_(44),
+      shelf_button_icon_size_dense_(36),
+      shelf_control_size_(40),
+      shelf_control_size_dense_(36),
+      shelf_button_size_(shelf_size_),
+      shelf_button_size_dense_(shelf_size_dense_),
+      shelf_button_spacing_(8),
+      shelf_home_button_edge_spacing_(8),
+      shelf_home_button_edge_spacing_dense_(6),
+      shelf_overflow_button_margin_((shelf_button_size_ - shelf_control_size_) /
+                                    2),
+      shelf_overflow_button_margin_dense_(
+          (shelf_button_size_dense_ - shelf_control_size_dense_) / 2),
+      app_icon_group_margin_(16),
+      shelf_control_permanent_highlight_background_(
+          SkColorSetA(SK_ColorWHITE, 26)),  // 10%
+      shelf_focus_border_color_(gfx::kGoogleBlue300),
+      workspace_area_visible_inset_(2),
+      workspace_area_auto_hide_inset_(5),
+      hidden_shelf_in_screen_portion_(3),
+      shelf_default_base_color_(gfx::kGoogleGrey900),
+      shelf_ink_drop_base_color_(SK_ColorWHITE),
+      shelf_ink_drop_visible_opacity_(0.2f),
+      shelf_icon_color_(SK_ColorWHITE),
+      shelf_translucent_over_app_list_(51),      // 20%
+      shelf_translucent_alpha_(189),             // 74%
+      shelf_translucent_maximized_window_(254),  // ~100%
+      shelf_translucent_color_darken_alpha_(178),
+      shelf_opaque_color_darken_alpha_(178),
+      status_indicator_offset_from_shelf_edge_(1),
+      shelf_tooltip_preview_height_(128),
+      shelf_tooltip_preview_max_width_(192),
+      shelf_tooltip_preview_max_ratio_(1.5),   // = 3/2
+      shelf_tooltip_preview_min_ratio_(0.666)  // = 2/3
+{}
+
+ShelfConfig::~ShelfConfig() = default;
+
+// static
+ShelfConfig* ShelfConfig::Get() {
+  return Shell::Get()->shelf_config();
+}
+
+int ShelfConfig::shelf_size() const {
+  return is_dense_ ? shelf_size_dense_ : shelf_size_;
+}
+
+int ShelfConfig::button_size() const {
+  return is_dense_ ? shelf_button_size_dense_ : shelf_button_size_;
+}
+
+int ShelfConfig::button_spacing() const {
+  return shelf_button_spacing_;
+}
+
+int ShelfConfig::button_icon_size() const {
+  return is_dense_ ? shelf_button_icon_size_dense_ : shelf_button_icon_size_;
+}
+
+int ShelfConfig::control_size() const {
+  return is_dense_ ? shelf_control_size_dense_ : shelf_control_size_;
+}
+
+int ShelfConfig::control_border_radius() const {
+  return control_size() / 2;
+}
+
+int ShelfConfig::overflow_button_margin() const {
+  return is_dense_ ? shelf_overflow_button_margin_dense_
+                   : shelf_overflow_button_margin_;
+}
+
+int ShelfConfig::home_button_edge_spacing() const {
+  return is_dense_ ? shelf_home_button_edge_spacing_dense_
+                   : shelf_home_button_edge_spacing_;
+}
+
+}  // namespace ash
diff --git a/ash/shelf/shelf_constants.h b/ash/shelf/shelf_constants.h
deleted file mode 100644
index 3de417b9..0000000
--- a/ash/shelf/shelf_constants.h
+++ /dev/null
@@ -1,164 +0,0 @@
-// 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 ASH_SHELF_SHELF_CONSTANTS_H_
-#define ASH_SHELF_SHELF_CONSTANTS_H_
-
-#include "ash/ash_export.h"
-#include "base/macros.h"
-#include "chromeos/constants/chromeos_switches.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/color_palette.h"
-
-namespace ash {
-
-// TODO: Once the new shelf UI is on everywhere, clean-up duplicate constants.
-
-// Size of the shelf when visible (height when the shelf is horizontal and
-// width when the shelf is vertical).
-constexpr int kShelfSize = 56;
-constexpr int kShelfSizeDense = 48;
-
-// Size of the icons within shelf buttons.
-constexpr int kShelfButtonIconSize = 44;
-constexpr int kShelfButtonIconSizeDense = 36;
-
-// Size for controls like the home button, back button, etc.
-constexpr int kShelfControlSize = 40;
-constexpr int kShelfControlSizeDense = 36;
-
-// The margin on either side of the group of app icons (including the overflow
-// button).
-constexpr int kAppIconGroupMargin = 16;
-
-ASH_EXPORT constexpr SkColor kShelfControlPermanentHighlightBackground =
-    SkColorSetA(SK_ColorWHITE, 26);  // 10%
-
-constexpr SkColor kShelfFocusBorderColor = gfx::kGoogleBlue300;
-
-// We reserve a small area on the edge of the workspace area to ensure that
-// the resize handle at the edge of the window can be hit.
-constexpr int kWorkspaceAreaVisibleInset = 2;
-
-// When autohidden we extend the touch hit target onto the screen so that the
-// user can drag the shelf out.
-constexpr int kWorkspaceAreaAutoHideInset = 5;
-
-// Portion of the shelf that's within the screen bounds when auto-hidden.
-ASH_EXPORT constexpr int kHiddenShelfInScreenPortion = 3;
-
-// The default base color of the shelf to which different alpha values are
-// applied based on the desired shelf opacity level.
-ASH_EXPORT constexpr SkColor kShelfDefaultBaseColor = gfx::kGoogleGrey900;
-
-// Size allocated for each app button on the shelf.
-ASH_EXPORT constexpr int kShelfButtonSize = kShelfSize;
-ASH_EXPORT constexpr int kShelfButtonSizeDense = kShelfSizeDense;
-
-// Size of the space between buttons on the shelf.
-ASH_EXPORT constexpr int kShelfButtonSpacing = 8;
-
-// Size of the space between edge of screen and home button.
-ASH_EXPORT constexpr int kShelfHomeButtonEdgeSpacing = 8;
-ASH_EXPORT constexpr int kShelfHomeButtonEdgeSpacingDense = 6;
-
-// The margin around the overflow button on the shelf.
-constexpr int kShelfOverflowButtonMargin =
-    (kShelfButtonSize - kShelfControlSize) / 2;
-constexpr int kShelfOverflowButtonMarginDense =
-    (kShelfButtonSizeDense - kShelfControlSizeDense) / 2;
-
-// Ink drop color for shelf items.
-constexpr SkColor kShelfInkDropBaseColor = SK_ColorWHITE;
-
-// Opacity of the ink drop ripple for shelf items when the ripple is visible.
-constexpr float kShelfInkDropVisibleOpacity = 0.2f;
-
-// The foreground color of the icons used in the shelf (launcher,
-// notifications, etc).
-ASH_EXPORT constexpr SkColor kShelfIconColor = SK_ColorWHITE;
-
-// The alpha value for the shelf background.
-ASH_EXPORT constexpr int kShelfTranslucentOverAppList = 51;            // 20%
-ASH_EXPORT constexpr int kShelfTranslucentAlpha = 189;                 // 74%
-// Using 0xFF causes clipping on the overlay candidate content, which prevent
-// HW overlay, probably due to a bug in compositor. Fix it and use 0xFF.
-// crbug.com/901538
-ASH_EXPORT constexpr int kShelfTranslucentMaximizedWindow = 254;       // ~100%
-
-// The alpha value used to darken a colorized shelf when the shelf is
-// translucent.
-constexpr int kShelfTranslucentColorDarkenAlpha = 178;
-
-// The alpha value used to darken a colorized shelf when the shelf is opaque.
-constexpr int kShelfOpaqueColorDarkenAlpha = 178;
-
-// The distance between the edge of the shelf and the status indicators.
-constexpr int kStatusIndicatorOffsetFromShelfEdge = 1;
-
-// Dimensions for hover previews.
-constexpr int kShelfTooltipPreviewHeight = 128;
-constexpr int kShelfTooltipPreviewMaxWidth = 192;
-constexpr float kShelfTooltipPreviewMaxRatio = 1.5;    // = 3/2
-constexpr float kShelfTooltipPreviewMinRatio = 0.666;  // = 2/3
-
-class ShelfConstants {
- public:
-  // Size of the shelf when visible (height when the shelf is horizontal and
-  // width when the shelf is vertical).
-  static int shelf_size() {
-    return UseNewDenseShelfUi() ? kShelfSizeDense : kShelfSize;
-  }
-
-  // Size allocated for each app button on the shelf.
-  static int button_size() {
-    return UseNewDenseShelfUi() ? kShelfButtonSizeDense : kShelfButtonSize;
-  }
-
-  // Size of the space between buttons on the shelf.
-  static int button_spacing() { return kShelfButtonSpacing; }
-
-  // Size of the icons within shelf buttons.
-  static int button_icon_size() {
-    return UseNewDenseShelfUi() ? kShelfButtonIconSizeDense
-                                : kShelfButtonIconSize;
-  }
-
-  // Size for controls like the home button, back button, etc.
-  static int control_size() {
-    return UseNewDenseShelfUi() ? kShelfControlSizeDense : kShelfControlSize;
-  }
-
-  // The radius of shelf control buttons.
-  static int control_border_radius() { return control_size() / 2; }
-
-  static int overflow_button_margin() {
-    return UseNewDenseShelfUi() ? kShelfOverflowButtonMarginDense
-                                : kShelfOverflowButtonMargin;
-  }
-
-  // The distance between the edge of the shelf and the status indicators.
-  static int status_indicator_offset_from_edge() {
-    return kStatusIndicatorOffsetFromShelfEdge;
-  }
-
-  // The distance between the edge of the shelf and the home and back button.
-  static int home_button_edge_spacing() {
-    return UseNewDenseShelfUi() ? kShelfHomeButtonEdgeSpacingDense
-                                : kShelfHomeButtonEdgeSpacing;
-  }
-
- private:
-  static bool UseNewDenseShelfUi() {
-    static bool use_new_dense_shelf_ui =
-        chromeos::switches::ShouldShowShelfDenseClamshell();
-    return use_new_dense_shelf_ui;
-  }
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ShelfConstants);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SHELF_SHELF_CONSTANTS_H_
diff --git a/ash/shelf/shelf_container_view.cc b/ash/shelf/shelf_container_view.cc
index 7bd1d23..5e03d01 100644
--- a/ash/shelf/shelf_container_view.cc
+++ b/ash/shelf/shelf_container_view.cc
@@ -4,7 +4,7 @@
 
 #include "ash/shelf/shelf_container_view.h"
 
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 
 namespace ash {
 
@@ -28,7 +28,7 @@
       ShelfView::GetSizeOfAppIcons(shelf_view_->last_visible_index() -
                                        shelf_view_->first_visible_index() + 1,
                                    false);
-  const int height = ShelfConstants::button_size();
+  const int height = ShelfConfig::Get()->button_size();
   return shelf_view_->shelf()->IsHorizontalAlignment()
              ? gfx::Size(width, height)
              : gfx::Size(height, width);
diff --git a/ash/shelf/shelf_control_button.cc b/ash/shelf/shelf_control_button.cc
index 9a890fc..d314f7a 100644
--- a/ash/shelf/shelf_control_button.cc
+++ b/ash/shelf/shelf_control_button.cc
@@ -5,9 +5,9 @@
 #include "ash/shelf/shelf_control_button.h"
 
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shelf/shelf_button_delegate.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/gfx/canvas.h"
@@ -26,7 +26,7 @@
     : ShelfButton(shelf, shelf_button_delegate) {
   set_has_ink_drop_action_on_click(true);
   SetInstallFocusRingOnFocus(true);
-  focus_ring()->SetColor(kShelfFocusBorderColor);
+  focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   SetFocusPainter(nullptr);
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
@@ -40,7 +40,7 @@
 
 std::unique_ptr<views::InkDropRipple> ShelfControlButton::CreateInkDropRipple()
     const {
-  const int button_radius = ShelfConstants::control_border_radius();
+  const int button_radius = ShelfConfig::Get()->control_border_radius();
   gfx::Point center = GetCenterPoint();
   gfx::Rect bounds(center.x() - button_radius, center.y() - button_radius,
                    2 * button_radius, 2 * button_radius);
@@ -53,7 +53,7 @@
 std::unique_ptr<views::InkDropMask> ShelfControlButton::CreateInkDropMask()
     const {
   return std::make_unique<views::CircleInkDropMask>(
-      size(), GetCenterPoint(), ShelfConstants::control_border_radius());
+      size(), GetCenterPoint(), ShelfConfig::Get()->control_border_radius());
 }
 
 const char* ShelfControlButton::GetClassName() const {
@@ -61,8 +61,8 @@
 }
 
 gfx::Size ShelfControlButton::CalculatePreferredSize() const {
-  return gfx::Size(ShelfConstants::control_size(),
-                   ShelfConstants::control_size());
+  return gfx::Size(ShelfConfig::Get()->control_size(),
+                   ShelfConfig::Get()->control_size());
 }
 
 void ShelfControlButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
@@ -75,15 +75,15 @@
 }
 
 void ShelfControlButton::OnBoundsChanged(const gfx::Rect& previous_bounds) {
-  const int border_radius = ShelfConstants::control_border_radius();
+  const int border_radius = ShelfConfig::Get()->control_border_radius();
   // Some control buttons have a slightly larger size to fill the shelf and
   // maximize the click target, but we still want their "visual" size to be
   // the same, so we find the center point and draw a square around that.
   const gfx::Point center = GetCenterPoint();
-  const int half_size = ShelfConstants::control_size() / 2;
+  const int half_size = ShelfConfig::Get()->control_size() / 2;
   const gfx::Rect visual_size(center.x() - half_size, center.y() - half_size,
-                              ShelfConstants::control_size(),
-                              ShelfConstants::control_size());
+                              ShelfConfig::Get()->control_size(),
+                              ShelfConfig::Get()->control_size());
   auto path = std::make_unique<SkPath>();
   path->addRoundRect(gfx::RectToSkRect(visual_size), border_radius,
                      border_radius);
@@ -95,8 +95,10 @@
                                          const gfx::Rect& bounds) {
   cc::PaintFlags flags;
   flags.setAntiAlias(true);
-  flags.setColor(kShelfControlPermanentHighlightBackground);
-  canvas->DrawRoundRect(bounds, ShelfConstants::control_border_radius(), flags);
+  flags.setColor(
+      ShelfConfig::Get()->shelf_control_permanent_highlight_background());
+  canvas->DrawRoundRect(bounds, ShelfConfig::Get()->control_border_radius(),
+                        flags);
 }
 
 }  // namespace ash
diff --git a/ash/shelf/shelf_controller.cc b/ash/shelf/shelf_controller.cc
index 3cf45c55..5e4fb227 100644
--- a/ash/shelf/shelf_controller.cc
+++ b/ash/shelf/shelf_controller.cc
@@ -10,7 +10,6 @@
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 85b6fa7d..6099613 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -17,13 +17,13 @@
 #include "ash/home_screen/home_screen_controller.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/hotseat_widget.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager_observer.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_widget.h"
@@ -48,6 +48,7 @@
 #include "base/i18n/rtl.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "chromeos/constants/chromeos_switches.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/layer.h"
@@ -317,7 +318,7 @@
 }
 
 gfx::Rect ShelfLayoutManager::GetIdealBounds() const {
-  const int shelf_size = ShelfConstants::shelf_size();
+  const int shelf_size = ShelfConfig::Get()->shelf_size();
   aura::Window* shelf_window = shelf_widget_->GetNativeWindow();
   gfx::Rect rect(screen_util::GetDisplayBoundsInParent(shelf_window));
   return SelectValueForShelfAlignment(
@@ -1116,14 +1117,17 @@
 void ShelfLayoutManager::CalculateTargetBounds(
     const State& state,
     TargetBounds* target_bounds) const {
-  const int shelf_size = ShelfConstants::shelf_size();
+  const int shelf_size = ShelfConfig::Get()->shelf_size();
+  const int home_button_edge_spacing =
+      ShelfConfig::Get()->home_button_edge_spacing();
   // By default, show the whole shelf on the screen.
   int shelf_in_screen_portion = shelf_size;
   const WorkAreaInsets* const work_area =
       WorkAreaInsets::ForWindow(shelf_widget_->GetNativeWindow());
 
   if (state.IsShelfAutoHidden()) {
-    shelf_in_screen_portion = kHiddenShelfInScreenPortion;
+    shelf_in_screen_portion =
+        ShelfConfig::Get()->hidden_shelf_in_screen_portion();
   } else if (state.visibility_state == SHELF_HIDDEN ||
              work_area->IsKeyboardShown()) {
     shelf_in_screen_portion = 0;
@@ -1165,8 +1169,7 @@
   target_bounds->status_bounds_in_shelf = gfx::Rect(status_origin, status_size);
 
   gfx::Point nav_origin =
-      gfx::Point(ShelfConstants::home_button_edge_spacing(),
-                 ShelfConstants::home_button_edge_spacing());
+      gfx::Point(home_button_edge_spacing, home_button_edge_spacing);
   const gfx::Size nav_size = shelf_widget_->navigation_widget()->GetIdealSize();
   if (shelf_->IsHorizontalAlignment() && base::i18n::IsRTL())
     nav_origin.set_x(shelf_width - nav_size.width() - nav_origin.x());
@@ -1176,27 +1179,25 @@
   int hotseat_width;
   int hotseat_height;
   if (shelf_->IsHorizontalAlignment()) {
-    hotseat_width = shelf_width -
-                    target_bounds->nav_bounds_in_shelf.size().width() -
-                    ShelfConstants::home_button_edge_spacing() -
-                    kAppIconGroupMargin - status_size.width();
+    hotseat_width =
+        shelf_width - target_bounds->nav_bounds_in_shelf.size().width() -
+        home_button_edge_spacing - ShelfConfig::Get()->app_icon_group_margin() -
+        status_size.width();
     int start_x = base::i18n::IsRTL()
                       ? target_bounds->nav_bounds_in_shelf.x() -
-                            ShelfConstants::home_button_edge_spacing() -
-                            hotseat_width
+                            home_button_edge_spacing - hotseat_width
                       : target_bounds->nav_bounds_in_shelf.right() +
-                            ShelfConstants::home_button_edge_spacing();
+                            home_button_edge_spacing;
     hotseat_origin = gfx::Point(start_x, 0);
     hotseat_height = shelf_height;
   } else {
-    hotseat_origin =
-        gfx::Point(0, target_bounds->nav_bounds_in_shelf.bottom() +
-                          ShelfConstants::home_button_edge_spacing());
+    hotseat_origin = gfx::Point(0, target_bounds->nav_bounds_in_shelf.bottom() +
+                                       home_button_edge_spacing);
     hotseat_width = shelf_width;
-    hotseat_height = shelf_height -
-                     target_bounds->nav_bounds_in_shelf.size().height() -
-                     ShelfConstants::home_button_edge_spacing() -
-                     kAppIconGroupMargin - status_size.height();
+    hotseat_height =
+        shelf_height - target_bounds->nav_bounds_in_shelf.size().height() -
+        home_button_edge_spacing - ShelfConfig::Get()->app_icon_group_margin() -
+        status_size.height();
   }
   target_bounds->hotseat_bounds_in_shelf =
       gfx::Rect(hotseat_origin, gfx::Size(hotseat_width, hotseat_height));
@@ -1218,18 +1219,18 @@
         gfx::Rect(target_bounds->nav_bounds_in_shelf.right(), 0,
                   shelf_width - status_size.width() -
                       target_bounds->nav_bounds_in_shelf.width() -
-                      ShelfConstants::home_button_edge_spacing(),
+                      home_button_edge_spacing,
                   target_bounds->shelf_bounds.height()),
         gfx::Rect(0, target_bounds->nav_bounds_in_shelf.height(),
                   target_bounds->shelf_bounds.width(),
                   shelf_height - status_size.height() -
                       target_bounds->nav_bounds_in_shelf.height() -
-                      ShelfConstants::home_button_edge_spacing()),
+                      home_button_edge_spacing),
         gfx::Rect(0, target_bounds->nav_bounds_in_shelf.height(),
                   target_bounds->shelf_bounds.width(),
                   shelf_height - status_size.height() -
                       target_bounds->nav_bounds_in_shelf.height() -
-                      ShelfConstants::home_button_edge_spacing()));
+                      home_button_edge_spacing));
   } else {
     target_bounds->shelf_bounds_in_shelf = SelectValueForShelfAlignment(
         gfx::Rect(0, 0, shelf_width - status_size.width(),
@@ -1253,7 +1254,7 @@
     TargetBounds* target_bounds) const {
   CHECK_EQ(kDragInProgress, drag_status_);
   const bool horizontal = shelf_->IsHorizontalAlignment();
-  const int shelf_size = ShelfConstants::shelf_size();
+  const int shelf_size = ShelfConfig::Get()->shelf_size();
   gfx::Rect available_bounds =
       screen_util::GetDisplayBoundsWithShelf(shelf_widget_->GetNativeWindow());
   int resistance_free_region = 0;
@@ -1266,7 +1267,8 @@
     // changed since then, e.g. because the tray-menu was shown because of the
     // drag), then allow the drag some resistance-free region at first to make
     // sure the shelf sticks with the finger until the shelf is visible.
-    resistance_free_region = shelf_size - kHiddenShelfInScreenPortion;
+    resistance_free_region =
+        shelf_size - ShelfConfig::Get()->hidden_shelf_in_screen_portion();
     hidden_at_start = true;
   }
 
@@ -1293,12 +1295,14 @@
       available_bounds.right() - (hidden_at_start ? 0 : shelf_size));
   if (horizontal) {
     target_bounds->shelf_bounds.set_y(baseline + translate);
-    target_bounds->nav_bounds_in_shelf.set_y(ShelfConstants::button_spacing());
+    target_bounds->nav_bounds_in_shelf.set_y(
+        ShelfConfig::Get()->button_spacing());
     target_bounds->hotseat_bounds_in_shelf.set_y(0);
     target_bounds->status_bounds_in_shelf.set_y(0);
   } else {
     target_bounds->shelf_bounds.set_x(baseline + translate);
-    target_bounds->nav_bounds_in_shelf.set_x(ShelfConstants::button_spacing());
+    target_bounds->nav_bounds_in_shelf.set_x(
+        ShelfConfig::Get()->button_spacing());
     target_bounds->hotseat_bounds_in_shelf.set_x(0);
     target_bounds->status_bounds_in_shelf.set_x(0);
   }
@@ -1829,7 +1833,7 @@
   float opacity = shelf_widget_->GetBackgroundAlphaValue(
                       shelf_background_type_before_drag_) /
                   static_cast<float>(ShelfBackgroundAnimator::kMaxAlpha);
-  const int shelf_size = ShelfConstants::shelf_size();
+  const int shelf_size = ShelfConfig::Get()->shelf_size();
   if (launcher_above_shelf_bottom_amount_ < shelf_size)
     return opacity;
   float launcher_above_shelf_amount =
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 0c96c75..70d5717 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -22,6 +22,7 @@
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h"
 #include "ash/public/cpp/keyboard/keyboard_controller_observer.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_item.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/test/shell_test_api.h"
@@ -32,7 +33,6 @@
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/home_button.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_controller.h"
 #include "ash/shelf/shelf_layout_manager_observer.h"
 #include "ash/shelf/shelf_navigation_widget.h"
@@ -245,39 +245,45 @@
           // Tests that the shelf sticks with the touch point during the drag
           // until the shelf is completely visible.
           if (SHELF_ALIGNMENT_BOTTOM == shelf->alignment()) {
-            EXPECT_NEAR(shelf_bounds.y(),
-                        auto_hidden_shelf_bounds_.y() +
-                            kHiddenShelfInScreenPortion -
-                            std::abs(scroll_delta),
-                        kEpsilon);
+            EXPECT_NEAR(
+                shelf_bounds.y(),
+                auto_hidden_shelf_bounds_.y() +
+                    ShelfConfig::Get()->hidden_shelf_in_screen_portion() -
+                    std::abs(scroll_delta),
+                kEpsilon);
           } else if (SHELF_ALIGNMENT_LEFT == shelf->alignment()) {
-            EXPECT_NEAR(shelf_bounds.x(),
-                        auto_hidden_shelf_bounds_.x() -
-                            kHiddenShelfInScreenPortion +
-                            std::abs(scroll_delta),
-                        kEpsilon);
+            EXPECT_NEAR(
+                shelf_bounds.x(),
+                auto_hidden_shelf_bounds_.x() -
+                    ShelfConfig::Get()->hidden_shelf_in_screen_portion() +
+                    std::abs(scroll_delta),
+                kEpsilon);
           } else if (SHELF_ALIGNMENT_RIGHT == shelf->alignment()) {
-            EXPECT_NEAR(shelf_bounds.x(),
-                        auto_hidden_shelf_bounds_.x() +
-                            kHiddenShelfInScreenPortion -
-                            std::abs(scroll_delta),
-                        kEpsilon);
+            EXPECT_NEAR(
+                shelf_bounds.x(),
+                auto_hidden_shelf_bounds_.x() +
+                    ShelfConfig::Get()->hidden_shelf_in_screen_portion() -
+                    std::abs(scroll_delta),
+                kEpsilon);
           }
         } else {
           // Tests that after the shelf is completely visible, the shelf starts
           // resisting the drag.
           if (SHELF_ALIGNMENT_BOTTOM == shelf->alignment()) {
-            EXPECT_GT(shelf_bounds.y(), auto_hidden_shelf_bounds_.y() +
-                                            kHiddenShelfInScreenPortion -
-                                            std::abs(scroll_delta));
+            EXPECT_GT(shelf_bounds.y(),
+                      auto_hidden_shelf_bounds_.y() +
+                          ShelfConfig::Get()->hidden_shelf_in_screen_portion() -
+                          std::abs(scroll_delta));
           } else if (SHELF_ALIGNMENT_LEFT == shelf->alignment()) {
-            EXPECT_LT(shelf_bounds.x(), auto_hidden_shelf_bounds_.x() -
-                                            kHiddenShelfInScreenPortion +
-                                            std::abs(scroll_delta));
+            EXPECT_LT(shelf_bounds.x(),
+                      auto_hidden_shelf_bounds_.x() -
+                          ShelfConfig::Get()->hidden_shelf_in_screen_portion() +
+                          std::abs(scroll_delta));
           } else if (SHELF_ALIGNMENT_RIGHT == shelf->alignment()) {
-            EXPECT_GT(shelf_bounds.x(), auto_hidden_shelf_bounds_.x() +
-                                            kHiddenShelfInScreenPortion -
-                                            std::abs(scroll_delta));
+            EXPECT_GT(shelf_bounds.x(),
+                      auto_hidden_shelf_bounds_.x() +
+                          ShelfConfig::Get()->hidden_shelf_in_screen_portion() -
+                          std::abs(scroll_delta));
           }
         }
       }
@@ -1069,8 +1075,8 @@
       shelf_widget->navigation_widget()->GetWindowBoundsInScreen().width();
   const int hotseat_width =
       GetPrimaryShelf()->GetShelfViewForTesting()->width();
-  const int margins =
-      ShelfConstants::home_button_edge_spacing() + kAppIconGroupMargin;
+  const int margins = ShelfConfig::Get()->home_button_edge_spacing() +
+                      ShelfConfig::Get()->app_icon_group_margin();
   EXPECT_EQ(200, total_width - nav_width - hotseat_width - margins);
 }
 
@@ -1096,8 +1102,9 @@
   layout_manager->LayoutShelf();
 
   const int display_bottom = display.bounds().bottom();
-  EXPECT_EQ(display_bottom - kHiddenShelfInScreenPortion,
-            GetShelfWidget()->GetWindowBoundsInScreen().y());
+  EXPECT_EQ(
+      display_bottom - ShelfConfig::Get()->hidden_shelf_in_screen_portion(),
+      GetShelfWidget()->GetWindowBoundsInScreen().y());
   EXPECT_EQ(display_bottom, display.work_area().bottom());
   EXPECT_EQ(stable_work_area,
             GetPrimaryWorkAreaInsets()->ComputeStableWorkArea());
@@ -1126,8 +1133,9 @@
   SetState(layout_manager, SHELF_AUTO_HIDE);
   EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState());
   layout_manager->LayoutShelf();
-  EXPECT_EQ(display_bottom - kHiddenShelfInScreenPortion,
-            GetShelfWidget()->GetWindowBoundsInScreen().y());
+  EXPECT_EQ(
+      display_bottom - ShelfConfig::Get()->hidden_shelf_in_screen_portion(),
+      GetShelfWidget()->GetWindowBoundsInScreen().y());
   EXPECT_EQ(stable_work_area,
             GetPrimaryWorkAreaInsets()->ComputeStableWorkArea());
 
@@ -1304,7 +1312,8 @@
   // shelf should go off the screen.
   layout_manager->LayoutShelf();
   display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
-  EXPECT_EQ(display.bounds().bottom() - kHiddenShelfInScreenPortion,
+  EXPECT_EQ(display.bounds().bottom() -
+                ShelfConfig::Get()->hidden_shelf_in_screen_portion(),
             GetShelfWidget()->GetWindowBoundsInScreen().y());
 
   std::unique_ptr<views::Widget> lock_widget(AshTestBase::CreateTestWidget(
@@ -1338,7 +1347,8 @@
   // shelf should go off the screen.
   GetShelfLayoutManager()->LayoutShelf();
   display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
-  EXPECT_EQ(display.bounds().bottom() - kHiddenShelfInScreenPortion,
+  EXPECT_EQ(display.bounds().bottom() -
+                ShelfConfig::Get()->hidden_shelf_in_screen_portion(),
             GetShelfWidget()->GetWindowBoundsInScreen().y());
 
   OverviewController* overview_controller = Shell::Get()->overview_controller();
@@ -1358,7 +1368,8 @@
 
   EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState());
   EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState());
-  EXPECT_EQ(display.bounds().bottom() - kHiddenShelfInScreenPortion,
+  EXPECT_EQ(display.bounds().bottom() -
+                ShelfConfig::Get()->hidden_shelf_in_screen_portion(),
             GetShelfWidget()->GetNativeWindow()->GetTargetBounds().y());
 }
 
@@ -2643,7 +2654,7 @@
 
   // Ensure that Shelf is higher than the default height, required by the bug
   // reproduction procedures.
-  delta_y = -ShelfConstants::shelf_size() - 1;
+  delta_y = -ShelfConfig::Get()->shelf_size() - 1;
 
   timestamp += base::TimeDelta::FromMilliseconds(200);
   ui::GestureEvent update_event = ui::GestureEvent(
@@ -2678,7 +2689,8 @@
   PressHomeButton();
   EXPECT_EQ(
       GetScreenAvailableBounds().bottom_left() +
-          gfx::Point(0, -kHiddenShelfInScreenPortion).OffsetFromOrigin(),
+          gfx::Point(0, -ShelfConfig::Get()->hidden_shelf_in_screen_portion())
+              .OffsetFromOrigin(),
       GetPrimaryShelf()->shelf_widget()->GetWindowBoundsInScreen().origin());
   EXPECT_FALSE(GetPrimaryShelf()->IsVisible());
 }
@@ -2724,7 +2736,7 @@
   // Verify that the shelf has expected bounds.
   EXPECT_EQ(
       GetScreenAvailableBounds().bottom_left() +
-          gfx::Point(0, -ShelfConstants::shelf_size()).OffsetFromOrigin(),
+          gfx::Point(0, -ShelfConfig::Get()->shelf_size()).OffsetFromOrigin(),
       GetPrimaryShelf()->shelf_widget()->GetWindowBoundsInScreen().origin());
 }
 
@@ -3354,4 +3366,80 @@
   EXPECT_EQ(display_2.bounds().CenterPoint().x(), app_center_2.x());
 }
 
+// Tests that pinned app icons are visible on non-primary displays.
+TEST_F(ShelfLayoutManagerTest, ShelfShowsPinnedAppsOnOtherDisplays) {
+  // Create three displays.
+  UpdateDisplay("600x400,1000x700,800x900");
+  const unsigned int display_count = 3U;
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+  EXPECT_EQ(display_count, root_windows.size());
+
+  auto add_app = []() {
+    ShelfController* controller = Shell::Get()->shelf_controller();
+    int n_apps = controller->model()->item_count();
+    const std::string app_id("app_id_" + base::NumberToString(n_apps));
+    ShelfItem item;
+    item.type = TYPE_PINNED_APP;
+    item.id = ShelfID(app_id);
+    controller->model()->Add(item);
+  };
+
+  // Keep this low so that all apps fit at the center of the screen on all
+  // displays.
+  const int max_app_count = 4;
+  for (int app_count = 1; app_count <= max_app_count; ++app_count) {
+    add_app();
+
+    // Wait for everything to settle down.
+    for (unsigned int display_index = 0; display_index < display_count;
+         ++display_index) {
+      Shelf* shelf = Shelf::ForWindow(root_windows[display_index]);
+      ShelfView* shelf_view = shelf->GetShelfViewForTesting();
+      ShelfViewTestAPI(shelf_view).RunMessageLoopUntilAnimationsDone();
+    }
+
+    // If everything is as expected, the middle app (if applicable) should be
+    // exactly at the center of the screen, on all displays. Also, the
+    // distance between the first app and the left edge of the display should be
+    // the same as the distance between the third app and the right edge of the
+    // display.
+    for (unsigned int display_index = 0; display_index < display_count;
+         ++display_index) {
+      const display::Display display =
+          display::Screen::GetScreen()->GetDisplayNearestWindow(
+              root_windows[display_index]);
+      Shelf* shelf = Shelf::ForWindow(root_windows[display_index]);
+      ShelfView* shelf_view = shelf->GetShelfViewForTesting();
+
+      EXPECT_EQ(app_count, shelf_view->number_of_visible_apps());
+
+      // Only check the middle app if we have an odd number of apps.
+      if (app_count % 2 == 1) {
+        const gfx::Point center = ShelfViewTestAPI(shelf_view)
+                                      .GetViewAt(app_count / 2)
+                                      ->GetBoundsInScreen()
+                                      .CenterPoint();
+        EXPECT_EQ(display.bounds().CenterPoint().x(), center.x())
+            << "App at index " << (app_count / 2) << " should be at "
+            << "the center of display " << display_index << " with "
+            << app_count << " apps";
+      }
+
+      const gfx::Point left = ShelfViewTestAPI(shelf_view)
+                                  .GetViewAt(0)
+                                  ->GetBoundsInScreen()
+                                  .left_center();
+      const gfx::Point right = ShelfViewTestAPI(shelf_view)
+                                   .GetViewAt(app_count - 1)
+                                   ->GetBoundsInScreen()
+                                   .right_center();
+      EXPECT_EQ(left.x() - display.bounds().x(),
+                display.bounds().right() - right.x())
+          << "Apps on either end should be at the same distance from the "
+          << "screen edge on display " << display_index << " with " << app_count
+          << " apps";
+    }
+  }
+}
+
 }  // namespace ash
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc
index 18e2178..4c7d339 100644
--- a/ash/shelf/shelf_navigation_widget.cc
+++ b/ash/shelf/shelf_navigation_widget.cc
@@ -5,10 +5,10 @@
 #include "ash/shelf/shelf_navigation_widget.h"
 
 #include "ash/focus_cycler.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/back_button.h"
 #include "ash/shelf/home_button.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
@@ -35,8 +35,8 @@
 // Returns the bounds for the first button shown in this view (the back
 // button in tablet mode, the home button otherwise).
 gfx::Rect GetFirstButtonBounds() {
-  return gfx::Rect(0, 0, ShelfConstants::control_size(),
-                   ShelfConstants::control_size());
+  return gfx::Rect(0, 0, ShelfConfig::Get()->control_size(),
+                   ShelfConfig::Get()->control_size());
 }
 
 // Returns the bounds for the second button shown in this view (which is
@@ -44,8 +44,9 @@
 // shelf).
 gfx::Rect GetSecondButtonBounds() {
   return gfx::Rect(
-      ShelfConstants::control_size() + ShelfConstants::button_spacing(), 0,
-      ShelfConstants::control_size(), ShelfConstants::control_size());
+      ShelfConfig::Get()->control_size() + ShelfConfig::Get()->button_spacing(),
+      0, ShelfConfig::Get()->control_size(),
+      ShelfConfig::Get()->control_size());
 }
 
 }  // namespace
@@ -88,7 +89,7 @@
 ShelfNavigationWidget::Delegate::Delegate(Shelf* shelf, ShelfView* shelf_view) {
   set_allow_deactivate_on_esc(true);
 
-  const int control_size = ShelfConstants::control_size();
+  const int control_size = ShelfConfig::Get()->control_size();
   std::unique_ptr<BackButton> back_button_ptr =
       std::make_unique<BackButton>(shelf);
   back_button_ = AddChildView(std::move(back_button_ptr));
@@ -105,8 +106,8 @@
   GetViewAccessibility().OverridePreviousFocus(shelf->GetStatusAreaWidget());
 
   SetBackground(views::CreateRoundedRectBackground(
-      kShelfControlPermanentHighlightBackground,
-      ShelfConstants::control_border_radius()));
+      ShelfConfig::Get()->shelf_control_permanent_highlight_background(),
+      ShelfConfig::Get()->control_border_radius()));
 }
 
 ShelfNavigationWidget::Delegate::~Delegate() = default;
@@ -170,13 +171,13 @@
 }
 
 gfx::Size ShelfNavigationWidget::GetIdealSize() const {
-  const int control_size = ShelfConstants::control_size();
+  const int control_size = ShelfConfig::Get()->control_size();
   if (!shelf_->IsHorizontalAlignment())
     return gfx::Size(control_size, control_size);
-  return gfx::Size(IsTabletMode()
-                       ? (2 * control_size + ShelfConstants::button_spacing())
-                       : control_size,
-                   control_size);
+  return gfx::Size(
+      IsTabletMode() ? (2 * control_size + ShelfConfig::Get()->button_spacing())
+                     : control_size,
+      control_size);
 }
 
 bool ShelfNavigationWidget::OnNativeWidgetActivationChanged(bool active) {
diff --git a/ash/shelf/shelf_tooltip_preview_bubble.cc b/ash/shelf/shelf_tooltip_preview_bubble.cc
index 97c326a..f8676d24 100644
--- a/ash/shelf/shelf_tooltip_preview_bubble.cc
+++ b/ash/shelf/shelf_tooltip_preview_bubble.cc
@@ -4,7 +4,7 @@
 
 #include "ash/shelf/shelf_tooltip_preview_bubble.h"
 
-#include "ash/shelf/shelf_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/wm/collision_detection/collision_detection_utils.h"
 #include "ash/wm/window_preview_view.h"
@@ -109,14 +109,15 @@
 }
 
 float ShelfTooltipPreviewBubble::GetMaxPreviewRatio() const {
-  float max_ratio = kShelfTooltipPreviewMinRatio;
+  float max_ratio = ShelfConfig::Get()->shelf_tooltip_preview_min_ratio();
   for (WindowPreview* window : previews_) {
     gfx::Size mirror_size = window->preview_view()->CalculatePreferredSize();
     float ratio = static_cast<float>(mirror_size.width()) /
                   static_cast<float>(mirror_size.height());
     max_ratio = std::max(max_ratio, ratio);
   }
-  return std::min(max_ratio, kShelfTooltipPreviewMaxRatio);
+  return std::min(max_ratio,
+                  ShelfConfig::Get()->shelf_tooltip_preview_max_ratio());
 }
 
 void ShelfTooltipPreviewBubble::DismissAfterDelay() {
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 082565a1..b2f12eb 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -13,6 +13,7 @@
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/cpp/window_properties.h"
@@ -23,7 +24,6 @@
 #include "ash/shelf/shelf_app_button.h"
 #include "ash/shelf/shelf_application_menu_model.h"
 #include "ash/shelf/shelf_button.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_context_menu_model.h"
 #include "ash/shelf/shelf_controller.h"
 #include "ash/shelf/shelf_focus_cycler.h"
@@ -42,6 +42,7 @@
 #include "base/bind.h"
 #include "base/containers/adapters.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/timer/timer.h"
 #include "chromeos/constants/chromeos_switches.h"
@@ -327,14 +328,15 @@
 }
 
 int ShelfView::GetSizeOfAppIcons(int count, bool with_overflow) {
-  const int control_size = ShelfConstants::control_size();
-  const int button_spacing = ShelfConstants::button_spacing();
-  const int overflow_button_margin = ShelfConstants::overflow_button_margin();
+  const int control_size = ShelfConfig::Get()->control_size();
+  const int button_spacing = ShelfConfig::Get()->button_spacing();
+  const int overflow_button_margin =
+      ShelfConfig::Get()->overflow_button_margin();
 
   if (count == 0)
     return with_overflow ? control_size + 2 * overflow_button_margin : 0;
 
-  const int app_size = count * ShelfConstants::button_size();
+  const int app_size = count * ShelfConfig::Get()->button_size();
   int overflow_size = 0;
   int total_padding = button_spacing * (count - 1);
   if (with_overflow) {
@@ -474,8 +476,8 @@
   if (model_->item_count() == 0) {
     // There are no apps.
     return shelf_->IsHorizontalAlignment()
-               ? gfx::Size(0, ShelfConstants::shelf_size())
-               : gfx::Size(ShelfConstants::shelf_size(), 0);
+               ? gfx::Size(0, ShelfConfig::Get()->shelf_size())
+               : gfx::Size(ShelfConfig::Get()->shelf_size(), 0);
   }
 
   int last_button_index = last_visible_index_;
@@ -494,13 +496,15 @@
   const gfx::Rect last_button_bounds =
       last_button_index >= first_visible_index_
           ? view_model_->ideal_bounds(last_button_index)
-          : gfx::Rect(gfx::Size(ShelfConstants::shelf_size(),
-                                ShelfConstants::shelf_size()));
+          : gfx::Rect(gfx::Size(ShelfConfig::Get()->shelf_size(),
+                                ShelfConfig::Get()->shelf_size()));
 
   if (shelf_->IsHorizontalAlignment())
-    return gfx::Size(last_button_bounds.right(), ShelfConstants::shelf_size());
+    return gfx::Size(last_button_bounds.right(),
+                     ShelfConfig::Get()->shelf_size());
 
-  return gfx::Size(ShelfConstants::shelf_size(), last_button_bounds.bottom());
+  return gfx::Size(ShelfConfig::Get()->shelf_size(),
+                   last_button_bounds.bottom());
 }
 
 void ShelfView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
@@ -925,7 +929,7 @@
 void ShelfView::CalculateIdealBounds() {
   DCHECK(model()->item_count() == view_model()->view_size());
 
-  const int button_spacing = ShelfConstants::button_spacing();
+  const int button_spacing = ShelfConfig::Get()->button_spacing();
   const int separator_index = GetSeparatorIndex();
   const AppCenteringStrategy app_centering_strategy =
       CalculateAppCenteringStrategy();
@@ -984,7 +988,7 @@
       continue;
     }
 
-    const int button_size = ShelfConstants::button_size();
+    const int button_size = ShelfConfig::Get()->button_size();
 
     view_model()->set_ideal_bounds(i,
                                    gfx::Rect(x, y, button_size, button_size));
@@ -997,7 +1001,7 @@
       // vertically centered.
       int half_space = button_spacing / 2;
       int secondary_offset =
-          (ShelfConstants::shelf_size() - kSeparatorSize) / 2;
+          (ShelfConfig::Get()->shelf_size() - kSeparatorSize) / 2;
       x -= shelf()->PrimaryAxisValue(half_space, 0);
       y -= shelf()->PrimaryAxisValue(0, half_space);
       separator_->SetBounds(
@@ -1120,7 +1124,8 @@
   // side (the status widget is always bigger than the home button plus
   // the back button if applicable) and see if the apps can fit in the middle.
   int available_space_for_screen_centering =
-      screen_size - 2 * (status_widget_size + kAppIconGroupMargin);
+      screen_size -
+      2 * (status_widget_size + ShelfConfig::Get()->app_icon_group_margin());
 
   if (GetSizeOfAppIcons(view_model()->view_size(), false) <
       available_space_for_screen_centering) {
@@ -1388,7 +1393,7 @@
   int x = 0;
   int y = 0;
   if (last_visible_index_ != -1) {
-    const int offset = ShelfConstants::overflow_button_margin();
+    const int offset = ShelfConfig::Get()->overflow_button_margin();
     x = shelf_->PrimaryAxisValue(
         offset + view_model_->ideal_bounds(last_visible_index_).right(),
         offset + view_model_->ideal_bounds(last_visible_index_).x());
@@ -1398,12 +1403,13 @@
 
     // Add button spacing to correctly position overflow button next to app
     // buttons.
-    x = shelf_->PrimaryAxisValue(x + ShelfConstants::button_spacing(), x);
-    y = shelf_->PrimaryAxisValue(y, y + ShelfConstants::button_spacing());
+    x = shelf_->PrimaryAxisValue(x + ShelfConfig::Get()->button_spacing(), x);
+    y = shelf_->PrimaryAxisValue(y, y + ShelfConfig::Get()->button_spacing());
   }
 
-  overflow_button_->SetBoundsRect(gfx::Rect(
-      x, y, ShelfConstants::control_size(), ShelfConstants::control_size()));
+  overflow_button_->SetBoundsRect(
+      gfx::Rect(x, y, ShelfConfig::Get()->control_size(),
+                ShelfConfig::Get()->control_size()));
 }
 
 void ShelfView::AnimateToIdealBounds() {
@@ -1571,7 +1577,7 @@
       *view_model_, drag_view_, shelf_->IsHorizontalAlignment(),
       drag_view_->x(), drag_view_->y());
   target_index =
-      std::min(indices.second, std::max(target_index, indices.first));
+      base::ClampToRange(target_index, indices.first, indices.second);
 
   if (target_index == current_index)
     return;
@@ -1946,11 +1952,11 @@
     }
 
     if (shelf_->IsHorizontalAlignment()) {
-      preferred_size =
-          gfx::Size(last_button_bounds.right(), ShelfConstants::shelf_size());
+      preferred_size = gfx::Size(last_button_bounds.right(),
+                                 ShelfConfig::Get()->shelf_size());
     } else {
-      preferred_size =
-          gfx::Size(ShelfConstants::shelf_size(), last_button_bounds.bottom());
+      preferred_size = gfx::Size(ShelfConfig::Get()->shelf_size(),
+                                 last_button_bounds.bottom());
     }
   }
   gfx::Point origin(GetMirroredXWithWidthInView(0, preferred_size.width()), 0);
diff --git a/ash/shelf/shelf_view_test_api.cc b/ash/shelf/shelf_view_test_api.cc
index 2e4801d2..a262080f 100644
--- a/ash/shelf/shelf_view_test_api.cc
+++ b/ash/shelf/shelf_view_test_api.cc
@@ -7,9 +7,10 @@
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf_app_button.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_menu_model_adapter.h"
+#include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_view.h"
+#include "ash/shelf/shelf_widget.h"
 #include "base/run_loop.h"
 #include "ui/views/animation/bounds_animator.h"
 #include "ui/views/controls/menu/menu_runner.h"
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index ab438ce..11ecddbf 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -16,6 +16,7 @@
 #include "ash/display/screen_orientation_controller_test_api.h"
 #include "ash/focus_cycler.h"
 #include "ash/ime/ime_controller.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_item_delegate.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shelf_prefs.h"
@@ -32,7 +33,6 @@
 #include "ash/shelf/overflow_button.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_app_button.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_focus_cycler.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_observer.h"
@@ -598,8 +598,8 @@
     // should be used. If |drop_index| is the last item, a larger x-axis
     // value of |drop_point| should be used.
     int drop_point_x_shift = main_to_overflow
-                                 ? ShelfConstants::button_size() / 4
-                                 : -ShelfConstants::button_size() / 4;
+                                 ? ShelfConfig::Get()->button_size() / 4
+                                 : -ShelfConfig::Get()->button_size() / 4;
     gfx::Point modified_drop_point(drop_point.x() + drop_point_x_shift,
                                    drop_point.y());
     generator->MoveMouseTo(modified_drop_point);
@@ -1192,7 +1192,7 @@
   generator->set_current_screen_location(first_app_location);
   generator->PressLeftButton();
   // Drag the mouse to just off the shelf.
-  generator->MoveMouseBy(0, -ShelfConstants::shelf_size() / 2 - 1);
+  generator->MoveMouseBy(0, -ShelfConfig::Get()->shelf_size() / 2 - 1);
   EXPECT_FALSE(test_api_->IsRippedOffFromShelf());
   // Drag the mouse past the rip off threshold.
   generator->MoveMouseBy(0, -kRipOffDistance);
@@ -1257,7 +1257,7 @@
   gfx::Point app_location = GetButtonCenter(GetButtonByID(id));
   generator->set_current_screen_location(app_location);
   generator->PressLeftButton();
-  generator->MoveMouseBy(0, -ShelfConstants::shelf_size() / 2 - 1);
+  generator->MoveMouseBy(0, -ShelfConfig::Get()->shelf_size() / 2 - 1);
   EXPECT_FALSE(test_api_->IsRippedOffFromShelf());
   generator->MoveMouseBy(0, -kRipOffDistance);
   EXPECT_TRUE(test_api_->IsRippedOffFromShelf());
@@ -1549,7 +1549,7 @@
 
   // Resize shelf view with that animation running and stay overflown.
   gfx::Rect bounds = shelf_view_->bounds();
-  bounds.set_width(bounds.width() - ShelfConstants::shelf_size());
+  bounds.set_width(bounds.width() - ShelfConfig::Get()->shelf_size());
   shelf_view_->SetBoundsRect(bounds);
   ASSERT_TRUE(shelf_view_->GetOverflowButton()->GetVisible());
 
@@ -1583,7 +1583,7 @@
   int ripped_index = overflow_shelf_view->last_visible_index();
   gfx::Size bubble_size = overflow_shelf_view->GetPreferredSize();
   int item_width =
-      ShelfConstants::button_size() + ShelfConstants::button_spacing();
+      ShelfConfig::Get()->button_size() + ShelfConfig::Get()->button_spacing();
 
   ui::test::EventGenerator* generator = GetEventGenerator();
   ShelfAppButton* button = test_for_overflow_view.GetButton(ripped_index);
@@ -1643,7 +1643,7 @@
   ASSERT_TRUE(shelf_view_->IsShowingOverflowBubble());
 
   int item_width =
-      ShelfConstants::button_size() + ShelfConstants::button_spacing();
+      ShelfConfig::Get()->button_size() + ShelfConfig::Get()->button_spacing();
   OverflowBubbleView* bubble_view = test_api_->overflow_bubble()->bubble_view();
   OverflowBubbleViewTestAPI bubble_view_api(bubble_view);
 
@@ -1714,7 +1714,8 @@
       secondary_shelf->GetShelfViewForTesting();
 
   // The bounds should be big enough for 4 buttons + overflow chevron.
-  shelf_view_for_secondary->SetBounds(0, 0, 500, ShelfConstants::shelf_size());
+  shelf_view_for_secondary->SetBounds(0, 0, 500,
+                                      ShelfConfig::Get()->shelf_size());
 
   ShelfViewTestAPI test_api_for_secondary(shelf_view_for_secondary);
   // Speeds up animation for test.
@@ -2405,7 +2406,7 @@
                                                     .right(),
       status_area_->GetBoundsInScreen().x() -
           (shelf_view_->GetOverflowButton()->GetBoundsInScreen().right() +
-           ShelfConstants::overflow_button_margin()));
+           ShelfConfig::Get()->overflow_button_margin()));
 }
 
 TEST_F(ShelfViewTest, FirstAndLastVisibleIndex) {
@@ -2501,17 +2502,17 @@
         GetPrimaryDisplay().work_area().width() - 2 * bubble_view_min_margin_ -
         2 * end_padding_;
 
-    return std::ceil(available_width_for_shortcuts / unit_);
+    return std::ceil(available_width_for_shortcuts / unit());
   }
 
  protected:
-  const gfx::Size shelf_icon_size_ =
-      gfx::Size(kShelfButtonSize, kShelfButtonSize);
-  const int arrow_button_size_ = OverflowBubbleView::GetArrowButtonSize();
+  static int unit() {
+    return ShelfConfig::Get()->button_size() +
+           ShelfConfig::Get()->button_spacing();
+  }
+
   const int bubble_view_min_margin_ = OverflowBubbleView::kMinimumMargin;
   const int end_padding_ = OverflowBubbleView::kEndPadding;
-  const int unit_ =
-      ShelfConstants::button_size() + ShelfConstants::button_spacing();
   const int fading_zone_ = OverflowBubbleView::kFadingZone;
 
  private:
@@ -2522,6 +2523,10 @@
 TEST_F(OverflowBubbleViewTest, CheckOverflowBubbleViewArrowButton) {
   OverflowBubbleView* bubble_view = test_api_->overflow_bubble()->bubble_view();
 
+  const int button_size = ShelfConfig::Get()->button_size();
+  const gfx::Size shelf_icon_size(button_size, button_size);
+  const int arrow_button_size = OverflowBubbleView::GetArrowButtonSize();
+
   // Add sufficient app icons to ensure that it needs to press the right arrow
   // buttons twice to reach the end.
   int current_item_count = bubble_view->shelf_view()->last_visible_index() -
@@ -2549,10 +2554,10 @@
       GetPrimaryDisplay().bounds().right() - overflow_bubble_bounds.right());
   const int available_width_for_bubble =
       GetPrimaryDisplay().bounds().width() - 2 * bubble_view_min_margin_;
-  const int remainder = available_width_for_bubble % unit_;
+  const int remainder = available_width_for_bubble % unit();
   EXPECT_EQ(remainder / 2 + bubble_view_min_margin_,
             overflow_bubble_bounds.origin().x());
-  EXPECT_EQ(0, overflow_bubble_bounds.width() % unit_);
+  EXPECT_EQ(0, overflow_bubble_bounds.width() % unit());
 
   // Verifies the following things right after showing the overflow bubble view:
   // (1) The layout strategy is SHOW_RIGHT_ARROW_BUTTON.
@@ -2564,7 +2569,7 @@
   EXPECT_TRUE(right_arrow_button->GetVisible());
   EXPECT_FALSE(left_arrow_button->GetVisible());
   gfx::Rect expected_first_icon_bounds(overflow_bubble_bounds.origin(),
-                                       shelf_icon_size_);
+                                       shelf_icon_size);
   expected_first_icon_bounds.Offset(end_padding_, 0);
   EXPECT_EQ(expected_first_icon_bounds,
             test_for_overflow_view
@@ -2582,23 +2587,23 @@
   // Verifies that the right button shows in the expected bounds.
   EXPECT_TRUE(right_arrow_button->GetVisible());
   gfx::Rect expected_right_arrow_bounds =
-      gfx::Rect(overflow_bubble_bounds.width() - kShelfButtonSize, 0,
-                kShelfButtonSize, kShelfButtonSize);
+      gfx::Rect(overflow_bubble_bounds.width() - button_size, 0, button_size,
+                button_size);
   expected_right_arrow_bounds.ClampToCenteredSize(
-      gfx::Size(arrow_button_size_, arrow_button_size_));
+      gfx::Size(arrow_button_size, arrow_button_size));
   EXPECT_EQ(expected_right_arrow_bounds, right_arrow_button->bounds());
 
   // Verifies that the left button shows in the expected bounds.
   EXPECT_TRUE(left_arrow_button->GetVisible());
   gfx::Rect expected_left_arrow_bounds =
-      gfx::Rect(0, 0, kShelfButtonSize, kShelfButtonSize);
+      gfx::Rect(0, 0, button_size, button_size);
   expected_left_arrow_bounds.ClampToCenteredSize(
-      gfx::Size(arrow_button_size_, arrow_button_size_));
+      gfx::Size(arrow_button_size, arrow_button_size));
   EXPECT_EQ(expected_left_arrow_bounds, left_arrow_button->bounds());
 
   // Verifies that the scroll offset of the overflow bubble should be expected.
   const int expected_scroll_distance =
-      overflow_bubble_bounds.width() - 2 * unit_;
+      overflow_bubble_bounds.width() - 2 * unit();
   EXPECT_EQ(expected_scroll_distance, bubble_view->scroll_offset().x());
 
   // Tap at the right arrow button. Then check the following things:
@@ -2612,8 +2617,8 @@
   EXPECT_FALSE(right_arrow_button->GetVisible());
   EXPECT_TRUE(left_arrow_button->GetVisible());
   gfx::Rect expected_last_icon_bounds(overflow_bubble_bounds.top_right(),
-                                      shelf_icon_size_);
-  expected_last_icon_bounds.Offset(-kShelfButtonSize - end_padding_, 0);
+                                      shelf_icon_size);
+  expected_last_icon_bounds.Offset(-button_size - end_padding_, 0);
   EXPECT_EQ(expected_last_icon_bounds,
             test_for_overflow_view
                 .GetButton(bubble_view->shelf_view()->last_visible_index())
@@ -2652,7 +2657,7 @@
   ASSERT_EQ(OverflowBubbleView::NOT_SHOW_ARROW_BUTTONS,
             bubble_view->layout_strategy());
   gfx::Point gesture_end_point = gesture_drag_point;
-  gesture_end_point.Offset(-kShelfButtonSize, 0);
+  gesture_end_point.Offset(-ShelfConfig::Get()->button_size(), 0);
   GetEventGenerator()->GestureScrollSequence(
       gesture_drag_point, gesture_end_point,
       base::TimeDelta::FromMilliseconds(100), 5);
@@ -2678,11 +2683,11 @@
   // Verifies that the large gesture offset will scroll the overflow bubble. The
   // scroll offset is adjusted to fully show all of shelf icons.
   gesture_end_point = gesture_drag_point;
-  gesture_end_point.Offset(-kShelfButtonSize, 0);
+  gesture_end_point.Offset(-ShelfConfig::Get()->button_size(), 0);
   GetEventGenerator()->GestureScrollSequence(
       gesture_drag_point, gesture_end_point,
       base::TimeDelta::FromMilliseconds(100), 1);
-  EXPECT_EQ(unit_, bubble_view->scroll_offset().x());
+  EXPECT_EQ(unit(), bubble_view->scroll_offset().x());
 }
 
 // Verifies that the leftmost/rightmost shelf icon has correct fading in/out
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index c8dcab5..43c8c88 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -11,6 +11,7 @@
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/root_window_controller.h"
@@ -22,7 +23,6 @@
 #include "ash/shelf/overflow_bubble_view.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_background_animator_observer.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_view.h"
@@ -213,7 +213,7 @@
   // when dragged away.
   // To achieve this, we extend the layer in the same direction where the shelf
   // is aligned (downwards for a bottom shelf, etc.).
-  const int radius = ShelfConstants::shelf_size() / 2;
+  const int radius = ShelfConfig::Get()->shelf_size() / 2;
   // We can easily round only 2 corners out of 4 which means we don't need as
   // much extra shelf height.
   const int safety_margin = kShelfMaxOvershootHeight;
@@ -287,9 +287,7 @@
 
 ShelfWidget::ShelfWidget(Shelf* shelf)
     : shelf_(shelf),
-      background_animator_(SHELF_BACKGROUND_DEFAULT,
-                           shelf_,
-                           Shell::Get()->wallpaper_controller()),
+      background_animator_(shelf_, Shell::Get()->wallpaper_controller()),
       shelf_layout_manager_(new ShelfLayoutManager(this, shelf)),
       delegate_view_(new DelegateView(this)),
       scoped_session_observer_(this) {
@@ -328,6 +326,7 @@
   shelf_layout_manager_->AddObserver(this);
   shelf_container->SetLayoutManager(shelf_layout_manager_);
   shelf_layout_manager_->InitObservers();
+  background_animator_.Init(SHELF_BACKGROUND_DEFAULT);
   background_animator_.PaintBackground(
       shelf_layout_manager_->GetShelfBackgroundType(),
       AnimationChangeType::IMMEDIATE);
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc
index d2efe1b..1d5729f 100644
--- a/ash/shelf/shelf_widget_unittest.cc
+++ b/ash/shelf/shelf_widget_unittest.cc
@@ -10,11 +10,11 @@
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/login_shelf_view.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_navigation_widget.h"
 #include "ash/shelf/shelf_view.h"
@@ -61,7 +61,7 @@
 
 TEST_F(ShelfWidgetTest, TestAlignment) {
   UpdateDisplay("400x400");
-  const int bottom_inset = 400 - ShelfConstants::shelf_size();
+  const int bottom_inset = 400 - ShelfConfig::Get()->shelf_size();
   {
     SCOPED_TRACE("Single Bottom");
     TestLauncherAlignment(Shell::GetPrimaryRootWindow(), SHELF_ALIGNMENT_BOTTOM,
@@ -82,14 +82,14 @@
     SCOPED_TRACE("Single Left");
     TestLauncherAlignment(
         Shell::GetPrimaryRootWindow(), SHELF_ALIGNMENT_LEFT,
-        gfx::Rect(ShelfConstants::shelf_size(), 0, bottom_inset, 400));
+        gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, bottom_inset, 400));
   }
 }
 
 TEST_F(ShelfWidgetTest, TestAlignmentForMultipleDisplays) {
   UpdateDisplay("300x300,500x500");
-  const int shelf_inset_first = 300 - ShelfConstants::shelf_size();
-  const int shelf_inset_second = 500 - ShelfConstants::shelf_size();
+  const int shelf_inset_first = 300 - ShelfConfig::Get()->shelf_size();
+  const int shelf_inset_second = 500 - ShelfConfig::Get()->shelf_size();
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   {
     SCOPED_TRACE("Primary Bottom");
@@ -110,7 +110,7 @@
     SCOPED_TRACE("Primary Left");
     TestLauncherAlignment(
         root_windows[0], SHELF_ALIGNMENT_LEFT,
-        gfx::Rect(ShelfConstants::shelf_size(), 0, shelf_inset_first, 300));
+        gfx::Rect(ShelfConfig::Get()->shelf_size(), 0, shelf_inset_first, 300));
   }
   {
     SCOPED_TRACE("Secondary Bottom");
@@ -130,7 +130,7 @@
   {
     SCOPED_TRACE("Secondary Left");
     TestLauncherAlignment(root_windows[1], SHELF_ALIGNMENT_LEFT,
-                          gfx::Rect(300 + ShelfConstants::shelf_size(), 0,
+                          gfx::Rect(300 + ShelfConfig::Get()->shelf_size(), 0,
                                     shelf_inset_second, 500));
   }
 }
@@ -153,8 +153,8 @@
       shelf_widget->navigation_widget()->GetWindowBoundsInScreen().width();
   const int hotseat_width =
       GetPrimaryShelf()->GetShelfViewForTesting()->width();
-  const int margins =
-      ShelfConstants::home_button_edge_spacing() + kAppIconGroupMargin;
+  const int margins = ShelfConfig::Get()->home_button_edge_spacing() +
+                      ShelfConfig::Get()->app_icon_group_margin();
   EXPECT_EQ(status_width, total_width - nav_width - hotseat_width - margins);
 }
 
@@ -199,8 +199,8 @@
       shelf_widget1->navigation_widget()->GetWindowBoundsInScreen().width();
   const int hotseat_width1 =
       shelf_widget1->hotseat_widget()->GetWindowBoundsInScreen().width();
-  const int margins =
-      ShelfConstants::home_button_edge_spacing() + kAppIconGroupMargin;
+  const int margins = ShelfConfig::Get()->home_button_edge_spacing() +
+                      ShelfConfig::Get()->app_icon_group_margin();
 
   const int total_width2 =
       screen_util::GetDisplayBoundsWithShelf(shelf_widget2->GetNativeWindow())
diff --git a/ash/shelf/shelf_window_targeter.cc b/ash/shelf/shelf_window_targeter.cc
index 5badb8c..be8089b 100644
--- a/ash/shelf/shelf_window_targeter.cc
+++ b/ash/shelf/shelf_window_targeter.cc
@@ -5,11 +5,11 @@
 #include "ash/shelf/shelf_window_targeter.h"
 
 #include "ash/public/cpp/session/session_types.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ui/aura/window.h"
@@ -82,13 +82,15 @@
   if (new_state == SHELF_VISIBLE) {
     // Let clicks at the very top of the shelf through so windows can be
     // resized with the bottom-right corner and bottom edge.
-    mouse_insets =
-        GetInsetsForAlignment(kWorkspaceAreaVisibleInset, shelf_->alignment());
+    mouse_insets = GetInsetsForAlignment(
+        ShelfConfig::Get()->workspace_area_visible_inset(),
+        shelf_->alignment());
   } else if (new_state == SHELF_AUTO_HIDE) {
     // Extend the touch hit target out a bit to allow users to drag shelf out
     // while hidden.
-    touch_insets = GetInsetsForAlignment(-kWorkspaceAreaAutoHideInset,
-                                         shelf_->alignment());
+    touch_insets = GetInsetsForAlignment(
+        -ShelfConfig::Get()->workspace_area_auto_hide_inset(),
+        shelf_->alignment());
   }
 
   SetInsets(mouse_insets, touch_insets);
diff --git a/ash/shelf/shelf_window_watcher.cc b/ash/shelf/shelf_window_watcher.cc
index a655656b..f369b05 100644
--- a/ash/shelf/shelf_window_watcher.cc
+++ b/ash/shelf/shelf_window_watcher.cc
@@ -10,7 +10,6 @@
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_properties.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_window_watcher_item_delegate.h"
 #include "ash/shell.h"
 #include "ash/wm/desks/desks_util.h"
diff --git a/ash/shelf/window_preview.cc b/ash/shelf/window_preview.cc
index d2c2c54..0781214 100644
--- a/ash/shelf/window_preview.cc
+++ b/ash/shelf/window_preview.cc
@@ -4,8 +4,8 @@
 
 #include "ash/shelf/window_preview.h"
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/wm/window_preview_view.h"
 #include "ash/wm/window_util.h"
 #include "ui/aura/window.h"
@@ -87,12 +87,13 @@
   float preview_ratio = static_cast<float>(mirror_size.width()) /
                         static_cast<float>(mirror_size.height());
 
-  int preview_height = kShelfTooltipPreviewHeight;
+  int preview_height = ShelfConfig::Get()->shelf_tooltip_preview_height();
   int preview_width = preview_height * preview_ratio;
-  if (preview_ratio > kShelfTooltipPreviewMaxRatio) {
+  if (preview_ratio > ShelfConfig::Get()->shelf_tooltip_preview_max_ratio()) {
     // Very wide window.
-    preview_width = kShelfTooltipPreviewMaxWidth;
-    preview_height = kShelfTooltipPreviewMaxWidth / preview_ratio;
+    preview_width = ShelfConfig::Get()->shelf_tooltip_preview_max_width();
+    preview_height =
+        ShelfConfig::Get()->shelf_tooltip_preview_max_width() / preview_ratio;
   }
 
   // Center the actual preview over the container, horizontally and vertically.
@@ -170,9 +171,11 @@
 
 gfx::Size WindowPreview::GetPreviewContainerSize() const {
   return gfx::Size(
-      std::min(delegate_->GetMaxPreviewRatio() * kShelfTooltipPreviewHeight,
-               static_cast<float>(kShelfTooltipPreviewMaxWidth)),
-      kShelfTooltipPreviewHeight);
+      std::min(delegate_->GetMaxPreviewRatio() *
+                   ShelfConfig::Get()->shelf_tooltip_preview_height(),
+               static_cast<float>(
+                   ShelfConfig::Get()->shelf_tooltip_preview_max_width())),
+      ShelfConfig::Get()->shelf_tooltip_preview_height());
 }
 
 }  // namespace ash
diff --git a/ash/shell.cc b/ash/shell.cc
index 0d531de1..ae6f118 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -70,6 +70,7 @@
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_prefs.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
@@ -977,6 +978,7 @@
 
   accelerator_controller_ = std::make_unique<AcceleratorControllerImpl>();
 
+  shelf_config_ = std::make_unique<ShelfConfig>();
   shelf_controller_ = std::make_unique<ShelfController>();
 
   magnifier_key_scroll_handler_ = MagnifierKeyScroller::CreateHandler();
diff --git a/ash/shell.h b/ash/shell.h
index 7072104e..14ff017c 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -163,6 +163,7 @@
 class ScreenPositionController;
 class ScreenSwitchCheckController;
 class SessionControllerImpl;
+class ShelfConfig;
 class ShelfController;
 class ShelfWindowWatcher;
 class ShellDelegate;
@@ -450,6 +451,7 @@
   ::wm::ShadowController* shadow_controller() {
     return shadow_controller_.get();
   }
+  ShelfConfig* shelf_config() { return shelf_config_.get(); }
   ShelfController* shelf_controller() { return shelf_controller_.get(); }
   ShellDelegate* shell_delegate() { return shell_delegate_.get(); }
   ShellState* shell_state() { return shell_state_.get(); }
@@ -672,6 +674,7 @@
   std::unique_ptr<NightLightControllerImpl> night_light_controller_;
   std::unique_ptr<PolicyRecommendationRestorer> policy_recommendation_restorer_;
   std::unique_ptr<ScreenSwitchCheckController> screen_switch_check_controller_;
+  std::unique_ptr<ShelfConfig> shelf_config_;
   std::unique_ptr<ShelfController> shelf_controller_;
   std::unique_ptr<ShelfWindowWatcher> shelf_window_watcher_;
   std::unique_ptr<ShellDelegate> shell_delegate_;
diff --git a/ash/shell/content/test/ash_content_test.cc b/ash/shell/content/test/ash_content_test.cc
index 0eb2fe60..626b3a7f 100644
--- a/ash/shell/content/test/ash_content_test.cc
+++ b/ash/shell/content/test/ash_content_test.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/shell/content/client/shell_browser_main_parts.h"
 #include "ash/shell/content/embedded_browser.h"
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 41e3568a..197d0141 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">ረዳት</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">የእርስዎን ቋንቋ ያቀናብሩ</translation>
+<translation id="1962969542251276847">የማያ ገጽ ቁልፍ</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">ጽሑፍ ግቤት</translation>
 <translation id="1993072747612765854">ስለቅርብ ጊዜው የ<ph name="SYSTEM_APP_NAME" /> ዝማኔ የበለጠ ይረዱ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 8a158ac..02d1594 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">المساعد</translation>
 <translation id="1957803754585243749">0 درجة</translation>
 <translation id="1957958912175573503">تعيين اللغة</translation>
+<translation id="1962969542251276847">قفل الشاشة</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">إدخال نصي</translation>
 <translation id="1993072747612765854">مزيد من المعلومات حول آخر تحديث لتطبيق <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 01cd224..ea77798 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Асистент</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Задайте език</translation>
+<translation id="1962969542251276847">Заключване на екрана</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Въвеждане на текст</translation>
 <translation id="1993072747612765854">Научете повече за най-новата актуализация на <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index dd872a8b..2302d811 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">সহায়ক</translation>
 <translation id="1957803754585243749">০°</translation>
 <translation id="1957958912175573503">আপনার ভাষা সেট করুন</translation>
+<translation id="1962969542251276847">স্ক্রিন লক করুন</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">টেক্সট লেখার ফিল্ড</translation>
 <translation id="1993072747612765854">সাম্প্রতিক <ph name="SYSTEM_APP_NAME" /> আপডেট সম্পর্কে আরও জানুন</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index c590d9de..605af46 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Estableix el teu idioma</translation>
+<translation id="1962969542251276847">Pantalla de bloqueig</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Introducció de text</translation>
 <translation id="1993072747612765854">Obtén més informació sobre l'última actualització de: <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 8bff1f8..714a1fb 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Nastavit jazyk</translation>
+<translation id="1962969542251276847">Zamknout obrazovku</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Zadávání textu</translation>
 <translation id="1993072747612765854">Další informace o nejnovější aktualizaci systému <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 80852706..9545591 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Angiv dit sprog</translation>
+<translation id="1962969542251276847">Skærmlås</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Tekstinput</translation>
 <translation id="1993072747612765854">Få flere oplysninger om den nyeste <ph name="SYSTEM_APP_NAME" />-opdatering</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 69e55ad..546107a 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Sprache festlegen</translation>
+<translation id="1962969542251276847">Gesperrter Bildschirm</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Texteingabe</translation>
 <translation id="1993072747612765854">Weitere Informationen zum aktuellen <ph name="SYSTEM_APP_NAME" />-Update</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 16ca39f..0e176f2 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Βοηθός</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Ρύθμιση της γλώσσας σας</translation>
+<translation id="1962969542251276847">Οθόνη κλειδώματος</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Εισαγωγή κειμένου</translation>
 <translation id="1993072747612765854">Μάθετε περισσότερα σχετικά με την πιο πρόσφατη ενημέρωση της εφαρμογής <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 9b0f4e2..31154de 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Set your language</translation>
+<translation id="1962969542251276847">Lock Screen</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Text input</translation>
 <translation id="1993072747612765854">Learn more about the latest <ph name="SYSTEM_APP_NAME" /> update</translation>
@@ -223,6 +224,7 @@
 <translation id="4181841719683918333">Languages</translation>
 <translation id="4195877955194704651">Automatic clicks button</translation>
 <translation id="4217571870635786043">Dictation</translation>
+<translation id="421885205185866088">Smart card PIN for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4239069858505860023">GPRS</translation>
 <translation id="4261870227682513959">Show notification settings. Notifications are off</translation>
 <translation id="4269883910223712419">The admin of this device has the ability to:</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 38ed5b1..9643011 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistente</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Establecer el idioma</translation>
+<translation id="1962969542251276847">Bloquear pantalla</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Ingreso de texto</translation>
 <translation id="1993072747612765854">Más información sobre la actualización más reciente de <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 2a1709b9..e8ce5ed 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistente</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Elegir el idioma</translation>
+<translation id="1962969542251276847">Bloquear pantalla</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Introducción de texto</translation>
 <translation id="1993072747612765854">Consulta más información sobre la última actualización de <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 62fd69e..5e6edf1 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Valige keel</translation>
+<translation id="1962969542251276847">Lukusta ekraan</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Tekstisisestus</translation>
 <translation id="1993072747612765854">Vaadake lisateavet operatsioonisüsteemi <ph name="SYSTEM_APP_NAME" /> uusima värskenduse kohta</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 066584b1..9cd13f9 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">دستیار</translation>
 <translation id="1957803754585243749">۰ درجه</translation>
 <translation id="1957958912175573503">تنظیم زبان</translation>
+<translation id="1962969542251276847">صفحه قفل</translation>
 <translation id="1969011864782743497">‏<ph name="DEVICE_NAME" /> (‏USB)</translation>
 <translation id="1978498689038657292">ورودی نوشتار</translation>
 <translation id="1993072747612765854">درباره جدیدترین به‌روزرسانی‌ <ph name="SYSTEM_APP_NAME" /> بیشتر بدانید.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 6d00c643..7ffe7c7 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Määritä kieli</translation>
+<translation id="1962969542251276847">Ruudunlukitus</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Tekstinsyöttö</translation>
 <translation id="1993072747612765854">Lue lisää uusimmasta <ph name="SYSTEM_APP_NAME" /> ‑päivityksestä.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 72c2501..2a14c59 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Itakda ang iyong wika</translation>
+<translation id="1962969542251276847">Screen ng Lock</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Pag-input ng text</translation>
 <translation id="1993072747612765854">Matuto pa tungkol sa pinakabagong update sa <ph name="SYSTEM_APP_NAME" /></translation>
@@ -477,7 +478,7 @@
 <translation id="813913629614996137">Sinisimulan...</translation>
 <translation id="8142441511840089262">I-double click</translation>
 <translation id="8142699993796781067">Pribadong network</translation>
-<translation id="8152092012181020186">Pindutin ang Ctrl + W para isara.</translation>
+<translation id="8152092012181020186">Pindutin ang Ctrl + W para isara ito.</translation>
 <translation id="8167567890448493835">Gamit ang <ph name="LOCALE_NAME" /></translation>
 <translation id="8190698733819146287">I-customize ang mga wika at input...</translation>
 <translation id="8192202700944119416">Nakatago ang mga notification.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 71a395ea..ce927ba 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Définir la langue</translation>
+<translation id="1962969542251276847">Verrouiller l'écran</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Saisie de texte</translation>
 <translation id="1993072747612765854">En savoir plus sur la dernière mise à jour <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 7b375801..4f43d32 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">સહાયક</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">તમારી ભાષા સેટ કરો</translation>
+<translation id="1962969542251276847">સ્ક્રીન લૉક કરો</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">ટેક્સ્ટ ઇનપુટ</translation>
 <translation id="1993072747612765854">નવીનતમ <ph name="SYSTEM_APP_NAME" /> અપડેટ વિશે વધુ જાણો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index e146743..2e0ac026 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">सहायक</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">अपनी भाषा सेट करें</translation>
+<translation id="1962969542251276847">लॉक स्‍क्रीन</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">टेक्स्ट इनपुट</translation>
 <translation id="1993072747612765854"><ph name="SYSTEM_APP_NAME" /> के नए अपडेट के बारे में ज़्यादा जानें</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index ff4372d..7d69a46 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Postavite jezik</translation>
+<translation id="1962969542251276847">Zaključaj zaslon</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Unos teksta</translation>
 <translation id="1993072747612765854">Saznajte više o najnovijem ažuriranju za <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 404b5ac..bcf5bc0 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Segéd</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Nyelv beállítása</translation>
+<translation id="1962969542251276847">Képernyő lezárása</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Szöveges bevitel</translation>
 <translation id="1993072747612765854">További információ a legújabb <ph name="SYSTEM_APP_NAME" />-frissítésről</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 0203571d..7e0778e 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asisten</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Setel bahasa Anda</translation>
+<translation id="1962969542251276847">Kunci Layar</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Masukan teks</translation>
 <translation id="1993072747612765854">Pelajari lebih lanjut update <ph name="SYSTEM_APP_NAME" /> terbaru</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index a6c8e48..66c5baf 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistente</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Imposta la lingua</translation>
+<translation id="1962969542251276847">Blocco schermo</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Inserimento testo</translation>
 <translation id="1993072747612765854">Leggi ulteriori informazioni sull'ultimo aggiornamento di <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 31e6203..b6a48cb 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1957803754585243749">‎0°‎</translation>
 <translation id="1957958912175573503">בחירת שפה</translation>
+<translation id="1962969542251276847">נעל מסך</translation>
 <translation id="1969011864782743497">‏<ph name="DEVICE_NAME" />‏ (USB)</translation>
 <translation id="1978498689038657292">קלט טקסט</translation>
 <translation id="1993072747612765854">מידע נוסף על העדכון האחרון של <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index a57d548..6a215f7 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">アシスタント</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">言語を設定</translation>
+<translation id="1962969542251276847">画面をロック</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" />(USB)</translation>
 <translation id="1978498689038657292">テキストを入力</translation>
 <translation id="1993072747612765854"><ph name="SYSTEM_APP_NAME" /> の最新アップデートの詳細をご確認ください</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 86b3279..cdeb2281 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">ಸಹಾಯಕ</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">ನಿಮ್ಮ ಭಾಷೆಯನ್ನು ಹೊಂದಿಸಿ</translation>
+<translation id="1962969542251276847">ಪರದೆಯನ್ನು ಲಾಕ್ ಮಾಡಿ</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">ಪಠ್ಯ ಇನ್‌ಪುಟ್</translation>
 <translation id="1993072747612765854">ಇತ್ತೀಚಿನ <ph name="SYSTEM_APP_NAME" /> ಅಪ್‌ಡೇಟ್ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 2adebce..3d93d987 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">어시스턴트</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">언어 설정</translation>
+<translation id="1962969542251276847">화면 잠금</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" />(USB)</translation>
 <translation id="1978498689038657292">텍스트 입력</translation>
 <translation id="1993072747612765854">최신 <ph name="SYSTEM_APP_NAME" /> 업데이트에 관해 자세히 알아보세요.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index e71c469..6469a54 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Padėjėjas</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Kalbos nustatymas</translation>
+<translation id="1962969542251276847">Užrakinti ekraną</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Teksto įvestis</translation>
 <translation id="1993072747612765854">Sužinokite daugiau apie naujausią „<ph name="SYSTEM_APP_NAME" />“ naujinį</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index c10c0c3..b6d3745 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistents</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Iestatiet savu valodu.</translation>
+<translation id="1962969542251276847">Bloķēt ekrānu</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Teksta ievade</translation>
 <translation id="1993072747612765854">Uzzināt vairāk par pēdējo <ph name="SYSTEM_APP_NAME" /> atjauninājumu</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 84d86d6..e936e90 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">സഹായി</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">നിങ്ങളുടെ ഭാഷ സജ്ജീകരിക്കുക</translation>
+<translation id="1962969542251276847">സ്‌ക്രീൻ ലോക്കുചെയ്യുക</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">ടെക്‌സ്‌റ്റ് ഇൻപുട്ട്</translation>
 <translation id="1993072747612765854">ഏറ്റവും പുതിയ <ph name="SYSTEM_APP_NAME" /> അപ്‌ഡേറ്റിനെ കുറിച്ച് കൂടുതലറിയുക</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 8ffc741..b5a5d92b 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">साहाय्यक</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">तुमची भाषा सेट करा</translation>
+<translation id="1962969542251276847">लॉक स्क्रीन</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">मजकूर इनपुट</translation>
 <translation id="1993072747612765854"><ph name="SYSTEM_APP_NAME" /> च्या नवीनतम अपडेटबाबत अधिक जाणून घ्या</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index 3901adc6..ce6ee20 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Pembantu</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Tetapkan bahasa anda</translation>
+<translation id="1962969542251276847">Kunci Skrin</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Input teks</translation>
 <translation id="1993072747612765854">Ketahui lebih lanjut tentang kemas kini <ph name="SYSTEM_APP_NAME" /> yang terbaharu</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index cfaaf6c..9f43b4a 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Je taal instellen</translation>
+<translation id="1962969542251276847">Scherm vergrendelen</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Tekstinvoer</translation>
 <translation id="1993072747612765854">Meer informatie over de laatste update van <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 0579ca1..7d31698 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Velg språk</translation>
+<translation id="1962969542251276847">Skjermlås</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Tekstfelt</translation>
 <translation id="1993072747612765854">Finn ut mer om den nyeste <ph name="SYSTEM_APP_NAME" />-oppdateringen</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 49b196f..8514e8ce 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asystent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Ustaw język</translation>
+<translation id="1962969542251276847">Zablokuj ekran</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Wprowadzanie tekstu</translation>
 <translation id="1993072747612765854">Więcej informacji o najnowszej aktualizacji <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index deb05d5..a711d0f 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistente</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Configurar idioma</translation>
+<translation id="1962969542251276847">Tela de bloqueio</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Entrada de texto</translation>
 <translation id="1993072747612765854">Saiba mais sobre a última atualização do <ph name="SYSTEM_APP_NAME" /></translation>
@@ -223,6 +224,7 @@
 <translation id="4181841719683918333">Idiomas</translation>
 <translation id="4195877955194704651">Botão de cliques automáticos</translation>
 <translation id="4217571870635786043">Ditado</translation>
+<translation id="421885205185866088">PIN de cartão inteligente para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4239069858505860023">GPRS</translation>
 <translation id="4261870227682513959">Mostrar configurações de notificação. As notificações estão desativadas</translation>
 <translation id="4269883910223712419">O administrador deste dispositivo pode:</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index a216b0c..5bb0c9a 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistente</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Definir o idioma</translation>
+<translation id="1962969542251276847">Bloqueio de Ecrã</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Entrada de texto</translation>
 <translation id="1993072747612765854">Saiba mais sobre a mais recente atualização do <ph name="SYSTEM_APP_NAME" />.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 40b27d81..4fe59f4e 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Setează limba</translation>
+<translation id="1962969542251276847">Ecran de blocare</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Introducere text</translation>
 <translation id="1993072747612765854">Află mai multe despre cea mai recentă actualizare <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 02673af..5b85b8b 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Ассистент</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Выберите язык</translation>
+<translation id="1962969542251276847">Блокировать экран</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Ввод текста</translation>
 <translation id="1993072747612765854">Подробнее о последнем обновлении <ph name="SYSTEM_APP_NAME" />…</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index ce0e99e..bd9c714f 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Nastavenie jazyka</translation>
+<translation id="1962969542251276847">Uzamknúť obrazovku</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Zadávanie textu</translation>
 <translation id="1993072747612765854">Ďalšie informácie o najnovšej aktualizácii aplikácie <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 1960229..37b6458 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Pomočnik</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Nastavitev jezika</translation>
+<translation id="1962969542251276847">Zakleni zaslon</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Vnos besedila</translation>
 <translation id="1993072747612765854">Več informacij o najnovejši posodobitvi za <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 1548379..6e2beed 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Помоћник</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Подесите језик</translation>
+<translation id="1962969542251276847">Закључај екран</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Унос текста</translation>
 <translation id="1993072747612765854">Сазнајте више о најновијем ажурирању за: <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 572ace79..56a5754c 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Ställ in språk</translation>
+<translation id="1962969542251276847">Lås skärmen</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Textinmatning</translation>
 <translation id="1993072747612765854">Läs mer om den senaste uppdateringen av <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 4f4ca60e..243d1ef 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Mratibu</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Weka lugha yako</translation>
+<translation id="1962969542251276847">Skrini Iliyofungwa</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Uingizaji wa maandishi</translation>
 <translation id="1993072747612765854">Pata maelezo zaidi kuhusu sasisho la hivi majuzi la <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 573e5747..381fd59 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">அசிஸ்டண்ட்</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">எனது மொழியை அமை</translation>
+<translation id="1962969542251276847">லாக் ஸ்கிரீன்</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">உரை உள்ளீடு</translation>
 <translation id="1993072747612765854">சமீபத்திய <ph name="SYSTEM_APP_NAME" /> புதுப்பிப்பைப் பற்றி மேலும் அறிக</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index c5d84c2..98c573fe 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">సహాయకం</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">మీ భాషని సెట్ చేయండి</translation>
+<translation id="1962969542251276847">స్క్రీన్‌ను లాక్ చేయి</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">వచన ఇన్‌పుట్</translation>
 <translation id="1993072747612765854">తాజా <ph name="SYSTEM_APP_NAME" /> అప్‌డేట్ గురించి మరింత తెలుసుకోండి</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 478e08e..13d6ce3 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">ผู้ช่วย</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">ตั้งค่าภาษา</translation>
+<translation id="1962969542251276847">ล็อกหน้าจอ</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">การป้อนข้อความ</translation>
 <translation id="1993072747612765854">ดูข้อมูลเพิ่มเติมเกี่ยวกับอัปเดตล่าสุดของ <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 7b2ca8d..5c00d00 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Asistan</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Dilinizi ayarlayın</translation>
+<translation id="1962969542251276847">Kilit Ekranı</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Metin girişi</translation>
 <translation id="1993072747612765854">En yeni <ph name="SYSTEM_APP_NAME" /> güncellemesi ile ilgili daha fazla bilgi edinin</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 345164e4..863dc837 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Асистент</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Вибрати мову</translation>
+<translation id="1962969542251276847">Блокування екрана</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Ввести текст</translation>
 <translation id="1993072747612765854">Докладніше про останнє оновлення додатка <ph name="SYSTEM_APP_NAME" /></translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index e67c9f75..2191fe1 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">Trợ lý</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">Đặt ngôn ngữ</translation>
+<translation id="1962969542251276847">Khóa màn hình</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">Nhập văn bản</translation>
 <translation id="1993072747612765854">Tìm hiểu thêm về bản cập nhật <ph name="SYSTEM_APP_NAME" /> mới nhất</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 6c6f3ac7..27e67b7 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">智能助理</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">设置语言</translation>
+<translation id="1962969542251276847">锁定屏幕</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">文字输入</translation>
 <translation id="1993072747612765854">详细了解最新的 <ph name="SYSTEM_APP_NAME" />更新</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index d74d001..669b276 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -74,6 +74,7 @@
 <translation id="1951012854035635156">小幫手</translation>
 <translation id="1957803754585243749">0°</translation>
 <translation id="1957958912175573503">設定語言</translation>
+<translation id="1962969542251276847">鎖定螢幕</translation>
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1978498689038657292">文字輸入</translation>
 <translation id="1993072747612765854">進一步瞭解最新的 <ph name="SYSTEM_APP_NAME" />更新內容</translation>
diff --git a/ash/system/accessibility/dictation_button_tray.cc b/ash/system/accessibility/dictation_button_tray.cc
index 4d97375c..1307aa3 100644
--- a/ash/system/accessibility/dictation_button_tray.cc
+++ b/ash/system/accessibility/dictation_button_tray.cc
@@ -7,8 +7,8 @@
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/public/cpp/accessibility_controller_enums.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/tray/tray_constants.h"
@@ -27,8 +27,10 @@
 
   SetInkDropMode(InkDropMode::ON);
 
-  off_image_ = gfx::CreateVectorIcon(kDictationOffNewuiIcon, kShelfIconColor);
-  on_image_ = gfx::CreateVectorIcon(kDictationOnNewuiIcon, kShelfIconColor);
+  off_image_ = gfx::CreateVectorIcon(kDictationOffNewuiIcon,
+                                     ShelfConfig::Get()->shelf_icon_color());
+  on_image_ = gfx::CreateVectorIcon(kDictationOnNewuiIcon,
+                                    ShelfConfig::Get()->shelf_icon_color());
   icon_->SetImage(off_image_);
   const int vertical_padding = (kTrayItemSize - off_image_.height()) / 2;
   const int horizontal_padding = (kTrayItemSize - off_image_.width()) / 2;
diff --git a/ash/system/accessibility/select_to_speak_tray.cc b/ash/system/accessibility/select_to_speak_tray.cc
index 23cc615..fc93e7f 100644
--- a/ash/system/accessibility/select_to_speak_tray.cc
+++ b/ash/system/accessibility/select_to_speak_tray.cc
@@ -7,7 +7,6 @@
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/tray/tray_constants.h"
diff --git a/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc b/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc
index 483ca70..8f81cfd 100644
--- a/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc
+++ b/ash/system/bluetooth/tray_bluetooth_helper_experimental.cc
@@ -18,9 +18,10 @@
 
 // base::Unretained():
 //
-// Usage of `base::Unretained(this)` is safe when calling BluetoothSystemPtr
-// methods because BluetoothSystemPtr is owned by `this` and guarantees that no
-// callbacks will be run after its destruction.
+// Usage of `base::Unretained(this)` is safe when calling
+// mojo::Remote<BluetoothSystem> methods because mojo::Remote<BluetoothSystem>
+// is owned by `this` and guarantees that no callbacks will be run after its
+// destruction.
 
 namespace ash {
 
@@ -38,24 +39,24 @@
   device::mojom::BluetoothSystemClientPtr client_ptr;
   bluetooth_system_client_binding_.Bind(mojo::MakeRequest(&client_ptr));
 
-  bluetooth_system_factory->Create(mojo::MakeRequest(&bluetooth_system_ptr_),
-                                   std::move(client_ptr));
-  bluetooth_system_ptr_->GetState(
+  bluetooth_system_factory->Create(
+      bluetooth_system_.BindNewPipeAndPassReceiver(), std::move(client_ptr));
+  bluetooth_system_->GetState(
       base::BindOnce(&TrayBluetoothHelperExperimental::OnStateChanged,
                      // See base::Unretained() note at the top.
                      base::Unretained(this)));
-  bluetooth_system_ptr_->GetScanState(
+  bluetooth_system_->GetScanState(
       base::BindOnce(&TrayBluetoothHelperExperimental::OnScanStateChanged,
                      // See base::Unretained() note at the top.
                      base::Unretained(this)));
 }
 
 void TrayBluetoothHelperExperimental::StartBluetoothDiscovering() {
-  bluetooth_system_ptr_->StartScan(base::DoNothing());
+  bluetooth_system_->StartScan(base::DoNothing());
 }
 
 void TrayBluetoothHelperExperimental::StopBluetoothDiscovering() {
-  bluetooth_system_ptr_->StopScan(base::DoNothing());
+  bluetooth_system_->StopScan(base::DoNothing());
 }
 
 void TrayBluetoothHelperExperimental::ConnectToBluetoothDevice(
@@ -69,7 +70,7 @@
 }
 
 void TrayBluetoothHelperExperimental::SetBluetoothEnabled(bool enabled) {
-  bluetooth_system_ptr_->SetPowered(enabled, base::DoNothing());
+  bluetooth_system_->SetPowered(enabled, base::DoNothing());
 }
 
 bool TrayBluetoothHelperExperimental::HasBluetoothDiscoverySession() {
@@ -79,7 +80,7 @@
 
 void TrayBluetoothHelperExperimental::GetBluetoothDevices(
     GetBluetoothDevicesCallback callback) const {
-  bluetooth_system_ptr_->GetAvailableDevices(std::move(callback));
+  bluetooth_system_->GetAvailableDevices(std::move(callback));
 }
 
 void TrayBluetoothHelperExperimental::OnStateChanged(
diff --git a/ash/system/bluetooth/tray_bluetooth_helper_experimental.h b/ash/system/bluetooth/tray_bluetooth_helper_experimental.h
index 9511a653..9959a55 100644
--- a/ash/system/bluetooth/tray_bluetooth_helper_experimental.h
+++ b/ash/system/bluetooth/tray_bluetooth_helper_experimental.h
@@ -11,6 +11,7 @@
 #include "ash/system/bluetooth/tray_bluetooth_helper.h"
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/bluetooth_system.mojom.h"
 
 namespace service_manager {
@@ -47,7 +48,7 @@
  private:
   service_manager::Connector* connector_;
 
-  device::mojom::BluetoothSystemPtr bluetooth_system_ptr_;
+  mojo::Remote<device::mojom::BluetoothSystem> bluetooth_system_;
   mojo::Binding<device::mojom::BluetoothSystemClient>
       bluetooth_system_client_binding_{this};
 
diff --git a/ash/system/message_center/ash_popup_alignment_delegate.cc b/ash/system/message_center/ash_popup_alignment_delegate.cc
index 601ba6f..95cb207a 100644
--- a/ash/system/message_center/ash_popup_alignment_delegate.cc
+++ b/ash/system/message_center/ash_popup_alignment_delegate.cc
@@ -4,11 +4,11 @@
 
 #include "ash/system/message_center/ash_popup_alignment_delegate.h"
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/wm/work_area_insets.h"
@@ -60,7 +60,7 @@
   // should be reduced by the height of shelf's shown height.
   if (shelf_->GetVisibilityState() == SHELF_AUTO_HIDE &&
       shelf_->GetAutoHideState() == SHELF_AUTO_HIDE_SHOWN) {
-    tray_bubble_height_ -= ShelfConstants::shelf_size();
+    tray_bubble_height_ -= ShelfConfig::Get()->shelf_size();
   }
 
   if (tray_bubble_height_ > 0)
diff --git a/ash/system/network/network_icon.cc b/ash/system/network/network_icon.cc
index b7e7f062..15c3fb2 100644
--- a/ash/system/network/network_icon.cc
+++ b/ash/system/network/network_icon.cc
@@ -16,6 +16,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
@@ -204,7 +205,7 @@
   static gfx::ImageSkia* s_arcs_images_dark[kImageCount];
   static gfx::ImageSkia* s_arcs_images_light[kImageCount];
   int index = animation * nextafter(static_cast<float>(kImageCount), 0);
-  index = std::max(std::min(index, kImageCount - 1), 0);
+  index = base::ClampToRange(index, 0, kImageCount - 1);
   gfx::ImageSkia** images;
   bool dark = IconTypeIsDark(icon_type);
   if (image_type == BARS)
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc
index 529b053..5b24629 100644
--- a/ash/system/overview/overview_button_tray.cc
+++ b/ash/system/overview/overview_button_tray.cc
@@ -5,9 +5,9 @@
 #include "ash/system/overview/overview_button_tray.h"
 
 #include "ash/metrics/user_metrics_recorder.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/tray/tray_constants.h"
@@ -37,8 +37,8 @@
       scoped_session_observer_(this) {
   SetInkDropMode(InkDropMode::ON);
 
-  gfx::ImageSkia image =
-      gfx::CreateVectorIcon(kShelfOverviewIcon, kShelfIconColor);
+  gfx::ImageSkia image = gfx::CreateVectorIcon(
+      kShelfOverviewIcon, ShelfConfig::Get()->shelf_icon_color());
   icon_->SetImage(image);
   const int vertical_padding = (kTrayItemSize - image.height()) / 2;
   const int horizontal_padding = (kTrayItemSize - image.width()) / 2;
@@ -135,18 +135,20 @@
           : base::make_optional(event.time_stamp());
 
   OverviewController* controller = Shell::Get()->overview_controller();
-  // Note: Toggling overview mode will fail if there is no window to show, the
-  // screen is locked, a modal dialog is open or is running in kiosk app
-  // session.
-  bool performed;
   if (controller->InOverviewSession())
-    performed = controller->EndOverview();
+    controller->EndOverview();
   else
-    performed = controller->StartOverview();
+    controller->StartOverview();
   Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_OVERVIEW);
-  return performed;
+
+  // The return value doesn't matter here. OnOverviewModeStarting() and
+  // OnOverviewModeEnded() will do the right thing to set the button state.
+  return true;
 }
 
+void OverviewButtonTray::HandlePerformActionResult(bool action_performed,
+                                                   const ui::Event& event) {}
+
 void OverviewButtonTray::OnSessionStateChanged(
     session_manager::SessionState state) {
   UpdateIconVisibility();
diff --git a/ash/system/overview/overview_button_tray.h b/ash/system/overview/overview_button_tray.h
index dde6b9ea..866deb2 100644
--- a/ash/system/overview/overview_button_tray.h
+++ b/ash/system/overview/overview_button_tray.h
@@ -53,6 +53,8 @@
 
   // ActionableView:
   bool PerformAction(const ui::Event& event) override;
+  void HandlePerformActionResult(bool action_performed,
+                                 const ui::Event& event) override;
 
   // SessionObserver:
   void OnSessionStateChanged(session_manager::SessionState state) override;
diff --git a/ash/system/palette/common_palette_tool.cc b/ash/system/palette/common_palette_tool.cc
index a041892..8abaed1 100644
--- a/ash/system/palette/common_palette_tool.cc
+++ b/ash/system/palette/common_palette_tool.cc
@@ -5,7 +5,6 @@
 #include "ash/system/palette/common_palette_tool.h"
 
 #include "ash/resources/vector_icons/vector_icons.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/system/palette/palette_ids.h"
 #include "ash/system/palette/palette_tool_manager.h"
 #include "ash/system/tray/hover_highlight_view.h"
@@ -16,6 +15,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/controls/label.h"
 
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc
index 5ad97f5..f32f725d 100644
--- a/ash/system/palette/palette_tray.cc
+++ b/ash/system/palette/palette_tray.cc
@@ -8,12 +8,12 @@
 
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/public/cpp/ash_pref_names.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/stylus_utils.h"
 #include "ash/public/cpp/system_tray_client.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
@@ -552,7 +552,7 @@
   icon_->SetImage(CreateVectorIcon(
       palette_tool_manager_->GetActiveTrayIcon(
           palette_tool_manager_->GetActiveTool(PaletteGroup::MODE)),
-      kTrayIconSize, kShelfIconColor));
+      kTrayIconSize, ShelfConfig::Get()->shelf_icon_color()));
 }
 
 void PaletteTray::OnPaletteEnabledPrefChanged() {
diff --git a/ash/system/power/power_status.cc b/ash/system/power/power_status.cc
index 3ff623e..532139a 100644
--- a/ash/system/power/power_status.cc
+++ b/ash/system/power/power_status.cc
@@ -15,6 +15,7 @@
 #include "base/i18n/time_formatting.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/dbus/power/power_manager_client.h"
@@ -97,8 +98,8 @@
     float charge_level =
         std::floor(info_.charge_percent / 100.0 * icon_bounds.height());
     const float min_charge_level = dsf * kMinVisualChargeLevel;
-    charge_level = std::max(std::min(charge_level, icon_bounds.height()),
-                            min_charge_level);
+    charge_level = base::ClampToRange(charge_level, min_charge_level,
+                                      icon_bounds.height());
 
     const float charge_y = icon_bounds.bottom() - charge_level;
     gfx::RectF clip_rect(0, charge_y, size().width() * dsf,
diff --git a/ash/system/status_area_widget_delegate.cc b/ash/system/status_area_widget_delegate.cc
index 9c39325..9205f6c 100644
--- a/ash/system/status_area_widget_delegate.cc
+++ b/ash/system/status_area_widget_delegate.cc
@@ -5,9 +5,9 @@
 #include "ash/system/status_area_widget_delegate.h"
 
 #include "ash/focus_cycler.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/system/status_area_widget.h"
@@ -194,7 +194,7 @@
 void StatusAreaWidgetDelegate::SetBorderOnChild(views::View* child,
                                                 bool is_child_on_edge) {
   const int vertical_padding =
-      (ShelfConstants::shelf_size() - kTrayItemSize) / 2;
+      (ShelfConfig::Get()->shelf_size() - kTrayItemSize) / 2;
 
   // Edges for horizontal alignment (right-to-left, default).
   int top_edge = vertical_padding;
@@ -203,6 +203,9 @@
   // Add some extra space so that borders don't overlap. This padding between
   // items also takes care of padding at the edge of the shelf.
   int right_edge = kPaddingBetweenWidgetsNewUi;
+
+  // TODO: ensure that this is set in tablet mode, only when dense shelf
+  // threshold is met. (just make this variable a member of ShelfConfig)
   if (is_child_on_edge && chromeos::switches::ShouldShowShelfDenseClamshell())
     right_edge = kPaddingBetweenWidgetAndRightScreenEdge;
 
diff --git a/ash/system/toast/toast_manager_unittest.cc b/ash/system/toast/toast_manager_unittest.cc
index 37375e5..56468fc 100644
--- a/ash/system/toast/toast_manager_unittest.cc
+++ b/ash/system/toast/toast_manager_unittest.cc
@@ -4,10 +4,10 @@
 
 #include "ash/system/toast/toast_manager_impl.h"
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/screen_util.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/work_area_insets.h"
@@ -234,7 +234,8 @@
   EXPECT_TRUE(toast_bounds.Intersects(
       GetPrimaryWorkAreaInsets()->user_work_area_bounds()));
   EXPECT_NEAR(root_bounds.CenterPoint().x(), toast_bounds.CenterPoint().x(), 1);
-  EXPECT_EQ(root_bounds.bottom() - kHiddenShelfInScreenPortion -
+  EXPECT_EQ(root_bounds.bottom() -
+                ShelfConfig::Get()->hidden_shelf_in_screen_portion() -
                 ToastOverlay::kOffset,
             toast_bounds.bottom());
 }
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc
index 12fd5eff..a3b96d1 100644
--- a/ash/system/tray/tray_background_view.cc
+++ b/ash/system/tray/tray_background_view.cc
@@ -10,9 +10,9 @@
 #include "ash/focus_cycler.h"
 #include "ash/login/ui/lock_screen.h"
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shelf/login_shelf_view.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_focus_cycler.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shelf/shelf_widget.h"
@@ -128,8 +128,9 @@
     cc::PaintFlags background_flags;
     background_flags.setAntiAlias(true);
     int border_radius = kTrayRoundedBorderRadius;
-    background_flags.setColor(kShelfControlPermanentHighlightBackground);
-    border_radius = ShelfConstants::control_border_radius();
+    background_flags.setColor(
+        ShelfConfig::Get()->shelf_control_permanent_highlight_background());
+    border_radius = ShelfConfig::Get()->control_border_radius();
 
     gfx::Rect bounds = tray_background_view_->GetBackgroundBounds();
     const float dsf = canvas->UndoDeviceScaleFactor();
@@ -159,13 +160,14 @@
       widget_observer_(new TrayWidgetObserver(this)) {
   DCHECK(shelf_);
   set_notify_enter_exit_on_child(true);
-  set_ink_drop_base_color(kShelfInkDropBaseColor);
-  set_ink_drop_visible_opacity(kShelfInkDropVisibleOpacity);
+  set_ink_drop_base_color(ShelfConfig::Get()->shelf_ink_drop_base_color());
+  set_ink_drop_visible_opacity(
+      ShelfConfig::Get()->shelf_ink_drop_visible_opacity());
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
   SetBackground(std::unique_ptr<views::Background>(background_));
   SetInstallFocusRingOnFocus(true);
-  focus_ring()->SetColor(kShelfFocusBorderColor);
+  focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
   SetFocusPainter(nullptr);
 
   AddChildView(tray_container_);
@@ -438,7 +440,7 @@
 }
 
 void TrayBackgroundView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
-  const int border_radius = ShelfConstants::control_border_radius();
+  const int border_radius = ShelfConfig::Get()->control_border_radius();
   auto path = std::make_unique<SkPath>();
   path->addRoundRect(gfx::RectToSkRect(GetBackgroundBounds()), border_radius,
                      border_radius);
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc
index 3450eba..86705e7 100644
--- a/ash/system/tray/tray_bubble_view.cc
+++ b/ash/system/tray/tray_bubble_view.cc
@@ -8,6 +8,7 @@
 #include <numeric>
 
 #include "base/macros.h"
+#include "base/numerics/ranges.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkPath.h"
@@ -299,7 +300,7 @@
 }
 
 void TrayBubbleView::SetWidth(int width) {
-  width = std::max(std::min(width, params_.max_width), params_.min_width);
+  width = base::ClampToRange(width, params_.min_width, params_.max_width);
   if (preferred_width_ == width)
     return;
   preferred_width_ = width;
diff --git a/ash/system/virtual_keyboard/virtual_keyboard_tray.cc b/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
index 1707ba4..437ebbe 100644
--- a/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
+++ b/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
@@ -11,7 +11,6 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/tray/tray_constants.h"
diff --git a/ash/wm/client_controlled_state_unittest.cc b/ash/wm/client_controlled_state_unittest.cc
index ca7cfde..49431fa 100644
--- a/ash/wm/client_controlled_state_unittest.cc
+++ b/ash/wm/client_controlled_state_unittest.cc
@@ -4,8 +4,8 @@
 
 #include "ash/wm/client_controlled_state.h"
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/desks/desks_util.h"
@@ -384,7 +384,7 @@
   window_state()->OnWMEvent(&snap_left_event);
 
   EXPECT_EQ(second_display_id, delegate()->display_id());
-  EXPECT_EQ(gfx::Rect(0, 0, 300, 500 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(0, 0, 300, 500 - ShelfConfig::Get()->shelf_size()),
             delegate()->requested_bounds());
 
   state()->EnterNextState(window_state(), delegate()->new_state());
@@ -395,7 +395,7 @@
   window()->SetBoundsInScreen(delegate()->requested_bounds(), first_display);
   state()->set_bounds_locally(false);
   EXPECT_EQ(first_display.id(), delegate()->display_id());
-  EXPECT_EQ(gfx::Rect(0, 0, 400, 600 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(0, 0, 400, 600 - ShelfConfig::Get()->shelf_size()),
             delegate()->requested_bounds());
 }
 
diff --git a/ash/wm/drag_window_resizer_unittest.cc b/ash/wm/drag_window_resizer_unittest.cc
index 60dcc82..2ae1926 100644
--- a/ash/wm/drag_window_resizer_unittest.cc
+++ b/ash/wm/drag_window_resizer_unittest.cc
@@ -5,9 +5,9 @@
 #include "ash/wm/drag_window_resizer.h"
 
 #include "ash/display/mouse_cursor_event_filter.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -246,7 +246,7 @@
   // will shrink to fit to the work area.
   window_->SetBoundsInScreen(gfx::Rect(0, 0, 700, 500),
                              display::Screen::GetScreen()->GetPrimaryDisplay());
-  const int shelf_inset = 300 - ShelfConstants::shelf_size();
+  const int shelf_inset = 300 - ShelfConfig::Get()->shelf_size();
   EXPECT_EQ(root_windows[0], window_->GetRootWindow());
   {
     // Grab the top-right edge of the window and move the pointer to (0, 10)
diff --git a/ash/wm/lock_action_handler_layout_manager_unittest.cc b/ash/wm/lock_action_handler_layout_manager_unittest.cc
index b44aeedc..ffbb8d13 100644
--- a/ash/wm/lock_action_handler_layout_manager_unittest.cc
+++ b/ash/wm/lock_action_handler_layout_manager_unittest.cc
@@ -16,12 +16,12 @@
 #include "ash/lock_screen_action/lock_screen_action_background_controller_stub.h"
 #include "ash/lock_screen_action/test_lock_screen_action_background_controller.h"
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/mojom/tray_action.mojom.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/session/test_session_controller_client.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -237,7 +237,7 @@
   gfx::Rect target_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   target_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                      ShelfConstants::shelf_size() /* bottom */);
+                      ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
 }
 
@@ -261,7 +261,7 @@
   gfx::Rect target_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   target_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                      ShelfConstants::shelf_size() /* bottom */);
+                      ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
 }
 
@@ -280,7 +280,7 @@
   gfx::Rect target_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   target_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                      ShelfConstants::shelf_size() /* bottom */);
+                      ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
 }
 
@@ -288,7 +288,7 @@
   gfx::Rect initial_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   initial_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                       ShelfConstants::shelf_size() /* bottom */);
+                       ShelfConfig::Get()->shelf_size() /* bottom */);
 
   SetUpTrayActionClientAndLockSession(mojom::TrayActionState::kActive);
 
@@ -450,7 +450,7 @@
   gfx::Rect target_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   target_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                      ShelfConstants::shelf_size() /* bottom */);
+                      ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
 
   EXPECT_EQ(root_windows[0], window->GetRootWindow());
@@ -464,7 +464,7 @@
   EXPECT_EQ(root_windows[0], window->GetRootWindow());
   target_bounds = gfx::Rect(300, 400);
   target_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                      ShelfConstants::shelf_size() /* bottom */);
+                      ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
 
   window_state->Restore();
@@ -712,7 +712,7 @@
   gfx::Rect target_app_window_bounds =
       display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
   target_app_window_bounds.Inset(0 /* left */, 0 /* top */, 0 /* right */,
-                                 ShelfConstants::shelf_size() /* bottom */);
+                                 ShelfConfig::Get()->shelf_size() /* bottom */);
   EXPECT_EQ(target_app_window_bounds, window->GetBoundsInScreen());
 
   EXPECT_EQ(display::Screen::GetScreen()->GetPrimaryDisplay().bounds(),
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc
index 4235c044..f68f158 100644
--- a/ash/wm/overview/overview_controller.cc
+++ b/ash/wm/overview/overview_controller.cc
@@ -285,18 +285,24 @@
   if (InOverviewSession())
     return true;
 
-  return ToggleOverview(type);
+  if (!CanEnterOverview())
+    return false;
+
+  ToggleOverview(type);
+  return true;
 }
 
-// TODO(flackr): Make OverviewController observe the activation of
-// windows, so we can remove OverviewDelegate.
 bool OverviewController::EndOverview(
     OverviewSession::EnterExitOverviewType type) {
   // No need to end overview if overview is already ended.
   if (!InOverviewSession())
     return true;
 
-  return ToggleOverview(type);
+  if (!CanEndOverview(type))
+    return false;
+
+  ToggleOverview(type);
+  return true;
 }
 
 bool OverviewController::InOverviewSession() const {
@@ -530,17 +536,13 @@
   return windows;
 }
 
-bool OverviewController::ToggleOverview(
+void OverviewController::ToggleOverview(
     OverviewSession::EnterExitOverviewType type) {
   // Hide the virtual keyboard as it obstructs the overview mode.
   // Don't need to hide if it's the a11y keyboard, as overview mode
   // can accept text input and it resizes correctly with the a11y keyboard.
   keyboard::KeyboardUIController::Get()->HideKeyboardImplicitlyByUser();
 
-  // Prevent toggling overview during the split view divider snap animation.
-  if (Shell::Get()->split_view_controller()->IsDividerAnimating())
-    return true;
-
   auto windows =
       Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk);
 
@@ -558,18 +560,7 @@
   window_util::RemoveTransientDescendants(&windows);
 
   if (InOverviewSession()) {
-    // Do not allow ending overview if we're in single split mode unless swiping
-    // up from the shelf in tablet mode, or ending overview immediately without
-    // animations.
-    if (windows.empty() &&
-        Shell::Get()->split_view_controller()->InTabletSplitViewMode() &&
-        Shell::Get()->split_view_controller()->state() !=
-            SplitViewState::kBothSnapped &&
-        type != OverviewSession::EnterExitOverviewType::kSwipeFromShelf &&
-        type != OverviewSession::EnterExitOverviewType::kImmediateExit) {
-      return true;
-    }
-
+    DCHECK(CanEndOverview(type));
     TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::ExitOverview", this);
 
     // Suspend occlusion tracker until the exit animation is complete.
@@ -630,10 +621,7 @@
     if (delayed_animations_.empty())
       OnEndingAnimationComplete(/*canceled=*/false);
   } else {
-    // Don't start overview if it is not allowed.
-    if (!CanEnterOverview())
-      return false;
-
+    DCHECK(CanEnterOverview());
     TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::EnterOverview", this);
 
     // Clear any animations that may be running from last overview end.
@@ -694,7 +682,6 @@
                                base::Time::Now() - last_overview_session_time_);
     }
   }
-  return true;
 }
 
 // static
@@ -703,6 +690,10 @@
 }
 
 bool OverviewController::CanEnterOverview() {
+  // Prevent toggling overview during the split view divider snap animation.
+  if (Shell::Get()->split_view_controller()->IsDividerAnimating())
+    return false;
+
   // Don't allow a window overview if the user session is not active (e.g.
   // locked or in user-adding screen) or a modal dialog is open or running in
   // kiosk app session.
@@ -715,6 +706,28 @@
          !session_controller->IsRunningInAppMode();
 }
 
+bool OverviewController::CanEndOverview(
+    OverviewSession::EnterExitOverviewType type) {
+  SplitViewController* split_view_controller =
+      Shell::Get()->split_view_controller();
+  // Prevent toggling overview during the split view divider snap animation.
+  if (split_view_controller->IsDividerAnimating())
+    return false;
+
+  // Do not allow ending overview if we're in single split mode unless swiping
+  // up from the shelf in tablet mode, or ending overview immediately without
+  // animations.
+  if (split_view_controller->InTabletSplitViewMode() &&
+      split_view_controller->state() != SplitViewState::kBothSnapped &&
+      InOverviewSession() && overview_session_->IsEmpty() &&
+      type != OverviewSession::EnterExitOverviewType::kSwipeFromShelf &&
+      type != OverviewSession::EnterExitOverviewType::kImmediateExit) {
+    return false;
+  }
+
+  return true;
+}
+
 void OverviewController::OnStartingAnimationComplete(bool canceled) {
   if (IsWallpaperChangeAllowed() && !canceled)
     overview_wallpaper_controller_->Blur(/*animate_only=*/true);
diff --git a/ash/wm/overview/overview_controller.h b/ash/wm/overview/overview_controller.h
index 6b6122e..05e5aed8 100644
--- a/ash/wm/overview/overview_controller.h
+++ b/ash/wm/overview/overview_controller.h
@@ -29,9 +29,9 @@
   OverviewController();
   ~OverviewController() override;
 
-  // Starts/Ends overview with |type|. Returns true if successful (showing
-  // overview would be unsuccessful if there are no windows to show). Depending
-  // on |type| the enter/exit animation will look different.
+  // Starts/Ends overview with |type|. Returns true if enter or exit overview
+  // successful. Depending on |type| the enter/exit animation will look
+  // different.
   bool StartOverview(OverviewSession::EnterExitOverviewType type =
                          OverviewSession::EnterExitOverviewType::kNormal);
   bool EndOverview(OverviewSession::EnterExitOverviewType type =
@@ -115,18 +115,19 @@
   FRIEND_TEST_ALL_PREFIXES(TabletModeControllerTest,
                            DisplayDisconnectionDuringOverview);
 
-  // Attempts to toggle overview mode and returns true if successful (showing
-  // overview would be unsuccessful if there are no windows to show). Depending
-  // on |type| the enter/exit animation will look different.
-  bool ToggleOverview(OverviewSession::EnterExitOverviewType type =
+  // Toggle overview mode. Depending on |type| the enter/exit animation will
+  // look different.
+  void ToggleOverview(OverviewSession::EnterExitOverviewType type =
                           OverviewSession::EnterExitOverviewType::kNormal);
 
   // There is no need to blur or dim the wallpaper for tests.
   static void SetDoNotChangeWallpaperForTests();
 
-  // Returns true if selecting windows in an overview is enabled. This is false
-  // at certain times, such as when the lock screen is visible.
+  // Returns true if it's possible to enter or exit overview mode in the current
+  // configuration. This can be false at certain times, such as when the lock
+  // screen is visible we can't overview mode.
   bool CanEnterOverview();
+  bool CanEndOverview(OverviewSession::EnterExitOverviewType type);
 
   void OnStartingAnimationComplete(bool canceled);
   void OnEndingAnimationComplete(bool canceled);
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index ecca698..eed44aa 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -19,7 +19,6 @@
 #include "ash/rotator/screen_rotation_animator.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
 #include "ash/wm/desks/desk_mini_view.h"
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index 4168b5d..ed07279b 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -12,11 +12,11 @@
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/wm/desks/desk.h"
@@ -87,7 +87,7 @@
   // shown, but we want to place the thumbnails as if the shelf was shown, so
   // manually update the work area.
   if (Shelf::ForWindow(root_window)->GetVisibilityState() == SHELF_AUTO_HIDE) {
-    const int inset = ShelfConstants::shelf_size();
+    const int inset = ShelfConfig::Get()->shelf_size();
     switch (Shelf::ForWindow(root_window)->alignment()) {
       case SHELF_ALIGNMENT_BOTTOM:
       case SHELF_ALIGNMENT_BOTTOM_LOCKED:
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 323d2ee..fc93f08f 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -20,10 +20,10 @@
 #include "ash/public/cpp/app_types.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/fps_counter.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view_test_api.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -808,7 +808,7 @@
   EXPECT_EQ(fullscreen_window_bounds, window2->GetTargetBounds());
 
   const gfx::Rect fullscreen(800, 600);
-  const int shelf_inset = 600 - ShelfConstants::shelf_size();
+  const int shelf_inset = 600 - ShelfConfig::Get()->shelf_size();
   const gfx::Rect normal_work_area(800, shelf_inset);
   display::Screen* screen = display::Screen::GetScreen();
   EXPECT_EQ(gfx::Rect(800, 600),
@@ -1600,7 +1600,7 @@
 
   // Verify that originally the label is in the center of the workspace.
   // Midpoint of height minus shelf.
-  int expected_y = (300 - ShelfConstants::shelf_size()) / 2;
+  int expected_y = (300 - ShelfConfig::Get()->shelf_size()) / 2;
   EXPECT_EQ(gfx::Point(200, expected_y),
             no_windows_widget->GetWindowBoundsInScreen().CenterPoint());
 
@@ -1611,8 +1611,8 @@
   display_manager()->SetDisplayRotation(
       display.id(), display::Display::ROTATE_90,
       display::Display::RotationSource::ACTIVE);
-  expected_y = (400 - ShelfConstants::shelf_size()) / 2;
-  EXPECT_EQ(gfx::Point(150, (400 - ShelfConstants::shelf_size()) / 2),
+  expected_y = (400 - ShelfConfig::Get()->shelf_size()) / 2;
+  EXPECT_EQ(gfx::Point(150, (400 - ShelfConfig::Get()->shelf_size()) / 2),
             no_windows_widget->GetWindowBoundsInScreen().CenterPoint());
 }
 
@@ -1638,7 +1638,7 @@
   // account.
   const int bounds_left = 200 + 4;
   int expected_x = bounds_left + (400 - (bounds_left)) / 2;
-  const int expected_y = (300 - ShelfConstants::shelf_size()) / 2;
+  const int expected_y = (300 - ShelfConfig::Get()->shelf_size()) / 2;
   EXPECT_EQ(gfx::Point(expected_x, expected_y),
             no_windows_widget->GetWindowBoundsInScreen().CenterPoint());
 
@@ -1676,7 +1676,7 @@
   ASSERT_TRUE(overview_session());
   RoundedLabelWidget* no_windows_widget =
       overview_session()->no_windows_widget_for_testing();
-  const int expected_y = (400 - ShelfConstants::shelf_size()) / 2;
+  const int expected_y = (400 - ShelfConfig::Get()->shelf_size()) / 2;
   EXPECT_EQ(gfx::Point(200, expected_y),
             no_windows_widget->GetWindowBoundsInScreen().CenterPoint());
 }
@@ -2730,7 +2730,7 @@
 
   // Test that with the bottom shelf, the grid should take up the entire display
   // minus the shelf area on the bottom regardless of auto hide behavior.
-  const int shelf_size = ShelfConstants::shelf_size();
+  const int shelf_size = ShelfConfig::Get()->shelf_size();
   ToggleOverview();
   EXPECT_EQ(gfx::Rect(0, 0, 600, 600 - shelf_size), GetGridBounds());
   ToggleOverview();
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index f3e99f77..ae91653 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -34,6 +34,7 @@
 #include "ash/wm/wm_event.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
+#include "base/numerics/ranges.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
 #include "base/system/sys_info.h"
@@ -97,10 +98,10 @@
 gfx::Point GetBoundedPosition(const gfx::Point& location_in_screen,
                               const gfx::Rect& bounds_in_screen) {
   return gfx::Point(
-      std::max(std::min(location_in_screen.x(), bounds_in_screen.right() - 1),
-               bounds_in_screen.x()),
-      std::max(std::min(location_in_screen.y(), bounds_in_screen.bottom() - 1),
-               bounds_in_screen.y()));
+      base::ClampToRange(location_in_screen.x(), bounds_in_screen.x(),
+                         bounds_in_screen.right() - 1),
+      base::ClampToRange(location_in_screen.y(), bounds_in_screen.y(),
+                         bounds_in_screen.bottom() - 1));
 }
 
 WindowStateType GetStateTypeFromSnapPosition(
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
index 8754b58..964eb8e2 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -10,6 +10,7 @@
 #include "ash/home_screen/home_screen_controller.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shelf_prefs.h"
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/public/cpp/window_properties.h"
@@ -19,7 +20,6 @@
 #include "ash/session/session_controller_impl.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/mru_window_tracker.h"
@@ -2022,7 +2022,7 @@
   const WMEvent left_snap_event(WM_EVENT_SNAP_LEFT);
   WindowState::Get(window.get())->OnWMEvent(&left_snap_event);
   const gfx::Rect left_snapped_bounds =
-      gfx::Rect(1200 / 2, 800 - ShelfConstants::shelf_size());
+      gfx::Rect(1200 / 2, 800 - ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(window->bounds().width(), left_snapped_bounds.width());
   // Change its bounds horizontally a bit and then enter tablet mode.
   window->SetBounds(gfx::Rect(400, left_snapped_bounds.height()));
diff --git a/ash/wm/window_animations_unittest.cc b/ash/wm/window_animations_unittest.cc
index 1a0c75c..5d086d8 100644
--- a/ash/wm/window_animations_unittest.cc
+++ b/ash/wm/window_animations_unittest.cc
@@ -5,9 +5,9 @@
 #include "ash/wm/window_animations.h"
 
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_animation_types.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/window_state.h"
@@ -379,7 +379,7 @@
   WindowState::Get(window.get())->Maximize();
   EXPECT_EQ(1.0f, window->layer()->GetTargetOpacity());
   EXPECT_TRUE(window->layer()->visible());
-  EXPECT_EQ(gfx::Rect(0, 0, 800, 600 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(0, 0, 800, 600 - ShelfConfig::Get()->shelf_size()),
             window->layer()->GetTargetBounds());
 
   // Ensure the window is not slided out.
@@ -387,7 +387,7 @@
   EXPECT_EQ(0.0f, window->layer()->GetTargetOpacity());
   EXPECT_FALSE(window->layer()->GetTargetVisibility());
   EXPECT_FALSE(window->layer()->visible());
-  EXPECT_EQ(gfx::Rect(0, 0, 800, 600 - ShelfConstants::shelf_size()),
+  EXPECT_EQ(gfx::Rect(0, 0, 800, 600 - ShelfConfig::Get()->shelf_size()),
             window->layer()->GetTargetBounds());
 }
 
diff --git a/ash/wm/window_positioner_unittest.cc b/ash/wm/window_positioner_unittest.cc
index 275089b5..fe35482 100644
--- a/ash/wm/window_positioner_unittest.cc
+++ b/ash/wm/window_positioner_unittest.cc
@@ -6,8 +6,8 @@
 
 #include <string>
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/scoped_root_window_for_new_windows.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/shell/toplevel_window.h"
 #include "ash/test/ash_test_base.h"
@@ -51,7 +51,7 @@
 // its restore bounds.
 TEST_F(WindowPositionerTest, SecondMaximizedWindowHasProperRestoreSize) {
   UpdateDisplay("1400x900");
-  const int bottom_inset = 900 - ShelfConstants::shelf_size();
+  const int bottom_inset = 900 - ShelfConfig::Get()->shelf_size();
   shell::ToplevelWindow::CreateParams params;
   params.can_resize = true;
   params.can_maximize = true;
diff --git a/ash/wm/window_positioning_utils.cc b/ash/wm/window_positioning_utils.cc
index bebafd1..ccee00d 100644
--- a/ash/wm/window_positioning_utils.cc
+++ b/ash/wm/window_positioning_utils.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_util.h"
 #include "ash/wm/wm_event.h"
+#include "base/numerics/ranges.h"
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
@@ -40,7 +41,7 @@
       window->delegate() ? window->delegate()->GetMinimumSize().width() : 0;
   int ideal_width =
       static_cast<int>(work_area_width * kSnappedWidthWorkspaceRatio);
-  return std::min(work_area_width, std::max(ideal_width, min_width));
+  return base::ClampToRange(ideal_width, min_width, work_area_width);
 }
 
 // Return true if the window or one of its ancestor returns true from
diff --git a/ash/wm/window_state_unittest.cc b/ash/wm/window_state_unittest.cc
index 78e96ae..70df439 100644
--- a/ash/wm/window_state_unittest.cc
+++ b/ash/wm/window_state_unittest.cc
@@ -8,8 +8,8 @@
 
 #include "ash/metrics/pip_uma.h"
 #include "ash/public/cpp/app_types.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/window_properties.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/window_state_util.h"
 #include "ash/wm/window_util.h"
@@ -518,8 +518,8 @@
 }
 
 TEST_F(WindowStateTest, DoNotResizeMaximizedWindowInFullscreen) {
-  const int shelf_inset_first = 600 - ShelfConstants::shelf_size();
-  const int shelf_inset_second = 700 - ShelfConstants::shelf_size();
+  const int shelf_inset_first = 600 - ShelfConfig::Get()->shelf_size();
+  const int shelf_inset_second = 700 - ShelfConfig::Get()->shelf_size();
   std::unique_ptr<aura::Window> maximized(CreateTestWindowInShellWithId(0));
   std::unique_ptr<aura::Window> fullscreen(CreateTestWindowInShellWithId(1));
   WindowState* maximized_state = WindowState::Get(maximized.get());
diff --git a/ash/wm/workspace/multi_window_resize_controller_unittest.cc b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
index efd20e2a..c2c8708 100644
--- a/ash/wm/workspace/multi_window_resize_controller_unittest.cc
+++ b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
@@ -6,8 +6,8 @@
 
 #include "ash/frame/non_client_frame_view_ash.h"
 #include "ash/public/cpp/ash_constants.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/test/shell_test_api.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
@@ -587,7 +587,7 @@
 // Tests dragging to resize two snapped windows.
 TEST_F(MultiWindowResizeControllerTest, TwoSnappedWindows) {
   UpdateDisplay("400x300");
-  const int bottom_inset = 300 - ShelfConstants::shelf_size();
+  const int bottom_inset = 300 - ShelfConfig::Get()->shelf_size();
   // Create two snapped windows, one left snapped, one right snapped.
   aura::test::TestWindowDelegate delegate1;
   std::unique_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index 0cbd436..576b96e 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -18,6 +18,7 @@
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/app_types.h"
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/public/cpp/window_properties.h"
@@ -26,7 +27,6 @@
 #include "ash/session/session_controller_impl.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shell.h"
 #include "ash/shell_observer.h"
@@ -267,7 +267,7 @@
   window_state->Maximize();
   EXPECT_EQ(root_windows[1], window->GetRootWindow());
   EXPECT_EQ(
-      gfx::Rect(300, 0, 400, 500 - ShelfConstants::shelf_size()).ToString(),
+      gfx::Rect(300, 0, 400, 500 - ShelfConfig::Get()->shelf_size()).ToString(),
       window->GetBoundsInScreen().ToString());
 
   window_state->Restore();
@@ -280,7 +280,7 @@
   window_state->Maximize();
   EXPECT_EQ(root_windows[1], window->GetRootWindow());
   EXPECT_EQ(
-      gfx::Rect(300, 0, 400, 500 - ShelfConstants::shelf_size()).ToString(),
+      gfx::Rect(300, 0, 400, 500 - ShelfConfig::Get()->shelf_size()).ToString(),
       window->GetBoundsInScreen().ToString());
 
   window_state->Restore();
@@ -299,7 +299,7 @@
   EXPECT_TRUE(w1->IsMaximized());
   EXPECT_EQ(root_windows[1], w1->GetNativeWindow()->GetRootWindow());
   EXPECT_EQ(
-      gfx::Rect(300, 0, 400, 500 - ShelfConstants::shelf_size()).ToString(),
+      gfx::Rect(300, 0, 400, 500 - ShelfConfig::Get()->shelf_size()).ToString(),
       w1->GetWindowBoundsInScreen().ToString());
   w1->Restore();
   EXPECT_EQ(root_windows[1], w1->GetNativeWindow()->GetRootWindow());
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc
index c8203a33b..bc35519 100644
--- a/ash/wm/workspace/workspace_window_resizer_unittest.cc
+++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -7,7 +7,6 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/window_factory.h"
diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
index e8bf8d43..5713c16 100644
--- a/base/android/content_uri_utils.cc
+++ b/base/android/content_uri_utils.cc
@@ -71,4 +71,16 @@
   return Java_ContentUriUtils_delete(env, j_uri);
 }
 
+FilePath GetContentUriFromFilePath(const FilePath& file_path) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  ScopedJavaLocalRef<jstring> j_file_path =
+      ConvertUTF8ToJavaString(env, file_path.value());
+  ScopedJavaLocalRef<jstring> j_content_uri =
+      Java_ContentUriUtils_getContentUriFromFilePath(env, j_file_path);
+  if (j_content_uri.is_null())
+    return FilePath();
+
+  return FilePath(base::android::ConvertJavaStringToUTF8(env, j_content_uri));
+}
+
 }  // namespace base
diff --git a/base/android/content_uri_utils.h b/base/android/content_uri_utils.h
index de8b0b0..991e3c4 100644
--- a/base/android/content_uri_utils.h
+++ b/base/android/content_uri_utils.h
@@ -31,6 +31,10 @@
 // Deletes a content URI.
 BASE_EXPORT bool DeleteContentUri(const FilePath& content_uri);
 
+// Gets content URI's file path (eg: "content://org.chromium...") from normal
+// file path (eg: "/data/user/0/...").
+BASE_EXPORT FilePath GetContentUriFromFilePath(const FilePath& file_path);
+
 }  // namespace base
 
 #endif  // BASE_ANDROID_CONTENT_URI_UTILS_H_
diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base/android/java/src/org/chromium/base/ContentUriUtils.java
index 2a6a89b7..8594e60d 100644
--- a/base/android/java/src/org/chromium/base/ContentUriUtils.java
+++ b/base/android/java/src/org/chromium/base/ContentUriUtils.java
@@ -15,7 +15,6 @@
 import android.provider.MediaStore;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
-import android.util.Log;
 import android.webkit.MimeTypeMap;
 
 import org.chromium.base.annotations.CalledByNative;
@@ -62,6 +61,8 @@
      *
      * @param file image capture file.
      * @return URI for |file|.
+     * @throws IllegalArgumentException when the given File is outside the paths supported by the
+     *         provider.
      */
     public static Uri getContentUriFromFile(File file) {
         synchronized (sLock) {
@@ -306,4 +307,24 @@
         ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver();
         return resolver.delete(parsedUri, null, null) > 0;
     }
+
+    /**
+     * Retrieve the content URI from the file path.
+     *
+     * @param filePathString the file path.
+     * @return content URI or null if the input params are invalid.
+     */
+    @CalledByNative
+    public static String getContentUriFromFilePath(String filePathString) {
+        try {
+            Uri contentUri = getContentUriFromFile(new File(filePathString));
+            if (contentUri != null) {
+                return contentUri.toString();
+            }
+        } catch (IllegalArgumentException e) {
+            // This happens when the given File is outside the paths supported by the provider.
+            Log.e(TAG, "Cannot retrieve content uri from file: " + filePathString, e);
+        }
+        return null;
+    }
 }
diff --git a/base/containers/intrusive_heap.h b/base/containers/intrusive_heap.h
index 53d39095..d7626bb 100644
--- a/base/containers/intrusive_heap.h
+++ b/base/containers/intrusive_heap.h
@@ -131,6 +131,7 @@
 
 #include <algorithm>
 #include <functional>
+#include <limits>
 #include <type_traits>
 #include <utility>
 #include <vector>
@@ -149,7 +150,7 @@
 // in place.
 class BASE_EXPORT HeapHandle {
  public:
-  enum : size_t { kInvalidIndex = -1 };
+  enum : size_t { kInvalidIndex = std::numeric_limits<size_t>::max() };
 
   constexpr HeapHandle() = default;
   constexpr HeapHandle(const HeapHandle& other) = default;
diff --git a/base/json/json_reader_fuzzer.cc b/base/json/json_reader_fuzzer.cc
index 7bff954..6be408c7 100644
--- a/base/json/json_reader_fuzzer.cc
+++ b/base/json/json_reader_fuzzer.cc
@@ -3,8 +3,11 @@
 // found in the LICENSE file.
 
 #include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
 #include "base/values.h"
 
+namespace base {
+
 // Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   if (size < 2)
@@ -15,11 +18,26 @@
   std::unique_ptr<char[]> input(new char[size - 1]);
   memcpy(input.get(), data, size - 1);
 
-  base::StringPiece input_string(input.get(), size - 1);
+  StringPiece input_string(input.get(), size - 1);
 
   const int options = data[size - 1];
 
-  base::JSONReader::ReadAndReturnValueWithError(input_string, options);
+  JSONReader::ValueWithError json_val =
+      JSONReader::ReadAndReturnValueWithError(input_string, options);
+
+  if (json_val.value) {
+    // Check that the value can be serialized and deserialized back to an
+    // equivalent |Value|.
+    const Value& value = json_val.value.value();
+    std::string serialized;
+    CHECK(JSONWriter::Write(value, &serialized));
+
+    Optional<Value> deserialized = JSONReader::Read(StringPiece(serialized));
+    CHECK(deserialized);
+    CHECK(value.Equals(&deserialized.value()));
+  }
 
   return 0;
 }
+
+}  // namespace base
diff --git a/base/profiler/register_context.h b/base/profiler/register_context.h
index 9c6eaf1..556b34c 100644
--- a/base/profiler/register_context.h
+++ b/base/profiler/register_context.h
@@ -17,6 +17,8 @@
 #include <windows.h>
 #elif defined(OS_MACOSX)
 #include <mach/machine/thread_status.h>
+#elif defined(OS_ANDROID) && !defined(ARCH_CPU_64_BITS)
+#include <sys/ucontext.h>
 #endif
 
 namespace base {
@@ -83,6 +85,23 @@
   return AsUintPtr(&context->__rip);
 }
 
+#elif defined(OS_ANDROID) && defined(ARCH_CPU_ARM_FAMILY) && \
+    defined(ARCH_CPU_32_BITS)  // #if defined(OS_WIN)
+
+using RegisterContext = mcontext_t;
+
+inline uintptr_t& RegisterContextStackPointer(mcontext_t* context) {
+  return AsUintPtr(&context->arm_sp);
+}
+
+inline uintptr_t& RegisterContextFramePointer(mcontext_t* context) {
+  return AsUintPtr(&context->arm_fp);
+}
+
+inline uintptr_t& RegisterContextInstructionPointer(mcontext_t* context) {
+  return AsUintPtr(&context->arm_ip);
+}
+
 #else  // #if defined(OS_WIN)
 
 // Placeholders for other platforms.
diff --git a/base/profiler/stack_copier_signal.cc b/base/profiler/stack_copier_signal.cc
index e49d00a..ae858701 100644
--- a/base/profiler/stack_copier_signal.cc
+++ b/base/profiler/stack_copier_signal.cc
@@ -11,7 +11,9 @@
 
 namespace base {
 
-StackCopierSignal::StackCopierSignal() = default;
+StackCopierSignal::StackCopierSignal(
+    std::unique_ptr<ThreadDelegate> thread_delegate)
+    : thread_delegate_(std::move(thread_delegate)) {}
 
 StackCopierSignal::~StackCopierSignal() = default;
 
diff --git a/base/profiler/stack_copier_signal.h b/base/profiler/stack_copier_signal.h
index 5cc6478c..14f4896 100644
--- a/base/profiler/stack_copier_signal.h
+++ b/base/profiler/stack_copier_signal.h
@@ -5,16 +5,20 @@
 #ifndef BASE_PROFILER_STACK_COPIER_SIGNAL_H_
 #define BASE_PROFILER_STACK_COPIER_SIGNAL_H_
 
+#include <memory>
+
 #include "base/base_export.h"
 #include "base/profiler/stack_copier.h"
 
 namespace base {
 
+class ThreadDelegate;
+
 // Supports stack copying on platforms where a signal must be delivered to the
 // profiled thread and the stack is copied from the signal handler.
 class BASE_EXPORT StackCopierSignal : public StackCopier {
  public:
-  StackCopierSignal();
+  StackCopierSignal(std::unique_ptr<ThreadDelegate> thread_delegate);
   ~StackCopierSignal() override;
 
   // StackCopier:
@@ -22,6 +26,9 @@
                  uintptr_t* stack_top,
                  ProfileBuilder* profile_builder,
                  RegisterContext* thread_context) override;
+
+ private:
+  std::unique_ptr<ThreadDelegate> thread_delegate_;
 };
 
 }  // namespace base
diff --git a/base/profiler/stack_sampler_android.cc b/base/profiler/stack_sampler_android.cc
index e06216c..85b3626b 100644
--- a/base/profiler/stack_sampler_android.cc
+++ b/base/profiler/stack_sampler_android.cc
@@ -9,6 +9,7 @@
 #include "base/profiler/native_unwinder_android.h"
 #include "base/profiler/stack_copier_signal.h"
 #include "base/profiler/stack_sampler_impl.h"
+#include "base/profiler/thread_delegate_android.h"
 #include "base/threading/platform_thread.h"
 
 namespace base {
@@ -18,7 +19,8 @@
     ModuleCache* module_cache,
     StackSamplerTestDelegate* test_delegate) {
   return std::make_unique<StackSamplerImpl>(
-      std::make_unique<StackCopierSignal>(),
+      std::make_unique<StackCopierSignal>(
+          std::make_unique<ThreadDelegateAndroid>(thread_id)),
       std::make_unique<NativeUnwinderAndroid>(), module_cache, test_delegate);
 }
 
diff --git a/base/profiler/thread_delegate_android.cc b/base/profiler/thread_delegate_android.cc
index 669529a..4711cf6 100644
--- a/base/profiler/thread_delegate_android.cc
+++ b/base/profiler/thread_delegate_android.cc
@@ -2,8 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <pthread.h>
+
 #include "base/profiler/thread_delegate_android.h"
 
+#include "build/build_config.h"
+
 // IMPORTANT NOTE: Some functions within this implementation are invoked while
 // the target thread is suspended so it must not do any allocation from the
 // heap, including indirectly via use of DCHECK/CHECK or other logging
@@ -13,15 +17,50 @@
 
 namespace base {
 
+namespace {
+
+uintptr_t GetThreadStackBaseAddress(PlatformThreadId thread_id) {
+  pthread_attr_t attr;
+  pthread_getattr_np(thread_id, &attr);
+  void* base_address;
+  size_t size;
+  pthread_attr_getstack(&attr, &base_address, &size);
+  return reinterpret_cast<uintptr_t>(base_address);
+}
+
+}  // namespace
+
+ThreadDelegateAndroid::ThreadDelegateAndroid(PlatformThreadId thread_id)
+    : thread_stack_base_address_(GetThreadStackBaseAddress(thread_id)) {}
+
 uintptr_t ThreadDelegateAndroid::GetStackBaseAddress() const {
-  // It's okay for the stub to return zero here: GetStackBaseAddress() if
-  // ScopedSuspendThread fails, which it always will in the stub.
-  return 0;
+  return thread_stack_base_address_;
 }
 
 std::vector<uintptr_t*> ThreadDelegateAndroid::GetRegistersToRewrite(
     RegisterContext* thread_context) {
+#if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
+  return {
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r0),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r1),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r2),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r3),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r4),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r5),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r6),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r7),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r8),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r9),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_r10),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_fp),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_ip),
+      reinterpret_cast<uintptr_t*>(&thread_context->arm_sp),
+      // arm_lr and arm_pc do not require rewriting because they contain
+      // addresses of executable code, not addresses in the stack.
+  };
+#else  // #if defined(ARCH_CPU_ARM_FAMILY) && defined(ARCH_CPU_32_BITS)
   return {};
+#endif
 }
 
 }  // namespace base
diff --git a/base/profiler/thread_delegate_android.h b/base/profiler/thread_delegate_android.h
index 6a842c0..96e1e3c 100644
--- a/base/profiler/thread_delegate_android.h
+++ b/base/profiler/thread_delegate_android.h
@@ -7,6 +7,7 @@
 
 #include "base/base_export.h"
 #include "base/profiler/thread_delegate.h"
+#include "base/threading/platform_thread.h"
 
 namespace base {
 
@@ -16,7 +17,7 @@
 // TODO(https://crbug.com/988579): Implement this class.
 class BASE_EXPORT ThreadDelegateAndroid : public ThreadDelegate {
  public:
-  ThreadDelegateAndroid() = default;
+  ThreadDelegateAndroid(PlatformThreadId thread_id);
 
   ThreadDelegateAndroid(const ThreadDelegateAndroid&) = delete;
   ThreadDelegateAndroid& operator=(const ThreadDelegateAndroid&) = delete;
@@ -25,6 +26,9 @@
   uintptr_t GetStackBaseAddress() const override;
   std::vector<uintptr_t*> GetRegistersToRewrite(
       RegisterContext* thread_context) override;
+
+ private:
+  const uintptr_t thread_stack_base_address_;
 };
 
 }  // namespace base
diff --git a/base/task/thread_pool/initialization_util.cc b/base/task/thread_pool/initialization_util.cc
index d70c4c3d..6fd1973 100644
--- a/base/task/thread_pool/initialization_util.cc
+++ b/base/task/thread_pool/initialization_util.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 
+#include "base/numerics/ranges.h"
 #include "base/system/sys_info.h"
 
 namespace base {
@@ -16,7 +17,7 @@
                                                int offset) {
   const int num_of_cores = SysInfo::NumberOfProcessors();
   const int threads = std::ceil<int>(num_of_cores * cores_multiplier) + offset;
-  return std::min(max, std::max(min, threads));
+  return ClampToRange(threads, min, max);
 }
 
 }  // namespace base
diff --git a/base/task/thread_pool/priority_queue_unittest.cc b/base/task/thread_pool/priority_queue_unittest.cc
index d5af916..82320b9 100644
--- a/base/task/thread_pool/priority_queue_unittest.cc
+++ b/base/task/thread_pool/priority_queue_unittest.cc
@@ -55,7 +55,7 @@
   }
 
   test::TaskEnvironment task_environment{
-      test::ScopedTaskEnvironment::TimeSource::MOCK_TIME};
+      test::TaskEnvironment::TimeSource::MOCK_TIME};
 
   scoped_refptr<TaskSource> sequence_a = MakeSequenceWithTraitsAndTask(
       TaskTraits(ThreadPool(), TaskPriority::USER_VISIBLE));
diff --git a/base/test/task_environment.h b/base/test/task_environment.h
index a93e765..e7761cb 100644
--- a/base/test/task_environment.h
+++ b/base/test/task_environment.h
@@ -350,12 +350,6 @@
   DISALLOW_COPY_AND_ASSIGN(TaskEnvironment);
 };
 
-// TODO(gab): Mass migrate users and remove this.
-class ScopedTaskEnvironment : public TaskEnvironment {
- public:
-  using TaskEnvironment::TaskEnvironment;
-};
-
 // SingleThreadTaskEnvironment takes the same traits as TaskEnvironment and is
 // used the exact same way. It's a short-form for
 //   TaskEnvironment{TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY, ...};
diff --git a/base/time/time.h b/base/time/time.h
index 6abe4112..4f03f0b 100644
--- a/base/time/time.h
+++ b/base/time/time.h
@@ -276,9 +276,11 @@
   }
 
   constexpr int64_t operator/(TimeDelta a) const { return delta_ / a.delta_; }
+
   constexpr TimeDelta operator%(TimeDelta a) const {
     return TimeDelta(delta_ % a.delta_);
   }
+  TimeDelta& operator%=(TimeDelta other) { return *this = (*this % other); }
 
   // Comparison operators.
   constexpr bool operator==(TimeDelta other) const {
diff --git a/base/trace_event/trace_config.h b/base/trace_event/trace_config.h
index 9798c7f..d0e19512 100644
--- a/base/trace_event/trace_config.h
+++ b/base/trace_event/trace_config.h
@@ -255,6 +255,11 @@
   // Write the string representation of the CategoryFilter part.
   std::string ToCategoryFilterString() const;
 
+  // Write the string representation of the trace options part (record mode,
+  // systrace, argument filtering). Does not include category filters, event
+  // filters, or memory dump configs.
+  std::string ToTraceOptionsString() const;
+
   // Returns true if at least one category in the list is enabled by this
   // trace config. This is used to determine if the category filters are
   // enabled in the TRACE_* macros.
@@ -317,8 +322,6 @@
   void SetEventFiltersFromConfigList(const Value& event_filters);
   Value ToValue() const;
 
-  std::string ToTraceOptionsString() const;
-
   TraceRecordMode record_mode_;
   size_t trace_buffer_size_in_events_ = 0;  // 0 specifies default size
   size_t trace_buffer_size_in_kb_ = 0;      // 0 specifies default size
diff --git a/base/values.cc b/base/values.cc
index e3c84f45..abe496f 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -340,6 +340,51 @@
   return list_;
 }
 
+void Value::Append(bool value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(int value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(double value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(const char* value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(StringPiece value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(std::string&& value) {
+  CHECK(is_list());
+  list_.emplace_back(std::move(value));
+}
+
+void Value::Append(const char16* value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(StringPiece16 value) {
+  CHECK(is_list());
+  list_.emplace_back(value);
+}
+
+void Value::Append(Value&& value) {
+  CHECK(is_list());
+  list_.emplace_back(std::move(value));
+}
+
 Value* Value::FindKey(StringPiece key) {
   return const_cast<Value*>(static_cast<const Value*>(this)->FindKey(key));
 }
diff --git a/base/values.h b/base/values.h
index fd2a806a..0d1cfc3c 100644
--- a/base/values.h
+++ b/base/values.h
@@ -178,6 +178,18 @@
   ListStorage& GetList();
   span<const Value> GetList() const;
 
+  // Appends |value| to the end of the list.
+  // Note: These CHECK that type() is Type::LIST.
+  void Append(bool value);
+  void Append(int value);
+  void Append(double value);
+  void Append(const char* value);
+  void Append(StringPiece value);
+  void Append(std::string&& value);
+  void Append(const char16* value);
+  void Append(StringPiece16 value);
+  void Append(Value&& value);
+
   // |FindKey| looks up |key| in the underlying dictionary. If found, it returns
   // a pointer to the element. Otherwise it returns nullptr.
   // returned. Callers are expected to perform a check against null before using
@@ -803,24 +815,25 @@
   // DEPRECATED, use GetList()::erase() instead.
   iterator Erase(iterator iter, std::unique_ptr<Value>* out_value);
 
+  using Value::Append;
   // Appends a Value to the end of the list.
-  // DEPRECATED, use GetList()::push_back() instead.
+  // DEPRECATED, use Value::Append() instead.
   void Append(std::unique_ptr<Value> in_value);
 
   // Convenience forms of Append.
-  // DEPRECATED, use GetList()::emplace_back() instead.
+  // DEPRECATED, use Value::Append() instead.
   void AppendBoolean(bool in_value);
   void AppendInteger(int in_value);
   void AppendDouble(double in_value);
   void AppendString(StringPiece in_value);
   void AppendString(const string16& in_value);
-  // DEPRECATED, use GetList()::emplace_back() in a loop instead.
+  // DEPRECATED, use Value::Append() in a loop instead.
   void AppendStrings(const std::vector<std::string>& in_values);
   void AppendStrings(const std::vector<string16>& in_values);
 
   // Appends a Value if it's not already present. Returns true if successful,
   // or false if the value was already
-  // DEPRECATED, use std::find() with GetList()::push_back() instead.
+  // DEPRECATED, use std::find() with Value::Append() instead.
   bool AppendIfNotPresent(std::unique_ptr<Value> in_value);
 
   // Insert a Value at index.
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
index c8be7e5f..dce41457 100644
--- a/base/values_unittest.cc
+++ b/base/values_unittest.cc
@@ -458,6 +458,44 @@
   EXPECT_EQ(123, blank.GetList().back().GetInt());
 }
 
+TEST(ValuesTest, Append) {
+  ListValue value;
+  value.Append(true);
+  EXPECT_TRUE(value.GetList().back().is_bool());
+
+  value.Append(123);
+  EXPECT_TRUE(value.GetList().back().is_int());
+
+  value.Append(3.14);
+  EXPECT_TRUE(value.GetList().back().is_double());
+
+  std::string str = "foo";
+  value.Append(str.c_str());
+  EXPECT_TRUE(value.GetList().back().is_string());
+
+  value.Append(StringPiece(str));
+  EXPECT_TRUE(value.GetList().back().is_string());
+
+  value.Append(std::move(str));
+  EXPECT_TRUE(value.GetList().back().is_string());
+
+  string16 str16 = ASCIIToUTF16("bar");
+  value.Append(str16.c_str());
+  EXPECT_TRUE(value.GetList().back().is_string());
+
+  value.Append(base::StringPiece16(str16));
+  EXPECT_TRUE(value.GetList().back().is_string());
+
+  value.Append(Value());
+  EXPECT_TRUE(value.GetList().back().is_none());
+
+  value.Append(Value(Value::Type::DICTIONARY));
+  EXPECT_TRUE(value.GetList().back().is_dict());
+
+  value.Append(Value(Value::Type::LIST));
+  EXPECT_TRUE(value.GetList().back().is_list());
+}
+
 TEST(ValuesTest, FindKey) {
   Value::DictStorage storage;
   storage.emplace("foo", std::make_unique<Value>("bar"));
diff --git a/build/android/pylib/utils/simpleperf.py b/build/android/pylib/utils/simpleperf.py
index be259d6..b3ba00e 100644
--- a/build/android/pylib/utils/simpleperf.py
+++ b/build/android/pylib/utils/simpleperf.py
@@ -12,6 +12,7 @@
 from devil import devil_env
 from devil.android import device_signal
 from devil.android.sdk import version_codes
+from pylib import constants
 
 
 def _ProcessType(proc):
@@ -246,13 +247,13 @@
 
     # Run the script to annotate symbols and convert from simpleperf format to
     # pprof format.
-    llvm_symbolizer_path = devil_env.config.LocalPath('llvm-symbolizer')
     pprof_converter_script = os.path.join(
         script_dir, 'pprof_proto_generator.py')
-    pprof_converter_cmd = [sys.executable, pprof_converter_script,
-                           '-i', simpleperf_out_path,
-                           '-o', os.path.abspath(pprof_out_path),
-                           '--addr2line', llvm_symbolizer_path]
+    pprof_converter_cmd = [
+        sys.executable, pprof_converter_script, '-i', simpleperf_out_path, '-o',
+        os.path.abspath(pprof_out_path), '--ndk_path',
+        constants.ANDROID_NDK_ROOT
+    ]
     subprocess.check_output(pprof_converter_cmd, stderr=subprocess.STDOUT,
                             cwd=processing_dir)
   finally:
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py
index 2067f51..e4c8256e 100755
--- a/build/android/resource_sizes.py
+++ b/build/android/resource_sizes.py
@@ -80,7 +80,6 @@
         '.dynsym', '.dynstr', '.dynamic', '.shstrtab', '.got', '.plt',
         '.got.plt', '.hash', '.gnu.hash'
     ],
-    'bss': ['.bss', '.bss.rel.ro'],
     'other': [
         '.init_array', '.preinit_array', '.ctors', '.fini_array', '.comment',
         '.note.gnu.gold-version', '.note.crashpad.info', '.note.android.ident',
@@ -104,12 +103,17 @@
 def _ExtractLibSectionSizesFromApk(apk_path, lib_path, tool_prefix):
   with Unzip(apk_path, filename=lib_path) as extracted_lib_path:
     grouped_section_sizes = collections.defaultdict(int)
-    section_sizes = _CreateSectionNameSizeMap(extracted_lib_path, tool_prefix)
+    no_bits_section_sizes, section_sizes = _CreateSectionNameSizeMap(
+        extracted_lib_path, tool_prefix)
     for group_name, section_names in _READELF_SIZES_METRICS.iteritems():
       for section_name in section_names:
         if section_name in section_sizes:
           grouped_section_sizes[group_name] += section_sizes.pop(section_name)
 
+    # Consider all NOBITS sections as .bss.
+    grouped_section_sizes['bss'] = sum(
+        v for v in no_bits_section_sizes.itervalues())
+
     # Group any unknown section headers into the "other" group.
     for section_header, section_size in section_sizes.iteritems():
       sys.stderr.write('Unknown elf section header: %s\n' % section_header)
@@ -121,12 +125,14 @@
 def _CreateSectionNameSizeMap(so_path, tool_prefix):
   stdout = _RunReadelf(so_path, ['-S', '--wide'], tool_prefix)
   section_sizes = {}
+  no_bits_section_sizes = {}
   # Matches  [ 2] .hash HASH 00000000006681f0 0001f0 003154 04   A  3   0  8
   for match in re.finditer(r'\[[\s\d]+\] (\..*)$', stdout, re.MULTILINE):
     items = match.group(1).split()
-    section_sizes[items[0]] = int(items[4], 16)
+    target = no_bits_section_sizes if items[1] == 'NOBITS' else section_sizes
+    target[items[0]] = int(items[4], 16)
 
-  return section_sizes
+  return no_bits_section_sizes, section_sizes
 
 
 def _ParseManifestAttributes(apk_path):
@@ -439,7 +445,11 @@
   # As of now, padding_fraction ~= .007
   padding_fraction = -_PercentageDifference(
       native_code.ComputeUncompressedSize(), native_code_unaligned_size)
-  assert 0 <= padding_fraction < .02, 'Padding was: {}'.format(padding_fraction)
+  assert 0 <= padding_fraction < .02, (
+      'Padding was: {} (file_size={}, sections_sum={})'.format(
+          padding_fraction, native_code.ComputeUncompressedSize(),
+          native_code_unaligned_size))
+
   # Normalized dex size: size within the zip + size on disk for Android Go
   # devices (which ~= uncompressed dex size).
   normalized_apk_size += java_code.ComputeUncompressedSize()
diff --git a/buildtools/DEPS b/buildtools/DEPS
index 602bc00..3ffbe2c4 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -14,7 +14,7 @@
   #
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:152c5144ceed9592c20f0c8fd55769646077569b',
+  'gn_version': 'git_revision:ad9e442d92dcd9ee73a557428cfc336b55cbd533',
 
   # When changing these, also update the svn revisions in deps_revisions.gni
   'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917',
diff --git a/cc/animation/scroll_offset_animation_curve.cc b/cc/animation/scroll_offset_animation_curve.cc
index 0bc523f..6ec55b7 100644
--- a/cc/animation/scroll_offset_animation_curve.cc
+++ b/cc/animation/scroll_offset_animation_curve.cc
@@ -9,6 +9,7 @@
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/numerics/ranges.h"
 #include "cc/animation/timing_function.h"
 #include "cc/base/time_util.h"
 #include "ui/gfx/animation/tween.h"
@@ -46,7 +47,7 @@
 static std::unique_ptr<TimingFunction> EaseOutWithInitialVelocity(
     double velocity) {
   // Clamp velocity to a sane value.
-  velocity = std::min(std::max(velocity, -1000.0), 1000.0);
+  velocity = base::ClampToRange(velocity, -1000.0, 1000.0);
 
   // Based on CubicBezierTimingFunction::EaseType::EASE_IN_OUT preset
   // with first control point scaled.
@@ -92,15 +93,14 @@
         break;
       case DurationBehavior::DELTA_BASED:
         duration =
-            std::min(double(std::sqrt(std::abs(MaximumDimension(delta)))),
-                     kDeltaBasedMaxDuration);
+            std::min<double>(std::sqrt(std::abs(MaximumDimension(delta))),
+                             kDeltaBasedMaxDuration);
         break;
       case DurationBehavior::INVERSE_DELTA:
-        duration = std::min(
-            std::max(kInverseDeltaOffset +
-                         std::abs(MaximumDimension(delta)) * kInverseDeltaSlope,
-                     kInverseDeltaMinDuration),
-            kInverseDeltaMaxDuration);
+        duration = kInverseDeltaOffset +
+                   std::abs(MaximumDimension(delta)) * kInverseDeltaSlope;
+        duration = base::ClampToRange(duration, kInverseDeltaMinDuration,
+                                      kInverseDeltaMaxDuration);
         break;
       case DurationBehavior::CONSTANT_VELOCITY:
         duration =
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc
index a484a24..ce4c8e65 100644
--- a/cc/base/math_util.cc
+++ b/cc/base/math_util.cc
@@ -11,6 +11,7 @@
 #include <xmmintrin.h>
 #endif
 
+#include "base/numerics/ranges.h"
 #include "base/trace_event/traced_value.h"
 #include "base/values.h"
 #include "ui/gfx/geometry/angle_conversions.h"
@@ -613,7 +614,7 @@
                                             const gfx::Vector2dF& v2) {
   double dot_product = gfx::DotProduct(v1, v2) / v1.Length() / v2.Length();
   // Clamp to compensate for rounding errors.
-  dot_product = std::max(-1.0, std::min(1.0, dot_product));
+  dot_product = base::ClampToRange(dot_product, -1.0, 1.0);
   return static_cast<float>(gfx::RadToDeg(std::acos(dot_product)));
 }
 
diff --git a/cc/base/tiling_data.cc b/cc/base/tiling_data.cc
index 2df754f..b17338e5c5 100644
--- a/cc/base/tiling_data.cc
+++ b/cc/base/tiling_data.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 
+#include "base/numerics/ranges.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/vector2d.h"
@@ -79,7 +80,7 @@
   DCHECK_GT(max_texture_size_.width() - 2 * border_texels_, 0);
   int x = (src_position - border_texels_) /
       (max_texture_size_.width() - 2 * border_texels_);
-  return std::min(std::max(x, 0), num_tiles_x_ - 1);
+  return base::ClampToRange(x, 0, num_tiles_x_ - 1);
 }
 
 int TilingData::TileYIndexFromSrcCoord(int src_position) const {
@@ -89,7 +90,7 @@
   DCHECK_GT(max_texture_size_.height() - 2 * border_texels_, 0);
   int y = (src_position - border_texels_) /
       (max_texture_size_.height() - 2 * border_texels_);
-  return std::min(std::max(y, 0), num_tiles_y_ - 1);
+  return base::ClampToRange(y, 0, num_tiles_y_ - 1);
 }
 
 int TilingData::FirstBorderTileXIndexFromSrcCoord(int src_position) const {
@@ -99,7 +100,7 @@
   DCHECK_GT(max_texture_size_.width() - 2 * border_texels_, 0);
   int inner_tile_size = max_texture_size_.width() - 2 * border_texels_;
   int x = (src_position - 2 * border_texels_) / inner_tile_size;
-  return std::min(std::max(x, 0), num_tiles_x_ - 1);
+  return base::ClampToRange(x, 0, num_tiles_x_ - 1);
 }
 
 int TilingData::FirstBorderTileYIndexFromSrcCoord(int src_position) const {
@@ -109,7 +110,7 @@
   DCHECK_GT(max_texture_size_.height() - 2 * border_texels_, 0);
   int inner_tile_size = max_texture_size_.height() - 2 * border_texels_;
   int y = (src_position - 2 * border_texels_) / inner_tile_size;
-  return std::min(std::max(y, 0), num_tiles_y_ - 1);
+  return base::ClampToRange(y, 0, num_tiles_y_ - 1);
 }
 
 int TilingData::LastBorderTileXIndexFromSrcCoord(int src_position) const {
@@ -119,7 +120,7 @@
   DCHECK_GT(max_texture_size_.width() - 2 * border_texels_, 0);
   int inner_tile_size = max_texture_size_.width() - 2 * border_texels_;
   int x = src_position / inner_tile_size;
-  return std::min(std::max(x, 0), num_tiles_x_ - 1);
+  return base::ClampToRange(x, 0, num_tiles_x_ - 1);
 }
 
 int TilingData::LastBorderTileYIndexFromSrcCoord(int src_position) const {
@@ -129,7 +130,7 @@
   DCHECK_GT(max_texture_size_.height() - 2 * border_texels_, 0);
   int inner_tile_size = max_texture_size_.height() - 2 * border_texels_;
   int y = src_position / inner_tile_size;
-  return std::min(std::max(y, 0), num_tiles_y_ - 1);
+  return base::ClampToRange(y, 0, num_tiles_y_ - 1);
 }
 
 IndexRect TilingData::TileAroundIndexRect(const gfx::Rect& center_rect) const {
diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc
index bed51a0..60d7ecb 100644
--- a/cc/input/scrollbar_animation_controller.cc
+++ b/cc/input/scrollbar_animation_controller.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/bind.h"
+#include "base/numerics/ranges.h"
 #include "base/time/time.h"
 #include "cc/trees/layer_tree_impl.h"
 
@@ -162,7 +163,7 @@
     base::TimeTicks now) {
   base::TimeDelta delta = now - last_awaken_time_;
   float progress = delta.InSecondsF() / fade_duration_.InSecondsF();
-  return std::max(std::min(progress, 1.f), 0.f);
+  return base::ClampToRange(progress, 0.0f, 1.0f);
 }
 
 void ScrollbarAnimationController::RunAnimationFrame(float progress) {
diff --git a/cc/input/scrollbar_animation_controller_unittest.cc b/cc/input/scrollbar_animation_controller_unittest.cc
index 0836aeb..1f75a66 100644
--- a/cc/input/scrollbar_animation_controller_unittest.cc
+++ b/cc/input/scrollbar_animation_controller_unittest.cc
@@ -5,10 +5,8 @@
 #include "cc/input/scrollbar_animation_controller.h"
 
 #include "cc/layers/solid_color_scrollbar_layer_impl.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/geometry_test_utils.h"
-#include "cc/test/test_task_graph_runner.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -58,11 +56,11 @@
   LayerTreeHostImpl* host_impl_;
 };
 
-class ScrollbarAnimationControllerAuraOverlayTest : public testing::Test {
+class ScrollbarAnimationControllerAuraOverlayTest
+    : public LayerTestCommon::LayerImplTest,
+      public testing::Test {
  public:
-  ScrollbarAnimationControllerAuraOverlayTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_),
-        client_(&host_impl_) {}
+  ScrollbarAnimationControllerAuraOverlayTest() : client_(host_impl()) {}
 
   void ExpectScrollbarsOpacity(float opacity) {
     EXPECT_FLOAT_EQ(opacity, v_scrollbar_layer_->Opacity());
@@ -75,57 +73,50 @@
   const base::TimeDelta kThinningDuration = base::TimeDelta::FromSeconds(2);
 
   void SetUp() override {
-    std::unique_ptr<LayerImpl> scroll_layer =
-        LayerImpl::Create(host_impl_.active_tree(), 1);
-    std::unique_ptr<LayerImpl> clip =
-        LayerImpl::Create(host_impl_.active_tree(), 2);
-    clip_layer_ = clip.get();
-    scroll_layer->SetElementId(
-        LayerIdToElementIdForTesting(scroll_layer->id()));
-    LayerImpl* scroll_layer_ptr = scroll_layer.get();
-
     const int kTrackStart = 0;
     const int kTrackLength = 100;
     const bool kIsLeftSideVerticalScrollbar = false;
     const bool kIsOverlayScrollbar = true;
 
-    std::unique_ptr<SolidColorScrollbarLayerImpl> h_scrollbar =
-        SolidColorScrollbarLayerImpl::Create(
-            host_impl_.active_tree(), 3, HORIZONTAL, kThumbThickness,
-            kTrackStart, kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
-    h_scrollbar->test_properties()->opacity = 0.0f;
-    std::unique_ptr<SolidColorScrollbarLayerImpl> v_scrollbar =
-        SolidColorScrollbarLayerImpl::Create(
-            host_impl_.active_tree(), 4, VERTICAL, kThumbThickness, kTrackStart,
-            kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
-    v_scrollbar->test_properties()->opacity = 0.0f;
-    v_scrollbar_layer_ = v_scrollbar.get();
-    h_scrollbar_layer_ = h_scrollbar.get();
+    scroll_layer_ = AddLayer<LayerImpl>();
+    h_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
+        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
+        kIsOverlayScrollbar);
+    v_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
+        VERTICAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
+        kIsOverlayScrollbar);
+    SetElementIdsForTesting();
 
-    scroll_layer->test_properties()->AddChild(std::move(v_scrollbar));
-    scroll_layer->test_properties()->AddChild(std::move(h_scrollbar));
-    clip_layer_->test_properties()->AddChild(std::move(scroll_layer));
-    host_impl_.active_tree()->SetRootLayerForTesting(std::move(clip));
+    clip_layer_ = root_layer();
+    clip_layer_->SetBounds(gfx::Size(100, 100));
+
+    scroll_layer_->SetScrollable(gfx::Size(100, 100));
+    scroll_layer_->SetBounds(gfx::Size(200, 200));
+    CopyProperties(clip_layer_, scroll_layer_);
+    CreateTransformNode(scroll_layer_);
+    CreateScrollNode(scroll_layer_);
 
     v_scrollbar_layer_->SetBounds(gfx::Size(kThumbThickness, kTrackLength));
-    v_scrollbar_layer_->test_properties()->position = gfx::PointF(90, 0);
-    v_scrollbar_layer_->SetScrollElementId(scroll_layer_ptr->element_id());
-    v_scrollbar_layer_->test_properties()->opacity_can_animate = true;
+    v_scrollbar_layer_->SetScrollElementId(scroll_layer_->element_id());
+    CopyProperties(scroll_layer_, v_scrollbar_layer_);
+    v_scrollbar_layer_->SetOffsetToTransformParent(gfx::Vector2dF(90, 0));
+    auto& v_scrollbar_effect = CreateEffectNode(v_scrollbar_layer_);
+    v_scrollbar_effect.opacity = 0.f;
+    v_scrollbar_effect.has_potential_opacity_animation = true;
 
     h_scrollbar_layer_->SetBounds(gfx::Size(kTrackLength, kThumbThickness));
-    h_scrollbar_layer_->test_properties()->position = gfx::PointF(0, 90);
-    h_scrollbar_layer_->SetScrollElementId(scroll_layer_ptr->element_id());
-    h_scrollbar_layer_->test_properties()->opacity_can_animate = true;
+    h_scrollbar_layer_->SetScrollElementId(scroll_layer_->element_id());
+    CopyProperties(scroll_layer_, h_scrollbar_layer_);
+    h_scrollbar_layer_->SetOffsetToTransformParent(gfx::Vector2dF(0, 90));
+    auto& h_scrollbar_effect = CreateEffectNode(h_scrollbar_layer_);
+    h_scrollbar_effect.opacity = 0.f;
+    h_scrollbar_effect.has_potential_opacity_animation = true;
 
-    clip_layer_->SetBounds(gfx::Size(100, 100));
-    scroll_layer_ptr->SetScrollable(gfx::Size(100, 100));
-    scroll_layer_ptr->SetBounds(gfx::Size(200, 200));
-    host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-    host_impl_.active_tree()->UpdateScrollbarGeometries();
+    UpdateDrawProperties(host_impl()->active_tree());
 
     scrollbar_controller_ = ScrollbarAnimationController::
         CreateScrollbarAnimationControllerAuraOverlay(
-            scroll_layer_ptr->element_id(), &client_, kFadeDelay, kFadeDuration,
+            scroll_layer_->element_id(), &client_, kFadeDelay, kFadeDuration,
             kThinningDuration, 0.0f);
     v_scrollbar_layer_->SetCurrentPos(0);
     h_scrollbar_layer_->SetCurrentPos(0);
@@ -153,11 +144,9 @@
     return p;
   }
 
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
   std::unique_ptr<ScrollbarAnimationController> scrollbar_controller_;
   LayerImpl* clip_layer_;
+  LayerImpl* scroll_layer_;
   SolidColorScrollbarLayerImpl* v_scrollbar_layer_;
   SolidColorScrollbarLayerImpl* h_scrollbar_layer_;
   NiceMock<MockScrollbarAnimationControllerClient> client_;
@@ -185,16 +174,17 @@
 
   // Make the Layer non-scrollable, scrollbar disappears.
   clip_layer_->SetBounds(gfx::Size(200, 200));
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  scroll_layer->SetScrollable(gfx::Size(200, 200));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(200, 200));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(200, 200);
+  UpdateDrawProperties(host_impl()->active_tree());
   scrollbar_controller_->DidScrollUpdate();
   ExpectScrollbarsOpacity(0);
 
   // Make the layer scrollable, scrollbar appears again.
   clip_layer_->SetBounds(gfx::Size(100, 100));
-  scroll_layer->SetScrollable(gfx::Size(100, 100));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(100, 100));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(100, 100);
+  UpdateDrawProperties(host_impl()->active_tree());
   scrollbar_controller_->DidScrollUpdate();
   ExpectScrollbarsOpacity(1);
 }
@@ -204,15 +194,14 @@
   base::TimeTicks time;
   time += base::TimeDelta::FromSeconds(1);
 
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  EXPECT_EQ(gfx::Size(200, 200), scroll_layer->bounds());
+  EXPECT_EQ(gfx::Size(200, 200), scroll_layer_->bounds());
 
   // Shrink along X axis, horizontal scrollbar should appear.
   clip_layer_->SetBounds(gfx::Size(100, 200));
   EXPECT_EQ(gfx::Size(100, 200), clip_layer_->bounds());
-  scroll_layer->SetScrollable(gfx::Size(100, 200));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(100, 200));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(100, 200);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -225,8 +214,9 @@
   // should disappear.
   clip_layer_->SetBounds(gfx::Size(200, 100));
   EXPECT_EQ(gfx::Size(200, 100), clip_layer_->bounds());
-  scroll_layer->SetScrollable(gfx::Size(200, 100));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(200, 100));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(200, 100);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1363,13 +1353,12 @@
 }
 
 class ScrollbarAnimationControllerAndroidTest
-    : public testing::Test,
+    : public LayerTestCommon::LayerImplTest,
+      public testing::Test,
       public ScrollbarAnimationControllerClient {
  public:
   ScrollbarAnimationControllerAndroidTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_),
-        did_request_redraw_(false),
-        did_request_animate_(false) {}
+      : did_request_redraw_(false), did_request_animate_(false) {}
 
   void PostDelayedScrollbarAnimationTask(base::OnceClosure start_fade,
                                          base::TimeDelta delay) override {
@@ -1383,7 +1372,7 @@
     did_request_animate_ = true;
   }
   ScrollbarSet ScrollbarsFor(ElementId scroll_element_id) const override {
-    return host_impl_.ScrollbarsFor(scroll_element_id);
+    return host_impl()->ScrollbarsFor(scroll_element_id);
   }
   void DidChangeScrollbarVisibility() override {}
 
@@ -1393,45 +1382,37 @@
     const bool kIsLeftSideVerticalScrollbar = false;
     const bool kIsOverlayScrollbar = true;  // Allow opacity animations.
 
-    std::unique_ptr<LayerImpl> scroll_layer =
-        LayerImpl::Create(host_impl_.active_tree(), 1);
-    std::unique_ptr<SolidColorScrollbarLayerImpl> scrollbar =
-        SolidColorScrollbarLayerImpl::Create(
-            host_impl_.active_tree(), 2, orientation(), kThumbThickness,
-            kTrackStart, kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
-    scrollbar->test_properties()->opacity = 0.0f;
-    scrollbar_layer_ = scrollbar.get();
-    scrollbar_layer_->test_properties()->opacity_can_animate = true;
-    std::unique_ptr<LayerImpl> root =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
+    LayerImpl* root = root_layer();
+    scroll_layer_ = AddLayer<LayerImpl>();
+    scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
+        orientation(), kThumbThickness, kTrackStart,
+        kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
+    SetElementIdsForTesting();
 
-    scroll_layer->SetScrollable(gfx::Size(100, 100));
-    scroll_layer->SetElementId(
-        LayerIdToElementIdForTesting(scroll_layer->id()));
-    LayerImpl* scroll_layer_ptr = scroll_layer.get();
-    scroll_layer->test_properties()->AddChild(std::move(scrollbar));
-    root->test_properties()->AddChild(std::move(scroll_layer));
-    host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
+    scroll_layer_->SetBounds(gfx::Size(200, 200));
+    scroll_layer_->SetScrollable(gfx::Size(100, 100));
+    CopyProperties(root, scroll_layer_);
+    CreateTransformNode(scroll_layer_);
+    CreateScrollNode(scroll_layer_);
 
-    scrollbar_layer_->SetScrollElementId(scroll_layer_ptr->element_id());
-    scroll_layer_ptr->SetBounds(gfx::Size(200, 200));
-    host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-    DCHECK(host_impl_.active_tree()->ScrollbarGeometriesNeedUpdate());
-    host_impl_.active_tree()->UpdateScrollbarGeometries();
+    scrollbar_layer_->SetScrollElementId(scroll_layer_->element_id());
+    CopyProperties(scroll_layer_, scrollbar_layer_);
+    auto& scrollbar_effect = CreateEffectNode(scrollbar_layer_);
+    scrollbar_effect.opacity = 0.f;
+    scrollbar_effect.has_potential_opacity_animation = true;
+
+    UpdateDrawProperties(host_impl()->active_tree());
 
     scrollbar_controller_ =
         ScrollbarAnimationController::CreateScrollbarAnimationControllerAndroid(
-            scroll_layer_ptr->element_id(), this,
-            base::TimeDelta::FromSeconds(2), base::TimeDelta::FromSeconds(3),
-            0.0f);
+            scroll_layer_->element_id(), this, base::TimeDelta::FromSeconds(2),
+            base::TimeDelta::FromSeconds(3), 0.0f);
   }
 
   virtual ScrollbarOrientation orientation() const { return HORIZONTAL; }
 
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
   std::unique_ptr<ScrollbarAnimationController> scrollbar_controller_;
+  LayerImpl* scroll_layer_;
   SolidColorScrollbarLayerImpl* scrollbar_layer_;
 
   base::OnceClosure start_fade_;
@@ -1490,15 +1471,14 @@
 }
 
 TEST_F(ScrollbarAnimationControllerAndroidTest, HideOnResize) {
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  EXPECT_EQ(gfx::Size(200, 200), scroll_layer->bounds());
+  EXPECT_EQ(gfx::Size(200, 200), scroll_layer_->bounds());
 
   EXPECT_EQ(HORIZONTAL, scrollbar_layer_->orientation());
 
   // Shrink along X axis, horizontal scrollbar should appear.
-  scroll_layer->SetScrollable(gfx::Size(100, 200));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(100, 200));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(100, 200);
+  UpdateDrawProperties(host_impl()->active_tree());
   scrollbar_controller_->DidScrollBegin();
 
   scrollbar_controller_->DidScrollUpdate();
@@ -1507,8 +1487,9 @@
 
   // Shrink along Y axis and expand along X, horizontal scrollbar
   // should disappear.
-  scroll_layer->SetScrollable(gfx::Size(200, 100));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(200, 100));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(200, 100);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1519,15 +1500,14 @@
 }
 
 TEST_F(VerticalScrollbarAnimationControllerAndroidTest, HideOnResize) {
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  EXPECT_EQ(gfx::Size(200, 200), scroll_layer->bounds());
+  EXPECT_EQ(gfx::Size(200, 200), scroll_layer_->bounds());
 
   EXPECT_EQ(VERTICAL, scrollbar_layer_->orientation());
 
   // Shrink along X axis, vertical scrollbar should remain invisible.
-  scroll_layer->SetScrollable(gfx::Size(100, 200));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(100, 200));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(100, 200);
+  UpdateDrawProperties(host_impl()->active_tree());
   scrollbar_controller_->DidScrollBegin();
 
   scrollbar_controller_->DidScrollUpdate();
@@ -1535,8 +1515,9 @@
   scrollbar_controller_->DidScrollEnd();
 
   // Shrink along Y axis and expand along X, vertical scrollbar should appear.
-  scroll_layer->SetScrollable(gfx::Size(200, 100));
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll_layer_->SetScrollable(gfx::Size(200, 100));
+  GetScrollNode(scroll_layer_)->container_bounds = gfx::Size(200, 100);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1549,10 +1530,8 @@
 TEST_F(ScrollbarAnimationControllerAndroidTest, HideOnUserNonScrollableHorz) {
   EXPECT_EQ(HORIZONTAL, scrollbar_layer_->orientation());
 
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  scroll_layer->test_properties()->user_scrollable_horizontal = false;
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  GetScrollNode(scroll_layer_)->user_scrollable_horizontal = false;
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1565,10 +1544,8 @@
 TEST_F(ScrollbarAnimationControllerAndroidTest, ShowOnUserNonScrollableVert) {
   EXPECT_EQ(HORIZONTAL, scrollbar_layer_->orientation());
 
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  scroll_layer->test_properties()->user_scrollable_vertical = false;
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  GetScrollNode(scroll_layer_)->user_scrollable_vertical = false;
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1582,10 +1559,8 @@
        HideOnUserNonScrollableVert) {
   EXPECT_EQ(VERTICAL, scrollbar_layer_->orientation());
 
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  scroll_layer->test_properties()->user_scrollable_vertical = false;
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  GetScrollNode(scroll_layer_)->user_scrollable_vertical = false;
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1599,10 +1574,8 @@
        ShowOnUserNonScrollableHorz) {
   EXPECT_EQ(VERTICAL, scrollbar_layer_->orientation());
 
-  LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
-  ASSERT_TRUE(scroll_layer);
-  scroll_layer->test_properties()->user_scrollable_horizontal = false;
-  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  GetScrollNode(scroll_layer_)->user_scrollable_horizontal = false;
+  UpdateDrawProperties(host_impl()->active_tree());
 
   scrollbar_controller_->DidScrollBegin();
 
diff --git a/cc/input/single_scrollbar_animation_controller_thinning.cc b/cc/input/single_scrollbar_animation_controller_thinning.cc
index 0515aaff..d01e1ac 100644
--- a/cc/input/single_scrollbar_animation_controller_thinning.cc
+++ b/cc/input/single_scrollbar_animation_controller_thinning.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/memory/ptr_util.h"
+#include "base/numerics/ranges.h"
 #include "base/time/time.h"
 #include "cc/input/scrollbar_animation_controller.h"
 #include "cc/layers/layer_impl.h"
@@ -95,7 +96,7 @@
     base::TimeTicks now) {
   base::TimeDelta delta = now - last_awaken_time_;
   float progress = delta.InSecondsF() / Duration().InSecondsF();
-  return std::max(std::min(progress, 1.f), 0.f);
+  return base::ClampToRange(progress, 0.0f, 1.0f);
 }
 
 const base::TimeDelta& SingleScrollbarAnimationControllerThinning::Duration() {
diff --git a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
index a08e6aa8..2744f64 100644
--- a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
+++ b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
@@ -5,10 +5,8 @@
 #include "cc/input/single_scrollbar_animation_controller_thinning.h"
 
 #include "cc/layers/solid_color_scrollbar_layer_impl.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/geometry_test_utils.h"
-#include "cc/test/test_task_graph_runner.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -51,62 +49,51 @@
   LayerTreeHostImpl* host_impl_;
 };
 
-class SingleScrollbarAnimationControllerThinningTest : public testing::Test {
+class SingleScrollbarAnimationControllerThinningTest
+    : public LayerTestCommon::LayerImplTest,
+      public testing::Test {
  public:
-  SingleScrollbarAnimationControllerThinningTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_),
-        client_(&host_impl_) {}
+  SingleScrollbarAnimationControllerThinningTest() : client_(host_impl()) {}
 
  protected:
   const base::TimeDelta kThinningDuration = base::TimeDelta::FromSeconds(2);
 
   void SetUp() override {
-    std::unique_ptr<LayerImpl> scroll_layer =
-        LayerImpl::Create(host_impl_.active_tree(), 1);
-    std::unique_ptr<LayerImpl> clip =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
+    root_layer()->SetBounds(gfx::Size(100, 100));
+    auto* scroll_layer = AddLayer<LayerImpl>();
+    scroll_layer->SetBounds(gfx::Size(200, 200));
+    scroll_layer->SetScrollable(gfx::Size(100, 100));
     scroll_layer->SetElementId(
         LayerIdToElementIdForTesting(scroll_layer->id()));
-    clip_layer_ = clip.get();
-    LayerImpl* scroll_layer_ptr = scroll_layer.get();
 
-    const int kId = 2;
     const int kThumbThickness = 10;
     const int kTrackStart = 0;
     const int kTrackLength = 100;
     const bool kIsLeftSideVerticalScrollbar = false;
     const bool kIsOverlayScrollbar = true;
 
-    std::unique_ptr<SolidColorScrollbarLayerImpl> scrollbar =
-        SolidColorScrollbarLayerImpl::Create(
-            host_impl_.active_tree(), kId, HORIZONTAL, kThumbThickness,
-            kTrackStart, kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
-    scrollbar_layer_ = scrollbar.get();
-
-    scroll_layer->test_properties()->AddChild(std::move(scrollbar));
-    clip_layer_->test_properties()->AddChild(std::move(scroll_layer));
-    host_impl_.active_tree()->SetRootLayerForTesting(std::move(clip));
+    scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
+        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
+        kIsOverlayScrollbar);
 
     scrollbar_layer_->SetBounds(gfx::Size(kThumbThickness, kTrackLength));
-    scrollbar_layer_->test_properties()->position = gfx::PointF(90, 0);
-    scrollbar_layer_->SetScrollElementId(scroll_layer_ptr->element_id());
-    scrollbar_layer_->test_properties()->opacity_can_animate = true;
-    clip_layer_->SetBounds(gfx::Size(100, 100));
-    scroll_layer_ptr->SetBounds(gfx::Size(200, 200));
-    host_impl_.active_tree()->UpdateScrollbarGeometries();
-    host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+    scrollbar_layer_->SetScrollElementId(scroll_layer->element_id());
+
+    CopyProperties(root_layer(), scroll_layer);
+    CreateTransformNode(scroll_layer);
+    CreateScrollNode(scroll_layer);
+    CopyProperties(scroll_layer, scrollbar_layer_);
+    scrollbar_layer_->SetOffsetToTransformParent(gfx::Vector2dF(90, 0));
+    CreateEffectNode(scrollbar_layer_).has_potential_opacity_animation = true;
+
+    UpdateDrawProperties(host_impl()->active_tree());
 
     scrollbar_controller_ = SingleScrollbarAnimationControllerThinning::Create(
-        scroll_layer_ptr->element_id(), HORIZONTAL, &client_,
-        kThinningDuration);
+        scroll_layer->element_id(), HORIZONTAL, &client_, kThinningDuration);
   }
 
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
   std::unique_ptr<SingleScrollbarAnimationControllerThinning>
       scrollbar_controller_;
-  LayerImpl* clip_layer_;
   SolidColorScrollbarLayerImpl* scrollbar_layer_;
   NiceMock<MockSingleScrollbarAnimationControllerClient> client_;
 };
diff --git a/cc/layers/effect_tree_layer_list_iterator_unittest.cc b/cc/layers/effect_tree_layer_list_iterator_unittest.cc
index ec167fc..e876252 100644
--- a/cc/layers/effect_tree_layer_list_iterator_unittest.cc
+++ b/cc/layers/effect_tree_layer_list_iterator_unittest.cc
@@ -44,19 +44,23 @@
   }                                                                       \
   EXPECT_EQ(itself, layer->count_);
 
-class EffectTreeLayerListIteratorTest : public testing::Test {
+class EffectTreeLayerListIteratorTest : public LayerTestCommon::LayerImplTest,
+                                        public testing::Test {
  public:
-  EffectTreeLayerListIteratorTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_), id_(1) {}
-
-  std::unique_ptr<TestLayerImpl> CreateLayer() {
-    return TestLayerImpl::Create(host_impl_.active_tree(), id_++);
+  void SetUp() override {
+    // This test suite needs the root layer to be TestLayerImpl.
+    LayerTreeImpl* active_tree = host_impl()->active_tree();
+    active_tree->DetachLayers();
+    active_tree->property_trees()->clear();
+    active_tree->SetRootLayerForTesting(TestLayerImpl::Create(active_tree, 1));
+    root_layer()->SetBounds(gfx::Size(1, 1));
+    SetupRootProperties(root_layer());
   }
 
   void IterateFrontToBack() {
     ResetCounts();
     int count = 0;
-    for (EffectTreeLayerListIterator it(host_impl_.active_tree());
+    for (EffectTreeLayerListIterator it(host_impl()->active_tree());
          it.state() != EffectTreeLayerListIterator::State::END; ++it, ++count) {
       switch (it.state()) {
         case EffectTreeLayerListIterator::State::LAYER:
@@ -77,23 +81,17 @@
   }
 
   void ResetCounts() {
-    for (LayerImpl* layer : *host_impl_.active_tree()) {
+    for (LayerImpl* layer : *host_impl()->active_tree()) {
       static_cast<TestLayerImpl*>(layer)->count_ = -1;
     }
 
     target_surface_count_ = std::vector<int>(
-        host_impl_.active_tree()->property_trees()->effect_tree.size(), -1);
+        host_impl()->active_tree()->property_trees()->effect_tree.size(), -1);
     contributing_surface_count_ = std::vector<int>(
-        host_impl_.active_tree()->property_trees()->effect_tree.size(), -1);
+        host_impl()->active_tree()->property_trees()->effect_tree.size(), -1);
   }
 
  protected:
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
-
-  int id_;
-
   // Tracks when each render surface is visited as a target surface or
   // contributing surface. Indexed by effect node id.
   std::vector<int> target_surface_count_;
@@ -101,155 +99,76 @@
 };
 
 TEST_F(EffectTreeLayerListIteratorTest, TreeWithNoDrawnLayers) {
-  std::unique_ptr<TestLayerImpl> root_layer = CreateLayer();
-  root_layer->SetDrawsContent(false);
+  auto* root = static_cast<TestLayerImpl*>(root_layer());
+  root->SetDrawsContent(false);
 
-  TestLayerImpl* root_ptr = root_layer.get();
-
-  host_impl_.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-
-  RenderSurfaceList render_surface_list;
-  LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root_ptr, gfx::Rect(root_ptr->bounds()), &render_surface_list);
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   IterateFrontToBack();
-  EXPECT_COUNT(root_ptr, 0, -1, -1);
+  EXPECT_COUNT(root, 0, -1, -1);
 }
 
 TEST_F(EffectTreeLayerListIteratorTest, SimpleTree) {
-  std::unique_ptr<TestLayerImpl> root_layer = CreateLayer();
-  std::unique_ptr<TestLayerImpl> first = CreateLayer();
-  std::unique_ptr<TestLayerImpl> second = CreateLayer();
-  std::unique_ptr<TestLayerImpl> third = CreateLayer();
-  std::unique_ptr<TestLayerImpl> fourth = CreateLayer();
+  auto* root = static_cast<TestLayerImpl*>(root_layer());
+  auto* first = AddLayer<TestLayerImpl>();
+  CopyProperties(root, first);
+  auto* second = AddLayer<TestLayerImpl>();
+  CopyProperties(root, second);
+  auto* third = AddLayer<TestLayerImpl>();
+  CopyProperties(root, third);
+  auto* fourth = AddLayer<TestLayerImpl>();
+  CopyProperties(root, fourth);
 
-  TestLayerImpl* root_ptr = root_layer.get();
-  TestLayerImpl* first_ptr = first.get();
-  TestLayerImpl* second_ptr = second.get();
-  TestLayerImpl* third_ptr = third.get();
-  TestLayerImpl* fourth_ptr = fourth.get();
-
-  root_layer->test_properties()->AddChild(std::move(first));
-  root_layer->test_properties()->AddChild(std::move(second));
-  root_layer->test_properties()->AddChild(std::move(third));
-  root_layer->test_properties()->AddChild(std::move(fourth));
-
-  host_impl_.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-
-  RenderSurfaceList render_surface_list;
-  LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root_ptr, gfx::Rect(root_ptr->bounds()), &render_surface_list);
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
+  UpdateDrawProperties(host_impl()->active_tree());
 
   IterateFrontToBack();
-  EXPECT_COUNT(root_ptr, 5, -1, 4);
-  EXPECT_COUNT(first_ptr, 5, -1, 3);
-  EXPECT_COUNT(second_ptr, 5, -1, 2);
-  EXPECT_COUNT(third_ptr, 5, -1, 1);
-  EXPECT_COUNT(fourth_ptr, 5, -1, 0);
-}
-
-TEST_F(EffectTreeLayerListIteratorTest, ComplexTree) {
-  std::unique_ptr<TestLayerImpl> root_layer = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root1 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root2 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root3 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root21 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root22 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root23 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root221 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root231 = CreateLayer();
-
-  TestLayerImpl* root_ptr = root_layer.get();
-  TestLayerImpl* root1_ptr = root1.get();
-  TestLayerImpl* root2_ptr = root2.get();
-  TestLayerImpl* root3_ptr = root3.get();
-  TestLayerImpl* root21_ptr = root21.get();
-  TestLayerImpl* root22_ptr = root22.get();
-  TestLayerImpl* root23_ptr = root23.get();
-  TestLayerImpl* root221_ptr = root221.get();
-  TestLayerImpl* root231_ptr = root231.get();
-
-  root22->test_properties()->AddChild(std::move(root221));
-  root23->test_properties()->AddChild(std::move(root231));
-  root2->test_properties()->AddChild(std::move(root21));
-  root2->test_properties()->AddChild(std::move(root22));
-  root2->test_properties()->AddChild(std::move(root23));
-  root_layer->test_properties()->AddChild(std::move(root1));
-  root_layer->test_properties()->AddChild(std::move(root2));
-  root_layer->test_properties()->AddChild(std::move(root3));
-
-  host_impl_.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-
-  RenderSurfaceList render_surface_list;
-  LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root_ptr, gfx::Rect(root_ptr->bounds()), &render_surface_list);
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
-
-  IterateFrontToBack();
-  EXPECT_COUNT(root_ptr, 9, -1, 8);
-  EXPECT_COUNT(root1_ptr, 9, -1, 7);
-  EXPECT_COUNT(root2_ptr, 9, -1, 6);
-  EXPECT_COUNT(root21_ptr, 9, -1, 5);
-  EXPECT_COUNT(root22_ptr, 9, -1, 4);
-  EXPECT_COUNT(root221_ptr, 9, -1, 3);
-  EXPECT_COUNT(root23_ptr, 9, -1, 2);
-  EXPECT_COUNT(root231_ptr, 9, -1, 1);
-  EXPECT_COUNT(root3_ptr, 9, -1, 0);
+  EXPECT_COUNT(root, 5, -1, 4);
+  EXPECT_COUNT(first, 5, -1, 3);
+  EXPECT_COUNT(second, 5, -1, 2);
+  EXPECT_COUNT(third, 5, -1, 1);
+  EXPECT_COUNT(fourth, 5, -1, 0);
 }
 
 TEST_F(EffectTreeLayerListIteratorTest, ComplexTreeMultiSurface) {
-  std::unique_ptr<TestLayerImpl> root_layer = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root1 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root2 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root3 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root21 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root22 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root23 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root221 = CreateLayer();
-  std::unique_ptr<TestLayerImpl> root231 = CreateLayer();
+  auto* root = static_cast<TestLayerImpl*>(root_layer());
+  auto* root1 = AddLayer<TestLayerImpl>();
+  CopyProperties(root, root1);
 
-  TestLayerImpl* root_ptr = root_layer.get();
-  TestLayerImpl* root1_ptr = root1.get();
-  TestLayerImpl* root2_ptr = root2.get();
-  TestLayerImpl* root3_ptr = root3.get();
-  TestLayerImpl* root21_ptr = root21.get();
-  TestLayerImpl* root22_ptr = root22.get();
-  TestLayerImpl* root23_ptr = root23.get();
-  TestLayerImpl* root221_ptr = root221.get();
-  TestLayerImpl* root231_ptr = root231.get();
-
-  root22->test_properties()->force_render_surface = true;
-  root23->test_properties()->force_render_surface = true;
-  root2->test_properties()->force_render_surface = true;
-  root22->test_properties()->AddChild(std::move(root221));
-  root23->test_properties()->AddChild(std::move(root231));
+  auto* root2 = AddLayer<TestLayerImpl>();
   root2->SetDrawsContent(false);
-  root2->test_properties()->AddChild(std::move(root21));
-  root2->test_properties()->AddChild(std::move(root22));
-  root2->test_properties()->AddChild(std::move(root23));
-  root_layer->test_properties()->AddChild(std::move(root1));
-  root_layer->test_properties()->AddChild(std::move(root2));
-  root_layer->test_properties()->AddChild(std::move(root3));
+  CopyProperties(root, root2);
+  CreateEffectNode(root2).render_surface_reason = RenderSurfaceReason::kTest;
 
-  host_impl_.active_tree()->SetRootLayerForTesting(std::move(root_layer));
+  auto* root21 = AddLayer<TestLayerImpl>();
+  CopyProperties(root2, root21);
 
-  RenderSurfaceList render_surface_list;
-  LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root_ptr, gfx::Rect(root_ptr->bounds()), &render_surface_list);
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
+  auto* root22 = AddLayer<TestLayerImpl>();
+  CopyProperties(root2, root22);
+  CreateEffectNode(root22).render_surface_reason = RenderSurfaceReason::kTest;
+  auto* root221 = AddLayer<TestLayerImpl>();
+  CopyProperties(root22, root221);
+
+  auto* root23 = AddLayer<TestLayerImpl>();
+  CopyProperties(root2, root23);
+  CreateEffectNode(root23).render_surface_reason = RenderSurfaceReason::kTest;
+  auto* root231 = AddLayer<TestLayerImpl>();
+  CopyProperties(root23, root231);
+
+  auto* root3 = AddLayer<TestLayerImpl>();
+  CopyProperties(root, root3);
+
+  UpdateDrawProperties(host_impl()->active_tree());
 
   IterateFrontToBack();
-  EXPECT_COUNT(root_ptr, 14, -1, 13);
-  EXPECT_COUNT(root1_ptr, 14, -1, 12);
-  EXPECT_COUNT(root2_ptr, 10, 11, -1);
-  EXPECT_COUNT(root21_ptr, 10, 11, 9);
-  EXPECT_COUNT(root22_ptr, 7, 8, 6);
-  EXPECT_COUNT(root221_ptr, 7, 8, 5);
-  EXPECT_COUNT(root23_ptr, 3, 4, 2);
-  EXPECT_COUNT(root231_ptr, 3, 4, 1);
-  EXPECT_COUNT(root3_ptr, 14, -1, 0);
+  EXPECT_COUNT(root, 14, -1, 13);
+  EXPECT_COUNT(root1, 14, -1, 12);
+  EXPECT_COUNT(root2, 10, 11, -1);
+  EXPECT_COUNT(root21, 10, 11, 9);
+  EXPECT_COUNT(root22, 7, 8, 6);
+  EXPECT_COUNT(root221, 7, 8, 5);
+  EXPECT_COUNT(root23, 3, 4, 2);
+  EXPECT_COUNT(root231, 3, 4, 1);
+  EXPECT_COUNT(root3, 14, -1, 0);
 }
 
 }  // namespace
diff --git a/cc/layers/heads_up_display_layer_impl_unittest.cc b/cc/layers/heads_up_display_layer_impl_unittest.cc
index f5dc43ee..bd85ddd 100644
--- a/cc/layers/heads_up_display_layer_impl_unittest.cc
+++ b/cc/layers/heads_up_display_layer_impl_unittest.cc
@@ -9,6 +9,7 @@
 #include "cc/test/fake_impl_task_runner_provider.h"
 #include "cc/test/fake_layer_tree_frame_sink.h"
 #include "cc/test/fake_layer_tree_host_impl.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/test/test_task_graph_runner.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -39,71 +40,55 @@
   EXPECT_EQ(0u, data.num_incomplete_tiles);
 }
 
-TEST(HeadsUpDisplayLayerImplTest, ResourcelessSoftwareDrawAfterResourceLoss) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.CreatePendingTree();
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  std::unique_ptr<HeadsUpDisplayLayerImpl> layer_ptr =
-      HeadsUpDisplayLayerImpl::Create(host_impl.pending_tree(), 1);
-  layer_ptr->SetBounds(gfx::Size(100, 100));
-  layer_ptr->set_visible_layer_rect(gfx::Rect(100, 100));
+class HeadsUpDisplayLayerImplTest : public LayerTestCommon::LayerImplTest,
+                                    public ::testing::Test {};
 
-  HeadsUpDisplayLayerImpl* layer = layer_ptr.get();
+TEST_F(HeadsUpDisplayLayerImplTest, ResourcelessSoftwareDrawAfterResourceLoss) {
+  host_impl()->CreatePendingTree();
+  auto* root = EnsureRootLayerInPendingTree();
+  auto* layer = AddLayerInPendingTree<HeadsUpDisplayLayerImpl>();
+  layer->SetBounds(gfx::Size(100, 100));
+  layer->set_visible_layer_rect(gfx::Rect(100, 100));
+  CopyProperties(root, layer);
 
-  host_impl.pending_tree()->SetRootLayerForTesting(std::move(layer_ptr));
-  host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Check regular hardware draw is ok.
-  CheckDrawLayer(layer, host_impl.layer_tree_frame_sink(),
-                 host_impl.resource_provider(),
-                 layer_tree_frame_sink->context_provider(), DRAW_MODE_HARDWARE);
+  CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
+                 layer_tree_frame_sink()->context_provider(),
+                 DRAW_MODE_HARDWARE);
 
   // Simulate a resource loss on transitioning to resourceless software mode.
   layer->ReleaseResources();
 
   // Should skip resourceless software draw and not crash in UpdateHudTexture.
-  CheckDrawLayer(layer, host_impl.layer_tree_frame_sink(),
-                 host_impl.resource_provider(),
-                 layer_tree_frame_sink->context_provider(),
+  CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
+                 layer_tree_frame_sink()->context_provider(),
                  DRAW_MODE_RESOURCELESS_SOFTWARE);
 }
 
-TEST(HeadsUpDisplayLayerImplTest, CPUAndGPURasterCanvas) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.CreatePendingTree();
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  std::unique_ptr<HeadsUpDisplayLayerImpl> layer_ptr =
-      HeadsUpDisplayLayerImpl::Create(host_impl.pending_tree(), 1);
-  layer_ptr->SetBounds(gfx::Size(100, 100));
-  layer_ptr->set_visible_layer_rect(gfx::Rect(100, 100));
+TEST_F(HeadsUpDisplayLayerImplTest, CPUAndGPURasterCanvas) {
+  host_impl()->CreatePendingTree();
+  auto* root = EnsureRootLayerInPendingTree();
+  auto* layer = AddLayerInPendingTree<HeadsUpDisplayLayerImpl>();
+  layer->SetBounds(gfx::Size(100, 100));
+  CopyProperties(root, layer);
 
-  HeadsUpDisplayLayerImpl* layer = layer_ptr.get();
-
-  host_impl.pending_tree()->SetRootLayerForTesting(std::move(layer_ptr));
-  host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Check Ganesh canvas drawing is ok.
-  CheckDrawLayer(layer, host_impl.layer_tree_frame_sink(),
-                 host_impl.resource_provider(),
-                 layer_tree_frame_sink->context_provider(), DRAW_MODE_HARDWARE);
+  CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
+                 layer_tree_frame_sink()->context_provider(),
+                 DRAW_MODE_HARDWARE);
 
-  host_impl.ReleaseLayerTreeFrameSink();
-  layer_tree_frame_sink = FakeLayerTreeFrameSink::CreateSoftware();
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
+  host_impl()->ReleaseLayerTreeFrameSink();
+  auto layer_tree_frame_sink = FakeLayerTreeFrameSink::CreateSoftware();
+  host_impl()->InitializeFrameSink(layer_tree_frame_sink.get());
 
   // Check SW canvas drawing is ok.
-  CheckDrawLayer(layer, host_impl.layer_tree_frame_sink(),
-                 host_impl.resource_provider(), nullptr, DRAW_MODE_SOFTWARE);
+  CheckDrawLayer(layer, layer_tree_frame_sink.get(), resource_provider(),
+                 nullptr, DRAW_MODE_SOFTWARE);
+  host_impl()->ReleaseLayerTreeFrameSink();
 }
 
 }  // namespace
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index fe128b9e..be115d5 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -1001,7 +1001,11 @@
 
   gfx::Vector2dF transform_scales =
       MathUtil::ComputeTransform2dScaleComponents(transform, default_scale);
-  return std::max(transform_scales.x(), transform_scales.y());
+
+  constexpr float kMaxScaleRatio = 5.f;
+  float lower_scale = std::min(transform_scales.x(), transform_scales.y());
+  float higher_scale = std::max(transform_scales.x(), transform_scales.y());
+  return std::min(kMaxScaleRatio * lower_scale, higher_scale);
 }
 
 PropertyTrees* LayerImpl::GetPropertyTrees() const {
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc
index 4dc4d5b..3dc9292 100644
--- a/cc/layers/layer_impl_unittest.cc
+++ b/cc/layers/layer_impl_unittest.cc
@@ -10,11 +10,8 @@
 #include "cc/paint/filter_operation.h"
 #include "cc/paint/filter_operations.h"
 #include "cc/test/animation_test_common.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_frame_sink.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/geometry_test_utils.h"
-#include "cc/test/test_task_graph_runner.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/single_thread_proxy.h"
 #include "cc/trees/tree_synchronizer.h"
@@ -55,19 +52,19 @@
   EXPECT_FALSE(child->LayerPropertyChanged());                            \
   EXPECT_FALSE(grand_child->LayerPropertyChanged());
 
-#define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)                \
-  root->layer_tree_impl()->ResetAllChangeTracking();                     \
-  host_impl.ForcePrepareToDraw();                                        \
-  EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \
-  code_to_test;                                                          \
-  EXPECT_TRUE(host_impl.active_tree()->needs_update_draw_properties());
+#define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)                   \
+  root->layer_tree_impl()->ResetAllChangeTracking();                        \
+  host_impl()->ForcePrepareToDraw();                                        \
+  EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties()); \
+  code_to_test;                                                             \
+  EXPECT_TRUE(host_impl()->active_tree()->needs_update_draw_properties());
 
-#define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)             \
-  root->layer_tree_impl()->ResetAllChangeTracking();                     \
-  host_impl.ForcePrepareToDraw();                                        \
-  EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \
-  code_to_test;                                                          \
-  EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties());
+#define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)                \
+  root->layer_tree_impl()->ResetAllChangeTracking();                        \
+  host_impl()->ForcePrepareToDraw();                                        \
+  EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties()); \
+  code_to_test;                                                             \
+  EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties());
 
 static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) {
   gfx::ScrollOffset delta = layer_impl->layer_tree_impl()
@@ -77,39 +74,33 @@
   return gfx::Vector2dF(delta.x(), delta.y());
 }
 
-TEST(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) {
+class LayerImplTest : public LayerTestCommon::LayerImplTest,
+                      public ::testing::Test {
+ public:
+  using LayerTestCommon::LayerImplTest::LayerImplTest;
+};
+
+TEST_F(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) {
   //
   // This test checks that LayerPropertyChanged() has the correct behavior.
   //
 
   // The constructor on this will fake that we are on the correct thread.
   // Create a simple LayerImpl tree:
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.SetVisible(true);
-  EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get()));
-  host_impl.CreatePendingTree();
-  std::unique_ptr<LayerImpl> root_ptr =
-      LayerImpl::Create(host_impl.pending_tree(), 2);
-  LayerImpl* root = root_ptr.get();
-  host_impl.pending_tree()->SetRootLayerForTesting(std::move(root_ptr));
-
-  root->test_properties()->force_render_surface = true;
+  host_impl()->CreatePendingTree();
+  LayerImpl* root = EnsureRootLayerInPendingTree();
   root->SetMasksToBounds(true);
+  CreateClipNode(root);
   root->layer_tree_impl()->ResetAllChangeTracking();
 
-  root->test_properties()->AddChild(
-      LayerImpl::Create(host_impl.pending_tree(), 7));
-  LayerImpl* child = root->test_properties()->children[0];
-  child->test_properties()->AddChild(
-      LayerImpl::Create(host_impl.pending_tree(), 8));
-  LayerImpl* grand_child = child->test_properties()->children[0];
-  host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+  LayerImpl* child = AddLayerInPendingTree<LayerImpl>();
+  CopyProperties(root, child);
+  LayerImpl* grand_child = AddLayerInPendingTree<LayerImpl>();
+  CopyProperties(child, grand_child);
 
-  // Adding children is an internal operation and should not mark layers as
+  UpdateDrawProperties(host_impl()->pending_tree());
+
+  // Creating children is an internal operation and should not mark layers as
   // changed.
   EXPECT_FALSE(root->LayerPropertyChanged());
   EXPECT_FALSE(child->LayerPropertyChanged());
@@ -131,20 +122,21 @@
   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
       root->SetUpdateRect(arbitrary_rect));
   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetBounds(arbitrary_size));
-  host_impl.pending_tree()->property_trees()->needs_rebuild = true;
-  host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Changing these properties affects the entire subtree of layers.
-  EXECUTE_AND_VERIFY_SUBTREE_CHANGED(host_impl.pending_tree()->SetFilterMutated(
-      root->element_id(), arbitrary_filters));
-  EXECUTE_AND_VERIFY_SUBTREE_CHANGED(host_impl.pending_tree()->SetFilterMutated(
-      root->element_id(), FilterOperations()));
   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
-      host_impl.pending_tree()->SetOpacityMutated(root->element_id(),
-                                                  arbitrary_number));
+      host_impl()->pending_tree()->SetFilterMutated(root->element_id(),
+                                                    arbitrary_filters));
   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
-      host_impl.pending_tree()->SetTransformMutated(root->element_id(),
-                                                    arbitrary_transform));
+      host_impl()->pending_tree()->SetFilterMutated(root->element_id(),
+                                                    FilterOperations()));
+  EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
+      host_impl()->pending_tree()->SetOpacityMutated(root->element_id(),
+                                                     arbitrary_number));
+  EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
+      host_impl()->pending_tree()->SetTransformMutated(root->element_id(),
+                                                       arbitrary_transform));
 
   // Changing these properties only affects the layer itself.
   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetDrawsContent(true));
@@ -163,105 +155,94 @@
   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetBounds(root->bounds()));
 }
 
-TEST(LayerImplTest, VerifyActiveLayerChangesAreTrackedProperly) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.SetVisible(true);
-  EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get()));
-  std::unique_ptr<LayerImpl> root_ptr =
-      LayerImpl::Create(host_impl.active_tree(), 2);
-  LayerImpl* root = root_ptr.get();
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(root_ptr));
+TEST_F(LayerImplTest, VerifyActiveLayerChangesAreTrackedProperly) {
+  LayerImpl* root = root_layer();
+  LayerImpl* scroll = AddLayer<LayerImpl>();
+  scroll->SetBounds(gfx::Size(500, 500));
+  scroll->SetScrollable(gfx::Size(100, 100));
+  scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
+  CopyProperties(root, scroll);
+  CreateTransformNode(scroll);
+  CreateScrollNode(scroll).scrolls_outer_viewport = true;
 
-  root->test_properties()->AddChild(
-      LayerImpl::Create(host_impl.active_tree(), 7));
-  LayerImpl* child = root->test_properties()->children[0];
-  root->SetScrollable(gfx::Size(100, 100));
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  LayerImpl* child = AddLayer<LayerImpl>();
+  CopyProperties(scroll, child);
 
-  // Make root the outer viewport container layer. This ensures the later call
-  // to |SetViewportBoundsDelta| will be on a viewport layer.
+  UpdateDrawProperties(host_impl()->active_tree());
+
+  // Make |scroll| the outer viewport container layer. This ensures the later
+  // call to |SetViewportBoundsDelta| will be on a viewport layer.
   LayerTreeImpl::ViewportLayerIds viewport_ids;
-  viewport_ids.outer_viewport_container = root->id();
-  host_impl.active_tree()->SetViewportLayersFromIds(viewport_ids);
+  viewport_ids.outer_viewport_container = scroll->id();
+  host_impl()->active_tree()->SetViewportLayersFromIds(viewport_ids);
 
-  root->SetMasksToBounds(true);
-  host_impl.active_tree()->property_trees()->needs_rebuild = true;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll->SetMasksToBounds(true);
+  CreateClipNode(scroll);
+  child->SetClipTreeIndex(scroll->clip_tree_index());
+  UpdateDrawProperties(host_impl()->active_tree());
   root->layer_tree_impl()->ResetAllChangeTracking();
 
   // SetViewportBoundsDelta changes subtree only when masks_to_bounds is true.
-  root->SetViewportBoundsDelta(gfx::Vector2d(222, 333));
-  EXPECT_TRUE(root->LayerPropertyChanged());
-  EXPECT_TRUE(root->LayerPropertyChangedFromPropertyTrees());
-  EXPECT_FALSE(root->LayerPropertyChangedNotFromPropertyTrees());
-  EXPECT_TRUE(host_impl.active_tree()->property_trees()->full_tree_damaged);
+  scroll->SetViewportBoundsDelta(gfx::Vector2d(222, 333));
+  EXPECT_TRUE(scroll->LayerPropertyChanged());
+  EXPECT_TRUE(scroll->LayerPropertyChangedFromPropertyTrees());
+  EXPECT_FALSE(scroll->LayerPropertyChangedNotFromPropertyTrees());
+  EXPECT_TRUE(host_impl()->active_tree()->property_trees()->full_tree_damaged);
 
-  root->SetMasksToBounds(false);
-  host_impl.active_tree()->property_trees()->needs_rebuild = true;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  scroll->SetMasksToBounds(false);
+  scroll->SetClipTreeIndex(root->clip_tree_index());
+  child->SetClipTreeIndex(root->clip_tree_index());
+  UpdateDrawProperties(host_impl()->active_tree());
   root->layer_tree_impl()->ResetAllChangeTracking();
 
   // SetViewportBoundsDelta does not change the subtree without masks_to_bounds.
-  root->SetViewportBoundsDelta(gfx::Vector2d(333, 444));
-  EXPECT_TRUE(root->LayerPropertyChanged());
-  EXPECT_FALSE(root->LayerPropertyChangedFromPropertyTrees());
-  EXPECT_TRUE(root->LayerPropertyChangedNotFromPropertyTrees());
-  EXPECT_FALSE(host_impl.active_tree()->property_trees()->full_tree_damaged);
+  scroll->SetViewportBoundsDelta(gfx::Vector2d(333, 444));
+  EXPECT_TRUE(scroll->LayerPropertyChanged());
+  EXPECT_FALSE(scroll->LayerPropertyChangedFromPropertyTrees());
+  EXPECT_TRUE(scroll->LayerPropertyChangedNotFromPropertyTrees());
+  EXPECT_FALSE(host_impl()->active_tree()->property_trees()->full_tree_damaged);
 
-  host_impl.active_tree()->property_trees()->needs_rebuild = true;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl()->active_tree());
   root->layer_tree_impl()->ResetAllChangeTracking();
 
   // Ensure some node is affected by the outer viewport bounds delta. This
   // ensures the later call to |SetViewportBoundsDelta| will require a
   // transform tree update.
   TransformTree& transform_tree =
-      host_impl.active_tree()->property_trees()->transform_tree;
+      host_impl()->active_tree()->property_trees()->transform_tree;
   transform_tree.AddNodeAffectedByOuterViewportBoundsDelta(
       child->transform_tree_index());
   EXPECT_FALSE(transform_tree.needs_update());
-  root->SetViewportBoundsDelta(gfx::Vector2d(111, 222));
+  scroll->SetViewportBoundsDelta(gfx::Vector2d(111, 222));
   EXPECT_TRUE(transform_tree.needs_update());
 
-  host_impl.active_tree()->property_trees()->needs_rebuild = true;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl()->active_tree());
   root->layer_tree_impl()->ResetAllChangeTracking();
 
   // Ensure scrolling changes the transform tree but does not damage all trees.
-  root->ScrollBy(gfx::Vector2d(7, 9));
+  scroll->ScrollBy(gfx::Vector2d(7, 9));
   EXPECT_TRUE(transform_tree.needs_update());
-  EXPECT_TRUE(root->LayerPropertyChanged());
-  EXPECT_TRUE(root->LayerPropertyChangedFromPropertyTrees());
-  EXPECT_FALSE(root->LayerPropertyChangedNotFromPropertyTrees());
-  EXPECT_FALSE(host_impl.active_tree()->property_trees()->full_tree_damaged);
+  EXPECT_TRUE(scroll->LayerPropertyChanged());
+  EXPECT_TRUE(scroll->LayerPropertyChangedFromPropertyTrees());
+  EXPECT_FALSE(scroll->LayerPropertyChangedNotFromPropertyTrees());
+  EXPECT_FALSE(host_impl()->active_tree()->property_trees()->full_tree_damaged);
 }
 
-TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.SetVisible(true);
-  EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get()));
-  host_impl.active_tree()->SetRootLayerForTesting(
-      LayerImpl::Create(host_impl.active_tree(), 1));
-  LayerImpl* root = host_impl.active_tree()->root_layer_for_testing();
-  std::unique_ptr<LayerImpl> layer_ptr =
-      LayerImpl::Create(host_impl.active_tree(), 2);
-  LayerImpl* layer = layer_ptr.get();
-  root->test_properties()->AddChild(std::move(layer_ptr));
+TEST_F(LayerImplTest, VerifyNeedsUpdateDrawProperties) {
+  LayerImpl* root = root_layer();
+  LayerImpl* layer = AddLayer<LayerImpl>();
+  layer->SetBounds(gfx::Size(100, 100));
   layer->SetScrollable(gfx::Size(1, 1));
-  std::unique_ptr<LayerImpl> layer2_ptr =
-      LayerImpl::Create(host_impl.active_tree(), 3);
-  LayerImpl* layer2 = layer2_ptr.get();
-  root->test_properties()->AddChild(std::move(layer2_ptr));
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  DCHECK(host_impl.CanDraw());
+  LayerImpl* layer2 = AddLayer<LayerImpl>();
+  SetElementIdsForTesting();
+
+  CopyProperties(root, layer);
+  CreateTransformNode(layer);
+  CreateScrollNode(layer);
+  CopyProperties(root, layer2);
+
+  DCHECK(host_impl()->CanDraw());
+  UpdateDrawProperties(host_impl()->active_tree());
 
   float arbitrary_number = 0.352f;
   gfx::Size arbitrary_size = gfx::Size(111, 222);
@@ -280,26 +261,29 @@
 
   // Create a render surface, because we must have a render surface if we have
   // filters.
-  layer->test_properties()->force_render_surface = true;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
+  UpdateDrawProperties(host_impl()->active_tree());
 
   // Related filter functions.
-  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated(
-      root->element_id(), arbitrary_filters));
+  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
+      host_impl()->active_tree()->SetFilterMutated(root->element_id(),
+                                                   arbitrary_filters));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
-      host_impl.active_tree()->SetFilterMutated(root->element_id(),
-                                                arbitrary_filters));
-  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated(
-      root->element_id(), FilterOperations()));
-  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated(
-      root->element_id(), arbitrary_filters));
+      host_impl()->active_tree()->SetFilterMutated(root->element_id(),
+                                                   arbitrary_filters));
+  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
+      host_impl()->active_tree()->SetFilterMutated(root->element_id(),
+                                                   FilterOperations()));
+  VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
+      host_impl()->active_tree()->SetFilterMutated(root->element_id(),
+                                                   arbitrary_filters));
 
   // Related scrolling functions.
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size));
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->set_needs_update_draw_properties();
-  host_impl.active_tree()->UpdateDrawProperties();
+  host_impl()->active_tree()->set_needs_update_draw_properties();
+  UpdateDrawProperties(host_impl()->active_tree());
+
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(arbitrary_vector2d));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(gfx::Vector2d()));
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
@@ -314,30 +298,30 @@
       gfx::ScrollOffset(arbitrary_vector2d.x(), arbitrary_vector2d.y())));
 
   // Unrelated functions, always set to new values, always set needs update.
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->set_needs_update_draw_properties();
-  host_impl.active_tree()->UpdateDrawProperties();
+  host_impl()->active_tree()->set_needs_update_draw_properties();
+  UpdateDrawProperties(host_impl()->active_tree());
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true);
                                       layer->NoteLayerPropertyChanged());
+  CreateClipNode(layer);
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true);
                                       layer->NoteLayerPropertyChanged());
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
       layer->SetBackgroundColor(arbitrary_color));
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
-      host_impl.active_tree()->SetOpacityMutated(layer->element_id(),
-                                                 arbitrary_number));
+      host_impl()->active_tree()->SetOpacityMutated(layer->element_id(),
+                                                    arbitrary_number));
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
-      host_impl.active_tree()->SetTransformMutated(layer->element_id(),
-                                                   arbitrary_transform));
+      host_impl()->active_tree()->SetTransformMutated(layer->element_id(),
+                                                      arbitrary_transform));
   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size);
                                       layer->NoteLayerPropertyChanged());
 
   // Unrelated functions, set to the same values, no needs update.
-  layer->test_properties()->filters = arbitrary_filters;
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  GetEffectNode(layer)->filters = arbitrary_filters;
+  UpdateDrawProperties(host_impl()->active_tree());
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
-      host_impl.active_tree()->SetFilterMutated(layer->element_id(),
-                                                arbitrary_filters));
+      host_impl()->active_tree()->SetFilterMutated(layer->element_id(),
+                                                   arbitrary_filters));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true));
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetDrawsContent(true));
@@ -347,58 +331,10 @@
   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetElementId(ElementId(2)));
 }
 
-TEST(LayerImplTest, SafeOpaqueBackgroundColor) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  host_impl.SetVisible(true);
-  EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get()));
-  host_impl.active_tree()->SetRootLayerForTesting(
-      LayerImpl::Create(host_impl.active_tree(), 1));
-  LayerImpl* layer = host_impl.active_tree()->root_layer_for_testing();
-
-  for (int contents_opaque = 0; contents_opaque < 2; ++contents_opaque) {
-    for (int layer_opaque = 0; layer_opaque < 2; ++layer_opaque) {
-      for (int host_opaque = 0; host_opaque < 2; ++host_opaque) {
-        layer->SetContentsOpaque(!!contents_opaque);
-        layer->SetBackgroundColor(layer_opaque ? SK_ColorRED
-                                               : SK_ColorTRANSPARENT);
-        host_impl.active_tree()->set_background_color(
-            host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT);
-        host_impl.active_tree()->property_trees()->needs_rebuild = true;
-        host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-
-        SkColor safe_color = layer->SafeOpaqueBackgroundColor();
-        if (contents_opaque) {
-          EXPECT_EQ(SkColorGetA(safe_color), 255u)
-              << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
-              << host_opaque << "\n";
-        } else {
-          EXPECT_NE(SkColorGetA(safe_color), 255u)
-              << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
-              << host_opaque << "\n";
-        }
-      }
-    }
-  }
-}
-
-TEST(LayerImplTest, PerspectiveTransformHasReasonableScale) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  LayerTreeSettings settings;
-  FakeLayerTreeHostImpl host_impl(settings, &task_runner_provider,
-                                  &task_graph_runner);
-  auto owned_layer = LayerImpl::Create(host_impl.active_tree(), 1);
-  LayerImpl* layer = owned_layer.get();
+TEST_F(LayerImplTest, PerspectiveTransformHasReasonableScale) {
+  LayerImpl* layer = root_layer();
   layer->SetBounds(gfx::Size(10, 10));
   layer->set_contributes_to_drawn_render_surface(true);
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(owned_layer));
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
 
   // Ensure that we are close to the maximum scale for the matrix.
   {
@@ -443,50 +379,36 @@
   }
 }
 
-class LayerImplScrollTest : public testing::Test {
+class LayerImplScrollTest : public LayerImplTest {
  public:
-  LayerImplScrollTest() : LayerImplScrollTest(LayerTreeSettings()) {}
+  LayerImplScrollTest() : LayerImplScrollTest(LayerListSettings()) {}
 
   explicit LayerImplScrollTest(const LayerTreeSettings& settings)
-      : host_impl_(settings, &task_runner_provider_, &task_graph_runner_),
-        root_id_(7) {
-    host_impl_.active_tree()->SetRootLayerForTesting(
-        LayerImpl::Create(host_impl_.active_tree(), root_id_));
-    host_impl_.active_tree()
-        ->root_layer_for_testing()
-        ->test_properties()
-        ->AddChild(LayerImpl::Create(host_impl_.active_tree(), root_id_ + 1));
+      : LayerImplTest(settings) {
+    LayerImpl* root = root_layer();
+    root->SetBounds(gfx::Size(1, 1));
+
+    layer_ = AddLayer<LayerImpl>();
+    SetElementIdsForTesting();
     // Set the max scroll offset by noting that the root layer has bounds (1,1),
     // thus whatever bounds are set for the layer will be the max scroll
     // offset plus 1 in each direction.
-    host_impl_.active_tree()->root_layer_for_testing()->SetBounds(
-        gfx::Size(1, 1));
-    layer()->SetScrollable(gfx::Size(1, 1));
-    gfx::Vector2d max_scroll_offset(51, 81);
-    layer()->SetBounds(gfx::Size(max_scroll_offset.x(), max_scroll_offset.y()));
-    host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
+    layer_->SetScrollable(gfx::Size(1, 1));
+    layer_->SetBounds(gfx::Size(51, 81));
+    CopyProperties(root, layer_);
+    CreateTransformNode(layer_);
+    CreateScrollNode(layer_);
+    UpdateDrawProperties(host_impl()->active_tree());
   }
 
-  LayerImpl* layer() {
-    return host_impl_.active_tree()
-        ->root_layer_for_testing()
-        ->test_properties()
-        ->children[0];
-  }
+  LayerImpl* layer() { return layer_; }
 
   ScrollTree* scroll_tree(LayerImpl* layer_impl) {
     return &layer_impl->layer_tree_impl()->property_trees()->scroll_tree;
   }
 
-  LayerTreeHostImpl& host_impl() { return host_impl_; }
-
-  LayerTreeImpl* tree() { return host_impl_.active_tree(); }
-
  private:
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
-  int root_id_;
+  LayerImpl* layer_;
 };
 
 class CommitToPendingTreeLayerImplScrollTest : public LayerImplScrollTest {
@@ -494,9 +416,9 @@
   CommitToPendingTreeLayerImplScrollTest() : LayerImplScrollTest(settings()) {}
 
   LayerTreeSettings settings() {
-    LayerTreeSettings tree_settings;
-    tree_settings.commit_to_active_tree = false;
-    return tree_settings;
+    LayerListSettings settings;
+    settings.commit_to_active_tree = false;
+    return settings;
   }
 };
 
@@ -592,9 +514,8 @@
   gfx::ScrollOffset scroll_offset(10, 5);
   gfx::Vector2dF scroll_delta(20.5f, 8.5f);
 
-  layer()->test_properties()->user_scrollable_vertical = false;
-  layer()->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  layer()->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
+  GetScrollNode(layer())->user_scrollable_vertical = false;
+  UpdateDrawProperties(layer()->layer_tree_impl());
   scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->element_id(),
                                                          scroll_offset);
   gfx::Vector2dF unscrolled = layer()->ScrollBy(scroll_delta);
@@ -606,9 +527,9 @@
 // |LayerImpl::all_touch_action_regions_| is a cache of all regions on
 // |LayerImpl::touch_action_region_| and must be invalidated on changes.
 TEST_F(LayerImplScrollTest, TouchActionRegionCacheInvalidation) {
-  host_impl().CreatePendingTree();
+  host_impl()->CreatePendingTree();
   std::unique_ptr<LayerImpl> pending_layer =
-      LayerImpl::Create(host_impl().pending_tree(), 2);
+      LayerImpl::Create(host_impl()->pending_tree(), 2);
 
   TouchActionRegion region;
   region.Union(kTouchActionNone, gfx::Rect(0, 0, 50, 50));
@@ -633,7 +554,7 @@
   gfx::ScrollOffset scroll_offset(10, 5);
   gfx::Vector2dF scroll_delta(12, 18);
 
-  host_impl().CreatePendingTree();
+  host_impl()->CreatePendingTree();
 
   scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->element_id(),
                                                          scroll_offset);
@@ -645,7 +566,7 @@
   scroll_tree(layer())->CollectScrollDeltasForTesting();
 
   std::unique_ptr<LayerImpl> pending_layer =
-      LayerImpl::Create(host_impl().sync_tree(), layer()->id());
+      LayerImpl::Create(host_impl()->sync_tree(), layer()->id());
   pending_layer->SetElementId(
       LayerIdToElementIdForTesting(pending_layer->id()));
   scroll_tree(pending_layer.get())
diff --git a/cc/layers/nine_patch_layer_impl_unittest.cc b/cc/layers/nine_patch_layer_impl_unittest.cc
index bd85341..388a0449 100644
--- a/cc/layers/nine_patch_layer_impl_unittest.cc
+++ b/cc/layers/nine_patch_layer_impl_unittest.cc
@@ -56,7 +56,7 @@
       NinePatchLayerImpl::Create(host_impl.active_tree(), 1);
   layer->draw_properties().visible_layer_rect = visible_layer_rect;
   layer->SetBounds(layer_size);
-  layer->test_properties()->force_render_surface = true;
+  SetupRootProperties(layer.get());
 
   UIResourceId uid = 1;
   bool is_opaque = false;
@@ -67,7 +67,7 @@
   layer->SetImageBounds(bitmap_size);
   layer->SetLayout(aperture_rect, border, gfx::Rect(), fill_center, false);
   host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl.active_tree());
 
   AppendQuadsData data;
   host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
@@ -169,7 +169,7 @@
       NinePatchLayerImpl::Create(host_impl.active_tree(), 1);
   layer->draw_properties().visible_layer_rect = visible_layer_rect;
   layer->SetBounds(layer_size);
-  layer->test_properties()->force_render_surface = true;
+  SetupRootProperties(layer.get());
 
   UIResourceId uid = 1;
   bool is_opaque = false;
@@ -180,7 +180,7 @@
   layer->SetImageBounds(bitmap_size);
   layer->SetLayout(aperture_rect, border, occlusion, false, false);
   host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl.active_tree());
 
   AppendQuadsData data;
   host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
@@ -360,11 +360,12 @@
   impl.host_impl()->CreateUIResource(uid, bitmap);
 
   NinePatchLayerImpl* nine_patch_layer_impl =
-      impl.AddChildToRoot<NinePatchLayerImpl>();
+      impl.AddLayer<NinePatchLayerImpl>();
   nine_patch_layer_impl->SetBounds(layer_size);
   nine_patch_layer_impl->SetDrawsContent(true);
   nine_patch_layer_impl->SetUIResourceId(uid);
   nine_patch_layer_impl->SetImageBounds(gfx::Size(10, 10));
+  CopyProperties(impl.root_layer(), nine_patch_layer_impl);
 
   gfx::Rect aperture = gfx::Rect(3, 3, 4, 4);
   gfx::Rect border = gfx::Rect(300, 300, 400, 400);
@@ -431,10 +432,11 @@
 
   impl.host_impl()->CreateUIResource(uid_alpha, bitmap_alpha);
 
-  NinePatchLayerImpl *nine_patch_layer_impl =
-      impl.AddChildToRoot<NinePatchLayerImpl>();
+  NinePatchLayerImpl* nine_patch_layer_impl =
+      impl.AddLayer<NinePatchLayerImpl>();
   nine_patch_layer_impl->SetBounds(layer_size);
   nine_patch_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), nine_patch_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
diff --git a/cc/layers/painted_scrollbar_layer_impl_unittest.cc b/cc/layers/painted_scrollbar_layer_impl_unittest.cc
index d2d4c6af..2015633 100644
--- a/cc/layers/painted_scrollbar_layer_impl_unittest.cc
+++ b/cc/layers/painted_scrollbar_layer_impl_unittest.cc
@@ -41,7 +41,7 @@
   ScrollbarOrientation orientation = VERTICAL;
 
   PaintedScrollbarLayerImpl* scrollbar_layer_impl =
-      impl.AddChildToRoot<PaintedScrollbarLayerImpl>(orientation, false, false);
+      impl.AddLayer<PaintedScrollbarLayerImpl>(orientation, false, false);
   scrollbar_layer_impl->SetBounds(layer_size);
   scrollbar_layer_impl->SetContentsOpaque(true);
   scrollbar_layer_impl->set_internal_contents_scale_and_bounds(
@@ -56,6 +56,7 @@
   scrollbar_layer_impl->set_track_ui_resource_id(track_uid);
   scrollbar_layer_impl->set_thumb_ui_resource_id(thumb_uid);
   scrollbar_layer_impl->set_thumb_opacity(thumb_opacity);
+  CopyProperties(impl.root_layer(), scrollbar_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 20ee14e..4b8adaa 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -14,6 +14,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
+#include "base/numerics/ranges.h"
 #include "base/time/time.h"
 #include "base/trace_event/traced_value.h"
 #include "build/build_config.h"
@@ -1125,7 +1126,7 @@
     float min_scale = MinimumContentsScale();
     float max_scale = std::max(1.f, MinimumContentsScale());
     float clamped_ideal_source_scale_ =
-        std::max(min_scale, std::min(ideal_source_scale_, max_scale));
+        base::ClampToRange(ideal_source_scale_, min_scale, max_scale);
 
     while (raster_source_scale_ < clamped_ideal_source_scale_)
       raster_source_scale_ *= 2.f;
@@ -1133,7 +1134,7 @@
       raster_source_scale_ /= 2.f;
 
     raster_source_scale_ =
-        std::max(min_scale, std::min(raster_source_scale_, max_scale));
+        base::ClampToRange(raster_source_scale_, min_scale, max_scale);
 
     raster_page_scale_ = 1.f;
     raster_device_scale_ = 1.f;
@@ -1450,9 +1451,8 @@
     ideal_contents_scale_ =
         GetIdealContentsScale() * external_page_scale_factor;
   }
-  ideal_contents_scale_ =
-      std::min(kMaxIdealContentsScale,
-               std::max(ideal_contents_scale_, min_contents_scale));
+  ideal_contents_scale_ = base::ClampToRange(
+      ideal_contents_scale_, min_contents_scale, kMaxIdealContentsScale);
   ideal_source_scale_ =
       ideal_contents_scale_ / ideal_page_scale_ / ideal_device_scale_;
 }
diff --git a/cc/layers/picture_layer_impl_perftest.cc b/cc/layers/picture_layer_impl_perftest.cc
index 7db1e5a..7689ae69 100644
--- a/cc/layers/picture_layer_impl_perftest.cc
+++ b/cc/layers/picture_layer_impl_perftest.cc
@@ -6,12 +6,9 @@
 
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/lap_timer.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_frame_sink.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/fake_picture_layer_impl.h"
 #include "cc/test/fake_raster_source.h"
-#include "cc/test/test_task_graph_runner.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/tiles/tiling_set_raster_queue_all.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -37,31 +34,22 @@
       tiling_tiles.begin(), tiling_tiles.end(), std::back_inserter(*all_tiles));
 }
 
-class PictureLayerImplPerfTest : public testing::Test {
+class PictureLayerImplPerfTest : public LayerTestCommon::LayerImplTest,
+                                 public testing::Test {
  public:
   PictureLayerImplPerfTest()
-      : task_runner_provider_(base::ThreadTaskRunnerHandle::Get()),
-        layer_tree_frame_sink_(FakeLayerTreeFrameSink::Create3d()),
-        host_impl_(LayerTreeSettings(),
-                   &task_runner_provider_,
-                   &task_graph_runner_),
-        timer_(kWarmupRuns,
+      : timer_(kWarmupRuns,
                base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
                kTimeCheckInterval) {}
 
   PictureLayerImplPerfTest(const PictureLayerImplPerfTest&) = delete;
   PictureLayerImplPerfTest& operator=(const PictureLayerImplPerfTest&) = delete;
 
-  void SetUp() override {
-    host_impl_.SetVisible(true);
-    host_impl_.InitializeFrameSink(layer_tree_frame_sink_.get());
-  }
-
   void SetupPendingTree(const gfx::Size& layer_bounds) {
     scoped_refptr<FakeRasterSource> raster_source =
         FakeRasterSource::CreateFilled(layer_bounds);
-    host_impl_.CreatePendingTree();
-    LayerTreeImpl* pending_tree = host_impl_.pending_tree();
+    host_impl()->CreatePendingTree();
+    LayerTreeImpl* pending_tree = host_impl()->pending_tree();
     pending_tree->DetachLayers();
 
     std::unique_ptr<FakePictureLayerImpl> pending_layer =
@@ -69,18 +57,21 @@
                                                      raster_source);
     pending_layer->SetDrawsContent(true);
     pending_layer->test_properties()->force_render_surface = true;
+    pending_layer_ = pending_layer.get();
+    pending_tree->SetElementIdsForTesting();
+    SetupRootProperties(pending_layer_);
     pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-    pending_tree->BuildLayerListAndPropertyTreesForTesting();
 
-    pending_layer_ = static_cast<FakePictureLayerImpl*>(
-        host_impl_.pending_tree()->LayerById(7));
+    LayerTreeHostCommon::PrepareForUpdateDrawPropertiesForTesting(pending_tree);
+    // Don't update draw properties because the tilings will conflict with the
+    // tilings that will be added in the tests.
   }
 
   void RunRasterQueueConstructAndIterateTest(const std::string& test_name,
                                              int num_tiles,
                                              const gfx::Rect& viewport_rect) {
-    host_impl_.active_tree()->SetDeviceViewportRect(viewport_rect);
-    host_impl_.pending_tree()->UpdateDrawProperties();
+    host_impl()->active_tree()->SetDeviceViewportRect(viewport_rect);
+    host_impl()->pending_tree()->UpdateDrawProperties();
 
     timer_.Reset();
     do {
@@ -103,13 +94,14 @@
 
   void RunRasterQueueConstructTest(const std::string& test_name,
                                    const gfx::Rect& viewport) {
-    host_impl_.active_tree()->SetDeviceViewportRect(viewport);
-    host_impl_.pending_tree()
+    host_impl()->active_tree()->SetDeviceViewportRect(viewport);
+    host_impl()
+        ->pending_tree()
         ->property_trees()
         ->scroll_tree.UpdateScrollOffsetBaseForTesting(
             pending_layer_->element_id(),
             gfx::ScrollOffset(viewport.x(), viewport.y()));
-    host_impl_.pending_tree()->UpdateDrawProperties();
+    host_impl()->pending_tree()->UpdateDrawProperties();
 
     timer_.Reset();
     do {
@@ -126,8 +118,8 @@
   void RunEvictionQueueConstructAndIterateTest(const std::string& test_name,
                                                int num_tiles,
                                                const gfx::Rect& viewport_rect) {
-    host_impl_.active_tree()->SetDeviceViewportRect(viewport_rect);
-    host_impl_.pending_tree()->UpdateDrawProperties();
+    host_impl()->active_tree()->SetDeviceViewportRect(viewport_rect);
+    host_impl()->pending_tree()->UpdateDrawProperties();
 
     timer_.Reset();
     do {
@@ -150,13 +142,14 @@
 
   void RunEvictionQueueConstructTest(const std::string& test_name,
                                      const gfx::Rect& viewport) {
-    host_impl_.active_tree()->SetDeviceViewportRect(viewport);
-    host_impl_.pending_tree()
+    host_impl()->active_tree()->SetDeviceViewportRect(viewport);
+    host_impl()
+        ->pending_tree()
         ->property_trees()
         ->scroll_tree.UpdateScrollOffsetBaseForTesting(
             pending_layer_->element_id(),
             gfx::ScrollOffset(viewport.x(), viewport.y()));
-    host_impl_.pending_tree()->UpdateDrawProperties();
+    host_impl()->pending_tree()->UpdateDrawProperties();
 
     timer_.Reset();
     do {
@@ -181,10 +174,6 @@
     return reporter;
   }
 
-  TestTaskGraphRunner task_graph_runner_;
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink_;
-  FakeLayerTreeHostImpl host_impl_;
   FakePictureLayerImpl* pending_layer_;
   base::LapTimer timer_;
 };
@@ -192,7 +181,7 @@
 TEST_F(PictureLayerImplPerfTest, TilingSetRasterQueueConstructAndIterate) {
   SetupPendingTree(gfx::Size(10000, 10000));
 
-  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
+  float low_res_factor = host_impl()->settings().low_res_contents_scale_factor;
 
   pending_layer_->AddTiling(
       gfx::AxisTransform2d(low_res_factor, gfx::Vector2dF()));
@@ -210,7 +199,7 @@
 TEST_F(PictureLayerImplPerfTest, TilingSetRasterQueueConstruct) {
   SetupPendingTree(gfx::Size(10000, 10000));
 
-  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
+  float low_res_factor = host_impl()->settings().low_res_contents_scale_factor;
 
   pending_layer_->AddTiling(
       gfx::AxisTransform2d(low_res_factor, gfx::Vector2dF()));
@@ -227,7 +216,7 @@
 TEST_F(PictureLayerImplPerfTest, TilingSetEvictionQueueConstructAndIterate) {
   SetupPendingTree(gfx::Size(10000, 10000));
 
-  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
+  float low_res_factor = host_impl()->settings().low_res_contents_scale_factor;
 
   std::vector<Tile*> all_tiles;
   AddTiling(low_res_factor, pending_layer_, &all_tiles);
@@ -236,8 +225,9 @@
   AddTiling(1.0f, pending_layer_, &all_tiles);
   AddTiling(2.0f, pending_layer_, &all_tiles);
 
-  ASSERT_TRUE(host_impl_.tile_manager() != nullptr);
-  host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
+  ASSERT_TRUE(host_impl()->tile_manager() != nullptr);
+  host_impl()->tile_manager()->InitializeTilesWithResourcesForTesting(
+      all_tiles);
 
   RunEvictionQueueConstructAndIterateTest("32_100x100", 32,
                                           gfx::Rect(100, 100));
@@ -252,7 +242,7 @@
 TEST_F(PictureLayerImplPerfTest, TilingSetEvictionQueueConstruct) {
   SetupPendingTree(gfx::Size(10000, 10000));
 
-  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
+  float low_res_factor = host_impl()->settings().low_res_contents_scale_factor;
 
   std::vector<Tile*> all_tiles;
   AddTiling(low_res_factor, pending_layer_, &all_tiles);
@@ -261,8 +251,9 @@
   AddTiling(1.0f, pending_layer_, &all_tiles);
   AddTiling(2.0f, pending_layer_, &all_tiles);
 
-  ASSERT_TRUE(host_impl_.tile_manager() != nullptr);
-  host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
+  ASSERT_TRUE(host_impl()->tile_manager() != nullptr);
+  host_impl()->tile_manager()->InitializeTilesWithResourcesForTesting(
+      all_tiles);
 
   RunEvictionQueueConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
   RunEvictionQueueConstructTest("5000_0_100x100", gfx::Rect(5000, 0, 100, 100));
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 60eba27..17ce218 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -79,7 +79,7 @@
   }
 
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings;
+    auto settings = TestLayerTreeHostBase::CreateSettings();
     settings.commit_to_active_tree = false;
     settings.create_low_res_tiling = true;
     return settings;
@@ -318,7 +318,7 @@
 
   host_impl()->SetExternalTilePriorityConstraints(
       viewport_rect_for_tile_priority, transform_for_tile_priority);
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
 
   // Verify the viewport rect for tile priority is used in picture layer tiling.
   EXPECT_EQ(viewport_rect_for_tile_priority,
@@ -341,7 +341,7 @@
   transform_for_tile_priority.Rotate(45);
   host_impl()->SetExternalTilePriorityConstraints(
       viewport_rect_for_tile_priority, transform_for_tile_priority);
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
 
   EXPECT_EQ(viewport_rect_for_tile_priority,
             active_layer()->viewport_rect_for_tile_priority_in_content_space());
@@ -369,7 +369,7 @@
 
   host_impl()->SetExternalTilePriorityConstraints(
       viewport_rect_for_tile_priority, transform_for_tile_priority);
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
 
   EXPECT_EQ(viewport_rect_for_tile_priority,
             active_layer()->viewport_rect_for_tile_priority_in_content_space());
@@ -384,7 +384,7 @@
   // should remain to be the previously cached value.
   EXPECT_EQ(viewport_rect_for_tile_priority,
             active_layer()->viewport_rect_for_tile_priority_in_content_space());
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
 
   // Now the UpdateDrawProperties is called. The viewport rect for tile
   // priority should be the latest value.
@@ -735,8 +735,8 @@
   ResetTilingsAndRasterScales();
 
   SetContentsScaleOnBothLayers(2.f, 1.0f, 2.f, 1.0f, 0.f, false);
-  EXPECT_EQ(active_layer()->num_tilings(), 2u);
-  EXPECT_EQ(pending_layer()->num_tilings(), 1u);
+  ASSERT_EQ(active_layer()->num_tilings(), 2u);
+  ASSERT_EQ(pending_layer()->num_tilings(), 1u);
   EXPECT_EQ(active_layer()->tilings()->tiling_at(0)->contents_scale_key(), 2.f);
   EXPECT_EQ(active_layer()->tilings()->tiling_at(1)->contents_scale_key(),
             2.f * low_res_factor);
@@ -753,7 +753,7 @@
   // Zoom out by a small amount. We should create a tiling at half
   // the scale (2/kMaxScaleRatioDuringPinch).
   SetContentsScaleOnBothLayers(1.8f, 1.0f, 1.8f, 1.0f, 0.f, false);
-  EXPECT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       2.0f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   EXPECT_FLOAT_EQ(
@@ -772,14 +772,14 @@
   // use that tiling as high-res, and not create a new tiling.
   SetContentsScaleOnBothLayers(low_res_factor * 2.1f, 1.0f,
                                low_res_factor * 2.1f, 1.0f, 0.f, false);
-  EXPECT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
   EXPECT_FALSE(
       active_layer()->tilings()->FindTilingWithResolution(LOW_RESOLUTION));
 
   // Zoom in a lot now. Since we increase by increments of
   // kMaxScaleRatioDuringPinch, this will create a new tiling at 4.0.
   SetContentsScaleOnBothLayers(3.8f, 1.0f, 3.8f, 1.f, 0.f, false);
-  EXPECT_EQ(4u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(4u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       4.0f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   // Although one of the tilings matches the low resolution scale, it still
@@ -798,7 +798,7 @@
   // After pinch ends, set the scale to what the raster scale was updated to
   // (checked above).
   SetContentsScaleOnBothLayers(4.0f, 1.0f, 4.0f, 1.f, 0.f, false);
-  EXPECT_EQ(4u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(4u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       4.0f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   // Now that we stopped pinching, the low resolution tiling that existed should
@@ -818,7 +818,7 @@
 
   // Set up the high and low res tilings before pinch zoom.
   SetContentsScaleOnBothLayers(0.24f, 1.0f, 0.24f, 1.0f, 0.f, false);
-  EXPECT_EQ(2u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(2u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       0.24f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   EXPECT_FLOAT_EQ(
@@ -833,7 +833,7 @@
   // Zoom out by a small amount. We should create a tiling at half
   // the scale (1/kMaxScaleRatioDuringPinch).
   SetContentsScaleOnBothLayers(0.2f, 1.0f, 0.2f, 1.0f, 0.f, false);
-  EXPECT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       0.24f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
   EXPECT_FLOAT_EQ(
@@ -847,17 +847,17 @@
   // Zoom out further, close to our low-res scale factor. We should
   // use that tiling as high-res, and not create a new tiling.
   SetContentsScaleOnBothLayers(0.1f, 1.0f, 0.1f, 1.0f, 0.f, false);
-  EXPECT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
 
   // Zoom in. 0.25(desired_scale) should be snapped to 0.24 during zoom-in
   // because 0.25(desired_scale) is within the ratio(1.2).
   SetContentsScaleOnBothLayers(0.25f, 1.0f, 0.25f, 1.0f, 0.f, false);
-  EXPECT_EQ(3u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(3u, active_layer()->tilings()->num_tilings());
 
   // Zoom in a lot. Since we move in factors of two, we should get a scale that
   // is a power of 2 times 0.24.
   SetContentsScaleOnBothLayers(1.f, 1.0f, 1.f, 1.0f, 0.f, false);
-  EXPECT_EQ(4u, active_layer()->tilings()->num_tilings());
+  ASSERT_EQ(4u, active_layer()->tilings()->num_tilings());
   EXPECT_FLOAT_EQ(
       1.92f, active_layer()->tilings()->tiling_at(0)->contents_scale_key());
 }
@@ -1158,28 +1158,24 @@
   EXPECT_EQ(pending_layer()->num_tilings(), 1u);
 
   // Mask layers dont create low res since they always fit on one tile.
-  std::unique_ptr<FakePictureLayerImpl> mask =
-      FakePictureLayerImpl::CreateMaskWithRasterSource(
-          host_impl()->pending_tree(), 3, pending_raster_source);
+  CreateEffectNode(pending_layer());
+  auto* mask = AddMaskLayer<FakePictureLayerImplWithRasterSourceAsMask>(
+      host_impl()->pending_tree(), pending_layer(), pending_raster_source);
   mask->SetBounds(layer_bounds);
   mask->SetDrawsContent(true);
-  pending_layer()->test_properties()->SetMaskLayer(std::move(mask));
-  pending_layer()->test_properties()->force_render_surface = true;
-  RebuildPropertyTreesOnPendingTree();
-  host_impl()->pending_tree()->UpdateDrawProperties();
 
-  FakePictureLayerImpl* mask_raw = static_cast<FakePictureLayerImpl*>(
-      pending_layer()->test_properties()->mask_layer);
+  UpdateDrawProperties(host_impl()->pending_tree());
+
   // We did an UpdateDrawProperties above, which will set a contents scale on
   // the mask layer, so allow us to reset the contents scale.
-  mask_raw->ReleaseTileResources();
-  mask_raw->RecreateTileResources();
+  mask->ReleaseTileResources();
+  mask->RecreateTileResources();
 
   SetupDrawPropertiesAndUpdateTiles(
-      mask_raw, contents_scale, device_scale, page_scale,
-      maximum_animation_scale, starting_animation_scale, animating_transform);
-  EXPECT_EQ(mask_raw->HighResTiling()->contents_scale_key(), contents_scale);
-  EXPECT_EQ(mask_raw->num_tilings(), 1u);
+      mask, contents_scale, device_scale, page_scale, maximum_animation_scale,
+      starting_animation_scale, animating_transform);
+  EXPECT_EQ(mask->HighResTiling()->contents_scale_key(), contents_scale);
+  EXPECT_EQ(mask->num_tilings(), 1u);
 }
 
 TEST_F(PictureLayerImplTest, HugeMasksGetScaledDown) {
@@ -1191,17 +1187,14 @@
       FakeRasterSource::CreateFilled(layer_bounds);
   SetupPendingTree(valid_raster_source);
 
-  std::unique_ptr<FakePictureLayerImpl> mask_ptr =
-      FakePictureLayerImpl::CreateMaskWithRasterSource(
-          host_impl()->pending_tree(), 3, valid_raster_source);
-  mask_ptr->SetBounds(layer_bounds);
-  mask_ptr->SetDrawsContent(true);
-  pending_layer()->test_properties()->SetMaskLayer(std::move(mask_ptr));
-  pending_layer()->test_properties()->force_render_surface = true;
+  CreateEffectNode(pending_layer());
+  auto* mask = AddMaskLayer<FakePictureLayerImplWithRasterSourceAsMask>(
+      host_impl()->pending_tree(), pending_layer(), valid_raster_source);
+  mask->SetBounds(layer_bounds);
+  mask->SetDrawsContent(true);
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   FakePictureLayerImpl* pending_mask = static_cast<FakePictureLayerImpl*>(
       pending_layer()->test_properties()->mask_layer);
@@ -1250,7 +1243,7 @@
   pending_mask->SetRasterSourceOnPending(huge_raster_source, Region());
 
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // The mask tiling gets scaled down.
   EXPECT_LT(pending_mask->HighResTiling()->contents_scale_key(), 1.f);
@@ -1308,7 +1301,7 @@
   EXPECT_FALSE(pending_mask->CanHaveTilings());
 
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   EXPECT_EQ(0u, pending_mask->num_tilings());
 }
@@ -1324,17 +1317,14 @@
       FakeRasterSource::CreateFilled(layer_bounds);
   SetupPendingTree(valid_raster_source);
 
-  std::unique_ptr<FakePictureLayerImpl> mask_ptr =
-      FakePictureLayerImpl::CreateMaskWithRasterSource(
-          host_impl()->pending_tree(), 3, valid_raster_source);
-  mask_ptr->SetBounds(layer_bounds);
-  mask_ptr->SetDrawsContent(true);
-  pending_layer()->test_properties()->SetMaskLayer(std::move(mask_ptr));
-  pending_layer()->test_properties()->force_render_surface = true;
+  CreateEffectNode(pending_layer());
+  auto* mask = AddMaskLayer<FakePictureLayerImplWithRasterSourceAsMask>(
+      host_impl()->pending_tree(), pending_layer(), valid_raster_source);
+  mask->SetBounds(layer_bounds);
+  mask->SetDrawsContent(true);
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   FakePictureLayerImpl* pending_mask = static_cast<FakePictureLayerImpl*>(
       pending_layer()->test_properties()->mask_layer);
@@ -1840,7 +1830,7 @@
   host_impl()->SetExternalTilePriorityConstraints(
       external_viewport_for_tile_priority, transform_for_tile_priority);
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Set visible content rect that is different from
   // external_viewport_for_tile_priority.
@@ -1879,8 +1869,7 @@
   EXPECT_GT(num_outside, 0);
 
   // Activate and draw active layer.
-  host_impl()->ActivateSyncTree();
-  host_impl()->active_tree()->UpdateDrawProperties();
+  ActivateTree();
   active_layer()->draw_properties().visible_layer_rect = visible_layer_rect;
 
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
@@ -2280,15 +2269,15 @@
   host_impl()->CreatePendingTree();
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
 
+  int kLayerId = 2;
   std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, layer_id(),
+      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, kLayerId,
                                                    pending_raster_source);
   pending_layer->SetDrawsContent(true);
+  auto* raw_pending_layer = pending_layer.get();
+  SetupRootProperties(raw_pending_layer);
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-  pending_tree->BuildLayerListAndPropertyTreesForTesting();
-
-  FakePictureLayerImpl* raw_pending_layer = static_cast<FakePictureLayerImpl*>(
-      host_impl()->pending_tree()->LayerById(layer_id()));
+  LayerTreeHostCommon::PrepareForUpdateDrawPropertiesForTesting(pending_tree);
 
   // Set some state on the pending layer, make sure it is not clobbered
   // by a sync from the active layer.  This could happen because if the
@@ -2300,7 +2289,7 @@
   host_impl()->ActivateSyncTree();
 
   FakePictureLayerImpl* raw_active_layer = static_cast<FakePictureLayerImpl*>(
-      host_impl()->active_tree()->LayerById(layer_id()));
+      host_impl()->active_tree()->LayerById(kLayerId));
 
   EXPECT_EQ(0u, raw_active_layer->num_tilings());
   EXPECT_EQ(raster_page_scale, raw_active_layer->raster_page_scale());
@@ -3902,7 +3891,7 @@
   SetupPendingTree(pending_raster_source);
   pending_layer()->SetBounds(layer_bounds);
   ActivateTree();
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
   std::vector<Tile*> tiles =
       active_layer()->HighResTiling()->AllTilesForTesting();
   host_impl()->tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
@@ -3998,7 +3987,7 @@
   gfx::Size tile_size(102, 102);
   gfx::Size layer_bounds(1000, 1000);
   gfx::Size viewport_size(500, 500);
-  gfx::PointF occluding_layer_position(310.f, 0.f);
+  gfx::Vector2dF occluding_layer_position(310.f, 0.f);
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(viewport_size));
 
@@ -4028,17 +4017,15 @@
   EXPECT_EQ(unoccluded_tile_count, 25);
 
   // Partial occlusion.
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 1));
-  LayerImpl* layer1 = pending_layer()->test_properties()->children[0];
+  LayerImpl* layer1 = AddLayer<LayerImpl>(host_impl()->pending_tree());
   layer1->SetBounds(layer_bounds);
   layer1->SetDrawsContent(true);
   layer1->SetContentsOpaque(true);
-  layer1->test_properties()->position = occluding_layer_position;
+  CopyProperties(pending_layer(), layer1);
+  layer1->SetOffsetToTransformParent(occluding_layer_position);
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   unoccluded_tile_count = 0;
   queue.reset(new TilingSetRasterQueueAll(
@@ -4058,12 +4045,11 @@
   EXPECT_EQ(20, unoccluded_tile_count);
 
   // Full occlusion.
-  layer1->test_properties()->position = gfx::PointF();
+  layer1->SetOffsetToTransformParent(gfx::Vector2dF());
   layer1->NoteLayerPropertyChanged();
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   unoccluded_tile_count = 0;
   queue.reset(new TilingSetRasterQueueAll(
@@ -4090,7 +4076,7 @@
   gfx::Size tile_size(102, 102);
   gfx::Size layer_bounds(1000, 1000);
   gfx::Size viewport_size(500, 500);
-  gfx::PointF occluding_layer_position(310.f, 0.f);
+  gfx::Vector2dF occluding_layer_position(310.f, 0.f);
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(viewport_size));
 
@@ -4123,17 +4109,15 @@
   }
 
   // Partial occlusion.
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 1));
-  LayerImpl* layer1 = pending_layer()->test_properties()->children[0];
+  LayerImpl* layer1 = AddLayer<LayerImpl>(host_impl()->pending_tree());
   layer1->SetBounds(layer_bounds);
   layer1->SetDrawsContent(true);
   layer1->SetContentsOpaque(true);
-  layer1->test_properties()->position = occluding_layer_position;
+  CopyProperties(pending_layer(), layer1);
+  layer1->SetOffsetToTransformParent(occluding_layer_position);
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   for (size_t i = 0; i < pending_layer()->num_tilings(); ++i) {
     PictureLayerTiling* tiling = pending_layer()->tilings()->tiling_at(i);
@@ -4166,12 +4150,11 @@
   }
 
   // Full occlusion.
-  layer1->test_properties()->position = gfx::PointF();
+  layer1->SetOffsetToTransformParent(gfx::Vector2dF());
   layer1->NoteLayerPropertyChanged();
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(200));
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   for (size_t i = 0; i < pending_layer()->num_tilings(); ++i) {
     PictureLayerTiling* tiling = pending_layer()->tilings()->tiling_at(i);
@@ -4210,7 +4193,7 @@
   gfx::Size tile_size(102, 102);
   gfx::Size layer_bounds(1000, 1000);
   gfx::Size viewport_size(500, 500);
-  gfx::PointF occluding_layer_position(310.f, 0.f);
+  gfx::Vector2dF occluding_layer_position(310.f, 0.f);
 
   scoped_refptr<FakeRasterSource> pending_raster_source =
       FakeRasterSource::CreateFilled(layer_bounds);
@@ -4220,13 +4203,12 @@
   SetupPendingTreeWithFixedTileSize(pending_raster_source, tile_size, Region());
   ASSERT_TRUE(pending_layer()->CanHaveTilings());
 
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 1));
-  LayerImpl* layer1 = pending_layer()->test_properties()->children[0];
+  LayerImpl* layer1 = AddLayer<LayerImpl>(host_impl()->pending_tree());
   layer1->SetBounds(layer_bounds);
   layer1->SetDrawsContent(true);
   layer1->SetContentsOpaque(true);
-  layer1->test_properties()->position = occluding_layer_position;
+  CopyProperties(pending_layer(), layer1);
+  layer1->SetOffsetToTransformParent(occluding_layer_position);
 
   pending_layer()->tilings()->RemoveAllTilings();
   float low_res_factor = host_impl()->settings().low_res_contents_scale_factor;
@@ -4246,10 +4228,9 @@
       ->AddTiling(gfx::AxisTransform2d(2.0f, gfx::Vector2dF()))
       ->set_resolution(HIGH_RESOLUTION);
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
   // UpdateDrawProperties with the occluding layer.
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   EXPECT_EQ(5u, pending_layer()->num_tilings());
 
@@ -4293,7 +4274,7 @@
 TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) {
   gfx::Size layer_bounds(1000, 1000);
   gfx::Size viewport_size(1000, 1000);
-  gfx::PointF occluding_layer_position(310.f, 0.f);
+  gfx::Vector2dF occluding_layer_position(310.f, 0.f);
   gfx::Rect invalidation_rect(230, 230, 102, 102);
 
   scoped_refptr<FakeRasterSource> pending_raster_source =
@@ -4305,13 +4286,12 @@
   SetupPendingTree(active_raster_source);
 
   // Partially occlude the active layer.
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 2));
-  LayerImpl* layer1 = pending_layer()->test_properties()->children[0];
+  LayerImpl* layer1 = AddLayer<LayerImpl>(host_impl()->pending_tree());
   layer1->SetBounds(layer_bounds);
   layer1->SetDrawsContent(true);
   layer1->SetContentsOpaque(true);
-  layer1->test_properties()->position = occluding_layer_position;
+  CopyProperties(pending_layer(), layer1);
+  layer1->SetOffsetToTransformParent(occluding_layer_position);
 
   ActivateTree();
 
@@ -4385,8 +4365,8 @@
   gfx::Size tile_size(102, 102);
   gfx::Size layer_bounds(1000, 1000);
   gfx::Size viewport_size(1000, 1000);
-  gfx::PointF pending_occluding_layer_position(310.f, 0.f);
-  gfx::PointF active_occluding_layer_position(0.f, 310.f);
+  gfx::Vector2dF pending_occluding_layer_position(310.f, 0.f);
+  gfx::Vector2dF active_occluding_layer_position(0.f, 310.f);
   gfx::Rect invalidation_rect(230, 230, 152, 152);
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(viewport_size));
@@ -4400,15 +4380,14 @@
   SetupPendingTreeWithFixedTileSize(active_raster_source, tile_size, Region());
 
   // Partially occlude the active layer.
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 2));
   LayerImpl* active_occluding_layer =
-      pending_layer()->test_properties()->children[0];
+      AddLayer<LayerImpl>(host_impl()->pending_tree());
   active_occluding_layer->SetBounds(layer_bounds);
   active_occluding_layer->SetDrawsContent(true);
   active_occluding_layer->SetContentsOpaque(true);
-  active_occluding_layer->test_properties()->position =
-      active_occluding_layer_position;
+  CopyProperties(pending_layer(), active_occluding_layer);
+  active_occluding_layer->SetOffsetToTransformParent(
+      active_occluding_layer_position);
   ActivateTree();
 
   // Partially invalidate the pending layer. Tiles inside the invalidation rect
@@ -4417,23 +4396,22 @@
                                     invalidation_rect);
 
   // Partially occlude the pending layer in a different way.
-  pending_layer()->test_properties()->AddChild(
-      LayerImpl::Create(host_impl()->pending_tree(), 3));
   LayerImpl* pending_occluding_layer =
-      pending_layer()->test_properties()->children[0];
-  pending_occluding_layer->SetBounds(layer_bounds);
-  pending_occluding_layer->SetDrawsContent(true);
-  pending_occluding_layer->SetContentsOpaque(true);
-  pending_occluding_layer->test_properties()->position =
-      pending_occluding_layer_position;
+      host_impl()->pending_tree()->LayerById(active_occluding_layer->id());
+  ASSERT_EQ(active_occluding_layer->bounds(),
+            pending_occluding_layer->bounds());
+  ASSERT_TRUE(pending_occluding_layer->DrawsContent());
+  ASSERT_TRUE(pending_occluding_layer->contents_opaque());
+  pending_occluding_layer->SetOffsetToTransformParent(
+      pending_occluding_layer_position);
+  pending_occluding_layer->NoteLayerPropertyChanged();
 
   EXPECT_EQ(1u, pending_layer()->num_tilings());
   EXPECT_EQ(2u, active_layer()->num_tilings());
 
-  RebuildPropertyTreesOnPendingTree();
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
   // UpdateDrawProperties with the occluding layer.
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   float dest_scale = std::max(active_layer()->MaximumTilingContentsScale(),
                               pending_layer()->MaximumTilingContentsScale());
@@ -4705,7 +4683,6 @@
 
   SetupPendingTree(raster_source1);
   ActivateTree();
-  host_impl()->active_tree()->UpdateDrawProperties();
 
   // We've started with a solid layer that contains some tilings.
   ASSERT_TRUE(active_layer()->tilings());
@@ -4904,7 +4881,7 @@
   SetupDefaultTrees(layer_bounds);
 
   active_layer()->SetCurrentScrollOffset(gfx::ScrollOffset(0.0, 50.0));
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
   EXPECT_EQ("0,50 100x100", active_layer()
                                 ->HighResTiling()
                                 ->GetCurrentVisibleRectForTesting()
@@ -4914,7 +4891,10 @@
                                ->HighResTiling()
                                ->GetCurrentVisibleRectForTesting()
                                .ToString());
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  // Scroll offset in property trees is not propagated from the active tree to
+  // the pending tree.
+  SetScrollOffset(pending_layer(), active_layer()->CurrentScrollOffset());
+  UpdateDrawProperties(host_impl()->pending_tree());
   EXPECT_EQ("0,50 100x100", pending_layer()
                                 ->HighResTiling()
                                 ->GetCurrentVisibleRectForTesting()
@@ -5007,11 +4987,8 @@
 };
 
 TEST_F(TileSizeTest, TileSizes) {
-  host_impl()->CreatePendingTree();
-
-  LayerTreeImpl* pending_tree = host_impl()->pending_tree();
-  std::unique_ptr<FakePictureLayerImpl> layer =
-      FakePictureLayerImpl::Create(pending_tree, layer_id());
+  SetupPendingTree();
+  auto* layer = pending_layer();
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(1000, 1000));
   gfx::Size result;
@@ -5077,11 +5054,8 @@
 };
 
 TEST_F(HalfWidthTileTest, TileSizes) {
-  host_impl()->CreatePendingTree();
-
-  LayerTreeImpl* pending_tree = host_impl()->pending_tree();
-  std::unique_ptr<FakePictureLayerImpl> layer =
-      FakePictureLayerImpl::Create(pending_tree, layer_id());
+  SetupPendingTree();
+  auto* layer = pending_layer();
 
   gfx::Size result;
   host_impl()->SetHasGpuRasterizationTrigger(true);
@@ -5215,13 +5189,14 @@
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
 
   std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, layer_id(),
+      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, root_id(),
                                                    pending_raster_source);
   pending_layer->set_is_directly_composited_image(true);
   pending_layer->SetDrawsContent(true);
   FakePictureLayerImpl* pending_layer_ptr = pending_layer.get();
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-  pending_tree->BuildLayerListAndPropertyTreesForTesting();
+  SetupRootProperties(pending_layer_ptr);
+  UpdateDrawProperties(pending_tree);
 
   SetupDrawPropertiesAndUpdateTiles(pending_layer_ptr, 2.f, 3.f, 4.f, 1.f, 1.f,
                                     false);
@@ -5239,14 +5214,15 @@
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
 
   std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, layer_id(),
+      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, root_id(),
                                                    pending_raster_source);
   pending_layer->set_is_directly_composited_image(true);
   pending_layer->SetDrawsContent(true);
   FakePictureLayerImpl* pending_layer_ptr = pending_layer.get();
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
   pending_tree->SetDeviceViewportRect(layer_rect);
-  pending_tree->BuildLayerListAndPropertyTreesForTesting();
+  SetupRootProperties(pending_layer_ptr);
+  UpdateDrawProperties(pending_tree);
 
   // Set PictureLayerImpl::ideal_contents_scale_ to 2.f.
   const float suggested_ideal_contents_scale = 2.f;
@@ -5297,17 +5273,8 @@
   scoped_refptr<FakeRasterSource> pending_raster_source =
       FakeRasterSource::CreateFilled(layer_bounds);
 
-  host_impl()->CreatePendingTree();
-  LayerTreeImpl* pending_tree = host_impl()->pending_tree();
-
-  std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::CreateWithRasterSource(pending_tree, layer_id(),
-                                                   pending_raster_source);
-  pending_layer->set_is_directly_composited_image(true);
-  pending_layer->SetDrawsContent(true);
-  FakePictureLayerImpl* pending_layer_ptr = pending_layer.get();
-  pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-  pending_tree->BuildLayerListAndPropertyTreesForTesting();
+  SetupPendingTree(pending_raster_source);
+  pending_layer()->set_is_directly_composited_image(true);
 
   float expected_contents_scale = 0.25f;
   for (int i = 1; i < 30; ++i) {
@@ -5322,10 +5289,11 @@
         expected_contents_scale = 1.f;
         break;
     }
-    SetupDrawPropertiesAndUpdateTiles(pending_layer_ptr, ideal_contents_scale,
+    SetupDrawPropertiesAndUpdateTiles(pending_layer(), ideal_contents_scale,
                                       1.f, 1.f, 1.f, 1.f, false);
     EXPECT_FLOAT_EQ(expected_contents_scale,
-                    pending_layer_ptr->picture_layer_tiling_set()
+                    pending_layer()
+                        ->picture_layer_tiling_set()
                         ->FindTilingWithResolution(HIGH_RESOLUTION)
                         ->contents_scale_key())
         << "ideal_contents_scale: " << ideal_contents_scale;
@@ -5344,10 +5312,11 @@
         expected_contents_scale = 0.25f;
         break;
     }
-    SetupDrawPropertiesAndUpdateTiles(pending_layer_ptr, ideal_contents_scale,
+    SetupDrawPropertiesAndUpdateTiles(pending_layer(), ideal_contents_scale,
                                       1.f, 1.f, 1.f, 1.f, false);
     EXPECT_FLOAT_EQ(expected_contents_scale,
-                    pending_layer_ptr->picture_layer_tiling_set()
+                    pending_layer()
+                        ->picture_layer_tiling_set()
                         ->FindTilingWithResolution(HIGH_RESOLUTION)
                         ->contents_scale_key())
         << "ideal_contents_scale: " << ideal_contents_scale;
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc
index 40772076..33ed561 100644
--- a/cc/layers/picture_layer_unittest.cc
+++ b/cc/layers/picture_layer_unittest.cc
@@ -19,6 +19,7 @@
 #include "cc/test/fake_picture_layer_impl.h"
 #include "cc/test/fake_proxy.h"
 #include "cc/test/fake_recording_source.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/test/skia_common.h"
 #include "cc/test/stub_layer_tree_host_single_thread_client.h"
 #include "cc/test/test_task_graph_runner.h"
@@ -183,19 +184,18 @@
 
   std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink(
       FakeLayerTreeFrameSink::Create3d());
-  LayerTreeSettings layer_tree_settings = LayerTreeSettings();
   FakeLayerTreeHostImpl host_impl(
-      layer_tree_settings, &impl_task_runner_provider, &task_graph_runner);
+      LayerListSettings(), &impl_task_runner_provider, &task_graph_runner);
   host_impl.SetVisible(true);
   EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get()));
 
   host_impl.CreatePendingTree();
   host_impl.pending_tree()->SetRootLayerForTesting(
       FakePictureLayerImpl::Create(host_impl.pending_tree(), 1));
-  host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-
   FakePictureLayerImpl* layer_impl = static_cast<FakePictureLayerImpl*>(
       host_impl.pending_tree()->root_layer_for_testing());
+  SetupRootProperties(layer_impl);
+  UpdateDrawProperties(host_impl.pending_tree());
 
   layer->PushPropertiesTo(layer_impl);
 
@@ -206,8 +206,7 @@
 
   // By updating the draw proprties on the active tree, we will set the viewport
   // rect for tile priorities to something non-empty.
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
-  host_impl.active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl.active_tree());
 
   layer->SetBounds(gfx::Size(11, 11));
 
@@ -218,7 +217,7 @@
   // We should now have invalid contents and should therefore clear the
   // recording source.
   layer->PushPropertiesTo(layer_impl);
-  host_impl.pending_tree()->BuildPropertyTreesForTesting();
+  UpdateDrawProperties(host_impl.pending_tree());
 
   host_impl.ActivateSyncTree();
 
diff --git a/cc/layers/render_surface_impl_unittest.cc b/cc/layers/render_surface_impl_unittest.cc
index 879c1c36..6e23e99 100644
--- a/cc/layers/render_surface_impl_unittest.cc
+++ b/cc/layers/render_surface_impl_unittest.cc
@@ -25,7 +25,9 @@
   LayerImpl* owning_layer_impl = impl.AddChildToRoot<LayerImpl>();
   owning_layer_impl->SetBounds(layer_size);
   owning_layer_impl->SetDrawsContent(true);
-  owning_layer_impl->test_properties()->force_render_surface = true;
+  CopyProperties(impl.root_layer(), owning_layer_impl);
+  CreateEffectNode(owning_layer_impl).render_surface_reason =
+      RenderSurfaceReason::kTest;
 
   impl.CalcDrawProps(viewport_size);
 
@@ -75,47 +77,35 @@
   scoped_refptr<FakeRasterSource> raster_source =
       FakeRasterSource::CreateFilledSolidColor(layer_size);
 
-  LayerTreeSettings settings;
-  LayerTestCommon::LayerImplTest impl(settings);
-  std::unique_ptr<LayerImpl> root =
-      LayerImpl::Create(impl.host_impl()->active_tree(), 2);
-  std::unique_ptr<LayerImpl> surface =
-      LayerImpl::Create(impl.host_impl()->active_tree(), 3);
-  surface->SetBounds(layer_size);
-  surface->test_properties()->force_render_surface = true;
+  LayerTestCommon::LayerImplTest impl;
+  auto* root = impl.root_layer();
 
+  auto* surface = impl.AddLayer<LayerImpl>();
+  surface->SetBounds(layer_size);
   gfx::Transform scale;
   scale.Scale(scale_factor, scale_factor);
-  surface->test_properties()->transform = scale;
+  CopyProperties(root, surface);
+  CreateTransformNode(surface).local = scale;
+  CreateEffectNode(surface).render_surface_reason = RenderSurfaceReason::kTest;
 
-  std::unique_ptr<FakeMaskLayerImpl> mask_layer = FakeMaskLayerImpl::Create(
-      impl.host_impl()->active_tree(), 4, raster_source, mask_type);
+  auto* mask_layer =
+      impl.AddMaskLayer<FakeMaskLayerImpl>(surface, raster_source, mask_type);
   mask_layer->set_resource_size(
       gfx::ScaleToCeiledSize(layer_size, scale_factor));
   mask_layer->SetDrawsContent(true);
   mask_layer->SetBounds(layer_size);
-  surface->test_properties()->SetMaskLayer(std::move(mask_layer));
 
-  std::unique_ptr<LayerImpl> child =
-      LayerImpl::Create(impl.host_impl()->active_tree(), 5);
+  auto* child = impl.AddLayer<LayerImpl>();
   child->SetDrawsContent(true);
   child->SetBounds(layer_size);
+  CopyProperties(surface, child);
 
-  surface->test_properties()->AddChild(std::move(child));
-  root->test_properties()->AddChild(std::move(surface));
-  impl.host_impl()->active_tree()->SetRootLayerForTesting(std::move(root));
+  LayerTreeImpl* active_tree = impl.host_impl()->active_tree();
+  active_tree->SetDeviceScaleFactor(device_scale_factor);
+  active_tree->SetDeviceViewportRect(viewport_rect);
+  UpdateDrawProperties(active_tree);
 
-  impl.host_impl()->active_tree()->SetDeviceScaleFactor(device_scale_factor);
-  impl.host_impl()->active_tree()->SetDeviceViewportRect(viewport_rect);
-  impl.host_impl()->active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  impl.host_impl()->active_tree()->UpdateDrawProperties();
-
-  LayerImpl* surface_raw = impl.host_impl()
-                               ->active_tree()
-                               ->root_layer_for_testing()
-                               ->test_properties()
-                               ->children[0];
-  RenderSurfaceImpl* render_surface_impl = GetRenderSurface(surface_raw);
+  RenderSurfaceImpl* render_surface_impl = GetRenderSurface(surface);
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
   AppendQuadsData append_quads_data;
   render_surface_impl->AppendQuads(draw_mode, render_pass.get(),
diff --git a/cc/layers/render_surface_unittest.cc b/cc/layers/render_surface_unittest.cc
index 3f77900..d9c94c71 100644
--- a/cc/layers/render_surface_unittest.cc
+++ b/cc/layers/render_surface_unittest.cc
@@ -40,13 +40,6 @@
 // does not intersect with visible_layer_rect.
 class FakePictureLayerImplForRenderSurfaceTest : public FakePictureLayerImpl {
  public:
-  static std::unique_ptr<FakePictureLayerImplForRenderSurfaceTest> CreateMask(
-      LayerTreeImpl* tree_impl,
-      int id) {
-    return base::WrapUnique(
-        new FakePictureLayerImplForRenderSurfaceTest(tree_impl, id));
-  }
-
   std::unique_ptr<LayerImpl> CreateLayerImpl(
       LayerTreeImpl* tree_impl) override {
     return base::WrapUnique(
@@ -83,29 +76,39 @@
   std::vector<gfx::Rect> quad_rects_;
 };
 
+class FakePictureLayerImplForRenderSurfaceTestAsMask
+    : public FakePictureLayerImplForRenderSurfaceTest {
+ public:
+  static std::unique_ptr<FakePictureLayerImplForRenderSurfaceTestAsMask> Create(
+      LayerTreeImpl* tree_impl,
+      int id) {
+    return base::WrapUnique(
+        new FakePictureLayerImplForRenderSurfaceTestAsMask(tree_impl, id));
+  }
+
+ protected:
+  using FakePictureLayerImplForRenderSurfaceTest::
+      FakePictureLayerImplForRenderSurfaceTest;
+};
+
 TEST(RenderSurfaceTest, VerifySurfaceChangesAreTrackedProperly) {
   //
   // This test checks that SurfacePropertyChanged() has the correct behavior.
   //
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<LayerImpl> owning_layer =
-      LayerImpl::Create(host_impl.active_tree(), 1);
-  owning_layer->test_properties()->force_render_surface = true;
-  gfx::Rect test_rect(3, 4, 5, 6);
-  host_impl.active_tree()->ResetAllChangeTracking();
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(owning_layer));
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->UpdateDrawProperties();
+  LayerTestCommon::LayerImplTest impl;
+  LayerImpl* root = impl.root_layer();
+  LayerTreeImpl* active_tree = impl.host_impl()->active_tree();
 
-  RenderSurfaceImpl* render_surface =
-      GetRenderSurface(host_impl.active_tree()->root_layer_for_testing());
+  LayerImpl* layer = impl.AddLayer<LayerImpl>();
+  CopyProperties(root, layer);
+  CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
+
+  UpdateDrawProperties(active_tree);
+  gfx::Rect test_rect(3, 4, 5, 6);
+  active_tree->ResetAllChangeTracking();
+
+  RenderSurfaceImpl* render_surface = GetRenderSurface(layer);
   ASSERT_TRUE(render_surface);
 
   // Currently, the content_rect, clip_rect, and
@@ -114,10 +117,9 @@
   EXECUTE_AND_VERIFY_SURFACE_CHANGED(
       render_surface->SetContentRectForTesting(test_rect));
 
-  host_impl.active_tree()->SetOpacityMutated(
-      host_impl.active_tree()->root_layer_for_testing()->element_id(), 0.5f);
+  active_tree->SetOpacityMutated(root->element_id(), 0.5f);
   EXPECT_TRUE(render_surface->SurfacePropertyChanged());
-  host_impl.active_tree()->ResetAllChangeTracking();
+  active_tree->ResetAllChangeTracking();
 
   // Setting the surface properties to the same values again should not be
   // considered "change".
@@ -126,8 +128,9 @@
   EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE(
       render_surface->SetContentRectForTesting(test_rect));
 
+  constexpr int kArbitraryLayerId = 200;
   std::unique_ptr<LayerImpl> dummy_mask =
-      LayerImpl::Create(host_impl.active_tree(), 2);
+      LayerImpl::Create(active_tree, kArbitraryLayerId);
   gfx::Transform dummy_matrix;
   dummy_matrix.Translate(1.0, 2.0);
 
@@ -141,33 +144,20 @@
 }
 
 TEST(RenderSurfaceTest, SanityCheckSurfaceCreatesCorrectSharedQuadState) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<LayerImpl> root_layer =
-      LayerImpl::Create(host_impl.active_tree(), 1);
+  LayerTestCommon::LayerImplTest impl;
+  LayerImpl* root = impl.root_layer();
 
-  int owning_layer_id = 2;
-  std::unique_ptr<LayerImpl> owning_layer =
-      LayerImpl::Create(host_impl.active_tree(), owning_layer_id);
-  owning_layer->test_properties()->force_render_surface = true;
-
+  LayerImpl* layer = impl.AddLayer<LayerImpl>();
+  CopyProperties(root, layer);
+  auto& effect_node = CreateEffectNode(layer);
+  effect_node.render_surface_reason = RenderSurfaceReason::kBlendMode;
   SkBlendMode blend_mode = SkBlendMode::kSoftLight;
-  owning_layer->test_properties()->blend_mode = blend_mode;
+  effect_node.blend_mode = blend_mode;
 
-  root_layer->test_properties()->AddChild(std::move(owning_layer));
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(impl.host_impl()->active_tree());
 
-  ASSERT_TRUE(
-      GetRenderSurface(host_impl.active_tree()->LayerById(owning_layer_id)));
-  RenderSurfaceImpl* render_surface =
-      GetRenderSurface(host_impl.active_tree()->LayerById(owning_layer_id));
+  RenderSurfaceImpl* render_surface = GetRenderSurface(layer);
+  ASSERT_TRUE(render_surface);
 
   gfx::Rect content_rect(0, 0, 50, 50);
   gfx::Rect clip_rect(5, 5, 40, 40);
@@ -202,30 +192,18 @@
 }
 
 TEST(RenderSurfaceTest, SanityCheckSurfaceCreatesCorrectRenderPass) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<LayerImpl> root_layer =
-      LayerImpl::Create(host_impl.active_tree(), 1);
+  LayerTestCommon::LayerImplTest impl;
+  LayerImpl* root = impl.root_layer();
 
-  int owning_layer_id = 2;
-  std::unique_ptr<LayerImpl> owning_layer =
-      LayerImpl::Create(host_impl.active_tree(), owning_layer_id);
-  owning_layer->test_properties()->force_render_surface = true;
+  LayerImpl* layer = impl.AddLayer<LayerImpl>();
+  CopyProperties(root, layer);
+  auto& effect_node = CreateEffectNode(layer);
+  effect_node.render_surface_reason = RenderSurfaceReason::kTest;
 
-  root_layer->test_properties()->AddChild(std::move(owning_layer));
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(impl.host_impl()->active_tree());
 
-  ASSERT_TRUE(
-      GetRenderSurface(host_impl.active_tree()->LayerById(owning_layer_id)));
-  RenderSurfaceImpl* render_surface =
-      GetRenderSurface(host_impl.active_tree()->LayerById(owning_layer_id));
+  RenderSurfaceImpl* render_surface = GetRenderSurface(layer);
+  ASSERT_TRUE(render_surface);
 
   gfx::Rect content_rect(0, 0, 50, 50);
   gfx::Transform origin;
@@ -242,27 +220,19 @@
 }
 
 TEST(RenderSurfaceTest, SanityCheckSurfaceIgnoreMaskLayerOcclusion) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink =
-      FakeLayerTreeFrameSink::Create3d();
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
+  LayerTestCommon::LayerImplTest impl;
+  LayerImpl* root = impl.root_layer();
   // Set a big enough viewport to show the entire render pass.
-  host_impl.active_tree()->SetDeviceViewportRect(gfx::Rect(1000, 1000));
+  impl.host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(1000, 1000));
 
-  std::unique_ptr<LayerImpl> root_layer =
-      LayerImpl::Create(host_impl.active_tree(), 1);
+  auto* layer = impl.AddLayer<LayerImpl>();
+  layer->SetBounds(gfx::Size(200, 100));
+  layer->SetDrawsContent(true);
+  CopyProperties(root, layer);
+  CreateEffectNode(layer);
 
-  int owning_layer_id = 2;
-  std::unique_ptr<LayerImpl> owning_layer =
-      LayerImpl::Create(host_impl.active_tree(), owning_layer_id);
-
-  int mask_layer_id = 3;
-  std::unique_ptr<FakePictureLayerImplForRenderSurfaceTest> mask_layer =
-      FakePictureLayerImplForRenderSurfaceTest::CreateMask(
-          host_impl.active_tree(), mask_layer_id);
-
-  mask_layer->SetBounds(gfx::Size(200, 100));
+  auto* mask_layer =
+      impl.AddMaskLayer<FakePictureLayerImplForRenderSurfaceTestAsMask>(layer);
   scoped_refptr<FakeRasterSource> raster_source(
       FakeRasterSource::CreateFilled(mask_layer->bounds()));
   mask_layer->SetRasterSourceOnActive(raster_source, Region());
@@ -272,28 +242,16 @@
   quad_rects.push_back(gfx::Rect(100, 0, 100, 100));
   mask_layer->SetQuadRectsForTesting(quad_rects);
 
-  owning_layer->SetBounds(gfx::Size(200, 100));
-  owning_layer->SetDrawsContent(true);
-  owning_layer->test_properties()->SetMaskLayer(std::move(mask_layer));
-  root_layer->test_properties()->AddChild(std::move(owning_layer));
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(root_layer));
-  host_impl.SetVisible(true);
-  host_impl.InitializeFrameSink(layer_tree_frame_sink.get());
-  host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl.active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(impl.host_impl()->active_tree());
 
-  RenderSurfaceImpl* render_surface =
-      GetRenderSurface(host_impl.active_tree()->LayerById(owning_layer_id));
+  RenderSurfaceImpl* render_surface = GetRenderSurface(layer);
   ASSERT_TRUE(render_surface);
 
   gfx::Rect content_rect(0, 0, 200, 100);
   gfx::Rect occluded(0, 0, 200, 100);
 
   render_surface->SetContentRectForTesting(content_rect);
-  host_impl.active_tree()
-      ->LayerById(mask_layer_id)
-      ->draw_properties()
-      .occlusion_in_content_space =
+  mask_layer->draw_properties().occlusion_in_content_space =
       Occlusion(gfx::Transform(), SimpleEnclosedRegion(occluded),
                 SimpleEnclosedRegion(occluded));
 
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc
index 419b051..1686d8c 100644
--- a/cc/layers/scrollbar_layer_impl_base.cc
+++ b/cc/layers/scrollbar_layer_impl_base.cc
@@ -5,6 +5,8 @@
 #include "cc/layers/scrollbar_layer_impl_base.h"
 
 #include <algorithm>
+
+#include "base/numerics/ranges.h"
 #include "cc/trees/effect_node.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/scroll_node.h"
@@ -213,7 +215,7 @@
   float maximum = scroll_layer_length() - clip_layer_length();
 
   // With the length known, we can compute the thumb's position.
-  float clamped_current_pos = std::min(std::max(current_pos(), 0.f), maximum);
+  float clamped_current_pos = base::ClampToRange(current_pos(), 0.0f, maximum);
 
   int thumb_offset = TrackStart();
   if (maximum > 0) {
diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc
index 39740d06..f2ae0da3 100644
--- a/cc/layers/scrollbar_layer_unittest.cc
+++ b/cc/layers/scrollbar_layer_unittest.cc
@@ -807,7 +807,7 @@
 
   LayerTestCommon::LayerImplTest impl;
 
-  LayerImpl* scroll_layer = impl.AddChildToRoot<LayerImpl>();
+  LayerImpl* scroll_layer = impl.AddLayer<LayerImpl>();
   scroll_layer->SetElementId(LayerIdToElementIdForTesting(scroll_layer->id()));
 
   const int kTrackStart = 0;
@@ -824,21 +824,24 @@
   scroll_layer->SetScrollable(gfx::Size(980, 980));
   scroll_layer->SetBounds(gfx::Size(980, 980));
 
-  impl.host_impl()->active_tree()->BuildPropertyTreesForTesting();
+  CopyProperties(impl.root_layer(), scroll_layer);
+  CreateTransformNode(scroll_layer);
+  CreateScrollNode(scroll_layer);
+  CopyProperties(scroll_layer, scrollbar_layer);
+
   DCHECK(impl.host_impl()->active_tree()->ScrollbarGeometriesNeedUpdate());
   impl.host_impl()->active_tree()->UpdateScrollbarGeometries();
-
   impl.CalcDrawProps(viewport_size);
 
   // Fake clip layer length to scrollbar to mock rounding error.
   scrollbar_layer->SetClipLayerLength(979.999939f);
-  impl.host_impl()->active_tree()->BuildPropertyTreesForTesting();
+  impl.CalcDrawProps(viewport_size);
 
   EXPECT_FALSE(scrollbar_layer->CanScrollOrientation());
 
   // Fake clip layer length to scrollable.
   scrollbar_layer->SetClipLayerLength(979.0f);
-  impl.host_impl()->active_tree()->BuildPropertyTreesForTesting();
+  impl.CalcDrawProps(viewport_size);
 
   EXPECT_TRUE(scrollbar_layer->CanScrollOrientation());
 }
diff --git a/cc/layers/solid_color_layer_impl_unittest.cc b/cc/layers/solid_color_layer_impl_unittest.cc
index 5d1c306..b07ab75a 100644
--- a/cc/layers/solid_color_layer_impl_unittest.cc
+++ b/cc/layers/solid_color_layer_impl_unittest.cc
@@ -11,12 +11,8 @@
 #include "cc/animation/animation_host.h"
 #include "cc/layers/append_quads_data.h"
 #include "cc/layers/solid_color_layer.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host.h"
 #include "cc/test/layer_test_common.h"
-#include "cc/test/test_task_graph_runner.h"
 #include "cc/trees/layer_tree_host_common.h"
-#include "cc/trees/single_thread_proxy.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -24,55 +20,47 @@
 namespace cc {
 namespace {
 
-TEST(SolidColorLayerImplTest, VerifyTilingCompleteAndNoOverlap) {
+class SolidColorLayerImplTest : public LayerTestCommon::LayerImplTest,
+                                public ::testing::Test {};
+
+TEST_F(SolidColorLayerImplTest, VerifyTilingCompleteAndNoOverlap) {
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
 
   gfx::Size layer_size = gfx::Size(800, 600);
   gfx::Rect visible_layer_rect = gfx::Rect(layer_size);
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<SolidColorLayerImpl> layer =
-      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
-  layer->draw_properties().visible_layer_rect = visible_layer_rect;
-  layer->draw_properties().opacity = 1.f;
+  auto* layer = AddLayer<SolidColorLayerImpl>();
   layer->SetBounds(layer_size);
+  layer->SetDrawsContent(true);
   layer->SetBackgroundColor(SK_ColorRED);
-  layer->test_properties()->force_render_surface = true;
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
+  CopyProperties(root_layer(), layer);
+  CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
+  UpdateDrawProperties(host_impl()->active_tree());
   AppendQuadsData data;
-  host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
-      render_pass.get(), &data);
+  layer->AppendQuads(render_pass.get(), &data);
 
   LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list,
                                                visible_layer_rect);
 }
 
-TEST(SolidColorLayerImplTest, VerifyCorrectBackgroundColorInQuad) {
+TEST_F(SolidColorLayerImplTest, VerifyCorrectBackgroundColorInQuad) {
   SkColor test_color = 0xFFA55AFF;
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
-
   gfx::Size layer_size = gfx::Size(100, 100);
   gfx::Rect visible_layer_rect = gfx::Rect(layer_size);
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<SolidColorLayerImpl> layer =
-      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
-  layer->draw_properties().visible_layer_rect = visible_layer_rect;
-  layer->draw_properties().opacity = 1.f;
+  auto* layer = AddLayer<SolidColorLayerImpl>();
   layer->SetBounds(layer_size);
+  layer->SetDrawsContent(true);
   layer->SetBackgroundColor(test_color);
-  layer->test_properties()->force_render_surface = true;
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
+  CopyProperties(root_layer(), layer);
+  CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
+  UpdateDrawProperties(host_impl()->active_tree());
+
+  EXPECT_EQ(visible_layer_rect, layer->draw_properties().visible_layer_rect);
+
   AppendQuadsData data;
-  host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
-      render_pass.get(), &data);
+  layer->AppendQuads(render_pass.get(), &data);
 
   ASSERT_EQ(render_pass->quad_list.size(), 1U);
   EXPECT_EQ(
@@ -81,29 +69,24 @@
       test_color);
 }
 
-TEST(SolidColorLayerImplTest, VerifyCorrectOpacityInQuad) {
+TEST_F(SolidColorLayerImplTest, VerifyCorrectOpacityInQuad) {
   const float opacity = 0.5f;
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
-
   gfx::Size layer_size = gfx::Size(100, 100);
-  gfx::Rect visible_layer_rect = gfx::Rect(layer_size);
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<SolidColorLayerImpl> layer =
-      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
-  layer->draw_properties().visible_layer_rect = visible_layer_rect;
+  auto* layer = AddLayer<SolidColorLayerImpl>();
+  layer->SetDrawsContent(true);
   layer->SetBounds(layer_size);
-  layer->draw_properties().opacity = opacity;
-  layer->test_properties()->force_render_surface = true;
   layer->SetBackgroundColor(SK_ColorRED);
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
+  CopyProperties(root_layer(), layer);
+  auto& effect_node = CreateEffectNode(layer);
+  effect_node.opacity = opacity;
+  UpdateDrawProperties(host_impl()->active_tree());
+
+  EXPECT_EQ(opacity, layer->draw_properties().opacity);
+
   AppendQuadsData data;
-  host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
-      render_pass.get(), &data);
+  layer->AppendQuads(render_pass.get(), &data);
 
   ASSERT_EQ(render_pass->quad_list.size(), 1U);
   EXPECT_EQ(opacity, viz::SolidColorDrawQuad::MaterialCast(
@@ -112,61 +95,74 @@
   EXPECT_TRUE(render_pass->quad_list.front()->ShouldDrawWithBlending());
 }
 
-TEST(SolidColorLayerImplTest, VerifyEliminateTransparentAlpha) {
+TEST_F(SolidColorLayerImplTest, VerifyCorrectRenderSurfaceOpacityInQuad) {
+  const float opacity = 0.5f;
+  std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
+  gfx::Size layer_size = gfx::Size(100, 100);
+
+  auto* layer = AddLayer<SolidColorLayerImpl>();
+  layer->SetDrawsContent(true);
+  layer->SetBounds(layer_size);
+  layer->SetBackgroundColor(SK_ColorRED);
+  CopyProperties(root_layer(), layer);
+  auto& effect_node = CreateEffectNode(layer);
+  effect_node.render_surface_reason = RenderSurfaceReason::kTest;
+  effect_node.opacity = opacity;
+  UpdateDrawProperties(host_impl()->active_tree());
+
+  // Opacity is applied on render surface, so the layer doesn't have opacity.
+  EXPECT_EQ(1.f, layer->draw_properties().opacity);
+
+  AppendQuadsData data;
+  layer->AppendQuads(render_pass.get(), &data);
+
+  ASSERT_EQ(render_pass->quad_list.size(), 1U);
+  // Opacity is applied on render surface, so the quad doesn't have opacity.
+  EXPECT_EQ(
+      1.f, viz::SolidColorDrawQuad::MaterialCast(render_pass->quad_list.front())
+               ->shared_quad_state->opacity);
+  EXPECT_FALSE(render_pass->quad_list.front()->ShouldDrawWithBlending());
+}
+
+TEST_F(SolidColorLayerImplTest, VerifyEliminateTransparentAlpha) {
   SkColor test_color = 0;
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
-
   gfx::Size layer_size = gfx::Size(100, 100);
-  gfx::Rect visible_layer_rect = gfx::Rect(layer_size);
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<SolidColorLayerImpl> layer =
-      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
-  layer->draw_properties().visible_layer_rect = visible_layer_rect;
-  layer->draw_properties().opacity = 1.f;
+  auto* layer = AddLayer<SolidColorLayerImpl>();
   layer->SetBounds(layer_size);
+  layer->SetDrawsContent(true);
   layer->SetBackgroundColor(test_color);
-  layer->test_properties()->force_render_surface = true;
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
-  AppendQuadsData data;
-  host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
-      render_pass.get(), &data);
+  CopyProperties(root_layer(), layer);
+  CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
+  UpdateDrawProperties(host_impl()->active_tree());
 
+  AppendQuadsData data;
+  layer->AppendQuads(render_pass.get(), &data);
   EXPECT_EQ(render_pass->quad_list.size(), 0U);
 }
 
-TEST(SolidColorLayerImplTest, VerifyEliminateTransparentOpacity) {
+TEST_F(SolidColorLayerImplTest, VerifyEliminateTransparentOpacity) {
   SkColor test_color = 0xFFA55AFF;
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
-
   gfx::Size layer_size = gfx::Size(100, 100);
-  gfx::Rect visible_layer_rect = gfx::Rect(layer_size);
 
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  std::unique_ptr<SolidColorLayerImpl> layer =
-      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
-  layer->draw_properties().visible_layer_rect = visible_layer_rect;
-  layer->draw_properties().opacity = 0.f;
+  auto* layer = AddLayer<SolidColorLayerImpl>();
   layer->SetBounds(layer_size);
+  layer->SetDrawsContent(true);
   layer->SetBackgroundColor(test_color);
-  layer->test_properties()->force_render_surface = true;
-  host_impl.active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl.active_tree()->BuildPropertyTreesForTesting();
-  AppendQuadsData data;
-  host_impl.active_tree()->root_layer_for_testing()->AppendQuads(
-      render_pass.get(), &data);
+  CopyProperties(root_layer(), layer);
+  auto& effect_node = CreateEffectNode(layer);
+  effect_node.render_surface_reason = RenderSurfaceReason::kTest;
+  effect_node.opacity = 0.f;
+  UpdateDrawProperties(host_impl()->active_tree());
 
+  AppendQuadsData data;
+  layer->AppendQuads(render_pass.get(), &data);
   EXPECT_EQ(render_pass->quad_list.size(), 0U);
 }
 
-TEST(SolidColorLayerImplTest, VerifyNeedsBlending) {
+TEST_F(SolidColorLayerImplTest, VerifyNeedsBlending) {
   gfx::Size layer_size = gfx::Size(100, 100);
 
   scoped_refptr<SolidColorLayer> layer = SolidColorLayer::Create();
@@ -242,49 +238,47 @@
   }
 }
 
-TEST(SolidColorLayerImplTest, Occlusion) {
+TEST_F(SolidColorLayerImplTest, Occlusion) {
   gfx::Size layer_size(1000, 1000);
   gfx::Size viewport_size(1000, 1000);
 
-  LayerTestCommon::LayerImplTest impl;
-
-  SolidColorLayerImpl* solid_color_layer_impl =
-      impl.AddChildToRoot<SolidColorLayerImpl>();
+  auto* solid_color_layer_impl = AddLayer<SolidColorLayerImpl>();
   solid_color_layer_impl->SetBackgroundColor(SkColorSetARGB(255, 10, 20, 30));
   solid_color_layer_impl->SetBounds(layer_size);
   solid_color_layer_impl->SetDrawsContent(true);
+  CopyProperties(root_layer(), solid_color_layer_impl);
 
-  impl.CalcDrawProps(viewport_size);
+  CalcDrawProps(viewport_size);
 
   {
     SCOPED_TRACE("No occlusion");
     gfx::Rect occluded;
-    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
+    AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
 
-    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
+    LayerTestCommon::VerifyQuadsExactlyCoverRect(quad_list(),
                                                  gfx::Rect(layer_size));
-    EXPECT_EQ(1u, impl.quad_list().size());
+    EXPECT_EQ(1u, quad_list().size());
   }
 
   {
     SCOPED_TRACE("Full occlusion");
     gfx::Rect occluded(solid_color_layer_impl->visible_layer_rect());
-    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
+    AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
 
-    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
-    EXPECT_EQ(impl.quad_list().size(), 0u);
+    LayerTestCommon::VerifyQuadsExactlyCoverRect(quad_list(), gfx::Rect());
+    EXPECT_EQ(quad_list().size(), 0u);
   }
 
   {
     SCOPED_TRACE("Partial occlusion");
     gfx::Rect occluded(200, 0, 800, 1000);
-    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
+    AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
 
     size_t partially_occluded_count = 0;
-    LayerTestCommon::VerifyQuadsAreOccluded(
-        impl.quad_list(), occluded, &partially_occluded_count);
+    LayerTestCommon::VerifyQuadsAreOccluded(quad_list(), occluded,
+                                            &partially_occluded_count);
     // 4 quads are completely occluded, 8 are partially occluded.
-    EXPECT_EQ(1u, impl.quad_list().size());
+    EXPECT_EQ(1u, quad_list().size());
     EXPECT_EQ(1u, partially_occluded_count);
   }
 }
diff --git a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
index a2b24303..0b464a9 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
+++ b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
@@ -25,19 +25,17 @@
   bool is_overlay = false;
 
   SolidColorScrollbarLayerImpl* scrollbar_layer_impl =
-      impl.AddChildToRoot<SolidColorScrollbarLayerImpl>(
-          orientation,
-          thumb_thickness,
-          track_start,
-          is_left_side_vertical_scrollbar,
-          is_overlay);
+      impl.AddLayer<SolidColorScrollbarLayerImpl>(
+          orientation, thumb_thickness, track_start,
+          is_left_side_vertical_scrollbar, is_overlay);
   scrollbar_layer_impl->SetBounds(layer_size);
   scrollbar_layer_impl->SetDrawsContent(true);
   scrollbar_layer_impl->SetCurrentPos(25.f);
   scrollbar_layer_impl->SetClipLayerLength(100.f);
   scrollbar_layer_impl->SetScrollLayerLength(200.f);
   // SolidColorScrollbarLayers construct with opacity = 0.f, so override.
-  scrollbar_layer_impl->test_properties()->opacity = 1.f;
+  CopyProperties(impl.root_layer(), scrollbar_layer_impl);
+  CreateEffectNode(scrollbar_layer_impl).opacity = 1.f;
 
   impl.CalcDrawProps(viewport_size);
 
diff --git a/cc/layers/surface_layer_impl_unittest.cc b/cc/layers/surface_layer_impl_unittest.cc
index 50ab0f01..896d20ad 100644
--- a/cc/layers/surface_layer_impl_unittest.cc
+++ b/cc/layers/surface_layer_impl_unittest.cc
@@ -27,13 +27,13 @@
 
   LayerTestCommon::LayerImplTest impl;
 
-  SurfaceLayerImpl* surface_layer_impl =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl = impl.AddLayer<SurfaceLayerImpl>();
   surface_layer_impl->SetBounds(layer_size);
   surface_layer_impl->SetDrawsContent(true);
   viz::SurfaceId surface_id(kArbitraryFrameSinkId, kArbitraryLocalSurfaceId);
   surface_layer_impl->SetRange(viz::SurfaceRange(base::nullopt, surface_id),
                                base::nullopt);
+  CopyProperties(impl.root_layer(), surface_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
@@ -77,8 +77,7 @@
 // are populated correctly if primary and fallback surfaces differ.
 TEST(SurfaceLayerImplTest, SurfaceLayerImplWithTwoDifferentSurfaces) {
   LayerTestCommon::LayerImplTest impl;
-  SurfaceLayerImpl* surface_layer_impl =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl = impl.AddLayer<SurfaceLayerImpl>();
 
   // Populate the primary viz::SurfaceInfo.
   const viz::LocalSurfaceId kArbitraryLocalSurfaceId1(
@@ -98,6 +97,7 @@
   surface_layer_impl->SetDrawsContent(true);
   surface_layer_impl->SetRange(viz::SurfaceRange(surface_id2, surface_id1), 2u);
   surface_layer_impl->SetBackgroundColor(SK_ColorBLUE);
+  CopyProperties(impl.root_layer(), surface_layer_impl);
 
   gfx::Size viewport_size(1000, 1000);
   impl.CalcDrawProps(viewport_size);
@@ -175,11 +175,11 @@
 // correctly.
 TEST(SurfaceLayerImplTest, SurfaceLayerImplsWithDeadlines) {
   LayerTestCommon::LayerImplTest impl;
-  SurfaceLayerImpl* surface_layer_impl =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl = impl.AddLayer<SurfaceLayerImpl>();
+  CopyProperties(impl.root_layer(), surface_layer_impl);
 
-  SurfaceLayerImpl* surface_layer_impl2 =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl2 = impl.AddLayer<SurfaceLayerImpl>();
+  CopyProperties(impl.root_layer(), surface_layer_impl2);
 
   const viz::LocalSurfaceId kArbitraryLocalSurfaceId1(
       1, base::UnguessableToken::Create());
@@ -219,8 +219,7 @@
 // and fallback viz::SurfaceInfo.
 TEST(SurfaceLayerImplTest, SurfaceLayerImplWithMatchingPrimaryAndFallback) {
   LayerTestCommon::LayerImplTest impl;
-  SurfaceLayerImpl* surface_layer_impl =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl = impl.AddLayer<SurfaceLayerImpl>();
 
   // Populate the primary viz::SurfaceId.
   const viz::LocalSurfaceId kArbitraryLocalSurfaceId1(
@@ -236,6 +235,7 @@
   surface_layer_impl->SetRange(viz::SurfaceRange(surface_id1), 1u);
   surface_layer_impl->SetRange(viz::SurfaceRange(surface_id1), 2u);
   surface_layer_impl->SetBackgroundColor(SK_ColorBLUE);
+  CopyProperties(impl.root_layer(), surface_layer_impl);
 
   gfx::Size viewport_size(1000, 1000);
   impl.CalcDrawProps(viewport_size);
@@ -260,10 +260,10 @@
   gfx::Size layer_size(902, 1000);
   gfx::Size viewport_size(902, 1000);
   LayerTestCommon::LayerImplTest impl;
-  SurfaceLayerImpl* surface_layer_impl =
-      impl.AddChildToRoot<SurfaceLayerImpl>();
+  SurfaceLayerImpl* surface_layer_impl = impl.AddLayer<SurfaceLayerImpl>();
   surface_layer_impl->SetBounds(layer_size);
   surface_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), surface_layer_impl);
 
   // A device scale of 1.33 and transform of 1.5 were chosen as they produce
   // different results when rounding at each stage, vs applying a single
diff --git a/cc/layers/texture_layer_impl_unittest.cc b/cc/layers/texture_layer_impl_unittest.cc
index 13a352cd..09479159 100644
--- a/cc/layers/texture_layer_impl_unittest.cc
+++ b/cc/layers/texture_layer_impl_unittest.cc
@@ -28,10 +28,11 @@
 
   LayerTestCommon::LayerImplTest impl;
 
-  TextureLayerImpl* layer = impl.AddChildToRoot<TextureLayerImpl>();
+  TextureLayerImpl* layer = impl.AddLayer<TextureLayerImpl>();
   layer->SetBounds(layer_bounds);
   layer->draw_properties().visible_layer_rect = layer_rect;
   layer->SetBlendBackgroundColor(true);
+  CopyProperties(impl.root_layer(), layer);
 
   // Verify initial conditions.
   EXPECT_FALSE(layer->contents_opaque());
@@ -59,13 +60,13 @@
                      gpu::CommandBufferId::FromUnsafeValue(0x234), 0x456),
       layer_size, false /* is_overlay_candidate */);
 
-  TextureLayerImpl* texture_layer_impl =
-      impl.AddChildToRoot<TextureLayerImpl>();
+  TextureLayerImpl* texture_layer_impl = impl.AddLayer<TextureLayerImpl>();
   texture_layer_impl->SetBounds(layer_size);
   texture_layer_impl->SetDrawsContent(true);
   texture_layer_impl->SetTransferableResource(
       resource,
       viz::SingleReleaseCallback::Create(base::BindOnce(&IgnoreCallback)));
+  CopyProperties(impl.root_layer(), texture_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
@@ -119,8 +120,7 @@
                      gpu::CommandBufferId::FromUnsafeValue(0x234), 0x456);
   resource.mailbox_holder.texture_target = GL_TEXTURE_2D;
 
-  TextureLayerImpl* texture_layer_impl =
-      impl.AddChildToRoot<TextureLayerImpl>();
+  TextureLayerImpl* texture_layer_impl = impl.AddLayer<TextureLayerImpl>();
   texture_layer_impl->SetBounds(layer_size);
   texture_layer_impl->SetDrawsContent(true);
   texture_layer_impl->SetTransferableResource(
@@ -128,6 +128,7 @@
                     [](bool* released, const gpu::SyncToken& sync_token,
                        bool lost) { *released = true; },
                     base::Unretained(&released))));
+  CopyProperties(impl.root_layer(), texture_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
diff --git a/cc/layers/ui_resource_layer_impl_unittest.cc b/cc/layers/ui_resource_layer_impl_unittest.cc
index db2f6d2..81d599be 100644
--- a/cc/layers/ui_resource_layer_impl_unittest.cc
+++ b/cc/layers/ui_resource_layer_impl_unittest.cc
@@ -23,7 +23,7 @@
 namespace cc {
 namespace {
 
-std::unique_ptr<UIResourceLayerImpl> GenerateUIResourceLayer(
+UIResourceLayerImpl* GenerateUIResourceLayer(
     FakeUIResourceLayerTreeHostImpl* host_impl,
     const gfx::Size& bitmap_size,
     const gfx::Size& layer_size,
@@ -41,15 +41,18 @@
   host_impl->CreateUIResource(uid, bitmap);
   layer->SetUIResourceId(uid);
 
-  return layer;
+  host_impl->active_tree()->property_trees()->clear();
+  auto* layer_ptr = layer.get();
+  SetupRootProperties(layer_ptr);
+  host_impl->active_tree()->SetRootLayerForTesting(std::move(layer));
+  UpdateDrawProperties(host_impl->active_tree());
+
+  return layer_ptr;
 }
 
 void QuadSizeTest(FakeUIResourceLayerTreeHostImpl* host_impl,
-                  std::unique_ptr<UIResourceLayerImpl> layer,
+                  UIResourceLayerImpl* layer,
                   size_t expected_quad_size) {
-  host_impl->active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl->active_tree()->BuildPropertyTreesForTesting();
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
 
   AppendQuadsData data;
@@ -79,9 +82,9 @@
   size_t expected_quad_size = 1;
   bool opaque = true;
   UIResourceId uid = 1;
-  std::unique_ptr<UIResourceLayerImpl> layer =
+  auto* layer =
       GenerateUIResourceLayer(&host_impl, bitmap_size, layer_size, opaque, uid);
-  QuadSizeTest(&host_impl, std::move(layer), expected_quad_size);
+  QuadSizeTest(&host_impl, layer, expected_quad_size);
   host_impl.DeleteUIResource(uid);
 
   // Make sure we're not appending quads when there are invalid values.
@@ -92,16 +95,13 @@
                                   layer_size,
                                   opaque,
                                   uid);
-  QuadSizeTest(&host_impl, std::move(layer), expected_quad_size);
+  QuadSizeTest(&host_impl, layer, expected_quad_size);
   host_impl.DeleteUIResource(uid);
 }
 
 void NeedsBlendingTest(FakeUIResourceLayerTreeHostImpl* host_impl,
-                       std::unique_ptr<UIResourceLayerImpl> layer,
+                       UIResourceLayerImpl* layer,
                        bool needs_blending) {
-  host_impl->active_tree()->SetRootLayerForTesting(std::move(layer));
-  host_impl->active_tree()->BuildPropertyTreesForTesting();
-
   std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
 
   AppendQuadsData data;
@@ -132,9 +132,9 @@
   gfx::Size layer_size(100, 100);
   bool opaque = false;
   UIResourceId uid = 1;
-  std::unique_ptr<UIResourceLayerImpl> layer =
+  auto* layer =
       GenerateUIResourceLayer(&host_impl, bitmap_size, layer_size, opaque, uid);
-  NeedsBlendingTest(&host_impl, std::move(layer), !opaque);
+  NeedsBlendingTest(&host_impl, layer, !opaque);
   host_impl.DeleteUIResource(uid);
 
   opaque = true;
@@ -143,7 +143,7 @@
                                   layer_size,
                                   opaque,
                                   uid);
-  NeedsBlendingTest(&host_impl, std::move(layer), !opaque);
+  NeedsBlendingTest(&host_impl, layer, !opaque);
   host_impl.DeleteUIResource(uid);
 }
 
@@ -161,18 +161,18 @@
   gfx::Size layer_size(100, 100);
   bool skbitmap_opaque = false;
   UIResourceId uid = 1;
-  std::unique_ptr<UIResourceLayerImpl> layer = GenerateUIResourceLayer(
-      &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid);
+  auto* layer = GenerateUIResourceLayer(&host_impl, bitmap_size, layer_size,
+                                        skbitmap_opaque, uid);
   bool opaque = false;
   layer->SetContentsOpaque(opaque);
-  NeedsBlendingTest(&host_impl, std::move(layer), !opaque);
+  NeedsBlendingTest(&host_impl, layer, !opaque);
   host_impl.DeleteUIResource(uid);
 
   opaque = true;
   layer = GenerateUIResourceLayer(
       &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid);
   layer->SetContentsOpaque(true);
-  NeedsBlendingTest(&host_impl, std::move(layer), !opaque);
+  NeedsBlendingTest(&host_impl, layer, !opaque);
   host_impl.DeleteUIResource(uid);
 }
 
@@ -194,6 +194,7 @@
   ui_resource_layer_impl->SetBounds(layer_size);
   ui_resource_layer_impl->SetDrawsContent(true);
   ui_resource_layer_impl->SetUIResourceId(uid);
+  CopyProperties(impl.root_layer(), ui_resource_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
diff --git a/cc/layers/video_layer_impl_unittest.cc b/cc/layers/video_layer_impl_unittest.cc
index a84a559..24e7534 100644
--- a/cc/layers/video_layer_impl_unittest.cc
+++ b/cc/layers/video_layer_impl_unittest.cc
@@ -48,10 +48,11 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->set_visible_layer_rect(gfx::Rect(layer_size));
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
 
@@ -105,25 +106,20 @@
   auto* active_tree = impl.host_impl()->active_tree();
 
   // Create a video layer with no frame on top of another layer.
-  std::unique_ptr<LayerImpl> layer_impl = LayerImpl::Create(active_tree, 3);
-  layer_impl->test_properties()->force_render_surface = true;
-  layer_impl->SetBounds(layer_size);
-  layer_impl->SetDrawsContent(true);
-  const auto& draw_properties = layer_impl->draw_properties();
+  LayerImpl* root = impl.root_layer();
+  root->SetBounds(layer_size);
+  root->SetDrawsContent(true);
+  const auto& draw_properties = root->draw_properties();
 
   FakeVideoFrameProvider provider;
-  std::unique_ptr<VideoLayerImpl> video_layer_impl = VideoLayerImpl::Create(
-      active_tree, 4, &provider, media::VIDEO_ROTATION_0);
+  VideoLayerImpl* video_layer_impl =
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->SetContentsOpaque(true);
+  CopyProperties(root, video_layer_impl);
 
-  layer_impl->test_properties()->AddChild(std::move(video_layer_impl));
-  active_tree->SetRootLayerForTesting(std::move(layer_impl));
-
-  active_tree->BuildLayerListAndPropertyTreesForTesting();
-
-  active_tree->UpdateDrawProperties();
+  impl.CalcDrawProps(layer_size);
 
   // We don't have a frame yet, so the video doesn't occlude the layer below it.
   EXPECT_FALSE(draw_properties.occlusion_in_content_space.IsOccluded(visible));
@@ -145,7 +141,8 @@
 
   FakeVideoFrameProvider provider;
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   VideoFrameProviderClientImpl* client =
       static_cast<VideoFrameProviderClientImpl*>(provider.client());
@@ -170,9 +167,10 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
   gfx::Rect occluded;
@@ -206,9 +204,10 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_90);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_90);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
   gfx::Rect occluded;
@@ -242,9 +241,10 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_180);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_180);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
   gfx::Rect occluded;
@@ -278,9 +278,10 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_270);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_270);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
+  CopyProperties(impl.root_layer(), video_layer_impl);
 
   impl.CalcDrawProps(viewport_size);
   gfx::Rect occluded;
@@ -317,11 +318,13 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->set_visible_layer_rect(gfx::Rect(layer_size));
-  impl.host_impl()->active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  CopyProperties(impl.root_layer(), video_layer_impl);
+
+  impl.CalcDrawProps(layer_size);
 
   gfx::Rect occluded;
   impl.AppendQuadsWithOcclusion(video_layer_impl, occluded);
@@ -355,11 +358,13 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->set_visible_layer_rect(gfx::Rect(layer_size));
-  impl.host_impl()->active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  CopyProperties(impl.root_layer(), video_layer_impl);
+
+  impl.CalcDrawProps(layer_size);
 
   gfx::Rect occluded;
   impl.AppendQuadsWithOcclusion(video_layer_impl, occluded);
@@ -397,11 +402,12 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->set_visible_layer_rect(gfx::Rect(layer_size));
-  impl.host_impl()->active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  CopyProperties(impl.root_layer(), video_layer_impl);
+  impl.CalcDrawProps(layer_size);
 
   gfx::Rect occluded;
   impl.AppendQuadsWithOcclusion(video_layer_impl, occluded);
@@ -440,11 +446,13 @@
   provider.set_frame(video_frame);
 
   VideoLayerImpl* video_layer_impl =
-      impl.AddChildToRoot<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
+      impl.AddLayer<VideoLayerImpl>(&provider, media::VIDEO_ROTATION_0);
   video_layer_impl->SetBounds(layer_size);
   video_layer_impl->SetDrawsContent(true);
   video_layer_impl->set_visible_layer_rect(gfx::Rect(layer_size));
-  impl.host_impl()->active_tree()->BuildLayerListAndPropertyTreesForTesting();
+  CopyProperties(impl.root_layer(), video_layer_impl);
+
+  impl.CalcDrawProps(layer_size);
 
   gfx::Rect occluded;
   impl.AppendQuadsWithOcclusion(video_layer_impl, occluded);
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index d6c35ef..89b1012 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -17,16 +17,9 @@
 
 namespace cc {
 
-constexpr const char* FrameSequenceTracker::kFrameSequenceTrackerTypeNames[] = {
-    [FrameSequenceTrackerType::kCompositorAnimation] = "CompositorAnimation",
-    [FrameSequenceTrackerType::kMainThreadAnimation] = "MainThreadAnimation",
-    [FrameSequenceTrackerType::kPinchZoom] = "PinchZoom",
-    [FrameSequenceTrackerType::kRAF] = "RAF",
-    [FrameSequenceTrackerType::kTouchScroll] = "TouchScroll",
-    [FrameSequenceTrackerType::kVideo] = "Video",
-    [FrameSequenceTrackerType::kWheelScroll] = "WheelScroll",
-    [FrameSequenceTrackerType::kMaxType] = "",
-};
+const char* const FrameSequenceTracker::kFrameSequenceTrackerTypeNames[] = {
+    "CompositorAnimation", "MainThreadAnimation", "PinchZoom", "RAF",
+    "TouchScroll",         "WheelScroll",         ""};
 
 namespace {
 
diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h
index bea4723..3d56a1d 100644
--- a/cc/metrics/frame_sequence_tracker.h
+++ b/cc/metrics/frame_sequence_tracker.h
@@ -37,7 +37,6 @@
   kPinchZoom,
   kRAF,
   kTouchScroll,
-  kVideo,
   kWheelScroll,
   kMaxType
 };
diff --git a/cc/test/fake_layer_tree_host_impl.cc b/cc/test/fake_layer_tree_host_impl.cc
index 426bc84f..53b1d28 100644
--- a/cc/test/fake_layer_tree_host_impl.cc
+++ b/cc/test/fake_layer_tree_host_impl.cc
@@ -16,7 +16,7 @@
 FakeLayerTreeHostImpl::FakeLayerTreeHostImpl(
     TaskRunnerProvider* task_runner_provider,
     TaskGraphRunner* task_graph_runner)
-    : FakeLayerTreeHostImpl(LayerTreeSettings(),
+    : FakeLayerTreeHostImpl(LayerListSettings(),
                             task_runner_provider,
                             task_graph_runner) {}
 
@@ -89,16 +89,6 @@
   WillBeginImplFrame(next_begin_frame_args);
 }
 
-void FakeLayerTreeHostImpl::UpdateNumChildrenAndDrawPropertiesForActiveTree() {
-  UpdateNumChildrenAndDrawProperties(active_tree());
-}
-
-void FakeLayerTreeHostImpl::UpdateNumChildrenAndDrawProperties(
-    LayerTreeImpl* layerTree) {
-  layerTree->BuildLayerListAndPropertyTreesForTesting();
-  layerTree->UpdateDrawProperties();
-}
-
 AnimationHost* FakeLayerTreeHostImpl::animation_host() const {
   return static_cast<AnimationHost*>(mutator_host());
 }
diff --git a/cc/test/fake_layer_tree_host_impl.h b/cc/test/fake_layer_tree_host_impl.h
index 0209988..9f05dc5 100644
--- a/cc/test/fake_layer_tree_host_impl.h
+++ b/cc/test/fake_layer_tree_host_impl.h
@@ -40,8 +40,6 @@
   void NotifyTileStateChanged(const Tile* tile) override;
   viz::BeginFrameArgs CurrentBeginFrameArgs() const override;
   void AdvanceToNextFrame(base::TimeDelta advance_by);
-  void UpdateNumChildrenAndDrawPropertiesForActiveTree();
-  static void UpdateNumChildrenAndDrawProperties(LayerTreeImpl* layerTree);
 
   using LayerTreeHostImpl::ActivateSyncTree;
   using LayerTreeHostImpl::prepare_tiles_needed;
diff --git a/cc/test/fake_picture_layer_impl.h b/cc/test/fake_picture_layer_impl.h
index 0581e25a..24a2a2d 100644
--- a/cc/test/fake_picture_layer_impl.h
+++ b/cc/test/fake_picture_layer_impl.h
@@ -183,7 +183,6 @@
 // as FakePictureLayerImplWithRasterSource::Create() in some templates.
 class FakePictureLayerImplWithRasterSource : public FakePictureLayerImpl {
  public:
-  // Create layer from a raster source that covers the entire layer.
   static std::unique_ptr<FakePictureLayerImplWithRasterSource> Create(
       LayerTreeImpl* tree_impl,
       int id,
@@ -195,6 +194,35 @@
   }
 };
 
+// An adapter so that FakePictureLayerImpl::CreateMask can be used as
+// FakePictureLayerImplAsMask::Create() in some templates.
+class FakePictureLayerImplAsMask : public FakePictureLayerImpl {
+ public:
+  static std::unique_ptr<FakePictureLayerImplAsMask> Create(
+      LayerTreeImpl* tree_impl,
+      int id) {
+    return base::WrapUnique(static_cast<FakePictureLayerImplAsMask*>(
+        FakePictureLayerImpl::CreateMask(tree_impl, id).release()));
+  }
+};
+
+// An adapter so that FakePictureLayerImpl::CreateMaskWithRasterSource can be
+// used as FakePictureLayerImplWithRasterSourceAsMask::Create() in some
+// templates.
+class FakePictureLayerImplWithRasterSourceAsMask : public FakePictureLayerImpl {
+ public:
+  static std::unique_ptr<FakePictureLayerImplWithRasterSourceAsMask> Create(
+      LayerTreeImpl* tree_impl,
+      int id,
+      scoped_refptr<RasterSource> raster_source) {
+    return base::WrapUnique(
+        static_cast<FakePictureLayerImplWithRasterSourceAsMask*>(
+            FakePictureLayerImpl::CreateMaskWithRasterSource(
+                tree_impl, id, std::move(raster_source))
+                .release()));
+  }
+};
+
 }  // namespace cc
 
 #endif  // CC_TEST_FAKE_PICTURE_LAYER_IMPL_H_
diff --git a/cc/test/layer_test_common.cc b/cc/test/layer_test_common.cc
index 025525f6..dc83773 100644
--- a/cc/test/layer_test_common.cc
+++ b/cc/test/layer_test_common.cc
@@ -118,11 +118,11 @@
 }
 
 LayerTestCommon::LayerImplTest::LayerImplTest()
-    : LayerImplTest(LayerTreeSettings()) {}
+    : LayerImplTest(LayerListSettings()) {}
 
 LayerTestCommon::LayerImplTest::LayerImplTest(
     std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink)
-    : LayerImplTest(LayerTreeSettings(), std::move(layer_tree_frame_sink)) {}
+    : LayerImplTest(LayerListSettings(), std::move(layer_tree_frame_sink)) {}
 
 LayerTestCommon::LayerImplTest::LayerImplTest(const LayerTreeSettings& settings)
     : LayerImplTest(settings, FakeLayerTreeFrameSink::Create3d()) {}
@@ -140,6 +140,9 @@
       layer_impl_id_(2) {
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl()->active_tree(), 1);
+  root->SetBounds(gfx::Size(1, 1));
+  if (settings.use_layer_lists)
+    SetupRootProperties(root.get());
   host_impl()->active_tree()->SetRootLayerForTesting(std::move(root));
   host_impl()->SetVisible(true);
   EXPECT_TRUE(host_impl()->InitializeFrameSink(layer_tree_frame_sink_.get()));
@@ -160,17 +163,22 @@
 
 LayerImpl* LayerTestCommon::LayerImplTest::EnsureRootLayerInPendingTree() {
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
-  if (LayerImpl* root = pending_tree->root_layer_for_testing())
+  auto* root = pending_tree->root_layer_for_testing();
+  if (root)
     return root;
   pending_tree->SetRootLayerForTesting(LayerImpl::Create(pending_tree, 1));
-  return pending_tree->root_layer_for_testing();
+  root = pending_tree->root_layer_for_testing();
+  root->SetBounds(gfx::Size(1, 1));
+  if (host()->IsUsingLayerLists())
+    SetupRootProperties(root);
+  return root;
 }
 
 void LayerTestCommon::LayerImplTest::CalcDrawProps(
     const gfx::Size& viewport_size) {
   RenderSurfaceList render_surface_list;
   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root_layer_for_testing(), gfx::Rect(viewport_size), &render_surface_list);
+      root_layer(), gfx::Rect(viewport_size), &render_surface_list);
   inputs.update_layer_list = &update_layer_impl_list_;
   LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
 }
@@ -226,7 +234,7 @@
 }
 
 void LayerTestCommon::LayerImplTest::RequestCopyOfOutput() {
-  root_layer_for_testing()->test_properties()->copy_requests.push_back(
+  root_layer()->test_properties()->copy_requests.push_back(
       viz::CopyOutputRequest::CreateStubForTesting());
 }
 
@@ -286,8 +294,7 @@
   LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
 }
 
-void LayerTestCommon::LayerImplTest::UpdateDrawProperties(
-    LayerTreeImpl* layer_tree_impl) {
+void UpdateDrawProperties(LayerTreeImpl* layer_tree_impl) {
   LayerTreeHostCommon::PrepareForUpdateDrawPropertiesForTesting(
       layer_tree_impl);
   layer_tree_impl->UpdateDrawProperties();
diff --git a/cc/test/layer_test_common.h b/cc/test/layer_test_common.h
index 257711d3..2c84bcd 100644
--- a/cc/test/layer_test_common.h
+++ b/cc/test/layer_test_common.h
@@ -47,10 +47,8 @@
 class LayerTreeFrameSink;
 class RenderSurfaceImpl;
 
-class LayerListSettings : public LayerTreeSettings {
- public:
-  LayerListSettings() { use_layer_lists = true; }
-};
+// Updates draw properties after prepared for testing.
+void UpdateDrawProperties(LayerTreeImpl*);
 
 class LayerTestCommon {
  public:
@@ -106,12 +104,23 @@
       return ptr;
     }
 
-    template <typename T>
-    T* AddMaskLayer(LayerImpl* origin) {
+    template <typename T, typename... Args>
+    T* AddMaskLayer(LayerImpl* origin, Args&&... args) {
       std::unique_ptr<T> layer =
-          T::Create(host_impl()->active_tree(), layer_impl_id_++);
+          T::Create(host_impl()->active_tree(), layer_impl_id_++,
+                    std::forward<Args>(args)...);
+      layer->SetBounds(origin->bounds());
       T* ptr = layer.get();
       origin->test_properties()->SetMaskLayer(std::move(layer));
+      if (host_impl()->active_tree()->settings().use_layer_lists) {
+        auto* origin_effect = GetEffectNode(origin);
+        origin_effect->render_surface_reason = RenderSurfaceReason::kMask;
+        origin_effect->is_masked = true;
+        origin_effect->mask_layer_id = ptr->id();
+        origin_effect->unscaled_mask_target_size = origin->bounds();
+        ptr->SetOffsetToTransformParent(origin->offset_to_transform_parent());
+        CopyProperties(origin, ptr);
+      }
       return ptr;
     }
 
@@ -132,7 +141,7 @@
     viz::ClientResourceProvider* resource_provider() const {
       return host_impl()->resource_provider();
     }
-    LayerImpl* root_layer_for_testing() const {
+    LayerImpl* root_layer() const {
       return host_impl()->active_tree()->root_layer_for_testing();
     }
     FakeLayerTreeHost* host() { return host_.get(); }
@@ -144,10 +153,6 @@
     scoped_refptr<AnimationTimeline> timeline() { return timeline_; }
     scoped_refptr<AnimationTimeline> timeline_impl() { return timeline_impl_; }
 
-    void BuildPropertyTreesForTesting() {
-      host_impl()->active_tree()->BuildPropertyTreesForTesting();
-    }
-
     void SetElementIdsForTesting() {
       host_impl()->active_tree()->SetElementIdsForTesting();
     }
@@ -167,9 +172,6 @@
     void ExecuteCalculateDrawPropertiesWithoutAdjustingRasterScales(
         LayerImpl* root_layer);
 
-    // This function updates draw properties through LayerTreeImpl API.
-    void UpdateDrawProperties(LayerTreeImpl*);
-
     const RenderSurfaceList* render_surface_list_impl() const {
       return render_surface_list_impl_.get();
     }
diff --git a/cc/test/layer_tree_json_parser_unittest.cc b/cc/test/layer_tree_json_parser_unittest.cc
index 94719747..7b1c552 100644
--- a/cc/test/layer_tree_json_parser_unittest.cc
+++ b/cc/test/layer_tree_json_parser_unittest.cc
@@ -7,11 +7,8 @@
 #include <stddef.h>
 
 #include "cc/layers/layer.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/geometry_test_utils.h"
-#include "cc/test/test_task_graph_runner.h"
+#include "cc/test/layer_test_common.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cc {
@@ -56,51 +53,43 @@
 
 }  // namespace
 
-class LayerTreeJsonParserSanityCheck : public testing::Test {
-};
+class LayerTreeJsonParserSanityCheck : public LayerTestCommon::LayerImplTest,
+                                       public testing::Test {};
 
 TEST_F(LayerTreeJsonParserSanityCheck, Basic) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  LayerTreeImpl* tree = host_impl.active_tree();
+  LayerTreeImpl* tree = host_impl()->active_tree();
 
-  std::unique_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
-  std::unique_ptr<LayerImpl> parent(LayerImpl::Create(tree, 2));
-  std::unique_ptr<LayerImpl> child(LayerImpl::Create(tree, 3));
+  auto* root = root_layer();
+  auto* parent = AddLayer<LayerImpl>();
+  auto* child = AddLayer<LayerImpl>();
 
-  root_impl->SetBounds(gfx::Size(100, 100));
+  root->SetBounds(gfx::Size(100, 100));
   parent->SetBounds(gfx::Size(50, 50));
   child->SetBounds(gfx::Size(40, 40));
 
+  CopyProperties(root, parent);
+  parent->SetOffsetToTransformParent(gfx::Vector2dF(25.f, 25.f));
+
   gfx::Transform translate;
   translate.Translate(10, 15);
-  child->test_properties()->transform = translate;
+  CopyProperties(parent, child);
+  CreateTransformNode(child).local = translate;
 
-  parent->test_properties()->position = gfx::PointF(25.f, 25.f);
-
-  parent->test_properties()->AddChild(std::move(child));
-  root_impl->test_properties()->AddChild(std::move(parent));
-  tree->SetRootLayerForTesting(std::move(root_impl));
-  tree->BuildPropertyTreesForTesting();
+  UpdateDrawProperties(tree);
 
   std::string json = tree->LayerTreeAsJson();
-  scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr);
-  ASSERT_TRUE(root.get());
-  EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(),
-                              root.get()));
+  scoped_refptr<Layer> new_root = ParseTreeFromJson(json, nullptr);
+  ASSERT_TRUE(new_root.get());
+  EXPECT_TRUE(LayerTreesMatch(root, new_root.get()));
 }
 
 TEST_F(LayerTreeJsonParserSanityCheck, EventHandlerRegions) {
-  FakeImplTaskRunnerProvider task_runner_provider;
-  TestTaskGraphRunner task_graph_runner;
-  FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner);
-  LayerTreeImpl* tree = host_impl.active_tree();
+  LayerTreeImpl* tree = host_impl()->active_tree();
 
-  std::unique_ptr<LayerImpl> root_impl(LayerImpl::Create(tree, 1));
-  std::unique_ptr<LayerImpl> touch_layer(LayerImpl::Create(tree, 2));
+  auto* root = root_layer();
+  auto* touch_layer = AddLayer<LayerImpl>();
 
-  root_impl->SetBounds(gfx::Size(100, 100));
+  root->SetBounds(gfx::Size(100, 100));
   touch_layer->SetBounds(gfx::Size(50, 50));
 
   TouchActionRegion touch_action_region;
@@ -108,15 +97,13 @@
   touch_action_region.Union(kTouchActionNone, gfx::Rect(40, 10, 20, 20));
   touch_layer->SetTouchActionRegion(std::move(touch_action_region));
 
-  root_impl->test_properties()->AddChild(std::move(touch_layer));
-  tree->SetRootLayerForTesting(std::move(root_impl));
-  tree->BuildPropertyTreesForTesting();
+  CopyProperties(root, touch_layer);
+  UpdateDrawProperties(tree);
 
   std::string json = tree->LayerTreeAsJson();
-  scoped_refptr<Layer> root = ParseTreeFromJson(json, nullptr);
-  ASSERT_TRUE(root.get());
-  EXPECT_TRUE(LayerTreesMatch(host_impl.active_tree()->root_layer_for_testing(),
-                              root.get()));
+  scoped_refptr<Layer> new_root = ParseTreeFromJson(json, nullptr);
+  ASSERT_TRUE(new_root.get());
+  EXPECT_TRUE(LayerTreesMatch(root, new_root.get()));
 }
 
 }  // namespace cc
diff --git a/cc/test/property_tree_test_utils.h b/cc/test/property_tree_test_utils.h
index 34992e7..295d5c3 100644
--- a/cc/test/property_tree_test_utils.h
+++ b/cc/test/property_tree_test_utils.h
@@ -117,6 +117,34 @@
   GetPropertyTrees(layer)->effect_tree.set_needs_update(true);
 }
 
+// This will affect all layers associated with this layer's effect node.
+template <typename LayerType>
+void SetRenderSurfaceReason(const LayerType* layer,
+                            RenderSurfaceReason reason) {
+  auto* effect_node = GetEffectNode(layer);
+  effect_node->render_surface_reason = reason;
+  effect_node->effect_changed = true;
+  GetPropertyTrees(layer)->effect_tree.set_needs_update(true);
+}
+
+// This will affect all layers associated with this layer's effect node.
+template <typename LayerType>
+void SetBackdropFilter(const LayerType* layer,
+                       const FilterOperations& filters) {
+  auto* effect_node = GetEffectNode(layer);
+  effect_node->backdrop_filters = filters;
+  effect_node->effect_changed = true;
+  GetPropertyTrees(layer)->effect_tree.set_needs_update(true);
+}
+
+// This will affect all layers associated with this layer's clip node.
+template <typename LayerType>
+void SetClipRect(const LayerType* layer, const gfx::RectF& clip) {
+  auto* clip_node = GetClipNode(layer);
+  clip_node->clip = clip;
+  GetPropertyTrees(layer)->clip_tree.set_needs_update(true);
+}
+
 // Creates viewport layers and (in layer list mode) paint properties.
 // Convenient overload of the method below that creates a scrolling layer as
 // the outer viewport scroll layer. The inner viewport size will be
diff --git a/cc/test/test_layer_tree_host_base.cc b/cc/test/test_layer_tree_host_base.cc
index f6dd334..e03c7aa 100644
--- a/cc/test/test_layer_tree_host_base.cc
+++ b/cc/test/test_layer_tree_host_base.cc
@@ -8,6 +8,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "cc/test/fake_layer_tree_frame_sink.h"
 #include "cc/test/fake_raster_source.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/trees/layer_tree_impl.h"
 
 namespace cc {
@@ -17,9 +18,8 @@
       pending_layer_(nullptr),
       active_layer_(nullptr),
       old_pending_layer_(nullptr),
-      root_id_(6),
-      page_scale_id_(7),
-      id_(8) {}
+      root_id_(1),
+      next_layer_id_(2) {}
 
 TestLayerTreeHostBase::~TestLayerTreeHostBase() = default;
 
@@ -33,8 +33,7 @@
 }
 
 LayerTreeSettings TestLayerTreeHostBase::CreateSettings() {
-  LayerTreeSettings settings;
-  return settings;
+  return LayerListSettings();
 }
 
 std::unique_ptr<LayerTreeFrameSink>
@@ -110,72 +109,70 @@
 
   // Steal from the recycled tree if possible.
   LayerImpl* pending_root = pending_tree->root_layer_for_testing();
-  std::unique_ptr<LayerImpl> page_scale_layer;
-  std::unique_ptr<FakePictureLayerImpl> pending_layer;
+  DCHECK(!pending_layer_);
   DCHECK(!pending_root || pending_root->id() == root_id_);
+
   if (!pending_root) {
-    std::unique_ptr<LayerImpl> new_pending_root =
-        LayerImpl::Create(pending_tree, root_id_);
-    page_scale_layer = LayerImpl::Create(pending_tree, page_scale_id_);
+    pending_tree->SetRootLayerForTesting(
+        LayerImpl::Create(pending_tree, root_id_));
+    pending_root = pending_tree->root_layer_for_testing();
+
+    auto* page_scale_layer = AddLayer<LayerImpl>(pending_tree);
+
     switch (mask_type) {
       case Layer::LayerMaskType::NOT_MASK:
-        pending_layer = FakePictureLayerImpl::Create(pending_tree, id_);
+        pending_layer_ = AddLayer<FakePictureLayerImpl>(pending_tree);
         break;
       case Layer::LayerMaskType::SINGLE_TEXTURE_MASK:
-        pending_layer = FakePictureLayerImpl::CreateMask(pending_tree, id_);
+        pending_layer_ = AddLayer<FakePictureLayerImplAsMask>(pending_tree);
         break;
       default:
         NOTREACHED();
     }
-    if (!tile_size.IsEmpty())
-      pending_layer->set_fixed_tile_size(tile_size);
-    pending_layer->SetDrawsContent(true);
-    pending_layer->SetScrollable(gfx::Size(1, 1));
-    pending_root = new_pending_root.get();
-    pending_tree->SetRootLayerForTesting(std::move(new_pending_root));
+    pending_layer_->SetDrawsContent(true);
+    pending_layer_->SetScrollable(gfx::Size(1, 1));
+
+    pending_tree->SetElementIdsForTesting();
+    SetupRootProperties(pending_root);
+    CopyProperties(pending_root, page_scale_layer);
+    CreateTransformNode(page_scale_layer).in_subtree_of_page_scale_layer = true;
+    CopyProperties(page_scale_layer, pending_layer_);
+    CreateTransformNode(pending_layer_);
+    CreateScrollNode(pending_layer_);
+
+    LayerTreeImpl::ViewportLayerIds viewport_ids;
+    viewport_ids.page_scale = page_scale_layer->id();
+    pending_tree->SetViewportLayersFromIds(viewport_ids);
   } else {
-    page_scale_layer.reset(
-        pending_root->test_properties()
-            ->RemoveChild(pending_root->test_properties()->children[0])
-            .release());
-    pending_layer.reset(static_cast<FakePictureLayerImpl*>(
-        page_scale_layer->test_properties()
-            ->RemoveChild(page_scale_layer->test_properties()->children[0])
-            .release()));
-    if (!tile_size.IsEmpty())
-      pending_layer->set_fixed_tile_size(tile_size);
+    pending_layer_ = old_pending_layer_;
+    old_pending_layer_ = nullptr;
   }
-  pending_root->test_properties()->force_render_surface = true;
+
+  if (!tile_size.IsEmpty())
+    pending_layer_->set_fixed_tile_size(tile_size);
+
   // The bounds() just mirror the raster source size.
-  pending_layer->SetBounds(raster_source->GetSize());
-  pending_layer->SetRasterSourceOnPending(raster_source, invalidation);
+  if (raster_source) {
+    pending_layer_->SetBounds(raster_source->GetSize());
+    pending_layer_->SetRasterSourceOnPending(raster_source, invalidation);
+  }
 
-  page_scale_layer->test_properties()->AddChild(std::move(pending_layer));
-  pending_root->test_properties()->AddChild(std::move(page_scale_layer));
-
-  LayerTreeImpl::ViewportLayerIds viewport_ids;
-  viewport_ids.page_scale = page_scale_id_;
-  pending_tree->SetViewportLayersFromIds(viewport_ids);
-
-  pending_layer_ = static_cast<FakePictureLayerImpl*>(
-      host_impl()->pending_tree()->LayerById(id_));
-
-  // Add tilings/tiles for the layer.
-  RebuildPropertyTreesOnPendingTree();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  host_impl()->pending_tree()->set_needs_update_draw_properties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 }
 
 void TestLayerTreeHostBase::ActivateTree() {
-  RebuildPropertyTreesOnPendingTree();
+  UpdateDrawProperties(host_impl()->pending_tree());
+
   host_impl()->ActivateSyncTree();
   CHECK(!host_impl()->pending_tree());
   CHECK(host_impl()->recycle_tree());
   old_pending_layer_ = pending_layer_;
   pending_layer_ = nullptr;
   active_layer_ = static_cast<FakePictureLayerImpl*>(
-      host_impl()->active_tree()->LayerById(id_));
+      host_impl()->active_tree()->LayerById(old_pending_layer_->id()));
 
-  host_impl()->active_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
 }
 
 void TestLayerTreeHostBase::PerformImplSideInvalidation() {
@@ -190,11 +187,6 @@
   old_pending_layer_ = nullptr;
 }
 
-void TestLayerTreeHostBase::RebuildPropertyTreesOnPendingTree() {
-  host_impl()->pending_tree()->property_trees()->needs_rebuild = true;
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-}
-
 void TestLayerTreeHostBase::SetInitialTreePriority() {
   GlobalStateThatImpactsTilePriority state;
 
@@ -209,4 +201,9 @@
   host_impl_->tile_manager()->SetGlobalStateForTesting(state);
 }
 
+void TestLayerTreeHostBase::ResetTrees() {
+  host_impl_->ResetTreesForTesting();
+  pending_layer_ = old_pending_layer_ = active_layer_ = nullptr;
+}
+
 }  // namespace cc
diff --git a/cc/test/test_layer_tree_host_base.h b/cc/test/test_layer_tree_host_base.h
index 802ee0f..db0432ec 100644
--- a/cc/test/test_layer_tree_host_base.h
+++ b/cc/test/test_layer_tree_host_base.h
@@ -10,6 +10,7 @@
 #include "cc/test/fake_impl_task_runner_provider.h"
 #include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/fake_picture_layer_impl.h"
+#include "cc/test/property_tree_test_utils.h"
 #include "cc/test/test_task_graph_runner.h"
 #include "cc/tiles/tile_priority.h"
 #include "cc/trees/layer_tree_frame_sink.h"
@@ -41,7 +42,7 @@
   void SetupDefaultTrees(const gfx::Size& layer_bounds);
   void SetupTrees(scoped_refptr<RasterSource> pending_raster_source,
                   scoped_refptr<RasterSource> active_raster_source);
-  void SetupPendingTree(scoped_refptr<RasterSource> raster_source);
+  void SetupPendingTree(scoped_refptr<RasterSource> raster_source = nullptr);
   void SetupPendingTree(
       scoped_refptr<RasterSource> raster_source,
       const gfx::Size& tile_size,
@@ -49,7 +50,6 @@
       Layer::LayerMaskType mask_type = Layer::LayerMaskType::NOT_MASK);
   void ActivateTree();
   void PerformImplSideInvalidation();
-  void RebuildPropertyTreesOnPendingTree();
 
   FakeLayerTreeHostImpl* host_impl() const { return host_impl_.get(); }
   TaskGraphRunner* task_graph_runner() const {
@@ -61,7 +61,38 @@
   FakePictureLayerImpl* pending_layer() const { return pending_layer_; }
   FakePictureLayerImpl* active_layer() const { return active_layer_; }
   FakePictureLayerImpl* old_pending_layer() const { return old_pending_layer_; }
-  int layer_id() const { return id_; }
+
+  // Clear all layer trees and property trees for repeated testing.
+  void ResetTrees();
+
+  template <typename T, typename... Args>
+  T* AddLayer(LayerTreeImpl* layer_tree_impl, Args&&... args) {
+    std::unique_ptr<T> layer = T::Create(layer_tree_impl, next_layer_id_++,
+                                         std::forward<Args>(args)...);
+    T* result = layer.get();
+    layer_tree_impl->root_layer_for_testing()->test_properties()->AddChild(
+        std::move(layer));
+    return result;
+  }
+
+  template <typename T, typename... Args>
+  T* AddMaskLayer(LayerTreeImpl* layer_tree_impl,
+                  LayerImpl* masked_layer,
+                  Args&&... args) {
+    std::unique_ptr<T> mask = T::Create(layer_tree_impl, next_layer_id_++,
+                                        std::forward<Args>(args)...);
+    T* result = mask.get();
+    masked_layer->test_properties()->SetMaskLayer(std::move(mask));
+    CopyProperties(masked_layer, result);
+    auto* masked_effect = GetEffectNode(masked_layer);
+    masked_effect->render_surface_reason = RenderSurfaceReason::kMask;
+    masked_effect->mask_layer_id = result->id();
+    masked_effect->is_masked = true;
+    GetPropertyTrees(masked_layer)->effect_tree.AddMaskLayerId(result->id());
+    return result;
+  }
+
+  int root_id() const { return root_id_; }
 
  private:
   void SetInitialTreePriority();
@@ -75,8 +106,7 @@
   FakePictureLayerImpl* active_layer_;
   FakePictureLayerImpl* old_pending_layer_;
   const int root_id_;
-  const int page_scale_id_;
-  const int id_;
+  int next_layer_id_;
 };
 
 }  // namespace cc
diff --git a/cc/tiles/tile_manager_perftest.cc b/cc/tiles/tile_manager_perftest.cc
index f1b36e4e..5f9a0b5b 100644
--- a/cc/tiles/tile_manager_perftest.cc
+++ b/cc/tiles/tile_manager_perftest.cc
@@ -21,6 +21,7 @@
 #include "cc/test/fake_tile_manager.h"
 #include "cc/test/fake_tile_manager_client.h"
 #include "cc/test/fake_tile_task_manager.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/test/test_layer_tree_host_base.h"
 #include "cc/test/test_task_graph_runner.h"
 #include "cc/test/test_tile_priorities.h"
@@ -207,12 +208,12 @@
 
     // Adjust the width and height to account for the fact that tiles
     // are bigger than 1x1.
-    LayerTreeSettings settings;
+    LayerListSettings settings;
     width *= settings.default_tile_size.width();
     height *= settings.default_tile_size.height();
 
     // Ensure that we start with blank trees and no tiles.
-    host_impl()->ResetTreesForTesting();
+    ResetTrees();
 
     gfx::Size layer_bounds(width, height);
     gfx::Rect viewport(width / 5, height / 5);
@@ -224,26 +225,22 @@
 
     // Pending layer counts as one layer.
     layers.push_back(pending_layer());
-    int next_id = layer_id() + 1;
 
     // Create the rest of the layers as children of the root layer.
     scoped_refptr<FakeRasterSource> raster_source =
         FakeRasterSource::CreateFilledWithImages(layer_bounds);
     while (static_cast<int>(layers.size()) < layer_count) {
-      std::unique_ptr<FakePictureLayerImpl> child_layer =
-          FakePictureLayerImpl::CreateWithRasterSource(
-              host_impl()->pending_tree(), next_id, raster_source);
+      auto* child_layer = AddLayer<FakePictureLayerImplWithRasterSource>(
+          host_impl()->pending_tree(), raster_source);
       child_layer->SetBounds(layer_bounds);
       child_layer->SetDrawsContent(true);
-      layers.push_back(child_layer.get());
-      pending_layer()->test_properties()->AddChild(std::move(child_layer));
-      ++next_id;
+      layers.push_back(child_layer);
+      CopyProperties(pending_layer(), child_layer);
     }
 
     // Property trees need to be rebuilt because layers were added above.
-    host_impl()->pending_tree()->property_trees()->needs_rebuild = true;
-    host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-    host_impl()->pending_tree()->UpdateDrawProperties();
+    host_impl()->pending_tree()->set_needs_update_draw_properties();
+    UpdateDrawProperties(host_impl()->pending_tree());
     for (FakePictureLayerImpl* layer : layers)
       layer->CreateAllTiles();
 
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index df7e2d8..3fe29b0 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -30,6 +30,7 @@
 #include "cc/test/fake_recording_source.h"
 #include "cc/test/fake_tile_manager.h"
 #include "cc/test/fake_tile_task_manager.h"
+#include "cc/test/layer_test_common.h"
 #include "cc/test/skia_common.h"
 #include "cc/test/test_layer_tree_host_base.h"
 #include "cc/test/test_task_graph_runner.h"
@@ -88,7 +89,7 @@
 class TileManagerTilePriorityQueueTest : public TestLayerTreeHostBase {
  public:
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings;
+    auto settings = TestLayerTreeHostBase::CreateSettings();
     settings.create_low_res_tiling = true;
     return settings;
   }
@@ -616,19 +617,15 @@
   // Create a pending child layer.
   scoped_refptr<FakeRasterSource> pending_raster_source =
       FakeRasterSource::CreateFilled(layer_bounds);
-  std::unique_ptr<FakePictureLayerImpl> pending_child =
-      FakePictureLayerImpl::CreateWithRasterSource(
-          host_impl()->pending_tree(), layer_id() + 1, pending_raster_source);
-  FakePictureLayerImpl* pending_child_raw = pending_child.get();
-  pending_child_raw->SetDrawsContent(true);
-  pending_layer()->test_properties()->AddChild(std::move(pending_child));
+  auto* pending_child = AddLayer<FakePictureLayerImplWithRasterSource>(
+      host_impl()->pending_tree(), pending_raster_source);
+  pending_child->SetDrawsContent(true);
+  CopyProperties(pending_layer(), pending_child);
 
   // Set a small viewport, so we have soon and eventually tiles.
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(200, 200));
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->property_trees()->needs_rebuild = true;
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   host_impl()->SetRequiresHighResToDraw();
   std::unique_ptr<RasterTilePriorityQueue> queue(host_impl()->BuildRasterQueue(
@@ -836,21 +833,14 @@
       FakeRasterSource::CreateFilled(layer_bounds);
   SetupPendingTree(pending_raster_source);
 
-  std::unique_ptr<FakePictureLayerImpl> pending_child =
-      FakePictureLayerImpl::CreateWithRasterSource(host_impl()->pending_tree(),
-                                                   2, pending_raster_source);
-  int child_id = pending_child->id();
-  pending_layer()->test_properties()->AddChild(std::move(pending_child));
-
-  FakePictureLayerImpl* pending_child_layer =
-      static_cast<FakePictureLayerImpl*>(
-          pending_layer()->test_properties()->children[0]);
+  auto* pending_child_layer = AddLayer<FakePictureLayerImplWithRasterSource>(
+      host_impl()->pending_tree(), pending_raster_source);
+  int child_id = pending_child_layer->id();
   pending_child_layer->SetDrawsContent(true);
+  CopyProperties(pending_layer(), pending_child_layer);
 
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->property_trees()->needs_rebuild = true;
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   ActivateTree();
   SetupPendingTree(pending_raster_source);
@@ -950,21 +940,20 @@
       FakeRasterSource::CreateFilled(layer_bounds);
   SetupPendingTree(pending_raster_source);
 
-  std::unique_ptr<FakePictureLayerImpl> pending_child =
-      FakePictureLayerImpl::CreateWithRasterSource(host_impl()->pending_tree(),
-                                                   2, pending_raster_source);
-  FakePictureLayerImpl* pending_child_layer = pending_child.get();
-  pending_layer()->test_properties()->AddChild(std::move(pending_child));
+  auto* pending_child_layer = AddLayer<FakePictureLayerImplWithRasterSource>(
+      host_impl()->pending_tree(), pending_raster_source);
+  pending_child_layer->SetElementId(
+      LayerIdToElementIdForTesting(pending_child_layer->id()));
+  CopyProperties(pending_layer(), pending_child_layer);
 
   // Create a fully transparent child layer so that its tile priorities are not
   // considered to be valid.
   pending_child_layer->SetDrawsContent(true);
-  pending_child_layer->test_properties()->force_render_surface = true;
+  CreateEffectNode(pending_child_layer).render_surface_reason =
+      RenderSurfaceReason::kTest;
 
   host_impl()->AdvanceToNextFrame(base::TimeDelta::FromMilliseconds(1));
-  host_impl()->pending_tree()->property_trees()->needs_rebuild = true;
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   host_impl()->pending_tree()->SetOpacityMutated(
       pending_child_layer->element_id(), 0.0f);
@@ -1052,13 +1041,11 @@
   EXPECT_EQ(16u, tile_count);
 
   for (int i = 1; i < 10; ++i) {
-    std::unique_ptr<FakePictureLayerImpl> pending_child_layer =
-        FakePictureLayerImpl::Create(host_impl()->pending_tree(),
-                                     layer_id() + i);
+    auto* pending_child_layer =
+        AddLayer<FakePictureLayerImpl>(host_impl()->pending_tree());
     pending_child_layer->SetDrawsContent(true);
     pending_child_layer->set_has_valid_tile_priorities(true);
-    pending_layer()->test_properties()->AddChild(
-        std::move(pending_child_layer));
+    CopyProperties(pending_layer(), pending_child_layer);
   }
 
   queue = host_impl()->BuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES,
@@ -1102,13 +1089,11 @@
   host_impl()->tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
 
   for (int i = 1; i < 10; ++i) {
-    std::unique_ptr<FakePictureLayerImpl> pending_child_layer =
-        FakePictureLayerImpl::Create(host_impl()->pending_tree(),
-                                     layer_id() + i);
+    auto* pending_child_layer =
+        AddLayer<FakePictureLayerImpl>(host_impl()->pending_tree());
     pending_child_layer->SetDrawsContent(true);
     pending_child_layer->set_has_valid_tile_priorities(true);
-    pending_layer()->test_properties()->AddChild(
-        std::move(pending_child_layer));
+    CopyProperties(pending_layer(), pending_child_layer);
   }
 
   std::unique_ptr<EvictionTilePriorityQueue> queue(
@@ -1850,7 +1835,7 @@
   }
 
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings = TileManagerTest::CreateSettings();
+    auto settings = TileManagerTest::CreateSettings();
     settings.gpu_rasterization_forced = true;
     return settings;
   }
@@ -1906,7 +1891,7 @@
 class PartialRasterTileManagerTest : public TileManagerTest {
  public:
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings = TileManagerTest::CreateSettings();
+    auto settings = TileManagerTest::CreateSettings();
     settings.use_partial_raster = true;
     return settings;
   }
@@ -1941,11 +1926,11 @@
 
   // The bounds() just mirror the raster source size.
   pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
+  SetupRootProperties(pending_layer.get());
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
 
   // Add tilings/tiles for the layer.
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Build the raster queue and invalidate the top tile.
   std::unique_ptr<RasterTilePriorityQueue> queue(host_impl()->BuildRasterQueue(
@@ -2039,11 +2024,11 @@
 
   // The bounds() just mirror the raster source size.
   pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
+  SetupRootProperties(pending_layer.get());
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
 
   // Add tilings/tiles for the layer.
-  host_impl->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(pending_tree);
 
   // Build the raster queue and invalidate the top tile.
   std::unique_ptr<RasterTilePriorityQueue> queue(host_impl->BuildRasterQueue(
@@ -2124,11 +2109,11 @@
 
   // The bounds() just mirror the raster source size.
   pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
+  SetupRootProperties(pending_layer.get());
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
 
   // Add tilings/tiles for the layer.
-  host_impl->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(pending_tree);
 
   // Build the raster queue and invalidate the top tile if partial raster is
   // enabled.
@@ -2337,11 +2322,6 @@
     recording_source_->Rerecord();
   }
 
-  LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings;
-    return settings;
-  }
-
   void SetupTreesWithActiveTreeTiles() {
     scoped_refptr<RasterSource> active_tree_raster_source =
         recording_source_->CreateRasterSource();
@@ -2561,8 +2541,8 @@
   EXPECT_GT(orig_num_required, 0u);
 
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(layer_bounds));
-  host_impl()->active_tree()->UpdateDrawProperties();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->active_tree());
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Rerun prepare tiles.
   {
@@ -2711,7 +2691,7 @@
   }
 
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings;
+    auto settings = TestLayerTreeHostBase::CreateSettings();
     settings.commit_to_active_tree = false;
     settings.enable_checker_imaging = true;
     settings.min_image_bytes_to_checker = 512 * 1024;
@@ -2797,7 +2777,7 @@
 class EmptyCacheTileManagerTest : public TileManagerTest {
  public:
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings;
+    auto settings = TileManagerTest::CreateSettings();
     settings.decoded_image_working_set_budget_bytes = 0;
     return settings;
   }
@@ -3325,7 +3305,7 @@
   }
 
   LayerTreeSettings CreateSettings() override {
-    LayerTreeSettings settings = TestLayerTreeHostBase::CreateSettings();
+    auto settings = TestLayerTreeHostBase::CreateSettings();
     settings.max_preraster_distance_in_screen_pixels = 100;
     return settings;
   }
@@ -3410,11 +3390,11 @@
   // The bounds() are half the recording source size, allowing for prepaint
   // images.
   pending_layer->SetBounds(gfx::Size(500, 500));
+  SetupRootProperties(pending_layer.get());
   pending_tree->SetRootLayerForTesting(std::move(pending_layer));
 
   // Add tilings/tiles for the layer.
-  host_impl()->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
-  host_impl()->pending_tree()->UpdateDrawProperties();
+  UpdateDrawProperties(host_impl()->pending_tree());
 
   // Build the raster queue and invalidate the top tile if partial raster is
   // enabled.
diff --git a/cc/trees/damage_tracker.cc b/cc/trees/damage_tracker.cc
index 743b681..85e9cd7 100644
--- a/cc/trees/damage_tracker.cc
+++ b/cc/trees/damage_tracker.cc
@@ -25,8 +25,7 @@
   return base::WrapUnique(new DamageTracker());
 }
 
-DamageTracker::DamageTracker() : mailboxId_(0) {}
-
+DamageTracker::DamageTracker() = default;
 DamageTracker::~DamageTracker() = default;
 
 void DamageTracker::UpdateDamageTracking(
diff --git a/cc/trees/damage_tracker.h b/cc/trees/damage_tracker.h
index bda7579c..1851a09 100644
--- a/cc/trees/damage_tracker.h
+++ b/cc/trees/damage_tracker.h
@@ -148,10 +148,10 @@
   SortedRectMapForLayers rect_history_for_layers_;
   SortedRectMapForSurfaces rect_history_for_surfaces_;
 
-  unsigned int mailboxId_;
+  unsigned int mailboxId_ = 0;
   DamageAccumulator current_damage_;
   // Damage from contributing render surface and layer
-  bool has_damage_from_contributing_content_;
+  bool has_damage_from_contributing_content_ = false;
 
   // Damage accumulated since the last call to PrepareForUpdate().
   DamageAccumulator damage_for_this_update_;
diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc
index f5bb60b..458cba49 100644
--- a/cc/trees/damage_tracker_unittest.cc
+++ b/cc/trees/damage_tracker_unittest.cc
@@ -10,11 +10,8 @@
 #include "cc/layers/layer_impl.h"
 #include "cc/paint/filter_operation.h"
 #include "cc/paint/filter_operations.h"
-#include "cc/test/fake_impl_task_runner_provider.h"
-#include "cc/test/fake_layer_tree_host_impl.h"
 #include "cc/test/geometry_test_utils.h"
 #include "cc/test/layer_test_common.h"
-#include "cc/test/test_task_graph_runner.h"
 #include "cc/trees/layer_tree_host_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/single_thread_proxy.h"
@@ -28,7 +25,10 @@
 
 class TestLayerImpl : public LayerImpl {
  public:
-  TestLayerImpl(LayerTreeImpl* tree_impl, int id);
+  static std::unique_ptr<TestLayerImpl> Create(LayerTreeImpl* tree_impl,
+                                               int id) {
+    return base::WrapUnique(new TestLayerImpl(tree_impl, id));
+  }
 
   void AddDamageRect(const gfx::Rect& damage_rect);
 
@@ -37,6 +37,8 @@
   void ResetChangeTracking() override;
 
  private:
+  TestLayerImpl(LayerTreeImpl* tree_impl, int id);
+
   gfx::Rect damage_rect_;
 };
 
@@ -56,21 +58,6 @@
   damage_rect_.SetRect(0, 0, 0, 0);
 }
 
-void ExecuteCalculateDrawProperties(LayerImpl* root,
-                                    float device_scale_factor,
-                                    RenderSurfaceList* render_surface_list) {
-  // Sanity check: The test itself should create the root layer's render
-  //               surface, so that the surface (and its damage tracker) can
-  //               persist across multiple calls to this function.
-  ASSERT_FALSE(render_surface_list->size());
-
-  LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      root, gfx::Rect(root->bounds()), device_scale_factor,
-      render_surface_list);
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
-  ASSERT_TRUE(GetRenderSurface(root));
-}
-
 void ClearDamageForAllSurfaces(LayerImpl* root) {
   for (auto* layer : *root->layer_tree_impl()) {
     if (GetRenderSurface(layer))
@@ -78,48 +65,29 @@
   }
 }
 
-void EmulateDrawingOneFrame(LayerImpl* root, float device_scale_factor = 1.f) {
-  // This emulates only steps that are relevant to testing the damage tracker:
-  //   1. computing the render passes and layerlists
-  //   2. updating all damage trackers in the correct order
-  //   3. resetting all update_rects and property_changed flags for all layers
-  //      and surfaces.
-
-  RenderSurfaceList render_surface_list;
-  ExecuteCalculateDrawProperties(root, device_scale_factor,
-                                 &render_surface_list);
-
-  DamageTracker::UpdateDamageTracking(root->layer_tree_impl(),
-                                      render_surface_list);
-
-  root->layer_tree_impl()->ResetAllChangeTracking();
-}
-
-class DamageTrackerTest : public testing::Test {
+class DamageTrackerTest : public LayerTestCommon::LayerImplTest,
+                          public testing::Test {
  public:
-  DamageTrackerTest()
-      : host_impl_(&task_runner_provider_, &task_graph_runner_) {}
-
   LayerImpl* CreateTestTreeWithOneSurface(int number_of_children) {
-    host_impl_.active_tree()->DetachLayers();
-    auto root = std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 1);
+    ClearLayersAndProperties();
 
+    LayerImpl* root = root_layer();
     root->SetBounds(gfx::Size(500, 500));
     root->SetDrawsContent(true);
-    root->test_properties()->force_render_surface = true;
+    SetupRootProperties(root);
 
+    child_layers_.resize(number_of_children);
     for (int i = 0; i < number_of_children; ++i) {
-      auto child =
-          std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 2 + i);
-      child->test_properties()->position = gfx::PointF(100.f, 100.f);
+      auto* child = AddLayer<TestLayerImpl>();
       child->SetBounds(gfx::Size(30, 30));
       child->SetDrawsContent(true);
-      root->test_properties()->AddChild(std::move(child));
+      child_layers_[i] = child;
+      CopyProperties(root, child);
+      child->SetOffsetToTransformParent(gfx::Vector2dF(100.f, 100.f));
     }
-    host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
-    host_impl_.active_tree()->SetElementIdsForTesting();
+    SetElementIdsForTesting();
 
-    return host_impl_.active_tree()->root_layer_for_testing();
+    return root;
   }
 
   LayerImpl* CreateTestTreeWithTwoSurfaces() {
@@ -127,47 +95,46 @@
     // child1. Additionally, the root has a second child layer, and child1 has
     // two children of its own.
 
-    host_impl_.active_tree()->DetachLayers();
-    auto root = std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 1);
-    auto child1 = std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 2);
-    auto child2 = std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 3);
-    auto grand_child1 =
-        std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 4);
-    auto grand_child2 =
-        std::make_unique<TestLayerImpl>(host_impl_.active_tree(), 5);
+    ClearLayersAndProperties();
 
+    LayerImpl* root = root_layer();
     root->SetBounds(gfx::Size(500, 500));
     root->SetDrawsContent(true);
-    root->test_properties()->force_render_surface = true;
+    SetupRootProperties(root);
 
-    child1->test_properties()->position = gfx::PointF(100.f, 100.f);
-    child1->SetBounds(gfx::Size(30, 30));
+    child1_ = AddLayer<TestLayerImpl>();
+    grand_child1_ = AddLayer<TestLayerImpl>();
+    grand_child2_ = AddLayer<TestLayerImpl>();
+    child2_ = AddLayer<TestLayerImpl>();
+    SetElementIdsForTesting();
+
+    child1_->SetBounds(gfx::Size(30, 30));
     // With a child that draws_content, opacity will cause the layer to create
     // its own RenderSurface. This layer does not draw, but is intended to
     // create its own RenderSurface.
-    child1->SetDrawsContent(false);
-    child1->test_properties()->force_render_surface = true;
+    child1_->SetDrawsContent(false);
+    CopyProperties(root, child1_);
+    CreateTransformNode(child1_).post_translation =
+        gfx::Vector2dF(100.f, 100.f);
+    CreateEffectNode(child1_).render_surface_reason =
+        RenderSurfaceReason::kTest;
 
-    child2->test_properties()->position = gfx::PointF(11.f, 11.f);
-    child2->SetBounds(gfx::Size(18, 18));
-    child2->SetDrawsContent(true);
+    grand_child1_->SetBounds(gfx::Size(6, 8));
+    grand_child1_->SetDrawsContent(true);
+    CopyProperties(child1_, grand_child1_);
+    grand_child1_->SetOffsetToTransformParent(gfx::Vector2dF(200.f, 200.f));
 
-    grand_child1->test_properties()->position = gfx::PointF(200.f, 200.f);
-    grand_child1->SetBounds(gfx::Size(6, 8));
-    grand_child1->SetDrawsContent(true);
+    grand_child2_->SetBounds(gfx::Size(6, 8));
+    grand_child2_->SetDrawsContent(true);
+    CopyProperties(child1_, grand_child2_);
+    grand_child2_->SetOffsetToTransformParent(gfx::Vector2dF(190.f, 190.f));
 
-    grand_child2->test_properties()->position = gfx::PointF(190.f, 190.f);
-    grand_child2->SetBounds(gfx::Size(6, 8));
-    grand_child2->SetDrawsContent(true);
+    child2_->SetBounds(gfx::Size(18, 18));
+    child2_->SetDrawsContent(true);
+    CopyProperties(root, child2_);
+    child2_->SetOffsetToTransformParent(gfx::Vector2dF(11.f, 11.f));
 
-    child1->test_properties()->AddChild(std::move(grand_child1));
-    child1->test_properties()->AddChild(std::move(grand_child2));
-    root->test_properties()->AddChild(std::move(child1));
-    root->test_properties()->AddChild(std::move(child2));
-    host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
-    host_impl_.active_tree()->SetElementIdsForTesting();
-
-    return host_impl_.active_tree()->root_layer_for_testing();
+    return root;
   }
 
   LayerImpl* CreateAndSetUpTestTreeWithOneSurface(int number_of_children = 1) {
@@ -175,7 +142,6 @@
 
     // Setup includes going past the first frame which always damages
     // everything, so that we can actually perform specific tests.
-    root->layer_tree_impl()->property_trees()->needs_rebuild = true;
     EmulateDrawingOneFrame(root);
 
     return root;
@@ -186,16 +152,43 @@
 
     // Setup includes going past the first frame which always damages
     // everything, so that we can actually perform specific tests.
-    root->layer_tree_impl()->property_trees()->needs_rebuild = true;
     EmulateDrawingOneFrame(root);
 
     return root;
   }
 
+  void EmulateDrawingOneFrame(LayerImpl* root,
+                              float device_scale_factor = 1.f) {
+    // This emulates only steps that are relevant to testing the damage tracker:
+    //   1. computing the render passes and layerlists
+    //   2. updating all damage trackers in the correct order
+    //   3. resetting all update_rects and property_changed flags for all layers
+    //      and surfaces.
+
+    ExecuteCalculateDrawProperties(root, device_scale_factor);
+
+    DamageTracker::UpdateDamageTracking(root->layer_tree_impl(),
+                                        *render_surface_list_impl());
+
+    root->layer_tree_impl()->ResetAllChangeTracking();
+  }
+
  protected:
-  FakeImplTaskRunnerProvider task_runner_provider_;
-  TestTaskGraphRunner task_graph_runner_;
-  FakeLayerTreeHostImpl host_impl_;
+  void ClearLayersAndProperties() {
+    root_layer()->test_properties()->RemoveAllChildren();
+    host_impl()->active_tree()->property_trees()->clear();
+    child_layers_.clear();
+    child1_ = child2_ = grand_child1_ = grand_child2_ = nullptr;
+  }
+
+  // Stores result of CreateTestTreeWithOneSurface().
+  std::vector<TestLayerImpl*> child_layers_;
+
+  // Store result of CreateTestTreeWithTwoSurfaces().
+  TestLayerImpl* child1_ = nullptr;
+  TestLayerImpl* child2_ = nullptr;
+  TestLayerImpl* grand_child1_ = nullptr;
+  TestLayerImpl* grand_child2_ = nullptr;
 };
 
 TEST_F(DamageTrackerTest, SanityCheckTestTreeWithOneSurface) {
@@ -203,7 +196,7 @@
   // render surfaces.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   EXPECT_EQ(2, GetRenderSurface(root)->num_contributors());
   EXPECT_TRUE(root->contributes_to_drawn_render_surface());
@@ -225,23 +218,20 @@
 
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
 
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
-
   gfx::Rect child_damage_rect;
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   gfx::Rect root_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
 
-  EXPECT_NE(GetRenderSurface(child1), GetRenderSurface(root));
-  EXPECT_EQ(GetRenderSurface(child2), GetRenderSurface(root));
+  EXPECT_NE(GetRenderSurface(child1_), GetRenderSurface(root));
+  EXPECT_EQ(GetRenderSurface(child2_), GetRenderSurface(root));
   EXPECT_EQ(3, GetRenderSurface(root)->num_contributors());
-  EXPECT_EQ(2, GetRenderSurface(child1)->num_contributors());
+  EXPECT_EQ(2, GetRenderSurface(child1_)->num_contributors());
 
-  // The render surface for child1 only has a content_rect that encloses
-  // grand_child1 and grand_child2, because child1 does not draw content.
+  // The render surface for child1_ only has a content_rect that encloses
+  // grand_child1_ and grand_child2_, because child1_ does not draw content.
   EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
             child_damage_rect.ToString());
   EXPECT_EQ(gfx::Rect(500, 500).ToString(), root_damage_rect.ToString());
@@ -249,20 +239,19 @@
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageForUpdateRects) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // CASE 1: Setting the update rect should cause the corresponding damage to
   //         the surface.
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of update_rect (10, 11)
@@ -277,7 +266,6 @@
   //         damage.
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -288,7 +276,6 @@
   //         update region, but no additional exposed old region.
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(20, 25, 1, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of update_rect (20, 25)
@@ -303,14 +290,12 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForLayerDamageRects) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  auto* child =
-      static_cast<TestLayerImpl*>(root->test_properties()->children[0]);
+  TestLayerImpl* child = child_layers_[0];
 
   // CASE 1: Adding the layer damage rect should cause the corresponding damage
   // to the surface.
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of layer damage_rect
@@ -324,7 +309,6 @@
   // damage.
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -334,7 +318,6 @@
   // new damaged region, but no additional exposed old region.
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(20, 25, 1, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of layer damage_rect
@@ -348,7 +331,6 @@
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(20, 25, 1, 2));
   child->AddDamageRect(gfx::Rect(10, 15, 3, 4));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of layer damage_rect
@@ -364,15 +346,13 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForLayerUpdateAndDamageRects) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  auto* child =
-      static_cast<TestLayerImpl*>(root->test_properties()->children[0]);
+  TestLayerImpl* child = child_layers_[0];
 
   // CASE 1: Adding the layer damage rect and update rect should cause the
   // corresponding damage to the surface.
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(5, 6, 12, 13));
   child->SetUpdateRect(gfx::Rect(15, 16, 14, 10));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of unified layer
@@ -388,7 +368,6 @@
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(10, 11, 12, 13));
   child->SetUpdateRect(gfx::Rect(10, 11, 14, 15));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -399,7 +378,6 @@
   ClearDamageForAllSurfaces(root);
   child->AddDamageRect(gfx::Rect(20, 25, 2, 3));
   child->SetUpdateRect(gfx::Rect(5, 10, 7, 8));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of unified layer damage
@@ -414,12 +392,11 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForPropertyChanges) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // CASE 1: The layer's property changed flag takes priority over update rect.
   //
-  child->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
@@ -448,7 +425,6 @@
   // Cycle one frame of no change, just to sanity check that the next rect is
   // not because of the old damage state.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -456,6 +432,9 @@
 
   // Then, test the actual layer movement.
   ClearDamageForAllSurfaces(root);
+  CreateTransformNode(child).post_translation =
+      child->offset_to_transform_parent();
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
   gfx::Transform translation;
   translation.Translate(100.f, 130.f);
   root->layer_tree_impl()->SetTransformMutated(child->element_id(),
@@ -470,57 +449,53 @@
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  // Transform from browser animation should not be considered as damage from
-  // contributing layer since it is applied to the whole layer which has a
-  // render surface.
-  EXPECT_FALSE(GetRenderSurface(child)
-                   ->damage_tracker()
-                   ->has_damage_from_contributing_content());
+  // TODO(crbug.com/1001882): Transform from browser animation should not be
+  // considered as damage from contributing layer since it is applied to the
+  // whole layer which has a render surface.
+  EXPECT_TRUE(GetRenderSurface(child)
+                  ->damage_tracker()
+                  ->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest,
        VerifyDamageForPropertyChangesFromContributingContents) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
-  LayerImpl* grandchild1 = child1->test_properties()->children[0];
 
-  // CASE 1: The child1's opacity changed.
+  // CASE 1: child1_'s opacity changed.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->SetOpacityMutated(child1->element_id(), 0.5f);
+  root->layer_tree_impl()->SetOpacityMutated(child1_->element_id(), 0.5f);
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child1)
+  EXPECT_FALSE(GetRenderSurface(child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 
-  // CASE 2: The layer2's opacity changed.
-  child2->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  // CASE 2: layer2_'s opacity changed.
+  CreateEffectNode(child2_).render_surface_reason = RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->SetOpacityMutated(child2->element_id(), 0.5f);
+  root->layer_tree_impl()->SetOpacityMutated(child2_->element_id(), 0.5f);
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child1)
+  EXPECT_FALSE(GetRenderSurface(child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 
-  // CASE 3: The grandchild1's opacity changed.
-  grandchild1->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  // CASE 3: grand_child1_'s opacity changed.
+  CreateEffectNode(grand_child1_).render_surface_reason =
+      RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->SetOpacityMutated(grandchild1->element_id(), 0.5f);
+  root->layer_tree_impl()->SetOpacityMutated(grand_child1_->element_id(), 0.5f);
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
@@ -528,11 +503,12 @@
 // Regression test for http://crbug.com/923794
 TEST_F(DamageTrackerTest, EffectPropertyChangeNoSurface) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // Create a separate effect node for the child, but no render surface.
-  child->test_properties()->opacity = 0.5;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  auto& effect_node = CreateEffectNode(child);
+  effect_node.opacity = 0.5;
+  effect_node.has_potential_opacity_animation = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_EQ(root->transform_tree_index(), child->transform_tree_index());
@@ -550,13 +526,12 @@
 // Regression test for http://crbug.com/923794
 TEST_F(DamageTrackerTest, TransformPropertyChangeNoSurface) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // Create a separate transform node for the child, but no render surface.
   gfx::Transform trans1;
   trans1.Scale(2, 1);
-  child->test_properties()->transform = trans1;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateTransformNode(child).local = trans1;
   EmulateDrawingOneFrame(root);
 
   EXPECT_NE(root->transform_tree_index(), child->transform_tree_index());
@@ -576,66 +551,58 @@
 TEST_F(DamageTrackerTest,
        VerifyDamageForUpdateAndDamageRectsFromContributingContents) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  auto* child1 =
-      static_cast<TestLayerImpl*>(root->test_properties()->children[0]);
-  auto* child2 =
-      static_cast<TestLayerImpl*>(root->test_properties()->children[1]);
-  auto* grandchild1 =
-      static_cast<TestLayerImpl*>(child1->test_properties()->children[0]);
 
-  // CASE 1: Adding the layer1's damage rect and update rect should cause the
+  // CASE 1: Adding child1_'s damage rect and update rect should cause the
   // corresponding damage to the surface.
-  child1->SetDrawsContent(true);
+  child1_->SetDrawsContent(true);
   ClearDamageForAllSurfaces(root);
-  child1->AddDamageRect(gfx::Rect(105, 106, 12, 15));
-  child1->SetUpdateRect(gfx::Rect(115, 116, 12, 15));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  child1_->AddDamageRect(gfx::Rect(105, 106, 12, 15));
+  child1_->SetUpdateRect(gfx::Rect(115, 116, 12, 15));
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 
-  // CASE 2: Adding the layer2's damage rect and update rect should cause the
+  // CASE 2: Adding child2_'s damage rect and update rect should cause the
   // corresponding damage to the surface.
   ClearDamageForAllSurfaces(root);
-  child2->AddDamageRect(gfx::Rect(11, 11, 12, 15));
-  child2->SetUpdateRect(gfx::Rect(12, 12, 12, 15));
+  child2_->AddDamageRect(gfx::Rect(11, 11, 12, 15));
+  child2_->SetUpdateRect(gfx::Rect(12, 12, 12, 15));
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child1)
+  EXPECT_FALSE(GetRenderSurface(child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 
-  // CASE 3: Adding the grandchild1's damage rect and update rect should cause
+  // CASE 3: Adding grand_child1_'s damage rect and update rect should cause
   // the corresponding damage to the surface.
   ClearDamageForAllSurfaces(root);
-  grandchild1->AddDamageRect(gfx::Rect(1, 0, 2, 5));
-  grandchild1->SetUpdateRect(gfx::Rect(2, 1, 2, 5));
+  grand_child1_->AddDamageRect(gfx::Rect(1, 0, 2, 5));
+  grand_child1_->SetUpdateRect(gfx::Rect(2, 1, 2, 5));
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageWhenSurfaceRemoved) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* surface = root->test_properties()->children[0];
-  LayerImpl* child = surface->test_properties()->children[0];
+  LayerImpl* surface = child1_;
+  LayerImpl* child = grand_child1_;
   child->SetDrawsContent(true);
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
 
-  surface->test_properties()->force_render_surface = false;
+  SetRenderSurfaceReason(surface, RenderSurfaceReason::kNone);
   child->SetDrawsContent(false);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   gfx::Rect root_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -652,18 +619,20 @@
   // transformed layer.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
-  child->test_properties()->force_render_surface = true;
+  LayerImpl* child = child_layers_[0];
 
   gfx::Transform rotation;
   rotation.Rotate(45.0);
 
   ClearDamageForAllSurfaces(root);
-  child->test_properties()->transform_origin = gfx::Point3F(
-      child->bounds().width() * 0.5f, child->bounds().height() * 0.5f, 0.f);
-  child->test_properties()->position = gfx::PointF(85.f, 85.f);
+  auto& transform_node = CreateTransformNode(child);
+  transform_node.origin = gfx::Point3F(child->bounds().width() * 0.5f,
+                                       child->bounds().height() * 0.5f, 0.f);
+  transform_node.post_translation = gfx::Vector2dF(85.f, 85.f);
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
+  CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
+
   child->NoteLayerPropertyChanged();
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Sanity check that the layer actually moved to (85, 85), damaging its old
@@ -723,7 +692,7 @@
   //
 
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   gfx::Transform transform;
   transform.Translate3d(550.0, 500.0, 0.0);
@@ -732,23 +701,20 @@
   transform.Translate3d(-50.0, -50.0, 0.0);
 
   // Set up the child
-  child->test_properties()->position = gfx::PointF(0.f, 0.f);
   child->SetBounds(gfx::Size(100, 100));
-  child->test_properties()->transform = transform;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateTransformNode(child).local = transform;
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
   EmulateDrawingOneFrame(root);
 
   // Sanity check that the child layer's bounds would actually get clipped by
   // w < 0, otherwise this test is not actually testing the intended scenario.
-  gfx::RectF test_rect(child->test_properties()->position,
-                       gfx::SizeF(child->bounds()));
+  gfx::RectF test_rect(gfx::SizeF(child->bounds()));
   bool clipped = false;
   MathUtil::MapQuad(transform, gfx::QuadF(test_rect), &clipped);
   EXPECT_TRUE(clipped);
 
   // Damage the child without moving it.
-  child->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
   root->layer_tree_impl()->SetOpacityMutated(child->element_id(), 0.5f);
@@ -772,20 +738,20 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForBlurredSurface) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* surface = root->test_properties()->children[0];
-  LayerImpl* child = surface->test_properties()->children[0];
+  LayerImpl* surface = child1_;
+  LayerImpl* child = grand_child1_;
 
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(5.f));
 
-  // Setting the filter should not damage the conrresponding render surface.
+  // TODO(crbug.com/1001882): Setting the filter on an existing render surface
+  // should not damage the conrresponding render surface.
   ClearDamageForAllSurfaces(root);
-  surface->test_properties()->filters = filters;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  SetFilter(surface, filters);
   EmulateDrawingOneFrame(root);
-  EXPECT_FALSE(GetRenderSurface(root)
-                   ->damage_tracker()
-                   ->has_damage_from_contributing_content());
+  EXPECT_TRUE(GetRenderSurface(root)
+                  ->damage_tracker()
+                  ->has_damage_from_contributing_content());
   EXPECT_FALSE(GetRenderSurface(surface)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
@@ -794,7 +760,6 @@
   // surface, blurred based on the size of the blur filter.
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(1, 2, 3, 4));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Damage position on the surface should be: position of update_rect (1, 2)
@@ -814,7 +779,7 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForImageFilter) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
   gfx::Rect root_damage_rect, child_damage_rect;
 
   // Allow us to set damage on child too.
@@ -826,8 +791,10 @@
           2, 2, BlurPaintFilter::TileMode::kClampToBlack_TileMode, nullptr)));
 
   // Setting the filter will damage the whole surface.
-  child->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateTransformNode(child).post_translation =
+      child->offset_to_transform_parent();
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
+  CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   ClearDamageForAllSurfaces(root);
   child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
@@ -896,7 +863,7 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForTransformedImageFilter) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
   gfx::Rect root_damage_rect, child_damage_rect;
 
   // Allow us to set damage on child too.
@@ -911,9 +878,14 @@
   gfx::Transform transform;
   transform.RotateAboutYAxis(60);
   ClearDamageForAllSurfaces(root);
-  child->test_properties()->force_render_surface = true;
-  child->test_properties()->transform = transform;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  auto& transform_node = CreateTransformNode(child);
+  transform_node.local = transform;
+  transform_node.post_translation = child->offset_to_transform_parent();
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
+  auto& effect_node = CreateEffectNode(child);
+  effect_node.render_surface_reason = RenderSurfaceReason::kFilter;
+  effect_node.has_potential_filter_animation = true;
+
   EmulateDrawingOneFrame(root);
   child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
   EmulateDrawingOneFrame(root);
@@ -955,21 +927,27 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForHighDPIImageFilter) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
   gfx::Rect root_damage_rect, child_damage_rect;
 
+  ClearDamageForAllSurfaces(root);
+  int device_scale_factor = 2;
+  EmulateDrawingOneFrame(root, device_scale_factor);
+
   // Allow us to set damage on child too.
   child->SetDrawsContent(true);
 
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(3.f));
 
-  // Setting the filter will damage the whole surface.
+  // Setting the filter and creating a new render surface will damage the whole
+  // surface.
   ClearDamageForAllSurfaces(root);
-  child->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  int device_scale_factor = 2;
-  EmulateDrawingOneFrame(root, device_scale_factor);
+  CreateTransformNode(child).post_translation =
+      child->offset_to_transform_parent();
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
+  CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
+  ClearDamageForAllSurfaces(root);
   child->layer_tree_impl()->SetFilterMutated(child->element_id(), filters);
   EmulateDrawingOneFrame(root, device_scale_factor);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -979,14 +957,11 @@
 
   // Blur outset is 9px for a 3px blur, scaled up by DSF.
   int blur_outset = 9 * device_scale_factor;
-  gfx::Rect original_rect(100, 100, 100, 100);
   gfx::Rect expected_child_damage_rect(60, 60);
   expected_child_damage_rect.Inset(-blur_outset, -blur_outset);
   gfx::Rect expected_root_damage_rect(child_damage_rect);
   expected_root_damage_rect.Offset(200, 200);
-  gfx::Rect expected_total_damage_rect = expected_root_damage_rect;
-  expected_total_damage_rect.Union(original_rect);
-  EXPECT_EQ(expected_total_damage_rect, root_damage_rect);
+  EXPECT_EQ(expected_root_damage_rect, root_damage_rect);
   EXPECT_EQ(expected_child_damage_rect, child_damage_rect);
 
   // Setting the update rect should damage only the affected area (original,
@@ -1006,36 +981,32 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForBackdropBlurredChild) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
 
-  // Allow us to set damage on child1 too.
-  child1->SetDrawsContent(true);
+  // Allow us to set damage on child1_ too.
+  child1_->SetDrawsContent(true);
 
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(2.f));
 
   // Setting the filter will damage the whole surface.
   ClearDamageForAllSurfaces(root);
-  child1->test_properties()->backdrop_filters = filters;
-  child1->NoteLayerPropertyChanged();
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  SetBackdropFilter(child1_, filters);
+  child1_->NoteLayerPropertyChanged();
   EmulateDrawingOneFrame(root);
 
   // CASE 1: Setting the update rect should cause the corresponding damage to
   //         the surface, blurred based on the size of the child's backdrop
-  //         blur filter. Note that child1's render surface has a size of
-  //         206x208 due to contributions from grand_child1 and grand_child2.
+  //         blur filter. Note that child1_'s render surface has a size of
+  //         206x208 due to contributions from grand_child1_ and grand_child2_.
   ClearDamageForAllSurfaces(root);
   root->SetUpdateRect(gfx::Rect(297, 297, 2, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   gfx::Rect root_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
   // Damage position on the surface should be a composition of the damage on
-  // the root and on child2.  Damage on the root should be: position of
+  // the root and on child2_.  Damage on the root should be: position of
   // update_rect (297, 297), but expanded by the blur outsets.
   gfx::Rect expected_damage_rect = gfx::Rect(297, 297, 2, 2);
 
@@ -1049,13 +1020,12 @@
   //         of the blurred layer, only the left/top should end up expanded.
   ClearDamageForAllSurfaces(root);
   root->SetUpdateRect(gfx::Rect(297, 297, 30, 30));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
   // Damage position on the surface should be a composition of the damage on
-  // the root and on child2.  Damage on the root should be: position of
+  // the root and on child2_.  Damage on the root should be: position of
   // update_rect (297, 297), but expanded on the left/top by the blur outsets.
   expected_damage_rect = gfx::Rect(297, 297, 30, 30);
 
@@ -1064,10 +1034,9 @@
   EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
 
   // CASE 3: Setting this update rect outside the blurred content_bounds of the
-  //         blurred child1 will not cause it to be expanded.
+  //         blurred child1_ will not cause it to be expanded.
   ClearDamageForAllSurfaces(root);
   root->SetUpdateRect(gfx::Rect(30, 30, 2, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1079,11 +1048,10 @@
   EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
 
   // CASE 4: Setting this update rect inside the blurred content_bounds but
-  //         outside the original content_bounds of the blurred child1 will
+  //         outside the original content_bounds of the blurred child1_ will
   //         cause it to be expanded.
   ClearDamageForAllSurfaces(root);
   root->SetUpdateRect(gfx::Rect(99, 99, 1, 1));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1096,37 +1064,35 @@
   expected_damage_rect = gfx::Rect(99, 99, 7, 7);
   EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
 
-  // CASE 5: Setting the update rect on child2, which is above child1, will
-  // not get blurred by child1, so it does not need to get expanded.
+  // CASE 5: Setting the update rect on child2_, which is above child1_, will
+  // not get blurred by child1_, so it does not need to get expanded.
   ClearDamageForAllSurfaces(root);
-  child2->SetUpdateRect(gfx::Rect(1, 1));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  child2_->SetUpdateRect(gfx::Rect(1, 1));
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
-  // Damage on child2 should be: position of update_rect offset by the child's
+  // Damage on child2_ should be: position of update_rect offset by the child's
   // position (11, 11), and not expanded by anything.
   expected_damage_rect = gfx::Rect(11, 11, 1, 1);
 
   EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
 
-  // CASE 6: Setting the update rect on child1 will also blur the damage, so
+  // CASE 6: Setting the update rect on child1_ will also blur the damage, so
   //         that any pixels needed for the blur are redrawn in the current
   //         frame.
   ClearDamageForAllSurfaces(root);
-  child1->SetUpdateRect(gfx::Rect(1, 1));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  child1_->SetUpdateRect(gfx::Rect(1, 1));
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
-  // Damage on child1 should be: position of update_rect offset by the child's
+  // Damage on child1_ should be: position of update_rect offset by the child's
   // position (100, 100), and expanded by the damage.
 
-  // Damage should be (0,0 1x1), offset by the 100,100 offset of child1 in
+  // Damage should be (0,0 1x1), offset by the 100,100 offset of child1_ in
   // root, and expanded 6px for the 2px blur (i.e., 94,94 13x13), but there
-  // should be no damage outside child1 (i.e. none above or to the left of
+  // should be no damage outside child1_ (i.e. none above or to the left of
   // 100,100.
   expected_damage_rect = gfx::Rect(100, 100, 7, 7);
   EXPECT_EQ(expected_damage_rect.ToString(), root_damage_rect.ToString());
@@ -1134,17 +1100,20 @@
   // CASE 7: No changes, so should not damage the surface.
   ClearDamageForAllSurfaces(root);
   // We want to make sure that the backdrop filter doesn't cause empty damage
-  // to get expanded. We position child1 so that an expansion of the empty rect
-  // would have non-empty intersection with child1 in its target space (root
+  // to get expanded. We position child1_ so that an expansion of the empty rect
+  // would have non-empty intersection with child1_ in its target space (root
   // space).
-  child1->test_properties()->position = gfx::PointF();
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  SetPostTranslation(child1_, gfx::Vector2dF());
+  child1_->NoteLayerPropertyChanged();
+  // The first call clears the damage caused by the movement.
+  EmulateDrawingOneFrame(root);
+  ClearDamageForAllSurfaces(root);
   EmulateDrawingOneFrame(root);
 
   gfx::Rect child_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
 
   // Should not be expanded by the blur filter.
@@ -1154,20 +1123,17 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForAddingAndRemovingLayer) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child1 = root->test_properties()->children[0];
+  LayerImpl* child1 = child_layers_[0];
 
   // CASE 1: Adding a new layer should cause the appropriate damage.
   //
   ClearDamageForAllSurfaces(root);
-  {
-    std::unique_ptr<LayerImpl> child2 =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
-    child2->test_properties()->position = gfx::PointF(400.f, 380.f);
-    child2->SetBounds(gfx::Size(6, 8));
-    child2->SetDrawsContent(true);
-    root->test_properties()->AddChild(std::move(child2));
-  }
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+
+  LayerImpl* child2 = AddLayer<LayerImpl>();
+  child2->SetBounds(gfx::Size(6, 8));
+  child2->SetDrawsContent(true);
+  CopyProperties(root, child2);
+  child2->SetOffsetToTransformParent(gfx::Vector2dF(400.f, 380.f));
   EmulateDrawingOneFrame(root);
 
   // Sanity check - all 3 layers should be on the same render surface; render
@@ -1188,17 +1154,15 @@
   // Advance one frame without damage so that we know the damage rect is not
   // leftover from the previous case.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
   EXPECT_TRUE(root_damage_rect.IsEmpty());
 
-  // Then, test removing child1.
+  // Then, test removing child1_.
   root->test_properties()->RemoveChild(child1);
   child1 = nullptr;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1211,29 +1175,25 @@
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageForNewUnchangedLayer) {
-  // If child2 is added to the layer tree, but it doesn't have any explicit
+  // If child2_ is added to the layer tree, but it doesn't have any explicit
   // damage of its own, it should still indeed damage the target surface.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
 
   ClearDamageForAllSurfaces(root);
-  {
-    std::unique_ptr<LayerImpl> child2 =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
-    child2->test_properties()->position = gfx::PointF(400.f, 380.f);
-    child2->SetBounds(gfx::Size(6, 8));
-    child2->SetDrawsContent(true);
-    root->test_properties()->AddChild(std::move(child2));
-    root->layer_tree_impl()->BuildLayerListForTesting();
-    host_impl_.active_tree()->ResetAllChangeTracking();
-    LayerImpl* child2_ptr = host_impl_.active_tree()->LayerById(3);
-    // Sanity check the initial conditions of the test, if these asserts
-    // trigger, it means the test no longer actually covers the intended
-    // scenario.
-    ASSERT_FALSE(child2_ptr->LayerPropertyChanged());
-    ASSERT_TRUE(child2_ptr->update_rect().IsEmpty());
-  }
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+
+  LayerImpl* child2 = AddLayer<LayerImpl>();
+  child2->SetBounds(gfx::Size(6, 8));
+  child2->SetDrawsContent(true);
+  CopyProperties(root, child2);
+  child2->SetOffsetToTransformParent(gfx::Vector2dF(400.f, 380.f));
+  host_impl()->active_tree()->ResetAllChangeTracking();
+  // Sanity check the initial conditions of the test, if these asserts
+  // trigger, it means the test no longer actually covers the intended
+  // scenario.
+  ASSERT_FALSE(child2->LayerPropertyChanged());
+  ASSERT_TRUE(child2->update_rect().IsEmpty());
+
   EmulateDrawingOneFrame(root);
 
   // Sanity check - all 3 layers should be on the same render surface; render
@@ -1251,30 +1211,24 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForMultipleLayers) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child1 = root->test_properties()->children[0];
+  LayerImpl* child1 = child_layers_[0];
 
   // In this test we don't want the above tree manipulation to be considered
   // part of the same frame.
   ClearDamageForAllSurfaces(root);
-  {
-    std::unique_ptr<LayerImpl> child2 =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
-    child2->test_properties()->position = gfx::PointF(400.f, 380.f);
-    child2->SetBounds(gfx::Size(6, 8));
-    child2->SetDrawsContent(true);
-    root->test_properties()->AddChild(std::move(child2));
-  }
-  LayerImpl* child2 = root->test_properties()->children[1];
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  LayerImpl* child2 = AddLayer<LayerImpl>();
+  child2->SetBounds(gfx::Size(6, 8));
+  child2->SetDrawsContent(true);
+  CopyProperties(root, child2);
+  child2->SetOffsetToTransformParent(gfx::Vector2dF(400.f, 380.f));
   EmulateDrawingOneFrame(root);
 
   // Damaging two layers simultaneously should cause combined damage.
-  // - child1 update rect in surface space: gfx::Rect(100, 100, 1, 2);
-  // - child2 update rect in surface space: gfx::Rect(400, 380, 3, 4);
+  // - child1_ update rect in surface space: gfx::Rect(100, 100, 1, 2);
+  // - child2_ update rect in surface space: gfx::Rect(400, 380, 3, 4);
   ClearDamageForAllSurfaces(root);
   child1->SetUpdateRect(gfx::Rect(1, 2));
   child2->SetUpdateRect(gfx::Rect(3, 4));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   gfx::Rect root_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1288,13 +1242,9 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForNestedSurfaces) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
-  LayerImpl* grand_child1 =
-      root->test_properties()->children[0]->test_properties()->children[0];
-  child2->test_properties()->force_render_surface = true;
-  grand_child1->test_properties()->force_render_surface = true;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  CreateEffectNode(child2_).render_surface_reason = RenderSurfaceReason::kTest;
+  CreateEffectNode(grand_child1_).render_surface_reason =
+      RenderSurfaceReason::kTest;
   EmulateDrawingOneFrame(root);
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
@@ -1302,9 +1252,9 @@
   // CASE 1: Damage to a descendant surface should propagate properly to
   //         ancestor surface.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->SetOpacityMutated(grand_child1->element_id(), 0.5f);
+  root->layer_tree_impl()->SetOpacityMutated(grand_child1_->element_id(), 0.5f);
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1313,27 +1263,27 @@
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child2)
+  EXPECT_FALSE(GetRenderSurface(child2_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(grand_child1)
+  EXPECT_FALSE(GetRenderSurface(grand_child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 
   // CASE 2: Same as previous case, but with additional damage elsewhere that
   //         should be properly unioned.
-  // - child1 surface damage in root surface space:
+  // - child1_ surface damage in root surface space:
   //   gfx::Rect(300, 300, 6, 8);
-  // - child2 damage in root surface space:
+  // - child2_ damage in root surface space:
   //   gfx::Rect(11, 11, 18, 18);
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->SetOpacityMutated(grand_child1->element_id(), 0.7f);
-  root->layer_tree_impl()->SetOpacityMutated(child2->element_id(), 0.7f);
+  root->layer_tree_impl()->SetOpacityMutated(grand_child1_->element_id(), 0.7f);
+  root->layer_tree_impl()->SetOpacityMutated(child2_->element_id(), 0.7f);
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1343,13 +1293,13 @@
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child2)
+  EXPECT_FALSE(GetRenderSurface(child2_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(grand_child1)
+  EXPECT_FALSE(GetRenderSurface(grand_child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 }
@@ -1363,17 +1313,13 @@
   // entire surface should be marked dirty.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* grand_child1 =
-      root->test_properties()->children[0]->test_properties()->children[0];
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
   ClearDamageForAllSurfaces(root);
-  grand_child1->test_properties()->position = gfx::PointF(195.f, 205.f);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  grand_child1_->SetOffsetToTransformParent(gfx::Vector2dF(195.f, 205.f));
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1383,7 +1329,7 @@
   EXPECT_EQ(gfx::Rect(190, 190, 11, 23).ToString(),
             child_damage_rect.ToString());
 
-  // Damage to the root surface should be the union of child1's *entire* render
+  // Damage to the root surface should be the union of child1_'s *entire* render
   // surface (in target space), and its old exposed area (also in target
   // space).
   EXPECT_EQ(gfx::Rect(290, 290, 16, 23).ToString(),
@@ -1392,7 +1338,7 @@
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
@@ -1402,37 +1348,34 @@
   // damaged with the old and new descendant surface regions.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  child1->SetDrawsContent(true);
+  child1_->SetDrawsContent(true);
   EmulateDrawingOneFrame(root);
 
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
   ClearDamageForAllSurfaces(root);
-  child1->test_properties()->position = gfx::PointF(105.f, 107.f);
-  child1->NoteLayerPropertyChanged();
-  TransformNode* child1_transform =
-      root->layer_tree_impl()->property_trees()->transform_tree.Node(
-          child1->transform_tree_index());
-  child1_transform->transform_changed = true;
+  SetPostTranslation(child1_, gfx::Vector2dF(105.f, 107.f));
+  child1_->NoteLayerPropertyChanged();
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
 
-  // Damage to the root surface should be the union of child1's *entire* render
+  // Damage to the root surface should be the union of child1_'s *entire* render
   // surface (in target space), and its old exposed area (also in target
   // space).
-  EXPECT_EQ(gfx::Rect(100, 100, 206, 208).ToString(),
+  EXPECT_EQ(gfx::UnionRects(gfx::Rect(100, 100, 206, 208),
+                            gfx::Rect(105, 107, 206, 208))
+                .ToString(),
             root_damage_rect.ToString());
   // The child surface should also be damaged.
   EXPECT_EQ(gfx::Rect(0, 0, 206, 208).ToString(), child_damage_rect.ToString());
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
@@ -1441,26 +1384,25 @@
   // An ancestor/owning layer changes that affects the position/transform of
   // the render surface. Note that in this case, the layer_property_changed flag
   // already propagates to the subtree (tested in LayerImpltest), which damages
-  // the entire child1 surface, but the damage tracker still needs the correct
+  // the entire child1_ surface, but the damage tracker still needs the correct
   // logic to compute the exposed region on the root surface.
 
   // TODO(shawnsingh): the expectations of this test case should change when we
   // add support for a unique scissor_rect per RenderSurface. In that case, the
-  // child1 surface should be completely unchanged, since we are only
+  // child1_ surface should be completely unchanged, since we are only
   // transforming it, while the root surface would be damaged appropriately.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
   ClearDamageForAllSurfaces(root);
   gfx::Transform translation;
   translation.Translate(-50.f, -50.f);
-  root->layer_tree_impl()->SetTransformMutated(child1->element_id(),
+  root->layer_tree_impl()->SetTransformMutated(child1_->element_id(),
                                                translation);
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1469,36 +1411,34 @@
   EXPECT_EQ(gfx::Rect(190, 190, 16, 18).ToString(),
             child_damage_rect.ToString());
 
-  // The entire child1 surface and the old exposed child1 surface should damage
-  // the root surface.
-  //  - old child1 surface in target space: gfx::Rect(290, 290, 16, 18)
-  //  - new child1 surface in target space: gfx::Rect(240, 240, 16, 18)
+  // The entire child1_ surface and the old exposed child1_ surface should
+  // damage the root surface.
+  //  - old child1_ surface in target space: gfx::Rect(290, 290, 16, 18)
+  //  - new child1_ surface in target space: gfx::Rect(240, 240, 16, 18)
   EXPECT_EQ(gfx::Rect(240, 240, 66, 68).ToString(),
             root_damage_rect.ToString());
 
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_FALSE(GetRenderSurface(child1)
+  EXPECT_FALSE(GetRenderSurface(child1_)
                    ->damage_tracker()
                    ->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageForAddingAndRemovingRenderSurfaces) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
   // CASE 1: If a descendant surface disappears, its entire old area becomes
   //         exposed.
   ClearDamageForAllSurfaces(root);
-  child1->test_properties()->force_render_surface = false;
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  SetRenderSurfaceReason(child1_, RenderSurfaceReason::kNone);
   EmulateDrawingOneFrame(root);
 
   // Sanity check that there is only one surface now.
-  ASSERT_EQ(GetRenderSurface(child1), GetRenderSurface(root));
+  ASSERT_EQ(GetRenderSurface(child1_), GetRenderSurface(root));
   ASSERT_EQ(4, GetRenderSurface(root)->num_contributors());
 
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1516,7 +1456,6 @@
   // Cycle one frame of no change, just to sanity check that the next rect is
   // not because of the old damage state.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1524,17 +1463,16 @@
 
   // Then change the tree so that the render surface is added back.
   ClearDamageForAllSurfaces(root);
-  child1->test_properties()->force_render_surface = true;
+  SetRenderSurfaceReason(child1_, RenderSurfaceReason::kTest);
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Sanity check that there is a new surface now.
-  ASSERT_TRUE(GetRenderSurface(child1));
+  ASSERT_TRUE(GetRenderSurface(child1_));
   EXPECT_EQ(3, GetRenderSurface(root)->num_contributors());
-  EXPECT_EQ(2, GetRenderSurface(child1)->num_contributors());
+  EXPECT_EQ(2, GetRenderSurface(child1_)->num_contributors());
 
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1549,16 +1487,14 @@
 
 TEST_F(DamageTrackerTest, VerifyNoDamageWhenNothingChanged) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
   // CASE 1: If nothing changes, the damage rect should be empty.
   //
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1572,9 +1508,8 @@
   //         empty.
   //
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1587,17 +1522,15 @@
 
 TEST_F(DamageTrackerTest, VerifyNoDamageForUpdateRectThatDoesNotDrawContent) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
   gfx::Rect child_damage_rect;
   gfx::Rect root_damage_rect;
 
-  // In our specific tree, the update rect of child1 should not cause any
+  // In our specific tree, the update rect of child1_ should not cause any
   // damage to any surface because it does not actually draw content.
   ClearDamageForAllSurfaces(root);
-  child1->SetUpdateRect(gfx::Rect(1, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  child1_->SetUpdateRect(gfx::Rect(1, 2));
   EmulateDrawingOneFrame(root);
-  EXPECT_TRUE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
+  EXPECT_TRUE(GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1610,43 +1543,34 @@
 
 TEST_F(DamageTrackerTest, VerifyDamageForMask) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // In the current implementation of the damage tracker, changes to mask
   // layers should damage the entire corresponding surface.
 
   ClearDamageForAllSurfaces(root);
 
+  CreateTransformNode(child).post_translation =
+      child->offset_to_transform_parent();
+  child->SetOffsetToTransformParent(gfx::Vector2dF());
+
   // Set up the mask layer.
-  {
-    std::unique_ptr<LayerImpl> mask_layer =
-        LayerImpl::Create(host_impl_.active_tree(), 3);
-    mask_layer->test_properties()->position =
-        child->test_properties()->position;
-    mask_layer->SetBounds(child->bounds());
-    child->test_properties()->SetMaskLayer(std::move(mask_layer));
-    child->test_properties()->force_render_surface = true;
-  }
-  LayerImpl* mask_layer = child->test_properties()->mask_layer;
+  CreateEffectNode(child);
+  LayerImpl* mask_layer = AddMaskLayer<LayerImpl>(child);
 
   // Add opacity and a grand_child so that the render surface persists even
   // after we remove the mask.
-  {
-    std::unique_ptr<LayerImpl> grand_child =
-        LayerImpl::Create(host_impl_.active_tree(), 4);
-    grand_child->test_properties()->position = gfx::PointF(2.f, 2.f);
-    grand_child->SetBounds(gfx::Size(2, 2));
-    grand_child->SetDrawsContent(true);
-    child->test_properties()->AddChild(std::move(grand_child));
-  }
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  LayerImpl* grand_child = AddLayer<LayerImpl>();
+  grand_child->SetBounds(gfx::Size(2, 2));
+  grand_child->SetDrawsContent(true);
+  CopyProperties(child, grand_child);
+  grand_child->SetOffsetToTransformParent(gfx::Vector2dF(2.f, 2.f));
   EmulateDrawingOneFrame(root);
 
   // CASE 1: the update_rect on a mask layer should damage the entire target
   //         surface.
   ClearDamageForAllSurfaces(root);
   mask_layer->SetUpdateRect(gfx::Rect(1, 2, 3, 4));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   gfx::Rect child_damage_rect;
   EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
@@ -1666,7 +1590,6 @@
   // Advance one frame without damage so that we know the damage rect is not
   // leftover from the previous case.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
@@ -1676,7 +1599,6 @@
   ClearDamageForAllSurfaces(root);
   mask_layer->NoteLayerPropertyChanged();
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
@@ -1695,7 +1617,6 @@
   // Advance one frame without damage so that we know the damage rect is not
   // leftover from the previous case.
   ClearDamageForAllSurfaces(root);
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(child)->damage_tracker()->GetDamageRectIfValid(
       &child_damage_rect));
@@ -1704,9 +1625,9 @@
   // Then test mask removal.
   ClearDamageForAllSurfaces(root);
   child->test_properties()->SetMaskLayer(nullptr);
+  GetEffectNode(child)->is_masked = false;
+  GetEffectNode(child)->mask_layer_id = -1;
   child->NoteLayerPropertyChanged();
-  ASSERT_TRUE(child->LayerPropertyChanged());
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Sanity check that a render surface still exists.
@@ -1723,7 +1644,7 @@
 
 TEST_F(DamageTrackerTest, DamageWhenAddedExternally) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   // Case 1: This test ensures that when the tracker is given damage, that
   //         it is included with any other partial damage.
@@ -1732,7 +1653,6 @@
   child->SetUpdateRect(gfx::Rect(10, 11, 12, 13));
   GetRenderSurface(root)->damage_tracker()->AddDamageNextUpdate(
       gfx::Rect(15, 16, 32, 33));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   gfx::Rect root_damage_rect;
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
@@ -1750,7 +1670,6 @@
   ClearDamageForAllSurfaces(root);
   GetRenderSurface(root)->damage_tracker()->AddDamageNextUpdate(
       gfx::Rect(30, 31, 14, 15));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1761,34 +1680,33 @@
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageWithNoContributingLayers) {
-  std::unique_ptr<LayerImpl> root =
-      LayerImpl::Create(host_impl_.active_tree(), 1);
-  root->test_properties()->force_render_surface = true;
-  host_impl_.active_tree()->SetRootLayerForTesting(std::move(root));
-  LayerImpl* root_ptr = host_impl_.active_tree()->root_layer_for_testing();
-  root_ptr->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  EmulateDrawingOneFrame(root_ptr);
+  LayerImpl* root = root_layer();
+  ClearDamageForAllSurfaces(root);
 
-  DCHECK_EQ(GetRenderSurface(root_ptr), root_ptr->render_target());
-  RenderSurfaceImpl* target_surface = GetRenderSurface(root_ptr);
+  LayerImpl* empty_surface = AddLayer<LayerImpl>();
+  CopyProperties(root, empty_surface);
+  CreateEffectNode(empty_surface).render_surface_reason =
+      RenderSurfaceReason::kTest;
+  EmulateDrawingOneFrame(root);
+
+  DCHECK_EQ(GetRenderSurface(empty_surface), empty_surface->render_target());
+  RenderSurfaceImpl* target_surface = GetRenderSurface(empty_surface);
   gfx::Rect damage_rect;
   EXPECT_TRUE(
       target_surface->damage_tracker()->GetDamageRectIfValid(&damage_rect));
   EXPECT_TRUE(damage_rect.IsEmpty());
-  EXPECT_FALSE(GetRenderSurface(root_ptr)
-                   ->damage_tracker()
-                   ->has_damage_from_contributing_content());
+  EXPECT_FALSE(
+      target_surface->damage_tracker()->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageAccumulatesUntilReset) {
   // If damage is not cleared, it should accumulate.
 
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-  LayerImpl* child = root->test_properties()->children[0];
+  LayerImpl* child = child_layers_[0];
 
   ClearDamageForAllSurfaces(root);
   child->SetUpdateRect(gfx::Rect(10.f, 11.f, 1.f, 2.f));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
 
   // Sanity check damage after the first frame; this isnt the actual test yet.
@@ -1803,7 +1721,6 @@
   // New damage, without having cleared the previous damage, should be unioned
   // to the previous one.
   child->SetUpdateRect(gfx::Rect(20, 25, 1, 2));
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1825,7 +1742,6 @@
 
   // Damage should remain empty even after one frame, since there's yet no new
   // damage.
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   EmulateDrawingOneFrame(root);
   EXPECT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &root_damage_rect));
@@ -1844,7 +1760,7 @@
 
   for (int i = 0; i < kRange; ++i) {
     LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
-    LayerImpl* child = root->test_properties()->children[0];
+    LayerImpl* child = child_layers_[0];
 
     gfx::Transform transform;
     transform.Translate(-kBigNumber, -kBigNumber);
@@ -1852,8 +1768,11 @@
     // The child layer covers (0, 0, i, i) of the viewport,
     // but has a huge negative position.
     child->SetBounds(gfx::Size(kBigNumber + i, kBigNumber + i));
-    child->test_properties()->transform = transform;
-    root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+    auto& transform_node = CreateTransformNode(child);
+    transform_node.local = transform;
+    transform_node.post_translation = child->offset_to_transform_parent();
+    child->SetOffsetToTransformParent(gfx::Vector2dF());
+
     float device_scale_factor = 1.f;
     // Visible rects computed from combining clips in target space and root
     // space don't match because of the loss in floating point accuracy. So, we
@@ -1876,20 +1795,19 @@
 
 TEST_F(DamageTrackerTest, DamageRectTooBig) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(2);
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
+  LayerImpl* child1 = child_layers_[0];
+  LayerImpl* child2 = child_layers_[1];
 
   // Really far left.
-  child1->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::min() + 100, 0);
+  child1->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::min() + 100, 0));
   child1->SetBounds(gfx::Size(1, 1));
 
   // Really far right.
-  child2->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::max() - 100, 0);
+  child2->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::max() - 100, 0));
   child2->SetBounds(gfx::Size(1, 1));
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   float device_scale_factor = 1.f;
   EmulateDrawingOneFrame(root, device_scale_factor);
 
@@ -1907,25 +1825,24 @@
 
 TEST_F(DamageTrackerTest, DamageRectTooBigWithFilter) {
   LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface(2);
-  LayerImpl* child1 = root->test_properties()->children[0];
-  LayerImpl* child2 = root->test_properties()->children[1];
+  LayerImpl* child1 = child_layers_[0];
+  LayerImpl* child2 = child_layers_[1];
 
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(5.f));
   root->SetDrawsContent(true);
-  root->test_properties()->backdrop_filters = filters;
+  SetBackdropFilter(root, filters);
 
   // Really far left.
-  child1->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::min() + 100, 0);
+  child1->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::min() + 100, 0));
   child1->SetBounds(gfx::Size(1, 1));
 
   // Really far right.
-  child2->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::max() - 100, 0);
+  child2->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::max() - 100, 0));
   child2->SetBounds(gfx::Size(1, 1));
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
   float device_scale_factor = 1.f;
   EmulateDrawingOneFrame(root, device_scale_factor);
 
@@ -1943,190 +1860,172 @@
 
 TEST_F(DamageTrackerTest, DamageRectTooBigInRenderSurface) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  auto* grandchild1 =
-      static_cast<TestLayerImpl*>(child1->test_properties()->children[0]);
-  auto* grandchild2 =
-      static_cast<TestLayerImpl*>(child1->test_properties()->children[1]);
 
   // Really far left.
-  grandchild1->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::min() + 500, 0);
-  grandchild1->SetBounds(gfx::Size(1, 1));
-  grandchild1->SetDrawsContent(true);
+  grand_child1_->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::min() + 500, 0));
+  grand_child1_->SetBounds(gfx::Size(1, 1));
+  grand_child1_->SetDrawsContent(true);
 
   // Really far right.
-  grandchild2->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::max() - 500, 0);
-  grandchild2->SetBounds(gfx::Size(1, 1));
-  grandchild2->SetDrawsContent(true);
+  grand_child2_->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::max() - 500, 0));
+  grand_child2_->SetBounds(gfx::Size(1, 1));
+  grand_child2_->SetDrawsContent(true);
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  float device_scale_factor = 1.f;
-  RenderSurfaceList render_surface_list;
-  ExecuteCalculateDrawProperties(root, device_scale_factor,
-                                 &render_surface_list);
+  ExecuteCalculateDrawProperties(root);
   // Avoid the descendant-only property change path that skips unioning damage
   // from descendant layers.
-  GetRenderSurface(child1)->NoteAncestorPropertyChanged();
-  DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
-                                      render_surface_list);
+  GetRenderSurface(child1_)->NoteAncestorPropertyChanged();
+  DamageTracker::UpdateDamageTracking(host_impl()->active_tree(),
+                                      *render_surface_list_impl());
 
   // The expected damage would be too large to store in a gfx::Rect, so we
-  // should damage everything on child1.
+  // should damage everything on child1_.
   gfx::Rect damage_rect;
-  EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
-      &damage_rect));
-  EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
-            GetRenderSurface(child1)->GetDamageRect());
+  EXPECT_FALSE(
+      GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
+          &damage_rect));
+  EXPECT_EQ(GetRenderSurface(child1_)->content_rect(),
+            GetRenderSurface(child1_)->GetDamageRect());
 
-  // However, the root should just use the child1 render surface's content rect
+  // However, the root should just use the child1_ render surface's content rect
   // as damage.
   ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &damage_rect));
   EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
   EXPECT_TRUE(damage_rect.Contains(
-      gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
+      gfx::ToEnclosingRect(GetRenderSurface(child1_)->DrawableContentRect())));
   EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
 
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 
   // Add new damage, without changing properties, which goes down a different
   // path in the damage tracker.
   root->layer_tree_impl()->ResetAllChangeTracking();
-  grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
-  grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
+  grand_child1_->AddDamageRect(gfx::Rect(grand_child1_->bounds()));
+  grand_child2_->AddDamageRect(gfx::Rect(grand_child1_->bounds()));
 
   // Recompute all damage / properties.
-  render_surface_list.clear();
-  ExecuteCalculateDrawProperties(root, device_scale_factor,
-                                 &render_surface_list);
-  DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
-                                      render_surface_list);
+  ExecuteCalculateDrawProperties(root);
+  DamageTracker::UpdateDamageTracking(host_impl()->active_tree(),
+                                      *render_surface_list_impl());
 
   // Child1 should still not have a valid rect, since the union of the damage of
   // its children is not representable by a single rect.
-  EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
-      &damage_rect));
-  EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
-            GetRenderSurface(child1)->GetDamageRect());
+  EXPECT_FALSE(
+      GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
+          &damage_rect));
+  EXPECT_EQ(GetRenderSurface(child1_)->content_rect(),
+            GetRenderSurface(child1_)->GetDamageRect());
 
   // Root should have valid damage and contain both its content rect and the
-  // drawable content rect of child1.
+  // drawable content rect of child1_.
   ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &damage_rect));
   EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
   EXPECT_TRUE(damage_rect.Contains(
-      gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
+      gfx::ToEnclosingRect(GetRenderSurface(child1_)->DrawableContentRect())));
   EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
 
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
 
 TEST_F(DamageTrackerTest, DamageRectTooBigInRenderSurfaceWithFilter) {
   LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
-  LayerImpl* child1 = root->test_properties()->children[0];
-  auto* grandchild1 =
-      static_cast<TestLayerImpl*>(child1->test_properties()->children[0]);
-  auto* grandchild2 =
-      static_cast<TestLayerImpl*>(child1->test_properties()->children[1]);
 
   // Set up a moving pixels filter on the child.
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(5.f));
-  child1->SetDrawsContent(true);
-  child1->test_properties()->backdrop_filters = filters;
+  child1_->SetDrawsContent(true);
+  SetBackdropFilter(child1_, filters);
 
   // Really far left.
-  grandchild1->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::min() + 500, 0);
-  grandchild1->SetBounds(gfx::Size(1, 1));
-  grandchild1->SetDrawsContent(true);
+  grand_child1_->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::min() + 500, 0));
+  grand_child1_->SetBounds(gfx::Size(1, 1));
+  grand_child1_->SetDrawsContent(true);
 
   // Really far right.
-  grandchild2->test_properties()->position =
-      gfx::PointF(std::numeric_limits<int>::max() - 500, 0);
-  grandchild2->SetBounds(gfx::Size(1, 1));
-  grandchild2->SetDrawsContent(true);
+  grand_child2_->SetOffsetToTransformParent(
+      gfx::Vector2dF(std::numeric_limits<int>::max() - 500, 0));
+  grand_child2_->SetBounds(gfx::Size(1, 1));
+  grand_child2_->SetDrawsContent(true);
 
-  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  float device_scale_factor = 1.f;
-  RenderSurfaceList render_surface_list;
-  ExecuteCalculateDrawProperties(root, device_scale_factor,
-                                 &render_surface_list);
+  ExecuteCalculateDrawProperties(root);
   // Avoid the descendant-only property change path that skips unioning damage
   // from descendant layers.
-  GetRenderSurface(child1)->NoteAncestorPropertyChanged();
-  DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
-                                      render_surface_list);
+  GetRenderSurface(child1_)->NoteAncestorPropertyChanged();
+  DamageTracker::UpdateDamageTracking(host_impl()->active_tree(),
+                                      *render_surface_list_impl());
 
   // The expected damage would be too large to store in a gfx::Rect, so we
-  // should damage everything on child1.
+  // should damage everything on child1_.
   gfx::Rect damage_rect;
-  EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
-      &damage_rect));
-  EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
-            GetRenderSurface(child1)->GetDamageRect());
+  EXPECT_FALSE(
+      GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
+          &damage_rect));
+  EXPECT_EQ(GetRenderSurface(child1_)->content_rect(),
+            GetRenderSurface(child1_)->GetDamageRect());
 
-  // However, the root should just use the child1 render surface's content rect
+  // However, the root should just use the child1_ render surface's content rect
   // as damage.
   ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &damage_rect));
   EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
   EXPECT_TRUE(damage_rect.Contains(
-      gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
+      gfx::ToEnclosingRect(GetRenderSurface(child1_)->DrawableContentRect())));
   EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
 
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 
   // Add new damage, without changing properties, which goes down a different
   // path in the damage tracker.
   root->layer_tree_impl()->ResetAllChangeTracking();
-  grandchild1->AddDamageRect(gfx::Rect(grandchild1->bounds()));
-  grandchild2->AddDamageRect(gfx::Rect(grandchild1->bounds()));
+  grand_child1_->AddDamageRect(gfx::Rect(grand_child1_->bounds()));
+  grand_child2_->AddDamageRect(gfx::Rect(grand_child1_->bounds()));
 
   // Recompute all damage / properties.
-  render_surface_list.clear();
-  ExecuteCalculateDrawProperties(root, device_scale_factor,
-                                 &render_surface_list);
-  DamageTracker::UpdateDamageTracking(host_impl_.active_tree(),
-                                      render_surface_list);
+  ExecuteCalculateDrawProperties(root);
+  DamageTracker::UpdateDamageTracking(host_impl()->active_tree(),
+                                      *render_surface_list_impl());
 
   // Child1 should still not have a valid rect, since the union of the damage of
   // its children is not representable by a single rect.
-  EXPECT_FALSE(GetRenderSurface(child1)->damage_tracker()->GetDamageRectIfValid(
-      &damage_rect));
-  EXPECT_EQ(GetRenderSurface(child1)->content_rect(),
-            GetRenderSurface(child1)->GetDamageRect());
+  EXPECT_FALSE(
+      GetRenderSurface(child1_)->damage_tracker()->GetDamageRectIfValid(
+          &damage_rect));
+  EXPECT_EQ(GetRenderSurface(child1_)->content_rect(),
+            GetRenderSurface(child1_)->GetDamageRect());
 
   // Root should have valid damage and contain both its content rect and the
-  // drawable content rect of child1.
+  // drawable content rect of child1_.
   ASSERT_TRUE(GetRenderSurface(root)->damage_tracker()->GetDamageRectIfValid(
       &damage_rect));
   EXPECT_TRUE(damage_rect.Contains(GetRenderSurface(root)->content_rect()));
   EXPECT_TRUE(damage_rect.Contains(
-      gfx::ToEnclosingRect(GetRenderSurface(child1)->DrawableContentRect())));
+      gfx::ToEnclosingRect(GetRenderSurface(child1_)->DrawableContentRect())));
   EXPECT_EQ(damage_rect, GetRenderSurface(root)->GetDamageRect());
 
   EXPECT_TRUE(GetRenderSurface(root)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
-  EXPECT_TRUE(GetRenderSurface(child1)
+  EXPECT_TRUE(GetRenderSurface(child1_)
                   ->damage_tracker()
                   ->has_damage_from_contributing_content());
 }
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index fb1d40684..a3a63ffd 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -256,8 +256,6 @@
   return jitter;
 }
 
-enum PropertyTreeOption { BUILD_PROPERTY_TREES, DONT_BUILD_PROPERTY_TREES };
-
 static void AddSurfaceToRenderSurfaceList(
     RenderSurfaceImpl* render_surface,
     RenderSurfaceList* render_surface_list,
@@ -516,71 +514,49 @@
 
 static void CalculateDrawPropertiesInternal(
     LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs,
-    PropertyTreeOption property_tree_option,
     LayerImplList* output_update_layer_list) {
   inputs->render_surface_list->clear();
 
   LayerImplList visible_layer_list;
-  switch (property_tree_option) {
-    case BUILD_PROPERTY_TREES: {
-      // The translation from layer to property trees is an intermediate
-      // state. We will eventually get these data passed directly to the
-      // compositor.
-      PropertyTreeBuilder::BuildPropertyTrees(
-          inputs->root_layer, inputs->page_scale_layer,
-          inputs->inner_viewport_scroll_layer,
-          inputs->outer_viewport_scroll_layer,
-          inputs->elastic_overscroll_element_id, inputs->elastic_overscroll,
-          inputs->page_scale_factor, inputs->device_scale_factor,
-          inputs->device_viewport_rect, inputs->device_transform,
-          inputs->property_trees);
-      draw_property_utils::UpdatePropertyTreesAndRenderSurfaces(
-          inputs->root_layer, inputs->property_trees);
-      break;
-    }
-    case DONT_BUILD_PROPERTY_TREES: {
-      // Since page scale and elastic overscroll are SyncedProperties, changes
-      // on the active tree immediately affect the pending tree, so instead of
-      // trying to update property trees whenever these values change, we
-      // update property trees before using them.
+  // Since page scale and elastic overscroll are SyncedProperties, changes
+  // on the active tree immediately affect the pending tree, so instead of
+  // trying to update property trees whenever these values change, we
+  // update property trees before using them.
 
-      // We should never be setting a non-unit page scale factor on an oopif
-      // subframe ... if we attempt this log it and fail.
-      // TODO(wjmaclean): Remove as part of conditions for closing the bug.
-      // https://crbug.com/845097
-      if (inputs->page_scale_factor !=
-              inputs->property_trees->transform_tree.page_scale_factor() &&
-          !inputs->page_scale_transform_node) {
-        LOG(ERROR) << "Setting PageScale on subframe: new psf = "
-                   << inputs->page_scale_factor << ", old psf = "
-                   << inputs->property_trees->transform_tree.page_scale_factor()
-                   << ", in_oopif = "
-                   << inputs->root_layer->layer_tree_impl()
-                          ->settings()
-                          .is_layer_tree_for_subframe;
-        NOTREACHED();
-      }
-
-      DCHECK_NE(inputs->page_scale_layer, inputs->root_layer);
-      draw_property_utils::UpdatePageScaleFactor(
-          inputs->property_trees, inputs->page_scale_transform_node,
-          inputs->page_scale_factor);
-      draw_property_utils::UpdateElasticOverscroll(
-          inputs->property_trees, inputs->elastic_overscroll_element_id,
-          inputs->elastic_overscroll);
-      // Similarly, the device viewport and device transform are shared
-      // by both trees.
-      PropertyTrees* property_trees = inputs->property_trees;
-      property_trees->clip_tree.SetViewportClip(
-          gfx::RectF(inputs->device_viewport_rect));
-      property_trees->transform_tree.SetRootScaleAndTransform(
-          inputs->device_scale_factor, inputs->device_transform);
-      draw_property_utils::UpdatePropertyTreesAndRenderSurfaces(
-          inputs->root_layer, inputs->property_trees);
-      break;
-    }
+  // We should never be setting a non-unit page scale factor on an oopif
+  // subframe ... if we attempt this log it and fail.
+  // TODO(wjmaclean): Remove as part of conditions for closing the bug.
+  // https://crbug.com/845097
+  if (inputs->page_scale_factor !=
+          inputs->property_trees->transform_tree.page_scale_factor() &&
+      !inputs->page_scale_transform_node) {
+    LOG(ERROR) << "Setting PageScale on subframe: new psf = "
+               << inputs->page_scale_factor << ", old psf = "
+               << inputs->property_trees->transform_tree.page_scale_factor()
+               << ", in_oopif = "
+               << inputs->root_layer->layer_tree_impl()
+                      ->settings()
+                      .is_layer_tree_for_subframe;
+    NOTREACHED();
   }
 
+  DCHECK_NE(inputs->page_scale_layer, inputs->root_layer);
+  draw_property_utils::UpdatePageScaleFactor(inputs->property_trees,
+                                             inputs->page_scale_transform_node,
+                                             inputs->page_scale_factor);
+  draw_property_utils::UpdateElasticOverscroll(
+      inputs->property_trees, inputs->elastic_overscroll_element_id,
+      inputs->elastic_overscroll);
+  // Similarly, the device viewport and device transform are shared
+  // by both trees.
+  PropertyTrees* property_trees = inputs->property_trees;
+  property_trees->clip_tree.SetViewportClip(
+      gfx::RectF(inputs->device_viewport_rect));
+  property_trees->transform_tree.SetRootScaleAndTransform(
+      inputs->device_scale_factor, inputs->device_transform);
+  draw_property_utils::UpdatePropertyTreesAndRenderSurfaces(
+      inputs->root_layer, inputs->property_trees);
+
   {
     TRACE_EVENT0("cc", "draw_property_utils::FindLayersThatNeedUpdates");
     draw_property_utils::FindLayersThatNeedUpdates(
@@ -644,7 +620,7 @@
 
 void LayerTreeHostCommon::CalculateDrawProperties(
     CalcDrawPropsImplInputs* inputs) {
-  CalculateDrawPropertiesInternal(inputs, DONT_BUILD_PROPERTY_TREES, nullptr);
+  CalculateDrawPropertiesInternal(inputs, nullptr);
 }
 
 void LayerTreeHostCommon::PrepareForUpdateDrawPropertiesForTesting(
@@ -672,11 +648,7 @@
     CalcDrawPropsImplInputsForTesting* inputs) {
   PrepareForUpdateDrawPropertiesForTesting(
       inputs->root_layer->layer_tree_impl());
-  CalculateDrawPropertiesInternal(inputs,
-                                  inputs->property_trees->needs_rebuild
-                                      ? BUILD_PROPERTY_TREES
-                                      : DONT_BUILD_PROPERTY_TREES,
-                                  inputs->update_layer_list);
+  CalculateDrawPropertiesInternal(inputs, inputs->update_layer_list);
 }
 
 PropertyTrees* GetPropertyTrees(const Layer* layer) {
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 6a511ff0..bdb656c 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -66,8 +66,7 @@
 
 class LayerTreeHostCommonTestBase : public LayerTestCommon::LayerImplTest {
  public:
-  LayerTreeHostCommonTestBase()
-      : LayerTestCommon::LayerImplTest(LayerListSettings()) {}
+  LayerTreeHostCommonTestBase() = default;
   explicit LayerTreeHostCommonTestBase(const LayerTreeSettings& settings)
       : LayerTestCommon::LayerImplTest(settings) {}
 
@@ -171,9 +170,9 @@
                          Layer* page_scale_layer = nullptr) {
     Commit(device_scale_factor, page_scale_factor, page_scale_layer);
     host_impl()->ActivateSyncTree();
-    ExecuteCalculateDrawProperties(root_layer_for_testing(),
-                                   device_scale_factor, gfx::Transform(),
-                                   page_scale_factor, ImplOf(page_scale_layer));
+    ExecuteCalculateDrawProperties(root_layer(), device_scale_factor,
+                                   gfx::Transform(), page_scale_factor,
+                                   ImplOf(page_scale_layer));
   }
 
   bool UpdateLayerListContains(int id) const {
@@ -205,17 +204,16 @@
   LayerTreeHostCommonDrawRectsTest() : LayerTreeHostCommonTest() {}
 
   void SetUp() override {
-    LayerImpl* root = root_layer_for_testing();
+    LayerImpl* root = root_layer();
     root->SetDrawsContent(true);
     root->SetBounds(gfx::Size(500, 500));
-    SetupRootProperties(root);
   }
 
   LayerImpl* TestVisibleRectAndDrawableContentRect(
       const gfx::Rect& target_rect,
       const gfx::Transform& layer_transform,
       const gfx::Rect& layer_rect) {
-    LayerImpl* root = root_layer_for_testing();
+    LayerImpl* root = root_layer();
     LayerImpl* target = AddLayer<LayerImpl>();
     LayerImpl* drawing_layer = AddLayer<LayerImpl>();
 
@@ -249,13 +247,12 @@
 // screen space transform, and the hierarchy passed on to children
 // layers should also be identity transforms.
 TEST_F(LayerTreeHostCommonTest, TransformsForNoOpLayer) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* parent = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
   parent->SetBounds(gfx::Size(100, 100));
 
-  SetupRootProperties(parent);
   CopyProperties(parent, child);
   CopyProperties(child, grand_child);
 
@@ -292,7 +289,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransformsForSingleLayer) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* layer = AddLayer<LayerImpl>();
 
   TransformTree& transform_tree =
@@ -301,7 +298,6 @@
       host_impl()->active_tree()->property_trees()->effect_tree;
 
   root->SetBounds(gfx::Size(1, 2));
-  SetupRootProperties(root);
   CopyProperties(root, layer);
 
   // Case 1: Setting the bounds of the layer should not affect either the draw
@@ -409,11 +405,10 @@
   LayerImpl* page_scale_layer = AddLayer<LayerImpl>();
   page_scale_layer->SetBounds(gfx::Size(3, 4));
 
-  LayerImpl* root_layer = root_layer_for_testing();
-  root_layer->SetBounds(gfx::Size(3, 4));
+  LayerImpl* root = root_layer();
+  root->SetBounds(gfx::Size(3, 4));
 
-  SetupRootProperties(root_layer);
-  CopyProperties(root_layer, page_scale_layer);
+  CopyProperties(root, page_scale_layer);
   CreateTransformNode(page_scale_layer);
   CopyProperties(page_scale_layer, scroll_layer);
   CreateTransformNode(scroll_layer);
@@ -426,7 +421,7 @@
   SetScrollOffsetDelta(scroll_layer, kScrollDelta);
 
   const gfx::Transform kDeviceTransform;
-  ExecuteCalculateDrawProperties(root_layer, kDeviceScale, kDeviceTransform,
+  ExecuteCalculateDrawProperties(root, kDeviceScale, kDeviceTransform,
                                  page_scale, page_scale_layer);
   gfx::Transform expected_transform;
   gfx::PointF sub_layer_screen_position = kScrollLayerPosition - kScrollDelta;
@@ -445,7 +440,7 @@
   const float kTranslateY = 20.6f;
   arbitrary_translate.Translate(kTranslateX, kTranslateY);
   SetTransform(scroll_layer, arbitrary_translate);
-  ExecuteCalculateDrawProperties(root_layer, kDeviceScale, kDeviceTransform,
+  ExecuteCalculateDrawProperties(root, kDeviceScale, kDeviceTransform,
                                  page_scale, page_scale_layer);
   expected_transform.MakeIdentity();
   expected_transform.Translate(
@@ -463,10 +458,10 @@
 
   LayerTreeImpl::ViewportLayerIds viewport_ids;
   viewport_ids.page_scale = page_scale_layer->id();
-  root_layer->layer_tree_impl()->SetViewportLayersFromIds(viewport_ids);
-  root_layer->layer_tree_impl()->SetPageScaleOnActiveTree(page_scale);
-  EXPECT_FALSE(root_layer->layer_tree_impl()->property_trees()->needs_rebuild);
-  ExecuteCalculateDrawProperties(root_layer, kDeviceScale, kDeviceTransform,
+  root->layer_tree_impl()->SetViewportLayersFromIds(viewport_ids);
+  root->layer_tree_impl()->SetPageScaleOnActiveTree(page_scale);
+  EXPECT_FALSE(root->layer_tree_impl()->property_trees()->needs_rebuild);
+  ExecuteCalculateDrawProperties(root, kDeviceScale, kDeviceTransform,
                                  page_scale, page_scale_layer);
 
   expected_transform.MakeIdentity();
@@ -482,7 +477,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransformsForSimpleHierarchy) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
@@ -500,7 +495,6 @@
   child->SetBounds(gfx::Size(16, 18));
   grand_child->SetBounds(gfx::Size(76, 78));
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   CreateTransformNode(parent).origin = gfx::Point3F(2.5f, 3.0f, 0.f);
   CopyProperties(parent, child);
@@ -566,7 +560,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransformsForSingleRenderSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
@@ -594,7 +588,6 @@
   grand_child->SetBounds(gfx::Size(8, 10));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   auto& parent_transform_node = CreateTransformNode(parent);
   parent_transform_node.origin = gfx::Point3F(2.5f, 30.f, 0.f);
@@ -641,7 +634,7 @@
   //   - verifying that each layer has a reference to the correct render surface
   //   and render target values.
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   parent->SetDrawsContent(true);
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
@@ -706,7 +699,6 @@
   grand_child_of_rs1->SetBounds(gfx::Size(10, 10));
   grand_child_of_rs2->SetBounds(gfx::Size(10, 10));
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   auto& parent_transform_node = CreateTransformNode(parent);
   parent_transform_node.origin = gfx::Point3F(2.5f, 0.f, 0.f);
@@ -944,7 +936,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, LayerFullyContainedWithinClipInTargetSpace) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -960,7 +952,6 @@
   grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child).local = child_transform;
   CopyProperties(child, grand_child);
@@ -990,7 +981,7 @@
   // implicitly inherited by the rest of the subtree, which then is positioned
   // incorrectly as a result.
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
   grand_child->SetDrawsContent(true);
@@ -1001,7 +992,6 @@
   child->SetBounds(gfx::Size(10, 0));
   grand_child->SetBounds(gfx::Size(10, 10));
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
   CopyProperties(child, grand_child);
@@ -1018,7 +1008,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceWithSublayerScale) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
@@ -1032,7 +1022,6 @@
   grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateTransformNode(render_surface).local = translate;
   CreateEffectNode(render_surface).render_surface_reason =
@@ -1056,7 +1045,7 @@
 TEST_F(LayerTreeHostCommonTest, TransformAboveRootLayer) {
   // Transformations applied at the root of the tree should be forwarded
   // to child layers instead of applied to the root RenderSurface.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   root->SetDrawsContent(true);
@@ -1065,7 +1054,6 @@
   child->SetBounds(gfx::Size(100, 100));
   child->SetMasksToBounds(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateClipNode(child);
 
@@ -1358,7 +1346,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForReferenceFilter) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   root->SetBounds(gfx::Size(100, 100));
@@ -1368,7 +1356,6 @@
   filters.Append(FilterOperation::CreateReferenceFilter(
       sk_make_sp<OffsetPaintFilter>(50, 50, nullptr)));
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   auto& child_effect_node = CreateEffectNode(child);
   child_effect_node.render_surface_reason = RenderSurfaceReason::kTest;
@@ -1387,7 +1374,7 @@
 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForReferenceFilterHighDpi) {
   const float device_scale_factor = 2.0f;
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   root->SetBounds(gfx::Size(100, 100));
@@ -1398,7 +1385,6 @@
   filters.Append(FilterOperation::CreateReferenceFilter(
       sk_make_sp<OffsetPaintFilter>(50, 50, nullptr)));
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   auto& child_effect_node = CreateEffectNode(child);
   child_effect_node.render_surface_reason = RenderSurfaceReason::kTest;
@@ -1416,14 +1402,13 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceForBlendMode) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   root->SetBounds(gfx::Size(10, 10));
   child->SetBounds(gfx::Size(10, 10));
   child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   auto& child_effect_node = CreateEffectNode(child);
   child_effect_node.render_surface_reason = RenderSurfaceReason::kTest;
@@ -1441,7 +1426,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceDrawOpacity) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* surface1 = AddLayer<LayerImpl>();
   LayerImpl* not_surface = AddLayer<LayerImpl>();
   LayerImpl* surface2 = AddLayer<LayerImpl>();
@@ -1453,7 +1438,6 @@
   surface2->SetBounds(gfx::Size(10, 10));
   surface2->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, surface1);
   auto& surface1_effect_node = CreateEffectNode(surface1);
   surface1_effect_node.render_surface_reason = RenderSurfaceReason::kTest;
@@ -1571,7 +1555,7 @@
   // outside the clip rect, and they should never get scheduled on the list of
   // render surfaces.
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
   LayerImpl* great_grand_child = AddLayer<LayerImpl>();
@@ -1591,7 +1575,6 @@
   leaf_node1->SetBounds(gfx::Size(20, 20));
   leaf_node2->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateClipNode(child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
@@ -1629,7 +1612,7 @@
   // content rect of the child, making grand_child not appear in the
   // render_surface_list.
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
   LayerImpl* leaf_node = AddLayer<LayerImpl>();
@@ -1641,7 +1624,6 @@
   leaf_node->SetBounds(gfx::Size(10, 10));
   leaf_node->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
@@ -1675,7 +1657,7 @@
   //  - but if the layer itself masks to bounds, it is considered clipped
   //    and propagates the clip to the subtree.
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
@@ -1697,7 +1679,6 @@
   leaf_node2->SetBounds(gfx::Size(100, 100));
   leaf_node2->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   CopyProperties(parent, child1);
   CopyProperties(child1, grand_child);
@@ -1785,7 +1766,7 @@
 TEST_F(LayerTreeHostCommonTest, UpdateClipRectCorrectly) {
   // Tests that when as long as layer is clipped, it's clip rect is set to
   // correct value.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
 
@@ -1797,7 +1778,6 @@
   child->SetDrawsContent(true);
   child->SetMasksToBounds(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   CopyProperties(parent, child);
   CreateClipNode(child);
@@ -1837,7 +1817,7 @@
   //   grand_child4 - outside parent's clip rect; the DrawableContentRect should
   //   be empty.
 
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* parent = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child1 = AddLayer<LayerImpl>();
   LayerImpl* grand_child2 = AddLayer<LayerImpl>();
@@ -1857,7 +1837,6 @@
   grand_child4->SetBounds(gfx::Size(10, 10));
   grand_child4->SetDrawsContent(true);
 
-  SetupRootProperties(parent);
   CopyProperties(parent, child);
   CreateTransformNode(child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
@@ -1888,7 +1867,7 @@
   // clipping; instead the surface will enforce the clip for the entire subtree.
   // They may still have a clip rect of their own layer bounds, however, if
   // MasksToBounds was true.
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* parent = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child1 = AddLayer<LayerImpl>();
   LayerImpl* grand_child2 = AddLayer<LayerImpl>();
@@ -1919,7 +1898,6 @@
   leaf_node4->SetBounds(gfx::Size(10, 10));
   leaf_node4->SetDrawsContent(true);
 
-  SetupRootProperties(parent);
   CopyProperties(parent, child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
   CreateClipNode(child);
@@ -1966,7 +1944,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, AnimationsForRenderSurfaceHierarchy) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* top = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* child_of_rs1 = AddLayer<LayerImpl>();
@@ -2002,7 +1980,6 @@
   grand_child_of_rs1->SetBounds(gfx::Size(10, 10));
   grand_child_of_rs2->SetBounds(gfx::Size(10, 10));
 
-  SetupRootProperties(root);
   CopyProperties(root, top);
   CreateTransformNode(top).local = layer_transform;
   CopyProperties(top, render_surface1);
@@ -2147,7 +2124,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, LargeTransforms) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -2159,7 +2136,6 @@
   grand_child->SetBounds(gfx::Size(10, 10));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child).local = large_transform;
   CopyProperties(child, grand_child);
@@ -2184,7 +2160,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        ScreenSpaceTransformIsAnimatingWithDelayedAnimation) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
   LayerImpl* great_grand_child = AddLayer<LayerImpl>();
@@ -2201,7 +2177,6 @@
 
   SetElementIdsForTesting();
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CopyProperties(child, grand_child);
   CreateTransformNode(grand_child);  // for animation.
@@ -2541,7 +2516,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsForSimpleLayers) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child1_layer = AddLayer<LayerImpl>();
   LayerImpl* child2_layer = AddLayer<LayerImpl>();
   LayerImpl* child3_layer = AddLayer<LayerImpl>();
@@ -2554,7 +2529,6 @@
   child3_layer->SetBounds(gfx::Size(50, 50));
   child3_layer->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child1_layer);
   CopyProperties(root, child2_layer);
   child2_layer->SetOffsetToTransformParent(gfx::Vector2dF(75.f, 75.f));
@@ -2582,7 +2556,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsForLayersClippedByLayer) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child1 = AddLayer<LayerImpl>();
   LayerImpl* grand_child2 = AddLayer<LayerImpl>();
@@ -2598,7 +2572,6 @@
   grand_child3->SetBounds(gfx::Size(50, 50));
   grand_child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateClipNode(child);
   CopyProperties(child, grand_child1);
@@ -2629,7 +2602,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, VisibleContentRectWithClippingAndScaling) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -2644,7 +2617,6 @@
   grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child).local = child_scale_matrix;
   CreateClipNode(child);
@@ -2778,13 +2750,12 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ClipRectWithClipParent) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
 
   root->SetBounds(gfx::Size(100, 100));
-  SetupRootProperties(root);
   CreateClipNode(root);
 
   clip->SetBounds(gfx::Size(10, 10));
@@ -2809,7 +2780,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ClipRectWithClippedDescendantOfFilter) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* filter = AddLayer<LayerImpl>();
   LayerImpl* clip = AddLayer<LayerImpl>();
   LayerImpl* filter_grand_child = AddLayer<LayerImpl>();
@@ -2820,7 +2791,6 @@
   filter_grand_child->SetBounds(gfx::Size(20, 20));
   filter_grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, filter);
   CreateEffectNode(filter).render_surface_reason = RenderSurfaceReason::kTest;
   CopyProperties(filter, clip);
@@ -2843,7 +2813,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsForLayersInUnclippedRenderSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
@@ -2858,7 +2828,6 @@
   child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -2898,7 +2867,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        VisibleContentRectsForClippedSurfaceWithEmptyClip) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
   LayerImpl* child3 = AddLayer<LayerImpl>();
@@ -2911,7 +2880,6 @@
   child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child1);
   child1->SetOffsetToTransformParent(gfx::Vector2dF(5.f, 5.f));
   CopyProperties(root, child2);
@@ -2942,7 +2910,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   root->SetBounds(gfx::Size(100, 100));
@@ -2953,7 +2921,6 @@
   gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child).local = uninvertible_matrix;
 
@@ -2989,7 +2956,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        VisibleContentRectForLayerWithUninvertibleDrawTransform) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -3005,7 +2972,6 @@
   grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   auto& child_transform_node = CreateTransformNode(child);
   child_transform_node.flattens_inherited_transform = false;
@@ -3116,7 +3082,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        OcclusionForLayerWithUninvertibleDrawTransform) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
   LayerImpl* occluding_child = AddLayer<LayerImpl>();
@@ -3137,7 +3103,6 @@
   occluding_child->SetDrawsContent(true);
   occluding_child->SetContentsOpaque(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   auto& child_transform_node = CreateTransformNode(child);
   child_transform_node.flattens_inherited_transform = false;
@@ -3170,7 +3135,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsForLayersInClippedRenderSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
@@ -3186,7 +3151,6 @@
   child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
@@ -3229,7 +3193,7 @@
 // Check that clipping does not propagate down surfaces.
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsForSurfaceHierarchy) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* render_surface2 = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
@@ -3247,7 +3211,6 @@
   child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, render_surface1);
   CreateEffectNode(render_surface1).render_surface_reason =
@@ -3300,7 +3263,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        VisibleRectsForClippedDescendantsOfUnclippedSurfaces) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
   LayerImpl* child2 = AddLayer<LayerImpl>();
@@ -3318,7 +3281,6 @@
   child1->SetMasksToBounds(true);
   child2->SetMasksToBounds(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface1);
   CreateEffectNode(render_surface1).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -3337,7 +3299,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        VisibleRectsWhenClipChildIsBetweenTwoRenderSurfaces) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* clip_child = AddLayer<LayerImpl>();
@@ -3346,7 +3308,6 @@
   root->SetBounds(gfx::Size(100, 100));
 
   clip_parent->SetBounds(gfx::Size(50, 50));
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
 
@@ -3375,7 +3336,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ClipRectOfSurfaceWhoseParentIsAClipChild) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
@@ -3386,7 +3347,6 @@
 
   clip_parent->SetBounds(gfx::Size(50, 50));
   clip_parent->SetOffsetToTransformParent(gfx::Vector2dF(2, 2));
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
 
@@ -3427,7 +3387,7 @@
 
 // Test that only drawn layers contribute to render surface content rect.
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceContentRectWhenLayerNotDrawn) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* surface = AddLayer<LayerImpl>();
   LayerImpl* test_layer = AddLayer<LayerImpl>();
 
@@ -3436,7 +3396,6 @@
   surface->SetDrawsContent(true);
   test_layer->SetBounds(gfx::Size(150, 150));
 
-  SetupRootProperties(root);
   CopyProperties(root, surface);
   CreateEffectNode(surface).render_surface_reason = RenderSurfaceReason::kTest;
   CopyProperties(surface, test_layer);
@@ -3454,7 +3413,7 @@
 // of surface_with_unclipped_descendants doesn't propagate to the
 // clipped_surface below it.
 TEST_F(LayerTreeHostCommonTest, VisibleRectsMultipleSurfaces) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* unclipped_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* unclipped_desc_surface = AddLayer<LayerImpl>();
@@ -3472,7 +3431,6 @@
   clipped_surface->SetBounds(gfx::Size(60, 60));
   clipped_surface->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, unclipped_surface);
   CreateEffectNode(unclipped_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -3496,7 +3454,7 @@
 // surface_with_unclipped_descendants->clipped_surface, checks that the bounds
 // of root propagate to the clipped_surface.
 TEST_F(LayerTreeHostCommonTest, RootClipPropagationToClippedSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* unclipped_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* unclipped_desc_surface = AddLayer<LayerImpl>();
@@ -3514,7 +3472,6 @@
   clipped_surface->SetDrawsContent(true);
   clipped_surface->test_properties()->force_render_surface = true;
 
-  SetupRootProperties(root);
   CopyProperties(root, unclipped_surface);
   CreateEffectNode(unclipped_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -3540,7 +3497,7 @@
 // expanded, axis-aligned DrawableContentRect and visible content rect.
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsWithTransformOnUnclippedSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
 
@@ -3552,7 +3509,6 @@
   child1->SetBounds(gfx::Size(50, 50));
   child1->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -3593,7 +3549,7 @@
 // expanded, axis-aligned DrawableContentRect and visible content rect.
 TEST_F(LayerTreeHostCommonTest,
        DrawableAndVisibleContentRectsWithTransformOnClippedSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* child1 = AddLayer<LayerImpl>();
 
@@ -3606,7 +3562,6 @@
   child1->SetBounds(gfx::Size(50, 50));
   child1->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
@@ -3643,7 +3598,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsInHighDPI) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   FakePictureLayerImpl* render_surface1 = AddLayer<FakePictureLayerImpl>();
   FakePictureLayerImpl* render_surface2 = AddLayer<FakePictureLayerImpl>();
   FakePictureLayerImpl* child1 = AddLayer<FakePictureLayerImpl>();
@@ -3663,7 +3618,6 @@
   child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, render_surface1);
   CreateTransformNode(render_surface1).post_translation =
@@ -4084,7 +4038,7 @@
 
 // Verify draw and screen space transforms of layers not in a surface.
 TEST_F(LayerTreeHostCommonScalingTest, LayerTransformsInHighDPI) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
 
@@ -4098,7 +4052,6 @@
 
   float device_scale_factor = 2.5f;
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   child->SetOffsetToTransformParent(gfx::Vector2dF(2.f, 2.f));
   CopyProperties(root, child2);
@@ -4179,7 +4132,7 @@
   gfx::Transform scale_small_matrix;
   scale_small_matrix.Scale(SK_MScalar1 / 10.f, SK_MScalar1 / 12.f);
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* page_scale = AddLayer<LayerImpl>();
@@ -4197,7 +4150,6 @@
   scale_surface->SetBounds(gfx::Size(10, 10));
   scale_surface->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, page_scale);
   auto& page_scale_transform_node = CreateTransformNode(page_scale);
   page_scale_transform_node.in_subtree_of_page_scale_layer = true;
@@ -4291,7 +4243,7 @@
   SkMScalar initial_child_scale = 0.25;
   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* page_scale = AddLayer<LayerImpl>();
@@ -4309,7 +4261,6 @@
   float page_scale_factor = 0.01f;
   const gfx::Transform kDeviceTransform;
 
-  SetupRootProperties(root);
   CopyProperties(root, page_scale);
   CreateTransformNode(page_scale).in_subtree_of_page_scale_layer = true;
   CopyProperties(page_scale, parent);
@@ -4341,7 +4292,7 @@
   SkMScalar initial_child_scale = 1.25;
   child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddLayer<LayerImpl>();
@@ -4352,7 +4303,6 @@
   child_scale->SetBounds(gfx::Size(10, 10));
   child_scale->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   CreateTransformNode(parent).local = parent_scale_matrix;
   CopyProperties(parent, child_scale);
@@ -4368,7 +4318,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceTransformsInHighDPI) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* parent = root_layer();
   parent->SetBounds(gfx::Size(30, 30));
   parent->SetDrawsContent(true);
 
@@ -4385,7 +4335,6 @@
   float device_scale_factor = 1.5f;
   gfx::Vector2dF child_offset(2.f, 2.f);
 
-  SetupRootProperties(parent);
   CopyProperties(parent, child);
   CreateTransformNode(child).post_translation = child_offset;
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
@@ -4452,7 +4401,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        RenderSurfaceTransformsInHighDPIAccurateScaleZeroPosition) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* parent = root_layer();
   parent->SetBounds(gfx::Size(33, 31));
   parent->SetDrawsContent(true);
 
@@ -4462,7 +4411,6 @@
 
   float device_scale_factor = 1.7f;
 
-  SetupRootProperties(parent);
   CopyProperties(parent, child);
   CreateEffectNode(child).render_surface_reason = RenderSurfaceReason::kTest;
 
@@ -4503,7 +4451,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransparentChildRenderSurfaceCreation) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -4512,7 +4460,6 @@
   grand_child->SetBounds(gfx::Size(10, 10));
   grand_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateEffectNode(child).opacity = 0.5f;
   CopyProperties(child, grand_child);
@@ -4532,7 +4479,6 @@
   child->SetDrawsContent(true);
 
   host_impl()->pending_tree()->SetElementIdsForTesting();
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateEffectNode(child).opacity = 0.0f;
 
@@ -4599,7 +4545,7 @@
   }
 
   void SetUp() override {
-    root_ = root_layer_for_testing();
+    root_ = root_layer();
     child_ = AddLayer<LayerImpl>();
     grand_child_ = AddLayer<LayerImpl>();
     SetElementIdsForTesting();
@@ -4616,7 +4562,6 @@
     child_->SetBounds(gfx::Size(1, 1));
     grand_child_->SetBounds(gfx::Size(1, 1));
 
-    SetupRootProperties(root_);
     CopyProperties(root_, child_);
     CreateTransformNode(child_);
     CreateEffectNode(child_).render_surface_reason = RenderSurfaceReason::kTest;
@@ -5133,12 +5078,11 @@
   //
   // The render surface should be resized correctly and the clip child should
   // inherit the right clip rect.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(50, 50));
 
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   render_surface->SetBounds(gfx::Size(10, 10));
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -5203,7 +5147,7 @@
   //          + render_surface2 (also sets opacity)
   //            + clip_child (clipped by clip_parent)
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* intervening = AddLayer<LayerImpl>();
@@ -5214,7 +5158,6 @@
 
   clip_parent->SetBounds(gfx::Size(40, 40));
   clip_parent->SetOffsetToTransformParent(gfx::Vector2dF(1, 1));
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
 
@@ -5298,7 +5241,7 @@
   //          + render_surface2 (also has render surface)
   //            + clip_child (clipped by clip_parent)
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* intervening = AddLayer<LayerImpl>();
@@ -5308,7 +5251,6 @@
   root->SetBounds(gfx::Size(50, 50));
 
   clip_parent->SetBounds(gfx::Size(40, 40));
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   auto& clip_parent_transform = CreateTransformNode(clip_parent);
   clip_parent_transform.local.Translate(2, 2);
@@ -5394,7 +5336,7 @@
   //        + clip_child (clipped by clip_parent, skipping intervening)
   //          + child
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* intervening = AddLayer<LayerImpl>();
   LayerImpl* clip_child = AddLayer<LayerImpl>();
@@ -5403,7 +5345,6 @@
   root->SetBounds(gfx::Size(50, 50));
 
   clip_parent->SetBounds(gfx::Size(40, 40));
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
 
@@ -5446,7 +5387,7 @@
   //          + non_clip_child (in normal clip hierarchy)
   //
   // In this example render_surface2 should be unaffected by clip_child.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
@@ -5467,7 +5408,6 @@
   non_clip_child->SetDrawsContent(true);
   non_clip_child->SetBounds(gfx::Size(5, 5));
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
   CopyProperties(clip_parent, clip_layer);
@@ -5679,7 +5619,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransformAnimationUpdatesBackfaceVisibility) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* back_facing = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* render_surface2 = AddLayer<LayerImpl>();
@@ -5693,7 +5633,6 @@
   render_surface2->SetBounds(gfx::Size(30, 30));
   SetElementIdsForTesting();
 
-  SetupRootProperties(root);
   CopyProperties(root, back_facing);
   auto& back_facing_transform_node = CreateTransformNode(back_facing);
   back_facing_transform_node.flattens_inherited_transform = false;
@@ -5739,7 +5678,7 @@
 TEST_F(LayerTreeHostCommonTest, ScrollChildAndScrollParentDifferentTargets) {
   // Tests the computation of draw transform for the scroll child when its
   // render surface is different from its scroll parent's render surface.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* scroll_child_target = AddLayer<LayerImpl>();
   LayerImpl* scroll_child = AddLayer<LayerImpl>();
   LayerImpl* scroll_parent_target = AddLayer<LayerImpl>();
@@ -5753,7 +5692,6 @@
   scroll_child->SetBounds(gfx::Size(50, 50));
   scroll_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, scroll_child_target);
   auto& child_target_effect_node = CreateEffectNode(scroll_child_target);
   child_target_effect_node.render_surface_reason = RenderSurfaceReason::kTest;
@@ -5784,7 +5722,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
 
@@ -5795,7 +5733,6 @@
   child->SetBounds(gfx::Size(20, 20));
   child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, parent);
   CreateTransformNode(parent).sorting_context_id = 1;
   CreateEffectNode(parent).render_surface_reason = RenderSurfaceReason::kTest;
@@ -5834,7 +5771,7 @@
   //   + container
   //     + scroller
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* container = AddLayer<LayerImpl>();
   LayerImpl* scroller = AddLayer<LayerImpl>();
 
@@ -5842,7 +5779,6 @@
 
   container->SetBounds(gfx::Size(40, 40));
   container->SetDrawsContent(true);
-  SetupRootProperties(root);
   CopyProperties(root, container);
 
   gfx::Vector2dF container_offset(10, 20);
@@ -5891,7 +5827,7 @@
   //       + container
   //         + scroller
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* animated_layer = AddLayer<FakePictureLayerImpl>();
   LayerImpl* surface = AddLayer<LayerImpl>();
   LayerImpl* container = AddLayer<LayerImpl>();
@@ -5904,7 +5840,6 @@
   start_scale.Scale(1.5f, 1.5f);
 
   animated_layer->SetBounds(gfx::Size(50, 50));
-  SetupRootProperties(root);
   CopyProperties(root, animated_layer);
   CreateTransformNode(animated_layer).local = start_scale;
 
@@ -5953,7 +5888,7 @@
   //     + scroller
   //   + scroll_child (transform parent is scroller)
   //
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* container = AddLayer<LayerImpl>();
   LayerImpl* scroller = AddLayer<LayerImpl>();
   LayerImpl* scroll_child = AddLayer<LayerImpl>();
@@ -5962,7 +5897,6 @@
   root->SetBounds(gfx::Size(50, 50));
 
   container->SetBounds(gfx::Size(50, 50));
-  SetupRootProperties(root);
   CopyProperties(root, container);
   gfx::Vector2dF container_offset(10.3f, 10.3f);
 
@@ -6659,7 +6593,7 @@
 };
 
 TEST_F(LayerTreeHostCommonTest, MaximumAnimationScaleFactor) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   auto* grand_parent = AddLayer<AnimationScaleFactorTrackingLayerImpl>();
   auto* parent = AddLayer<AnimationScaleFactorTrackingLayerImpl>();
   auto* child = AddLayer<AnimationScaleFactorTrackingLayerImpl>();
@@ -6672,7 +6606,6 @@
   child->SetBounds(gfx::Size(1, 2));
   grand_child->SetBounds(gfx::Size(1, 2));
 
-  SetupRootProperties(root);
   CopyProperties(root, grand_parent);
   CreateTransformNode(grand_parent);
   CopyProperties(grand_parent, parent);
@@ -7190,7 +7123,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, AnimationScales) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   auto* child1 = AddChildToRoot<LayerImpl>();
   auto* child2 = AddChildToRoot<LayerImpl>();
   SetElementIdsForTesting();
@@ -7203,7 +7136,6 @@
   child1->SetBounds(gfx::Size(1, 1));
   child2->SetBounds(gfx::Size(1, 1));
 
-  SetupRootProperties(root);
   CopyProperties(root, child1);
   CreateTransformNode(child1).local = scale_transform_child1;
   CopyProperties(child1, child2);
@@ -7240,7 +7172,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, VisibleContentRectInChildRenderSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip = AddLayer<LayerImpl>();
   LayerImpl* content = AddLayer<LayerImpl>();
 
@@ -7251,7 +7183,6 @@
   content->SetBounds(gfx::Size(768 / 2, 10000));
   content->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip);
   CreateClipNode(clip);
   CopyProperties(clip, content);
@@ -7289,7 +7220,7 @@
 
   host_impl()->active_tree()->SetDeviceViewportRect(device_viewport_rect);
 
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   root->SetBounds(root_size);
   root->SetMasksToBounds(true);
 
@@ -7303,7 +7234,6 @@
   sublayer->SetBounds(sublayer_size);
   sublayer->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, sublayer);
 
@@ -7329,7 +7259,6 @@
   root->SetBounds(gfx::Size(100, 100));
   animated->SetBounds(gfx::Size(20, 20));
 
-  SetupRootProperties(root);
   CopyProperties(root, animated);
   CreateEffectNode(animated).opacity = 0.f;
 
@@ -7365,7 +7294,6 @@
   surface->SetBounds(gfx::Size(100, 100));
   descendant_of_keyframe_model->SetBounds(gfx::Size(200, 200));
 
-  SetupRootProperties(root);
   CopyProperties(root, clip);
   CreateClipNode(clip);
   CopyProperties(clip, animated);
@@ -7584,7 +7512,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ChangeTransformOrigin) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
 
   gfx::Transform scale_matrix;
@@ -7595,7 +7523,6 @@
   child->SetBounds(gfx::Size(10, 10));
   child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child).local = scale_matrix;
 
@@ -7609,7 +7536,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, UpdateScrollChildPosition) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* scroll_parent = AddLayer<LayerImpl>();
   LayerImpl* scroll_child = AddLayer<LayerImpl>();
 
@@ -7624,7 +7551,6 @@
   scroll_child->SetBounds(gfx::Size(40, 40));
   scroll_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, scroll_parent);
   CreateTransformNode(scroll_parent);
   CreateScrollNode(scroll_parent);
@@ -7914,7 +7840,7 @@
   animation->AddKeyframeModel(std::move(transform_animation));
 
   // Set up some layers to have a tree.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* child = AddLayer<LayerImpl>();
   LayerImpl* grand_child = AddLayer<LayerImpl>();
 
@@ -7939,7 +7865,6 @@
   grand_child->set_visible_layer_rect(gfx::Rect());
   child->set_visible_layer_rect(gfx::Rect());
 
-  SetupRootProperties(root);
   CopyProperties(root, child);
   CreateTransformNode(child);
   CopyProperties(child, grand_child);
@@ -8153,7 +8078,7 @@
   // Ensure that when parent clip node's transform is an ancestor of current
   // clip node's target, clip is 'projected' from parent space to current
   // target space and visible rects are calculated correctly.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* target_layer = AddLayer<LayerImpl>();
   LayerImpl* test_layer = AddLayer<LayerImpl>();
@@ -8169,7 +8094,6 @@
   test_layer->SetBounds(gfx::Size(30, 30));
   test_layer->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_layer);
   CreateTransformNode(clip_layer).local = transform;
   CreateClipNode(clip_layer);
@@ -8187,7 +8111,7 @@
        RenderSurfaceWithUnclippedDescendantsClipsSubtree) {
   // Ensure clip rect is calculated correctly when render surface has unclipped
   // descendants.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* between_clip_parent_and_child = AddLayer<LayerImpl>();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
@@ -8200,7 +8124,6 @@
   test_layer->SetBounds(gfx::Size(30, 30));
   test_layer->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateTransformNode(clip_parent).local.Translate(2, 2);
   CreateClipNode(clip_parent);
@@ -8227,7 +8150,7 @@
   // Ensure that the visible layer rect of a descendant of a surface with
   // unclipped descendants is computed correctly, when the surface doesn't apply
   // a clip.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_child = AddLayer<LayerImpl>();
@@ -8241,7 +8164,6 @@
   child->SetBounds(gfx::Size(40, 40));
   child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CopyProperties(clip_parent, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
@@ -8256,7 +8178,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        RenderSurfaceClipsSubtreeAndHasUnclippedDescendants) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* test_layer1 = AddLayer<LayerImpl>();
@@ -8274,7 +8196,6 @@
   test_layer2->SetBounds(gfx::Size(50, 50));
   test_layer2->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, clip_parent);
   CopyProperties(clip_parent, render_surface);
@@ -8294,7 +8215,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, UnclippedClipParent) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_child = AddLayer<LayerImpl>();
@@ -8307,7 +8228,6 @@
   clip_child->SetBounds(gfx::Size(50, 50));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CopyProperties(clip_parent, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
@@ -8329,7 +8249,7 @@
   // Tests the value of render surface content rect when we have multiple types
   // of surfaces : unclipped surfaces, surfaces with unclipped surfaces and
   // clipped surfaces.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* unclipped_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
@@ -8352,7 +8272,6 @@
   clipped_surface->SetBounds(gfx::Size(70, 70));
   clipped_surface->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, unclipped_surface);
   CreateEffectNode(unclipped_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -8387,7 +8306,7 @@
 TEST_F(LayerTreeHostCommonTest, ClipBetweenClipChildTargetAndClipParentTarget) {
   // Tests the value of render surface content rect when we have a layer that
   // clips between the clip parent's target and clip child's target.
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* surface = AddLayer<LayerImpl>();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
@@ -8403,7 +8322,6 @@
   clip_child->SetBounds(gfx::Size(100, 100));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, surface);
   CreateTransformNode(surface).local.RotateAboutXAxis(10);
   CreateEffectNode(surface).render_surface_reason = RenderSurfaceReason::kTest;
@@ -8425,7 +8343,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, VisibleRectForDescendantOfScaledSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* surface = AddLayer<LayerImpl>();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
@@ -8441,7 +8359,6 @@
   clip_child->SetBounds(gfx::Size(100, 100));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, surface);
   CreateTransformNode(surface).local.Scale(2, 2);
   CreateEffectNode(surface).render_surface_reason = RenderSurfaceReason::kTest;
@@ -8461,7 +8378,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, LayerWithInputHandlerAndZeroOpacity) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* test_layer = AddLayer<LayerImpl>();
 
@@ -8478,7 +8395,6 @@
   touch_action_region.Union(kTouchActionNone, gfx::Rect(0, 0, 20, 20));
   test_layer->SetTouchActionRegion(std::move(touch_action_region));
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateEffectNode(render_surface).render_surface_reason =
       RenderSurfaceReason::kTest;
@@ -8493,7 +8409,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ClipParentDrawsIntoScaledRootSurface) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* clip_parent_child = AddLayer<LayerImpl>();
@@ -8509,7 +8425,6 @@
   clip_child->SetBounds(gfx::Size(100, 100));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_layer);
   CreateClipNode(clip_layer);
   CopyProperties(clip_layer, clip_parent);
@@ -8534,7 +8449,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ClipChildVisibleRect) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_parent = AddLayer<LayerImpl>();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* clip_child = AddLayer<LayerImpl>();
@@ -8546,7 +8461,6 @@
   clip_child->SetBounds(gfx::Size(50, 50));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CopyProperties(root, clip_parent);
   CreateClipNode(clip_parent);
   CopyProperties(clip_parent, render_surface);
@@ -8562,7 +8476,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        LayerClipRectLargerThanClippingRenderSurfaceRect) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* test_layer = AddLayer<LayerImpl>();
 
@@ -8574,7 +8488,6 @@
   test_layer->SetBounds(gfx::Size(50, 50));
   test_layer->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, render_surface);
   CreateTransformNode(render_surface);
@@ -8622,7 +8535,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TwoUnclippedRenderSurfaces) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* clip_layer = AddLayer<LayerImpl>();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* render_surface2 = AddLayer<LayerImpl>();
@@ -8637,7 +8550,6 @@
   clip_child->SetBounds(gfx::Size(30, 30));
   clip_child->SetDrawsContent(true);
 
-  SetupRootProperties(root);
   CreateClipNode(root);
   CopyProperties(root, clip_layer);
   CreateClipNode(clip_layer);
@@ -8707,7 +8619,7 @@
 
 TEST_F(LayerTreeHostCommonTest,
        SublayerScaleWithTransformNodeBetweenTwoTargets) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* between_targets = AddLayer<LayerImpl>();
   LayerImpl* render_surface2 = AddLayer<LayerImpl>();
@@ -8726,7 +8638,6 @@
   // We want layer between the two targets to create a clip node and effect
   // node but it shouldn't create a render surface.
   between_targets->SetMasksToBounds(true);
-  SetupRootProperties(root);
   CopyProperties(root, render_surface1);
   CreateTransformNode(render_surface1).local = scale;
   CreateEffectNode(render_surface1).render_surface_reason =
@@ -8752,7 +8663,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, NoisyTransform) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface = AddLayer<LayerImpl>();
   LayerImpl* parent = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
@@ -8770,7 +8681,6 @@
   transform.matrix().setDouble(2, 2, 6.12323e-17);
   transform.matrix().setDouble(2, 0, -1);
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface);
   CreateTransformNode(render_surface).local = transform;
   CreateEffectNode(render_surface).render_surface_reason =
@@ -8790,7 +8700,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, LargeTransformTest) {
-  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* root = root_layer();
   LayerImpl* render_surface1 = AddLayer<LayerImpl>();
   LayerImpl* child = AddLayer<LayerImpl>();
 
@@ -8813,7 +8723,6 @@
   // what exactly happens here.
   child->SetBounds(gfx::Size(30, 30));
 
-  SetupRootProperties(root);
   CopyProperties(root, render_surface1);
   CreateEffectNode(render_surface1).render_surface_reason =
       RenderSurfaceReason::kTest;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 1a7a64a..4058342 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1682,6 +1682,7 @@
                                       active_tree()->top_controls_shown_ratio(),
                                       active_tree()->elastic_overscroll());
   active_tree_->property_trees()->is_active = true;
+  active_tree_->property_trees()->clear();
   if (pending_tree_)
     pending_tree_->DetachLayers();
   pending_tree_ = nullptr;
diff --git a/cc/trees/layer_tree_host_pixeltest_readback.cc b/cc/trees/layer_tree_host_pixeltest_readback.cc
index 52317bb..345dc9c 100644
--- a/cc/trees/layer_tree_host_pixeltest_readback.cc
+++ b/cc/trees/layer_tree_host_pixeltest_readback.cc
@@ -416,7 +416,7 @@
       base::FilePath(FILE_PATH_LITERAL("green.png")));
 }
 
-// TODO(crbug.com/963446): Enable these tests for Skia Vulkan using texture
+// TODO(crbug.com/971257): Enable these tests for Skia Vulkan using texture
 // readback.
 ReadbackTestConfig const kTestConfigs[] = {
     ReadbackTestConfig{LayerTreeTest::RENDERER_SOFTWARE, READBACK_BITMAP},
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 1bb42de1..2b826f2 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -44,7 +44,6 @@
 #include "cc/trees/mutator_host.h"
 #include "cc/trees/occlusion_tracker.h"
 #include "cc/trees/property_tree.h"
-#include "cc/trees/property_tree_builder.h"
 #include "cc/trees/scroll_node.h"
 #include "cc/trees/transform_node.h"
 #include "components/viz/common/traced_value.h"
@@ -1514,24 +1513,6 @@
     DidModifyTilePriorities();
 }
 
-void LayerTreeImpl::BuildLayerListAndPropertyTreesForTesting() {
-  BuildLayerListForTesting();
-  BuildPropertyTreesForTesting();
-}
-
-void LayerTreeImpl::BuildPropertyTreesForTesting() {
-  SetElementIdsForTesting();
-  property_trees_.needs_rebuild = true;
-  PropertyTreeBuilder::BuildPropertyTrees(
-      layer_list_[0], PageScaleLayer(), InnerViewportScrollLayer(),
-      OuterViewportScrollLayer(), OverscrollElasticityElementId(),
-      elastic_overscroll()->Current(IsActiveTree()),
-      current_page_scale_factor(), device_scale_factor(),
-      gfx::Rect(GetDeviceViewport().size()), host_impl_->DrawTransform(),
-      &property_trees_);
-  host_impl_->UpdateElements(GetElementTypeForAnimation());
-}
-
 const RenderSurfaceList& LayerTreeImpl::GetRenderSurfaceList() const {
   // If this assert triggers, then the list is dirty.
   DCHECK(!needs_update_draw_properties_);
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 666701c4..9d2a8ab 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -416,8 +416,6 @@
   // text may cause invalidations, so should only be done after a commit.
   bool UpdateDrawProperties(bool update_image_animation_controller = true);
   void UpdateCanUseLCDText();
-  void BuildPropertyTreesForTesting();
-  void BuildLayerListAndPropertyTreesForTesting();
 
   void set_needs_update_draw_properties() {
     needs_update_draw_properties_ = true;
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc
index 4b2a48a..2e497c2 100644
--- a/cc/trees/layer_tree_impl_unittest.cc
+++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -22,20 +22,18 @@
 class LayerTreeImplTest : public LayerTestCommon::LayerImplTest,
                           public testing::Test {
  public:
-  explicit LayerTreeImplTest(
-      const LayerTreeSettings& settings = LayerListSettings())
+  LayerTreeImplTest() = default;
+  explicit LayerTreeImplTest(const LayerTreeSettings& settings)
       : LayerImplTest(settings) {}
 
   void SetUp() override {
     root_layer()->SetBounds(gfx::Size(100, 100));
-    SetupRootProperties(root_layer());
     UpdateDrawProperties(host_impl().active_tree());
   }
 
   FakeLayerTreeHostImpl& host_impl() const {
     return *LayerImplTest::host_impl();
   }
-  LayerImpl* root_layer() { return root_layer_for_testing(); }
 
   const RenderSurfaceList& GetRenderSurfaceList() const {
     return host_impl().active_tree()->GetRenderSurfaceList();
@@ -108,14 +106,6 @@
   LayerImpl* top_ = nullptr;
   LayerImpl* left_child_ = nullptr;
   LayerImpl* right_child_ = nullptr;
-
- private:
-  RenderSurfaceList render_surface_list_impl_;
-};
-
-class LayerTreeImplTestWithLayerLists : public LayerTreeImplTest {
- public:
-  LayerTreeImplTestWithLayerLists() : LayerTreeImplTest(LayerListSettings()) {}
 };
 
 TEST_F(LayerTreeImplTest, HitTestingForSingleLayer) {
@@ -973,7 +963,7 @@
   EXPECT_EQ(grand_child1, result_layer);
 }
 
-TEST_F(LayerTreeImplTestWithLayerLists, HitTestingRespectsClipParents) {
+TEST_F(LayerTreeImplTest, HitTestingRespectsClipParents) {
   LayerImpl* root = root_layer();
   root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
@@ -2294,7 +2284,6 @@
 
   auto* root = EnsureRootLayerInPendingTree();
   root->SetBounds(gfx::Size(100, 100));
-  SetupRootProperties(root);
 
   // Add three layers; two with PaintWorklets and one without.
   auto* child1 =
@@ -2395,7 +2384,6 @@
   LayerImpl* child = AddLayerInPendingTree<LayerImpl>();
   pending_tree->SetElementIdsForTesting();
 
-  SetupRootProperties(pending_root);
   // A scale transform forces a TransformNode.
   gfx::Transform scale3d;
   scale3d.Scale3d(1, 1, 0.5);
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index ea0dfd5..18d99c3 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -174,6 +174,11 @@
   bool enable_occlusion = true;
 };
 
+class CC_EXPORT LayerListSettings : public LayerTreeSettings {
+ public:
+  LayerListSettings() { use_layer_lists = true; }
+};
+
 }  // namespace cc
 
 #endif  // CC_TREES_LAYER_TREE_SETTINGS_H_
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc
index 41c812e1..99e04c6 100644
--- a/cc/trees/occlusion_tracker_unittest.cc
+++ b/cc/trees/occlusion_tracker_unittest.cc
@@ -93,32 +93,28 @@
         animation_host_(AnimationHost::CreateForTesting(ThreadInstance::MAIN)),
         host_(FakeLayerTreeHost::Create(&client_,
                                         &task_graph_runner_,
-                                        animation_host_.get())),
+                                        animation_host_.get(),
+                                        LayerListSettings())),
         next_layer_impl_id_(1) {}
 
   virtual void RunMyTest() = 0;
 
   void TearDown() override { DestroyLayers(); }
 
-  TestContentLayerImpl* CreateRoot(const gfx::Transform& transform,
-                                   const gfx::PointF& position,
-                                   const gfx::Size& bounds) {
+  TestContentLayerImpl* CreateRoot(const gfx::Size& bounds) {
     LayerTreeImpl* tree = host_->host_impl()->active_tree();
     int id = next_layer_impl_id_++;
     std::unique_ptr<TestContentLayerImpl> layer(
         new TestContentLayerImpl(tree, id));
     TestContentLayerImpl* layer_ptr = layer.get();
-    SetProperties(layer_ptr, transform, position, bounds);
+    layer_ptr->SetBounds(bounds);
+    SetupRootProperties(layer_ptr);
 
     host_->host_impl()->active_tree()->SetRootLayerForTesting(std::move(layer));
-
-    layer_ptr->test_properties()->force_render_surface = true;
-    SetRootLayerOnMainThread(layer_ptr);
-
     return layer_ptr;
   }
 
-  LayerImpl* CreateLayer(LayerImpl* parent,
+  LayerImpl* CreateLayer(LayerImpl* property_parent,
                          const gfx::Transform& transform,
                          const gfx::PointF& position,
                          const gfx::Size& bounds) {
@@ -126,21 +122,31 @@
     int id = next_layer_impl_id_++;
     std::unique_ptr<LayerImpl> layer = LayerImpl::Create(tree, id);
     LayerImpl* layer_ptr = layer.get();
-    SetProperties(layer_ptr, transform, position, bounds);
-    parent->test_properties()->AddChild(std::move(layer));
+    SetProperties(layer_ptr, property_parent, transform, position, bounds);
+    tree->root_layer_for_testing()->test_properties()->AddChild(
+        std::move(layer));
     return layer_ptr;
   }
 
+  void EnsureTransformNode(LayerImpl* layer) {
+    if (!layer->has_transform_node()) {
+      CreateTransformNode(layer).post_translation =
+          layer->offset_to_transform_parent();
+      layer->SetOffsetToTransformParent(gfx::Vector2dF());
+    }
+  }
+
   LayerImpl* CreateSurface(LayerImpl* parent,
                            const gfx::Transform& transform,
                            const gfx::PointF& position,
                            const gfx::Size& bounds) {
     LayerImpl* layer = CreateLayer(parent, transform, position, bounds);
-    layer->test_properties()->force_render_surface = true;
+    EnsureTransformNode(layer);
+    CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
     return layer;
   }
 
-  TestContentLayerImpl* CreateDrawingLayer(LayerImpl* parent,
+  TestContentLayerImpl* CreateDrawingLayer(LayerImpl* property_parent,
                                            const gfx::Transform& transform,
                                            const gfx::PointF& position,
                                            const gfx::Size& bounds,
@@ -150,7 +156,7 @@
     std::unique_ptr<TestContentLayerImpl> layer(
         new TestContentLayerImpl(tree, id));
     TestContentLayerImpl* layer_ptr = layer.get();
-    SetProperties(layer_ptr, transform, position, bounds);
+    SetProperties(layer_ptr, property_parent, transform, position, bounds);
 
     if (opaque_layers_) {
       layer_ptr->SetContentsOpaque(opaque);
@@ -162,47 +168,62 @@
         layer_ptr->SetOpaqueContentsRect(gfx::Rect());
     }
 
-    parent->test_properties()->AddChild(std::move(layer));
+    tree->root_layer_for_testing()->test_properties()->AddChild(
+        std::move(layer));
     return layer_ptr;
   }
 
-  TestContentLayerImpl* CreateDrawingSurface(LayerImpl* parent,
+  TestContentLayerImpl* CreateDrawingSurface(LayerImpl* property_parent,
                                              const gfx::Transform& transform,
                                              const gfx::PointF& position,
                                              const gfx::Size& bounds,
                                              bool opaque) {
-    TestContentLayerImpl* layer =
-        CreateDrawingLayer(parent, transform, position, bounds, opaque);
-    layer->test_properties()->force_render_surface = true;
+    TestContentLayerImpl* layer = CreateDrawingLayer(property_parent, transform,
+                                                     position, bounds, opaque);
+    EnsureTransformNode(layer);
+    CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest;
     return layer;
   }
 
+  void SetMasksToBounds(LayerImpl* layer) {
+    layer->SetMasksToBounds(true);
+    CreateClipNode(layer);
+  }
+
   void DestroyLayers() {
-    host_->host_impl()->active_tree()->SetRootLayerForTesting(nullptr);
-    render_surface_list_impl_.clear();
-    mask_layers_.clear();
+    auto* tree = host_->host_impl()->active_tree();
+    tree->SetRootLayerForTesting(nullptr);
+    tree->DetachLayers();
+    tree->property_trees()->clear();
     layer_iterator_.reset();
   }
 
-  void AddCopyRequest(Layer* layer) {
-    layer->RequestCopyOfOutput(viz::CopyOutputRequest::CreateStubForTesting());
-  }
-
-  void AddCopyRequest(LayerImpl* layer) {
-    layer->test_properties()->copy_requests.push_back(
-        viz::CopyOutputRequest::CreateStubForTesting());
+  LayerImpl* CreateCopyLayer(LayerImpl* parent,
+                             const gfx::Transform& transform,
+                             const gfx::PointF& position,
+                             const gfx::Size& bounds) {
+    LayerImpl* layer = CreateSurface(parent, transform, position, bounds);
+    auto* effect_node = GetEffectNode(layer);
+    effect_node->render_surface_reason = RenderSurfaceReason::kCopyRequest;
+    effect_node->has_copy_request = true;
+    effect_node->closest_ancestor_with_copy_request_id = effect_node->id;
+    auto& effect_tree = GetPropertyTrees(layer)->effect_tree;
+    effect_tree.AddCopyRequest(effect_node->id,
+                               viz::CopyOutputRequest::CreateStubForTesting());
+    // TODO(wangxianzhu): Let EffectTree::UpdateEffects() handle this.
+    do {
+      effect_node->subtree_has_copy_request = true;
+      effect_node = effect_tree.Node(effect_node->parent_id);
+    } while (effect_node && !effect_node->subtree_has_copy_request);
+    return layer;
   }
 
   void CalcDrawEtc(TestContentLayerImpl* root) {
-    root->layer_tree_impl()->BuildLayerListForTesting();
     DCHECK(root == root->layer_tree_impl()->root_layer_for_testing());
 
-    // These occlusion tests attach and detach layers in multiple
-    // iterations, so rebuild property trees every time.
-    root->layer_tree_impl()->property_trees()->needs_rebuild = true;
-
+    RenderSurfaceList render_surface_list_impl;
     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-        root, gfx::Rect(root->bounds()), &render_surface_list_impl_);
+        root, gfx::Rect(root->bounds()), &render_surface_list_impl);
     LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
 
     layer_iterator_ = std::make_unique<EffectTreeLayerListIterator>(
@@ -268,19 +289,24 @@
     host_->SetRootLayer(scoped_refptr<Layer>(root));
   }
 
-  void SetRootLayerOnMainThread(LayerImpl* root) {}
-
   void SetProperties(LayerImpl* layer,
+                     LayerImpl* property_parent,
                      const gfx::Transform& transform,
-                     const gfx::PointF& position,
+                     const gfx::PointF& offset_to_property_parent,
                      const gfx::Size& bounds) {
-    layer->test_properties()->transform = transform;
-    layer->test_properties()->position = position;
+    layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
     layer->SetBounds(bounds);
-  }
-
-  void SetMask(LayerImpl* owning_layer, std::unique_ptr<LayerImpl> layer) {
-    owning_layer->test_properties()->SetMaskLayer(std::move(layer));
+    CopyProperties(property_parent, layer);
+    gfx::Vector2dF offset_to_transform_parent =
+        property_parent->offset_to_transform_parent() +
+        offset_to_property_parent.OffsetFromOrigin();
+    if (transform.IsIdentity()) {
+      layer->SetOffsetToTransformParent(offset_to_transform_parent);
+    } else {
+      auto& transform_node = CreateTransformNode(layer);
+      transform_node.local = transform;
+      transform_node.post_translation = offset_to_transform_parent;
+    }
   }
 
   bool opaque_layers_;
@@ -288,10 +314,7 @@
   TestTaskGraphRunner task_graph_runner_;
   std::unique_ptr<AnimationHost> animation_host_;
   std::unique_ptr<FakeLayerTreeHost> host_;
-  // These hold ownership of the layers for the duration of the test.
-  RenderSurfaceList render_surface_list_impl_;
   std::unique_ptr<EffectTreeLayerListIterator> layer_iterator_;
-  LayerList mask_layers_;
   int next_layer_impl_id_;
 };
 
@@ -318,14 +341,13 @@
       : OcclusionTrackerTest(opaque_layers) {}
 
   void RunMyTest() override {
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true);
+    SetMasksToBounds(parent);
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(30.f, 30.f),
         gfx::Size(500, 500), true);
-    parent->SetMasksToBounds(true);
     this->CalcDrawEtc(root);
 
     TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 1000, 1000));
@@ -352,14 +374,13 @@
     layer_transform.Rotate(90.0);
     layer_transform.Translate(-250.0, -250.0);
 
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true);
+    SetMasksToBounds(parent);
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         true);
-    parent->SetMasksToBounds(true);
     this->CalcDrawEtc(root);
 
     TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 1000, 1000));
@@ -384,14 +405,13 @@
     gfx::Transform layer_transform;
     layer_transform.Translate(20.0, 20.0);
 
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true);
+    SetMasksToBounds(parent);
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         true);
-    parent->SetMasksToBounds(true);
     this->CalcDrawEtc(root);
 
     TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 1000, 1000));
@@ -418,12 +438,11 @@
     child_transform.Rotate(90.0);
     child_transform.Translate(-250.0, -250.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
-    parent->SetMasksToBounds(true);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
+    SetMasksToBounds(parent);
     LayerImpl* child = this->CreateSurface(
         parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500));
-    child->SetMasksToBounds(true);
+    SetMasksToBounds(child);
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         child, this->identity_matrix, gfx::PointF(10.f, 10.f),
         gfx::Size(500, 500), true);
@@ -505,14 +524,12 @@
       : OcclusionTrackerTest(opaque_layers) {}
 
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(200, 200));
 
     gfx::Transform layer1_matrix;
     layer1_matrix.Scale(2.0, 2.0);
-    TestContentLayerImpl* layer1 = this->CreateDrawingLayer(
+    TestContentLayerImpl* layer1 = this->CreateDrawingSurface(
         parent, layer1_matrix, gfx::PointF(), gfx::Size(100, 100), true);
-    layer1->test_properties()->force_render_surface = true;
 
     gfx::Transform layer2_matrix;
     layer2_matrix.Translate(25.0, 25.0);
@@ -542,8 +559,7 @@
   explicit OcclusionTrackerTestVisitTargetTwoTimes(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     LayerImpl* surface = this->CreateSurface(
         root, this->identity_matrix, gfx::PointF(30.f, 30.f), gfx::Size());
     TestContentLayerImpl* surface_child = this->CreateDrawingLayer(
@@ -607,8 +623,7 @@
     gfx::Transform layer_transform;
     layer_transform.Translate(10.0, 10.0);
 
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(1000, 1000));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(1000, 1000));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true);
     LayerImpl* child = this->CreateSurface(
@@ -653,15 +668,14 @@
     child_transform.Rotate(90.0);
     child_transform.Translate(-250.0, -250.0);
 
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(1000, 1000));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(1000, 1000));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true);
-    parent->SetMasksToBounds(true);
+    SetMasksToBounds(parent);
     TestContentLayerImpl* child = this->CreateDrawingSurface(
         parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         false);
-    child->SetMasksToBounds(true);
+    SetMasksToBounds(child);
     TestContentLayerImpl* layer1 = this->CreateDrawingLayer(
         child, this->identity_matrix, gfx::PointF(10.f, 10.f),
         gfx::Size(500, 500), true);
@@ -725,9 +739,8 @@
   explicit OcclusionTrackerTestOverlappingSurfaceSiblings(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
-    parent->SetMasksToBounds(true);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
+    SetMasksToBounds(parent);
     LayerImpl* child1 = this->CreateSurface(
         parent, this->identity_matrix, gfx::PointF(10.f, 0.f), gfx::Size());
     LayerImpl* child2 = this->CreateSurface(
@@ -790,17 +803,16 @@
     child2_transform.Rotate(90.0);
     child2_transform.Translate(-250.0, -250.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
-    parent->SetMasksToBounds(true);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
+    SetMasksToBounds(parent);
     LayerImpl* child1 = this->CreateSurface(
         parent, child1_transform, gfx::PointF(30.f, 20.f), gfx::Size(10, 10));
-    LayerImpl* child2 = this->CreateDrawingSurface(parent, child2_transform,
-                                                   gfx::PointF(20.f, 40.f),
-                                                   gfx::Size(10, 10), false);
     TestContentLayerImpl* layer1 = this->CreateDrawingLayer(
         child1, this->identity_matrix, gfx::PointF(-10.f, -20.f),
         gfx::Size(510, 510), true);
+    LayerImpl* child2 = this->CreateDrawingSurface(parent, child2_transform,
+                                                   gfx::PointF(20.f, 40.f),
+                                                   gfx::Size(10, 10), false);
     TestContentLayerImpl* layer2 = this->CreateDrawingLayer(
         child2, this->identity_matrix, gfx::PointF(-10.f, -10.f),
         gfx::Size(510, 510), true);
@@ -880,16 +892,15 @@
     layer_transform.Rotate(90.0);
     layer_transform.Translate(-250.0, -250.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
-    parent->SetMasksToBounds(true);
-    TestContentLayerImpl* blur_layer = this->CreateDrawingLayer(
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
+    SetMasksToBounds(parent);
+    TestContentLayerImpl* blur_layer = this->CreateDrawingSurface(
         parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         true);
-    TestContentLayerImpl* opaque_layer = this->CreateDrawingLayer(
+    TestContentLayerImpl* opaque_layer = this->CreateDrawingSurface(
         parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         true);
-    TestContentLayerImpl* opacity_layer = this->CreateDrawingLayer(
+    TestContentLayerImpl* opacity_layer = this->CreateDrawingSurface(
         parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500),
         true);
 
@@ -898,22 +909,19 @@
         parent, rounded_corner_transform, gfx::PointF(30.f, 30.f),
         gfx::Size(500, 500), true);
 
-    blur_layer->test_properties()->force_render_surface = true;
     FilterOperations filters;
     filters.Append(FilterOperation::CreateBlurFilter(10.f));
-    blur_layer->test_properties()->filters = filters;
+    GetEffectNode(blur_layer)->filters = filters;
 
-    opaque_layer->test_properties()->force_render_surface = true;
     filters.Clear();
     filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f));
-    opaque_layer->test_properties()->filters = filters;
+    GetEffectNode(opaque_layer)->filters = filters;
 
-    opacity_layer->test_properties()->force_render_surface = true;
     filters.Clear();
     filters.Append(FilterOperation::CreateOpacityFilter(0.5f));
-    opacity_layer->test_properties()->filters = filters;
+    GetEffectNode(opacity_layer)->filters = filters;
 
-    rounded_corner_layer->test_properties()->rounded_corner_bounds =
+    CreateEffectNode(rounded_corner_layer).rounded_corner_bounds =
         gfx::RRectF(1, 2, 3, 4, 5, 6);
 
     this->CalcDrawEtc(parent);
@@ -981,8 +989,7 @@
   explicit OcclusionTrackerTestOpaqueContentsRegionEmpty(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(300, 300));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 300));
     TestContentLayerImpl* layer =
         this->CreateDrawingSurface(parent, this->identity_matrix, gfx::PointF(),
                                    gfx::Size(200, 200), false);
@@ -1011,8 +1018,7 @@
   explicit OcclusionTrackerTestOpaqueContentsRegionNonEmpty(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(300, 300));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 300));
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(100.f, 100.f),
         gfx::Size(200, 200), false);
@@ -1068,14 +1074,13 @@
     transform.Translate3d(0.0, 0.0, 110.0);
     transform.Translate(-50.0, -50.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
     TestContentLayerImpl* layer = this->CreateDrawingLayer(
         parent, transform, gfx::PointF(), gfx::Size(100, 100), true);
-    parent->test_properties()->should_flatten_transform = false;
-    parent->test_properties()->sorting_context_id = 1;
-    layer->test_properties()->should_flatten_transform = false;
-    layer->test_properties()->sorting_context_id = 1;
+    GetTransformNode(parent)->flattens_inherited_transform = false;
+    GetTransformNode(parent)->sorting_context_id = 1;
+    GetTransformNode(layer)->flattens_inherited_transform = false;
+    GetTransformNode(layer)->sorting_context_id = 1;
     this->CalcDrawEtc(parent);
 
     TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 1000, 1000));
@@ -1100,8 +1105,7 @@
     surface_transform.Scale(2.0, 2.0);
     surface_transform.Translate(-150.0, -150.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(500, 500));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(500, 500));
     TestContentLayerImpl* surface = this->CreateDrawingSurface(
         parent, surface_transform, gfx::PointF(), gfx::Size(300, 300), false);
     TestContentLayerImpl* surface2 = this->CreateDrawingSurface(
@@ -1145,9 +1149,8 @@
       bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(300, 300));
-    parent->SetMasksToBounds(true);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 300));
+    SetMasksToBounds(parent);
     TestContentLayerImpl* surface =
         this->CreateDrawingSurface(parent, this->identity_matrix, gfx::PointF(),
                                    gfx::Size(500, 300), false);
@@ -1177,8 +1180,7 @@
     // This test verifies that the surface cliprect does not end up empty and
     // clip away the entire unoccluded rect.
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 200));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 200));
     LayerImpl* surface =
         this->CreateDrawingSurface(parent, this->identity_matrix, gfx::PointF(),
                                    gfx::Size(100, 100), false);
@@ -1285,12 +1287,11 @@
       // which are above it in the z-order in various configurations. The
       // surface is scaled to test that the pixel moving is done in the target
       // space, where the backdrop filter is applied.
-      TestContentLayerImpl* parent = this->CreateRoot(
-          this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
-      LayerImpl* filtered_surface = this->CreateDrawingLayer(
+      TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(200, 200));
+      LayerImpl* filtered_surface = this->CreateDrawingSurface(
           parent, scale_by_half, gfx::PointF(50.f, 50.f), gfx::Size(100, 100),
           false);
-      filtered_surface->test_properties()->backdrop_filters = filters;
+      GetEffectNode(filtered_surface)->backdrop_filters = filters;
       gfx::Rect occlusion_rect;
       switch (i) {
         case LEFT:
@@ -1312,7 +1313,6 @@
       LayerImpl* occluding_layer = this->CreateDrawingLayer(
           parent, this->identity_matrix, gfx::PointF(occlusion_rect.origin()),
           occlusion_rect.size(), true);
-      occluding_layer->test_properties()->force_render_surface = false;
       this->CalcDrawEtc(parent);
 
       TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 200, 200));
@@ -1400,12 +1400,11 @@
       // which are above it in the z-order in various configurations. The
       // surface is scaled to test that the pixel moving is done in the target
       // space, where the backdrop filter is applied.
-      TestContentLayerImpl* parent = this->CreateRoot(
-          this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
-      LayerImpl* filtered_surface = this->CreateDrawingLayer(
+      TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(200, 200));
+      LayerImpl* filtered_surface = this->CreateDrawingSurface(
           parent, scale_by_half, gfx::PointF(50.f, 50.f), gfx::Size(100, 100),
           false);
-      filtered_surface->test_properties()->backdrop_filters = filters;
+      GetEffectNode(filtered_surface)->backdrop_filters = filters;
       gfx::Rect occlusion_rect;
       switch (i) {
         case LEFT:
@@ -1427,7 +1426,6 @@
       LayerImpl* occluding_layer = this->CreateDrawingLayer(
           parent, this->identity_matrix, gfx::PointF(occlusion_rect.origin()),
           occlusion_rect.size(), true);
-      occluding_layer->test_properties()->force_render_surface = false;
       this->CalcDrawEtc(parent);
 
       TestOcclusionTrackerWithClip occlusion(gfx::Rect(0, 0, 200, 200));
@@ -1504,26 +1502,23 @@
 
     // Makes two surfaces that completely cover |parent|. The occlusion both
     // above and below the filters will be reduced by each of them.
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(75, 75));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(75, 75));
     LayerImpl* parent = this->CreateSurface(root, scale_by_half, gfx::PointF(),
                                             gfx::Size(150, 150));
-    parent->SetMasksToBounds(true);
-    LayerImpl* filtered_surface1 = this->CreateDrawingLayer(
+    SetMasksToBounds(parent);
+    LayerImpl* filtered_surface1 = this->CreateDrawingSurface(
         parent, scale_by_half, gfx::PointF(), gfx::Size(300, 300), false);
-    LayerImpl* filtered_surface2 = this->CreateDrawingLayer(
+    LayerImpl* filtered_surface2 = this->CreateDrawingSurface(
         parent, scale_by_half, gfx::PointF(), gfx::Size(300, 300), false);
     LayerImpl* occluding_layer_above = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(100.f, 100.f),
         gfx::Size(50, 50), true);
 
     // Filters make the layers own surfaces.
-    filtered_surface1->test_properties()->force_render_surface = true;
-    filtered_surface2->test_properties()->force_render_surface = true;
     FilterOperations filters;
     filters.Append(FilterOperation::CreateBlurFilter(1.f));
-    filtered_surface1->test_properties()->backdrop_filters = filters;
-    filtered_surface2->test_properties()->backdrop_filters = filters;
+    GetEffectNode(filtered_surface1)->backdrop_filters = filters;
+    GetEffectNode(filtered_surface2)->backdrop_filters = filters;
 
     this->CalcDrawEtc(root);
 
@@ -1572,20 +1567,18 @@
     // The surface is scaled to test that the pixel moving is done in the target
     // space, where the backdrop filter is applied, and the surface appears at
     // 50, 50.
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(300, 150));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 150));
     LayerImpl* behind_surface_layer = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(60.f, 60.f),
         gfx::Size(30, 30), true);
-    LayerImpl* filtered_surface =
-        this->CreateDrawingLayer(parent, scale_by_half, gfx::PointF(50.f, 50.f),
-                                 gfx::Size(100, 100), false);
+    LayerImpl* filtered_surface = this->CreateDrawingSurface(
+        parent, scale_by_half, gfx::PointF(50.f, 50.f), gfx::Size(100, 100),
+        false);
 
     // Filters make the layer own a surface.
-    filtered_surface->test_properties()->force_render_surface = true;
     FilterOperations filters;
     filters.Append(FilterOperation::CreateBlurFilter(3.f));
-    filtered_surface->test_properties()->backdrop_filters = filters;
+    GetEffectNode(filtered_surface)->backdrop_filters = filters;
 
     this->CalcDrawEtc(parent);
 
@@ -1634,20 +1627,18 @@
     // layer which is above it in the z-order.  The surface is
     // scaled to test that the pixel moving is done in the target space, where
     // the backdrop filter is applied, and the surface appears at 50, 50.
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 150));
-    LayerImpl* filtered_surface =
-        this->CreateDrawingLayer(parent, scale_by_half, gfx::PointF(50.f, 50.f),
-                                 gfx::Size(100, 100), false);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(200, 150));
+    LayerImpl* filtered_surface = this->CreateDrawingSurface(
+        parent, scale_by_half, gfx::PointF(50.f, 50.f), gfx::Size(100, 100),
+        false);
     LayerImpl* occluding_layer = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(50.f, 50.f),
         gfx::Size(50, 50), true);
 
     // Filters make the layer own a surface.
-    filtered_surface->test_properties()->force_render_surface = true;
     FilterOperations filters;
     filters.Append(FilterOperation::CreateBlurFilter(3.f));
-    filtered_surface->test_properties()->backdrop_filters = filters;
+    GetEffectNode(filtered_surface)->backdrop_filters = filters;
 
     this->CalcDrawEtc(parent);
 
@@ -1699,11 +1690,10 @@
     // are above it in the z-order.  The surface is scaled to test that the
     // pixel moving is done in the target space, where the backdrop filter is
     // applied, but the surface appears at 50, 50.
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(300, 150));
-    LayerImpl* filtered_surface =
-        this->CreateDrawingLayer(parent, scale_by_half, gfx::PointF(50.f, 50.f),
-                                 gfx::Size(100, 100), false);
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 150));
+    LayerImpl* filtered_surface = this->CreateDrawingSurface(
+        parent, scale_by_half, gfx::PointF(50.f, 50.f), gfx::Size(100, 100),
+        false);
     LayerImpl* above_surface_layer = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(70.f, 50.f),
         gfx::Size(30, 50), true);
@@ -1712,10 +1702,9 @@
         gfx::Size(10, 10), true);
 
     // Filters make the layer own a surface.
-    filtered_surface->test_properties()->force_render_surface = true;
     FilterOperations filters;
     filters.Append(FilterOperation::CreateBlurFilter(3.f));
-    filtered_surface->test_properties()->backdrop_filters = filters;
+    GetEffectNode(filtered_surface)->backdrop_filters = filters;
 
     this->CalcDrawEtc(parent);
 
@@ -1766,9 +1755,8 @@
   explicit OcclusionTrackerTestBlendModeDoesNotOcclude(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
-    LayerImpl* blend_mode_layer = this->CreateDrawingLayer(
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100));
+    LayerImpl* blend_mode_layer = this->CreateDrawingSurface(
         parent, this->identity_matrix, gfx::PointF(0.f, 0.f),
         gfx::Size(100, 100), true);
     LayerImpl* top_layer = this->CreateDrawingLayer(
@@ -1776,8 +1764,7 @@
         gfx::Size(20, 22), true);
 
     // Blend mode makes the layer own a surface.
-    blend_mode_layer->test_properties()->force_render_surface = true;
-    blend_mode_layer->test_properties()->blend_mode = SkBlendMode::kMultiply;
+    GetEffectNode(blend_mode_layer)->blend_mode = SkBlendMode::kMultiply;
 
     this->CalcDrawEtc(parent);
 
@@ -1816,8 +1803,7 @@
     gfx::Size tracking_size(100, 100);
     gfx::Size below_tracking_size(99, 99);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(400, 400));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(400, 400));
     LayerImpl* large = this->CreateDrawingLayer(
         parent, this->identity_matrix, gfx::PointF(), tracking_size, true);
     LayerImpl* small =
@@ -1856,12 +1842,11 @@
     gfx::Transform scale_transform;
     scale_transform.Scale(512.0, 512.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(400, 400));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(400, 400));
     LayerImpl* clip =
         this->CreateLayer(parent, this->identity_matrix,
                           gfx::PointF(10.f, 10.f), gfx::Size(50, 50));
-    clip->SetMasksToBounds(true);
+    SetMasksToBounds(clip);
     LayerImpl* scale = this->CreateLayer(clip, scale_transform, gfx::PointF(),
                                          gfx::Size(1, 1));
     LayerImpl* scaled = this->CreateDrawingLayer(
@@ -1890,12 +1875,11 @@
     gfx::Transform scale_transform;
     scale_transform.Scale(512.0, 512.0);
 
-    TestContentLayerImpl* parent = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(400, 400));
+    TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(400, 400));
     LayerImpl* clip =
         this->CreateLayer(parent, this->identity_matrix,
                           gfx::PointF(10.f, 10.f), gfx::Size(50, 50));
-    clip->SetMasksToBounds(true);
+    SetMasksToBounds(clip);
     LayerImpl* surface = this->CreateDrawingSurface(
         clip, this->identity_matrix, gfx::PointF(), gfx::Size(400, 30), false);
     LayerImpl* scale = this->CreateLayer(surface, scale_transform,
@@ -1924,14 +1908,12 @@
   explicit OcclusionTrackerTestCopyRequestDoesOcclude(bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(400, 400));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(400, 400));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(400, 400), true);
     LayerImpl* copy =
-        this->CreateLayer(parent, this->identity_matrix, gfx::PointF(100, 0),
-                          gfx::Size(200, 400));
-    this->AddCopyRequest(copy);
+        this->CreateCopyLayer(parent, this->identity_matrix,
+                              gfx::PointF(100, 0), gfx::Size(200, 400));
     LayerImpl* copy_child = this->CreateDrawingLayer(
         copy, this->identity_matrix, gfx::PointF(), gfx::Size(200, 400), true);
     LayerImpl* top_layer =
@@ -1974,22 +1956,19 @@
       bool opaque_layers)
       : OcclusionTrackerTest(opaque_layers) {}
   void RunMyTest() override {
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(400, 400));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(400, 400));
     TestContentLayerImpl* parent = this->CreateDrawingLayer(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(400, 400), true);
     LayerImpl* hide = this->CreateLayer(parent, this->identity_matrix,
                                         gfx::PointF(), gfx::Size());
-    LayerImpl* copy =
-        this->CreateLayer(hide, this->identity_matrix, gfx::PointF(100.f, 0.f),
-                          gfx::Size(200, 400));
-    this->AddCopyRequest(copy);
-    LayerImpl* copy_child = this->CreateDrawingLayer(
-        copy, this->identity_matrix, gfx::PointF(), gfx::Size(200, 400), true);
-
     // The |copy| layer is hidden but since it is being copied, it will be
     // drawn.
-    hide->test_properties()->hide_layer_and_subtree = true;
+    CreateEffectNode(hide).opacity = 0.f;
+    LayerImpl* copy =
+        this->CreateCopyLayer(hide, this->identity_matrix,
+                              gfx::PointF(100.f, 0.f), gfx::Size(200, 400));
+    LayerImpl* copy_child = this->CreateDrawingLayer(
+        copy, this->identity_matrix, gfx::PointF(), gfx::Size(200, 400), true);
 
     this->CalcDrawEtc(root);
 
@@ -2021,8 +2000,7 @@
   void RunMyTest() override {
     gfx::Transform translate;
     translate.Translate(10.0, 20.0);
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     LayerImpl* surface = this->CreateSurface(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
     LayerImpl* layer = this->CreateDrawingLayer(
@@ -2109,8 +2087,7 @@
   void RunMyTest() override {
     gfx::Transform translate;
     translate.Translate(10.0, 20.0);
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     LayerImpl* surface = this->CreateSurface(
         root, this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
     LayerImpl* layer = this->CreateDrawingLayer(
@@ -2272,8 +2249,7 @@
   void RunMyTest() override {
     gfx::Transform translate;
     translate.Translate(10.0, 20.0);
-    TestContentLayerImpl* root = this->CreateRoot(
-        this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
+    TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200));
     LayerImpl* surface = this->CreateSurface(root, translate, gfx::PointF(),
                                              gfx::Size(200, 200));
     LayerImpl* layer =
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index e962ff9..2fab28a 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -49,13 +49,12 @@
   bool* subtree_has_rounded_corner;
 };
 
-template <typename LayerType>
 class PropertyTreeBuilderContext {
  public:
-  PropertyTreeBuilderContext(LayerType* root_layer,
-                             const LayerType* page_scale_layer,
-                             const LayerType* inner_viewport_scroll_layer,
-                             const LayerType* outer_viewport_scroll_layer,
+  PropertyTreeBuilderContext(Layer* root_layer,
+                             const Layer* page_scale_layer,
+                             const Layer* inner_viewport_scroll_layer,
+                             const Layer* outer_viewport_scroll_layer,
                              const ElementId overscroll_elasticity_element_id,
                              const gfx::Vector2dF& elastic_overscroll,
                              float page_scale_factor,
@@ -83,25 +82,25 @@
 
  private:
   void BuildPropertyTreesInternal(
-      LayerType* layer,
+      Layer* layer,
       const DataForRecursion& data_from_parent) const;
 
   bool AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor,
-                                LayerType* layer,
+                                Layer* layer,
                                 bool created_render_surface,
                                 DataForRecursion* data_for_children) const;
 
   void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor,
-                           LayerType* layer,
+                           Layer* layer,
                            bool created_transform_node,
                            DataForRecursion* data_for_children) const;
 
   bool AddEffectNodeIfNeeded(const DataForRecursion& data_from_ancestor,
-                             LayerType* layer,
+                             Layer* layer,
                              DataForRecursion* data_for_children) const;
 
   void AddScrollNodeIfNeeded(const DataForRecursion& data_from_ancestor,
-                             LayerType* layer,
+                             Layer* layer,
                              DataForRecursion* data_for_children) const;
 
   bool UpdateRenderSurfaceIfNeeded(int parent_effect_tree_id,
@@ -109,10 +108,10 @@
                                    bool subtree_has_rounded_corner,
                                    bool created_transform_node) const;
 
-  LayerType* root_layer_;
-  const LayerType* page_scale_layer_;
-  const LayerType* inner_viewport_scroll_layer_;
-  const LayerType* outer_viewport_scroll_layer_;
+  Layer* root_layer_;
+  const Layer* page_scale_layer_;
+  const Layer* inner_viewport_scroll_layer_;
+  const Layer* outer_viewport_scroll_layer_;
   const ElementId overscroll_elasticity_element_id_;
   const gfx::Vector2dF elastic_overscroll_;
   float page_scale_factor_;
@@ -125,121 +124,47 @@
   ScrollTree& scroll_tree_;
 };
 
-static LayerImplList& LayerChildren(LayerImpl* layer) {
-  return layer->test_properties()->children;
-}
-
-static const LayerList& LayerChildren(Layer* layer) {
-  return layer->children();
-}
-
-static LayerImpl* LayerChildAt(LayerImpl* layer, int index) {
-  return layer->test_properties()->children[index];
-}
-
-static Layer* LayerChildAt(Layer* layer, int index) {
-  return layer->children()[index].get();
-}
-
-static bool HasClipRect(Layer* layer) {
-  return !layer->clip_rect().IsEmpty();
-}
-
-static bool HasClipRect(LayerImpl* layer) {
-  return false;
-}
-
-static inline const FilterOperations& Filters(Layer* layer) {
-  return layer->filters();
-}
-
-static inline const FilterOperations& Filters(LayerImpl* layer) {
-  return layer->test_properties()->filters;
-}
-
-static bool IsFastRoundedCorner(Layer* layer) {
-  return layer->is_fast_rounded_corner();
-}
-
-static bool IsFastRoundedCorner(LayerImpl* layer) {
-  return false;
-}
-
-static bool HasRoundedCorner(Layer* layer) {
-  return layer->HasRoundedCorner();
-}
-
-static bool HasRoundedCorner(LayerImpl* layer) {
-  return !layer->test_properties()->rounded_corner_bounds.IsEmpty();
-}
-
-static PictureLayer* MaskLayer(Layer* layer) {
-  return layer->mask_layer();
-}
-
-static LayerImpl* MaskLayer(LayerImpl* layer) {
-  return layer->test_properties()->mask_layer;
-}
-
-static const gfx::Transform& Transform(Layer* layer) {
-  return layer->transform();
-}
-
-static const gfx::Transform& Transform(LayerImpl* layer) {
-  return layer->test_properties()->transform;
-}
-
-static const gfx::PointF& Position(Layer* layer) {
-  return layer->position();
-}
-
-static const gfx::PointF& Position(LayerImpl* layer) {
-  return layer->test_properties()->position;
-}
-
 // Methods to query state from the AnimationHost ----------------------
-template <typename LayerType>
-bool OpacityIsAnimating(const MutatorHost& host, LayerType* layer) {
+bool OpacityIsAnimating(const MutatorHost& host, Layer* layer) {
   return host.IsAnimatingOpacityProperty(layer->element_id(),
                                          layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
 bool HasPotentiallyRunningOpacityAnimation(const MutatorHost& host,
-                                           LayerType* layer) {
+                                           Layer* layer) {
   return host.HasPotentiallyRunningOpacityAnimation(
       layer->element_id(), layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
-bool FilterIsAnimating(const MutatorHost& host, LayerType* layer) {
+bool HasPotentialOpacityAnimation(const MutatorHost& host, Layer* layer) {
+  return HasPotentiallyRunningOpacityAnimation(host, layer) ||
+         layer->OpacityCanAnimateOnImplThread();
+}
+
+bool FilterIsAnimating(const MutatorHost& host, Layer* layer) {
   return host.IsAnimatingFilterProperty(layer->element_id(),
                                         layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
 bool HasPotentiallyRunningFilterAnimation(const MutatorHost& host,
-                                          LayerType* layer) {
+                                          Layer* layer) {
   return host.HasPotentiallyRunningFilterAnimation(
       layer->element_id(), layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
-bool TransformIsAnimating(const MutatorHost& host, LayerType* layer) {
+bool TransformIsAnimating(const MutatorHost& host, Layer* layer) {
   return host.IsAnimatingTransformProperty(layer->element_id(),
                                            layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
 bool HasPotentiallyRunningTransformAnimation(const MutatorHost& host,
-                                             LayerType* layer) {
+                                             Layer* layer) {
   return host.HasPotentiallyRunningTransformAnimation(
       layer->element_id(), layer->GetElementTypeForAnimation());
 }
 
-template <typename LayerType>
 void GetAnimationScales(const MutatorHost& host,
-                        LayerType* layer,
+                        Layer* layer,
                         float* maximum_scale,
                         float* starting_scale) {
   return host.GetAnimationScales(layer->element_id(),
@@ -247,94 +172,46 @@
                                  maximum_scale, starting_scale);
 }
 
-template <typename LayerType>
-bool AnimationsPreserveAxisAlignment(const MutatorHost& host,
-                                     LayerType* layer) {
+bool AnimationsPreserveAxisAlignment(const MutatorHost& host, Layer* layer) {
   return host.AnimationsPreserveAxisAlignment(layer->element_id());
 }
 
-template <typename LayerType>
 bool HasAnyAnimationTargetingProperty(const MutatorHost& host,
-                                      LayerType* layer,
+                                      Layer* layer,
                                       TargetProperty::Type property) {
   return host.HasAnyAnimationTargetingProperty(layer->element_id(), property);
 }
 
 // -------------------------------------------------------------------
 
-template <typename LayerType>
-static bool LayerClipsSubtreeToItsBounds(LayerType* layer) {
-  return layer->masks_to_bounds() || MaskLayer(layer);
+bool LayerClipsSubtreeToItsBounds(Layer* layer) {
+  return layer->masks_to_bounds() || layer->mask_layer();
 }
 
-template <typename LayerType>
-static bool LayerClipsSubtree(LayerType* layer) {
-  return LayerClipsSubtreeToItsBounds(layer) || HasRoundedCorner(layer) ||
-         HasClipRect(layer);
+bool LayerClipsSubtree(Layer* layer) {
+  return LayerClipsSubtreeToItsBounds(layer) || layer->HasRoundedCorner() ||
+         !layer->clip_rect().IsEmpty();
 }
 
-gfx::RectF EffectiveClipRect(Layer* layer) {
-  return layer->EffectiveClipRect();
+gfx::RRectF RoundedCornerBounds(Layer* layer) {
+  return gfx::RRectF(layer->EffectiveClipRect(), layer->corner_radii());
 }
 
-gfx::RectF EffectiveClipRect(LayerImpl* layer) {
-  return gfx::RectF(gfx::PointF(), gfx::SizeF(layer->bounds()));
-}
-
-static gfx::RRectF RoundedCornerBounds(Layer* layer) {
-  return gfx::RRectF(EffectiveClipRect(layer), layer->corner_radii());
-}
-
-static gfx::RRectF RoundedCornerBounds(LayerImpl* layer) {
-  return layer->test_properties()->rounded_corner_bounds;
-}
-
-static Layer* LayerParent(Layer* layer) {
-  return layer->parent();
-}
-
-static LayerImpl* LayerParent(LayerImpl* layer) {
-  return layer->test_properties()->parent;
-}
-
-static inline int SortingContextId(Layer* layer) {
-  return layer->sorting_context_id();
-}
-
-static inline int SortingContextId(LayerImpl* layer) {
-  return layer->test_properties()->sorting_context_id;
-}
-
-static inline bool Is3dSorted(Layer* layer) {
-  return layer->sorting_context_id() != 0;
-}
-
-static inline bool Is3dSorted(LayerImpl* layer) {
-  return layer->test_properties()->sorting_context_id != 0;
-}
-
-static inline void SetHasClipNode(Layer* layer, bool val) {
-  layer->SetHasClipNode(val);
-}
-
-static inline void SetHasClipNode(LayerImpl* layer, bool val) {}
-
-template <typename LayerType>
-void PropertyTreeBuilderContext<LayerType>::AddClipNodeIfNeeded(
+void PropertyTreeBuilderContext::AddClipNodeIfNeeded(
     const DataForRecursion& data_from_ancestor,
-    LayerType* layer,
+    Layer* layer,
     bool created_transform_node,
     DataForRecursion* data_for_children) const {
   const int parent_id = data_from_ancestor.clip_tree_parent;
 
   bool layer_clips_subtree = LayerClipsSubtree(layer);
   bool requires_node =
-      layer_clips_subtree || Filters(layer).HasFilterThatMovesPixels();
+      layer_clips_subtree || layer->filters().HasFilterThatMovesPixels();
   if (!requires_node) {
     data_for_children->clip_tree_parent = parent_id;
   } else {
     ClipNode node;
-    node.clip = EffectiveClipRect(layer);
+    node.clip = layer->EffectiveClipRect();
 
     // Move the clip bounds so that it is relative to the transform parent.
     node.clip += layer->offset_to_transform_parent();
@@ -345,47 +222,29 @@
     if (layer_clips_subtree) {
       node.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP;
     } else {
-      DCHECK(Filters(layer).HasFilterThatMovesPixels());
+      DCHECK(layer->filters().HasFilterThatMovesPixels());
       node.clip_type = ClipNode::ClipType::EXPANDS_CLIP;
       node.clip_expander = ClipExpander(layer->effect_tree_index());
     }
     data_for_children->clip_tree_parent = clip_tree_.Insert(node, parent_id);
   }
 
-  SetHasClipNode(layer, requires_node);
+  layer->SetHasClipNode(requires_node);
   layer->SetClipTreeIndex(data_for_children->clip_tree_parent);
 }
 
-template <typename LayerType>
-static inline bool IsAtBoundaryOf3dRenderingContext(LayerType* layer) {
-  return LayerParent(layer)
-             ? SortingContextId(LayerParent(layer)) != SortingContextId(layer)
-             : Is3dSorted(layer);
+bool IsAtBoundaryOf3dRenderingContext(Layer* layer) {
+  if (layer->parent())
+    return layer->parent()->sorting_context_id() != layer->sorting_context_id();
+  return layer->sorting_context_id() != 0;
 }
 
-static inline gfx::Point3F TransformOrigin(Layer* layer) {
-  return layer->transform_origin();
-}
-
-static inline gfx::Point3F TransformOrigin(LayerImpl* layer) {
-  return layer->test_properties()->transform_origin;
-}
-
-static inline bool ShouldFlattenTransform(Layer* layer) {
-  return layer->should_flatten_transform();
-}
-
-static inline bool ShouldFlattenTransform(LayerImpl* layer) {
-  return layer->test_properties()->should_flatten_transform;
-}
-
-template <typename LayerType>
-bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded(
+bool PropertyTreeBuilderContext::AddTransformNodeIfNeeded(
     const DataForRecursion& data_from_ancestor,
-    LayerType* layer,
+    Layer* layer,
     bool created_render_surface,
     DataForRecursion* data_for_children) const {
-  const bool is_root = !LayerParent(layer);
+  const bool is_root = !layer->parent();
   const bool is_page_scale_layer = layer == page_scale_layer_;
   const bool is_overscroll_elasticity_layer =
       overscroll_elasticity_element_id_ &&
@@ -398,7 +257,7 @@
       is_scrollable || layer->IsSnappedToPixelGridInTarget();
 
   const bool has_significant_transform =
-      !Transform(layer).IsIdentityOr2DTranslation();
+      !layer->transform().IsIdentityOr2DTranslation();
 
   const bool has_potentially_animated_transform =
       HasPotentiallyRunningTransformAnimation(mutator_host_, layer);
@@ -420,7 +279,7 @@
                        has_any_transform_animation || has_surface ||
                        is_page_scale_layer || is_overscroll_elasticity_layer ||
                        is_at_boundary_of_3d_rendering_context ||
-                       HasRoundedCorner(layer);
+                       layer->HasRoundedCorner();
 
   int parent_index = TransformTree::kRootNodeId;
   gfx::Vector2dF parent_offset;
@@ -428,14 +287,14 @@
     parent_index = data_from_ancestor.transform_tree_parent;
     // Now layer tree mode (IsUsingLayerLists is false) is for ui compositor
     // only. The transform tree hierarchy is always the same as layer hierarchy.
-    DCHECK_EQ(parent_index, LayerParent(layer)->transform_tree_index());
-    parent_offset = LayerParent(layer)->offset_to_transform_parent();
+    DCHECK_EQ(parent_index, layer->parent()->transform_tree_index());
+    parent_offset = layer->parent()->offset_to_transform_parent();
   }
 
   if (!requires_node) {
-    data_for_children->should_flatten |= ShouldFlattenTransform(layer);
-    gfx::Vector2dF local_offset =
-        Position(layer).OffsetFromOrigin() + Transform(layer).To2dTranslation();
+    data_for_children->should_flatten |= layer->should_flatten_transform();
+    gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() +
+                                  layer->transform().To2dTranslation();
     layer->SetOffsetToTransformParent(parent_offset + local_offset);
     layer->SetShouldFlattenScreenSpaceTransformFromPropertyTree(
         data_from_ancestor.should_flatten);
@@ -459,13 +318,13 @@
   node->scrolls = is_scrollable;
   node->should_be_snapped = is_snapped;
   node->flattens_inherited_transform = data_for_children->should_flatten;
-  node->sorting_context_id = SortingContextId(layer);
+  node->sorting_context_id = layer->sorting_context_id();
 
   if (is_root || is_page_scale_layer) {
     // Root layer and page scale layer should not have transform or offset.
-    DCHECK(Position(layer).IsOrigin());
+    DCHECK(layer->position().IsOrigin());
     DCHECK(parent_offset.IsZero());
-    DCHECK(Transform(layer).IsIdentity());
+    DCHECK(layer->transform().IsIdentity());
 
     if (is_root) {
       DCHECK(!is_page_scale_layer);
@@ -478,9 +337,10 @@
       data_for_children->in_subtree_of_page_scale_layer = true;
     }
   } else {
-    node->local = Transform(layer);
-    node->origin = TransformOrigin(layer);
-    node->post_translation = parent_offset + Position(layer).OffsetFromOrigin();
+    node->local = layer->transform();
+    node->origin = layer->transform_origin();
+    node->post_translation =
+        parent_offset + layer->position().OffsetFromOrigin();
   }
 
   node->in_subtree_of_page_scale_layer =
@@ -488,7 +348,7 @@
 
   // Surfaces inherently flatten transforms.
   data_for_children->should_flatten =
-      ShouldFlattenTransform(layer) || has_surface;
+      layer->should_flatten_transform() || has_surface;
 
   node->has_potential_animation = has_potentially_animated_transform;
   node->is_currently_animating = TransformIsAnimating(mutator_host_, layer);
@@ -513,217 +373,39 @@
   return true;
 }
 
-static inline bool HasPotentialOpacityAnimation(const MutatorHost& host,
-                                                Layer* layer) {
-  return HasPotentiallyRunningOpacityAnimation(host, layer) ||
-         layer->OpacityCanAnimateOnImplThread();
+bool LayerIsInExisting3DRenderingContext(Layer* layer) {
+  return layer->sorting_context_id() != 0 && layer->parent() &&
+         layer->parent()->sorting_context_id() != 0 &&
+         layer->parent()->sorting_context_id() == layer->sorting_context_id();
 }
 
-static inline bool HasPotentialOpacityAnimation(const MutatorHost& host,
-                                                LayerImpl* layer) {
-  return HasPotentiallyRunningOpacityAnimation(host, layer) ||
-         layer->test_properties()->opacity_can_animate;
-}
-
-static inline bool DoubleSided(Layer* layer) {
-  return layer->double_sided();
-}
-
-static inline bool DoubleSided(LayerImpl* layer) {
-  return layer->test_properties()->double_sided;
-}
-
-static inline bool TrilinearFiltering(Layer* layer) {
-  return layer->trilinear_filtering();
-}
-
-static inline bool TrilinearFiltering(LayerImpl* layer) {
-  return layer->test_properties()->trilinear_filtering;
-}
-
-static inline bool CacheRenderSurface(Layer* layer) {
-  return layer->cache_render_surface();
-}
-
-static inline bool CacheRenderSurface(LayerImpl* layer) {
-  return layer->test_properties()->cache_render_surface;
-}
-
-static inline bool ForceRenderSurfaceForTesting(Layer* layer) {
-  return layer->force_render_surface_for_testing();
-}
-
-static inline bool ForceRenderSurfaceForTesting(LayerImpl* layer) {
-  return layer->test_properties()->force_render_surface;
-}
-
-template <typename LayerType>
-static inline bool LayerIsInExisting3DRenderingContext(LayerType* layer) {
-  return Is3dSorted(layer) && LayerParent(layer) &&
-         Is3dSorted(LayerParent(layer)) &&
-         (SortingContextId(LayerParent(layer)) == SortingContextId(layer));
-}
-
-static inline bool IsRootForIsolatedGroup(Layer* layer) {
-  return layer->is_root_for_isolated_group();
-}
-
-static inline bool IsRootForIsolatedGroup(LayerImpl* layer) {
-  return false;
-}
-
-static inline int NumDescendantsThatDrawContent(Layer* layer) {
-  return layer->NumDescendantsThatDrawContent();
-}
-
-static inline int NumLayerOrDescendantsThatDrawContentRecursive(
-    LayerImpl* layer) {
-  int num = layer->DrawsContent() ? 1 : 0;
-  for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) {
-    LayerImpl* child_layer = layer->test_properties()->children[i];
-    num += NumLayerOrDescendantsThatDrawContentRecursive(child_layer);
-  }
-  return num;
-}
-
-static inline int NumDescendantsThatDrawContent(LayerImpl* layer) {
-  int num_descendants_that_draw_content = 0;
-  for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) {
-    LayerImpl* child_layer = layer->test_properties()->children[i];
-    num_descendants_that_draw_content +=
-        NumLayerOrDescendantsThatDrawContentRecursive(child_layer);
-  }
-  return num_descendants_that_draw_content;
-}
-
-static inline float EffectiveOpacity(Layer* layer) {
-  return layer->EffectiveOpacity();
-}
-
-static inline float EffectiveOpacity(LayerImpl* layer) {
-  return layer->test_properties()->hide_layer_and_subtree
-             ? 0.f
-             : layer->test_properties()->opacity;
-}
-
-static inline float Opacity(Layer* layer) {
-  return layer->opacity();
-}
-
-static inline float Opacity(LayerImpl* layer) {
-  return layer->test_properties()->opacity;
-}
-
-static inline SkBlendMode BlendMode(Layer* layer) {
-  return layer->blend_mode();
-}
-
-static inline SkBlendMode BlendMode(LayerImpl* layer) {
-  return layer->test_properties()->blend_mode;
-}
-
-static inline const gfx::PointF FiltersOrigin(Layer* layer) {
-  return layer->filters_origin();
-}
-
-static inline const gfx::PointF FiltersOrigin(LayerImpl* layer) {
-  return layer->test_properties()->filters_origin;
-}
-
-static inline const FilterOperations& BackdropFilters(Layer* layer) {
-  return layer->backdrop_filters();
-}
-
-static inline const FilterOperations& BackdropFilters(LayerImpl* layer) {
-  return layer->test_properties()->backdrop_filters;
-}
-
-static inline const base::Optional<gfx::RRectF>& BackdropFilterBounds(
-    Layer* layer) {
-  return layer->backdrop_filter_bounds();
-}
-
-static inline const base::Optional<gfx::RRectF>& BackdropFilterBounds(
-    LayerImpl* layer) {
-  return layer->test_properties()->backdrop_filter_bounds;
-}
-
-static inline ElementId BackdropMaskElementId(Layer* layer) {
-  return layer->backdrop_mask_element_id();
-}
-
-static inline ElementId BackdropMaskElementId(LayerImpl* layer) {
-  return layer->test_properties()->backdrop_mask_element_id;
-}
-
-static inline float BackdropFilterQuality(Layer* layer) {
-  return layer->backdrop_filter_quality();
-}
-
-static inline float BackdropFilterQuality(LayerImpl* layer) {
-  return layer->test_properties()->backdrop_filter_quality;
-}
-
-static inline bool HideLayerAndSubtree(Layer* layer) {
-  return layer->hide_layer_and_subtree();
-}
-
-static inline bool HideLayerAndSubtree(LayerImpl* layer) {
-  return layer->test_properties()->hide_layer_and_subtree;
-}
-
-static inline bool HasCopyRequest(Layer* layer) {
-  return layer->HasCopyRequest();
-}
-
-static inline bool HasCopyRequest(LayerImpl* layer) {
-  return !layer->test_properties()->copy_requests.empty();
-}
-
-static inline int MirrorCount(Layer* layer) {
-  return layer->mirror_count();
-}
-
-static inline int MirrorCount(LayerImpl* layer) {
-  return 0;
-}
-
-static inline bool PropertyChanged(Layer* layer) {
-  return layer->subtree_property_changed();
-}
-
-static inline bool PropertyChanged(LayerImpl* layer) {
-  return false;
-}
-
-template <typename LayerType>
 RenderSurfaceReason ComputeRenderSurfaceReason(const MutatorHost& mutator_host,
-                                               LayerType* layer,
+                                               Layer* layer,
                                                gfx::Transform current_transform,
                                                bool animation_axis_aligned) {
   const bool preserves_2d_axis_alignment =
       current_transform.Preserves2dAxisAlignment() && animation_axis_aligned;
-  const bool is_root = !LayerParent(layer);
+  const bool is_root = !layer->parent();
   if (is_root)
     return RenderSurfaceReason::kRoot;
 
   // If the layer uses a mask.
-  if (MaskLayer(layer)) {
+  if (layer->mask_layer()) {
     return RenderSurfaceReason::kMask;
   }
 
   // If the layer uses trilinear filtering.
-  if (TrilinearFiltering(layer)) {
+  if (layer->trilinear_filtering()) {
     return RenderSurfaceReason::kTrilinearFiltering;
   }
 
   // If the layer uses a CSS filter.
-  if (!Filters(layer).IsEmpty()) {
+  if (!layer->filters().IsEmpty()) {
     return RenderSurfaceReason::kFilter;
   }
 
   // If the layer uses a CSS backdrop-filter.
-  if (!BackdropFilters(layer).IsEmpty()) {
+  if (!layer->backdrop_filters().IsEmpty()) {
     return RenderSurfaceReason::kBackdropFilter;
   }
 
@@ -733,16 +415,18 @@
     return RenderSurfaceReason::kFilterAnimation;
   }
 
-  int num_descendants_that_draw_content = NumDescendantsThatDrawContent(layer);
+  int num_descendants_that_draw_content =
+      layer->NumDescendantsThatDrawContent();
 
   // If the layer flattens its subtree, but it is treated as a 3D object by its
   // parent (i.e. parent participates in a 3D rendering context).
   if (LayerIsInExisting3DRenderingContext(layer) &&
-      ShouldFlattenTransform(layer) && num_descendants_that_draw_content > 0) {
+      layer->should_flatten_transform() &&
+      num_descendants_that_draw_content > 0) {
     return RenderSurfaceReason::k3dTransformFlattening;
   }
 
-  if (!IsFastRoundedCorner(layer) && HasRoundedCorner(layer) &&
+  if (!layer->is_fast_rounded_corner() && layer->HasRoundedCorner() &&
       num_descendants_that_draw_content > 1) {
     return RenderSurfaceReason::kRoundedCorner;
   }
@@ -751,7 +435,7 @@
   // TODO(rosca): this is temporary, until blending is implemented for other
   // types of quads than viz::RenderPassDrawQuad. Layers having descendants that
   // draw content will still create a separate rendering surface.
-  if (BlendMode(layer) != SkBlendMode::kSrcOver) {
+  if (layer->blend_mode() != SkBlendMode::kSrcOver) {
     return RenderSurfaceReason::kBlendMode;
   }
   // If the layer clips its descendants but it is not axis-aligned with respect
@@ -772,9 +456,9 @@
       (layer->DrawsContent() || num_descendants_that_draw_content > 1);
 
   bool may_have_transparency =
-      EffectiveOpacity(layer) != 1.f ||
+      layer->EffectiveOpacity() != 1.f ||
       HasPotentiallyRunningOpacityAnimation(mutator_host, layer);
-  if (may_have_transparency && ShouldFlattenTransform(layer) &&
+  if (may_have_transparency && layer->should_flatten_transform() &&
       at_least_two_layers_in_subtree_draw_content) {
     DCHECK(!is_root);
     return RenderSurfaceReason::kOpacity;
@@ -784,82 +468,47 @@
   // the blending descendants might have access to the content behind this layer
   // (layer has transparent background or descendants overflow).
   // https://code.google.com/p/chromium/issues/detail?id=301738
-  if (IsRootForIsolatedGroup(layer)) {
+  if (layer->is_root_for_isolated_group()) {
     return RenderSurfaceReason::kRootOrIsolatedGroup;
   }
 
   // If we force it.
-  if (ForceRenderSurfaceForTesting(layer))
+  if (layer->force_render_surface_for_testing())
     return RenderSurfaceReason::kTest;
 
   // If we cache it.
-  if (CacheRenderSurface(layer))
+  if (layer->cache_render_surface())
     return RenderSurfaceReason::kCache;
 
   // If we'll make a copy of the layer's contents.
-  if (HasCopyRequest(layer))
+  if (layer->HasCopyRequest())
     return RenderSurfaceReason::kCopyRequest;
 
   // If the layer is mirrored.
-  if (MirrorCount(layer))
+  if (layer->mirror_count())
     return RenderSurfaceReason::kMirrored;
 
   return RenderSurfaceReason::kNone;
 }
 
-static void TakeCopyRequests(
-    Layer* layer,
-    std::vector<std::unique_ptr<viz::CopyOutputRequest>>* copy_requests) {
-  layer->TakeCopyRequests(copy_requests);
-}
-
-static void TakeCopyRequests(
-    LayerImpl* layer,
-    std::vector<std::unique_ptr<viz::CopyOutputRequest>>* copy_requests) {
-  for (auto& request : layer->test_properties()->copy_requests)
-    copy_requests->push_back(std::move(request));
-  layer->test_properties()->copy_requests.clear();
-}
-
-static void SetSubtreeHasCopyRequest(Layer* layer,
-                                     bool subtree_has_copy_request) {
-  layer->SetSubtreeHasCopyRequest(subtree_has_copy_request);
-}
-
-static void SetSubtreeHasCopyRequest(LayerImpl* layer,
-                                     bool subtree_has_copy_request) {
-  layer->test_properties()->subtree_has_copy_request = subtree_has_copy_request;
-}
-
-static bool SubtreeHasCopyRequest(Layer* layer) {
-  return layer->SubtreeHasCopyRequest();
-}
-
-static bool SubtreeHasCopyRequest(LayerImpl* layer) {
-  return layer->test_properties()->subtree_has_copy_request;
-}
-
-template <typename LayerType>
-bool UpdateSubtreeHasCopyRequestRecursive(LayerType* layer) {
+static bool UpdateSubtreeHasCopyRequestRecursive(Layer* layer) {
   bool subtree_has_copy_request = false;
-  if (HasCopyRequest(layer))
+  if (layer->HasCopyRequest())
     subtree_has_copy_request = true;
-  for (size_t i = 0; i < LayerChildren(layer).size(); ++i) {
-    LayerType* current_child = LayerChildAt(layer, i);
+  for (const scoped_refptr<Layer>& child : layer->children()) {
     subtree_has_copy_request |=
-        UpdateSubtreeHasCopyRequestRecursive(current_child);
+        UpdateSubtreeHasCopyRequestRecursive(child.get());
   }
-  SetSubtreeHasCopyRequest(layer, subtree_has_copy_request);
+  layer->SetSubtreeHasCopyRequest(subtree_has_copy_request);
   return subtree_has_copy_request;
 }
 
-template <typename LayerType>
-bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded(
+bool PropertyTreeBuilderContext::AddEffectNodeIfNeeded(
     const DataForRecursion& data_from_ancestor,
-    LayerType* layer,
+    Layer* layer,
     DataForRecursion* data_for_children) const {
-  const bool is_root = !LayerParent(layer);
-  const bool has_transparency = EffectiveOpacity(layer) != 1.f;
+  const bool is_root = !layer->parent();
+  const bool has_transparency = layer->EffectiveOpacity() != 1.f;
   const bool has_potential_opacity_animation =
       HasPotentialOpacityAnimation(mutator_host_, layer);
   const bool has_potential_filter_animation =
@@ -867,7 +516,8 @@
 
   data_for_children->animation_axis_aligned_since_render_target &=
       AnimationsPreserveAxisAlignment(mutator_host_, layer);
-  data_for_children->compound_transform_since_render_target *= Transform(layer);
+  data_for_children->compound_transform_since_render_target *=
+      layer->transform();
   auto render_surface_reason = ComputeRenderSurfaceReason(
       mutator_host_, layer,
       data_for_children->compound_transform_since_render_target,
@@ -879,7 +529,7 @@
       data_from_ancestor.not_axis_aligned_since_last_clip
           ? true
           : !AnimationsPreserveAxisAlignment(mutator_host_, layer) ||
-                !Transform(layer).Preserves2dAxisAlignment();
+                !layer->transform().Preserves2dAxisAlignment();
   // A non-axis aligned clip may need a render surface. So, we create an effect
   // node.
   bool has_non_axis_aligned_clip =
@@ -888,7 +538,7 @@
   bool requires_node =
       is_root || has_transparency || has_potential_opacity_animation ||
       has_potential_filter_animation || has_non_axis_aligned_clip ||
-      should_create_render_surface || HasRoundedCorner(layer);
+      should_create_render_surface || layer->HasRoundedCorner();
 
   int parent_id = data_from_ancestor.effect_tree_parent;
 
@@ -902,55 +552,55 @@
   EffectNode* node = effect_tree_.back();
 
   node->stable_id = layer->id();
-  node->opacity = Opacity(layer);
-  node->blend_mode = BlendMode(layer);
+  node->opacity = layer->opacity();
+  node->blend_mode = layer->blend_mode();
   node->unscaled_mask_target_size = layer->bounds();
-  node->cache_render_surface = CacheRenderSurface(layer);
-  node->has_copy_request = HasCopyRequest(layer);
-  node->filters = Filters(layer);
-  node->backdrop_filters = BackdropFilters(layer);
-  node->backdrop_filter_bounds = BackdropFilterBounds(layer);
-  node->backdrop_filter_quality = BackdropFilterQuality(layer);
-  node->backdrop_mask_element_id = BackdropMaskElementId(layer);
-  node->filters_origin = FiltersOrigin(layer);
-  node->trilinear_filtering = TrilinearFiltering(layer);
+  node->cache_render_surface = layer->cache_render_surface();
+  node->has_copy_request = layer->HasCopyRequest();
+  node->filters = layer->filters();
+  node->backdrop_filters = layer->backdrop_filters();
+  node->backdrop_filter_bounds = layer->backdrop_filter_bounds();
+  node->backdrop_filter_quality = layer->backdrop_filter_quality();
+  node->backdrop_mask_element_id = layer->backdrop_mask_element_id();
+  node->filters_origin = layer->filters_origin();
+  node->trilinear_filtering = layer->trilinear_filtering();
   node->has_potential_opacity_animation = has_potential_opacity_animation;
   node->has_potential_filter_animation = has_potential_filter_animation;
-  node->double_sided = DoubleSided(layer);
-  node->subtree_hidden = HideLayerAndSubtree(layer);
+  node->double_sided = layer->double_sided();
+  node->subtree_hidden = layer->hide_layer_and_subtree();
   node->is_currently_animating_opacity =
       OpacityIsAnimating(mutator_host_, layer);
   node->is_currently_animating_filter = FilterIsAnimating(mutator_host_, layer);
-  node->effect_changed = PropertyChanged(layer);
-  node->subtree_has_copy_request = SubtreeHasCopyRequest(layer);
+  node->effect_changed = layer->subtree_property_changed();
+  node->subtree_has_copy_request = layer->SubtreeHasCopyRequest();
   node->render_surface_reason = render_surface_reason;
   node->closest_ancestor_with_cached_render_surface_id =
-      CacheRenderSurface(layer)
+      layer->cache_render_surface()
           ? node_id
           : data_from_ancestor.closest_ancestor_with_cached_render_surface;
   node->closest_ancestor_with_copy_request_id =
-      HasCopyRequest(layer)
+      layer->HasCopyRequest()
           ? node_id
           : data_from_ancestor.closest_ancestor_with_copy_request;
 
-  if (MaskLayer(layer)) {
-    node->mask_layer_id = MaskLayer(layer)->id();
+  if (layer->mask_layer()) {
+    node->mask_layer_id = layer->mask_layer()->id();
     effect_tree_.AddMaskLayerId(node->mask_layer_id);
     node->is_masked = true;
   }
 
-  if (HasRoundedCorner(layer)) {
+  if (layer->HasRoundedCorner()) {
     // This is currently in the local space of the layer and hence in an invalid
     // space. Once we have the associated transform node for this effect node,
     // we will update this to the transform node's coordinate space.
     node->rounded_corner_bounds = RoundedCornerBounds(layer);
-    node->is_fast_rounded_corner = IsFastRoundedCorner(layer);
+    node->is_fast_rounded_corner = layer->is_fast_rounded_corner();
   }
 
   if (!is_root) {
     // Having a rounded corner or a render surface, both trigger the creation
     // of a transform node.
-    if (should_create_render_surface || HasRoundedCorner(layer)) {
+    if (should_create_render_surface || layer->HasRoundedCorner()) {
       // In this case, we will create a transform node, so it's safe to use the
       // next available id from the transform tree as this effect node's
       // transform id.
@@ -983,7 +633,7 @@
   }
 
   std::vector<std::unique_ptr<viz::CopyOutputRequest>> layer_copy_requests;
-  TakeCopyRequests(layer, &layer_copy_requests);
+  layer->TakeCopyRequests(&layer_copy_requests);
   for (auto& it : layer_copy_requests) {
     effect_tree_.AddCopyRequest(node_id, std::move(it));
   }
@@ -997,8 +647,7 @@
   return should_create_render_surface;
 }
 
-template <typename LayerType>
-bool PropertyTreeBuilderContext<LayerType>::UpdateRenderSurfaceIfNeeded(
+bool PropertyTreeBuilderContext::UpdateRenderSurfaceIfNeeded(
     int parent_effect_tree_id,
     DataForRecursion* data_for_children,
     bool subtree_has_rounded_corner,
@@ -1039,57 +688,18 @@
   return effect_node->HasRenderSurface();
 }
 
-static inline bool UserScrollableHorizontal(Layer* layer) {
-  return layer->GetUserScrollableHorizontal();
-}
-
-static inline bool UserScrollableHorizontal(LayerImpl* layer) {
-  return layer->test_properties()->user_scrollable_horizontal;
-}
-
-static inline bool UserScrollableVertical(Layer* layer) {
-  return layer->GetUserScrollableVertical();
-}
-
-static inline bool UserScrollableVertical(LayerImpl* layer) {
-  return layer->test_properties()->user_scrollable_vertical;
-}
-
-static inline const base::Optional<SnapContainerData>& GetSnapContainerData(
-    Layer* layer) {
-  return layer->snap_container_data();
-}
-
-static inline const base::Optional<SnapContainerData>& GetSnapContainerData(
-    LayerImpl* layer) {
-  return layer->test_properties()->snap_container_data;
-}
-
-static inline uint32_t MainThreadScrollingReasons(Layer* layer) {
-  return layer->GetMainThreadScrollingReasons();
-}
-
-static inline uint32_t MainThreadScrollingReasons(LayerImpl* layer) {
-  return layer->test_properties()->main_thread_scrolling_reasons;
-}
-
-template <typename LayerType>
-void SetHasTransformNode(LayerType* layer, bool val) {
-  layer->SetHasTransformNode(val);
-}
-
-template <typename LayerType>
-void PropertyTreeBuilderContext<LayerType>::AddScrollNodeIfNeeded(
+void PropertyTreeBuilderContext::AddScrollNodeIfNeeded(
     const DataForRecursion& data_from_ancestor,
-    LayerType* layer,
+    Layer* layer,
     DataForRecursion* data_for_children) const {
   int parent_id = data_from_ancestor.scroll_tree_parent;
 
-  bool is_root = !LayerParent(layer);
+  bool is_root = !layer->parent();
   bool scrollable = layer->scrollable();
   bool contains_non_fast_scrollable_region =
       !layer->non_fast_scrollable_region().IsEmpty();
-  uint32_t main_thread_scrolling_reasons = MainThreadScrollingReasons(layer);
+  uint32_t main_thread_scrolling_reasons =
+      layer->GetMainThreadScrollingReasons();
 
   bool scroll_node_uninheritable_criteria =
       is_root || scrollable || contains_non_fast_scrollable_region;
@@ -1125,11 +735,11 @@
     node.offset_to_transform_parent = layer->offset_to_transform_parent();
     node.should_flatten =
         layer->should_flatten_screen_space_transform_from_property_tree();
-    node.user_scrollable_horizontal = UserScrollableHorizontal(layer);
-    node.user_scrollable_vertical = UserScrollableVertical(layer);
+    node.user_scrollable_horizontal = layer->GetUserScrollableHorizontal();
+    node.user_scrollable_vertical = layer->GetUserScrollableVertical();
     node.element_id = layer->element_id();
     node.transform_id = data_for_children->transform_tree_parent;
-    node.snap_container_data = GetSnapContainerData(layer);
+    node.snap_container_data = layer->snap_container_data();
 
     node_id = scroll_tree_.Insert(node, parent_id);
     data_for_children->scroll_tree_parent = node_id;
@@ -1153,28 +763,26 @@
   layer->SetScrollTreeIndex(node_id);
 }
 
-template <typename LayerType>
-void SetBackfaceVisibilityTransform(LayerType* layer,
-                                    bool created_transform_node) {
+void SetBackfaceVisibilityTransform(Layer* layer, bool created_transform_node) {
   if (layer->use_parent_backface_visibility()) {
-    DCHECK(LayerParent(layer));
-    DCHECK(!LayerParent(layer)->use_parent_backface_visibility());
+    DCHECK(layer->parent());
+    DCHECK(!layer->parent()->use_parent_backface_visibility());
     layer->SetShouldCheckBackfaceVisibility(
-        LayerParent(layer)->should_check_backface_visibility());
+        layer->parent()->should_check_backface_visibility());
   } else {
     // A double-sided layer's backface can been shown when its visible.
     // In addition, we need to check if (1) there might be a local 3D transform
     // on the layer that might turn it to the backface, or (2) it is not drawn
     // into a flattened space.
     layer->SetShouldCheckBackfaceVisibility(
-        !DoubleSided(layer) && (created_transform_node ||
-                                !ShouldFlattenTransform(LayerParent(layer))));
+        !layer->double_sided() &&
+        (created_transform_node ||
+         !layer->parent()->should_flatten_transform()));
   }
 }
 
-template <typename LayerType>
 void SetSafeOpaqueBackgroundColor(const DataForRecursion& data_from_ancestor,
-                                  LayerType* layer,
+                                  Layer* layer,
                                   DataForRecursion* data_for_children) {
   SkColor background_color = layer->background_color();
   data_for_children->safe_opaque_background_color =
@@ -1185,17 +793,8 @@
       data_for_children->safe_opaque_background_color);
 }
 
-static void SetLayerPropertyChangedForChild(Layer* parent, Layer* child) {
-  if (parent->subtree_property_changed())
-    child->SetSubtreePropertyChanged();
-}
-
-static void SetLayerPropertyChangedForChild(LayerImpl* parent,
-                                            LayerImpl* child) {}
-
-template <typename LayerType>
-void PropertyTreeBuilderContext<LayerType>::BuildPropertyTreesInternal(
-    LayerType* layer,
+void PropertyTreeBuilderContext::BuildPropertyTreesInternal(
+    Layer* layer,
     const DataForRecursion& data_from_parent) const {
   layer->set_property_tree_sequence_number(property_trees_.sequence_number);
 
@@ -1207,7 +806,7 @@
 
   bool created_transform_node = AddTransformNodeIfNeeded(
       data_from_parent, layer, created_render_surface, &data_for_children);
-  SetHasTransformNode(layer, created_transform_node);
+  layer->SetHasTransformNode(created_transform_node);
   AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node,
                       &data_for_children);
 
@@ -1220,17 +819,17 @@
       data_from_parent.not_axis_aligned_since_last_clip
           ? true
           : !AnimationsPreserveAxisAlignment(mutator_host_, layer) ||
-                !Transform(layer).Preserves2dAxisAlignment();
+                !layer->transform().Preserves2dAxisAlignment();
   bool has_non_axis_aligned_clip =
       not_axis_aligned_since_last_clip && LayerClipsSubtree(layer);
   data_for_children.not_axis_aligned_since_last_clip =
       !has_non_axis_aligned_clip;
 
   bool subtree_has_rounded_corner = false;
-  for (size_t i = 0; i < LayerChildren(layer).size(); ++i) {
-    LayerType* current_child = LayerChildAt(layer, i);
-    SetLayerPropertyChangedForChild(layer, current_child);
-    BuildPropertyTreesInternal(current_child, data_for_children);
+  for (const scoped_refptr<Layer>& child : layer->children()) {
+    if (layer->subtree_property_changed())
+      child->SetSubtreePropertyChanged();
+    BuildPropertyTreesInternal(child.get(), data_for_children);
     subtree_has_rounded_corner |= *data_for_children.subtree_has_rounded_corner;
   }
 
@@ -1238,38 +837,19 @@
       data_from_parent.effect_tree_parent, &data_for_children,
       subtree_has_rounded_corner, created_transform_node);
 
-  if (MaskLayer(layer)) {
-    MaskLayer(layer)->set_property_tree_sequence_number(
+  if (layer->mask_layer()) {
+    layer->mask_layer()->set_property_tree_sequence_number(
         property_trees_.sequence_number);
-    MaskLayer(layer)->SetOffsetToTransformParent(
+    layer->mask_layer()->SetOffsetToTransformParent(
         layer->offset_to_transform_parent());
-    MaskLayer(layer)->SetTransformTreeIndex(layer->transform_tree_index());
-    MaskLayer(layer)->SetClipTreeIndex(layer->clip_tree_index());
-    MaskLayer(layer)->SetEffectTreeIndex(layer->effect_tree_index());
-    MaskLayer(layer)->SetScrollTreeIndex(layer->scroll_tree_index());
+    layer->mask_layer()->SetTransformTreeIndex(layer->transform_tree_index());
+    layer->mask_layer()->SetClipTreeIndex(layer->clip_tree_index());
+    layer->mask_layer()->SetEffectTreeIndex(layer->effect_tree_index());
+    layer->mask_layer()->SetScrollTreeIndex(layer->scroll_tree_index());
   }
 }
 
-}  // namespace
-
-Layer* PropertyTreeBuilder::FindFirstScrollableLayer(Layer* layer) {
-  if (!layer)
-    return nullptr;
-
-  if (layer->scrollable())
-    return layer;
-
-  for (size_t i = 0; i < layer->children().size(); ++i) {
-    Layer* found = FindFirstScrollableLayer(layer->children()[i].get());
-    if (found)
-      return found;
-  }
-
-  return nullptr;
-}
-
-template <typename LayerType>
-void PropertyTreeBuilderContext<LayerType>::BuildPropertyTrees(
+void PropertyTreeBuilderContext::BuildPropertyTrees(
     float device_scale_factor,
     const gfx::Rect& viewport,
     SkColor root_background_color) const {
@@ -1289,7 +869,7 @@
     clip_tree_.SetViewportClip(gfx::RectF(viewport));
     // SetRootScaleAndTransform will be incorrect if the root layer has
     // non-zero position, so ensure it is zero.
-    DCHECK(Position(root_layer_).IsOrigin());
+    DCHECK(root_layer_->position().IsOrigin());
     transform_tree_.SetRootScaleAndTransform(device_scale_factor,
                                              device_transform_);
     return;
@@ -1340,6 +920,8 @@
   scroll_tree_.set_needs_update(false);
 }
 
+}  // namespace
+
 void PropertyTreeBuilder::BuildPropertyTrees(
     Layer* root_layer,
     const Layer* page_scale_layer,
@@ -1359,7 +941,7 @@
     color = SkColorSetA(color, 255);
   if (root_layer->layer_tree_host()->has_copy_request())
     UpdateSubtreeHasCopyRequestRecursive(root_layer);
-  PropertyTreeBuilderContext<Layer>(
+  PropertyTreeBuilderContext(
       root_layer, page_scale_layer, inner_viewport_scroll_layer,
       outer_viewport_scroll_layer, overscroll_elasticity_element_id,
       elastic_overscroll, page_scale_factor, device_transform,
@@ -1373,37 +955,4 @@
   root_layer->layer_tree_host()->SetHasCopyRequest(false);
 }
 
-void PropertyTreeBuilder::BuildPropertyTrees(
-    LayerImpl* root_layer,
-    const LayerImpl* page_scale_layer,
-    const LayerImpl* inner_viewport_scroll_layer,
-    const LayerImpl* outer_viewport_scroll_layer,
-    const ElementId overscroll_elasticity_element_id,
-    const gfx::Vector2dF& elastic_overscroll,
-    float page_scale_factor,
-    float device_scale_factor,
-    const gfx::Rect& viewport,
-    const gfx::Transform& device_transform,
-    PropertyTrees* property_trees) {
-  // Preserve render surfaces when rebuilding.
-  std::vector<std::unique_ptr<RenderSurfaceImpl>> render_surfaces;
-  property_trees->effect_tree.TakeRenderSurfaces(&render_surfaces);
-  property_trees->is_main_thread = false;
-  property_trees->is_active = root_layer->IsActive();
-  SkColor color = root_layer->layer_tree_impl()->background_color();
-  if (SkColorGetA(color) != 255)
-    color = SkColorSetA(color, 255);
-  UpdateSubtreeHasCopyRequestRecursive(root_layer);
-
-  PropertyTreeBuilderContext<LayerImpl>(
-      root_layer, page_scale_layer, inner_viewport_scroll_layer,
-      outer_viewport_scroll_layer, overscroll_elasticity_element_id,
-      elastic_overscroll, page_scale_factor, device_transform,
-      root_layer->layer_tree_impl()->mutator_host(), property_trees)
-      .BuildPropertyTrees(device_scale_factor, viewport, color);
-  property_trees->effect_tree.CreateOrReuseRenderSurfaces(
-      &render_surfaces, root_layer->layer_tree_impl());
-  property_trees->ResetCachedData();
-}
-
 }  // namespace cc
diff --git a/cc/trees/property_tree_builder.h b/cc/trees/property_tree_builder.h
index c22bf43..92860f2b 100644
--- a/cc/trees/property_tree_builder.h
+++ b/cc/trees/property_tree_builder.h
@@ -14,8 +14,6 @@
 
 class PropertyTreeBuilder {
  public:
-  static Layer* FindFirstScrollableLayer(Layer* root_layer);
-
   static void CC_EXPORT
   BuildPropertyTrees(Layer* root_layer,
                      const Layer* page_scale_layer,
@@ -28,18 +26,6 @@
                      const gfx::Rect& viewport,
                      const gfx::Transform& device_transform,
                      PropertyTrees* property_trees);
-  static void CC_EXPORT
-  BuildPropertyTrees(LayerImpl* root_layer,
-                     const LayerImpl* page_scale_layer,
-                     const LayerImpl* inner_viewport_scroll_layer,
-                     const LayerImpl* outer_viewport_scroll_layer,
-                     const ElementId overscroll_elasticity_element_id,
-                     const gfx::Vector2dF& elastic_overscroll,
-                     float page_scale_factor,
-                     float device_scale_factor,
-                     const gfx::Rect& viewport,
-                     const gfx::Transform& device_transform,
-                     PropertyTrees* property_trees);
 };
 
 }  // namespace cc
diff --git a/chrome/VERSION b/chrome/VERSION
index 8e0282c4..8b4b7ac 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=79
 MINOR=0
-BUILD=3908
+BUILD=3909
 PATCH=0
diff --git a/chrome/android/features/dev_ui/dev_ui_module.gni b/chrome/android/features/dev_ui/dev_ui_module.gni
index 683a719..282ca6c 100644
--- a/chrome/android/features/dev_ui/dev_ui_module.gni
+++ b/chrome/android/features/dev_ui/dev_ui_module.gni
@@ -5,7 +5,7 @@
 declare_args() {
   # Whether Developer UI (chrome:// pages) should be split into a separate
   # Dynamic Feature Module (DFM: //docs/android_dynamic_feature_modules.md).
-  dfmify_dev_ui = false
+  dfmify_dev_ui = true
 }
 
 dev_ui_module_desc = {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
index 44cbe79..51e7e9d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
@@ -69,9 +69,9 @@
     @Override
     public void onPostInflationStartup() {
         // Before the verification completes, we optimistically expect it to be successful and apply
-        // the trusted web activity mode to UI. So hide the toolbar as soon as possible.
+        // the trusted web activity mode to UI.
         if (mVerifier.getState() == null) {
-            mToolbarCoordinator.setToolbarHidden(true);
+            updateUi(true);
         }
     }
 
@@ -93,20 +93,16 @@
         boolean inTwaMode = state == null || state.status != VerificationStatus.FAILURE;
         if (inTwaMode == mInTwaMode) return;
         mInTwaMode = inTwaMode;
-        updateToolbar();
-        updateStatusBar();
+        updateUi(mInTwaMode);
     }
 
-    private void updateToolbar() {
-        mToolbarCoordinator.setToolbarHidden(mInTwaMode);
+    private void updateUi(boolean inTwaMode) {
+        mToolbarCoordinator.setToolbarHidden(inTwaMode);
+        mStatusBarColorProvider.setUseTabThemeColor(inTwaMode);
 
-        if (!mInTwaMode) {
+        if (!inTwaMode) {
             // Force showing the controls for a bit when leaving Trusted Web Activity mode.
             mToolbarCoordinator.showToolbarTemporarily();
         }
     }
-
-    private void updateStatusBar() {
-        mStatusBarColorProvider.setUseTabThemeColor(mInTwaMode);
-    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
index 5f114e1d..da26de8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
@@ -225,7 +225,8 @@
     public void pull(float delta) {
         if (mState == GestureState.DRAGGED && mSideSlideLayout != null) {
             mSideSlideLayout.pull(delta);
-            mNavigationSheet.onScroll(delta, mSideSlideLayout.getOverscroll());
+            mNavigationSheet.onScroll(
+                    delta, mSideSlideLayout.getOverscroll(), mSideSlideLayout.willNavigate());
 
             mSideSlideLayout.fadeArrow(!mNavigationSheet.isHidden(), /* animate= */ true);
             if (mNavigationSheet.isExpanded()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheet.java
index 1a83f9be..d46d346f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheet.java
@@ -47,7 +47,7 @@
         public void start(boolean forward, boolean showCloseIndicator) {}
 
         @Override
-        public void onScroll(float delta, float overscroll) {}
+        public void onScroll(float delta, float overscroll, boolean willNavigate) {}
 
         @Override
         public void release() {}
@@ -75,8 +75,9 @@
      * Process swipe gesture and update the navigation sheet state.
      * @param delta Scroll delta from the previous scroll.
      * @param overscroll Total amount of scroll since the dragging started.
+     * @param willNavigate {@code true} if navgation will be triggered upon release.
      */
-    void onScroll(float delta, float overscroll);
+    void onScroll(float delta, float overscroll, boolean willNavigate);
 
     /**
      * Process release events.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java
index 1e510f8..86acae2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java
@@ -39,17 +39,25 @@
     static final int NAVIGATION_LIST_ITEM_TYPE_ID = 0;
 
     // Amount of time to hold the finger still to trigger navigation bottom sheet.
-    // This ensures fling gestures from edge won't invoke the  sheet.
-    private final static int PEEK_HOLD_DELAY_MS = 50;
+    // with a long swipe. This ensures fling gestures from edge won't invoke the  sheet.
+    private final static int LONG_SWIPE_HOLD_DELAY_MS = 50;
 
-    // Navigation sheet is triggered into peek state if swiped by this much or more from an edge.
+    // Amount of time to hold the finger still to trigger navigation bottom sheet
+    // with a short swipe.
+    private final static int SHORT_SWIPE_HOLD_DELAY_MS = 400;
+
+    // Amount of distance to trigger navigation sheet with a long swipe.
     // Actual amount is capped so it is at most half the screen width.
-    private static final int PEEK_THRESHOLD_DP = 224;
+    private static final int LONG_SWIPE_PEEK_THRESHOLD_DP = 224;
 
     // The history item count in the navigation sheet. If the count is equal or smaller,
     // the sheet skips peek state and fully expands right away.
     private static final int SKIP_PEEK_COUNT = 3;
 
+    // Delta for touch events that can happen even when users doesn't intend to move
+    // his finger. Any delta smaller than (or equal to) than this are ignored.
+    private static final float DELTA_IGNORE = 2.f;
+
     private final NavigationSheetView mContentView;
     private final View mToolbarView;
     private final LayoutInflater mLayoutInflater;
@@ -65,7 +73,7 @@
 
     private final Handler mHandler = new Handler();
     private final Runnable mOpenSheetRunnable;
-    private final float mPeekSheetThreshold;
+    private final float mLongSwipePeekThreshold;
 
     private final ModelList mModelList = new ModelList();
     private final ModelListAdapter mModelAdapter = new ModelListAdapter(mModelList);
@@ -121,9 +129,9 @@
         mOpenSheetRunnable = () -> {
             if (isHidden()) openSheet();
         };
-        mPeekSheetThreshold =
-                Math.min(context.getResources().getDisplayMetrics().density * PEEK_THRESHOLD_DP,
-                        parent.getWidth() / 2);
+        mLongSwipePeekThreshold = Math.min(
+                context.getResources().getDisplayMetrics().density * LONG_SWIPE_PEEK_THRESHOLD_DP,
+                parent.getWidth() / 2);
     }
 
     // Transition to either peeked or expanded state.
@@ -152,16 +160,24 @@
     }
 
     @Override
-    public void onScroll(float delta, float overscroll) {
+    public void onScroll(float delta, float overscroll, boolean willNavigate) {
         if (mBottomSheetController.get() == null) return;
         if (mShowCloseIndicator) return;
-        if (overscroll > mPeekSheetThreshold) {
-            if (isHidden() && Math.abs(delta) > 2.f) {
-                mHandler.removeCallbacks(mOpenSheetRunnable);
-                mHandler.postDelayed(mOpenSheetRunnable, PEEK_HOLD_DELAY_MS);
-            }
+        if (overscroll > mLongSwipePeekThreshold) {
+            triggerSheetWithSwipeAndHold(delta, LONG_SWIPE_HOLD_DELAY_MS);
+        } else if (willNavigate) {
+            triggerSheetWithSwipeAndHold(delta, SHORT_SWIPE_HOLD_DELAY_MS);
         } else if (isPeeked()) {
             close(true);
+        } else {
+            mHandler.removeCallbacks(mOpenSheetRunnable);
+        }
+    }
+
+    private void triggerSheetWithSwipeAndHold(float delta, long delay) {
+        if (isHidden() && Math.abs(delta) > DELTA_IGNORE) {
+            mHandler.removeCallbacks(mOpenSheetRunnable);
+            mHandler.postDelayed(mOpenSheetRunnable, delay);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java
index f4cd23e..e529a17 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java
@@ -331,7 +331,10 @@
         startHidingAnimation(mNavigateListener);
     }
 
-    private boolean willNavigate() {
+    /**
+     * @return {@code true} if swiped long enough to trigger navigation upon release.
+     */
+    boolean willNavigate() {
         return getOverscroll() > mTotalDragDistance * THRESHOLD_MULTIPLIER;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
index 22846d4..0a5a9c89 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
@@ -4,9 +4,16 @@
 
 package org.chromium.chrome.browser.metrics;
 
+import org.chromium.base.StrictModeContext;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.metrics.CachedMetrics;
 import org.chromium.blink_public.platform.WebDisplayMode;
+import org.chromium.chrome.browser.ShortcutSource;
+import org.chromium.chrome.browser.webapps.WebApkInfo;
+import org.chromium.chrome.browser.webapps.WebApkUkmRecorder;
+import org.chromium.chrome.browser.webapps.WebappDataStorage;
+import org.chromium.chrome.browser.webapps.WebappInfo;
+import org.chromium.chrome.browser.webapps.WebappRegistry;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.ArrayList;
@@ -24,15 +31,13 @@
         public final boolean mIsShortcut;
         // Corresponds to C++ ShortcutInfo::Source
         public final int mSource;
-        @WebDisplayMode
-        public final int mDisplayMode;
+        public final WebappInfo mWebappInfo;
 
-        public HomeScreenLaunch(
-                String url, boolean isShortcut, int source, @WebDisplayMode int displayMode) {
+        public HomeScreenLaunch(String url, boolean isShortcut, int source, WebappInfo webappInfo) {
             mUrl = url;
             mIsShortcut = isShortcut;
             mSource = source;
-            mDisplayMode = displayMode;
+            mWebappInfo = webappInfo;
         }
     }
 
@@ -41,13 +46,21 @@
     /**
      * Records the launch of a standalone Activity for a URL (i.e. a WebappActivity)
      * added from a specific source.
-     * @param url URL that kicked off the Activity's creation.
-     * @param source integer id of the source from where the URL was added.
-     * @param displayMode integer id of the {@link WebDisplayMode} of the web app.
+     * @param webappInfo WebappInfo for launched activity.
      */
-    public static void recordHomeScreenLaunchIntoStandaloneActivity(
-            String url, int source, @WebDisplayMode int displayMode) {
-        sHomeScreenLaunches.add(new HomeScreenLaunch(url, false, source, displayMode));
+    public static void recordHomeScreenLaunchIntoStandaloneActivity(WebappInfo webappInfo) {
+        int source = webappInfo.source();
+
+        if (webappInfo.isForWebApk() && source == ShortcutSource.UNKNOWN) {
+            // WebApkInfo#source() identifies how the WebAPK was launched (e.g. via deep link).
+            // When the WebAPK is launched from the app list (ShortcutSource#UNKNOWN), query
+            // WebappDataStorage to determine how the WebAPK was installed (SOURCE_APP_BANNER_WEBAPK
+            // vs SOURCE_ADD_TO_HOMESCREEN_PWA). WebAPKs set WebappDataStorage#getSource() at
+            // install time.
+            source = getSourceForWebApkFromWebappDataStorage(webappInfo);
+        }
+
+        sHomeScreenLaunches.add(new HomeScreenLaunch(webappInfo.url(), false, source, webappInfo));
     }
 
     /**
@@ -56,7 +69,7 @@
      * @param source integer id of the source from where the URL was added.
      */
     public static void recordHomeScreenLaunchIntoTab(String url, int source) {
-        sHomeScreenLaunches.add(new HomeScreenLaunch(url, true, source, WebDisplayMode.UNDEFINED));
+        sHomeScreenLaunches.add(new HomeScreenLaunch(url, true, source, null));
     }
 
     /**
@@ -67,8 +80,17 @@
      */
     public static void commitLaunchMetrics(WebContents webContents) {
         for (HomeScreenLaunch launch : sHomeScreenLaunches) {
-            nativeRecordLaunch(launch.mIsShortcut, launch.mUrl, launch.mSource, launch.mDisplayMode,
-                    webContents);
+            WebappInfo webappInfo = launch.mWebappInfo;
+            @WebDisplayMode
+            int displayMode =
+                    (webappInfo == null) ? WebDisplayMode.UNDEFINED : webappInfo.displayMode();
+            nativeRecordLaunch(
+                    launch.mIsShortcut, launch.mUrl, launch.mSource, displayMode, webContents);
+            if (webappInfo != null && webappInfo.isForWebApk()) {
+                WebApkInfo webApkInfo = (WebApkInfo) webappInfo;
+                WebApkUkmRecorder.recordWebApkLaunch(webApkInfo.manifestUrl(),
+                        webApkInfo.distributor(), webApkInfo.webApkVersionCode(), launch.mSource);
+            }
         }
         sHomeScreenLaunches.clear();
 
@@ -91,6 +113,26 @@
         nativeRecordHomePageLaunchMetrics(showHomeButton, homepageIsNtp, homepageUrl);
     }
 
+    /**
+     * Returns the source from the WebappDataStorage if the source has been stored before. Returns
+     * {@link ShortcutSource.WEBAPK_UNKNOWN} otherwise.
+     */
+    private static int getSourceForWebApkFromWebappDataStorage(WebappInfo webappInfo) {
+        WebappDataStorage storage = null;
+
+        try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
+            WebappRegistry.warmUpSharedPrefsForId(webappInfo.id());
+            storage = WebappRegistry.getInstance().getWebappDataStorage(webappInfo.id());
+        }
+
+        if (storage == null) {
+            return ShortcutSource.WEBAPK_UNKNOWN;
+        }
+
+        int source = storage.getSource();
+        return (source == ShortcutSource.UNKNOWN) ? ShortcutSource.WEBAPK_UNKNOWN : source;
+    }
+
     private static native void nativeRecordLaunch(boolean isShortcut, String url, int source,
             @WebDisplayMode int displayMode, WebContents webContents);
     private static native void nativeRecordHomePageLaunchMetrics(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java
index b597a6db..86f6566a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/LensUtils.java
@@ -37,6 +37,7 @@
             PackageManager pm = context.getPackageManager();
             Intent lensIntent = getShareWithGoogleLensIntent(Uri.EMPTY);
             ComponentName lensActivity = lensIntent.resolveActivity(pm);
+            if (lensActivity == null) return "";
             PackageInfo packageInfo = pm.getPackageInfo(lensActivity.getPackageName(), 0);
             if (packageInfo == null) {
                 return "";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
index cef2439f..705b1c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUkmRecorder.java
@@ -18,6 +18,16 @@
         nativeRecordSessionDuration(manifestUrl, distributor, versionCode, duration);
     }
 
+    /**
+     * Records that WebAPK was launched and the reason for the launch.
+     */
+    public static void recordWebApkLaunch(
+            String manifestUrl, @WebApkDistributor int distributor, int versionCode, int source) {
+        nativeRecordVisit(manifestUrl, distributor, versionCode, source);
+    }
+
     private static native void nativeRecordSessionDuration(
             String manifestUrl, int distributor, int versionCode, long duration);
+    private static native void nativeRecordVisit(
+            String manifestUrl, int distributor, int versionCode, int source);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
index b2cc80f..488e7db5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -12,7 +12,6 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.StrictMode;
 import android.os.SystemClock;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -178,18 +177,7 @@
 
     private static void launchWebapp(Activity launchingActivity, Intent intent,
             @NonNull WebappInfo webappInfo, long createTimestamp) {
-        String webappUrl = webappInfo.url();
-        int webappSource = webappInfo.source();
-
-        // Retrieves the source of the WebAPK from WebappDataStorage if it is unknown. The
-        // {@link webappSource} is only known in the cases of an external intent or a
-        // notification that launches a WebAPK. Otherwise, it's not trustworthy and we must read
-        // the SharedPreference to get the installation source.
-        if (webappInfo.isForWebApk() && webappSource == ShortcutSource.UNKNOWN) {
-            webappSource = getWebApkSource(webappInfo);
-        }
-        LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(
-                webappUrl, webappSource, webappInfo.displayMode());
+        LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(webappInfo);
 
         // Add all information needed to launch WebappActivity without {@link
         // WebappActivity#sWebappInfoMap} to launch intent. When the Android OS has killed a
@@ -207,27 +195,6 @@
         }
     }
 
-    // Gets the source of a WebAPK from the WebappDataStorage if the source has been stored before.
-    private static int getWebApkSource(WebappInfo webappInfo) {
-        WebappDataStorage storage = null;
-
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
-        try {
-            WebappRegistry.warmUpSharedPrefsForId(webappInfo.id());
-            storage = WebappRegistry.getInstance().getWebappDataStorage(webappInfo.id());
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
-
-        if (storage != null) {
-            int source = storage.getSource();
-            if (source != ShortcutSource.UNKNOWN) {
-                return source;
-            }
-        }
-        return ShortcutSource.WEBAPK_UNKNOWN;
-    }
-
     /**
      * Returns whether {@link sourceIntent} was sent by a WebAPK to relaunch itself.
      *
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index f7289c7..d77f53b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -477,7 +477,7 @@
 <translation id="4665282149850138822"><ph name="NAME" /> blev føjet til din startskærm</translation>
 <translation id="4684427112815847243">Synkroniser alt</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}}</translation>
-<translation id="4696983787092045100">Send tekst til dine enheder</translation>
+<translation id="4696983787092045100">Send sms til dine enheder</translation>
 <translation id="4698034686595694889">Se offline i <ph name="APP_NAME" /></translation>
 <translation id="4698413471314543145">Vigtig funktionalitet, som kræves for at køre Chrome, mangler. Enten er Chrome-installationen ufuldstændig eller ikke kompatibel med denne version af Android.</translation>
 <translation id="4699172675775169585">Billeder og filer, der er gemt i cache</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index f3eb33c..fbb82fa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -42,6 +42,7 @@
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1260236875608242557">Search and explore</translation>
 <translation id="1264974993859112054">Sports</translation>
+<translation id="1266864766717917324">Couldn't share <ph name="CONTENT_TYPE" /></translation>
 <translation id="1272079795634619415">Stop</translation>
 <translation id="1283039547216852943">Tap to expand</translation>
 <translation id="1285320974508926690">Never translate this site</translation>
@@ -71,6 +72,7 @@
 <translation id="1430915738399379752">Print</translation>
 <translation id="1445680696957526815">Chrome’s components are incompatible with one another. Chrome may be upgrading, please try again in a few minutes. If the problem continues, try uninstalling and re-installing Chrome.</translation>
 <translation id="1446450296470737166">Allow full control of MIDI devices</translation>
+<translation id="1450753235335490080">Can't share <ph name="CONTENT_TYPE" /></translation>
 <translation id="145097072038377568">Turned off in Android Settings</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> download failed due to server issues.</translation>
 <translation id="1501480321619201731">Delete group</translation>
@@ -153,6 +155,7 @@
 <translation id="2049961518639794558">Changing the file extension may result in unexpected behaviour and be harmful to your device.</translation>
 <translation id="2056878612599315956">Site paused</translation>
 <translation id="2063713494490388661">Tap to Search</translation>
+<translation id="2067805253194386918">text</translation>
 <translation id="2079545284768500474">Undo</translation>
 <translation id="2082238445998314030">Result <ph name="RESULT_NUMBER" /> of <ph name="TOTAL_RESULTS" /></translation>
 <translation id="2091887806945687916">Sound</translation>
@@ -324,6 +327,7 @@
 <translation id="3384347053049321195">Share image</translation>
 <translation id="3386292677130313581">Ask before allowing sites to know your location (recommended)</translation>
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> download failed due to file system errors.</translation>
+<translation id="3389286852084373014">Text is too large</translation>
 <translation id="3398320232533725830">Open the bookmarks manager</translation>
 <translation id="3414952576877147120">Size:</translation>
 <translation id="3443221991560634068">Reload the current page</translation>
@@ -348,6 +352,7 @@
 <translation id="3599863153486145794">Clears history from all signed-in devices. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="3600792891314830896">Mute sites that play sound</translation>
 <translation id="3616113530831147358">Audio</translation>
+<translation id="3631987586758005671">Sharing to <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Unmask password</translation>
 <translation id="363596933471559332">Automatically sign in to websites using stored credentials. When the feature is off, you’ll be asked for verification every time before signing in to a website.</translation>
 <translation id="3658159451045945436">Resetting wipes your history of data savings, including the list of visited sites.</translation>
@@ -578,6 +583,7 @@
 <translation id="5324858694974489420">Parental Settings</translation>
 <translation id="5327248766486351172">Name</translation>
 <translation id="5335288049665977812">Allow sites to run JavaScript (recommended)</translation>
+<translation id="5342314432463739672">Permission requests</translation>
 <translation id="5357811892247919462">Tab received</translation>
 <translation id="5363230136052241468">Tap the home button to load the new tab page</translation>
 <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> open tab, tap to switch tabs}other{<ph name="OPEN_TABS_MANY" /> open tabs, tap to switch tabs}}</translation>
@@ -748,6 +754,7 @@
 <translation id="6532866250404780454">Sites that you visit in Chrome won't show. All site timers will be deleted.</translation>
 <translation id="6534565668554028783">Google took too long to respond</translation>
 <translation id="6538442820324228105">Downloaded <ph name="GBS" /> GB</translation>
+<translation id="6539092367496845964">Something went wrong. Try again later.</translation>
 <translation id="654446541061731451">Select a tab to beam</translation>
 <translation id="6545017243486555795">Clear All Data</translation>
 <translation id="6545864417968258051">Bluetooth scanning</translation>
@@ -879,6 +886,7 @@
 <translation id="7493994139787901920"><ph name="VERSION" /> (Updated <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">data saved</translation>
 <translation id="7498271377022651285">Please wait…</translation>
+<translation id="7510943789645525906">Warns you if a password that you used was part of a data breach</translation>
 <translation id="7514365320538308">Download</translation>
 <translation id="751961395872307827">Can't connect to the site</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -895,6 +903,7 @@
 <translation id="7605594153474022051">Sync isn't working</translation>
 <translation id="7606077192958116810">Lite mode is on. Manage it in Settings.</translation>
 <translation id="7612619742409846846">Signed in to Google as</translation>
+<translation id="7618708364256705849">No devices available.</translation>
 <translation id="7619072057915878432"><ph name="FILE_NAME" /> download failed due to network failures.</translation>
 <translation id="7624880197989616768"><ph name="BEGIN_LINK1" />Get help<ph name="END_LINK1" /> or <ph name="BEGIN_LINK2" />re-scan<ph name="END_LINK2" /></translation>
 <translation id="7626032353295482388">Welcome to Chrome</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 897caaa..bedd3c4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -414,7 +414,7 @@
 <translation id="4170011742729630528">Hindi available ang serbisyo; subukang muli sa ibang pagkakataon.</translation>
 <translation id="4179980317383591987"><ph name="AMOUNT" /> ang nagamit</translation>
 <translation id="4181841719683918333">Mga Wika</translation>
-<translation id="4183868528246477015">Hanapin sa Google Lens <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation>
+<translation id="4183868528246477015">Hanapin gamit ang Google Lens <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation>
 <translation id="4195643157523330669">Buksan sa bagong tab</translation>
 <translation id="4198423547019359126">Walang available na lokasyon ng pag-download</translation>
 <translation id="4209895695669353772">Para makakuha ng naka-personalize na content na iminumungkahi ng Google, i-on ang pag-sync</translation>
@@ -616,7 +616,7 @@
   -   iyong mga pisikal na katangian, gaya ng tangkad
   -   layout ng kwarto mo
 
-Tiyaking pinagkakatiwalaan mo ang site na ito bago pumasok sa VR.</translation>
+Tiyaking pinagkakatiwalaan mo ang site na ito bago ka pumasok sa VR.</translation>
 <translation id="5534640966246046842">Nakopya ang site</translation>
 <translation id="5556459405103347317">I-reload</translation>
 <translation id="5561549206367097665">Naghihintay ng network…</translation>
@@ -906,7 +906,7 @@
 <translation id="7665369617277396874">Magdagdag ng account</translation>
 <translation id="766587987807204883">Lalabas dito ang mga artikulong mababasa mo kahit offline ka</translation>
 <translation id="7682724950699840886">Subukan ang mga sumusunod na tip: tiyaking may sapat na espasyo sa iyong device, at subukang mag-export muli.</translation>
-<translation id="7685301384041462804">Tiyaking pinagkakatiwalaan mo ang site na ito bago pumasok sa VR.</translation>
+<translation id="7685301384041462804">Tiyaking pinagkakatiwalaan mo ang site na ito bago ka pumasok sa VR.</translation>
 <translation id="7698359219371678927">Gumawa ng email sa <ph name="APP_NAME" /></translation>
 <translation id="7704317875155739195">Awtomatikong kumpletuhin ang mga paghahanap at URL</translation>
 <translation id="7725024127233776428">Lalabas dito ang mga page na iyong.na-bookmark</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index ab39409d..a76e12e6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -42,6 +42,7 @@
 <translation id="1258753120186372309">Doodle do Google: <ph name="DOODLE_DESCRIPTION" /></translation>
 <translation id="1260236875608242557">Pesquisar e explorar</translation>
 <translation id="1264974993859112054">Esportes</translation>
+<translation id="1266864766717917324">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
 <translation id="1272079795634619415">Parar</translation>
 <translation id="1283039547216852943">Toque para expandir</translation>
 <translation id="1285320974508926690">Nunca traduzir este site</translation>
@@ -71,6 +72,7 @@
 <translation id="1430915738399379752">Imprimir</translation>
 <translation id="1445680696957526815">Os componentes do Chrome são incompatíveis entre si. O Chrome pode estar fazendo um upgrade. Tente novamente em alguns minutos. Se o problema persistir, tente desinstalar e reinstalar o Chrome.</translation>
 <translation id="1446450296470737166">Permitir controle total de dispositivos MIDI</translation>
+<translation id="1450753235335490080">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
 <translation id="145097072038377568">Desativada nas configurações do Android</translation>
 <translation id="1477626028522505441">Falha no download do arquivo <ph name="FILE_NAME" /> devido a problemas de servidor.</translation>
 <translation id="1501480321619201731">Excluir grupo</translation>
@@ -153,6 +155,7 @@
 <translation id="2049961518639794558">Alterar a extensão do arquivo pode causar um comportamento inesperado e danificar seu dispositivo.</translation>
 <translation id="2056878612599315956">Site pausado</translation>
 <translation id="2063713494490388661">Tocar para pesquisar</translation>
+<translation id="2067805253194386918">texto</translation>
 <translation id="2079545284768500474">Desfazer</translation>
 <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
 <translation id="2091887806945687916">Som</translation>
@@ -324,6 +327,7 @@
 <translation id="3384347053049321195">Compartilhar imagem</translation>
 <translation id="3386292677130313581">Perguntar antes de permitir que sites saibam seu local (recomendado)</translation>
 <translation id="3387650086002190359">Falha no download de <ph name="FILE_NAME" /> devido a erros do sistema de arquivos.</translation>
+<translation id="3389286852084373014">O texto está grande demais</translation>
 <translation id="3398320232533725830">Abrir o gerenciador de favoritos</translation>
 <translation id="3414952576877147120">Tamanho:</translation>
 <translation id="3443221991560634068">Atualizar a página atual</translation>
@@ -348,6 +352,7 @@
 <translation id="3599863153486145794">Limpa o histórico de todos os dispositivos conectados. Sua Conta do Google pode ter outras formas de histórico de navegação em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="3600792891314830896">Silenciar sites com áudio</translation>
 <translation id="3616113530831147358">Áudio</translation>
+<translation id="3631987586758005671">Compartilhando com <ph name="DEVICE_NAME" /></translation>
 <translation id="3632295766818638029">Reautenticar para ver senha</translation>
 <translation id="363596933471559332">Faça login automaticamente nos websites usando as credenciais armazenadas. Se o recurso estiver desativado, será preciso fazer a verificação sempre antes de fazer login em um website.</translation>
 <translation id="3658159451045945436">A redefinição limpa o histórico da economia de dados, incluindo a lista de sites visitados.</translation>
@@ -579,6 +584,7 @@
 <translation id="5324858694974489420">Configurações dos pais</translation>
 <translation id="5327248766486351172">Nome</translation>
 <translation id="5335288049665977812">Permitir que sites executem o JavaScript (recomendado)</translation>
+<translation id="5342314432463739672">Solicitações de permissão</translation>
 <translation id="5357811892247919462">Guia recebida</translation>
 <translation id="5363230136052241468">Toque no botão home para carregar a nova guia</translation>
 <translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> guia aberta, toque para alternar}one{<ph name="OPEN_TABS_MANY" /> guia aberta, toque para alternar}other{<ph name="OPEN_TABS_MANY" /> guias abertas, toque para alternar}}</translation>
@@ -749,6 +755,7 @@
 <translation id="6532866250404780454">Os sites que você visita no Chrome não serão exibidos. Todos os timers do site serão excluídos.</translation>
 <translation id="6534565668554028783">O Google demorou muito para responder</translation>
 <translation id="6538442820324228105"><ph name="GBS" /> GB transferido(s) por download</translation>
+<translation id="6539092367496845964">Algo deu errado. Tente novamente mais tarde.</translation>
 <translation id="654446541061731451">Selecione uma guia para transferir</translation>
 <translation id="6545017243486555795">Limpar todos os dados</translation>
 <translation id="6545864417968258051">Verificação de Bluetooth</translation>
@@ -880,6 +887,7 @@
 <translation id="7493994139787901920"><ph name="VERSION" /> (atualizada <ph name="TIME_SINCE_UPDATE" />)</translation>
 <translation id="7494974237137038751">de dados economizados</translation>
 <translation id="7498271377022651285">Aguarde...</translation>
+<translation id="7510943789645525906">Avisa se uma senha que você usa for parte de uma violação de dados</translation>
 <translation id="7514365320538308">Fazer o download</translation>
 <translation id="751961395872307827">Não foi possível se conectar ao site</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -896,6 +904,7 @@
 <translation id="7605594153474022051">A sincronização não está funcionando</translation>
 <translation id="7606077192958116810">Modo Lite ativado. Gerencie-o nas configurações.</translation>
 <translation id="7612619742409846846">Conectado ao Google como</translation>
+<translation id="7618708364256705849">Nenhum dispositivo disponível.</translation>
 <translation id="7619072057915878432">Falha no download do arquivo <ph name="FILE_NAME" /> devido a falhas na rede.</translation>
 <translation id="7624880197989616768"><ph name="BEGIN_LINK1" />Receber ajuda<ph name="END_LINK1" /> ou <ph name="BEGIN_LINK2" />verificar novamente<ph name="END_LINK2" /></translation>
 <translation id="7626032353295482388">Bem-vindo ao Google Chrome</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 11c6c6e5..d7c295a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -329,7 +329,7 @@
 <translation id="3443221991560634068">Pakia upya ukurasa wa sasa</translation>
 <translation id="3445014427084483498">Sasa Hivi</translation>
 <translation id="3478363558367712427">Unaweza kuchagua mtambo wako wa kutafuta</translation>
-<translation id="3479552764303398839">Sio sasa</translation>
+<translation id="3479552764303398839">Si sasa</translation>
 <translation id="3492207499832628349">Kichupo fiche kipya</translation>
 <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /> kuhusu maudhui yaliyopendekezwa</translation>
 <translation id="3513704683820682405">Uhalisia Ulioboreshwa</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/MockSafeBrowsingApiHandler.java b/chrome/android/javatests/src/org/chromium/chrome/browser/MockSafeBrowsingApiHandler.java
index 2623185..4b37499 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/MockSafeBrowsingApiHandler.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/MockSafeBrowsingApiHandler.java
@@ -11,7 +11,6 @@
 import org.chromium.base.annotations.UsedByReflection;
 import org.chromium.base.task.PostTask;
 import org.chromium.components.safe_browsing.SafeBrowsingApiHandler;
-import org.chromium.components.safe_browsing.SafeBrowsingApiHandler.Observer;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 
 import java.util.HashMap;
@@ -62,6 +61,11 @@
         // clang-format on
     }
 
+    @Override
+    public boolean startAllowlistLookup(final String uri, int[] threatsOfInterest) {
+        return false;
+    }
+
     private String getMetadata(String uri, int[] threatsOfInterest) {
         if (mResponseMap.containsKey(uri)) {
             try {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
index 16da348..ada7c63 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.browserservices;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -13,8 +14,13 @@
 import static org.chromium.chrome.browser.browserservices.TrustedWebActivityTestUtil.spoofVerification;
 
 import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
 import android.support.test.filters.MediumTest;
 
+import androidx.browser.customtabs.CustomTabsIntent;
+import androidx.browser.customtabs.TrustedWebUtils;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -25,15 +31,19 @@
 import org.chromium.base.library_loader.LibraryProcessType;
 import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.content_public.browser.test.util.Criteria;
+import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.net.test.EmbeddedTestServerRule;
 
+import java.util.concurrent.Callable;
 import java.util.concurrent.TimeoutException;
 
-import androidx.browser.customtabs.TrustedWebUtils;
-
 /**
  * Instrumentation tests for launching
  * {@link org.chromium.chrome.browser.customtabs.CustomTabActivity} in Trusted Web Activity Mode.
@@ -98,4 +108,43 @@
 
         assertFalse(isTrustedWebActivity(mCustomTabActivityTestRule.getActivity()));
     }
+
+    /**
+     * Test that for trusted activities if the page provides a theme-color and the toolbar color was
+     * specified in the intent that the page theme-color is used for the status bar.
+     */
+    @Test
+    @MediumTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP_MR1)
+    public void testStatusBarColorPrecedence() throws TimeoutException, InterruptedException {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
+
+        final int intentToolbarColor = Color.GREEN;
+        final String pageWithThemeColor = mEmbeddedTestServerRule.getServer().getURL(
+                "/chrome/test/data/android/theme_color_test.html");
+        final int pageThemeColor = Color.RED;
+
+        Intent intent = createTrustedWebActivityIntent(pageWithThemeColor);
+        spoofVerification(PACKAGE_NAME, mTestPage);
+        intent.putExtra(CustomTabsIntent.EXTRA_TOOLBAR_COLOR, intentToolbarColor);
+        createSession(intent, PACKAGE_NAME);
+
+        mCustomTabActivityTestRule.startCustomTabActivityWithIntent(intent);
+
+        // Waits for theme-color to change so the test doesn't rely on system timing.
+        CustomTabActivity activity = mCustomTabActivityTestRule.getActivity();
+        CriteriaHelper.pollInstrumentationThread(
+                Criteria.equals(pageThemeColor, new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                        return activity.getActivityTab().getWebContents().getThemeColor();
+                    }
+                }));
+
+        int expectedColor = pageThemeColor;
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            expectedColor = ColorUtils.getDarkenedColorForStatusBar(expectedColor);
+        }
+        assertEquals(expectedColor, activity.getWindow().getStatusBarColor());
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
index fa231cd..fb66bef7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -899,7 +899,7 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             assertEquals(expectedColor,
                     mCustomTabActivityTestRule.getActivity().getWindow().getStatusBarColor());
-        } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             assertEquals(ColorUtils.getDarkenedColorForStatusBar(expectedColor),
                     mCustomTabActivityTestRule.getActivity().getWindow().getStatusBarColor());
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
index 56d0333..be25a13 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java
@@ -16,7 +16,6 @@
 
 import org.chromium.base.ContextUtils;
 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.Restriction;
 import org.chromium.chrome.R;
@@ -178,7 +177,6 @@
     @Test
     @SmallTest
     @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
-    @DisabledTest(message = "https://crbug.com/1000315")
     public void testShowingVoiceSearchButtonIfUrlBarIsEmpty()
             throws ExecutionException, InterruptedException {
         setUrlBarTextAndFocus("");
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index e965144f..5ced659 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -449,6 +449,7 @@
   if (is_chromeos) {
     deps += [
       "//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings",
+      "//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
       "//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
       "//chromeos/services/cellular_setup/public/mojom",
       "//chromeos/services/ime/public/mojom",
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index b95f0e6..e9a227d0 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -47,6 +47,7 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom.h"
 #include "chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.mojom.h"
 #include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h"
 #include "chromeos/services/ime/public/mojom/input_engine.mojom.h"
@@ -176,6 +177,7 @@
                 chrome::mojom::OfflinePageAutoFetcher,
                 chrome::mojom::PrerenderCanceler,
 #if defined(OS_CHROMEOS)
+                chromeos::crostini_installer::mojom::PageHandlerFactory,
                 chromeos::ime::mojom::InputEngineManager,
                 chromeos::machine_learning::mojom::PageHandler,
                 chromeos::media_perception::mojom::MediaPerception,
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 21e67160..3445194 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -1246,6 +1246,9 @@
   <message name="IDS_NETWORK_LIST_INITIALIZING" desc="Text in the network list element when a Cellular network is initiailizing.">
     Initializing...
   </message>
+  <message name="IDS_NETWORK_LIST_SIM_CARD_LOCKED" desc="Text in the network list element when a Cellular network's SIM card is locked.">
+    SIM card is locked
+  </message>
   <message name="IDS_NETWORK_LIST_NOT_CONNECTED" desc="Text in the network list element when there is a network for the type, but it is not connected or connecting.">
     Not connected
   </message>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 120075d..0ce78d7a 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -196,6 +196,8 @@
 <translation id="753534427205733210">{0,plural, =1{Chromium will relaunch in 1 minute}other{Chromium will relaunch in # minutes}}</translation>
 <translation id="7549178288319965365">About Chromium OS</translation>
 <translation id="7561906087460245826">Also clear data from Chromium (<ph name="URL" />)</translation>
+<translation id="7585853947355360626">If a setting doesn't show on this page, look in your <ph name="LINK_BEGIN" />
+      Chromium OS settings<ph name="LINK_END" /></translation>
 <translation id="761356813943268536">Chromium is using your camera and microphone.</translation>
 <translation id="7617377681829253106">Chromium just got better</translation>
 <translation id="7686590090926151193">Chromium isn't your default browser</translation>
@@ -229,6 +231,8 @@
 <translation id="8619360774459241877">Launching Chromium...</translation>
 <translation id="8621669128220841554">Installation failed due to unspecified error. Please download Chromium again.</translation>
 <translation id="8667808506758191620">Your <ph name="DEVICE_TYPE" /> is up to date.</translation>
+<translation id="8682540261359803721">If a setting doesn't show on this page, look in your <ph name="LINK_BEGIN" />
+      Chromium browser settings<ph name="LINK_END" /></translation>
 <translation id="8697124171261953979">It also controls what page is shown when you start Chromium or search from the Omnibox.</translation>
 <translation id="8704119203788522458">This is your Chromium</translation>
 <translation id="8739167630197873875">You clear cookies when you quit Chromium. To keep syncing, change this <ph name="COOKIE_SETTINGS_LINK" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index 5057b39..e54c47a8 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -188,6 +188,7 @@
 <translation id="753534427205733210">{0,plural, =1{O Chromium será reiniciado em 1 minuto}one{O Chromium será reiniciado em # minuto}other{O Chromium será reiniciado em # minutos}}</translation>
 <translation id="7549178288319965365">Sobre o Chromium OS</translation>
 <translation id="7561906087460245826">Limpar também os dados do Chromium (<ph name="URL" />)</translation>
+<translation id="7585853947355360626">Se uma configuração não for exibida nesta página, verifique as <ph name="LINK_BEGIN" />configurações do Chromium OS<ph name="LINK_END" /></translation>
 <translation id="761356813943268536">O Chromium está usando sua câmera e seu microfone.</translation>
 <translation id="7617377681829253106">O Chromium ficou ainda melhor</translation>
 <translation id="7686590090926151193">O Chromium não é seu navegador padrão</translation>
@@ -221,6 +222,7 @@
 <translation id="8619360774459241877">Iniciando o Chromium…</translation>
 <translation id="8621669128220841554">Falha na instalação devido a um erro não especificado. Faça o download do Chromium novamente.</translation>
 <translation id="8667808506758191620">Seu dispositivo <ph name="DEVICE_TYPE" /> está atualizado.</translation>
+<translation id="8682540261359803721">Se uma configuração não for exibida nesta página, verifique as <ph name="LINK_BEGIN" />configurações de navegador do Chromium<ph name="LINK_END" /></translation>
 <translation id="8697124171261953979">Controla também qual página deve ser exibida quando você inicia o Chromium ou faz uma pesquisa na Omnibox.</translation>
 <translation id="8704119203788522458">Este é seu Chromium</translation>
 <translation id="8739167630197873875">Você limpa os cookies ao sair do Chromium. Para retomar a sincronização, altere as <ph name="COOKIE_SETTINGS_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 09c1892..018f2cd 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">አገናኙን በአዲስ &amp;መስኮት ክፈት</translation>
 <translation id="1773212559869067373">የማረጋገጫ ምስክር ወረቀት በአካባቢው ተቀባይነት አላገኘም</translation>
 <translation id="177336675152937177">የተስተናገደ የመተግበሪያ ውሂብ</translation>
+<translation id="1776712937009046120">ተጠቃሚን ያክሉ</translation>
 <translation id="1776883657531386793"><ph name="OID" />፦ <ph name="INFO" /></translation>
 <translation id="1779652936965200207">እባክዎ ይህን የይለፍ ቁልፍ በ«<ph name="DEVICE_NAME" />» ላይ ያስገቡ፦</translation>
 <translation id="1781291988450150470">የአሁኑ ፒን</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 2c99bdc8..1c538207 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">فتح الرابط في &amp;نافذة جديدة</translation>
 <translation id="1773212559869067373">تمّ رفض شهادة المصادقة محليًا</translation>
 <translation id="177336675152937177">بيانات التطبيق المستضافة</translation>
+<translation id="1776712937009046120">إضافة مستخدم</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">يُرجى إدخال مفتاح المرور هذا على "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">رمز رقم التعريف الشخصي الحالي</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index eba5b5e1..107583b 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">Отваряне на връзката в нов &amp;прозорец</translation>
 <translation id="1773212559869067373">Сертификатът за удостоверяване бе отхвърлен локално</translation>
 <translation id="177336675152937177">Данни на хостваните приложения</translation>
+<translation id="1776712937009046120">Добавяне на потребител</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Моля, въведете този ключ за достъп на „<ph name="DEVICE_NAME" />“:</translation>
 <translation id="1781291988450150470">Текущ ПИН код</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index f04531b..16aed6f 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">নতুন &amp;উইন্ডোতে লিঙ্ক খুলুন</translation>
 <translation id="1773212559869067373">স্থানীয়ভাবে যাচাইকরণ সার্টিফিকেট বাতিল করা হয়েছে</translation>
 <translation id="177336675152937177">হোস্ট করা অ্যাপ্লিকেশান ডেটা</translation>
+<translation id="1776712937009046120">ব্যবহারকারী যুক্ত করুন</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">দয়া করে "<ph name="DEVICE_NAME" />"-এ পাসকীটি লিখুন:</translation>
 <translation id="1781291988450150470">বর্তমান পিন</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 4148bc1..e209f22 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Obre l'enllaç en una &amp;finestra nova</translation>
 <translation id="1773212559869067373">S'ha rebutjat el certificat d'autenticació de manera local</translation>
 <translation id="177336675152937177">Dades d'aplicacions allotjades</translation>
+<translation id="1776712937009046120">Afegeix un usuari</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Introduïu aquesta contrasenya a "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN actual</translation>
@@ -3839,7 +3840,7 @@
 <translation id="6742339027238151589">Accessible a l'script</translation>
 <translation id="6745592621698551453">Actualitza ara</translation>
 <translation id="6746124502594467657">Mou avall</translation>
-<translation id="674632704103926902">Activa l'opció tocar i arrossegar</translation>
+<translation id="674632704103926902">Activa la funció de tocar i arrossegar</translation>
 <translation id="6748217015615267851">Renderitzador: <ph name="RENDERER_URL" /></translation>
 <translation id="6748465660675848252">Podeu continuar, però només es restauraran les dades i la configuració sincronitzades. Es perdran totes les dades locals.</translation>
 <translation id="6748775883310276718">Quiosc d'una sola aplicació</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 498ed32..4ec2afbc 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Otevřít odkaz v &amp;novém okně</translation>
 <translation id="1773212559869067373">Ověřovací certifikát byl místně odmítnut</translation>
 <translation id="177336675152937177">Údaje hostovaných aplikací</translation>
+<translation id="1776712937009046120">Přidat uživatele</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Zadejte prosím přístupové heslo v zařízení <ph name="DEVICE_NAME" />:</translation>
 <translation id="1781291988450150470">Aktuální PIN</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 3826fc6..37d866b 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Åbn link i nyt &amp;vindue</translation>
 <translation id="1773212559869067373">Godkendelsescertifikatet blev afvist lokalt</translation>
 <translation id="177336675152937177">Hostede appdata</translation>
+<translation id="1776712937009046120">Tilføj bruger</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Angiv denne adgangsnøgle på "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Aktuel pinkode</translation>
@@ -921,7 +922,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Noter på låseskærmen gemmes automatisk i <ph name="LOCK_SCREEN_APP_NAME" />. Din seneste note forbliver på låseskærmen.</translation>
 <translation id="2353297238722298836">Der er givet adgang til kameraet og mikrofonen</translation>
-<translation id="2355241457888955">Send tekst til dine enheder</translation>
+<translation id="2355241457888955">Send sms til dine enheder</translation>
 <translation id="2356070529366658676">Spørg</translation>
 <translation id="2359345697448000899">Administrer dine udvidelser ved at klikke på Udvidelser i værktøjsmenuen.</translation>
 <translation id="2359808026110333948">Fortsæt</translation>
@@ -1259,7 +1260,7 @@
 <translation id="2836635946302913370">Login med dette brugernavn er blevet deaktiveret af din administrator.</translation>
 <translation id="283669119850230892">Hvis du vil bruge netværket <ph name="NETWORK_ID" />, skal du først oprette forbindelse til internettet nedenfor.</translation>
 <translation id="2838379631617906747">Installerer</translation>
-<translation id="2839032553903800133">Der blev blokeret notifikationer</translation>
+<translation id="2839032553903800133">Notifikationer blokeres</translation>
 <translation id="2841013758207633010">Tid</translation>
 <translation id="2841837950101800123">Udbyder</translation>
 <translation id="2844169650293029770">USB-C-enhed (porten foran i venstre side)</translation>
@@ -2473,7 +2474,7 @@
 <translation id="4693155481716051732">Sushi</translation>
 <translation id="4694024090038830733">Printerkonfigurationen håndteres af administratoren.</translation>
 <translation id="4694604912444486114">Abe</translation>
-<translation id="4696983787092045100">Send tekst til dine enheder</translation>
+<translation id="4696983787092045100">Send sms til dine enheder</translation>
 <translation id="4697551882387947560">Når browsersessionen afsluttes</translation>
 <translation id="4699172675775169585">Billeder og filer, der er gemt i cache</translation>
 <translation id="4699357559218762027">(automatisk opstart)</translation>
@@ -2713,7 +2714,7 @@
 <translation id="5062930723426326933">Login mislykkedes. Opret forbindelse til internettet, og prøv igen.</translation>
 <translation id="5063480226653192405">Databrug</translation>
 <translation id="5065775832226780415">Smart Lock</translation>
-<translation id="5067000372742249459">Send tekst to <ph name="DEVICE_NAME" /></translation>
+<translation id="5067000372742249459">Send sms to <ph name="DEVICE_NAME" /></translation>
 <translation id="5067399438976153555">Altid aktiveret</translation>
 <translation id="5067867186035333991">Spørg, om <ph name="HOST" /> vil have adgang til din mikrofon</translation>
 <translation id="5068918910148307423">Tillad ikke, at nyligt lukkede websites sender og modtager data</translation>
@@ -3884,7 +3885,7 @@
 <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> kan ikke køres med rodcertifikat.</translation>
 <translation id="6812841287760418429">Behold ændringer</translation>
 <translation id="6817174620439930047">Spørg mig, når et website vil anvende interne systemmeddelelser til at få adgang til MIDI-enheder (anbefales)</translation>
-<translation id="6819440013020405090">Som følge af et brud på datasikkerheden på et website eller i en app, du bruger, blev din adgangskode afsløret. Chrome anbefaler, at du tjekker dine gemte adgangskoder og ændrer din adgangskode på <ph name="ORIGIN" />.</translation>
+<translation id="6819440013020405090">Som følge af et brud på datasikkerheden på et website eller i en app, du bruger, blev din adgangskode afsløret. Chrome anbefaler, at du tjekker dine gemte adgangskoder og ændrer din adgangskode for <ph name="ORIGIN" />.</translation>
 <translation id="682123305478866682">Cast skrivebordet</translation>
 <translation id="6823506025919456619">Du skal logge ind i Chrome for at se dine enheder</translation>
 <translation id="6824564591481349393">Kopier mailadress&amp;e</translation>
@@ -4397,7 +4398,7 @@
 <translation id="7586498138629385861">Chrome fortsætter med at køre, mens Chrome Apps er åben.</translation>
 <translation id="7589461650300748890">Vær forsigtig.</translation>
 <translation id="7591957897535945411">Denne side er oversat.</translation>
-<translation id="7593653750169415785">Blokeres automatisk, fordi du afviste notifikationer gentagne gange</translation>
+<translation id="7593653750169415785">Blokeret automatisk, fordi du afviste notifikationer gentagne gange</translation>
 <translation id="7595453277607160340">Hvis du vil bruge Android og sikre, at din <ph name="DEVICE_TYPE" /> bliver ved med at fungere korrekt, skal du logge ind igen og opdatere.</translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (fejlkode <ph name="ERROR_CODE" />).</translation>
 <translation id="7598466960084663009">Genstart computer</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 1c1eedbb5..6e52063c 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">Link in neuem &amp;Fenster öffnen</translation>
 <translation id="1773212559869067373">Lokale Ablehnung des Authentifizierungszertifikats</translation>
 <translation id="177336675152937177">Gehostete App-Daten</translation>
+<translation id="1776712937009046120">Nutzer hinzufügen</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Bitte geben Sie diesen Zugangscode auf "<ph name="DEVICE_NAME" />" ein:</translation>
 <translation id="1781291988450150470">Aktuelle PIN</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 5c619dde..64c779be 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Άνοιγμα Συνδέσμου σε Νέο &amp;Παράθυρο</translation>
 <translation id="1773212559869067373">Το πιστοποιητικό ελέγχου ταυτότητας απορρίφθηκε τοπικά</translation>
 <translation id="177336675152937177">Δεδομένα φιλοξενούμενης εφαρμογής</translation>
+<translation id="1776712937009046120">Προσθήκη χρήστη</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Εισαγάγετε αυτό το κλειδί πρόσβασης στη συσκευή "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Τρέχον PIN</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 2b28d49..c7ac64a 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -302,6 +302,7 @@
 <translation id="1444628761356461360">This setting is managed by the device owner, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Could not load '<ph name="IMAGE_PATH" />' for theme.</translation>
 <translation id="1445693676523799095">This may take a while</translation>
+<translation id="1450011005989029586">A data breach on a site or app that you use exposed your password. Chrome recommends <ph name="BOLD" /> on <ph name="ORIGIN" /> now.</translation>
 <translation id="1451375123200651445">Web page, Single File</translation>
 <translation id="1451917004835509682">Add Supervised Person</translation>
 <translation id="1454223536435069390">T&amp;ake screenshot</translation>
@@ -412,6 +413,7 @@
 <translation id="1604432177629086300">Couldn't print. Check printer and try again.</translation>
 <translation id="1607139524282324606">Clear entry</translation>
 <translation id="1608626060424371292">Remove this user</translation>
+<translation id="1608668830839595724">More actions for selected items</translation>
 <translation id="1609170755653088773">Sync this password to your iPhone</translation>
 <translation id="161042844686301425">Cyan</translation>
 <translation id="1611584202130317952">Provisioning flow was interrupted. Please try again or contact your device owner or administrator.</translation>
@@ -530,6 +532,7 @@
 <translation id="1769104665586091481">Open Link in New &amp;Window</translation>
 <translation id="1773212559869067373">Authentication certificate rejected locally</translation>
 <translation id="177336675152937177">Hosted app data</translation>
+<translation id="1776712937009046120">Add user</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Please enter this passkey on "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Current PIN</translation>
@@ -733,6 +736,7 @@
 <translation id="2090165459409185032">To recover your account information, go to: google.com/accounts/recovery</translation>
 <translation id="2090876986345970080">System security setting</translation>
 <translation id="2091887806945687916">Sound</translation>
+<translation id="2096715839409389970">Clear third-party cookies</translation>
 <translation id="2097372108957554726">You need to sign in to Chrome to register new devices</translation>
 <translation id="2099172618127234427">You are enabling Chrome OS debugging features which will set up sshd daemon and enable booting from USB drives.</translation>
 <translation id="2099686503067610784">Delete server certificate "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -778,6 +782,7 @@
 <translation id="2155772377859296191">Looks like <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156283799932971644">You can help improve Safe Browsing by sending some system information and page content to Google.</translation>
 <translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2157474325782140681">To get additional features, use a Dell docking station designed to work with this Chromebook.</translation>
 <translation id="215753907730220065">Exit Full Screen</translation>
 <translation id="2157875535253991059">This page is now full screen.</translation>
 <translation id="216169395504480358">Add Wi-Fi ...</translation>
@@ -795,6 +800,7 @@
 <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> on <ph name="PEPPER_PLUGIN_DOMAIN" /> wants to access your computer</translation>
 <translation id="2178614541317717477">CA Compromise</translation>
 <translation id="218070003709087997">Use a number to indicate how many copies to print (1 to 999).</translation>
+<translation id="2182058453334755893">Copied to your Clipboard</translation>
 <translation id="2184515124301515068">Let Chrome choose when sites can play sound (recommended)</translation>
 <translation id="2187895286714876935">Server Certificate Import Error</translation>
 <translation id="2187906491731510095">Extensions updated</translation>
@@ -867,6 +873,7 @@
 <translation id="2270450558902169558">Exchange data with any device in the domain <ph name="DOMAIN" /></translation>
 <translation id="2270627217422354837">Exchange data with any device in the domains: <ph name="DOMAINS" /></translation>
 <translation id="2272570998639520080">Martini glass</translation>
+<translation id="2273119997271134996">Dock video-port issue</translation>
 <translation id="2276503375879033601">Add More Apps</translation>
 <translation id="2277255602909579701">All cookies and site data</translation>
 <translation id="2277769717710009150">{COUNT,plural, =1{1 item copied}other{# items copied}}</translation>
@@ -960,6 +967,7 @@
 <translation id="2423578206845792524">Sa&amp;ve image as...</translation>
 <translation id="2428510569851653187">Describe what you were doing when the tab crashed</translation>
 <translation id="2431027948063157455">Google Assistant was unable to load. Please check your network connection and retry.</translation>
+<translation id="243242775089461296">Third-party cookie blocking is turned off for this site</translation>
 <translation id="2432753757290432042">Linux (Beta) update required</translation>
 <translation id="2433452467737464329">Add a query param in URL to auto-refresh the page: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Appearance</translation>
@@ -1050,6 +1058,7 @@
 <translation id="2534460670861217804">Secure HTTP Proxy</translation>
 <translation id="253557089021624350">Keepalive count</translation>
 <translation id="2535799430745250929">No mobile network exists</translation>
+<translation id="2536052711541161459">Pointer acceleration</translation>
 <translation id="2537395079978992874"><ph name="ORIGIN" /> can view and edit the following files and folders</translation>
 <translation id="2538361623464451692">Sync disabled</translation>
 <translation id="2540449034743108469">Press 'Start' to listen for extension activities</translation>
@@ -1270,6 +1279,7 @@
 <translation id="2849936225196189499">Critical</translation>
 <translation id="2850541429955027218">Add theme</translation>
 <translation id="2851634818064021665">You need permission to visit this site</translation>
+<translation id="2854896010770911740">Remove third-party cookies</translation>
 <translation id="2858138569776157458">Top sites</translation>
 <translation id="2859806420264540918">This site shows intrusive or misleading ads.</translation>
 <translation id="2861301611394761800">System update complete. Please restart the system.</translation>
@@ -1431,6 +1441,7 @@
 <translation id="310671807099593501">Site is using Bluetooth</translation>
 <translation id="3115147772012638511">Waiting for cache...</translation>
 <translation id="3115580024857770654">Collapse all</translation>
+<translation id="3117362587799608430">Dock isn't fully compatible</translation>
 <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> Help</translation>
 <translation id="3120430004221004537">Insufficient encryption for a given operation on: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="3121793941267913344">Reset this <ph name="IDS_SHORT_PRODUCT_NAME" /> device</translation>
@@ -1439,6 +1450,7 @@
 <translation id="3124111068741548686">USER handles</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3127156390846601284">This will delete any data stored on your device for all the sites shown. Do you want to continue?</translation>
+<translation id="3127860049873093642">To avoid charging and performance issues, use a compatible Dell or USB Type-C power adaptor.</translation>
 <translation id="3129173833825111527">Left margin</translation>
 <translation id="3130528281680948470">Your device will be reset and all user accounts and local data will be removed. This cannot be undone.</translation>
 <translation id="313205617302240621">Forgot password?</translation>
@@ -1537,6 +1549,7 @@
 <translation id="3281892622610078515">Files and programs to be quarantined:</translation>
 <translation id="3282568296779691940">Sign in to Chrome</translation>
 <translation id="3285322247471302225">New &amp;Tab</translation>
+<translation id="328571385944182268">Save your passwords?</translation>
 <translation id="3286654161521615710">Used by Chrome browser and <ph name="DEVICE_TYPE" /> launcher</translation>
 <translation id="3286737518123001369">View and delete the sign-in data stored on your security key</translation>
 <translation id="3288047731229977326">Extensions running in developer mode can harm your computer. If you're not a developer, you should disable these extensions running in developer mode to stay safe.</translation>
@@ -1657,6 +1670,7 @@
 <translation id="346431825526753">This is an account for kids managed by <ph name="CUSTODIAN_EMAIL" />.</translation>
 <translation id="3468999815377931311">Android phone</translation>
 <translation id="3470442499439619530">Remove This User</translation>
+<translation id="3471876058939596279">HDMI and USB Type-C ports can't be used for video at the same time. Use a different video port.</translation>
 <translation id="3473479545200714844">Screen magnifier</translation>
 <translation id="3475843873335999118">Sorry, your fingerprint is still not recognised. Please enter your password.</translation>
 <translation id="3476303763173086583">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2" />Find out more<ph name="END_LINK2" /></translation>
@@ -1754,6 +1768,7 @@
 <translation id="3603622770190368340">Obtain network certificate</translation>
 <translation id="3605780360466892872">Businessman</translation>
 <translation id="3608576286259426129">User image preview</translation>
+<translation id="3610369246614755442">Dock fan needs service</translation>
 <translation id="361106536627977100">Flash data</translation>
 <translation id="3612673635130633812">Downloaded by &lt;a href="<ph name="URL" />"&gt;<ph name="EXTENSION" />&lt;/a&gt;</translation>
 <translation id="3613134908380545408">Show <ph name="FOLDER_NAME" /></translation>
@@ -1766,6 +1781,7 @@
 <translation id="3624567683873126087">Unlock device and sign in to Google Account</translation>
 <translation id="3625258641415618104">Screenshots disabled</translation>
 <translation id="3625481642044239431">Invalid file selected. Try again.</translation>
+<translation id="3626296069957678981">To charge this Chromebook, use a compatible Dell battery.</translation>
 <translation id="3627320433825461852">Less than 1 minute left</translation>
 <translation id="3627588569887975815">Open link in inco&amp;gnito window</translation>
 <translation id="3627671146180677314">Netscape Certificate Renewal Time</translation>
@@ -2217,6 +2233,7 @@
 <translation id="4267953847983678297">Automatically connect to mobile network</translation>
 <translation id="4268025649754414643">Key Encipherment</translation>
 <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation>
+<translation id="4270615291506829403">changing your password</translation>
 <translation id="4275663329226226506">Media</translation>
 <translation id="4275830172053184480">Restart your device</translation>
 <translation id="4278101229438943600">Your Assistant is ready</translation>
@@ -2354,6 +2371,7 @@
 <translation id="451407183922382411">Powered by <ph name="COMPANY_NAME" /></translation>
 <translation id="4514610446763173167">Toggle video to play or pause</translation>
 <translation id="451515744433878153">Remove</translation>
+<translation id="4515872537870654449">Contact Dell for service. The dock will shut down if the fan isn't working.</translation>
 <translation id="4519935350946509010">Connection error.</translation>
 <translation id="4520385623207007473">Cookies in use</translation>
 <translation id="452039078290142656">unknown devices from <ph name="VENDOR_NAME" /></translation>
@@ -2636,6 +2654,7 @@
 <translation id="4932733599132424254">Date</translation>
 <translation id="4933484234309072027">embedded on <ph name="URL" /></translation>
 <translation id="493571969993549666">Add supervised user</translation>
+<translation id="4939805055470675027">Couldn't connect to <ph name="CARRIER_NAME" /></translation>
 <translation id="4941246025622441835">Use this device requisition when enrolling the device for enterprise management:</translation>
 <translation id="4941627891654116707">Font size</translation>
 <translation id="494286511941020793">Proxy Configuration Help</translation>
@@ -2660,6 +2679,7 @@
 <translation id="4973307593867026061">Add printers</translation>
 <translation id="4973325300212422370">{NUM_TABS,plural, =1{Mute site}other{Mute sites}}</translation>
 <translation id="4974733135013075877">Exit and child lock</translation>
+<translation id="4976009197147810135">Split vertical</translation>
 <translation id="4976795213394241669">{0,plural, =0{Update now}=1{Update within 1 second}other{Update within # seconds}}</translation>
 <translation id="4977942889532008999">Confirm Access</translation>
 <translation id="4980805016576257426">This extension contains malware.</translation>
@@ -2769,7 +2789,9 @@
 <translation id="5142961317498132443">Authentication</translation>
 <translation id="5143374789336132547">The extension "<ph name="EXTENSION_NAME" />" has changed the page that is shown when you click the Home button.</translation>
 <translation id="5143712164865402236">Enter Full Screen</translation>
+<translation id="5145461783043820456">Third-party cookie blocking is on</translation>
 <translation id="514575469079499857">Use your IP address to determine location (default)</translation>
+<translation id="5146995429444047494">Notifications for <ph name="ORIGIN" /> are blocked</translation>
 <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation>
 <translation id="5151354047782775295">Free up disk space or select data may be automatically deleted</translation>
 <translation id="5153234146675181447">Forget phone</translation>
@@ -3034,6 +3056,7 @@
 <translation id="5541694225089836610">Action is disabled by your administrator</translation>
 <translation id="5542132724887566711">Profile</translation>
 <translation id="5542750926112347543">Cookies from <ph name="DOMAIN" /> blocked</translation>
+<translation id="5542949973455282971">Connecting to <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Checking for status...</translation>
 <translation id="554517032089923082">GTC</translation>
 <translation id="5546865291508181392">Find</translation>
@@ -3606,6 +3629,7 @@
 <translation id="6384275966486438344">Change your search settings to: <ph name="SEARCH_HOST" /></translation>
 <translation id="6385543213911723544">Sites can save and read cookie data</translation>
 <translation id="6386099547750337629">If this is unexpected, please contact support.</translation>
+<translation id="6387674443318562538">Split vertical</translation>
 <translation id="6388429472088318283">Search languages</translation>
 <translation id="6390799748543157332">Pages that you view in this window won’t appear in the browser history and they won’t leave other traces, like cookies, on the computer after you close all open Guest windows. Any files that you download, however, will be preserved.</translation>
 <translation id="6390994422085833176">Review sync and personalisation features following setup</translation>
@@ -3639,6 +3663,7 @@
 <translation id="6419546358665792306">Load unpacked</translation>
 <translation id="642469772702851743">This device (SN: <ph name="SERIAL_NUMBER" />) was locked by the owner.</translation>
 <translation id="6426200009596957090">Open ChromeVox settings</translation>
+<translation id="6428450836711225518">Verifying your phone number</translation>
 <translation id="6429384232893414837">Update error</translation>
 <translation id="6430814529589430811">Base64-encoded ASCII, single certificate</translation>
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME" /> will set up automatic updates for all users of this computer.</translation>
@@ -3861,6 +3886,7 @@
 <translation id="6786747875388722282">Extensions</translation>
 <translation id="6787839852456839824">Keyboard shortcuts</translation>
 <translation id="6788210894632713004">Unpacked extension</translation>
+<translation id="6789592661892473991">Split horizontal</translation>
 <translation id="6790428901817661496">Play</translation>
 <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> was added remotely</translation>
 <translation id="6790820461102226165">Add Person...</translation>
@@ -4242,6 +4268,7 @@
 <translation id="7334190995941642545">Smart Lock is currently unavailable. Please try again later.</translation>
 <translation id="7334274148831027933">Enable docked magnifier</translation>
 <translation id="7335974957018254119">Use spell check for</translation>
+<translation id="7336799713063880535">Notifications blocked.</translation>
 <translation id="7338630283264858612">Device serial number is invalid.</translation>
 <translation id="7339763383339757376">PKCS #7, single certificate</translation>
 <translation id="7339785458027436441">Check Spelling While Typing</translation>
@@ -4354,6 +4381,7 @@
 <translation id="7506541170099744506">Your <ph name="DEVICE_TYPE" /> has successfully been enrolled for enterprise management.</translation>
 <translation id="7507930499305566459">Status Responder Certificate</translation>
 <translation id="7508054832109420082">Give access to printers</translation>
+<translation id="7510943789645525906">Warns you if a password that you used was part of a data breach</translation>
 <translation id="7513029293694390567">Automatically sign in to websites using stored credentials. If disabled, you will be asked for confirmation every time before signing in to a website.</translation>
 <translation id="7514365320538308">Download</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -4419,6 +4447,7 @@
 <translation id="7625568159987162309">View permissions and data stored across sites</translation>
 <translation id="7629827748548208700">Tab: <ph name="TAB_NAME" /></translation>
 <translation id="7631014249255418691">Linux apps &amp; files have been successfully backed up</translation>
+<translation id="7631205654593498032">When you connect your devices, you agree that your <ph name="DEVICE_TYPE" /> can:</translation>
 <translation id="7631887513477658702">&amp;Always Open Files of This Type</translation>
 <translation id="7632948528260659758">The following kiosk apps have been failed for updating:</translation>
 <translation id="763632859238619983">Do not allow any site to install payment handlers</translation>
@@ -4581,6 +4610,7 @@
     <ph name="BR" />
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Note:<ph name="END_BOLD" /> The system will reboot during the process.</translation>
+<translation id="7828731929332799387">This will delete all cookies and site data available in third-party contexts. Do you want to continue?</translation>
 <translation id="7829298379596169484">Accessing audio input</translation>
 <translation id="7830594666202422257">Connect to Linux</translation>
 <translation id="7831491651892296503">Error configuring network</translation>
@@ -4785,6 +4815,7 @@
 <translation id="810875025413331850">No nearby devices found.</translation>
 <translation id="8111155949205007504">Share this password with your iPhone</translation>
 <translation id="8113043281354018522">Choose license type</translation>
+<translation id="8114875720387900039">Split horizontal</translation>
 <translation id="8116972784401310538">&amp;Bookmark manager</translation>
 <translation id="8117620576188476503">Manage connections, updates and settings with the status tray. To get here by keyboard, press Alt + Shift + S.</translation>
 <translation id="8118076340394175570">Your organisation requires an update to this device</translation>
@@ -4976,6 +5007,7 @@
 <translation id="839736845446313156">Register</translation>
 <translation id="8398877366907290961">Proceed anyway</translation>
 <translation id="8400146488506985033">Manage people</translation>
+<translation id="8401432541486058167">Provide the PIN that’s associated with your smart card.</translation>
 <translation id="8405046151008197676">Get highlights from the latest update</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">Ask first (recommended)</translation>
@@ -5201,10 +5233,12 @@
 <translation id="8732212173949624846">Read and change your browsing history on all your signed-in devices</translation>
 <translation id="8732844209475700754">More settings that relate to privacy, security and data collection</translation>
 <translation id="8734073480934656039">Enabling this setting allows kiosk applications to launch automatically on startup.</translation>
+<translation id="8734674662128056360">Third-party cookie blocking</translation>
 <translation id="873545264931343897">When <ph name="PLUGIN_NAME" /> finishes updating, reload the page to activate it</translation>
 <translation id="8736288397686080465">This site has been updated in the background.</translation>
 <translation id="8737685506611670901">Open <ph name="PROTOCOL" /> links instead of <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8742371904523228557"><ph name="ONE_TIME_CODE" /> is your code for <ph name="ORIGIN" /></translation>
 <translation id="8743390665131937741">Full-screen zoom level:</translation>
 <translation id="8743864605301774756">Updated 1hr ago</translation>
 <translation id="874689135111202667">{0,plural, =1{Upload one file to this site?}other{Upload # files to this site?}}</translation>
@@ -5277,6 +5311,7 @@
 <translation id="8828933418460119530">DNS Name</translation>
 <translation id="883062543841130884">Substitutions</translation>
 <translation id="8830796635868321089">The update check failed using the current proxy settings. Please adjust your <ph name="PROXY_SETTINGS_LINK_START" />proxy settings<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
+<translation id="8831140208248705279">Your <ph name="DEVICE_TYPE" /> and Android phone work better together. Connect them so that you can text from your computer, share your Internet connection and unlock your <ph name="DEVICE_TYPE" /> with your phone.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="8831664945713891930">Open Extensions settings</translation>
 <translation id="8834039744648160717">Network configuration is controlled by <ph name="USER_EMAIL" />.</translation>
 <translation id="8838770651474809439">Hamburger</translation>
@@ -5308,6 +5343,7 @@
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Show As Tab</translation>
 <translation id="8879921471468674457">Remember sign-in info</translation>
+<translation id="8881020143150461183">Please try again. For technical support, contact <ph name="CARRIER_NAME" />.</translation>
 <translation id="8884570509232205463">Your device now locks at <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">Smart Lock is unavailable</translation>
 <translation id="8888253246822647887">Your app will open when the upgrade is finished. Upgrades can take a few minutes.</translation>
@@ -5358,6 +5394,7 @@
 <translation id="894871326938397531">Leave incognito mode?</translation>
 <translation id="8948939328578167195"><ph name="WEBSITE" /> wants to see the make and model of your security key</translation>
 <translation id="8951256747718668828">Restoring couldn't be completed due to an error</translation>
+<translation id="8951465597020890363">Exit guest mode anyway?</translation>
 <translation id="8952831374766033534">Configuration option not supported: <ph name="ERROR_LINE" /></translation>
 <translation id="895347679606913382">Starting...</translation>
 <translation id="8956941634583033512">{0,plural, =1{Update within a day}other{Update within # days}}</translation>
@@ -5462,6 +5499,7 @@
 <translation id="9103868373786083162">Press to go back, context menu to see history</translation>
 <translation id="9104396740804929809">Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This setting is enforced by the owner. The owner may choose to send diagnostic and usage data for this device to Google. If your additional Web &amp; App Activity setting is turned on, this data may be saved to your Google Account. <ph name="BEGIN_LINK1" />Find out more<ph name="END_LINK1" /></translation>
 <translation id="9109122242323516435">To free up space, delete files from device storage.</translation>
+<translation id="9109283579179481106">Connect to mobile network</translation>
 <translation id="9111102763498581341">Unlock</translation>
 <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation>
 <translation id="9112748030372401671">Change your wallpaper</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index a737e62f..94685f1 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">Abrir vínculo en una ventana &amp;nueva</translation>
 <translation id="1773212559869067373">Certificado de autenticación rechazado de forma local</translation>
 <translation id="177336675152937177">Datos de aplicaciones alojadas</translation>
+<translation id="1776712937009046120">Agregar usuario</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Ingresa esta clave de acceso en "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN actual</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 598520e7..9b9a084 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Abrir enlace en una &amp;ventana nueva</translation>
 <translation id="1773212559869067373">Certificado de autenticación rechazado de forma local</translation>
 <translation id="177336675152937177">Datos de aplicaciones alojadas</translation>
+<translation id="1776712937009046120">Añadir usuario</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Introduce esta clave de acceso en "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN actual</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 01e5067d..f9c2723 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Ava link uues &amp;aknas</translation>
 <translation id="1773212559869067373">Autentimissertifikaat lükati kohalikult tagasi</translation>
 <translation id="177336675152937177">Hostitud rakenduste andmed</translation>
+<translation id="1776712937009046120">Lisa kasutaja</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Sisestage seadmesse „<ph name="DEVICE_NAME" />” pääsukood:</translation>
 <translation id="1781291988450150470">Praegune PIN-kood</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 3a4daa07..141cb716 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">باز کردن پیوند در &amp;پنجره جدید</translation>
 <translation id="1773212559869067373">گواهینامه راستی‌آزمایی به صورت محلی رد شد</translation>
 <translation id="177336675152937177">داده های برنامه میزبانی شده</translation>
+<translation id="1776712937009046120">افزودن کاربر</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">لطفاً این کلیدواژه را در "<ph name="DEVICE_NAME" />" وارد کنید:</translation>
 <translation id="1781291988450150470">پین کنونی</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 23017df..b8e7f13 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Avaa linkki uudessa &amp;ikkunassa</translation>
 <translation id="1773212559869067373">Todennusvarmenne on hylätty paikallisesti</translation>
 <translation id="177336675152937177">Isännöidyn sovelluksen tiedot</translation>
+<translation id="1776712937009046120">Lisää käyttäjä</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Kirjoita tämä salasana laitteelle <ph name="DEVICE_NAME" />:</translation>
 <translation id="1781291988450150470">Nykyinen PIN-koodi</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index bc54d465..3369111 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Buksan ang Link sa Bagong &amp;Window</translation>
 <translation id="1773212559869067373">Lokal na tinanggihan ang certificate ng pagpapatunay</translation>
 <translation id="177336675152937177">Naka-host na data ng app</translation>
+<translation id="1776712937009046120">Magdagdag ng user</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Pakilagay ang passkey na ito sa "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Kasalukuyang PIN</translation>
@@ -2922,7 +2923,7 @@
 <translation id="5390100381392048184">Payagan ang mga site na mag-play ng tunog</translation>
 <translation id="5390677308841849479">Dark red at orange</translation>
 <translation id="5390743329570580756">Magpadala para sa</translation>
-<translation id="5397361543868847016">{COUNT,plural, =0{Hindi gumagamit ang site na ito ng cookies para sa cross-site na pagsubaybay}=1{Bina-block ng Chrome ang cookies mula sa 1 site}one{Bina-block ng Chrome ang cookies mula sa # site}other{Bina-block ng Chrome ang cookies mula sa # na mga site}}</translation>
+<translation id="5397361543868847016">{COUNT,plural, =0{Hindi gumagamit ang site na ito ng cookies para sa cross-site na pagsubaybay}=1{Bina-block ng Chrome ang cookies mula sa 1 site}one{Bina-block ng Chrome ang cookies mula sa # site}other{Bina-block ng Chrome ang cookies mula sa # na site}}</translation>
 <translation id="5397794290049113714">Ikaw</translation>
 <translation id="5398572795982417028">Lampas sa hangganan ang tinukoy na page, ang limitasyon ay <ph name="MAXIMUM_PAGE" /></translation>
 <translation id="5398772614898833570">Na-block ang mga ad</translation>
@@ -3028,7 +3029,7 @@
   -   iyong mga pisikal na katangian, gaya ng tangkad
   -   layout ng kwarto mo
 
-Tiyaking pinagkakatiwalaan mo ang site na ito bago pumasok sa VR.</translation>
+Tiyaking pinagkakatiwalaan mo ang site na ito bago ka pumasok sa VR.</translation>
 <translation id="5535941515421698170">Alisin din ang iyong kasalukuyang data sa device na ito</translation>
 <translation id="5539221284352502426">Tinanggihan ng server ang password na inilagay mo. Kabilang sa mga posibleng dahilan: Masyadong maikli ang password. Dapat may mga numero o simbolo ang password. Dapat naiiba ang password sa mga nakaraang password.</translation>
 <translation id="5541694225089836610">Na-disable ng iyong administrator ang pagkilos na ito</translation>
@@ -4027,7 +4028,7 @@
 <translation id="7025190659207909717">Pamamahala sa serbisyo ng data ng mobile</translation>
 <translation id="7027891519253193555">Hindi <ph name="LANGUAGE" /> ang page ?</translation>
 <translation id="7029809446516969842">Mga Password</translation>
-<translation id="703001695939087067">Pumasok ka sa overview mode ng window Pindutin ang tab para mag-navigate.</translation>
+<translation id="703001695939087067">Pumasok sa overview mode ng window. Pindutin ang tab para mag-navigate.</translation>
 <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Nakakonekta ang serial port</translation>
 <translation id="7031962166228839643">Ang TPM ay ihinahanda, mangyaring maghintay (maaaring tumagal ito nang ilang minuto)...</translation>
 <translation id="7037509989619051237">Text na ipi-preview</translation>
@@ -4066,7 +4067,7 @@
 <translation id="708060913198414444">K&amp;opyahin ang address ng audio</translation>
 <translation id="7081952801286122383">Incognito ka</translation>
 <translation id="708278670402572152">Idiskonekta upang i-enable ang pag-scan</translation>
-<translation id="70850504851191913">Naiulat ang paglabag sa data</translation>
+<translation id="70850504851191913">May naiulat na paglabag sa data</translation>
 <translation id="7085389578340536476">Payagan ang Chrome na mag-record ng audio?</translation>
 <translation id="7088434364990739311">Nabigong magsimula ang pagsusuri ng update (code ng error na <ph name="ERROR" />).</translation>
 <translation id="7088561041432335295">Zip Archiver - Buksan at i-pack ang mga ZIP file sa app na Mga File.</translation>
@@ -4459,7 +4460,7 @@
 <translation id="7684559058815332124">Bisitahin ang page ng login ng captive portal</translation>
 <translation id="7685049629764448582">Memorya sa JavaScript</translation>
 <translation id="7685087414635069102">Kailangan ng PIN</translation>
-<translation id="7685301384041462804">Tiyaking pinagkakatiwalaan mo ang site na ito bago pumasok sa VR.</translation>
+<translation id="7685301384041462804">Tiyaking pinagkakatiwalaan mo ang site na ito bago ka pumasok sa VR.</translation>
 <translation id="7686938547853266130"><ph name="FRIENDLY_NAME" /> (<ph name="DEVICE_PATH" />)</translation>
 <translation id="7690294790491645610">Kumpirmahin ang bagong password</translation>
 <translation id="7690378713476594306">Pumili sa listahan</translation>
@@ -4925,7 +4926,7 @@
 <translation id="830868413617744215">Beta</translation>
 <translation id="8309458809024885768">Mayroon na ng certificate</translation>
 <translation id="8314381333424235892">Nawawala o hindi naka-install ang extension</translation>
-<translation id="831440797644402910">Hindi mabuksan ang folder</translation>
+<translation id="831440797644402910">Hindi mabuksan ang folder na ito</translation>
 <translation id="8316618172731049784">Ipadala sa <ph name="DEVICE_NAME" /></translation>
 <translation id="8317671367883557781">Idagdag ang koneksyon sa network</translation>
 <translation id="8319414634934645341">Extended na Paggamit ng Key</translation>
@@ -4957,10 +4958,10 @@
 <translation id="8371695176452482769">Magsalita ngayon</translation>
 <translation id="8371925839118813971">{NUM_TABS,plural, =1{I-mute ang Site}one{I-mute ang Mga Site}other{I-mute ang Mga Site}}</translation>
 <translation id="8372369524088641025">Mahinang WEP key</translation>
-<translation id="8372477600026034341">Karagdagang host</translation>
+<translation id="8372477600026034341">Mga karagdagang host</translation>
 <translation id="8378714024927312812">Pinapamahalaan ng iyong organisasyon</translation>
 <translation id="8379878387931047019">Hindi sinusuportahan ng device na ito ang uri ng security key na hiniling ng website na ito</translation>
-<translation id="8379991678458444070">Bumalik dito nang mabilis sa pamamagitan ng pag-bookmark sa tab na ito</translation>
+<translation id="8379991678458444070">Makabalik kaagad dito sa pamamagitan ng pag-bookmark sa tab na ito</translation>
 <translation id="8382913212082956454">Kopyahin ang &amp;email address</translation>
 <translation id="8386091599636877289">Hindi nakita ang patakaran.</translation>
 <translation id="8386903983509584791">Nakumpleto ang pag-scan</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 8929701..d552d60 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Ouvrir le lien dans une nouvelle &amp;fenêtre</translation>
 <translation id="1773212559869067373">Certificat d'authentification rejeté en local.</translation>
 <translation id="177336675152937177">Données d'application hébergée</translation>
+<translation id="1776712937009046120">Ajouter un utilisateur</translation>
 <translation id="1776883657531386793"><ph name="OID" /> : <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Saisissez cette clé d'accès sur "<ph name="DEVICE_NAME" />" :</translation>
 <translation id="1781291988450150470">Code actuel</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 89ba12cf..bec8567 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -526,6 +526,7 @@
 <translation id="1769104665586091481">નવી &amp;વિંડોમાં લિંક ખોલો</translation>
 <translation id="1773212559869067373">પ્રમાણીકરણ પ્રમાણપત્રને સ્થાનિક રૂપે નકારવામાં આવ્યું છે</translation>
 <translation id="177336675152937177">હોસ્ટ કરેલ ઍપ્લિકેશન ડેટા</translation>
+<translation id="1776712937009046120">વપરાશકર્તા ઉમેરો</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">કૃપા કરીને "<ph name="DEVICE_NAME" />" પર આ પાસકી દાખલ કરો:</translation>
 <translation id="1781291988450150470">વર્તમાન પિન</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index ed5247a..bc602e8 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">नई &amp;विंडो में लिंक खोलें</translation>
 <translation id="1773212559869067373">प्रमाणीकरण प्रमाणपत्र को स्थानीय रूप से अस्वीकार कर दिया गया</translation>
 <translation id="177336675152937177">होस्ट किया गया ऐप्लिकेशन डेटा</translation>
+<translation id="1776712937009046120">उपयोगकर्ता जोड़ें</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">कृपया यह पासकुंजी "<ph name="DEVICE_NAME" />" पर दर्ज करें:</translation>
 <translation id="1781291988450150470">मौजूदा पिन</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 8a285e2e..79dfe5e 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Otvori vezu u novom &amp;prozoru</translation>
 <translation id="1773212559869067373">Certifikat za autentifikaciju odbijen je lokalno</translation>
 <translation id="177336675152937177">Podaci hostiranih aplikacija</translation>
+<translation id="1776712937009046120">Dodaj korisnika</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Unesite ovu zaporku na uređaju "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Trenutačni PIN</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 7821e694..929e0e71 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Link megnyitása új &amp;ablakban</translation>
 <translation id="1773212559869067373">A hitelesítési tanúsítvány helyileg elutasítva</translation>
 <translation id="177336675152937177">Tárolt alkalmazás adatai</translation>
+<translation id="1776712937009046120">Felhasználó hozzáadása</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Kérjük, írja be ezt az azonosítókulcsot a(z) " <ph name="DEVICE_NAME" /> " eszközön:</translation>
 <translation id="1781291988450150470">Jelenlegi PIN-kód</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 9de76569..eb9dc9d 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Buka Tautan di &amp;Jendela Baru</translation>
 <translation id="1773212559869067373">Sertifikat autentikasi ditolak secara lokal</translation>
 <translation id="177336675152937177">Data aplikasi yang dihosting</translation>
+<translation id="1776712937009046120">Tambahkan pengguna</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Masukkan kunci sandi ini di "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN Saat Ini</translation>
@@ -3459,7 +3460,7 @@
 <translation id="615436196126345398">Protokol</translation>
 <translation id="6154697846084421647">Saat ini telah masuk</translation>
 <translation id="6155141482566063812">Tab background membagikan layar Anda</translation>
-<translation id="6156323911414505561">Tampilkan kolom bookmark.</translation>
+<translation id="6156323911414505561">Tampilkan kolom bookmark</translation>
 <translation id="6156863943908443225">Cache skrip</translation>
 <translation id="6156960295318603523">Setelan Bahasa</translation>
 <translation id="6160625263637492097">Berikan sertifikat untuk autentikasi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 445d3d9..ff69987f 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Apri link in un'altra &amp;finestra</translation>
 <translation id="1773212559869067373">Certificato di autenticazione rifiutato localmente</translation>
 <translation id="177336675152937177">Dati app in hosting</translation>
+<translation id="1776712937009046120">Aggiungi utente</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Inserisci questa passkey su "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN attuale</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index c3f96a3..3f70c9c 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">פתח קישור &amp;בחלון חדש</translation>
 <translation id="1773212559869067373">אישור האימות נדחה מקומית</translation>
 <translation id="177336675152937177">נתוני יישומים מתארחים</translation>
+<translation id="1776712937009046120">הוסף משתמש</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">הזן את סיסמה זו ב-"<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">קוד אימות נוכחי</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 3362bd95..95da653f 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">新しいウインドウで開く(&amp;W)</translation>
 <translation id="1773212559869067373">認証証明書がローカルで拒否されました</translation>
 <translation id="177336675152937177">ホストされているアプリ データ</translation>
+<translation id="1776712937009046120">ユーザーを追加</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">「<ph name="DEVICE_NAME" />」でこのパスキーを入力してください:</translation>
 <translation id="1781291988450150470">現在の PIN</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 5f410c3..a72e92a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -531,6 +531,7 @@
 <translation id="1769104665586091481">ಹೊಸ &amp;ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
 <translation id="1773212559869067373">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸ್ಥಳೀಯವಾಗಿ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ</translation>
 <translation id="177336675152937177">ಹೋಸ್ಟ್ ಮಾಡಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾ</translation>
+<translation id="1776712937009046120">ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">ದಯವಿಟ್ಟು "<ph name="DEVICE_NAME" />" ರಲ್ಲಿ ಈ ಪಾಸ್‌ಕೀಯನ್ನು ನಮೂದಿಸಿ:</translation>
 <translation id="1781291988450150470">ಸದ್ಯದ ಪಿನ್‌</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index a1c2a7e..3fefaad8 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">새 창에서 링크 열기(&amp;W)</translation>
 <translation id="1773212559869067373">인증서가 로컬로 거부됨</translation>
 <translation id="177336675152937177">호스팅된 앱 데이터</translation>
+<translation id="1776712937009046120">사용자 추가</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">다음 패스키를 '<ph name="DEVICE_NAME" />'에 입력하세요.</translation>
 <translation id="1781291988450150470">현재 PIN</translation>
@@ -2489,7 +2490,7 @@
 <translation id="4722920479021006856"><ph name="APP_NAME" />에서 내 화면을 공유하는 중입니다.</translation>
 <translation id="4724450788351008910">제휴가 변경됨</translation>
 <translation id="4725511304875193254">웰시 코기</translation>
-<translation id="4725851834065990915">사용하는 사이트 또는 앱의 정보 유출로 인해 비밀번호가 노출되었습니다. 지금 저장된 비밀번호를 변경하는 것이 좋습니다.</translation>
+<translation id="4725851834065990915">사용하는 사이트 또는 앱의 정보 유출로 인해 비밀번호가 노출되었습니다. 지금 저장된 비밀번호를 확인하는 것이 좋습니다.</translation>
 <translation id="4726710629007580002">확장 프로그램을 설치하는 중에 다음과 같은 경고가 표시되었습니다.</translation>
 <translation id="4727847987444062305">관리되는 게스트 세션</translation>
 <translation id="4728558894243024398">플랫폼</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 4a8b83b..12e2ed7 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Atidaryti nuorodą naujame &amp;lange</translation>
 <translation id="1773212559869067373">Autentifikavimo sertifikatas atmestas vietiniu mastu</translation>
 <translation id="177336675152937177">Priglobti programų duomenys</translation>
+<translation id="1776712937009046120">Pridėti naudotoją</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">„<ph name="DEVICE_NAME" />“ įveskite šį prieigos kodą:</translation>
 <translation id="1781291988450150470">Dabartinis PIN kodas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index a77aabee..64bba9d 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Atvērt saiti &amp;jaunā logā</translation>
 <translation id="1773212559869067373">Autentifikācijas sertifikāts tika lokāli noraidīts.</translation>
 <translation id="177336675152937177">Mitinātas lietotnes dati</translation>
+<translation id="1776712937009046120">Pievienot lietotāju</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Ievadiet šo ieejas atslēgu ierīcē <ph name="DEVICE_NAME" />:</translation>
 <translation id="1781291988450150470">Pašreizējais PIN</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index d446d68..d99fdfa0 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">പുതിയ &amp;വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation>
 <translation id="1773212559869067373">പരിശോധിച്ചുറപ്പിക്കൽ സർട്ടിഫിക്കറ്റ് പ്രാദേശികമായി നിരസിച്ചു</translation>
 <translation id="177336675152937177">ഹോസ്റ്റ് ചെയ്‌ത ആപ്പ് ഡാറ്റ</translation>
+<translation id="1776712937009046120">ഉപയോക്താവിനെ ചേര്‍ക്കുക</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">ഈ പാസ്‌കീ "<ph name="DEVICE_NAME" />" എന്നതിൽ നൽകുക:</translation>
 <translation id="1781291988450150470">നിലവിലെ പിൻ</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index d7a433f..67a463d1 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -529,6 +529,7 @@
 <translation id="1769104665586091481">लिंक नवीन &amp;विंडोमध्ये उघडा</translation>
 <translation id="1773212559869067373">अॉथेंटिकेशन प्रमाणपत्र स्थानिक पातळीवर नाकारले</translation>
 <translation id="177336675152937177">होस्ट केलेला अ‍ॅप डेटा</translation>
+<translation id="1776712937009046120">वापरकर्ता जोडा</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">कृपया ही पासकी "<ph name="DEVICE_NAME" />" वर प्रविष्‍ट करा:</translation>
 <translation id="1781291988450150470">सध्याचा पिन</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index b5c42dd..25e7b925 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Buka Pautan dalam Tetingkap &amp;Baharu</translation>
 <translation id="1773212559869067373">Sijil pengesahan ditolak secara setempat</translation>
 <translation id="177336675152937177">Data apl yang dihoskan</translation>
+<translation id="1776712937009046120">Tambah pengguna</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Sila masukkan kekunci laluan ini pada "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN semasa</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index bb173d9..d5e087d 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Link openen in nieu&amp;w venster</translation>
 <translation id="1773212559869067373">Verificatiecertificaat lokaal geweigerd</translation>
 <translation id="177336675152937177">Gehoste app-gegevens</translation>
+<translation id="1776712937009046120">Gebruiker toevoegen</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Geef deze toegangscode op '<ph name="DEVICE_NAME" />' op:</translation>
 <translation id="1781291988450150470">Huidige pincode</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 843ce70..4390da8 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">&amp;Åpne link i nytt vindu</translation>
 <translation id="1773212559869067373">Autentiseringssertifikatet ble avvist lokalt</translation>
 <translation id="177336675152937177">Appdata på vertstjener</translation>
+<translation id="1776712937009046120">Legg til bruker</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Skriv inn dette passordet på «<ph name="DEVICE_NAME" />»:</translation>
 <translation id="1781291988450150470">Gjeldende PIN-kode</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 942ab8c..9e179a4 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Otwórz link w nowym &amp;oknie</translation>
 <translation id="1773212559869067373">Certyfikat uwierzytelniania został odrzucony lokalnie</translation>
 <translation id="177336675152937177">Dane udostępnianych aplikacji</translation>
+<translation id="1776712937009046120">Dodaj użytkownika</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Wpisz ten klucz na urządzeniu „<ph name="DEVICE_NAME" />”:</translation>
 <translation id="1781291988450150470">Obecny kod PIN</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 4bcb4aebc..fadea9d 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -302,6 +302,7 @@
 <translation id="1444628761356461360">Esta configuração é gerenciada pelo proprietário do dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Não foi possível carregar "<ph name="IMAGE_PATH" />" para o tema.</translation>
 <translation id="1445693676523799095">Isso pode demorar um pouco</translation>
+<translation id="1450011005989029586">Uma violação de dados em um site ou app que você usa expôs sua senha. O Chrome recomenda <ph name="BOLD" /> em <ph name="ORIGIN" /> imediatamente.</translation>
 <translation id="1451375123200651445">Página da Web, arquivo único</translation>
 <translation id="1451917004835509682">Adicionar pessoa supervisionada</translation>
 <translation id="1454223536435069390">T&amp;irar captura de tela</translation>
@@ -412,6 +413,7 @@
 <translation id="1604432177629086300">Não foi possível imprimir. Verifique a impressora e tente novamente</translation>
 <translation id="1607139524282324606">Limpar entrada</translation>
 <translation id="1608626060424371292">Remover este usuário</translation>
+<translation id="1608668830839595724">Mais ações para itens selecionados</translation>
 <translation id="1609170755653088773">Sincronize esta senha com seu iPhone</translation>
 <translation id="161042844686301425">Ciano</translation>
 <translation id="1611584202130317952">O fluxo de aprovisionamento foi interrompido. Tente novamente ou entre em contato com o proprietário ou administrador do dispositivo.</translation>
@@ -530,6 +532,7 @@
 <translation id="1769104665586091481">Abrir link em uma nova &amp;janela</translation>
 <translation id="1773212559869067373">Certificado de autenticação rejeitado localmente</translation>
 <translation id="177336675152937177">Dados do aplicativo hospedado</translation>
+<translation id="1776712937009046120">Adicionar usuário</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Insira esta senha em "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN atual</translation>
@@ -733,6 +736,7 @@
 <translation id="2090165459409185032">Para recuperar informações da sua conta, acesse: google.com.br/accounts/recovery</translation>
 <translation id="2090876986345970080">Configuração de segurança do sistema</translation>
 <translation id="2091887806945687916">Som</translation>
+<translation id="2096715839409389970">Limpar cookies de terceiros</translation>
 <translation id="2097372108957554726">É necessário fazer login no Chrome para registrar novos dispositivos</translation>
 <translation id="2099172618127234427">Você está ativando recursos de depuração do Chrome OS que definirão sshd daemon e permitirão a inicialização a partir de drives USB.</translation>
 <translation id="2099686503067610784">Tem certeza que quer excluir o certificado do servidor "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -778,6 +782,7 @@
 <translation id="2155772377859296191">Resolução: <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156283799932971644">Você pode ajudar a melhorar o recurso "Navegação segura" enviando algumas informações do sistema e conteúdo da página para o Google.</translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2157474325782140681">Para ter outros recursos, use uma base de encaixe Dell compatível com este Chromebook.</translation>
 <translation id="215753907730220065">Sair do modo tela cheia</translation>
 <translation id="2157875535253991059">Esta página está no modo de tela inteira.</translation>
 <translation id="216169395504480358">Adicionar Wi-Fi...</translation>
@@ -795,6 +800,7 @@
 <translation id="2178098616815594724">O plug-in <ph name="PEPPER_PLUGIN_NAME" /> do domínio <ph name="PEPPER_PLUGIN_DOMAIN" /> quer acessar seu computador</translation>
 <translation id="2178614541317717477">Compromisso da autoridade de certificação</translation>
 <translation id="218070003709087997">Use um número para indicar o número de cópias a serem impressas (1 a 999).</translation>
+<translation id="2182058453334755893">Copiado para a área de transferência</translation>
 <translation id="2184515124301515068">Permitir que Chrome defina quando os sites podem reproduzir sons (recomendado)</translation>
 <translation id="2187895286714876935">Erro de importação do certificado de servidor</translation>
 <translation id="2187906491731510095">Extensões atualizadas</translation>
@@ -867,6 +873,7 @@
 <translation id="2270450558902169558">Trocar dados com qualquer dispositivo no domínio <ph name="DOMAIN" /></translation>
 <translation id="2270627217422354837">Trocar dados com qualquer dispositivo nos domínios: <ph name="DOMAINS" /></translation>
 <translation id="2272570998639520080">Copo de martini</translation>
+<translation id="2273119997271134996">Problema na da porta de vídeo da base</translation>
 <translation id="2276503375879033601">Adicionar mais aplicativos</translation>
 <translation id="2277255602909579701">Todos os dados de cookies e de sites</translation>
 <translation id="2277769717710009150">{COUNT,plural, =1{1 item copiado}one{# item copiado}other{# itens copiados}}</translation>
@@ -960,6 +967,7 @@
 <translation id="2423578206845792524">&amp;Salvar imagem como...</translation>
 <translation id="2428510569851653187">Descrever o que você estava fazendo quando a guia travou</translation>
 <translation id="2431027948063157455">Não foi possível carregar o Google Assistente. Verifique sua conexão de rede e tente novamente.</translation>
+<translation id="243242775089461296">O bloqueio de cookies de terceiros está desativado neste site</translation>
 <translation id="2432753757290432042">Atualização do Linux (Beta) obrigatória</translation>
 <translation id="2433452467737464329">Adicione um parâmetro de consulta ao URL para atualizar automaticamente a página: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">Aparência</translation>
@@ -1050,6 +1058,7 @@
 <translation id="2534460670861217804">Proxy HTTP seguro</translation>
 <translation id="253557089021624350">Contagem de manutenção de atividade</translation>
 <translation id="2535799430745250929">Não há nenhuma rede celular</translation>
+<translation id="2536052711541161459">Aceleração do ponteiro</translation>
 <translation id="2537395079978992874"><ph name="ORIGIN" /> tem permissão para ver e editar os arquivos e as pastas a seguir</translation>
 <translation id="2538361623464451692">Sincronização desativada</translation>
 <translation id="2540449034743108469">Pressione "Iniciar" para ouvir as atividades da extensão</translation>
@@ -1270,6 +1279,7 @@
 <translation id="2849936225196189499">Crítico</translation>
 <translation id="2850541429955027218">Adicionar tema</translation>
 <translation id="2851634818064021665">Você precisa de permissão para visitar este site</translation>
+<translation id="2854896010770911740">Remover cookies de terceiros</translation>
 <translation id="2858138569776157458">Sites famosos</translation>
 <translation id="2859806420264540918">Neste site, há exibição de anúncios invasivos ou enganosos</translation>
 <translation id="2861301611394761800">A atualização do sistema foi concluída. Reinicie o sistema.</translation>
@@ -1431,6 +1441,7 @@
 <translation id="310671807099593501">O site está usando o Bluetooth</translation>
 <translation id="3115147772012638511">Aguardando o cache...</translation>
 <translation id="3115580024857770654">Recolher tudo</translation>
+<translation id="3117362587799608430">A base não é totalmente compatível</translation>
 <translation id="3118319026408854581">Ajuda do <ph name="PRODUCT_NAME" /></translation>
 <translation id="3120430004221004537">Criptografia insuficiente para uma determinada operação em "<ph name="DEVICE_NAME" />".</translation>
 <translation id="3121793941267913344">Restaurar este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -1439,6 +1450,7 @@
 <translation id="3124111068741548686">Processamentos do USUÁRIO</translation>
 <translation id="3126026824346185272">Ctrl</translation>
 <translation id="3127156390846601284">Essa ação excluirá todos os dados armazenados no seu dispositivo para todos os sites exibidos. Quer continuar?</translation>
+<translation id="3127860049873093642">Para evitar problemas de carregamento e desempenho, use um adaptador de energia USB-C ou Dell compatível.</translation>
 <translation id="3129173833825111527">Margem esquerda</translation>
 <translation id="3130528281680948470">Seu dispositivo será redefinido, e todas as contas de usuário final e dados locais serão removidos. Esta ação não pode ser desfeita.</translation>
 <translation id="313205617302240621">Esqueceu a senha?</translation>
@@ -1537,6 +1549,7 @@
 <translation id="3281892622610078515">Arquivos e programas a serem colocados em quarentena:</translation>
 <translation id="3282568296779691940">Fazer login no Google Chrome</translation>
 <translation id="3285322247471302225">Nova &amp;guia</translation>
+<translation id="328571385944182268">Salvar senhas?</translation>
 <translation id="3286654161521615710">Usado pelo navegador Chrome e pelo acesso rápido do <ph name="DEVICE_TYPE" /></translation>
 <translation id="3286737518123001369">Ver e excluir os dados de login armazenados na sua chave de segurança</translation>
 <translation id="3288047731229977326">Extensões executadas no modo de desenvolvedor podem prejudicar o computador. Se você não for desenvolvedor, para sua segurança, desative essas extensões que estão sendo executadas no modo de desenvolvedor.</translation>
@@ -1657,6 +1670,7 @@
 <translation id="346431825526753">Esta é uma conta para as crianças gerenciada por <ph name="CUSTODIAN_EMAIL" />.</translation>
 <translation id="3468999815377931311">Smartphone Android</translation>
 <translation id="3470442499439619530">Remover este usuário</translation>
+<translation id="3471876058939596279">As portas HDMI and USB-C não podem ser usadas para vídeo ao mesmo tempo. Use uma porta de vídeo diferente.</translation>
 <translation id="3473479545200714844">Lupa</translation>
 <translation id="3475843873335999118">Sua impressão digital ainda não foi reconhecida. Digite sua senha.</translation>
 <translation id="3476303763173086583">Envie dados de uso e diagnóstico. Ajude a melhorar a experiência do seu filho com o Android enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles não serão usados para identificar seu filho e ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e os nossos parceiros, como os desenvolvedores Android. Essa <ph name="BEGIN_LINK1" />configuração<ph name="END_LINK1" /> é aplicada pelo proprietário, que pode optar por enviar dados de uso e diagnóstico deste dispositivo para o Google. Se a configuração "Atividade na Web e de apps adicional" estiver ativada para seu filho, esses dados poderão ser salvos na Conta do Google dele. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
@@ -1754,6 +1768,7 @@
 <translation id="3603622770190368340">Obter certificado de rede</translation>
 <translation id="3605780360466892872">Esporte fino</translation>
 <translation id="3608576286259426129">Visualização da imagem do usuário</translation>
+<translation id="3610369246614755442">A ventilação da base precisa de reparos</translation>
 <translation id="361106536627977100">Dados do Flash</translation>
 <translation id="3612673635130633812">Download feito por &lt;a href="<ph name="URL" />"&gt;<ph name="EXTENSION" />&lt;/a&gt;</translation>
 <translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME" /></translation>
@@ -1766,6 +1781,7 @@
 <translation id="3624567683873126087">Desbloquear dispositivo e fazer login na Conta do Google</translation>
 <translation id="3625258641415618104">Capturas de tela desativadas</translation>
 <translation id="3625481642044239431">Arquivo inválido selecionado. Tente novamente.</translation>
+<translation id="3626296069957678981">Para carregar este Chromebook, use uma bateria Dell compatível.</translation>
 <translation id="3627320433825461852">Menos de 1 minuto restante</translation>
 <translation id="3627588569887975815">Abrir link em janela &amp;anônima</translation>
 <translation id="3627671146180677314">Hora de renovação do certificado do Netscape</translation>
@@ -2217,6 +2233,7 @@
 <translation id="4267953847983678297">Conectar automaticamente à rede celular</translation>
 <translation id="4268025649754414643">Codificação de chaves</translation>
 <translation id="4270393598798225102">Versão <ph name="NUMBER" /></translation>
+<translation id="4270615291506829403">alterar sua senha</translation>
 <translation id="4275663329226226506">Mídia</translation>
 <translation id="4275830172053184480">Reiniciar seu dispositivo</translation>
 <translation id="4278101229438943600">O Assistente está pronto</translation>
@@ -2354,6 +2371,7 @@
 <translation id="451407183922382411">Tecnologia da <ph name="COMPANY_NAME" /></translation>
 <translation id="4514610446763173167">Alternar vídeo entre reproduzir e pausar</translation>
 <translation id="451515744433878153">Remover</translation>
+<translation id="4515872537870654449">Fale com a Dell para consertar. A base será desligada se a ventilação não estiver funcionando.</translation>
 <translation id="4519935350946509010">Erro de conexão.</translation>
 <translation id="4520385623207007473">Cookies em uso</translation>
 <translation id="452039078290142656">dispositivos desconhecidos do <ph name="VENDOR_NAME" /></translation>
@@ -2636,6 +2654,7 @@
 <translation id="4932733599132424254">Data</translation>
 <translation id="4933484234309072027">incorporado em <ph name="URL" /></translation>
 <translation id="493571969993549666">Adicionar usuário supervisionado</translation>
+<translation id="4939805055470675027">Não foi possível se conectar à <ph name="CARRIER_NAME" /></translation>
 <translation id="4941246025622441835">Usar essa requisição de dispositivo ao inscrever o dispositivo no gerenciamento corporativo:</translation>
 <translation id="4941627891654116707">Tamanho da fonte</translation>
 <translation id="494286511941020793">Ajuda da configuração de proxy</translation>
@@ -2660,6 +2679,7 @@
 <translation id="4973307593867026061">Adicionar impressoras</translation>
 <translation id="4973325300212422370">{NUM_TABS,plural, =1{Desativar som do site}one{Desativar som do site}other{Desativar som dos sites}}</translation>
 <translation id="4974733135013075877">Sair e bloquear</translation>
+<translation id="4976009197147810135">Divisão vertical</translation>
 <translation id="4976795213394241669">{0,plural, =0{Atualizar agora}=1{Atualizar em 1 segundo}one{Atualizar em # segundo}other{Atualizar em # segundos}}</translation>
 <translation id="4977942889532008999">Confirmar acesso</translation>
 <translation id="4980805016576257426">Esta extensão contém malware.</translation>
@@ -2769,7 +2789,9 @@
 <translation id="5142961317498132443">Autenticação</translation>
 <translation id="5143374789336132547">A extensão "<ph name="EXTENSION_NAME" />" alterou a página que é exibida quando você clica no botão "Página inicial".</translation>
 <translation id="5143712164865402236">Tela cheia</translation>
+<translation id="5145461783043820456">O bloqueio de cookies de terceiros está ativado</translation>
 <translation id="514575469079499857">Usar seu endereço IP para determinar o local (padrão)</translation>
+<translation id="5146995429444047494">As notificações de <ph name="ORIGIN" /> estão bloqueadas</translation>
 <translation id="5150254825601720210">Nome do servidor SSL do certificado do Netscape</translation>
 <translation id="5151354047782775295">Libere espaço em disco, ou dados específicos podem ser excluídos automaticamente</translation>
 <translation id="5153234146675181447">Esquecer o smartphone</translation>
@@ -3034,9 +3056,11 @@
 <translation id="5541694225089836610">Ação desativada pelo administrador</translation>
 <translation id="5542132724887566711">Perfil</translation>
 <translation id="5542750926112347543">Os cookies de <ph name="DOMAIN" /> foram bloqueados</translation>
+<translation id="5542949973455282971">Conectando-se à <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Verificando status...</translation>
 <translation id="554517032089923082">GTC</translation>
 <translation id="5546865291508181392">Buscar</translation>
+<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" e mais 1 guia}one{"<ph name="TAB_TITLE" />" e mais # guia}other{"<ph name="TAB_TITLE" />" e mais # guias}}</translation>
 <translation id="5551573675707792127">Teclado e entrada de texto</translation>
 <translation id="5553089923092577885">Mapeamentos da diretiva de certificação</translation>
 <translation id="5554489410841842733">Este ícone ficará visível quando a extensão puder agir na página atual.</translation>
@@ -3608,6 +3632,7 @@
 <translation id="6384275966486438344">Alterar suas configurações de pesquisa para: <ph name="SEARCH_HOST" /></translation>
 <translation id="6385543213911723544">Os sites podem salvar e ler os dados dos cookies</translation>
 <translation id="6386099547750337629">Se isso for inesperado, entre em contato com o suporte.</translation>
+<translation id="6387674443318562538">Divisão vertical</translation>
 <translation id="6388429472088318283">Idiomas de pesquisa</translation>
 <translation id="6390799748543157332">As páginas que você visualiza nesta janela não aparecem no histórico do navegador e não deixam outros rastros, como cookies, no computador depois que todas as janelas abertas no modo de visitante são fechadas. No entanto, todos os arquivos baixados serão preservados.</translation>
 <translation id="6390994422085833176">Revise os recursos de sincronização e personalização após a configuração</translation>
@@ -3641,6 +3666,7 @@
 <translation id="6419546358665792306">Carregar sem compactação</translation>
 <translation id="642469772702851743">Este dispositivo (SN: <ph name="SERIAL_NUMBER" />) foi bloqueado pelo proprietário.</translation>
 <translation id="6426200009596957090">Abrir as configurações do ChromeVox</translation>
+<translation id="6428450836711225518">Verificar seu número de telefone</translation>
 <translation id="6429384232893414837">Erro de atualização</translation>
 <translation id="6430814529589430811">ASCII codificado na Base64, certificado único</translation>
 <translation id="6431347207794742960">O <ph name="PRODUCT_NAME" /> irá configurar as atualizações automáticas para todos os usuários deste computador.</translation>
@@ -3863,6 +3889,7 @@
 <translation id="6786747875388722282">Extensões</translation>
 <translation id="6787839852456839824">Atalhos do teclado</translation>
 <translation id="6788210894632713004">Extensão descompactada</translation>
+<translation id="6789592661892473991">Divisão horizontal</translation>
 <translation id="6790428901817661496">Reproduzir</translation>
 <translation id="6790497603648687708">A extensão <ph name="EXTENSION_NAME" /> foi adicionada remotamente</translation>
 <translation id="6790820461102226165">Adicionar pessoa...</translation>
@@ -4244,6 +4271,7 @@
 <translation id="7334190995941642545">O Smart Lock está indisponível no momento. Tente novamente mais tarde.</translation>
 <translation id="7334274148831027933">Ativar lupa ancorada</translation>
 <translation id="7335974957018254119">Usar verificação ortográfica para</translation>
+<translation id="7336799713063880535">Notificações bloq.</translation>
 <translation id="7338630283264858612">O número de série do dispositivo é inválido.</translation>
 <translation id="7339763383339757376">PKCS #7, certificado único</translation>
 <translation id="7339785458027436441">Verificar ortografia ao digitar</translation>
@@ -4356,6 +4384,7 @@
 <translation id="7506541170099744506">Seu <ph name="DEVICE_TYPE" /> foi inscrito para o gerenciamento empresarial.</translation>
 <translation id="7507930499305566459">Certificado do respondente de status</translation>
 <translation id="7508054832109420082">Conceder acesso a impressoras</translation>
+<translation id="7510943789645525906">Avisa se uma senha que você usa for parte de uma violação de dados</translation>
 <translation id="7513029293694390567">Faça login automaticamente nos sites que usam credenciais armazenadas. Quando o recurso estiver desativado, será necessário fornecer uma confirmação todas as vezes que fizer login em um site.</translation>
 <translation id="7514365320538308">Fazer o download</translation>
 <translation id="7521387064766892559">JavaScript</translation>
@@ -4421,6 +4450,7 @@
 <translation id="7625568159987162309">Ver permissões e dados armazenados em sites</translation>
 <translation id="7629827748548208700">Guia: <ph name="TAB_NAME" /></translation>
 <translation id="7631014249255418691">O backup dos apps e arquivos do Linux foi concluído</translation>
+<translation id="7631205654593498032">Ao conectar os dispositivos, você concorda que seu <ph name="DEVICE_TYPE" /> pode:</translation>
 <translation id="7631887513477658702">&amp;Sempre abrir arquivos deste tipo</translation>
 <translation id="7632948528260659758">Os seguintes aplicativos de quiosque tiveram falha na atualização:</translation>
 <translation id="763632859238619983">Não permitir que nenhum site instale gerenciadores de pagamento</translation>
@@ -4583,6 +4613,7 @@
     <ph name="BR" />
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Observação:<ph name="END_BOLD" /> o sistema será reinicializado durante o processo.</translation>
+<translation id="7828731929332799387">Essa ação excluirá todos os cookies e dados de sites disponíveis em contextos de terceiros. Quer continuar?</translation>
 <translation id="7829298379596169484">Acessando entrada de áudio</translation>
 <translation id="7830594666202422257">Conectar ao Linux</translation>
 <translation id="7831491651892296503">Erro ao configurar a rede</translation>
@@ -4787,6 +4818,7 @@
 <translation id="810875025413331850">Nenhum dispositivo próximo encontrado.</translation>
 <translation id="8111155949205007504">Compartilhar essa senha com seu iPhone</translation>
 <translation id="8113043281354018522">Escolha o tipo de licença</translation>
+<translation id="8114875720387900039">Divisão horizontal</translation>
 <translation id="8116972784401310538">&amp;Gerenciador de favoritos</translation>
 <translation id="8117620576188476503">Gerencie conexões, atualizações e configurações com a bandeja de status. Para chegar aqui com o teclado, pressione Alt + Shift + S.</translation>
 <translation id="8118076340394175570">Sua organização requer que este dispositivo seja atualizado</translation>
@@ -4978,6 +5010,7 @@
 <translation id="839736845446313156">Inscrição</translation>
 <translation id="8398877366907290961">Continuar mesmo assim</translation>
 <translation id="8400146488506985033">Gerenciar pessoas</translation>
+<translation id="8401432541486058167">Insira o PIN associado ao seu cartão inteligente.</translation>
 <translation id="8405046151008197676">Veja os destaques da atualização mais recente</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">Perguntar primeiro (recomendado)</translation>
@@ -5203,10 +5236,12 @@
 <translation id="8732212173949624846">Ler e modificar seu histórico de navegação em todos os dispositivos nos quais você fez login</translation>
 <translation id="8732844209475700754">Mais configurações relacionadas à privacidade, segurança e coleta de dados</translation>
 <translation id="8734073480934656039">A ativação dessa configuração permite que os aplicativos de quiosque sejam iniciados automaticamente na inicialização.</translation>
+<translation id="8734674662128056360">Bloqueio de cookies de terceiros</translation>
 <translation id="873545264931343897">Quando a atualização do plug-in <ph name="PLUGIN_NAME" /> terminar, atualize a página para ativá-lo</translation>
 <translation id="8736288397686080465">Este site foi atualizado em segundo plano.</translation>
 <translation id="8737685506611670901">Abrir links de <ph name="PROTOCOL" /> em vez de <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8737709691285775803">Shill</translation>
+<translation id="8742371904523228557"><ph name="ONE_TIME_CODE" /> é seu código para <ph name="ORIGIN" /></translation>
 <translation id="8743390665131937741">Nível de zoom em tela cheia:</translation>
 <translation id="8743864605301774756">Atualizada 1 hora atrás</translation>
 <translation id="874689135111202667">{0,plural, =1{Fazer upload de um arquivo para este site?}one{Fazer upload de # arquivo para este site?}other{Fazer upload de # arquivos para este site?}}</translation>
@@ -5279,6 +5314,7 @@
 <translation id="8828933418460119530">Nome DNS</translation>
 <translation id="883062543841130884">Substituições</translation>
 <translation id="8830796635868321089">A verificação de atualização não pode usar as configurações de proxy atuais. Ajuste suas <ph name="PROXY_SETTINGS_LINK_START" />configurações de proxy<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
+<translation id="8831140208248705279">Seu <ph name="DEVICE_TYPE" /> e smartphone Android funcionam melhor juntos. Conecte-os para enviar mensagens de texto do computador, compartilhar sua conexão de Internet e desbloquear o <ph name="DEVICE_TYPE" /> com o smartphone.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="8831664945713891930">Abrir configurações de extensões</translation>
 <translation id="8834039744648160717">A configuração de rede é controlada por <ph name="USER_EMAIL" />.</translation>
 <translation id="8838770651474809439">Hambúrger</translation>
@@ -5310,6 +5346,7 @@
 <translation id="8877448029301136595">[diretório pai]</translation>
 <translation id="8879284080359814990">&amp;Mostrar como guia</translation>
 <translation id="8879921471468674457">Lembrar informações de login</translation>
+<translation id="8881020143150461183">Tente novamente. Se precisar de suporte técnico, fale com a <ph name="CARRIER_NAME" />.</translation>
 <translation id="8884570509232205463">Seu dispositivo será bloqueado neste horário: <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">O Smart Lock não está disponível</translation>
 <translation id="8888253246822647887">O app será aberto após a conclusão do upgrade. Os upgrades podem levar alguns minutos.</translation>
@@ -5360,6 +5397,7 @@
 <translation id="894871326938397531">Sair do modo de navegação anônima?</translation>
 <translation id="8948939328578167195"><ph name="WEBSITE" /> quer ver a marca e o modelo da sua chave de segurança</translation>
 <translation id="8951256747718668828">Ocorreu um erro e não foi possível concluir a restauração</translation>
+<translation id="8951465597020890363">Sair do modo visitante mesmo assim?</translation>
 <translation id="8952831374766033534">Opção de configuração indisponível: <ph name="ERROR_LINE" /></translation>
 <translation id="895347679606913382">Iniciando...</translation>
 <translation id="8956941634583033512">{0,plural, =1{Atualizar em 1 dia}one{Atualizar em # dia}other{Atualizar em # dias}}</translation>
@@ -5375,6 +5413,7 @@
 <translation id="8973596347849323817">É possível personalizar este dispositivo para atender às suas necessidades. Esses recursos de acessibilidade podem ser alterados posteriormente em "Config.".</translation>
 <translation id="897414447285476047">O arquivo de destino estava incompleto devido a um problema de conexão.</translation>
 <translation id="897525204902889653">Serviço de quarentena</translation>
+<translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" e mais 1 guia}one{"<ph name="TAB_TITLE" />" e mais # guia}other{"<ph name="TAB_TITLE" />" e mais # guias}}</translation>
 <translation id="8976520271376534479">O Flash foi bloqueado nesta página.</translation>
 <translation id="8977811652087512276">Senha incorreta ou arquivo corrompido</translation>
 <translation id="8978154919215542464">Ativado - sincronizar tudo</translation>
@@ -5464,6 +5503,7 @@
 <translation id="9103868373786083162">Pressione para voltar ao menu de contexto e ver o histórico</translation>
 <translation id="9104396740804929809">Envie dados de uso e diagnóstico. Ajude a melhorar sua experiência com o Android enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e os nossos parceiros, como os desenvolvedores Android. Essa configuração é aplicada pelo proprietário, que pode optar por enviar dados de uso e diagnóstico deste dispositivo para o Google. Se a configuração "Atividade na Web e de apps adicional" estiver ativada, esses dados poderão ser salvos na sua Conta do Google. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation>
 <translation id="9109122242323516435">Para liberar espaço, exclua arquivos do armazenamento do dispositivo.</translation>
+<translation id="9109283579179481106">Conectar à rede móvel</translation>
 <translation id="9111102763498581341">Desbloquear</translation>
 <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation>
 <translation id="9112748030372401671">Altere seu papel de parede</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index dcaa1430..5f790822 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Abrir Link Numa Nova &amp;Janela</translation>
 <translation id="1773212559869067373">Certificado de autenticação rejeitado localmente</translation>
 <translation id="177336675152937177">Dados de aplicações alojadas</translation>
+<translation id="1776712937009046120">Adicionar utilizador</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Introduza esta chave de acesso no "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN atual</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index be60efd1..3cbdea7a 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Deschide linkul într-o &amp;fereastră nouă</translation>
 <translation id="1773212559869067373">Certificatul de autentificare a fost respins local</translation>
 <translation id="177336675152937177">Datele aplicațiilor găzduite</translation>
+<translation id="1776712937009046120">Adaugă un utilizator</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Introduceți această cheie de acces pe „<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Codul PIN actual</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 9c8026e8..7375b6a3 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -529,6 +529,7 @@
 <translation id="1769104665586091481">Открыть ссылку в новом окне</translation>
 <translation id="1773212559869067373">Сертификат аутентификации отклонен локально</translation>
 <translation id="177336675152937177">Данные размещаемых приложений</translation>
+<translation id="1776712937009046120">Добавить пользователя</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Введите данный ключ доступа в "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Текущий PIN-код</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index aa9e8be..1a2869dc 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Otvoriť odkaz v novom &amp;okne</translation>
 <translation id="1773212559869067373">Certifikát na overenie totožnosti bol zamietnutý miestne</translation>
 <translation id="177336675152937177">Dáta hostených aplikácií</translation>
+<translation id="1776712937009046120">Pridať používateľa</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Zadajte tento prístupový kľúč v zariadení <ph name="DEVICE_NAME" />:</translation>
 <translation id="1781291988450150470">Aktuálny kód PIN</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index f889dd7c..b53dc931 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Odpri povezavo v novem &amp;oknu</translation>
 <translation id="1773212559869067373">Potrdilo za preverjanje pristnosti je bilo zavrnjeno lokalno</translation>
 <translation id="177336675152937177">Podatki gostujočih aplikacij</translation>
+<translation id="1776712937009046120">Dodaj uporabnika</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Geslo vnesite v napravi »<ph name="DEVICE_NAME" />«:</translation>
 <translation id="1781291988450150470">Trenutna koda PIN</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index b887a43..c96a8f3 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">Отвори линк у новом &amp;прозору</translation>
 <translation id="1773212559869067373">Сертификат за потврду аутентичности је одбијен локално</translation>
 <translation id="177336675152937177">Подаци хостованих апликација</translation>
+<translation id="1776712937009046120">Додај корисника</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Унесите овај приступни кôд на уређају „<ph name="DEVICE_NAME" />“:</translation>
 <translation id="1781291988450150470">Актуелни PIN</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index afff8c2..0e6cedc1 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Öppna länk i nytt f&amp;önster</translation>
 <translation id="1773212559869067373">Autentiseringscertifikatet godkändes inte lokalt</translation>
 <translation id="177336675152937177">Appdata som har en värd</translation>
+<translation id="1776712937009046120">Lägg till användare</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Ange denna nyckel på <ph name="DEVICE_NAME" />:</translation>
 <translation id="1781291988450150470">Aktuell pinkod</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 3fb6d1c..ff7b817 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -8,7 +8,7 @@
 <translation id="1006873397406093306">Kiendelezi hiki kinaweza kusoma na kubadilisha data yako kwenye tovuti. Unaweza kudhibiti tovuti ambazo kiendelezi kinaweza kufikia.</translation>
 <translation id="1007408791287232274">Haikuweza kupakia vifaa.</translation>
 <translation id="1008186147501209563">Hamisha alamisho</translation>
-<translation id="1008557486741366299">Sio Sasa</translation>
+<translation id="1008557486741366299">Si Sasa</translation>
 <translation id="1010498023906173788">Kichupo hiki kimeunganishwa kwenye mlango wa kuingiza vifaa.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Ukurasa Umekwama}other{Kurasa Zimekwama}}</translation>
 <translation id="1012794136286421601">Faili zako za Hati, Majedwali, Slaidi, na Michoro zinasawazishwa. Fungua programu ya Hifadhi ya Google ili uzifikie mtandaoni ama nje ya mtandao.</translation>
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">Fungua Kiungo katika &amp;Dirisha Jipya</translation>
 <translation id="1773212559869067373">Cheti cha uthibitishaji kimekataliwa kindani</translation>
 <translation id="177336675152937177">Data ya programu iliyopangishwa</translation>
+<translation id="1776712937009046120">Ongeza mtumiaji</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Tafadhali weka nenosiri hili kwenye "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN ya sasa</translation>
@@ -1661,7 +1662,7 @@
 <translation id="347785443197175480">Endelea kuruhusu <ph name="HOST" /> kufikia kamera na maikrofoni yako</translation>
 <translation id="3478685642445675458">Tafadhali fungua wasifu wako kabla ya kumwondoa mtumiaji.</translation>
 <translation id="3479539252931486093">Je, hukutarajia tukio hili? <ph name="BEGIN_LINK" />Tujulishe<ph name="END_LINK" /></translation>
-<translation id="3479552764303398839">Sio sasa</translation>
+<translation id="3479552764303398839">Si sasa</translation>
 <translation id="3481268647794498892">Inafungua katika <ph name="ALTERNATIVE_BROWSER_NAME" /> baada ya sekunde <ph name="COUNTDOWN_SECONDS" /></translation>
 <translation id="3484273680291419129">Inaondoa programu hatari...</translation>
 <translation id="3484869148456018791">Pata cheti kipya</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index aaf9bdca..790746e 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">இணைப்பை புதிய &amp;சாளரத்தில் திற</translation>
 <translation id="1773212559869067373">அடையாளச் சான்றிதழ் பயனரின் கம்ப்யூட்டரில் நிராகரிக்கப்பட்டது</translation>
 <translation id="177336675152937177">ஹோஸ்ட் செய்யப்பட்ட ஆப்ஸின் தரவு</translation>
+<translation id="1776712937009046120">பயனரைச் சேர்</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">"<ph name="DEVICE_NAME" />" இல் இந்தக் கடவுவிசையை உள்ளிடுக:</translation>
 <translation id="1781291988450150470">தற்போதைய பின்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 0f4d0a7f..bda659e 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">లింక్‌ను కొత్త &amp;విండోలో తెరువు</translation>
 <translation id="1773212559869067373">ప్రామాణీకరణ ప్రమాణపత్రం స్థానికంగా తిరస్కరించబడింది</translation>
 <translation id="177336675152937177">హోస్ట్ చేసిన యాప్‌ డేటా</translation>
+<translation id="1776712937009046120">వినియోగదారును జోడించు</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">దయచేసి "<ph name="DEVICE_NAME" />"లో ఈ పాస్‌కీని నమోదు చేయండి:</translation>
 <translation id="1781291988450150470">ప్రస్తుత పిన్‌</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 2c22402..2451e1e 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">เปิดลิงก์ใน&amp;หน้าต่างใหม่</translation>
 <translation id="1773212559869067373">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธในท้องถิ่น</translation>
 <translation id="177336675152937177">ข้อมูลแอปที่โฮสต์</translation>
+<translation id="1776712937009046120">เพิ่มผู้ใช้</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">โปรดป้อนรหัสผ่านนี้บน "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">PIN ปัจจุบัน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index ed901a8..6a53a2b 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Bağlantıyı Yeni &amp;Pencerede Aç</translation>
 <translation id="1773212559869067373">Kimlik doğrulama sertifikası yerel olarak reddedildi</translation>
 <translation id="177336675152937177">Barındırılan uygulama verileri</translation>
+<translation id="1776712937009046120">Kullanıcı ekle</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Lütfen bu parolayı "<ph name="DEVICE_NAME" />" cihazında girin:</translation>
 <translation id="1781291988450150470">Mevcut PIN</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index fdca94e..1425a4f3 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Відкрити посилання в новому &amp;вікні</translation>
 <translation id="1773212559869067373">Сертифікат автентифікації відхилений локально</translation>
 <translation id="177336675152937177">Дані розміщених програм</translation>
+<translation id="1776712937009046120">Додати користувача</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Введіть цей ключ на пристрої "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Поточний PIN-код</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index fd293a2..8c0d4da 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">Mở Liên kết bằng Cửa sổ &amp;Mới</translation>
 <translation id="1773212559869067373">Chứng chỉ xác thực bị từ chối cục bộ</translation>
 <translation id="177336675152937177">Dữ liệu ứng dụng lưu trữ trên máy chủ</translation>
+<translation id="1776712937009046120">Thêm người dùng</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">Vui lòng nhập mã xác nhận này trên "<ph name="DEVICE_NAME" />":</translation>
 <translation id="1781291988450150470">Mã PIN hiện tại</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 53cbcf2..b62f78ed 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -527,6 +527,7 @@
 <translation id="1769104665586091481">在新窗口中打开链接(&amp;W)</translation>
 <translation id="1773212559869067373">身份验证证书遭到本地拒绝</translation>
 <translation id="177336675152937177">托管应用数据</translation>
+<translation id="1776712937009046120">添加用户</translation>
 <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation>
 <translation id="1779652936965200207">请在“<ph name="DEVICE_NAME" />”上输入此匹配密钥:</translation>
 <translation id="1781291988450150470">当前 PIN 码</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 7edc983..79289cd0 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -530,6 +530,7 @@
 <translation id="1769104665586091481">在新視窗中開啟連結(&amp;W)</translation>
 <translation id="1773212559869067373">本機已拒絕驗證憑證</translation>
 <translation id="177336675152937177">代管應用程式資料</translation>
+<translation id="1776712937009046120">新增使用者</translation>
 <translation id="1776883657531386793"><ph name="OID" />:<ph name="INFO" /></translation>
 <translation id="1779652936965200207">請在「<ph name="DEVICE_NAME" />」上輸入以下密碼金鑰:</translation>
 <translation id="1781291988450150470">目前的 PIN 碼</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 63338033..d9dc2d0 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -121,7 +121,7 @@
 <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> s'ha afegit a Chrome</translation>
-<translation id="4407807842708586359">SO de Google Chrome</translation>
+<translation id="4407807842708586359">Google Chrome OS</translation>
 <translation id="4458462641685292929">Hi ha una altra operació en curs a Google Chrome. Torna-ho a provar més tard.</translation>
 <translation id="4480040274068703980">Chrome OS no ha pogut sincronitzar les vostres dades a causa d'un error en iniciar la sessió.</translation>
 <translation id="4561051373932531560">Google Chrome us permet fer clic en un número de telèfon al web i trucar-hi amb Skype!</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index d8f60148..7068b31 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -47,6 +47,8 @@
 <translation id="1873233029667955273">Google Chrome isn't your default browser</translation>
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome is out of date</translation>
+<translation id="1900795423379050516">If a setting doesn't show on this page, look in your <ph name="LINK_BEGIN" />
+      Chrome browser settings<ph name="LINK_END" /></translation>
 <translation id="1915828456209461693">A new update for Chrome is available and will be applied as soon as you relaunch.</translation>
 <translation id="1919130412786645364">Allow Chrome sign-in</translation>
 <translation id="2063848847527508675">Chrome OS needs to be restarted to apply the update.</translation>
@@ -164,6 +166,8 @@
 <translation id="5543953544073077331">Other copies of Chrome are running. To update, close them.</translation>
 <translation id="556024056938947818">Google Chrome is trying to show passwords.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
+<translation id="5657226924540934362">If a setting doesn't show on this page, look in your <ph name="LINK_BEGIN" />
+      Chrome OS settings<ph name="LINK_END" /></translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> may be dangerous, so Chrome has blocked it.</translation>
 <translation id="5686916850681061684">Customise and control Google Chrome. Something needs your attention – click for details.</translation>
 <translation id="5690427481109656848">Google LLC</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index b466a46..c47b260 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -43,6 +43,7 @@
 <translation id="1873233029667955273">O Google Chrome não é seu navegador padrão</translation>
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">O Google Chrome está desatualizado</translation>
+<translation id="1900795423379050516">Se uma configuração não for exibida nesta página, verifique as <ph name="LINK_BEGIN" />configurações do navegador Chrome<ph name="LINK_END" /></translation>
 <translation id="1915828456209461693">Uma nova atualização está disponível para o Chrome e será aplicada assim que você reiniciá-lo.</translation>
 <translation id="1919130412786645364">Permitir login no Chrome</translation>
 <translation id="2063848847527508675">É necessário reiniciar o Chrome OS para aplicar a atualização.</translation>
@@ -156,6 +157,7 @@
 <translation id="5543953544073077331">Outras cópias do Chrome estão em execução. Para atualizar, feche-as.</translation>
 <translation id="556024056938947818">O Google Chrome está tentando mostrar senhas.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
+<translation id="5657226924540934362">Se uma configuração não for exibida nesta página, verifique as <ph name="LINK_BEGIN" />configurações do Chrome OS<ph name="LINK_END" /></translation>
 <translation id="565744775970812598">O arquivo <ph name="FILE_NAME" /> pode ser perigoso. Por isso, ele foi bloqueado pelo Chrome.</translation>
 <translation id="5686916850681061684">Personalize e controle o Google Chrome. Algo precisa da sua atenção. Clique para ver mais detalhes.</translation>
 <translation id="5690427481109656848">Google LLC</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 4173ed31..12cebd6c 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1136,8 +1136,6 @@
     "performance_manager/observers/metrics_collector.h",
     "performance_manager/performance_manager.cc",
     "performance_manager/performance_manager.h",
-    "performance_manager/performance_manager_clock.cc",
-    "performance_manager/performance_manager_clock.h",
     "performance_manager/performance_manager_tab_helper.cc",
     "performance_manager/performance_manager_tab_helper.h",
     "performance_manager/persistence/site_data/exponential_moving_average.cc",
@@ -5379,6 +5377,7 @@
   if (is_chromeos) {
     deps += [
       "//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings_js",
+      "//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js",
       "//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings_js",
     ]
   }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index ce88925..05afeb7b 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3493,9 +3493,6 @@
     {"enable-arc-cups-api", flag_descriptions::kArcCupsApiName,
      flag_descriptions::kArcCupsApiDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(features::kArcCupsApi)},
-    {"enable-cros-vm-cups-proxy", flag_descriptions::kCrosVmCupsProxyName,
-     flag_descriptions::kCrosVmCupsProxyDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(features::kCrosVmCupsProxy)},
 #endif  // OS_CHROMEOS
 
 #if defined(OS_CHROMEOS)
@@ -3757,10 +3754,6 @@
      flag_descriptions::kEnableFilesystemInIncognitoDescription, kOsAll,
      FEATURE_VALUE_TYPE(storage::features::kEnableFilesystemInIncognito)},
 
-    {"enable-send-tab-to-self", flag_descriptions::kSendTabToSelfName,
-     flag_descriptions::kSendTabToSelfDescription, kOsAll,
-     FEATURE_VALUE_TYPE(switches::kSyncSendTabToSelf)},
-
     {"enable-send-tab-to-self-show-sending-ui",
      flag_descriptions::kSendTabToSelfShowSendingUIName,
      flag_descriptions::kSendTabToSelfShowSendingUIDescription, kOsAll,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 4a1f8193..e90e299 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -225,7 +225,6 @@
     &safe_browsing::kSendOnFocusPing,
     &signin::kMiceFeature,
     &switches::kSyncManualStartAndroid,
-    &switches::kSyncSendTabToSelf,
     &unified_consent::kUnifiedConsent,
     &subresource_filter::kSafeBrowsingSubresourceFilter,
 };
diff --git a/chrome/browser/android/webapps/webapk_ukm_recorder.cc b/chrome/browser/android/webapps/webapk_ukm_recorder.cc
index e863297a..3daab3c 100644
--- a/chrome/browser/android/webapps/webapk_ukm_recorder.cc
+++ b/chrome/browser/android/webapps/webapk_ukm_recorder.cc
@@ -15,6 +15,18 @@
 
 using base::android::JavaParamRef;
 
+namespace {
+
+// Converts Java string to GURL. Returns an empty GURL if the Java string is
+// null.
+GURL ConvertNullableJavaStringToGURL(JNIEnv* env,
+                                     const JavaParamRef<jstring>& java_url) {
+  return java_url ? GURL(base::android::ConvertJavaStringToUTF8(env, java_url))
+                  : GURL();
+}
+
+}  // namespace
+
 // static
 void WebApkUkmRecorder::RecordInstall(const GURL& manifest_url,
                                       int version_code) {
@@ -52,6 +64,25 @@
       .Record(ukm_recorder);
 }
 
+// static
+void WebApkUkmRecorder::RecordVisit(const GURL& manifest_url,
+                                    int64_t distributor,
+                                    int64_t version_code,
+                                    int source) {
+  if (!manifest_url.is_valid())
+    return;
+
+  ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
+  ukm::UkmRecorder* ukm_recorder = ukm::UkmRecorder::Get();
+  ukm_recorder->UpdateSourceURL(source_id, manifest_url);
+  ukm::builders::WebAPK_Visit(source_id)
+      .SetDistributor(distributor)
+      .SetAppVersion(version_code)
+      .SetLaunchSource(source)
+      .SetLaunch(true)
+      .Record(ukm_recorder);
+}
+
 // Called by the Java counterpart to record the Session Duration UKM metric.
 void JNI_WebApkUkmRecorder_RecordSessionDuration(
     JNIEnv* env,
@@ -59,10 +90,19 @@
     jint distributor,
     jint version_code,
     jlong duration) {
-  if (!manifest_url)
-    return;
-
   WebApkUkmRecorder::RecordSessionDuration(
-      GURL(base::android::ConvertJavaStringToUTF8(env, manifest_url)),
-      distributor, version_code, duration);
+      ConvertNullableJavaStringToGURL(env, manifest_url), distributor,
+      version_code, duration);
+}
+
+// Called by the Java counterpart to record the Visit UKM metric.
+void JNI_WebApkUkmRecorder_RecordVisit(
+    JNIEnv* env,
+    const JavaParamRef<jstring>& manifest_url,
+    jint distributor,
+    jint version_code,
+    jint source) {
+  WebApkUkmRecorder::RecordVisit(
+      ConvertNullableJavaStringToGURL(env, manifest_url), distributor,
+      version_code, source);
 }
diff --git a/chrome/browser/android/webapps/webapk_ukm_recorder.h b/chrome/browser/android/webapps/webapk_ukm_recorder.h
index e6f4f920..d8c02537 100644
--- a/chrome/browser/android/webapps/webapk_ukm_recorder.h
+++ b/chrome/browser/android/webapps/webapk_ukm_recorder.h
@@ -26,6 +26,11 @@
                                     int64_t version_code,
                                     int64_t duration);
 
+  static void RecordVisit(const GURL& manifest_url,
+                          int64_t distributor,
+                          int64_t version_code,
+                          int source);
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(WebApkUkmRecorder);
 };
diff --git a/chrome/browser/apps/app_service/arc_apps.cc b/chrome/browser/apps/app_service/arc_apps.cc
index 9029f1f..a32a951 100644
--- a/chrome/browser/apps/app_service/arc_apps.cc
+++ b/chrome/browser/apps/app_service/arc_apps.cc
@@ -293,7 +293,7 @@
   if (!profile_) {
     return;
   }
-  arc::ShowArcAppUninstallDialog(profile_, app_id);
+  arc::ShowArcAppUninstallDialog(profile_, nullptr /* controller */, app_id);
 }
 
 void ArcApps::OpenNativeSettings(const std::string& app_id) {
diff --git a/chrome/browser/autofill/autofill_gstatic_reader_unittest.cc b/chrome/browser/autofill/autofill_gstatic_reader_unittest.cc
index 61515ef..c7d1db4 100644
--- a/chrome/browser/autofill/autofill_gstatic_reader_unittest.cc
+++ b/chrome/browser/autofill/autofill_gstatic_reader_unittest.cc
@@ -19,7 +19,7 @@
   AutofillGstaticReaderTest() {}
 
  private:
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   network::TestURLLoaderFactory test_url_loader_factory_;
 };
 
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 164275f..642eb604 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -399,6 +399,13 @@
         <include name="IDR_URGENT_PASSWORD_EXPIRY_NOTIFICATION_JS" file="resources\chromeos\password_change\urgent_password_expiry_notification.js" type="chrome_html" />
 
         <include name="IDR_CROSH_BUILTIN_MANIFEST" file="resources\chromeos\crosh_builtin\manifest.json" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_INDEX_HTML" file="resources\chromeos\crostini_installer\index.html" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_APP_HTML" file="resources\chromeos\crostini_installer\app.html" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_APP_JS" file="resources\chromeos\crostini_installer\app.js" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_BROWSER_PROXY_HTML" file="resources\chromeos\crostini_installer\browser_proxy.html" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_BROWSER_PROXY_JS" file="resources\chromeos\crostini_installer\browser_proxy.js" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_MOJO_HTML" file="${root_gen_dir}\chrome\browser\ui\webui\chromeos\crostini_installer\crostini_installer.mojom.html" use_base_dir="false" type="BINDATA" />
+        <include name="IDR_CROSTINI_INSTALLER_MOJO_LITE_JS" file="${root_gen_dir}\chrome\browser\ui\webui\chromeos\crostini_installer\crostini_installer.mojom-lite.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_CRYPTOHOME_HTML" file="resources\chromeos\cryptohome.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_CRYPTOHOME_JS" file="resources\chromeos\cryptohome.js" type="BINDATA" />
         <!-- manifest file of Connectivity Diagnostics app -->
diff --git a/chrome/browser/browser_switcher/bho/mini_bho.cc b/chrome/browser/browser_switcher/bho/mini_bho.cc
index 54a6d31..824f635 100644
--- a/chrome/browser/browser_switcher/bho/mini_bho.cc
+++ b/chrome/browser/browser_switcher/bho/mini_bho.cc
@@ -351,7 +351,7 @@
   }
 
   // Like GetNextLine(char*), but gets the next line instead of the first one.
-  char* GetNextLine() { return GetNextLine(nullptr); }
+  char* GetNextLine() { return GetFirstLine(nullptr); }
 
   // Read a line that contains a number, and then read that number of lines into
   // a vector (one element for each line).
diff --git a/chrome/browser/browser_switcher/bho/mini_bho_util.h b/chrome/browser/browser_switcher/bho/mini_bho_util.h
index d9ecc0a..b810100 100644
--- a/chrome/browser/browser_switcher/bho/mini_bho_util.h
+++ b/chrome/browser/browser_switcher/bho/mini_bho_util.h
@@ -18,7 +18,7 @@
 // ones in libc (mostly from string.h).
 namespace util {
 
-constexpr LogLevel kLogLevel = DEBUG;
+constexpr LogLevel kLogLevel = INFO;
 
 extern const char* kLogPrefixes[];
 
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index 35af3c3..6fd4bf1 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -1130,7 +1130,7 @@
 
     auto network_context = std::make_unique<network::NetworkContext>(
         network::NetworkService::GetNetworkServiceForTesting(),
-        mojo::MakeRequest(&network_context_ptr_),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         network::mojom::NetworkContextParams::New());
     network_context_ = network_context.get();
     profile_->SetNetworkContext(std::move(network_context));
@@ -1233,7 +1233,7 @@
   content::BrowsingDataRemover* remover_;
 
   content::BrowserTaskEnvironment task_environment_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   network::NetworkContext* network_context_;
   std::unique_ptr<TestingProfile> profile_;
 
diff --git a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc
index b3958625..7796381 100644
--- a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc
+++ b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc
@@ -366,8 +366,8 @@
   }
 
   // Range info.
-  AXRangeInfoData* range_info = node_ptr_->range_info.get();
-  if (range_info) {
+  if (node_ptr_->range_info) {
+    AXRangeInfoData* range_info = node_ptr_->range_info.get();
     out_data->AddFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
                                 range_info->current);
     out_data->AddFloatAttribute(ax::mojom::FloatAttribute::kMinValueForRange,
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.cc
index 2363c70..d9988985 100644
--- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.cc
+++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.cc
@@ -9,7 +9,9 @@
 
 namespace arc {
 
-ax::mojom::Event ToAXEvent(mojom::AccessibilityEventType arc_event_type) {
+ax::mojom::Event ToAXEvent(
+    mojom::AccessibilityEventType arc_event_type,
+    mojom::AccessibilityNodeInfoData* focused_node_info_data) {
   switch (arc_event_type) {
     case mojom::AccessibilityEventType::VIEW_FOCUSED:
     case mojom::AccessibilityEventType::VIEW_ACCESSIBILITY_FOCUSED:
@@ -32,8 +34,18 @@
       return ax::mojom::Event::kAlert;
     case mojom::AccessibilityEventType::VIEW_SCROLLED:
       return ax::mojom::Event::kScrollPositionChanged;
-    case mojom::AccessibilityEventType::VIEW_SELECTED:
-      return ax::mojom::Event::kValueChanged;
+    case mojom::AccessibilityEventType::VIEW_SELECTED: {
+      // In Android, VIEW_SELECTED event is fired in the two cases below:
+      // 1. Changing a value in ProgressBar or TimePicker.
+      //    (this usage is NOT documented)
+      // 2. Selecting an item in the context of an AdapterView.
+      //    (officially documented in Android Developer doc below)
+      //    https://developer.android.com/reference/android/view/accessibility/AccessibilityEvent#TYPE_VIEW_SELECTED
+      if (focused_node_info_data && focused_node_info_data->range_info)
+        return ax::mojom::Event::kValueChanged;
+      else
+        return ax::mojom::Event::kSelection;
+    }
     case mojom::AccessibilityEventType::VIEW_HOVER_EXIT:
     case mojom::AccessibilityEventType::TOUCH_EXPLORATION_GESTURE_START:
     case mojom::AccessibilityEventType::TOUCH_EXPLORATION_GESTURE_END:
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.h b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.h
index 4fcaacbc..9e4a1e4 100644
--- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.h
+++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_util.h
@@ -12,9 +12,11 @@
 namespace arc {
 namespace mojom {
 enum class AccessibilityEventType;
+class AccessibilityNodeInfoData;
 }  // namespace mojom
 
-ax::mojom::Event ToAXEvent(mojom::AccessibilityEventType arc_event_type);
+ax::mojom::Event ToAXEvent(mojom::AccessibilityEventType arc_event_type,
+                           mojom::AccessibilityNodeInfoData* node_info_data);
 
 }  // namespace arc
 
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc
index 8423331..8ca8dde 100644
--- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc
+++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc
@@ -189,7 +189,12 @@
 
   event_bundle.events.emplace_back();
   ui::AXEvent& event = event_bundle.events.back();
-  event.event_type = ToAXEvent(event_data->event_type);
+  // When the focused node exists, give it as a hint to decide a Chrome
+  // automation event type.
+  AXNodeInfoData* opt_focused_node = nullptr;
+  if (tree_map_.find(focused_id_) != tree_map_.end())
+    opt_focused_node = tree_map_[focused_id_]->GetNode();
+  event.event_type = ToAXEvent(event_data->event_type, opt_focused_node);
   event.id = event_data->source_id;
 
   event_bundle.updates.emplace_back();
@@ -200,22 +205,18 @@
   current_tree_serializer_->SerializeChanges(GetFromId(event_data->source_id),
                                              &event_bundle.updates.back());
 
-  extensions::AutomationEventRouter* router =
-      extensions::AutomationEventRouter::GetInstance();
-  router->DispatchAccessibilityEvents(event_bundle);
+  GetAutomationEventRouter()->DispatchAccessibilityEvents(event_bundle);
 }
 
 void AXTreeSourceArc::NotifyActionResult(const ui::AXActionData& data,
                                          bool result) {
-  extensions::AutomationEventRouter::GetInstance()->DispatchActionResult(
-      data, result);
+  GetAutomationEventRouter()->DispatchActionResult(data, result);
 }
 
 void AXTreeSourceArc::NotifyGetTextLocationDataResult(
     const ui::AXActionData& data,
     const base::Optional<gfx::Rect>& rect) {
-  extensions::AutomationEventRouter::GetInstance()
-      ->DispatchGetTextLocationDataResult(data, rect);
+  GetAutomationEventRouter()->DispatchGetTextLocationDataResult(data, rect);
 }
 
 bool AXTreeSourceArc::GetTreeData(ui::AXTreeData* data) const {
@@ -443,12 +444,17 @@
   current_tree_serializer_.reset(new AXTreeArcSerializer(this));
   root_id_ = -1;
   focused_id_ = -1;
-  extensions::AutomationEventRouter* router =
-      extensions::AutomationEventRouter::GetInstance();
+  extensions::AutomationEventRouterInterface* router =
+      GetAutomationEventRouter();
   if (!router)
     return;
 
   router->DispatchTreeDestroyedEvent(ax_tree_id(), nullptr);
 }
 
+extensions::AutomationEventRouterInterface*
+AXTreeSourceArc::GetAutomationEventRouter() const {
+  return extensions::AutomationEventRouter::GetInstance();
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h
index 83c23522..26ebf11 100644
--- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h
+++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h
@@ -11,6 +11,7 @@
 
 #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_info_data.h"
 #include "components/arc/mojom/accessibility_helper.mojom.h"
+#include "extensions/browser/api/automation_internal/automation_event_router.h"
 #include "ui/accessibility/ax_action_handler.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_node_data.h"
@@ -88,6 +89,10 @@
 
   bool is_input_method_window() { return is_input_method_window_; }
 
+ protected:
+  virtual extensions::AutomationEventRouterInterface* GetAutomationEventRouter()
+      const;
+
  private:
   friend class arc::AXTreeSourceArcTest;
   class FocusStealer;
diff --git a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc
index 889e620..68aa443 100644
--- a/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc
+++ b/chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc_unittest.cc
@@ -4,10 +4,13 @@
 
 #include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h"
 
+#include "base/stl_util.h"
 #include "chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.h"
 #include "chrome/browser/chromeos/arc/accessibility/accessibility_window_info_data_wrapper.h"
 #include "components/arc/mojom/accessibility_helper.mojom.h"
+#include "extensions/browser/api/automation_internal/automation_event_router.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/platform/ax_android_constants.h"
 
 namespace arc {
@@ -31,7 +34,9 @@
   if (!node->boolean_properties) {
     node->boolean_properties = base::flat_map<AXBooleanProperty, bool>();
   }
-  node->boolean_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = node->boolean_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
 void SetProperty(AXNodeInfoData* node,
@@ -40,14 +45,18 @@
   if (!node->string_properties) {
     node->string_properties = base::flat_map<AXStringProperty, std::string>();
   }
-  node->string_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = node->string_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
 void SetProperty(AXNodeInfoData* node, AXIntProperty prop, int32_t value) {
   if (!node->int_properties) {
     node->int_properties = base::flat_map<AXIntProperty, int>();
   }
-  node->int_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = node->int_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
 void SetProperty(AXWindowInfoData* window,
@@ -57,7 +66,9 @@
     window->string_properties =
         base::flat_map<AXWindowStringProperty, std::string>();
   }
-  window->string_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = window->string_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
 void SetProperty(AXNodeInfoData* node,
@@ -67,7 +78,9 @@
     node->int_list_properties =
         base::flat_map<AXIntListProperty, std::vector<int>>();
   }
-  node->int_list_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = node->int_list_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
 void SetProperty(AXWindowInfoData* window,
@@ -77,13 +90,64 @@
     window->int_list_properties =
         base::flat_map<AXWindowIntListProperty, std::vector<int>>();
   }
-  window->int_list_properties.value().insert(std::make_pair(prop, value));
+  auto& prop_map = window->int_list_properties.value();
+  base::EraseIf(prop_map, [prop](auto it) { return it.first == prop; });
+  prop_map.insert(std::make_pair(prop, value));
 }
 
+class MockAutomationEventRouter
+    : public extensions::AutomationEventRouterInterface {
+ public:
+  MockAutomationEventRouter() {}
+  ~MockAutomationEventRouter() override = default;
+
+  void DispatchAccessibilityEvents(
+      const ExtensionMsg_AccessibilityEventBundleParams& events) override {
+    for (auto&& event : events.events) {
+      event_count_[event.event_type]++;
+    }
+  }
+
+  void DispatchAccessibilityLocationChange(
+      const ExtensionMsg_AccessibilityLocationChangeParams& params) override {}
+
+  void DispatchTreeDestroyedEvent(
+      ui::AXTreeID tree_id,
+      content::BrowserContext* browser_context) override {}
+
+  void DispatchActionResult(
+      const ui::AXActionData& data,
+      bool result,
+      content::BrowserContext* browser_context = nullptr) override {}
+
+  void DispatchGetTextLocationDataResult(
+      const ui::AXActionData& data,
+      const base::Optional<gfx::Rect>& rect) override {}
+
+  std::map<ax::mojom::Event, int> event_count_;
+};
+
 class AXTreeSourceArcTest : public testing::Test,
                             public AXTreeSourceArc::Delegate {
  public:
-  AXTreeSourceArcTest() : tree_(new AXTreeSourceArc(this)) {}
+  class TestAXTreeSourceArc : public AXTreeSourceArc {
+   public:
+    TestAXTreeSourceArc(AXTreeSourceArc::Delegate* delegate,
+                        MockAutomationEventRouter* router)
+        : AXTreeSourceArc(delegate), router_(router) {}
+
+    extensions::AutomationEventRouterInterface* GetAutomationEventRouter()
+        const override {
+      return router_;
+    }
+
+   private:
+    MockAutomationEventRouter* const router_;
+  };
+
+  AXTreeSourceArcTest()
+      : router_(new MockAutomationEventRouter()),
+        tree_(new TestAXTreeSourceArc(this, router_.get())) {}
 
  protected:
   void CallNotifyAccessibilityEvent(AXEventData* event_data) {
@@ -121,10 +185,17 @@
     return tree_->GetTreeData(data);
   }
 
+  MockAutomationEventRouter* GetRouter() const { return router_.get(); }
+
+  int GetDispatchedEventCount(ax::mojom::Event type) {
+    return router_->event_count_[type];
+  }
+
  private:
   void OnAction(const ui::AXActionData& data) const override {}
 
-  std::unique_ptr<AXTreeSourceArc> tree_;
+  const std::unique_ptr<MockAutomationEventRouter> router_;
+  const std::unique_ptr<AXTreeSourceArc> tree_;
 
   DISALLOW_COPY_AND_ASSIGN(AXTreeSourceArcTest);
 };
@@ -147,7 +218,7 @@
   SetProperty(root, AXIntListProperty::CHILD_NODE_IDS,
               std::vector<int>({1, 2}));
 
-  // Child button.
+  // Add child button.
   event->node_data.push_back(AXNodeInfoData::New());
   AXNodeInfoData* button1 = event->node_data.back().get();
   button1->id = 1;
@@ -155,7 +226,7 @@
   SetProperty(button1, AXBooleanProperty::VISIBLE_TO_USER, true);
   SetProperty(button1, AXBooleanProperty::FOCUSABLE, true);
 
-  // Another child button.
+  // Add another child button.
   event->node_data.push_back(AXNodeInfoData::New());
   AXNodeInfoData* button2 = event->node_data.back().get();
   button2->id = 2;
@@ -262,6 +333,8 @@
   ASSERT_EQ(2U, dimension.size());
   EXPECT_EQ(1, dimension[0]->GetId());
   EXPECT_EQ(2, dimension[1]->GetId());
+
+  EXPECT_EQ(10, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 TEST_F(AXTreeSourceArcTest, AccessibleNameComputation) {
@@ -276,12 +349,12 @@
   SetProperty(root, AXIntListProperty::CHILD_NODE_IDS,
               std::vector<int>({1, 2}));
 
-  // Child.
+  // Add child node.
   event->node_data.push_back(AXNodeInfoData::New());
   AXNodeInfoData* child1 = event->node_data.back().get();
   child1->id = 1;
 
-  // Another child.
+  // Add another child.
   event->node_data.push_back(AXNodeInfoData::New());
   AXNodeInfoData* child2 = event->node_data.back().get();
   child2->id = 2;
@@ -359,6 +432,8 @@
   CallSerializeNode(root, &data);
   ASSERT_FALSE(
       data->GetStringAttribute(ax::mojom::StringAttribute::kName, &name));
+
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 TEST_F(AXTreeSourceArcTest, AccessibleNameComputationWindow) {
@@ -388,6 +463,8 @@
   ASSERT_TRUE(
       data->GetStringAttribute(ax::mojom::StringAttribute::kName, &name));
   EXPECT_EQ("window title", name);
+
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 TEST_F(AXTreeSourceArcTest, AccessibleNameComputationWindowWithChildren) {
@@ -462,6 +539,8 @@
       data->GetStringAttribute(ax::mojom::StringAttribute::kName, &name));
   EXPECT_EQ("child2 window title", name);
   EXPECT_NE(ax::mojom::Role::kRootWebArea, data->role);
+
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 // TODO(katie): Maybe remove this test when adding AccessibilityWindowInfoData
@@ -525,6 +604,8 @@
     EXPECT_EQ(nullptr, CallGetFromId(10));
     EXPECT_EQ(nullptr, CallGetFromId(11));
   }
+
+  EXPECT_EQ(4, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 TEST_F(AXTreeSourceArcTest, ComplexTreeStructure) {
@@ -589,6 +670,7 @@
     EXPECT_EQ(i * tree_size + 4, children[1]->GetId());
     children.clear();
   }
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kFocus));
 }
 
 TEST_F(AXTreeSourceArcTest, GetTreeDataAppliesFocus) {
@@ -624,6 +706,53 @@
 
   EXPECT_TRUE(CallGetTreeData(&data));
   EXPECT_EQ(2, data.focus_id);
+
+  EXPECT_EQ(2, GetDispatchedEventCount(ax::mojom::Event::kFocus));
+}
+
+TEST_F(AXTreeSourceArcTest, EventTypeForViewSelected) {
+  auto event = AXEventData::New();
+  event->source_id = 0;
+  event->task_id = 1;
+  event->event_type = AXEventType::VIEW_SELECTED;
+
+  event->window_data = std::vector<mojom::AccessibilityWindowInfoDataPtr>();
+  event->window_data->emplace_back(AXWindowInfoData::New());
+  AXWindowInfoData* root_window = event->window_data->back().get();
+  root_window->window_id = 100;
+  root_window->root_node_id = 0;
+
+  event->node_data.emplace_back(AXNodeInfoData::New());
+  AXNodeInfoData* root = event->node_data.back().get();
+  root->id = 0;
+  SetProperty(root, AXIntListProperty::CHILD_NODE_IDS,
+              std::vector<int>({1, 2}));
+
+  // Add child node.
+  event->node_data.emplace_back(AXNodeInfoData::New());
+  AXNodeInfoData* button1 = event->node_data.back().get();
+  button1->id = 1;
+  SetProperty(button1, AXBooleanProperty::FOCUSABLE, true);
+
+  // Add another child with range_info.
+  event->node_data.emplace_back(AXNodeInfoData::New());
+  AXNodeInfoData* button2 = event->node_data.back().get();
+  button2->id = 2;
+  button2->range_info = AXRangeInfoData::New();
+  SetProperty(button2, AXBooleanProperty::FOCUSABLE, true);
+
+  // Without range_info, kSelection event should be emitted. Usually this event
+  // is fired from AdapterView.
+  SetProperty(button1, AXBooleanProperty::FOCUSED, true);
+  SetProperty(button2, AXBooleanProperty::FOCUSED, false);
+  CallNotifyAccessibilityEvent(event.get());
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kSelection));
+
+  // Set range_info. Should be kValueChanged.
+  SetProperty(button1, AXBooleanProperty::FOCUSED, false);
+  SetProperty(button2, AXBooleanProperty::FOCUSED, true);
+  CallNotifyAccessibilityEvent(event.get());
+  EXPECT_EQ(1, GetDispatchedEventCount(ax::mojom::Event::kValueChanged));
 }
 
 }  // namespace arc
diff --git a/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc b/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
index 4cfe818..8c66395 100644
--- a/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_installer_unittest.cc
@@ -153,7 +153,7 @@
  protected:
   MountPathWaiter mount_path_waiter_;
   MockCallbacks mock_callbacks_;
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   base::HistogramTester histogram_tester_;
 
   // Owned by DiskMountManager
@@ -195,7 +195,7 @@
       chromeos::MountError::MOUNT_ERROR_NONE,
       *mount_path_waiter_.get_mount_point_info());
 
-  thread_bundle_.RunUntilIdle();
+  task_environment_.RunUntilIdle();
   histogram_tester_.ExpectUniqueSample(
       "Crostini.SetupResult",
       static_cast<base::HistogramBase::Sample>(
@@ -234,11 +234,11 @@
 
   // This will stop just before mount disk finishes because we don't fake the
   // mount event.
-  thread_bundle_.RunUntilIdle();
+  task_environment_.RunUntilIdle();
 
   check.Call("calling Cancel()");
   Cancel();
-  thread_bundle_.RunUntilIdle();
+  task_environment_.RunUntilIdle();
 
   histogram_tester_.ExpectUniqueSample(
       "Crostini.SetupResult",
@@ -257,7 +257,7 @@
   crostini_installer_->Install(base::DoNothing(), base::DoNothing());
   Cancel();  // Cancel immediately
 
-  thread_bundle_.RunUntilIdle();
+  task_environment_.RunUntilIdle();
 
   histogram_tester_.ExpectUniqueSample(
       "Crostini.SetupResult",
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_unittest.cc b/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_unittest.cc
index 6d6e2cd..48679506 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_unittest.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_unittest.cc
@@ -76,7 +76,7 @@
   }
 
  protected:
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   content::TestServiceManagerContext service_manager_context_;
   TestingProfile* testing_profile_;
   std::unique_ptr<session_manager::SessionManager> session_manager_;
diff --git a/chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.cc b/chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.cc
index d2b89ea..95ff012 100644
--- a/chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.cc
+++ b/chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.cc
@@ -10,6 +10,7 @@
 
 #include "ash/public/cpp/app_list/tokenized_string.h"
 #include "ash/public/cpp/app_list/tokenized_string_match.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service_factory.h"
 #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_provider.h"
@@ -125,7 +126,7 @@
   std::vector<std::unique_ptr<app_list::LauncherSearchResult>> search_results;
   for (const auto& result : results) {
     const int relevance =
-        std::min(kMaxSearchResultScore, std::max(result.relevance, 0));
+        base::ClampToRange(result.relevance, 0, kMaxSearchResultScore);
     const GURL icon_url =
         result.icon_url ? GURL(*result.icon_url.get()) : GURL();
 
diff --git a/chrome/browser/chromeos/login/profile_auth_data_unittest.cc b/chrome/browser/chromeos/login/profile_auth_data_unittest.cc
index 37ce0243..4a02c9e9 100644
--- a/chrome/browser/chromeos/login/profile_auth_data_unittest.cc
+++ b/chrome/browser/chromeos/login/profile_auth_data_unittest.cc
@@ -22,6 +22,7 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_constants.h"
 #include "net/http/http_auth.h"
@@ -60,7 +61,7 @@
   explicit TestingProfileWithNetworkContext(
       network::NetworkService* network_service) {
     auto network_context = std::make_unique<network::NetworkContext>(
-        network_service, mojo::MakeRequest(&network_context_ptr_),
+        network_service, network_context_remote_.BindNewPipeAndPassReceiver(),
         network::mojom::NetworkContextParams::New());
     network_context_ = network_context.get();
     SetNetworkContext(std::move(network_context));
@@ -69,7 +70,7 @@
   network::NetworkContext* network_context() { return network_context_; }
 
  private:
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   network::NetworkContext* network_context_;
 };
 
diff --git a/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc b/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc
index 0ed89d57..3b00304 100644
--- a/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc
+++ b/chrome/browser/chromeos/login/signin_partition_manager_unittest.cc
@@ -23,6 +23,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_utils.h"
 #include "content/public/test/web_contents_tester.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/cookies/cookie_store.h"
 #include "net/http/http_transaction_factory.h"
 #include "net/url_request/url_request_context.h"
@@ -80,7 +81,7 @@
 
     auto network_context = std::make_unique<network::NetworkContext>(
         network::NetworkService::GetNetworkServiceForTesting(),
-        mojo::MakeRequest(&signin_network_context_ptr_),
+        signin_network_context_remote_.BindNewPipeAndPassReceiver(),
         network::mojom::NetworkContextParams::New());
     signin_network_context_ = network_context.get();
     TestingProfile::Builder()
@@ -92,7 +93,7 @@
 
     system_network_context_ = std::make_unique<network::NetworkContext>(
         network::NetworkService::GetNetworkServiceForTesting(),
-        mojo::MakeRequest(&system_network_context_ptr_),
+        system_network_context_remote_.BindNewPipeAndPassReceiver(),
         network::mojom::NetworkContextParams::New());
 
     GURL url(kEmbedderUrl);
@@ -175,11 +176,11 @@
     pending_clear_tasks_.push_back({partition, std::move(clear_done_closure)});
   }
 
-  network::mojom::NetworkContextPtr system_network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> system_network_context_remote_;
   std::unique_ptr<network::NetworkContext> system_network_context_;
 
   std::unique_ptr<TestingProfile> signin_browser_context_;
-  network::mojom::NetworkContextPtr signin_network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> signin_network_context_remote_;
   network::NetworkContext* signin_network_context_;
 
   // Web contents of the sign-in UI, embedder of the signin-frame webview.
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc
index 87195e15..d413deb4 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_log_uploader_unittest.cc
@@ -83,9 +83,9 @@
 class AppInstallEventLogUploaderTest : public testing::Test {
  protected:
   AppInstallEventLogUploaderTest()
-      : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME,
-            base::test::ScopedTaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY),
+      : task_environment_(
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME,
+            base::test::TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY),
         value_report_(base::Value::Type::DICTIONARY) {}
 
   void TearDown() override {
@@ -163,7 +163,7 @@
     CaptureUpload(callback);
   }
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
   em::AppInstallReportRequest log_;
   base::Value value_report_;
 
@@ -292,11 +292,11 @@
   int max_delay_count = 0;
   while (max_delay_count < 2) {
     EXPECT_EQ(expected_delay,
-              scoped_task_environment_.NextMainThreadPendingTaskDelay());
+              task_environment_.NextMainThreadPendingTaskDelay());
 
     CompleteSerializeAndUpload(false /* success */);
     EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
-    scoped_task_environment_.FastForwardBy(expected_delay);
+    task_environment_.FastForwardBy(expected_delay);
     Mock::VerifyAndClearExpectations(&delegate_);
     Mock::VerifyAndClearExpectations(&client_);
 
@@ -306,13 +306,12 @@
     expected_delay = std::min(expected_delay * 2, max_delay);
   }
 
-  EXPECT_EQ(expected_delay,
-            scoped_task_environment_.NextMainThreadPendingTaskDelay());
+  EXPECT_EQ(expected_delay, task_environment_.NextMainThreadPendingTaskDelay());
 
   log_.add_app_install_reports()->set_package(kPackageName);
   CompleteSerializeAndUpload(true /* success */);
   EXPECT_CALL(delegate_, OnUploadSuccess());
-  scoped_task_environment_.FastForwardBy(expected_delay);
+  task_environment_.FastForwardBy(expected_delay);
   Mock::VerifyAndClearExpectations(&delegate_);
   Mock::VerifyAndClearExpectations(&client_);
 
@@ -320,8 +319,7 @@
   EXPECT_CALL(delegate_, OnUploadSuccess()).Times(0);
   uploader_->RequestUpload();
 
-  EXPECT_EQ(min_delay,
-            scoped_task_environment_.NextMainThreadPendingTaskDelay());
+  EXPECT_EQ(min_delay, task_environment_.NextMainThreadPendingTaskDelay());
 }
 
 // Create the uploader using a client that is not registered with the server
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/brightness_monitor_impl.cc b/chrome/browser/chromeos/power/auto_screen_brightness/brightness_monitor_impl.cc
index c444a678..a76847a7 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/brightness_monitor_impl.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/brightness_monitor_impl.cc
@@ -11,6 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/utils.h"
 #include "chromeos/constants/chromeos_features.h"
@@ -85,7 +86,7 @@
     // instead of throwing it away.
     LogDataError(DataError::kBrightnessPercent);
     brightness_percent_received =
-        std::max(0.0, std::min(100.0, brightness_percent_received));
+        base::ClampToRange(brightness_percent_received, 0.0, 100.0);
   }
 
   if (change.cause() ==
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
index d47a8f4..b0c1046e 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
@@ -4,18 +4,18 @@
 
 #include "chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.h"
 
-#include "base/metrics/field_trial_params.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/stringprintf.h"
-#include "chrome/browser/chromeos/power/auto_screen_brightness/utils.h"
-#include "chromeos/constants/chromeos_features.h"
-
 #include <algorithm>
 #include <cmath>
 #include <limits>
 
 #include "base/logging.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
+#include "base/strings/stringprintf.h"
+#include "chrome/browser/chromeos/power/auto_screen_brightness/utils.h"
+#include "chromeos/constants/chromeos_features.h"
 
 namespace chromeos {
 namespace power {
@@ -87,8 +87,8 @@
   DCHECK_GT(scale, 0.0);
   DCHECK_GE(offset, 0.0);
 
-  return std::max(0.0, std::min(reference_brightness / scale,
-                                reference_brightness - offset));
+  return base::ClampToRange(reference_brightness / scale, 0.0,
+                            reference_brightness - offset);
 }
 
 // Calculates upper bound from |reference_brightness| using the max of
@@ -101,8 +101,8 @@
   DCHECK_GT(scale, 0.0);
   DCHECK_GE(offset, 0.0);
 
-  return std::min(100.0, std::max(reference_brightness * scale,
-                                  reference_brightness + offset));
+  return base::ClampToRange(reference_brightness * scale,
+                            reference_brightness + offset, 100.0);
 }
 
 // Returns whether |brightness| is an outlier from a |reference_brightness|.
@@ -141,7 +141,7 @@
   UMA_HISTOGRAM_ENUMERATION(
       "AutoScreenBrightness.ModelTraining.BrightnessChange", change);
 
-  return std::min(std::max(brightness_new, lower_bound), upper_bound) -
+  return base::ClampToRange(brightness_new, lower_bound, upper_bound) -
          brightness_old;
 }
 
@@ -489,8 +489,8 @@
 
 void GaussianTrainer::EnforceMonotonicity(size_t center_index) {
   DCHECK_LT(center_index, ambient_log_lux_.size());
-  brightness_[center_index] = std::min(
-      100.0, std::max(params_.min_brightness, brightness_[center_index]));
+  brightness_[center_index] = base::ClampToRange(brightness_[center_index],
+                                                 params_.min_brightness, 100.0);
 
   // Updates control points to the left of |center_index| so that brightness
   // values satisfy min/max ratio requirement.
@@ -498,7 +498,7 @@
     const double min_value = brightness_[i] / max_ratios_[i - 1];
     const double max_value = brightness_[i] / min_ratios_[i - 1];
     brightness_[i - 1] =
-        std::max(std::min(brightness_[i - 1], max_value), min_value);
+        base::ClampToRange(brightness_[i - 1], min_value, max_value);
     // TODO(jiameng): add UMA metrics.
     if (brightness_[i - 1] > 100.0)
       brightness_[i - 1] = 100.0;
@@ -510,7 +510,7 @@
     const double min_value = brightness_[i] * min_ratios_[i];
     const double max_value = brightness_[i] * max_ratios_[i];
     brightness_[i + 1] =
-        std::max(std::min(brightness_[i + 1], max_value), min_value);
+        base::ClampToRange(brightness_[i + 1], min_value, max_value);
     // TODO(jiameng): add UMA metrics.
     if (brightness_[i + 1] > 100.0)
       brightness_[i + 1] = 100.0;
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
index 5dc473e0..e0fcb535 100644
--- a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
+++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
@@ -18,7 +18,7 @@
 
 CupsProxyServiceManager::CupsProxyServiceManager() {
   // Don't wait for the daemon if the feature is turned off anyway.
-  if (base::FeatureList::IsEnabled(features::kCrosVmCupsProxy)) {
+  if (base::FeatureList::IsEnabled(features::kPluginVm)) {
     CupsProxyClient::Get()->WaitForServiceToBeAvailable(
         base::BindOnce(&CupsProxyServiceManager::OnDaemonAvailable,
                        weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc b/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc
index a00b1d0..3b48be68 100644
--- a/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc
+++ b/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc
@@ -38,7 +38,7 @@
 
   FakeChromeUserManager* user_manager_;
   user_manager::ScopedUserManager scoped_user_manager_;
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(ReleaseNotesStorageTest);
 };
diff --git a/chrome/browser/complex_tasks/endpoint_fetcher/endpoint_fetcher_unittest.cc b/chrome/browser/complex_tasks/endpoint_fetcher/endpoint_fetcher_unittest.cc
index 6cf9d47..50a66975 100644
--- a/chrome/browser/complex_tasks/endpoint_fetcher/endpoint_fetcher_unittest.cc
+++ b/chrome/browser/complex_tasks/endpoint_fetcher/endpoint_fetcher_unittest.cc
@@ -98,7 +98,7 @@
   }
 
  private:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
   signin::IdentityTestEnvironment identity_test_env_;
   MockEndpointFetcherCallback mock_callback_;
   network::TestURLLoaderFactory test_url_loader_factory_;
diff --git a/chrome/browser/component_updater/crl_set_component_installer_unittest.cc b/chrome/browser/component_updater/crl_set_component_installer_unittest.cc
index 462dc8e2..0cc10a9 100644
--- a/chrome/browser/component_updater/crl_set_component_installer_unittest.cc
+++ b/chrome/browser/component_updater/crl_set_component_installer_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/run_loop.h"
 #include "build/build_config.h"
 #include "content/public/test/browser_task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/test_data_directory.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -87,7 +88,7 @@
   std::unique_ptr<CRLSetPolicy> policy_;
   std::unique_ptr<network::TestURLLoaderClient> client_;
   std::unique_ptr<network::NetworkService> network_service_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderPtr loader_;
   base::ScopedTempDir temp_dir_;
 
@@ -97,7 +98,7 @@
 
 TEST_F(CRLSetComponentInstallerTest, ConfiguresOnInstall) {
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&network_context_),
+      network_context_.BindNewPipeAndPassReceiver(),
       network::mojom::NetworkContextParams::New());
 
   // Ensure the test server can load by default.
@@ -119,7 +120,7 @@
 
 TEST_F(CRLSetComponentInstallerTest, ReconfiguresAfterRestartWithCRLSet) {
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&network_context_),
+      network_context_.BindNewPipeAndPassReceiver(),
       network::mojom::NetworkContextParams::New());
 
   // Ensure the test server can load by default.
@@ -143,8 +144,9 @@
   CRLSetPolicy::ReconfigureAfterNetworkRestart();
   task_environment_.RunUntilIdle();
 
+  network_context_.reset();
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&network_context_),
+      network_context_.BindNewPipeAndPassReceiver(),
       network::mojom::NetworkContextParams::New());
 
   // Ensure the test server is still blocked even with a new context and
@@ -159,7 +161,7 @@
 
 TEST_F(CRLSetComponentInstallerTest, ReconfiguresAfterRestartWithNoCRLSet) {
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&network_context_),
+      network_context_.BindNewPipeAndPassReceiver(),
       network::mojom::NetworkContextParams::New());
 
   // Ensure the test server can load by default.
@@ -171,8 +173,9 @@
   CRLSetPolicy::ReconfigureAfterNetworkRestart();
   task_environment_.RunUntilIdle();
 
+  network_context_.reset();
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&network_context_),
+      network_context_.BindNewPipeAndPassReceiver(),
       network::mojom::NetworkContextParams::New());
 
   // Ensure the test server can still load.
diff --git a/chrome/browser/enterprise_reporting/prefs.cc b/chrome/browser/enterprise_reporting/prefs.cc
index abe7abc..26457c99 100644
--- a/chrome/browser/enterprise_reporting/prefs.cc
+++ b/chrome/browser/enterprise_reporting/prefs.cc
@@ -14,9 +14,6 @@
     "enterprise_reporting.last_upload_timestamp";
 
 void RegisterPrefs(PrefRegistrySimple* registry) {
-  if (!base::FeatureList::IsEnabled(features::kEnterpriseReportingInBrowser))
-    return;
-
   // This is also registered as a Profile pref which will be removed after
   // the migration.
   registry->RegisterBooleanPref(prefs::kCloudReportingEnabled, false);
diff --git a/chrome/browser/enterprise_reporting/report_scheduler.cc b/chrome/browser/enterprise_reporting/report_scheduler.cc
index ba91c89..90011e26 100644
--- a/chrome/browser/enterprise_reporting/report_scheduler.cc
+++ b/chrome/browser/enterprise_reporting/report_scheduler.cc
@@ -69,6 +69,10 @@
   report_uploader_ = std::move(uploader);
 }
 
+void ReportScheduler::OnDMTokenUpdated() {
+  OnReportEnabledPerfChanged();
+}
+
 void ReportScheduler::RegisterPerfObserver() {
   pref_change_registrar_.Init(g_browser_process->local_state());
   pref_change_registrar_.Add(
diff --git a/chrome/browser/enterprise_reporting/report_scheduler.h b/chrome/browser/enterprise_reporting/report_scheduler.h
index c48133f..356b7d3 100644
--- a/chrome/browser/enterprise_reporting/report_scheduler.h
+++ b/chrome/browser/enterprise_reporting/report_scheduler.h
@@ -34,6 +34,8 @@
 
   void SetReportUploaderForTesting(std::unique_ptr<ReportUploader> uploader);
 
+  void OnDMTokenUpdated();
+
  private:
   // Observes CloudReportingEnabled policy.
   void RegisterPerfObserver();
diff --git a/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc b/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
index 59083e4..ad3d0d13 100644
--- a/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
+++ b/chrome/browser/enterprise_reporting/report_scheduler_unittest.cc
@@ -109,7 +109,6 @@
   void SetUp() override {
     scoped_feature_list_.InitAndEnableFeature(
         features::kEnterpriseReportingInBrowser);
-    RegisterPrefs(local_state_.Get()->registry());
     client_ptr_ = std::make_unique<policy::MockCloudPolicyClient>();
     client_ = client_ptr_.get();
     timer_ptr_ = std::make_unique<FakeRequestTimer>();
diff --git a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc
index 0e34dab..c8c637ed 100644
--- a/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc
+++ b/chrome/browser/extensions/api/socket/tcp_socket_unittest.cc
@@ -12,6 +12,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/test/test_storage_partition.h"
 #include "extensions/browser/api/socket/tcp_socket.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/address_list.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
@@ -89,10 +90,10 @@
   void Initialize() {
     url_request_context_.Init();
     network_context_ = std::make_unique<network::NetworkContext>(
-        nullptr, mojo::MakeRequest(&network_context_ptr_),
+        nullptr, network_context_remote_.BindNewPipeAndPassReceiver(),
         &url_request_context_,
         /*cors_exempt_header_list=*/std::vector<std::string>());
-    partition_.set_network_context(network_context_ptr_.get());
+    partition_.set_network_context(network_context_remote_.get());
   }
 
   net::TestURLRequestContext url_request_context_;
@@ -101,7 +102,7 @@
   TestingProfile profile_;
   content::TestStoragePartition partition_;
   std::unique_ptr<network::NetworkContext> network_context_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
 };
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/socket/tls_socket_unittest.cc b/chrome/browser/extensions/api/socket/tls_socket_unittest.cc
index bab030e..39a43b0 100644
--- a/chrome/browser/extensions/api/socket/tls_socket_unittest.cc
+++ b/chrome/browser/extensions/api/socket/tls_socket_unittest.cc
@@ -12,6 +12,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/test/test_storage_partition.h"
 #include "extensions/browser/api/socket/tls_socket.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/address_list.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
@@ -89,10 +90,10 @@
   void Initialize() {
     url_request_context_.Init();
     network_context_ = std::make_unique<network::NetworkContext>(
-        nullptr, mojo::MakeRequest(&network_context_ptr_),
+        nullptr, network_context_remote_.BindNewPipeAndPassReceiver(),
         &url_request_context_,
         /*cors_exempt_header_list=*/std::vector<std::string>());
-    partition_.set_network_context(network_context_ptr_.get());
+    partition_.set_network_context(network_context_remote_.get());
   }
 
   net::TestURLRequestContext url_request_context_;
@@ -102,7 +103,7 @@
   TestingProfile profile_;
   content::TestStoragePartition partition_;
   std::unique_ptr<network::NetworkContext> network_context_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
 };
 
 }  // namespace
diff --git a/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc b/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc
index fd3e6a85..ceeda51f 100644
--- a/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc
+++ b/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc
@@ -1245,11 +1245,8 @@
   subresource_request.WaitForRequest();
   const char* expected_sec_fetch_site = "same-origin";
   if (IsExtensionAllowlisted()) {
-    expected_sec_fetch_site = "cross-site";
-  } else {
-    // TODO(lukasza): https://crbug.com/998247: Once the default factory uses
-    // request_initiator=website, we should get the desired behavior below -
-    // 'same-origin'.
+    // TODO(lukasza): https://crbug.com/998247: Even allowlisted extensions
+    // should correctly indicate `Sec-Fetch-Site: same-origin`.
     expected_sec_fetch_site = "cross-site";
   }
   EXPECT_THAT(subresource_request.http_request()->headers,
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index 11a07bc2..c72d867 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/extensions/standard_management_policy_provider.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
 #include "components/crx_file/id_util.h"
@@ -581,6 +582,8 @@
 
 bool ExtensionManagement::IsCloudReportingPolicyEnabled() const {
 #if !defined(OS_CHROMEOS)
+  if (base::FeatureList::IsEnabled(features::kEnterpriseReportingInBrowser))
+    return false;
   const base::Value* policy_value =
       LoadPreference(prefs::kCloudReportingEnabled,
                      /* force_managed = */ true, base::Value::Type::BOOLEAN);
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index a92dcf7b..ec45d2c 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -285,10 +286,7 @@
   int index = -1;
   if (params.index.get())
     index = *params.index;
-
-  TabStripModel* tab_strip = browser->tab_strip_model();
-
-  index = std::min(std::max(index, -1), tab_strip->count());
+  index = base::ClampToRange(index, -1, browser->tab_strip_model()->count());
 
   int add_types = active ? TabStripModel::ADD_ACTIVE : TabStripModel::ADD_NONE;
   add_types |= TabStripModel::ADD_FORCE_INDEX;
@@ -304,7 +302,7 @@
 
   // The tab may have been created in a different window, so make sure we look
   // at the right tab strip.
-  tab_strip = navigate_params.browser->tab_strip_model();
+  TabStripModel* tab_strip = navigate_params.browser->tab_strip_model();
   int new_index = tab_strip->GetIndexOfWebContents(
       navigate_params.navigated_or_inserted_contents);
   if (opener) {
diff --git a/chrome/browser/extensions/extension_unload_browsertest.cc b/chrome/browser/extensions/extension_unload_browsertest.cc
index 8fa6d34c..d99aee2 100644
--- a/chrome/browser/extensions/extension_unload_browsertest.cc
+++ b/chrome/browser/extensions/extension_unload_browsertest.cc
@@ -112,8 +112,9 @@
   GURL test_url = embedded_test_server()->GetURL("/title1.html");
   ui_test_utils::NavigateToURL(browser(), test_url);
 
-  // Sending an XHR with the extension's Origin header should succeed when the
-  // extension is installed.
+  // The content script sends an XHR with the webpage's (rather than
+  // extension's) Origin header - this should succeed (given that
+  // xhr.txt.mock-http-headers says `Access-Control-Allow-Origin: *`).
   const char kSendXhrScript[] = "document.getElementById('xhrButton').click();";
   bool xhr_result = false;
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
@@ -129,12 +130,13 @@
       test_url,
       browser()->tab_strip_model()->GetWebContentsAt(0)->GetLastCommittedURL());
 
-  // Sending an XHR with the extension's Origin header should fail but not kill
-  // the tab.
+  // The content script sends an XHR with the webpage's (rather than
+  // extension's) Origin header - this should succeed (given that
+  // xhr.txt.mock-http-headers says `Access-Control-Allow-Origin: *`).
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
       browser()->tab_strip_model()->GetActiveWebContents(), kSendXhrScript,
       &xhr_result));
-  EXPECT_FALSE(xhr_result);
+  EXPECT_TRUE(xhr_result);
 
   // Ensure the process has not been killed.
   EXPECT_TRUE(browser()
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index babfdd1..2dca794e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1082,11 +1082,6 @@
     "expiry_milestone": 77
   },
   {
-    "name": "enable-cros-vm-cups-proxy",
-    "owners": [ "//chrome/services/cups_proxy/OWNERS" ],
-    "expiry_milestone": 78
-  },
-  {
     "name": "enable-cups-printers-ui-overhaul",
     "owners": [ "jimmyxgong" ],
     "expiry_milestone": 79
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 7e040529..fb95a1b 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3213,10 +3213,6 @@
 const char kCrostiniWebUIInstallerDescription[] =
     "Enable the new WebUI Crostini Installer.";
 
-const char kCrosVmCupsProxyName[] = "Chrome OS CUPS Proxy";
-const char kCrosVmCupsProxyDescription[] =
-    "Supports printing from VMs on Chrome OS.";
-
 const char kCryptAuthV2EnrollmentName[] = "CryptAuth v2 Enrollment";
 const char kCryptAuthV2EnrollmentDescription[] =
     "Use the CryptAuth v2 Enrollment protocol.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 037c0c3..60722534 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1916,9 +1916,6 @@
 extern const char kCrostiniWebUIInstallerName[];
 extern const char kCrostiniWebUIInstallerDescription[];
 
-extern const char kCrosVmCupsProxyName[];
-extern const char kCrosVmCupsProxyDescription[];
-
 extern const char kCryptAuthV2EnrollmentName[];
 extern const char kCryptAuthV2EnrollmentDescription[];
 
diff --git a/chrome/browser/internal_auth.cc b/chrome/browser/internal_auth.cc
index 45b2727..c33fd7bd 100644
--- a/chrome/browser/internal_auth.cc
+++ b/chrome/browser/internal_auth.cc
@@ -15,6 +15,7 @@
 #include "base/containers/circular_deque.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/numerics/ranges.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
@@ -449,7 +450,7 @@
   if (verification_window_seconds_ > 0)
     candidate = verification_window_seconds_ *
         base::Time::kMicrosecondsPerSecond / kTickUs;
-  return std::max(1, std::min(candidate, kVerificationWindowTicks));
+  return base::ClampToRange(candidate, 1, kVerificationWindowTicks);
 }
 
 int InternalAuthVerification::verification_window_seconds_ = 0;
diff --git a/chrome/browser/net/chrome_network_service_browsertest.cc b/chrome/browser/net/chrome_network_service_browsertest.cc
index 3d5dac3..b98f2d1 100644
--- a/chrome/browser/net/chrome_network_service_browsertest.cc
+++ b/chrome/browser/net/chrome_network_service_browsertest.cc
@@ -13,6 +13,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/test/browser_test.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/extras/sqlite/cookie_crypto_delegate.h"
 #include "services/network/public/cpp/features.h"
@@ -64,16 +65,17 @@
   ChromeNetworkServiceBrowserTest() {}
 
  protected:
-  network::mojom::NetworkContextPtr CreateNetworkContext(
+  mojo::PendingRemote<network::mojom::NetworkContext> CreateNetworkContext(
       bool enable_encrypted_cookies) {
-    network::mojom::NetworkContextPtr network_context;
+    mojo::PendingRemote<network::mojom::NetworkContext> network_context;
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     context_params->enable_encrypted_cookies = enable_encrypted_cookies;
     context_params->cookie_path =
         browser()->profile()->GetPath().Append(FILE_PATH_LITERAL("cookies"));
     GetNetworkService()->CreateNetworkContext(
-        mojo::MakeRequest(&network_context), std::move(context_params));
+        network_context.InitWithNewPipeAndPassReceiver(),
+        std::move(context_params));
     return network_context;
   }
 
@@ -83,8 +85,8 @@
 
 IN_PROC_BROWSER_TEST_F(ChromeNetworkServiceBrowserTest, PRE_EncryptedCookies) {
   // First set a cookie with cookie encryption enabled.
-  network::mojom::NetworkContextPtr context =
-      CreateNetworkContext(/*enable_encrypted_cookies=*/true);
+  mojo::Remote<network::mojom::NetworkContext> context(
+      CreateNetworkContext(/*enable_encrypted_cookies=*/true));
   mojo::Remote<network::mojom::CookieManager> cookie_manager;
   context->GetCookieManager(cookie_manager.BindNewPipeAndPassReceiver());
 
@@ -120,8 +122,8 @@
     return;
 
   // Now attempt to read the cookie with encryption disabled.
-  network::mojom::NetworkContextPtr context =
-      CreateNetworkContext(/*enable_encrypted_cookies=*/false);
+  mojo::Remote<network::mojom::NetworkContext> context(
+      CreateNetworkContext(/*enable_encrypted_cookies=*/false));
   mojo::Remote<network::mojom::CookieManager> cookie_manager;
   context->GetCookieManager(cookie_manager.BindNewPipeAndPassReceiver());
 
diff --git a/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc b/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
index 03b44868a..fef7deb 100644
--- a/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
+++ b/chrome/browser/net/network_quality_estimator_prefs_browsertest.cc
@@ -39,6 +39,7 @@
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_base.h"
 #include "content/public/test/browser_test_utils.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/filename_util.h"
 #include "net/nqe/effective_connection_type.h"
 #include "net/nqe/network_quality_estimator.h"
@@ -193,7 +194,7 @@
   base::HistogramTester histogram_tester2;
 
   // Create network context with JSON pref store pointing to the temp file.
-  network::mojom::NetworkContextPtr network_context;
+  mojo::PendingRemote<network::mojom::NetworkContext> network_context;
   network::mojom::NetworkContextParamsPtr context_params =
       network::mojom::NetworkContextParams::New();
   context_params->http_server_properties_path =
@@ -217,7 +218,8 @@
   loop.Run();
 
   content::GetNetworkService()->CreateNetworkContext(
-      mojo::MakeRequest(&network_context), std::move(context_params));
+      network_context.InitWithNewPipeAndPassReceiver(),
+      std::move(context_params));
 
   RetryForHistogramUntilCountReached(&histogram_tester2, "NQE.Prefs.ReadSize",
                                      1);
diff --git a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
index c555e3e..ca26eae 100644
--- a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
+++ b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
@@ -192,7 +192,7 @@
     while (it != notifications_[type].end()) {
       const auto& entry = *it->second;
       ++it;
-      DeleteNotificationInDb(entry);
+      DeleteNotification(entry, false /*should_delete_in_memory*/);
     }
     notifications_.erase(type);
   }
@@ -265,33 +265,13 @@
       bool valid = ValidateNotificationEntry(*entry);
       bool deprecated_client = !base::Contains(clients_, entry->type);
       if (expired || deprecated_client || !valid) {
-        DeleteNotificationInDb(*entry);
+        DeleteNotification(*entry, false /*should_delete_in_memory*/);
       } else {
         notifications_[entry->type].emplace(entry->guid, std::move(*it));
       }
     }
   }
 
-  // Deletes a notification entry and its associated icon resources from
-  // database.
-  void DeleteNotificationInDb(const NotificationEntry& entry) {
-    // Deletes icon first.
-    std::vector<std::string> icons_to_delete;
-    for (const auto& icon_id : entry.icons_uuid) {
-      icons_to_delete.emplace_back(icon_id.second);
-    }
-    icon_store_->DeleteIcons(
-        std::move(icons_to_delete),
-        base::BindOnce(&ScheduledNotificationManagerImpl::OnIconDeleted,
-                       weak_ptr_factory_.GetWeakPtr()));
-
-    // Deletes notification entry.
-    notification_store_->Delete(
-        entry.guid,
-        base::BindOnce(&ScheduledNotificationManagerImpl::OnNotificationDeleted,
-                       weak_ptr_factory_.GetWeakPtr()));
-  }
-
   void OnIconsAdded(std::unique_ptr<NotificationEntry> entry,
                     ScheduleCallback schedule_callback,
                     IconStore::IconTypeUuidMap icons_uuid_map,
@@ -355,24 +335,14 @@
                      IconStore::LoadedIconsMap loaded_icons_map) {
     stats::LogDbOperation(stats::DatabaseType::kIconDb, success);
 
-    // TODO(hesen): delete notification entry if icons failed to load.
-    if (!success) {
+    auto* entry_ptr = FindNotificationEntry(client_type, guid);
+    if (!entry_ptr) {
       std::move(display_callback).Run(nullptr);
       return;
     }
 
-    // Delete icons from database.
-    std::vector<std::string> icons_to_delete;
-    for (const auto& loaded_icon : loaded_icons_map) {
-      icons_to_delete.emplace_back(loaded_icon.first);
-    }
-    icon_store_->DeleteIcons(
-        std::move(icons_to_delete),
-        base::BindOnce(&ScheduledNotificationManagerImpl::OnIconDeleted,
-                       weak_ptr_factory_.GetWeakPtr()));
-
-    // Can't find the entry.
-    if (!FindNotificationEntry(client_type, guid)) {
+    if (!success) {
+      DeleteNotification(*entry_ptr, true /*should_delete_in_memory*/);
       std::move(display_callback).Run(nullptr);
       return;
     }
@@ -388,13 +358,7 @@
     }
 
     // Before moving out the entry, delete it from container and disk.
-    notifications_[entry->type].erase(entry->guid);
-    if (notifications_[entry->type].empty())
-      notifications_.erase(entry->type);
-    notification_store_->Delete(
-        entry->guid,
-        base::BindOnce(&ScheduledNotificationManagerImpl::OnNotificationDeleted,
-                       weak_ptr_factory_.GetWeakPtr()));
+    DeleteNotification(*entry.get(), true /*should_delete_in_memory*/);
 
     std::move(display_callback).Run(std::move(entry));
   }
@@ -406,6 +370,35 @@
     return notifications_[type][guid].get();
   }
 
+  // Delete NotitificationEntry from memory and disk.
+  void DeleteNotification(const NotificationEntry& entry,
+                          bool should_delete_in_memory) {
+    // Deletes icon first.
+    std::vector<std::string> icons_to_delete;
+    for (const auto& icon_id : entry.icons_uuid) {
+      icons_to_delete.emplace_back(icon_id.second);
+    }
+    icon_store_->DeleteIcons(
+        std::move(icons_to_delete),
+        base::BindOnce(&ScheduledNotificationManagerImpl::OnIconDeleted,
+                       weak_ptr_factory_.GetWeakPtr()));
+
+    auto guid = entry.guid;
+    auto type = entry.type;
+
+    // Deletes notification entry.
+    notification_store_->Delete(
+        guid,
+        base::BindOnce(&ScheduledNotificationManagerImpl::OnNotificationDeleted,
+                       weak_ptr_factory_.GetWeakPtr()));
+
+    if (should_delete_in_memory) {
+      notifications_[type].erase(guid);
+      if (notifications_[type].empty())
+        notifications_.erase(type);
+    }
+  }
+
   // Create two default buttons {Helpful, Unhelpful} for notification.
   void CreateInhrButtonsPair(std::vector<NotificationData::Button>* buttons) {
     buttons->clear();
diff --git a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
index 213c86f..6c707fd 100644
--- a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
@@ -698,14 +698,14 @@
                           IconStore::LoadIconsCallback callback) {
         std::move(callback).Run(false, {});
       }));
-
+  EXPECT_CALL(*notification_store(), Delete(kGuid, _));
+  EXPECT_CALL(*icon_store(), DeleteIcons(_, _));
   DisplayNotification(kGuid, nullptr /*expected_entry*/);
 
   // Verify in-memory data.
   ScheduledNotificationManager::Notifications notifications;
   manager()->GetAllNotifications(&notifications);
-  // TODO(hesen): need to delete notification entry if icons failed to load.
-  EXPECT_EQ(notifications.size(), 1u);
+  EXPECT_TRUE(notifications.empty());
 }
 
 }  // namespace
diff --git a/chrome/browser/notifications/scheduler/notification_schedule_service_browsertest.cc b/chrome/browser/notifications/scheduler/notification_schedule_service_browsertest.cc
new file mode 100644
index 0000000..b7117933
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/notification_schedule_service_browsertest.cc
@@ -0,0 +1,175 @@
+// 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 <memory>
+#include <set>
+#include <string>
+#include <utility>
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/notifications/scheduler/notification_background_task_scheduler_impl.h"
+#include "chrome/browser/notifications/scheduler/public/display_agent.h"
+#include "chrome/browser/notifications/scheduler/public/features.h"
+#include "chrome/browser/notifications/scheduler/public/notification_params.h"
+#include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h"
+#include "chrome/browser/notifications/scheduler/public/notification_scheduler_client.h"
+#include "chrome/browser/notifications/scheduler/public/notification_scheduler_client_registrar.h"
+#include "chrome/browser/notifications/scheduler/schedule_service_factory_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+
+namespace notifications {
+namespace {
+
+const base::FilePath::CharType kTestDir[] =
+    FILE_PATH_LITERAL("NotificationScheduleServiceTest");
+
+class TestClient : public NotificationSchedulerClient {
+ public:
+  TestClient() {}
+  ~TestClient() override = default;
+
+ private:
+  // NotificationSchedulerClient implementation.
+  void BeforeShowNotification(
+      std::unique_ptr<NotificationData> notification_data,
+      NotificationDataCallback callback) override {
+    std::move(callback).Run(std::move(notification_data));
+  }
+
+  void OnSchedulerInitialized(bool success,
+                              std::set<std::string> guids) override {}
+
+  void OnUserAction(const UserActionData& action_data) override {}
+
+  DISALLOW_COPY_AND_ASSIGN(TestClient);
+};
+
+class TestBackgroundTaskScheduler : public NotificationBackgroundTaskScheduler {
+ public:
+  TestBackgroundTaskScheduler() = default;
+  ~TestBackgroundTaskScheduler() override = default;
+
+  // Waits until a background task has been updated.
+  void WaitForTaskUpdated() {
+    DCHECK(!run_loop_);
+    run_loop_ = std::make_unique<base::RunLoop>();
+    run_loop_->Run();
+  }
+
+  base::TimeDelta window_start() { return window_start_; }
+
+ private:
+  void QuitRunLoopIfNeeded() {
+    if (run_loop_ && run_loop_->running()) {
+      run_loop_->Quit();
+    }
+  }
+
+  // NotificationBackgroundTaskScheduler implementation.
+  void Schedule(notifications::SchedulerTaskTime scheduler_task_time,
+                base::TimeDelta window_start,
+                base::TimeDelta window_end) override {
+    QuitRunLoopIfNeeded();
+  }
+
+  void Cancel() override { QuitRunLoopIfNeeded(); }
+
+  base::TimeDelta window_start_;
+  std::unique_ptr<base::RunLoop> run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestBackgroundTaskScheduler);
+};
+
+// Browser test for notification scheduling system. Uses real database
+// instances. Mainly to cover service initialization flow in chrome layer.
+class NotificationScheduleServiceTest : public InProcessBrowserTest {
+ public:
+  NotificationScheduleServiceTest() : task_scheduler_(nullptr) {
+    scoped_feature_list_.InitWithFeatures(
+        {features::kNotificationScheduleService}, {});
+  }
+
+  ~NotificationScheduleServiceTest() override {}
+
+ protected:
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir());
+  }
+
+  void TearDownOnMainThread() override {
+    InProcessBrowserTest::TearDownOnMainThread();
+    ASSERT_TRUE(tmp_dir_.Delete());
+  }
+
+  // Initializes |service_|. Injects database test data before this call.
+  void Init() {
+    auto* profile = browser()->profile();
+    auto client = std::make_unique<TestClient>();
+    auto client_registrar =
+        std::make_unique<NotificationSchedulerClientRegistrar>();
+    client_registrar->RegisterClient(SchedulerClientType::kTest1,
+                                     std::move(client));
+    auto display_agent = notifications::DisplayAgent::Create();
+    auto background_task_scheduler =
+        std::make_unique<TestBackgroundTaskScheduler>();
+    task_scheduler_ = background_task_scheduler.get();
+    auto* db_provider =
+        content::BrowserContext::GetDefaultStoragePartition(profile)
+            ->GetProtoDatabaseProvider();
+    NotificationScheduleService* service =
+        static_cast<NotificationScheduleService*>(
+            CreateNotificationScheduleService(
+                std::move(client_registrar),
+                std::move(background_task_scheduler), std::move(display_agent),
+                db_provider, tmp_dir_.GetPath().Append(kTestDir),
+                profile->IsOffTheRecord()));
+    service_ = std::unique_ptr<NotificationScheduleService>(service);
+  }
+
+  NotificationScheduleService* schedule_service() { return service_.get(); }
+
+  TestBackgroundTaskScheduler* task_scheduler() {
+    DCHECK(task_scheduler_);
+    return task_scheduler_;
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  base::ScopedTempDir tmp_dir_;
+  std::unique_ptr<NotificationScheduleService> service_;
+  TestBackgroundTaskScheduler* task_scheduler_;
+
+  DISALLOW_COPY_AND_ASSIGN(NotificationScheduleServiceTest);
+};
+
+// Test to schedule a notification.
+IN_PROC_BROWSER_TEST_F(NotificationScheduleServiceTest, ScheduleNotification) {
+  Init();
+  ScheduleParams schedule_params;
+  schedule_params.deliver_time_start = base::Time::Now();
+  schedule_params.deliver_time_end =
+      base::Time::Now() + base::TimeDelta::FromMinutes(5);
+  NotificationData data;
+  data.title = base::UTF8ToUTF16("title");
+  data.message = base::UTF8ToUTF16("message");
+  auto params = std::make_unique<notifications::NotificationParams>(
+      notifications::SchedulerClientType::kTest1, std::move(data),
+      std::move(schedule_params));
+  schedule_service()->Schedule(std::move(params));
+
+  // A background task should be scheduled.
+  task_scheduler()->WaitForTaskUpdated();
+  EXPECT_LE(task_scheduler()->window_start(), base::TimeDelta::FromMinutes(5));
+}
+
+}  // namespace
+}  // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/public/notification_schedule_service.h b/chrome/browser/notifications/scheduler/public/notification_schedule_service.h
index 17e7ef0..b12f0d2 100644
--- a/chrome/browser/notifications/scheduler/public/notification_schedule_service.h
+++ b/chrome/browser/notifications/scheduler/public/notification_schedule_service.h
@@ -42,9 +42,10 @@
   // Returns the user action handler to process notification events.
   virtual UserActionHandler* GetUserActionHandler() = 0;
 
+  ~NotificationScheduleService() override = default;
+
  protected:
   NotificationScheduleService() = default;
-  ~NotificationScheduleService() override = default;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(NotificationScheduleService);
diff --git a/chrome/browser/optimization_guide/optimization_guide_web_contents_observer.cc b/chrome/browser/optimization_guide/optimization_guide_web_contents_observer.cc
index 8bed6de..85f00acc0c 100644
--- a/chrome/browser/optimization_guide/optimization_guide_web_contents_observer.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_web_contents_observer.cc
@@ -20,8 +20,7 @@
 // Records if the host for the current navigation was successfully
 // covered by a HintsFetch. HintsFetching must be enabled and only HTTPS
 // navigations are logged.
-void MaybeRecordHintsFetcherCoverage(
-    content::NavigationHandle* navigation_handle) {
+void RecordHintsFetcherCoverage(content::NavigationHandle* navigation_handle) {
   if (!navigation_handle->GetURL().SchemeIs(url::kHttpsScheme))
     return;
   if (!optimization_guide::features::IsHintsFetchingEnabled())
@@ -77,7 +76,7 @@
 
   // Record the HintsFetcher coverage for the navigation, regardless if the
   // keyed service is active or not.
-  MaybeRecordHintsFetcherCoverage(navigation_handle);
+  RecordHintsFetcherCoverage(navigation_handle);
 
   if (!optimization_guide_keyed_service_)
     return;
@@ -95,7 +94,7 @@
 
   // Record the HintsFetcher coverage for the navigation, regardless if the
   // keyed service is active or not.
-  MaybeRecordHintsFetcherCoverage(navigation_handle);
+  RecordHintsFetcherCoverage(navigation_handle);
 
   if (!optimization_guide_keyed_service_)
     return;
diff --git a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
index d8b1876..c6fa924 100644
--- a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
+++ b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/performance_manager/graph/node_attached_data_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
 
@@ -143,7 +142,7 @@
 
   // Cancel any ongoing timers. A new timer will be set if necessary.
   data->idling_timer_.Stop();
-  const base::TimeTicks now = PerformanceManagerClock::NowTicks();
+  const base::TimeTicks now = base::TimeTicks::Now();
 
   // Determine if the overall timeout has fired.
   if ((data->load_idle_state_ == LoadIdleState::kLoadedNotIdling ||
diff --git a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator_unittest.cc b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator_unittest.cc
index d68013b0..2f29ca41 100644
--- a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator_unittest.cc
@@ -8,14 +8,12 @@
 #include <type_traits>
 #include <utility>
 
-#include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -31,11 +29,6 @@
     graph()->PassToGraph(base::WrapUnique(paid_));
   }
 
-  void TearDown() override {
-    PerformanceManagerClock::ResetClockForTesting();
-    GraphTestHarness::TearDown();
-  }
-
   void TestPageAlmostIdleTransitions(bool timeout);
 
   bool IsIdling(const PageNodeImpl* page_node) const {
@@ -58,8 +51,7 @@
   using Data = PageAlmostIdleDecorator::Data;
   using LIS = Data::LoadIdleState;
 
-  PerformanceManagerClock::SetClockForTesting(task_env().GetMockTickClock());
-  task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   MockSinglePageInSingleProcessGraph mock_graph(graph());
   auto* frame_node = mock_graph.frame.get();
@@ -104,11 +96,11 @@
   EXPECT_EQ(LIS::kLoadedNotIdling, page_data->load_idle_state_);
   EXPECT_TRUE(page_data->idling_timer_.IsRunning());
 
-  base::TimeTicks start = PerformanceManagerClock::NowTicks();
+  base::TimeTicks start = base::TimeTicks::Now();
   if (timeout) {
     // Let the timeout run down. The final state transition should occur.
     task_env().FastForwardUntilNoTasksRemain();
-    base::TimeTicks end = PerformanceManagerClock::NowTicks();
+    base::TimeTicks end = base::TimeTicks::Now();
     base::TimeDelta elapsed = end - start;
     EXPECT_LE(kLoadedAndIdlingTimeout, elapsed);
     EXPECT_LE(kWaitingForIdleTimeout, elapsed);
@@ -121,7 +113,7 @@
 
     // Let the idle timer evaluate. The final state transition should occur.
     task_env().FastForwardUntilNoTasksRemain();
-    base::TimeTicks end = PerformanceManagerClock::NowTicks();
+    base::TimeTicks end = base::TimeTicks::Now();
     base::TimeDelta elapsed = end - start;
     EXPECT_LE(kLoadedAndIdlingTimeout, elapsed);
     EXPECT_GT(kWaitingForIdleTimeout, elapsed);
@@ -135,8 +127,8 @@
   EXPECT_FALSE(Data::GetForTesting(page_node));
 
   // Post a navigation. The state should reset.
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            1, GURL("https://www.example.org"));
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), 1,
+                                            GURL("https://www.example.org"));
   page_data = Data::GetForTesting(page_node);
   EXPECT_EQ(LIS::kLoadingNotStarted, page_data->load_idle_state_);
   EXPECT_FALSE(page_data->idling_timer_.IsRunning());
diff --git a/chrome/browser/performance_manager/decorators/process_metrics_decorator_unittest.cc b/chrome/browser/performance_manager/decorators/process_metrics_decorator_unittest.cc
index 3679aa57..aa1db8a7 100644
--- a/chrome/browser/performance_manager/decorators/process_metrics_decorator_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/process_metrics_decorator_unittest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/global_memory_dump.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -107,8 +106,6 @@
   ~ProcessMetricsDecoratorTest() override = default;
 
   void SetUp() override {
-    PerformanceManagerClock::SetClockForTesting(task_env().GetMockTickClock());
-
     std::unique_ptr<TestProcessMetricsDecorator> decorator =
         std::make_unique<TestProcessMetricsDecorator>();
     decorator_raw_ = decorator.get();
@@ -119,8 +116,6 @@
     EXPECT_TRUE(decorator_raw_->IsTimerRunningForTesting());
   }
 
-  void TearDown() override { PerformanceManagerClock::ResetClockForTesting(); }
-
   TestProcessMetricsDecorator* decorator() const { return decorator_raw_; }
 
   MockSinglePageWithMultipleProcessesGraph* mock_graph() {
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.cc b/chrome/browser/performance_manager/graph/frame_node_impl.cc
index 1d684db..fcaabf0 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.cc
@@ -10,7 +10,6 @@
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/graph/worker_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "chrome/browser/performance_manager/public/frame_priority/frame_priority.h"
 
 namespace performance_manager {
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
index 1e0fbf9..fb96598 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
@@ -4,12 +4,10 @@
 
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -17,26 +15,7 @@
 
 namespace {
 
-class FrameNodeImplTest : public GraphTestHarness {
- public:
-  void SetUp() override {
-    PerformanceManagerClock::SetClockForTesting(&clock_);
-
-    // Sets a valid starting time.
-    clock_.SetNowTicks(base::TimeTicks::Now());
-  }
-
-  void TearDown() override {
-    PerformanceManagerClock::ResetClockForTesting();
-    GraphTestHarness::TearDown();
-  }
-
- protected:
-  void AdvanceClock(base::TimeDelta delta) { clock_.Advance(delta); }
-
- private:
-  base::SimpleTestTickClock clock_;
-};
+using FrameNodeImplTest = GraphTestHarness;
 
 }  // namespace
 
diff --git a/chrome/browser/performance_manager/graph/graph_test_harness.h b/chrome/browser/performance_manager/graph/graph_test_harness.h
index d5732ba..2d844977 100644
--- a/chrome/browser/performance_manager/graph/graph_test_harness.h
+++ b/chrome/browser/performance_manager/graph/graph_test_harness.h
@@ -191,6 +191,8 @@
   void TearDown() override;
 
  protected:
+  void AdvanceClock(base::TimeDelta delta) { task_env_.FastForwardBy(delta); }
+
   base::test::TaskEnvironment& task_env() { return task_env_; }
   GraphImpl* graph() { return &graph_; }
 
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.cc b/chrome/browser/performance_manager/graph/page_node_impl.cc
index 1a7a6eaa..9464407 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_impl_operations.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
 
@@ -24,7 +23,7 @@
                            bool is_audible)
     : TypedNodeBase(graph),
       contents_proxy_(contents_proxy),
-      visibility_change_time_(PerformanceManagerClock::NowTicks()),
+      visibility_change_time_(base::TimeTicks::Now()),
       browser_context_id_(browser_context_id),
       is_visible_(is_visible),
       is_audible_(is_audible) {
@@ -73,7 +72,7 @@
     // use this to determine time passed since the *previous* visibility state
     // change. They can infer the current state change time themselves via
     // NowTicks.
-    visibility_change_time_ = PerformanceManagerClock::NowTicks();
+    visibility_change_time_ = base::TimeTicks::Now();
   }
 }
 
@@ -129,12 +128,12 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (navigation_committed_time_.is_null())
     return base::TimeDelta();
-  return PerformanceManagerClock::NowTicks() - navigation_committed_time_;
+  return base::TimeTicks::Now() - navigation_committed_time_;
 }
 
 base::TimeDelta PageNodeImpl::TimeSinceLastVisibilityChange() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return PerformanceManagerClock::NowTicks() - visibility_change_time_;
+  return base::TimeTicks::Now() - visibility_change_time_;
 }
 
 FrameNodeImpl* PageNodeImpl::GetMainFrameNodeImpl() const {
diff --git a/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
index 1ec268e..98c8de8 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl_unittest.cc
@@ -5,13 +5,11 @@
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 
 #include "base/stl_util.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_impl_operations.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "chrome/browser/performance_manager/public/graph/page_node.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -20,26 +18,7 @@
 
 namespace {
 
-class PageNodeImplTest : public GraphTestHarness {
- public:
-  void SetUp() override {
-    PerformanceManagerClock::SetClockForTesting(&clock_);
-
-    // Sets a valid starting time.
-    clock_.SetNowTicks(base::TimeTicks::Now());
-  }
-
-  void TearDown() override {
-    PerformanceManagerClock::ResetClockForTesting();
-    GraphTestHarness::TearDown();
-  }
-
- protected:
-  void AdvanceClock(base::TimeDelta delta) { clock_.Advance(delta); }
-
- private:
-  base::SimpleTestTickClock clock_;
-};
+using PageNodeImplTest = GraphTestHarness;
 
 }  // namespace
 
@@ -144,8 +123,8 @@
 
   // 1st navigation.
   GURL url("http://www.example.org");
-  mock_graph.page->OnMainFrameNavigationCommitted(
-      PerformanceManagerClock::NowTicks(), 10u, url);
+  mock_graph.page->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), 10u,
+                                                  url);
   EXPECT_EQ(url, mock_graph.page->main_frame_url());
   EXPECT_EQ(10u, mock_graph.page->navigation_id());
   AdvanceClock(base::TimeDelta::FromSeconds(11));
@@ -154,8 +133,8 @@
 
   // 2nd navigation.
   url = GURL("http://www.example.org/bobcat");
-  mock_graph.page->OnMainFrameNavigationCommitted(
-      PerformanceManagerClock::NowTicks(), 20u, url);
+  mock_graph.page->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), 20u,
+                                                  url);
   EXPECT_EQ(url, mock_graph.page->main_frame_url());
   EXPECT_EQ(20u, mock_graph.page->navigation_id());
   AdvanceClock(base::TimeDelta::FromSeconds(17));
diff --git a/chrome/browser/performance_manager/graph/policies/dynamic_tcmalloc_policy_linux_unittest.cc b/chrome/browser/performance_manager/graph/policies/dynamic_tcmalloc_policy_linux_unittest.cc
index fdfbff0..537d077 100644
--- a/chrome/browser/performance_manager/graph/policies/dynamic_tcmalloc_policy_linux_unittest.cc
+++ b/chrome/browser/performance_manager/graph/policies/dynamic_tcmalloc_policy_linux_unittest.cc
@@ -7,7 +7,6 @@
 #include "base/allocator/buildflags.h"
 #include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/graph_impl_operations.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
diff --git a/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_chromeos_unittest.cc b/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_chromeos_unittest.cc
index e49986d..01622f8 100644
--- a/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_chromeos_unittest.cc
+++ b/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_chromeos_unittest.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_chromeos.h"
 
 #include "base/memory/memory_pressure_listener.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/graph_impl_operations.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
diff --git a/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_unittest.cc b/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_unittest.cc
index dd8d183..406963b 100644
--- a/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_unittest.cc
+++ b/chrome/browser/performance_manager/graph/policies/working_set_trimmer_policy_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
index 94797534..a03b491 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
@@ -4,14 +4,12 @@
 
 #include "chrome/browser/performance_manager/graph/system_node_impl.h"
 
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/graph/system_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -28,26 +26,7 @@
   size_t system_event_seen_count_ = 0;
 };
 
-class SystemNodeImplTest : public GraphTestHarness {
- public:
-  void SetUp() override {
-    PerformanceManagerClock::SetClockForTesting(&clock_);
-
-    // Sets a valid starting time.
-    clock_.SetNowTicks(base::TimeTicks::Now());
-  }
-
-  void TearDown() override {
-    PerformanceManagerClock::ResetClockForTesting();
-    GraphTestHarness::TearDown();
-  }
-
- protected:
-  void AdvanceClock(base::TimeDelta delta) { clock_.Advance(delta); }
-
- private:
-  base::SimpleTestTickClock clock_;
-};
+using SystemNodeImplTest = GraphTestHarness;
 
 }  // namespace
 
diff --git a/chrome/browser/performance_manager/observers/isolation_context_metrics.cc b/chrome/browser/performance_manager/observers/isolation_context_metrics.cc
index 60ea8ba4..5cfaada 100644
--- a/chrome/browser/performance_manager/observers/isolation_context_metrics.cc
+++ b/chrome/browser/performance_manager/observers/isolation_context_metrics.cc
@@ -9,7 +9,6 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "chrome/browser/performance_manager/public/graph/node_attached_data.h"
 
 namespace performance_manager {
@@ -188,7 +187,7 @@
     // Report the state change. Flush all other related data so as not to
     // introduce bias into the metrics when only a partial reporting cycle
     // occurs.
-    const auto now = PerformanceManagerClock::NowTicks();
+    const auto now = base::TimeTicks::Now();
     ReportBrowsingInstanceData(data, old_page_count, old_state, now);
     ReportAllBrowsingInstanceData(now);
   }
@@ -316,7 +315,7 @@
 
   // Report the state change. Flush all other related data so as not to
   // introduce bias into the metrics when only a partial reporting cycle occurs.
-  const auto now = PerformanceManagerClock::NowTicks();
+  const auto now = base::TimeTicks::Now();
   ReportProcessData(data, old_state, now);
   ReportAllProcessData(now);
 }
@@ -399,7 +398,7 @@
     // Report the state change. Flush all other related data so as not to
     // introduce bias into the metrics when only a partial reporting cycle
     // occurs.
-    const auto now = PerformanceManagerClock::NowTicks();
+    const auto now = base::TimeTicks::Now();
     ReportBrowsingInstanceData(data, old_page_count, old_state, now);
     ReportAllBrowsingInstanceData(now);
   }
@@ -411,13 +410,13 @@
 }
 
 void IsolationContextMetrics::OnReportingTimerFired() {
-  const auto now = PerformanceManagerClock::NowTicks();
+  const auto now = base::TimeTicks::Now();
   ReportAllProcessData(now);
   ReportAllBrowsingInstanceData(now);
 }
 
 IsolationContextMetrics::ProcessData::ProcessData()
-    : last_reported(PerformanceManagerClock::NowTicks()) {}
+    : last_reported(base::TimeTicks::Now()) {}
 
 IsolationContextMetrics::ProcessData::~ProcessData() = default;
 
@@ -439,7 +438,7 @@
 }
 
 IsolationContextMetrics::BrowsingInstanceData::BrowsingInstanceData()
-    : last_reported(PerformanceManagerClock::NowTicks()) {}
+    : last_reported(base::TimeTicks::Now()) {}
 
 IsolationContextMetrics::BrowsingInstanceData::~BrowsingInstanceData() =
     default;
diff --git a/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc b/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
index 4fb5d527..1f222b1 100644
--- a/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
+++ b/chrome/browser/performance_manager/observers/isolation_context_metrics_unittest.cc
@@ -6,12 +6,10 @@
 
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
 
@@ -76,18 +74,12 @@
 
   void SetUp() override {
     metrics_ = new TestIsolationContextMetrics();
-    PerformanceManagerClock::SetClockForTesting(task_env().GetMockTickClock());
 
     // Sets a valid starting time.
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     graph()->PassToGraph(base::WrapUnique(metrics_));
   }
 
-  void TearDown() override {
-    PerformanceManagerClock::ResetClockForTesting();
-    GraphTestHarness::TearDown();
-  }
-
   void ExpectBrowsingInstanceData(int32_t browsing_instance_id,
                                   int page_count,
                                   int visible_page_count) {
@@ -248,7 +240,7 @@
   {
     // Advance time and add another frame to a new site instance, as a child
     // of |frame1|.
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     auto frame2 =
         CreateFrameNode(process.get(), page.get(), kBID1, kSID2, frame1.get());
     EXPECT_EQ(2u, data1->site_instance_frame_count.size());
@@ -279,7 +271,7 @@
         metrics_->kSiteInstancesPerRendererByTimeHistogram, 2, 1);
 
     // Advance time.
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
   }
 
   // The second frame will be destroyed as it goes out of scope. Expect another
@@ -311,7 +303,7 @@
   {
     // Advance time and add another frame to the same site instance, as a child
     // of |frame1|.
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     auto frame2 =
         CreateFrameNode(process.get(), page.get(), kBID1, kSID1, frame1.get());
     EXPECT_EQ(1u, data1->site_instance_frame_count.size());
@@ -348,7 +340,7 @@
         metrics_->kSiteInstancesPerRendererByTimeHistogram, 2, 1);
 
     // Advance time.
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
   }
 
   // The second frame will be destroyed as it goes out of scope. Expect another
@@ -459,7 +451,7 @@
 
   // Advance time and add another page with 1 frame in a different browsing
   // instance, but in the same process.
-  task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
   auto page2 = CreateNode<PageNodeImpl>();
   auto frame2 = CreateFrameNode(process.get(), page2.get(), kBID2, kSID2);
   frame2->SetIsCurrent(true);
@@ -476,7 +468,7 @@
   // seconds has passed for the first browsing instance, and 1 second for the
   // second browsing instance.
   {
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
 
     base::HistogramTester tester;
     page1->SetIsVisible(true);
@@ -521,7 +513,7 @@
   // Destroy the foreground page. This should trigger one more second worth
   // of reports for both pages.
   {
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
 
     base::HistogramTester tester;
     frame2.reset();
@@ -552,7 +544,7 @@
   // emitted. There was 1 second of the first page being visible in its own
   // browsing instance.
   {
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     base::HistogramTester tester;
     frame2 = CreateFrameNode(process.get(), page2.get(), kBID1, kSID2);
     frame2->SetIsCurrent(true);
@@ -569,7 +561,7 @@
   // Make the first page invisible again, and expect a transition. There was
   // 1 second of the two pages being in a visible multi-page browsing instance.
   {
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     base::HistogramTester tester;
     page1->SetIsVisible(false);
     ExpectBrowsingInstanceData(kBID1, 2, 0);
@@ -584,7 +576,7 @@
   // Tear down all of the pages and expect the metrics to flush. There was 1
   // more second of a multi-page browsing instance in the background.
   {
-    task_env().FastForwardBy(base::TimeDelta::FromSeconds(1));
+    AdvanceClock(base::TimeDelta::FromSeconds(1));
     base::HistogramTester tester;
     frame1.reset();
     frame2.reset();
diff --git a/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc b/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
index 5c8d049..bcfacf0 100644
--- a/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
+++ b/chrome/browser/performance_manager/observers/metrics_collector_unittest.cc
@@ -5,13 +5,11 @@
 #include "chrome/browser/performance_manager/observers/metrics_collector.h"
 
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "build/build_config.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "url/gurl.h"
 
@@ -35,26 +33,20 @@
 
   void SetUp() override {
     metrics_collector_ = new MetricsCollector();
-    PerformanceManagerClock::SetClockForTesting(&clock_);
-    // Sets a valid starting time.
-    clock_.SetNowTicks(base::TimeTicks::Now());
     graph()->PassToGraph(base::WrapUnique(metrics_collector_));
   }
 
   void TearDown() override {
     graph()->TakeFromGraph(metrics_collector_);  // Destroy the observer.
     metrics_collector_ = nullptr;
-    PerformanceManagerClock::ResetClockForTesting();
     GraphTestHarness::TearDown();
   }
 
  protected:
   static constexpr uint64_t kDummyID = 1u;
 
-  void AdvanceClock(base::TimeDelta delta) { clock_.Advance(delta); }
 
   base::HistogramTester histogram_tester_;
-  base::SimpleTestTickClock clock_;
 
  private:
   MetricsCollector* metrics_collector_ = nullptr;
@@ -65,8 +57,8 @@
 TEST_F(MAYBE_MetricsCollectorTest, FromBackgroundedToFirstTitleUpdatedUMA) {
   auto page_node = CreateNode<PageNodeImpl>();
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   AdvanceClock(kTestMetricsReportDelayTimeout);
 
   page_node->SetIsVisible(true);
@@ -98,8 +90,8 @@
        FromBackgroundedToFirstTitleUpdatedUMA5MinutesTimeout) {
   auto page_node = CreateNode<PageNodeImpl>();
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   page_node->SetIsVisible(false);
   page_node->OnTitleUpdated();
   // The page is within 5 minutes after main frame navigation was committed,
@@ -119,8 +111,8 @@
   auto frame_node =
       CreateNode<FrameNodeImpl>(process_node.get(), page_node.get());
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   AdvanceClock(kTestMetricsReportDelayTimeout);
 
   page_node->SetIsVisible(true);
@@ -156,8 +148,8 @@
   auto frame_node =
       CreateNode<FrameNodeImpl>(process_node.get(), page_node.get());
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   page_node->SetIsVisible(false);
   frame_node->OnNonPersistentNotificationCreated();
   // The page is within 5 minutes after main frame navigation was committed,
@@ -173,8 +165,8 @@
 TEST_F(MAYBE_MetricsCollectorTest, FromBackgroundedToFirstFaviconUpdatedUMA) {
   auto page_node = CreateNode<PageNodeImpl>();
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   AdvanceClock(kTestMetricsReportDelayTimeout);
 
   page_node->SetIsVisible(true);
@@ -206,8 +198,8 @@
        FromBackgroundedToFirstFaviconUpdatedUMA5MinutesTimeout) {
   auto page_node = CreateNode<PageNodeImpl>();
 
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
   page_node->SetIsVisible(false);
   page_node->OnFaviconUpdated();
   // The page is within 5 minutes after main frame navigation was committed,
@@ -234,8 +226,8 @@
   GURL url = GURL("https://google.com/foobar");
   ukm_recorder.UpdateSourceURL(id, url);
   page_node->SetUkmSourceId(id);
-  page_node->OnMainFrameNavigationCommitted(PerformanceManagerClock::NowTicks(),
-                                            kDummyID, kDummyUrl);
+  page_node->OnMainFrameNavigationCommitted(base::TimeTicks::Now(), kDummyID,
+                                            kDummyUrl);
 
   for (int count = 1; count < kDefaultFrequencyUkmEQTReported; ++count) {
     process_node->SetExpectedTaskQueueingDuration(
diff --git a/chrome/browser/performance_manager/performance_manager_clock.cc b/chrome/browser/performance_manager/performance_manager_clock.cc
deleted file mode 100644
index 3440de0..0000000
--- a/chrome/browser/performance_manager/performance_manager_clock.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 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/performance_manager/performance_manager_clock.h"
-
-#include "base/time/tick_clock.h"
-
-namespace performance_manager {
-
-namespace {
-
-const base::TickClock*& g_tick_clock_for_testing() {
-  static const base::TickClock* tick_clock_for_testing = nullptr;
-  return tick_clock_for_testing;
-}
-
-}  // namespace
-
-base::TimeTicks PerformanceManagerClock::NowTicks() {
-  return g_tick_clock_for_testing() ? g_tick_clock_for_testing()->NowTicks()
-                                    : base::TimeTicks::Now();
-}
-
-const base::TickClock* PerformanceManagerClock::GetClockForTesting() {
-  return g_tick_clock_for_testing();
-}
-
-void PerformanceManagerClock::ResetClockForTesting() {
-  g_tick_clock_for_testing() = nullptr;
-}
-
-void PerformanceManagerClock::SetClockForTesting(
-    const base::TickClock* tick_clock) {
-  DCHECK(!g_tick_clock_for_testing());
-  g_tick_clock_for_testing() = tick_clock;
-}
-
-}  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/performance_manager_clock.h b/chrome/browser/performance_manager/performance_manager_clock.h
deleted file mode 100644
index bb911ea5..0000000
--- a/chrome/browser/performance_manager/performance_manager_clock.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 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_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_CLOCK_H_
-#define CHROME_BROWSER_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_CLOCK_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/time/time.h"
-
-namespace base {
-class TickClock;
-}
-
-namespace performance_manager {
-
-// PerformanceManagerClock provides timing methods that the performance manager
-// needs at a central place, and facilitates testing across components when
-// clock manipulation is needed.
-class PerformanceManagerClock {
- public:
-  // Returns time from the testing TickClock if set; otherwise returns time from
-  // TimeTicks::Now().
-  static base::TimeTicks NowTicks();
-
-  static const base::TickClock* GetClockForTesting();
-
-  // Sets a TickClock for testing.
-  static void SetClockForTesting(const base::TickClock* tick_clock);
-
-  static void ResetClockForTesting();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PerformanceManagerClock);
-};
-
-}  // namespace performance_manager
-
-#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_PERFORMANCE_MANAGER_CLOCK_H_
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
index 638df22..c2b6b2c 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc
@@ -8,8 +8,6 @@
 
 #include "base/macros.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_inspector.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_impl.h"
@@ -48,22 +46,19 @@
  protected:
   SiteDataCacheImplTest()
       : data_cache_factory_(std::make_unique<SiteDataCacheFactory>()) {
-    PerformanceManagerClock::SetClockForTesting(&test_clock_);
     data_cache_ = std::make_unique<SiteDataCacheImpl>(profile_.UniqueId(),
                                                       profile_.GetPath());
     mock_db_ = new ::testing::StrictMock<MockSiteCache>();
     data_cache_->SetDataStoreForTesting(base::WrapUnique(mock_db_));
-    test_clock_.SetNowTicks(base::TimeTicks::UnixEpoch());
-    test_clock_.Advance(base::TimeDelta::FromHours(1));
     WaitForAsyncOperationsToComplete();
   }
 
-  ~SiteDataCacheImplTest() override {
-    PerformanceManagerClock::ResetClockForTesting();
-  }
-
   void TearDown() override { WaitForAsyncOperationsToComplete(); }
 
+  void AdvanceClock(base::TimeDelta delta) {
+    task_environment_.FastForwardBy(delta);
+  }
+
   void WaitForAsyncOperationsToComplete() { task_environment_.RunUntilIdle(); }
 
   // Populates |writer_|, |reader_| and |data_| to refer to a tab navigated to
@@ -92,7 +87,7 @@
     writer_->NotifyUpdatesTitleInBackground();
     EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureInUse,
               reader_->UpdatesTitleInBackground());
-    test_clock_.Advance(kDelay);
+    AdvanceClock(kDelay);
 
     // Load a second origin, make use of a feature on it too.
     ASSERT_FALSE(reader2_);
@@ -115,11 +110,11 @@
     writer2_->NotifyUpdatesFaviconInBackground();
     EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureInUse,
               reader2_->UpdatesFaviconInBackground());
-    test_clock_.Advance(kDelay);
+    AdvanceClock(kDelay);
   }
 
-  base::SimpleTestTickClock test_clock_;
-  content::BrowserTaskEnvironment task_environment_;
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   base::test::ScopedFeatureList scoped_feature_list_;
   TestingProfile profile_;
 
@@ -194,8 +189,9 @@
 
   // The information for the first site should have been cleared. The last
   // loaded time should be equal to the current time.
-  EXPECT_EQ(data_->last_loaded_time_for_testing(),
-            test_clock_.NowTicks() - base::TimeTicks::UnixEpoch());
+  EXPECT_EQ(
+      data_->last_loaded_time_for_testing().InSeconds(),
+      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSeconds());
   EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureUsageUnknown,
             reader_->UpdatesTitleInBackground());
   // The second site shouldn't have been cleared.
@@ -217,12 +213,14 @@
   ::testing::Mock::VerifyAndClear(mock_db_);
 
   // The information for both sites should have been cleared.
-  EXPECT_EQ(data_->last_loaded_time_for_testing(),
-            test_clock_.NowTicks() - base::TimeTicks::UnixEpoch());
+  EXPECT_EQ(
+      data_->last_loaded_time_for_testing().InSeconds(),
+      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSeconds());
   EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureUsageUnknown,
             reader_->UpdatesTitleInBackground());
-  EXPECT_EQ(data2_->last_loaded_time_for_testing(),
-            test_clock_.NowTicks() - base::TimeTicks::UnixEpoch());
+  EXPECT_EQ(
+      data2_->last_loaded_time_for_testing().InSeconds(),
+      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSeconds());
   EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureUsageUnknown,
             reader2_->UpdatesFaviconInBackground());
 
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_impl.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_impl.cc
index fb87358..a1535dd 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_impl.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_impl.cc
@@ -11,7 +11,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
 namespace internal {
@@ -27,7 +26,7 @@
 constexpr float kSampleWeightFactor = 0.5;
 
 base::TimeDelta GetTickDeltaSinceEpoch() {
-  return PerformanceManagerClock::NowTicks() - base::TimeTicks::UnixEpoch();
+  return base::TimeTicks::Now() - base::TimeTicks::UnixEpoch();
 }
 
 // Returns all the SiteDataFeatureProto elements contained in a
@@ -85,7 +84,7 @@
 
 void SiteDataImpl::NotifyLoadedSiteBackgrounded() {
   if (loaded_tabs_in_background_count_ == 0)
-    background_session_begin_ = PerformanceManagerClock::NowTicks();
+    background_session_begin_ = base::TimeTicks::Now();
 
   loaded_tabs_in_background_count_++;
 
@@ -225,7 +224,7 @@
       InternalRepresentationToTimeDelta(feature_proto.use_timestamp())
           .is_zero()) {
     base::TimeDelta observation_time_since_backgrounded =
-        PerformanceManagerClock::NowTicks() - background_session_begin_;
+        base::TimeTicks::Now() - background_session_begin_;
     observation_time_for_feature += observation_time_since_backgrounded;
   }
 
@@ -408,7 +407,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!background_session_begin_.is_null());
 
-  base::TimeTicks now = PerformanceManagerClock::NowTicks();
+  base::TimeTicks now = base::TimeTicks::Now();
 
   base::TimeDelta extra_observation_duration = now - background_session_begin_;
   background_session_begin_ = now;
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc
index 72a4f69b..0f84a7af 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc
@@ -8,8 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
+#include "base/test/task_environment.h"
 #include "chrome/browser/performance_manager/persistence/site_data/unittest_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -20,9 +19,6 @@
 
 namespace {
 
-constexpr base::TimeDelta kInitialTimeSinceEpoch =
-    base::TimeDelta::FromSeconds(1);
-
 class TestSiteDataImpl : public SiteDataImpl {
  public:
   using SiteDataImpl::FeatureObservationDuration;
@@ -87,23 +83,11 @@
 }  // namespace
 
 class SiteDataImplTest : public ::testing::Test {
- public:
-  SiteDataImplTest() {
-    PerformanceManagerClock::SetClockForTesting(&test_clock_);
-  }
-
-  ~SiteDataImplTest() override {
-    PerformanceManagerClock::ResetClockForTesting();
-  }
-
-  void SetUp() override {
-    test_clock_.SetNowTicks(base::TimeTicks::UnixEpoch());
-    // Advance the test clock by a small delay, as some tests will fail if the
-    // current time is equal to Epoch.
-    test_clock_.Advance(kInitialTimeSinceEpoch);
-  }
-
  protected:
+  void AdvanceClock(base::TimeDelta delta) {
+    task_environment_.FastForwardBy(delta);
+  }
+
   scoped_refptr<TestSiteDataImpl> GetDataImpl(
       const url::Origin& origin,
       SiteDataImpl::OnDestroyDelegate* destroy_delegate,
@@ -137,7 +121,9 @@
   const url::Origin kDummyOrigin = url::Origin::Create(GURL("foo.com"));
   const url::Origin kDummyOrigin2 = url::Origin::Create(GURL("bar.com"));
 
-  base::SimpleTestTickClock test_clock_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+
   // Use a NiceMock as there's no need to add expectations in these tests,
   // there's a dedicated test that ensure that the delegate works as expected.
   ::testing::NiceMock<testing::MockSiteDataImplOnDestroyDelegate>
@@ -159,9 +145,8 @@
 
   // Advance the clock by a time lower than the minimum observation time for
   // the audio feature.
-  test_clock_.Advance(
-      SiteDataImpl::GetFeatureObservationWindowLengthForTesting() -
-      base::TimeDelta::FromSeconds(1));
+  AdvanceClock(SiteDataImpl::GetFeatureObservationWindowLengthForTesting() -
+               base::TimeDelta::FromSeconds(1));
 
   // The audio feature usage is still unknown as the observation window hasn't
   // expired.
@@ -176,10 +161,13 @@
   // When a feature is in use it's expected that its recorded observation
   // timestamp is equal to the time delta since Unix Epoch when the observation
   // has been made.
-  EXPECT_EQ(local_site_data->FeatureObservationTimestamp(
-                local_site_data->site_characteristics_for_testing()
-                    .uses_audio_in_background()),
-            (test_clock_.NowTicks() - base::TimeTicks::UnixEpoch()));
+  EXPECT_EQ(
+      local_site_data
+          ->FeatureObservationTimestamp(
+              local_site_data->site_characteristics_for_testing()
+                  .uses_audio_in_background())
+          .InSeconds(),
+      (base::TimeTicks::Now() - base::TimeTicks::UnixEpoch()).InSeconds());
   EXPECT_EQ(local_site_data->FeatureObservationDuration(
                 local_site_data->site_characteristics_for_testing()
                     .uses_audio_in_background()),
@@ -187,8 +175,7 @@
 
   // Advance the clock and make sure that notifications feature gets
   // reported as unused.
-  test_clock_.Advance(
-      SiteDataImpl::GetFeatureObservationWindowLengthForTesting());
+  AdvanceClock(SiteDataImpl::GetFeatureObservationWindowLengthForTesting());
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse,
             local_site_data->UsesNotificationsInBackground());
 
@@ -214,20 +201,20 @@
   base::TimeDelta last_loaded_time =
       local_site_data->last_loaded_time_for_testing();
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   // Loading the site a second time shouldn't change the last loaded time.
   local_site_data2->NotifySiteLoaded();
   EXPECT_EQ(last_loaded_time, local_site_data2->last_loaded_time_for_testing());
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   // Unloading the site shouldn't update the last loaded time as there's still
   // a loaded instance.
   local_site_data2->NotifySiteUnloaded(TabVisibility::kForeground);
   EXPECT_EQ(last_loaded_time, local_site_data->last_loaded_time_for_testing());
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   local_site_data->NotifySiteUnloaded(TabVisibility::kForeground);
   EXPECT_NE(last_loaded_time, local_site_data->last_loaded_time_for_testing());
@@ -241,9 +228,8 @@
   local_site_data->NotifyLoadedSiteBackgrounded();
   local_site_data->NotifyUsesAudioInBackground();
 
-  test_clock_.Advance(
-      SiteDataImpl::GetFeatureObservationWindowLengthForTesting() -
-      base::TimeDelta::FromSeconds(1));
+  AdvanceClock(SiteDataImpl::GetFeatureObservationWindowLengthForTesting() -
+               base::TimeDelta::FromSeconds(1));
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
             local_site_data->UsesAudioInBackground());
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
@@ -264,7 +250,7 @@
 
   // Advancing the clock shouldn't affect the observation duration for this
   // feature.
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
   EXPECT_EQ(observation_duration_before_unload,
             local_site_data->FeatureObservationDuration(
                 local_site_data->site_characteristics_for_testing()
@@ -275,7 +261,7 @@
   local_site_data->NotifySiteLoaded();
   local_site_data->NotifyLoadedSiteBackgrounded();
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
             local_site_data->UsesAudioInBackground());
@@ -302,9 +288,12 @@
   // is really efficient (uses only one bit).
   EXPECT_EQ(0U, kZeroIntervalInternalRepresentation);
 
+  const base::TimeDelta kInitialTimeSinceEpoch =
+      base::TimeTicks::Now() - base::TimeTicks::UnixEpoch();
+
   local_site_data->NotifySiteLoaded();
   local_site_data->NotifyLoadedSiteBackgrounded();
-  test_clock_.Advance(kInterval);
+  AdvanceClock(kInterval);
   // Makes use of a feature to make sure that the observation timestamps get
   // saved.
   local_site_data->NotifyUsesAudioInBackground();
@@ -387,9 +376,9 @@
 
   // Unload the site and save the last loaded time to make sure the
   // initialization doesn't overwrite it.
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
   local_site_data->NotifySiteUnloaded(TabVisibility::kBackground);
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
   auto last_loaded = local_site_data->last_loaded_time_for_testing();
 
   // Add a couple of performance samples.
@@ -552,16 +541,16 @@
   EXPECT_EQ(0U, local_site_data->loaded_tabs_in_background_count_for_testing());
 
   local_site_data->NotifySiteLoaded();
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
   local_site_data->NotifyLoadedSiteBackgrounded();
 
   auto background_session_begin =
       local_site_data->background_session_begin_for_testing();
-  EXPECT_EQ(test_clock_.NowTicks(), background_session_begin);
+  EXPECT_EQ(base::TimeTicks::Now(), background_session_begin);
 
   EXPECT_EQ(1U, local_site_data->loaded_tabs_in_background_count_for_testing());
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   // Add a second instance of this object, this one pretending to be in
   // foreground.
@@ -572,13 +561,13 @@
   EXPECT_EQ(background_session_begin,
             local_site_data->background_session_begin_for_testing());
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   local_site_data->NotifyLoadedSiteForegrounded();
   EXPECT_EQ(0U, local_site_data->loaded_tabs_in_background_count_for_testing());
 
   auto expected_observation_duration =
-      test_clock_.NowTicks() - background_session_begin;
+      base::TimeTicks::Now() - background_session_begin;
 
   auto observed_observation_duration =
       local_site_data->FeatureObservationDuration(
@@ -587,13 +576,13 @@
 
   EXPECT_EQ(expected_observation_duration, observed_observation_duration);
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(1));
+  AdvanceClock(base::TimeDelta::FromSeconds(1));
 
   local_site_data->NotifyLoadedSiteBackgrounded();
   EXPECT_EQ(1U, local_site_data->loaded_tabs_in_background_count_for_testing());
   background_session_begin =
       local_site_data->background_session_begin_for_testing();
-  EXPECT_EQ(test_clock_.NowTicks(), background_session_begin);
+  EXPECT_EQ(base::TimeTicks::Now(), background_session_begin);
 
   local_site_data->NotifySiteUnloaded(TabVisibility::kBackground);
   local_site_data_copy->NotifySiteUnloaded(TabVisibility::kForeground);
@@ -650,9 +639,9 @@
   local_site_data_ref->NotifySiteLoaded();
   local_site_data_ref->NotifyLoadedSiteBackgrounded();
 
-  test_clock_.Advance(base::TimeDelta::FromSeconds(15));
+  AdvanceClock(base::TimeDelta::FromSeconds(15));
   local_site_data->FlushStateToProto();
-  test_clock_.Advance(base::TimeDelta::FromSeconds(15));
+  AdvanceClock(base::TimeDelta::FromSeconds(15));
 
   local_site_data->NotifyUsesAudioInBackground();
   local_site_data_ref->NotifyUsesAudioInBackground();
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc
index 1cee22d..a3f49ad 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc
@@ -12,8 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
+#include "base/test/task_environment.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_impl.h"
 #include "chrome/browser/performance_manager/persistence/site_data/unittest_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -74,9 +73,7 @@
   // SiteDataImpl is protected and not visible to
   // base::MakeRefCounted.
   SiteDataReaderTest() {
-    PerformanceManagerClock::SetClockForTesting(&test_clock_);
 
-    test_clock_.Advance(base::TimeDelta::FromSeconds(1));
     test_impl_ = base::WrapRefCounted(new internal::SiteDataImpl(
         url::Origin::Create(GURL("foo.com")), &delegate_, &data_store_));
     test_impl_->NotifySiteLoaded();
@@ -88,12 +85,14 @@
   ~SiteDataReaderTest() override {
     test_impl_->NotifySiteUnloaded(
         performance_manager::TabVisibility::kBackground);
-    PerformanceManagerClock::ResetClockForTesting();
+  }
+  void AdvanceClock(base::TimeDelta delta) {
+    task_environment_.FastForwardBy(delta);
   }
 
-  base::SimpleTestTickClock test_clock_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
-  // The mock delegate used by the SiteDataImpl objects
   // created by this class, NiceMock is used to avoid having to set expectations
   // in test cases that don't care about this.
   ::testing::NiceMock<testing::MockSiteDataImplOnDestroyDelegate> delegate_;
@@ -129,7 +128,7 @@
 
   // Advance the clock by a large amount of time, enough for the unused features
   // observation windows to expire.
-  test_clock_.Advance(base::TimeDelta::FromDays(31));
+  AdvanceClock(base::TimeDelta::FromDays(31));
 
   EXPECT_EQ(performance_manager::SiteFeatureUsage::kSiteFeatureNotInUse,
             reader_->UpdatesFaviconInBackground());
diff --git a/chrome/browser/permissions/permission_request_notification_android_unittest.cc b/chrome/browser/permissions/permission_request_notification_android_unittest.cc
index cd1e0b2..d0891d4 100644
--- a/chrome/browser/permissions/permission_request_notification_android_unittest.cc
+++ b/chrome/browser/permissions/permission_request_notification_android_unittest.cc
@@ -70,7 +70,7 @@
         std::make_unique<NotificationDisplayServiceTester>(profile_);
   }
 
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   TestingProfile* profile_;
   TestingProfileManager profile_manager_;
   content::TestWebContentsFactory test_web_contents_factory_;
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 c1881782..99693dbe 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
@@ -673,7 +673,7 @@
   RequestPictureInPictureTwiceFromSameVideo
 #endif
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
-                       RequestPictureInPictureTwiceFromSameVideo) {
+                       MAYBE_RequestPictureInPictureTwiceFromSameVideo) {
   GURL test_page_url = ui_test_utils::GetTestUrl(
       base::FilePath(base::FilePath::kCurrentDirectory),
       base::FilePath(kPictureInPictureWindowSizePage));
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
index ee73196..6de8fde 100644
--- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
+++ b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
@@ -17,11 +17,16 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/enterprise_reporting/report_generator.h"
+#include "chrome/browser/enterprise_reporting/report_scheduler.h"
+#include "chrome/browser/enterprise_reporting/request_timer.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/policy/browser_dm_token_storage.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/cloud/machine_level_user_cloud_policy_helper.h"
 #include "chrome/browser/policy/machine_level_user_cloud_policy_register_watcher.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
 #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
@@ -154,6 +159,14 @@
   if (!IsMachineLevelUserCloudPolicyEnabled())
     return;
 
+  base::PostTask(
+      FROM_HERE,
+      {base::TaskPriority::BEST_EFFORT,
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::ThreadPool()},
+      base::BindOnce(
+          &MachineLevelUserCloudPolicyController::CreateReportSchedulerAsync,
+          base::Unretained(this), base::ThreadTaskRunnerHandle::Get()));
+
   MachineLevelUserCloudPolicyManager* policy_manager =
       g_browser_process->browser_policy_connector()
           ->machine_level_user_cloud_policy_manager();
@@ -317,7 +330,40 @@
   // Start fetching policies.
   VLOG(1) << "Fetch policy after enrollment.";
   policy_fetcher_->SetupRegistrationAndFetchPolicy(dm_token, client_id);
+  if (report_scheduler_) {
+    report_scheduler_->OnDMTokenUpdated();
+  }
+
   NotifyPolicyRegisterFinished(true);
 }
 
+void MachineLevelUserCloudPolicyController::CreateReportSchedulerAsync(
+    scoped_refptr<base::SequencedTaskRunner> task_runner) {
+  task_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(
+          &MachineLevelUserCloudPolicyController::CreateReportScheduler,
+          base::Unretained(this)));
+}
+
+void MachineLevelUserCloudPolicyController::CreateReportScheduler() {
+  if (!base::FeatureList::IsEnabled(features::kEnterpriseReportingInBrowser))
+    return;
+
+  auto policy_client = std::make_unique<CloudPolicyClient>(
+      std::string() /* machine_id */, std::string() /* machine_model */,
+      std::string() /* brand_code */, std::string() /* ethernet_mac_address */,
+      std::string() /* dock_mac_address */,
+      std::string() /* manufacture_date */,
+      g_browser_process->browser_policy_connector()
+          ->device_management_service(),
+      g_browser_process->system_network_context_manager()
+          ->GetSharedURLLoaderFactory(),
+      nullptr, CloudPolicyClient::DeviceDMTokenCallback());
+  auto timer = std::make_unique<enterprise_reporting::RequestTimer>();
+  auto generator = std::make_unique<enterprise_reporting::ReportGenerator>();
+  report_scheduler_ = std::make_unique<enterprise_reporting::ReportScheduler>(
+      std::move(policy_client), std::move(timer), std::move(generator));
+}
+
 }  // namespace policy
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.h b/chrome/browser/policy/machine_level_user_cloud_policy_controller.h
index 130704e..c65d29b 100644
--- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.h
+++ b/chrome/browser/policy/machine_level_user_cloud_policy_controller.h
@@ -20,6 +20,10 @@
 class SharedURLLoaderFactory;
 }
 
+namespace enterprise_reporting {
+class ReportScheduler;
+}
+
 namespace policy {
 class ConfigurationPolicyProvider;
 class MachineLevelUserCloudPolicyManager;
@@ -89,6 +93,10 @@
       const std::string& dm_token,
       const std::string& client_id);
 
+  void CreateReportSchedulerAsync(
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
+  void CreateReportScheduler();
+
   base::ObserverList<Observer, true>::Unchecked observers_;
 
   std::unique_ptr<MachineLevelUserCloudPolicyRegistrar> policy_registrar_;
@@ -101,6 +109,8 @@
   // Time at which the enrollment process was started.  Used to log UMA metric.
   base::Time enrollment_start_time_;
 
+  std::unique_ptr<enterprise_reporting::ReportScheduler> report_scheduler_;
+
   DISALLOW_COPY_AND_ASSIGN(MachineLevelUserCloudPolicyController);
 };
 
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
index 72558b8..f564a63 100644
--- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -1058,7 +1058,7 @@
       url, safe_browsing::SB_THREAT_TYPE_URL_MALWARE);
 
   constexpr char kPrefetchCanceledHistogram[] =
-      "SB2.ResourceTypes2.UnsafePrefetchCanceled";
+      "SB2Test.ResourceTypes2.UnsafePrefetchCanceled";
 
   base::RunLoop run_loop;
   bool prefetch_canceled_histogram_added = false;
diff --git a/chrome/browser/previews/hints_fetcher_browsertest.cc b/chrome/browser/previews/hints_fetcher_browsertest.cc
index abf4dfa5..78a227a 100644
--- a/chrome/browser/previews/hints_fetcher_browsertest.cc
+++ b/chrome/browser/previews/hints_fetcher_browsertest.cc
@@ -17,6 +17,10 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
 #include "chrome/browser/metrics/subprocess_metrics_provider.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
+#include "chrome/browser/previews/previews_service.h"
+#include "chrome/browser/previews/previews_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -32,6 +36,7 @@
 #include "components/optimization_guide/optimization_guide_switches.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/optimization_guide/test_hints_component_creator.h"
+#include "components/optimization_guide/top_host_provider.h"
 #include "components/prefs/pref_service.h"
 #include "components/previews/core/previews_black_list.h"
 #include "components/previews/core/previews_features.h"
@@ -96,8 +101,9 @@
   ~HintsFetcherDisabledBrowserTest() override = default;
 
   void SetUpOnMainThread() override {
-    content::NetworkConnectionChangeSimulator().SetConnectionType(
-        network::mojom::ConnectionType::CONNECTION_2G);
+    g_browser_process->network_quality_tracker()
+        ->ReportEffectiveConnectionTypeForTesting(
+            net::EFFECTIVE_CONNECTION_TYPE_2G);
 
     InProcessBrowserTest::SetUpOnMainThread();
   }
@@ -229,6 +235,41 @@
         1);
   }
 
+  // Returns the count of top hosts that are blacklisted by reading the relevant
+  // pref.
+  size_t GetTopHostBlacklistSize() const {
+    PrefService* pref_service = browser()->profile()->GetPrefs();
+    const base::DictionaryValue* top_host_blacklist =
+        pref_service->GetDictionary(
+            optimization_guide::prefs::kHintsFetcherDataSaverTopHostBlacklist);
+    return top_host_blacklist->size();
+  }
+
+  // Adds |host_count| HTTPS origins to site engagement service.
+  void AddHostsToSiteEngagementService(size_t host_count) {
+    SiteEngagementService* service = SiteEngagementService::Get(
+        Profile::FromBrowserContext(browser()
+                                        ->tab_strip_model()
+                                        ->GetActiveWebContents()
+                                        ->GetBrowserContext()));
+    for (size_t i = 0; i < host_count; ++i) {
+      GURL https_url("https://myfavoritesite" + base::NumberToString(i) +
+                     ".com/");
+      service->AddPointsForTesting(https_url, 15);
+    }
+  }
+
+  // Returns the number of hosts known to the site engagement service. The value
+  // is obtained by querying the site engagement service.
+  size_t GetCountHostsKnownToSiteEngagementService() const {
+    SiteEngagementService* service = SiteEngagementService::Get(
+        Profile::FromBrowserContext(browser()
+                                        ->tab_strip_model()
+                                        ->GetActiveWebContents()
+                                        ->GetBrowserContext()));
+    return service->GetAllDetails().size();
+  }
+
   const GURL& https_url() const { return https_url_; }
   const base::HistogramTester* GetHistogramTester() {
     return &histogram_tester_;
@@ -425,6 +466,8 @@
   // Only the 2 HTTPS hosts should be requested hints for.
   histogram_tester->ExpectBucketCount(
       "OptimizationGuide.HintsFetcher.GetHintsRequest.HostCount", 2, 1);
+
+  EXPECT_EQ(0u, GetTopHostBlacklistSize());
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -774,11 +817,11 @@
   ui_test_utils::NavigateToURL(browser(), GURL("https://example1.com"));
 
   RetryForHistogramUntilCountReached(
-      histogram_tester, "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch",
-      1);
+      histogram_tester,
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", 1);
 
   histogram_tester->ExpectUniqueSample(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 1);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 1);
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -814,11 +857,11 @@
   ui_test_utils::NavigateToURL(browser(), GURL("https://unSeenHost.com"));
 
   RetryForHistogramUntilCountReached(
-      histogram_tester, "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch",
-      1);
+      histogram_tester,
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", 1);
 
   histogram_tester->ExpectUniqueSample(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", false, 1);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", false, 1);
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -854,5 +897,131 @@
   ui_test_utils::NavigateToURL(browser(), GURL("http://example1.com"));
 
   histogram_tester->ExpectTotalCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", 0);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", 0);
+}
+
+class HintsFetcherChangeDefaultBlacklistSizeBrowserTest
+    : public HintsFetcherBrowserTest {
+ public:
+  HintsFetcherChangeDefaultBlacklistSizeBrowserTest() = default;
+
+  ~HintsFetcherChangeDefaultBlacklistSizeBrowserTest() override = default;
+
+  void SetUp() override {
+    base::FieldTrialParams optimization_hints_fetching_params;
+    optimization_hints_fetching_params["top_host_blacklist_size_multiplier"] =
+        "5";
+
+    if (GetParam()) {
+      scoped_feature_list_.InitWithFeaturesAndParameters(
+          {
+              /* vector of enabled features along with params */
+              {optimization_guide::features::kOptimizationHintsFetching,
+               {optimization_hints_fetching_params}},
+              {optimization_guide::features::kOptimizationHints, {}},
+              {optimization_guide::features::kOptimizationGuideKeyedService,
+               {}},
+              {previews::features::kPreviews, {}},
+              {previews::features::kNoScriptPreviews, {}},
+              {previews::features::kResourceLoadingHints, {}},
+              {data_reduction_proxy::features::
+                   kDataReductionProxyEnabledWithNetworkService,
+               {}},
+              {optimization_guide::features::kOptimizationGuideKeyedService,
+               {}},
+          },
+          {/* disabled_features */});
+    } else {
+      scoped_feature_list_.InitWithFeaturesAndParameters(
+          {
+              /* vector of enabled features along with params */
+              {optimization_guide::features::kOptimizationHintsFetching,
+               {optimization_hints_fetching_params}},
+              {optimization_guide::features::kOptimizationHints, {}},
+              {optimization_guide::features::kOptimizationGuideKeyedService,
+               {}},
+              {previews::features::kPreviews, {}},
+              {previews::features::kNoScriptPreviews, {}},
+              {previews::features::kResourceLoadingHints, {}},
+              {data_reduction_proxy::features::
+                   kDataReductionProxyEnabledWithNetworkService,
+               {}},
+          },
+          {optimization_guide::features::kOptimizationGuideKeyedService, {}});
+    }
+
+    // Call to inherited class to match same set up with feature flags added.
+    HintsFetcherDisabledBrowserTest::SetUp();
+  }
+
+  void SetUpCommandLine(base::CommandLine* cmd) override {
+    cmd->AppendSwitch("enable-spdy-proxy-auth");
+
+    // Due to race conditions, it's possible that blacklist data is not loaded
+    // at the time of first navigation. That may prevent Preview from
+    // triggering, and causing the test to flake.
+    cmd->AppendSwitch(previews::switches::kIgnorePreviewsBlacklist);
+    cmd->AppendSwitch("purge_hint_cache_store");
+
+    // Set up OptimizationGuideServiceURL, this does not enable HintsFetching,
+    // only provides the URL.
+    cmd->AppendSwitchASCII(
+        optimization_guide::switches::kOptimizationGuideServiceURL,
+        hints_server_->base_url().spec());
+
+    cmd->AppendSwitch(previews::switches::kDoNotRequireLitePageRedirectInfoBar);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(HintsFetcherChangeDefaultBlacklistSizeBrowserTest);
+};
+
+// True if testing using the OptimizationGuideKeyedService implementation.
+INSTANTIATE_TEST_SUITE_P(OptimizationGuideKeyedServiceImplementation,
+                         HintsFetcherChangeDefaultBlacklistSizeBrowserTest,
+                         testing::Bool());
+
+// Changes the default size of the top host blacklist using finch. Also, sets
+// the count of hosts previously engaged to a large number and verifies that the
+// top host blacklist is correctly populated.
+IN_PROC_BROWSER_TEST_P(HintsFetcherChangeDefaultBlacklistSizeBrowserTest,
+                       ChangeDefaultBlacklistSize) {
+  AddHostsToSiteEngagementService(120u);
+  const size_t engaged_hosts = GetCountHostsKnownToSiteEngagementService();
+  EXPECT_EQ(120u, engaged_hosts);
+
+  // Ensure everything within the site engagement service fits within the top
+  // host blacklist size.
+  ASSERT_LE(
+      engaged_hosts,
+      optimization_guide::features::MaxHintsFetcherTopHostBlacklistSize());
+
+  if (GetParam()) {
+    SetTopHostBlacklistState(
+        optimization_guide::prefs::HintsFetcherTopHostBlacklistState::
+            kNotInitialized);
+  }
+
+  optimization_guide::TopHostProvider* top_host_provider = nullptr;
+  if (GetParam()) {
+    OptimizationGuideKeyedService* keyed_service =
+        OptimizationGuideKeyedServiceFactory::GetForProfile(
+            browser()->profile());
+    top_host_provider = keyed_service->GetTopHostProvider();
+  } else {
+    auto* previews_service =
+        PreviewsServiceFactory::GetForProfile(browser()->profile());
+    top_host_provider = previews_service->GetTopHostProviderForTesting();
+  }
+  ASSERT_TRUE(top_host_provider);
+
+  std::vector<std::string> top_hosts = top_host_provider->GetTopHosts(1);
+  EXPECT_EQ(0u, top_hosts.size());
+
+  top_hosts = top_host_provider->GetTopHosts(1000);
+  EXPECT_EQ(0u, top_hosts.size());
+
+  // Everything HTTPS origin within the site engagement service should now be in
+  // the blacklist.
+  EXPECT_EQ(engaged_hosts, GetTopHostBlacklistSize());
 }
diff --git a/chrome/browser/previews/previews_service.h b/chrome/browser/previews/previews_service.h
index 695b122a..711ef90 100644
--- a/chrome/browser/previews/previews_service.h
+++ b/chrome/browser/previews/previews_service.h
@@ -14,9 +14,11 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/single_thread_task_runner.h"
+#include "chrome/browser/data_saver/data_saver_top_host_provider.h"
 #include "chrome/browser/previews/previews_lite_page_decider.h"
 #include "components/blacklist/opt_out_blacklist/opt_out_blacklist_data.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/optimization_guide/top_host_provider.h"
 #include "third_party/re2/src/re2/re2.h"
 
 namespace base {
@@ -113,6 +115,10 @@
   // which DeferAllScript preview can't be shown.
   bool MatchesDeferAllScriptDenyListRegexp(const GURL& url) const;
 
+  optimization_guide::TopHostProvider* GetTopHostProviderForTesting() const {
+    return top_host_provider_.get();
+  }
+
  private:
   // The top site provider for use with the Previews Optimization Guide's Hints
   // Fetcher.
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index c16d658..24354d80 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -61,7 +61,6 @@
 #include "chrome/browser/search_engines/template_url_fetcher_factory.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h"
-#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
 #include "chrome/browser/sessions/tab_restore_service_factory.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
 #include "chrome/browser/signin/about_signin_internals_factory.h"
@@ -379,9 +378,7 @@
 #if defined(OS_ANDROID)
   SearchPermissionsService::Factory::GetInstance();
 #endif
-  if (send_tab_to_self::IsReceivingEnabled()) {
-    send_tab_to_self::SendTabToSelfClientServiceFactory::GetInstance();
-  }
+  send_tab_to_self::SendTabToSelfClientServiceFactory::GetInstance();
 #if BUILDFLAG(ENABLE_SESSION_SERVICE)
   SessionServiceFactory::GetInstance();
 #endif
diff --git a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.cc b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.cc
index 1d5bf034a..10e6b3b 100644
--- a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.cc
+++ b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.cc
@@ -88,8 +88,8 @@
     result = ScoreTabWithMRUScorer(tab, score);
   } else if (type_ == kMLScorer) {
     result = ScoreTabWithMLScorer(tab, score);
-  } else if (type_ == KPairwiseScorer) {
-    result = ScoreTabsWithPairwiseScorer(tab, TabFeatures(), score);
+  } else if (type_ == kPairwiseScorer) {
+    result = ScoreTabsPairs(tab, TabFeatures(), score);
   } else if (type_ == kFrecencyScorer) {
     result = ScoreTabWithFrecencyScorer(tab, score);
   } else {
@@ -108,17 +108,21 @@
 
 std::map<int32_t, float> TabScorePredictor::ScoreTabs(
     const std::map<int32_t, base::Optional<TabFeatures>>& tabs) {
-  std::map<int32_t, float> reactivation_scores;
-  for (const auto& pair : tabs) {
-    float score = 0.0f;
-    if (pair.second &&
-        (ScoreTab(pair.second.value(), &score) == TabRankerResult::kSuccess)) {
-      reactivation_scores[pair.first] = score;
-    } else {
-      reactivation_scores[pair.first] = std::numeric_limits<float>::max();
+  if (type_ != kPairwiseScorer) {
+    std::map<int32_t, float> reactivation_scores;
+    for (const auto& pair : tabs) {
+      float score = 0.0f;
+      if (pair.second && (ScoreTab(pair.second.value(), &score) ==
+                          TabRankerResult::kSuccess)) {
+        reactivation_scores[pair.first] = score;
+      } else {
+        reactivation_scores[pair.first] = std::numeric_limits<float>::max();
+      }
     }
+    return reactivation_scores;
+  } else {
+    return ScoreTabsWithPairwiseScorer(tabs);
   }
-  return reactivation_scores;
 }
 
 TabRankerResult TabScorePredictor::ScoreTabWithMLScorer(const TabFeatures& tab,
@@ -159,7 +163,7 @@
   if (type_ == kMLScorer)
     tfnative_model::Inference(vectorized_features.data(), score,
                               tfnative_alloc_.get());
-  if (type_ == KPairwiseScorer)
+  if (type_ == kPairwiseScorer)
     pairwise_model::Inference(vectorized_features.data(), score,
                               pairwise_alloc_.get());
 
@@ -179,32 +183,121 @@
   return TabRankerResult::kSuccess;
 }
 
-TabRankerResult TabScorePredictor::ScoreTabsWithPairwiseScorer(
-    const TabFeatures& tab1,
-    const TabFeatures& tab2,
-    float* score) {
-  // Lazy-load the preprocessor config.
-  LazyInitialize();
-  if (!preprocessor_config_ || !pairwise_alloc_) {
-    return TabRankerResult::kPreprocessorInitializationFailed;
+TabRankerResult TabScorePredictor::ScoreTabsPairs(const TabFeatures& tab1,
+                                                  const TabFeatures& tab2,
+                                                  float* score) {
+  if (type_ == kPairwiseScorer) {
+    // Lazy-load the preprocessor config.
+    LazyInitialize();
+    if (!preprocessor_config_ || !pairwise_alloc_) {
+      return TabRankerResult::kPreprocessorInitializationFailed;
+    }
+
+    // Build the RankerExamples using the tab's features.
+    assist_ranker::RankerExample example1, example2;
+    PopulateTabFeaturesToRankerExample(tab1, &example1);
+    PopulateTabFeaturesToRankerExample(tab2, &example2);
+
+    // Merge features from example2 to example1.
+    auto& features = *example1.mutable_features();
+    for (const auto& feature : example2.features()) {
+      const std::string new_name = base::StrCat({feature.first, "_1"});
+      features[new_name] = feature.second;
+    }
+
+    // Inference on example1.
+    return PredictWithPreprocess(&example1, score);
+  } else {
+    // For non-pairwise scorer, we simply calculate the score of each tab and
+    // return the difference.
+    float score1, score2;
+    const TabRankerResult result1 = ScoreTab(tab1, &score1);
+    const TabRankerResult result2 = ScoreTab(tab2, &score2);
+    *score = score1 - score2;
+    return std::max(result1, result2);
   }
-
-  // Build the RankerExamples using the tab's features.
-  assist_ranker::RankerExample example1, example2;
-  PopulateTabFeaturesToRankerExample(tab1, &example1);
-  PopulateTabFeaturesToRankerExample(tab2, &example2);
-
-  // Merge features from example2 to example1.
-  auto& features = *example1.mutable_features();
-  for (const auto& feature : example2.features()) {
-    const std::string new_name = base::StrCat({feature.first, "_1"});
-    features[new_name] = feature.second;
-  }
-
-  // Inference on example1.
-  return PredictWithPreprocess(&example1, score);
 }
 
+std::map<int32_t, float> TabScorePredictor::ScoreTabsWithPairwiseScorer(
+    const std::map<int32_t, base::Optional<TabFeatures>>& tabs) {
+  const int N = tabs.size();
+
+  std::vector<int32_t> ids;
+  for (const auto& pair : tabs) {
+    ids.push_back(pair.first);
+  }
+
+  // Sort ids by MRU first.
+  // Put the tabs without TabFeatures in front so that they won't be discarded
+  // mistakenly (including current Foregrounded tab).
+  std::sort(ids.begin(), ids.end(),
+            [&tabs](const int32_t id1, const int32_t id2) {
+              const auto& tab1 = tabs.at(id1);
+              const auto& tab2 = tabs.at(id2);
+              if (!tab1)
+                return true;
+              if (!tab2)
+                return false;
+              return tab1->mru_index < tab2->mru_index;
+            });
+
+  std::map<int32_t, float> reactivation_scores;
+
+  // start_index is the first one that has tab_features.
+  int start_index = 0;
+  for (int i = 0; i < N; ++i) {
+    if (!tabs.at(ids[i])) {
+      reactivation_scores[ids[i]] = N - i;
+      start_index = i + 1;
+    } else {
+      break;
+    }
+  }
+
+  // winning_indices records what's the best tab to be put at pos i.
+  std::vector<int> winning_indices;
+  for (int i = 0; i < N; ++i)
+    winning_indices.push_back(i);
+
+  int winning_index = N - 1;
+  int swapped_index = N - 1;
+  for (int j = start_index; j < N; ++j) {
+    // Find the best candidate at j.
+
+    // swapped_index < N - 1 means that one element has
+    // just been swapped to swapped_index, we should re-calculate
+    // winning_indices from swapped_index to j;
+    if (swapped_index < N - 1) {
+      // Set winning_index as the winning_indices at swapped_index + 1, since
+      // ids from ids.back() to ids[swapped_index + 1] are not
+      // changed.
+      winning_index = winning_indices[swapped_index + 1];
+    }
+
+    for (int i = swapped_index; i >= j; --i) {
+      // Compare ids[i] with ids[winning_index]; inference score > 0 means
+      // that ids[i] is more likely to be reactivated, so we should prefer
+      // ids[i] as new winning_index.
+      float score = 0.0f;
+      const TabRankerResult result = ScoreTabsPairs(
+          tabs.at(ids[i]).value(), tabs.at(ids[winning_index]).value(), &score);
+      if (result == TabRankerResult::kSuccess && score > 0.0f) {
+        winning_index = i;
+      }
+
+      // Always update winning_indices.
+      winning_indices[i] = winning_index;
+    }
+
+    // swap winning_index with j;
+    std::swap(ids[winning_index], ids[j]);
+    swapped_index = winning_index;
+
+    // Find the best candidate for position j, set the score for ids[j].
+    reactivation_scores[ids[j]] = N - j;
+  }
+  return reactivation_scores;
+}
 void TabScorePredictor::LazyInitialize() {
   // Load correct config and alloc based on type_.
   if (type_ == kMLScorer) {
@@ -218,7 +311,7 @@
               static_cast<std::size_t>(tfnative_model::FEATURES_SIZE));
   }
 
-  if (type_ == KPairwiseScorer) {
+  if (type_ == kPairwiseScorer) {
     if (!preprocessor_config_)
       preprocessor_config_ = LoadExamplePreprocessorConfig(
           IDR_TAB_RANKER_PAIRWISE_EXAMPLE_PREPROCESSOR_CONFIG_PB);
diff --git a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.h b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.h
index 439d129..a09ccb6c 100644
--- a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.h
+++ b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor.h
@@ -46,7 +46,7 @@
   enum ScorerType {
     kMRUScorer = 0,
     kMLScorer = 1,
-    KPairwiseScorer = 2,
+    kPairwiseScorer = 2,
     kFrecencyScorer = 3,
     kMaxValue = kFrecencyScorer
   };
@@ -69,16 +69,27 @@
       const std::map<int32_t, base::Optional<TabFeatures>>& tabs);
 
  private:
+  friend class ScoreTabsWithPairwiseScorerTest;
+
   // Loads the preprocessor config if not already loaded.
   void LazyInitialize();
 
+  // Calculates reactivation score of a single tab with mru feature.
   TabRankerResult ScoreTabWithMRUScorer(const TabFeatures& tab, float* score);
+  // Calculates reactivation score of a single tab with ml model.
   TabRankerResult ScoreTabWithMLScorer(const TabFeatures& tab, float* score);
+  // Preprocess and inferences on the |example|.
   TabRankerResult PredictWithPreprocess(assist_ranker::RankerExample* example,
                                         float* score);
-  TabRankerResult ScoreTabsWithPairwiseScorer(const TabFeatures& tab1,
-                                              const TabFeatures& tab2,
-                                              float* score);
+  // Calculates the relative reaction score between tab1 and tab2.
+  // For pairwise model, the ml model is applied to the pair(tab1, tab2).
+  // For non-pairwise model, the score is the difference of reactivation
+  // scores on these two tabs.
+  TabRankerResult ScoreTabsPairs(const TabFeatures& tab1,
+                                 const TabFeatures& tab2,
+                                 float* score);
+  std::map<int32_t, float> ScoreTabsWithPairwiseScorer(
+      const std::map<int32_t, base::Optional<TabFeatures>>& tabs);
   TabRankerResult ScoreTabWithFrecencyScorer(const TabFeatures& tab,
                                              float* score);
 
diff --git a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor_unittest.cc b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor_unittest.cc
index 36669f9..cd80be30 100644
--- a/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_ranker/tab_score_predictor_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/rand_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/resource_coordinator/tab_manager_features.h"
 #include "chrome/browser/resource_coordinator/tab_ranker/tab_features.h"
@@ -109,4 +110,86 @@
   EXPECT_FLOAT_EQ(ScoreTab(tab), 0.25874191);
 }
 
+class ScoreTabsWithPairwiseScorerTest : public testing::Test {
+ protected:
+  std::map<int32_t, float> ScoreTabsWithPairwiseScorer(
+      const std::map<int32_t, base::Optional<TabFeatures>>& tabs) {
+    return TabScorePredictor().ScoreTabsWithPairwiseScorer(tabs);
+  }
+};
+
+TEST_F(ScoreTabsWithPairwiseScorerTest, EmptyTabFeaturesFirst) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kTabRanker, {{"scorer_type", "3"}});
+
+  for (int length = 1; length < 30; ++length) {
+    // Generates random order of ids.
+    std::vector<int32_t> ids;
+    for (int i = 0; i < length; ++i) {
+      ids.push_back(i + 100);
+    }
+    base::RandomShuffle(ids.begin(), ids.end());
+
+    std::map<int32_t, base::Optional<TabFeatures>> tabs;
+    for (int i = 0; i < length; ++i) {
+      TabFeatures tab;
+      tab.mru_index = base::RandInt(0, 3000);
+      // Set the frecency score in reverse order.
+      tab.frecency_score = -i * 5;
+
+      // Set half of the TabFeatures to be null.
+      if (i < length / 2) {
+        tabs[ids[i]] = base::nullopt;
+      } else {
+        tabs[ids[i]] = tab;
+      }
+    }
+
+    const std::map<int32_t, float> scores = ScoreTabsWithPairwiseScorer(tabs);
+    for (int i = 0; i < length; ++i) {
+      if (i < length / 2) {
+        // First half should be all null which have scores > (length+1) / 2.0f;
+        EXPECT_GT(scores.at(ids[i]), (length + 1) / 2.0f);
+      } else {
+        // The second half should be non-empty tab features with descending
+        // scores.
+        EXPECT_FLOAT_EQ(scores.at(ids[i]), length - i);
+      }
+    }
+  }
+}
+
+TEST_F(ScoreTabsWithPairwiseScorerTest, SortByScore) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kTabRanker, {{"scorer_type", "3"}});
+
+  // Test all cases with length from 1 to 30.
+  for (int length = 1; length < 30; ++length) {
+    // Generates random order of ids.
+    std::vector<int32_t> ids;
+    for (int i = 0; i < length; ++i) {
+      ids.push_back(i);
+    }
+    base::RandomShuffle(ids.begin(), ids.end());
+
+    // set ids[i] to have frecency_score i*5;
+    std::map<int32_t, base::Optional<TabFeatures>> tabs;
+    for (int i = 0; i < length; ++i) {
+      TabFeatures tab;
+      tab.mru_index = base::RandInt(0, 3000);
+      tab.frecency_score = i * 5;
+      tabs[ids[i]] = tab;
+    }
+
+    const std::map<int32_t, float> scores = ScoreTabsWithPairwiseScorer(tabs);
+
+    // Should return the same order as the shuffled result.
+    for (int i = 0; i < length; ++i) {
+      EXPECT_FLOAT_EQ(scores.at(ids[i]), i + 1);
+    }
+  }
+}
+
 }  // namespace tab_ranker
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn
index 6d5a6073..8de13aa3 100644
--- a/chrome/browser/resources/chromeos/BUILD.gn
+++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -65,6 +65,7 @@
     "bluetooth_pairing_dialog:closure_compile",
     "braille_ime:closure_compile",
     "camera/src/js:closure_compile",
+    "crostini_installer:closure_compile",
     "internet_config_dialog:closure_compile",
     "internet_detail_dialog:closure_compile",
     "login:closure_compile",
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 1d03b2a..ac14615 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -1220,7 +1220,8 @@
             }
           }
           options.annotation.push(token);
-          if (selectedText && !this.formatOptions_.braille) {
+          if (selectedText && !this.formatOptions_.braille &&
+              node.state[StateType.FOCUSED]) {
             this.append_(buff, selectedText, options);
             this.append_(buff, Msgs.getMsg('selected'));
             ruleStr.writeTokenWithValue(token, selectedText);
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
index d67d251..1ba21a4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">ቡድን</translation>
 <translation id="2582407057977008361">ከጎን</translation>
 <translation id="2592212930811759050">ማርትዕ ለመጀመር ሁለቴ መታ ያድርጉ</translation>
-<translation id="2606210917827248971">ከ {COUNT,plural, =1{# ንጥል}one{# ንጥሎች}other{# ንጥሎች}}</translation>
 <translation id="2614981083756825552">የMath ML አቀማመጥ</translation>
 <translation id="2624431853467395961">የመማር ሁነታን ይክፈቱ</translation>
 <translation id="2626530649491650971">ጠቅ ሊደረግ የሚችል</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">ደመቅ ያለ ሮዝ</translation>
 <translation id="3783725005098956899">ምዝግብን አሳይ</translation>
 <translation id="3793710123303304873">ከመገናኛ ወጥተዋል።</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">የራስ-አጠናቅቅ ዝርዝር</translation>
 <translation id="3810838688059735925">ቪዲዮ</translation>
 <translation id="3813387282697781382">ፈዛዛ አረንጓዴ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
index b3eba6a..1ceb435 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">إخفاء فلاتر بث الحدث</translation>
 <translation id="1088219014394087294">ليست هناك عناوين.</translation>
 <translation id="1106741348836243114">‏تشغيل التعليقات الصوتية (earcons) أو إيقافها.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"أ": "أرنب"، "ب": "بيت"، "ت": "تفاحة"، "ث": "ثعلب"، "ج": "جزر"، "ح": "حصان"، "خ": "خوخ"، "د": "دراجة"، "ذ": "ذهب"، "ر": "ريشة"، "ز": "زرافة"، "س": "سمكة"، "ش": "شمس"، "ص": "صوص"، "ض"، "ضوء"، "ط": "طائرة"، "ظ": "ظرف"، "ع": "عصفور"، "غ": "غيمة"، "ف": "فراشة"، "ق": "قمر"، "ك": "كرة"، "ل": "ليمون"، "م": "موز"، "ن": "نجمة"، "ه": "هدية"، "و": "وردة"، "ي": "يد"}</translation>
 <translation id="1120938014254001895">التمرير السريع بإصبعين إلى الأعلى</translation>
 <translation id="1124771028211010580">نمط العرض الحالي هو جنبًا إلى جنب.</translation>
 <translation id="1126928665165112660">غير مائل</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">مجموعة</translation>
 <translation id="2582407057977008361">جانبًا</translation>
 <translation id="2592212930811759050">انقر مرّتين لبدء التعديل</translation>
-<translation id="2606210917827248971">مع {COUNT,plural, =1{عنصر واحد (#)}zero{# عنصر}two{عنصران (#)}few{# عناصر}many{# عنصرًا}other{# عنصر}}</translation>
 <translation id="2614981083756825552">تخطيط لغة التوصيف الرياضية</translation>
 <translation id="2624431853467395961">فتح وضع التعلّم</translation>
 <translation id="2626530649491650971">قابل للنقر</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">وردي برّاق</translation>
 <translation id="3783725005098956899">عرض السجلّ</translation>
 <translation id="3793710123303304873">تم إنهاء مربع الحوار.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}zero{#}two{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">إكمال تلقائي على هيئة قائمة</translation>
 <translation id="3810838688059735925">الفيديوهات</translation>
 <translation id="3813387282697781382">مرجاني فاتح</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
index bef11305..a5278d2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Странично съдържание</translation>
 <translation id="2592212930811759050">Докоснете двукратно, за да започнете да редактирате</translation>
-<translation id="2606210917827248971">с/ъс {COUNT,plural, =1{# елемент}other{# елемента}}</translation>
 <translation id="2614981083756825552">Оформление в Math ML</translation>
 <translation id="2624431853467395961">Включване на режима за изговаряне на клавишите</translation>
 <translation id="2626530649491650971">с възможност за кликване</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">ярко розово</translation>
 <translation id="3783725005098956899">Показване на регистрационния файл</translation>
 <translation id="3793710123303304873">Излязохте от диалоговия прозорец.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Автоматично довършване в списък</translation>
 <translation id="3810838688059735925">Видео</translation>
 <translation id="3813387282697781382">светло кораловочервено</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
index fc45dba6..328138b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">গ্রুপ</translation>
 <translation id="2582407057977008361">একপাশে</translation>
 <translation id="2592212930811759050">এডিট শুরু করতে ডবল-ট্যাপ করুন</translation>
-<translation id="2606210917827248971">সাথে আছে {COUNT,plural, =1{#টি আইটেম}one{#টি আইটেম}other{#টি আইটেম}}</translation>
 <translation id="2614981083756825552">গাণিতিক ML লেআউট</translation>
 <translation id="2624431853467395961">শিখন মোড খুলুন</translation>
 <translation id="2626530649491650971">ক্লিক যোগ্য</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">হট গোলাপী</translation>
 <translation id="3783725005098956899">লগ দেখুন</translation>
 <translation id="3793710123303304873">ডায়ালগ থেকে প্রস্থান করা হয়ছে৷</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">স্বতসম্পূর্ণ তালিকা</translation>
 <translation id="3810838688059735925">ভিডিও</translation>
 <translation id="3813387282697781382">হালকা প্রবাল</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
index 37897e7..7170170 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Amaga els filtres del flux d'esdeveniments</translation>
 <translation id="1088219014394087294">No hi ha cap capçalera.</translation>
 <translation id="1106741348836243114">Activa o desactiva els avisos sonors (earcons).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Fes lliscar dos dits cap amunt</translation>
 <translation id="1124771028211010580">L'estil de pantalla actual és paral·lel.</translation>
 <translation id="1126928665165112660">Sense cursiva</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">A part</translation>
 <translation id="2592212930811759050">Fes doble toc per començar a editar</translation>
-<translation id="2606210917827248971">amb {COUNT,plural, =1{# element}other{# elements}}</translation>
 <translation id="2614981083756825552">Disseny de MathML</translation>
 <translation id="2624431853467395961">Obre el mode d'aprenentatge</translation>
 <translation id="2626530649491650971">s'hi pot fer clic</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Rosa fúcsia</translation>
 <translation id="3783725005098956899">Mostra el registre</translation>
 <translation id="3793710123303304873">S'ha sortit del diàleg.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Llista de compleció automàtica</translation>
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3813387282697781382">Corall clar</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
index 19cf58b8..c278462 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Skrýt filtry streamů událostí</translation>
 <translation id="1088219014394087294">Žádné nadpisy.</translation>
 <translation id="1106741348836243114">Zapnout nebo vypnout zvukové signály.</translation>
-<translation id="1120743664840974483">{"a": "adam", "á": "dlouhé a", "b": "božena", "c": "cyril", "č": "čeněk", "d": "david", "ď": "ďáblice", "e": "emil", "ě": "e s háčkem", "é": "dlouhé e", "f": "františek", "g": "gustav", "h": "helena", "ch": "chrudim", "i": "ivan", "í": "dlouhé měkké i", "j": "josef", "k": "karel", "l": "ludvík", "m": "marie", "n": "neruda", "ň": "nina", "o": "otakar", "ó": "dlouhé o", "p": "petr", "q": "quido", "r": "rudolf", "ř": "řehoř", "s": "svatopluk", "š": "šimon", "t": "tomáš", "ť": "těšnov", "u": "urban", "ů": "u s kroužkem", "ú": "u s čárkou", "v": "václav", "w": "dvojité v", "x": "xaver", "y": "ypsilon", "ý": "dlouhé tvrdé y", "z": "zuzana", "ž": "žofie"}</translation>
+<translation id="1120743664840974483">{"a": "adam", "á": "dlouhé a", "b": "božena", "c": "cyril", "č": "čeněk", "d": "david", "ď": "ďáblice", "e": "emil", "ě": "e s háčkem", "é": "dlouhé e", "f": "františek", "g": "gustav", "h": "helena", "ch": "chrudim", "i": "ivan", "í": "dlouhé měkké i", "j": "josef", "k": "karel", "l": "ludvík", "m": "marie", "n": "neruda", "ň": "ňouma", "o": "otakar", "ó": "dlouhé o", "p": "petr", "q": "quido", "r": "rudolf", "ř": "řehoř", "s": "svatopluk", "š": "šimon", "t": "tomáš", "ť": "těšnov", "u": "urban", "ů": "u s kroužkem", "ú": "u s čárkou", "v": "václav", "w": "dvojité v", "x": "xaver", "y": "ypsilon", "ý": "dlouhé tvrdé y", "z": "zuzana", "ž": "žofie"}</translation>
 <translation id="1120938014254001895">Přejeďte dvěma prsty nahoru</translation>
 <translation id="1124771028211010580">Aktuální styl zobrazení je vedle sebe.</translation>
 <translation id="1126928665165112660">Není kurzíva</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Stranou</translation>
 <translation id="2592212930811759050">Úpravu spustíte dvojitým klepnutím</translation>
-<translation id="2606210917827248971">s {COUNT,plural, =1{# položkou}few{# položkami}many{# položky}other{# položkami}}</translation>
 <translation id="2614981083756825552">Rozvržení MathML</translation>
 <translation id="2624431853467395961">Otevřít režim výuky</translation>
 <translation id="2626530649491650971">klikatelné</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Jasně růžová</translation>
 <translation id="3783725005098956899">Zobrazit protokol</translation>
 <translation id="3793710123303304873">Opustili jste dialog.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Seznam automatického doplňování</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Světle korálová</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
index 3710234..dd65c11 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Skjul filtre for begivenhedsstreaming</translation>
 <translation id="1088219014394087294">Ingen overskrifter.</translation>
 <translation id="1106741348836243114">Slå lydfeedback (earcons) til eller fra.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "Adam", "b": "bravo", "c": "celcius", "d": "delta", "e": "Egon", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "Ida", "j": "Julie","k": "kilo", "l": "lima", "m": "Mia", "n": "november", "o": "Ole","p": "pappa", "q": "quiz", "r": "Robert", "s": "Sigurd", "t": "tango", "u": "uniform", "v": "Viktor", "w": "whiskey","x": "Xerxes", "y": "ymer", "z": "zulu", "æ": "æble", "ø": "øre", "å": "Åse"}</translation>
 <translation id="1120938014254001895">Stryg opad med to fingre</translation>
 <translation id="1124771028211010580">Aktuelt visningsformat er side om side.</translation>
 <translation id="1126928665165112660">Ikke kursiv</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Gruppe</translation>
 <translation id="2582407057977008361">Uden for</translation>
 <translation id="2592212930811759050">Tryk to gange for at redigere</translation>
-<translation id="2606210917827248971">med {COUNT,plural, =1{# element}one{# element}other{# elementer}}</translation>
 <translation id="2614981083756825552">Math ML-layout</translation>
 <translation id="2624431853467395961">Åbn indlæringstilstanden</translation>
 <translation id="2626530649491650971">klikbart</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Varm lyserød</translation>
 <translation id="3783725005098956899">Vis logfil</translation>
 <translation id="3793710123303304873">Dialogboks blev lukket.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">Autofuldførelsesliste</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Lys koralrød</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
index 81aa2e8..4b2acbc 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Filter für Ereignisstreams ausblenden</translation>
 <translation id="1088219014394087294">Keine Überschriften</translation>
 <translation id="1106741348836243114">Akustisches Feedback (Earcons) aktivieren bzw. deaktivieren</translation>
-<translation id="1120743664840974483">{"a": "Anton", "b": "Berta", "c": "Cäsar", "d": "Dora", "e": "Emil", "f": "Friedrich", "g": "Gustav", "h": "Heinrich", "i": "Ida", "j": "Julius","k": "Kaufmann", "l": "Ludwig", "m": "Martha", "n": "Nordpol", "o": "Otto","p": "Paula", "q": "Quelle", "r": "Richard", "s": "Samuel", "t": "Theodor", "u": "Ulrich", "v": "Viktor", "w": "Wilhelm","x": "Xanthippe", "y": "Ypsilon", "z": "Zacharias"}</translation>
+<translation id="1120743664840974483">{"a": "Anton", "ä": "Ärger", "b": "Berta", "c": "Cäsar", "d": "Dora", "e": "Emil", "f": "Friedrich", "g": "Gustav", "h": "Heinrich", "i": "Ida", "j": "Julius", "k": "Kaufmann", "l": "Ludwig", "m": "Martha", "n": "Nordpol", "o": "Otto", "ö": "Ökonom", "p": "Paula", "q": "Quelle", "r": "Richard", "s": "Samuel", "ß": "Eszett", "t": "Theodor", "u": "Ulrich", "ü": "Übermut", "v": "Viktor", "w": "Wilhelm", "x": "Xanthippe", "y": "Ypsilon", "z": "Zacharias"}</translation>
 <translation id="1120938014254001895">Mit zwei Fingern nach oben wischen</translation>
 <translation id="1124771028211010580">Die aktuelle Displaydarstellung ist "Nebeneinander".</translation>
 <translation id="1126928665165112660">Nicht kursiv</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Gruppe</translation>
 <translation id="2582407057977008361">Aside-Element</translation>
 <translation id="2592212930811759050">Zum Bearbeiten doppeltippen</translation>
-<translation id="2606210917827248971">mit {COUNT,plural, =1{# Eintrag}other{# Einträgen}}</translation>
 <translation id="2614981083756825552">MathML-Layout</translation>
 <translation id="2624431853467395961">Lernmodus öffnen</translation>
 <translation id="2626530649491650971">anklickbar</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Dunkelrosa</translation>
 <translation id="3783725005098956899">Protokoll anzeigen</translation>
 <translation id="3793710123303304873">Dialogfeld geschlossen</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Liste der Autovervollständigungen</translation>
 <translation id="3810838688059735925">Videos</translation>
 <translation id="3813387282697781382">Helles Korallenrot</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
index 648259c..5394acb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Απόκρυψη φίλτρων ροής συμβάντων</translation>
 <translation id="1088219014394087294">Δεν υπάρχουν επικεφαλίδες.</translation>
 <translation id="1106741348836243114">Ενεργοποίηση ή απενεργοποίηση των ηχητικών σχολίων (ηχητικά μηνύματα).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"α": "Αστέρι", "β": "Βάτραχος", "γ": "Γάτα", "δ": "Δέντρο", "ε": "Ελέφαντας", "ζ": "Ζάρι", "η": "Ήλιος", "θ": "Θησαυρός", "ι": "Ιππότης", "κ": "Κότα","λ": "Λαγός", "μ": "Μήλο", "ν": "Νάνος", "ξ": "Ξιφίας", "ο": "Ομπρέλα","π": "Πάπια", "ρ": "Ρόδι", "σ": "Σαλιγκάρι", "τ": "Τρένο", "υ": "Υποβρύχιο", "φ": "Φεγγάρι", "χ": "Χελιδόνι", "ψ": "Ψάρι","ω": "Ώρα"}</translation>
 <translation id="1120938014254001895">Σύρετε δύο δάκτυλα προς τα πάνω</translation>
 <translation id="1124771028211010580">Το τρέχον στυλ προβολής είναι η παράθεση.</translation>
 <translation id="1126928665165112660">Δεν είναι πλάγια γραφή</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Ομάδα</translation>
 <translation id="2582407057977008361">Ετικέτα "εκτός" (aside)</translation>
 <translation id="2592212930811759050">Πατήστε δύο φορές για να ξεκινήσετε την επεξεργασία</translation>
-<translation id="2606210917827248971">με {COUNT,plural, =1{# στοιχείο}other{# στοιχεία}}</translation>
 <translation id="2614981083756825552">Διάταξη Math ML</translation>
 <translation id="2624431853467395961">Άνοιγμα λειτουργίας εκμάθησης</translation>
 <translation id="2626530649491650971">με δυνατότητα κλικ</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Έντονο ροζ</translation>
 <translation id="3783725005098956899">Εμφάνιση αρχείου καταγραφής</translation>
 <translation id="3793710123303304873">Έξοδος από το παράθυρο διαλόγου.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Λίστα αυτόματης συμπλήρωσης</translation>
 <translation id="3810838688059735925">Βίντεο</translation>
 <translation id="3813387282697781382">Ανοιχτό κοραλλί</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
index b30307a..bcea315 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Group</translation>
 <translation id="2582407057977008361">Aside</translation>
 <translation id="2592212930811759050">Double-tap to start editing</translation>
-<translation id="2606210917827248971">with {COUNT,plural, =1{# item}other{# items}}</translation>
 <translation id="2614981083756825552">Math ML Layout</translation>
 <translation id="2624431853467395961">Open learn mode</translation>
 <translation id="2626530649491650971">clickable</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Hot pink</translation>
 <translation id="3783725005098956899">Show log</translation>
 <translation id="3793710123303304873">Exited dialogue.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Auto-completion list</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Light Coral</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
index 8b890db1..f2acdf4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">Lateral</translation>
 <translation id="2592212930811759050">Presiona dos veces para comenzar a editar</translation>
-<translation id="2606210917827248971">con {COUNT,plural, =1{# elemento}other{# elementos}}</translation>
 <translation id="2614981083756825552">Diseño de MathML</translation>
 <translation id="2624431853467395961">Abrir el modo de aprendizaje</translation>
 <translation id="2626530649491650971">elemento en el que se puede hacer clic</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Fucsia</translation>
 <translation id="3783725005098956899">Mostrar registro</translation>
 <translation id="3793710123303304873">Saliste del cuadro de diálogo.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Lista de autocompletados</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Coral claro</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
index dae55b4..5057543d1 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Ocultar filtros de emisión de eventos</translation>
 <translation id="1088219014394087294">No hay títulos.</translation>
 <translation id="1106741348836243114">Activa o desactiva el sonido.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "Alicante", "b": "Barcelona", "c": "Cáceres", "d": "Dinamarca", "e": "España", "f": "Francia", "g": "Granada", "h": "Huelva", "i": "Italia", "j": "Jaén","k": "kilo", "l": "Lugo", "m": "Madrid", "n": "Navarra", "ñ": "ñoño", "o": "Oviedo","p": "Pamplona", "q": "queso", "r": "Roma", "s": "Sevilla", "t": "Toledo", "u": "Ucrania", "v": "Vitoria", "w": "Washington","x": "xilófono", "y": "Yugoslavia", "z": "Zaragoza"}</translation>
 <translation id="1120938014254001895">Desliza dos dedos hacia arriba</translation>
 <translation id="1124771028211010580">El estilo de presentación actual es en paralelo.</translation>
 <translation id="1126928665165112660">Sin cursiva</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">Etiqueta de contenido tangencial</translation>
 <translation id="2592212930811759050">Toca dos veces para empezar a editar</translation>
-<translation id="2606210917827248971">con {COUNT,plural, =1{# elemento}other{# elementos}}</translation>
 <translation id="2614981083756825552">Diseño de MathML</translation>
 <translation id="2624431853467395961">Abrir modo de aprendizaje</translation>
 <translation id="2626530649491650971">elemento en el que se puede hacer clic</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Rosa fucsia</translation>
 <translation id="3783725005098956899">Mostrar registro</translation>
 <translation id="3793710123303304873">Has salido del cuadro de diálogo.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Lista de autocompletados</translation>
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3813387282697781382">Coral claro</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
index 900bef5..5473b19 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Sündmuste voo filtrite peitmine</translation>
 <translation id="1088219014394087294">Pealkirju ei ole.</translation>
 <translation id="1106741348836243114">Lülitage helitagasiside (helisignaalid) sisse või välja.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "braavo", "c": "charlie", "d": "delta", "e": "eesti", "f": "fokstrott", "g": "golf", "h": "hotell", "i": "india", "j": "juuni","k": "kilo", "l": "liim", "m": "mati", "n": "november", "o": "oskar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "š": "šokolaad", "z": "zoo", "ž": "žanr",  "t": "tango", "u": "uni", "v": "viktor", "w": "wales","x": "xavier", "y": "yankee", "õ": "õnne", "ä": "ärni", "ö": "ööbik", "ü": "ülle"}</translation>
 <translation id="1120938014254001895">Pühkige kahe sõrmega üles</translation>
 <translation id="1124771028211010580">Praegu on valitud kuvastiil Kõrvuti.</translation>
 <translation id="1126928665165112660">Ei ole kursiivis</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Rühm</translation>
 <translation id="2582407057977008361">Kõrvale</translation>
 <translation id="2592212930811759050">Topeltpuudutage muutmise alustamiseks</translation>
-<translation id="2606210917827248971">koos {COUNT,plural, =1{# üksusega}other{# üksusega}}</translation>
 <translation id="2614981083756825552">Math ML-i paigutus</translation>
 <translation id="2624431853467395961">Õppimisrežiimi avamine</translation>
 <translation id="2626530649491650971">klõpsatav</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Erkroosa</translation>
 <translation id="3783725005098956899">Kuva logi</translation>
 <translation id="3793710123303304873">Väljus dialoogist.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Loendi automaatne täitmine</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Hele korallroosa</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
index ae1f339..157d287 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">گروه</translation>
 <translation id="2582407057977008361">جدا</translation>
 <translation id="2592212930811759050">برای شروع ویرایش، دو ضربه سریع بزنید</translation>
-<translation id="2606210917827248971">با {COUNT,plural, =1{# مورد}one{# مورد}other{# مورد}}</translation>
 <translation id="2614981083756825552">‏چیدمان ML ریاضی</translation>
 <translation id="2624431853467395961">باز کردن حالت یادگیری</translation>
 <translation id="2626530649491650971">قابل کلیک</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">صورتی پررنگ</translation>
 <translation id="3783725005098956899">نمایش گزارش</translation>
 <translation id="3793710123303304873">از گفتگو خارج شد.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">فهرست تکمیل خودکار</translation>
 <translation id="3810838688059735925">فیلم</translation>
 <translation id="3813387282697781382">مرجانی روشن</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
index 38e675a..e5b6e40 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Ryhmä</translation>
 <translation id="2582407057977008361">Aside-tunniste</translation>
 <translation id="2592212930811759050">Aloita muokkaus kaksoisnapauttamalla</translation>
-<translation id="2606210917827248971">jossa on {COUNT,plural, =1{# kohde}other{# kohdetta}}</translation>
 <translation id="2614981083756825552">Math ML -asettelu</translation>
 <translation id="2624431853467395961">Avaa opettelutila</translation>
 <translation id="2626530649491650971">klikattava</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Pinkki</translation>
 <translation id="3783725005098956899">Näytä loki</translation>
 <translation id="3793710123303304873">Valintaikkuna suljettiin.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Ennakoivan tekstinsyötön luettelo</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Vaalea koralli</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
index 2e72c6f..79df6c86 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Pangkat</translation>
 <translation id="2582407057977008361">Kaugnay</translation>
 <translation id="2592212930811759050">I-double tap para simulan ang pag-edit</translation>
-<translation id="2606210917827248971">may {COUNT,plural, =1{# item}one{# item}other{# na item}}</translation>
 <translation id="2614981083756825552">Math ML Layout</translation>
 <translation id="2624431853467395961">Buksan ang learn mode</translation>
 <translation id="2626530649491650971">naki-click</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Hot Pink</translation>
 <translation id="3783725005098956899">Ipakita ang Log</translation>
 <translation id="3793710123303304873">Lumabas sa dialog.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">Listahan ng autocompletion</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Light Coral</translation>
@@ -484,7 +482,7 @@
 <translation id="4372705107434148843">Ihinto ang speech</translation>
 <translation id="4373197658375206385">Walang nakaraang item na hindi isang link.</translation>
 <translation id="4376316291247992553">Tingnan ang Graphic Bilang Braille</translation>
-<translation id="437809255587011096">Ianunsyo ang pag-istilo ng text</translation>
+<translation id="437809255587011096">Ianunsyo ang istilo ng text</translation>
 <translation id="4378308539633073595">Mag-scroll pasulong</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4391478986194775161">cntntinfo</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
index bf0cc76e..e9be595 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Masquer les filtres de flux d'événements</translation>
 <translation id="1088219014394087294">Aucun titre</translation>
 <translation id="1106741348836243114">Activer ou désactiver les commentaires audio (icônes audio)</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliett","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "x-ray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Balayer l'écran vers le haut avec deux doigts</translation>
 <translation id="1124771028211010580">Le style d'affichage actuel est "côte à côte".</translation>
 <translation id="1126928665165112660">Pas en italique</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Groupe</translation>
 <translation id="2582407057977008361">Contenu relatif</translation>
 <translation id="2592212930811759050">Appuyer deux fois pour commencer la modification</translation>
-<translation id="2606210917827248971">avec {COUNT,plural, =1{1 élément}one{# élément}other{# éléments}}</translation>
 <translation id="2614981083756825552">Mise en page MathML</translation>
 <translation id="2624431853467395961">Ouvrir le mode d'apprentissage</translation>
 <translation id="2626530649491650971">cliquable</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Rose foncé</translation>
 <translation id="3783725005098956899">Afficher le journal</translation>
 <translation id="3793710123303304873">Vous avez quitté la boîte de dialogue.</translation>
-<translation id="3795836767122514678">et{COUNT,plural, =1{# autre}one{# autre}other{# autres}}</translation>
 <translation id="3801735343383419236">Saisie semi-automatique sous forme de liste</translation>
 <translation id="3810838688059735925">Vidéo</translation>
 <translation id="3813387282697781382">Corail clair</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
index 355d931..37c1fc8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">ઇવેન્ટ સ્ટ્રીમ ફિલ્ટર છુપાવો</translation>
 <translation id="1088219014394087294">કોઇ મથાળું નથી.</translation>
 <translation id="1106741348836243114">સાઉન્ડ પ્રતિસાદ (ઇઅરકોન્સ) ચાલુ અથવા બંધ કરો.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "આલ્ફા", "b": "બ્રાવો", "c": "ચાર્લી", "d": "ડેલ્ટા", "e": "ઇકો", "f": "ફોક્સટ્રોટ", "g": "ગોલ્ફ", "h": "હોટલ", "i": "ઇન્ડિયા", "j": "જુલિયેટ","k": "કિલો", "l": "લીમા", "m": "માઇક", "n": "નવેમ્બર", "o": "ઑસ્કાર","p": "પાપા", "q": "ક્વેબેક", "r": "રોમિયો", "s": "સિયેરા", "t": "ટેંગો", "u": "યુનિફોર્મ", "v": "વિક્ટર", "w": "વ્હિસ્કી","x": "એક્સરે", "y": "યેંકી", "z": "ઝુલુ"}</translation>
 <translation id="1120938014254001895">બે આંગળી ઉપરની બાજુ સ્વાઇપ કરો</translation>
 <translation id="1124771028211010580">વર્તમાન ડિસ્પ્લે શૈલી "સાથેસાથે" છે.</translation>
 <translation id="1126928665165112660">ઇટાલિક નથી</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">જૂથ</translation>
 <translation id="2582407057977008361">એક તરફ</translation>
 <translation id="2592212930811759050">ફેરફાર શરૂ કરવા માટે બે વાર ટૅપ કરો</translation>
-<translation id="2606210917827248971">આ સાથેની {COUNT,plural, =1{# આઇટમ}one{# આઇટમ}other{# આઇટમ}}</translation>
 <translation id="2614981083756825552">ગણિત ML લેઆઉટ</translation>
 <translation id="2624431853467395961">જાણો મોડ ખોલો</translation>
 <translation id="2626530649491650971">ક્લિક કરી શકાય તેવા</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ચળકતો ગુલાબી</translation>
 <translation id="3783725005098956899">લૉગ બતાવો</translation>
 <translation id="3793710123303304873">સંવાદમાંથી બહાર થયા.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">સ્વતઃપૂર્ણ સૂચિ</translation>
 <translation id="3810838688059735925">વીડિયો</translation>
 <translation id="3813387282697781382">આછો લાલ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index 6366455cc..3b9d24b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">इवेंट स्ट्रीम फ़िल्टर छिपाएं</translation>
 <translation id="1088219014394087294">कोई शीर्षक नहीं.</translation>
 <translation id="1106741348836243114">ध्वनि फ़ीडबैक (ईयरकॉन) चालू या बंद करें.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "अल्फ़ा", "b": "ब्रावो", "c": "चार्ली", "d": "डेल्टा", "e": "एको", "f": "फ़ॉक्सट्रॉट", "g": "गोल्फ़", "h": "होटल", "i": "इंडिया", "j": "जूलिएट","k": "किलो", "l": "लीमा", "m": "माइक", "n": "नवंबर", "o": "ऑस्कर","p": "पापा", "q": "क्वेबेक", "r": "रोमियो", "s": "सिएरा", "t": "टैंगो", "u": "यूनिफ़ॉर्म", "v": "विक्टर", "w": "व्हिस्की","x": "एक्सरे", "y": "येंकी", "z": "ज़ुलु"}</translation>
 <translation id="1120938014254001895">दो उंगलियों से ऊपर स्वाइप करें</translation>
 <translation id="1124771028211010580">मौजूदा डिसप्ले शैली आमने-सामने है.</translation>
 <translation id="1126928665165112660">इटैलिक नहीं है</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">समूह</translation>
 <translation id="2582407057977008361">अलग</translation>
 <translation id="2592212930811759050">बदलाव शुरू करने के लिए दो बार टैप करें</translation>
-<translation id="2606210917827248971">इनके साथ {COUNT,plural, =1{# आइटम}one{# आइटम}other{# आइटम}}</translation>
 <translation id="2614981083756825552">गणित ML लेआउट</translation>
 <translation id="2624431853467395961">जानें मोड खोलें</translation>
 <translation id="2626530649491650971">क्‍लिक करने योग्‍य</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">चमकीला गुलाबी</translation>
 <translation id="3783725005098956899">लॉग दिखाएं</translation>
 <translation id="3793710123303304873">डॉयलॉग से बाहर हो गए हैं.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">अपने आप पूरा होने वालों की सूची</translation>
 <translation id="3810838688059735925">वीडियो</translation>
 <translation id="3813387282697781382">हल्के मूंगे जैसा रंग</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
index 97d7a924..17e37b6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">Pored</translation>
 <translation id="2592212930811759050">Dvaput dodirnite za početak uređivanja</translation>
-<translation id="2606210917827248971">s {COUNT,plural, =1{# stavkom}one{# stavkom}few{# stavke}other{# stavki}}</translation>
 <translation id="2614981083756825552">Math ML raspored</translation>
 <translation id="2624431853467395961">Otvaranje načina vodiča</translation>
 <translation id="2626530649491650971">može se kliknuti</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Jarko ružičasta</translation>
 <translation id="3783725005098956899">Prikaži datoteku zapisnika</translation>
 <translation id="3793710123303304873">Napustili ste dijaloški okvir.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}few{#}other{#}}</translation>
 <translation id="3801735343383419236">Popis automatskog dovršavanja</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Svijetlokoraljna</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
index c853903..a220878 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Csoport</translation>
 <translation id="2582407057977008361">Oldaltartalom</translation>
 <translation id="2592212930811759050">Koppintson duplán a szerkesztés megkezdéséhez</translation>
-<translation id="2606210917827248971">{COUNT,plural, =1{# elemmel}other{# elemmel}}</translation>
 <translation id="2614981083756825552">Matematikai „ML” elrendezés</translation>
 <translation id="2624431853467395961">Tanuló mód megnyitása</translation>
 <translation id="2626530649491650971">rákattintható</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Élénk rózsaszín</translation>
 <translation id="3783725005098956899">Napló megjelenítése</translation>
 <translation id="3793710123303304873">Kilépett a párbeszédpanelből.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Automatikus kiegészítés listaként</translation>
 <translation id="3810838688059735925">Videó</translation>
 <translation id="3813387282697781382">Világos korallpiros</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
index 21dcf71..cda6c72 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Sembunyikan filter streaming acara</translation>
 <translation id="1088219014394087294">Tanpa judul.</translation>
 <translation id="1106741348836243114">Mengaktifkan atau menonaktifkan masukan suara (earcons).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "eko", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oskar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "yuniform", "v": "viktor", "w": "wiski","x": "eksray", "y": "yangki", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Geser dua jari ke atas</translation>
 <translation id="1124771028211010580">Gaya tampilan saat ini adalah berdampingan.</translation>
 <translation id="1126928665165112660">Tidak miring</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">Pinggir</translation>
 <translation id="2592212930811759050">Ketuk dua kali untuk mulai mengedit</translation>
-<translation id="2606210917827248971">dengan {COUNT,plural, =1{# item}other{# item}}</translation>
 <translation id="2614981083756825552">Tata Letak Math ML</translation>
 <translation id="2624431853467395961">Buka mode pembelajaran</translation>
 <translation id="2626530649491650971">dapat diklik</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Merah Muda Terang</translation>
 <translation id="3783725005098956899">Tampilkan Log</translation>
 <translation id="3793710123303304873">Keluar dari dialog.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Pelengkapan otomatis daftar</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Light Coral</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
index d43bfda4..fc5c0433 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Gruppo</translation>
 <translation id="2582407057977008361">Di lato</translation>
 <translation id="2592212930811759050">Tocca due volte per iniziare la modifica</translation>
-<translation id="2606210917827248971">con {COUNT,plural, =1{# voce}other{# voci}}</translation>
 <translation id="2614981083756825552">Layout MathML</translation>
 <translation id="2624431853467395961">Apri la modalità di apprendimento</translation>
 <translation id="2626530649491650971">selezionabile</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Fucsia</translation>
 <translation id="3783725005098956899">Mostra log</translation>
 <translation id="3793710123303304873">Finestra di dialogo chiusa.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Elenco di completamento automatico</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Corallo chiaro</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
index 76db0323..4799595 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">קבוצה</translation>
 <translation id="2582407057977008361">בצד</translation>
 <translation id="2592212930811759050">לחיצה פעמיים מפעילה עריכה</translation>
-<translation id="2606210917827248971">עם {COUNT,plural, =1{פריט אחד}two{שני פריטים}many{# פריטים}other{# פריטים}}</translation>
 <translation id="2614981083756825552">‏פריסת Math ML</translation>
 <translation id="2624431853467395961">פתח מצב למידה</translation>
 <translation id="2626530649491650971">clickable</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ורוד בוהק</translation>
 <translation id="3783725005098956899">הצגת היומן</translation>
 <translation id="3793710123303304873">יצאת מתיבת דו-שיח.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}two{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">רשימת השלמה אוטומטית</translation>
 <translation id="3810838688059735925">וידאו</translation>
 <translation id="3813387282697781382">אלמוג בהיר</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
index 0d373dc..9b13557 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">グループ</translation>
 <translation id="2582407057977008361">補足</translation>
 <translation id="2592212930811759050">編集を開始するにはダブルタップします</translation>
-<translation id="2606210917827248971">に {COUNT,plural, =1{# 件の項目}other{# 件の項目}}</translation>
 <translation id="2614981083756825552">MathML レイアウト</translation>
 <translation id="2624431853467395961">学習モードを開く</translation>
 <translation id="2626530649491650971">クリック可能</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ホットピンク</translation>
 <translation id="3783725005098956899">ログを表示</translation>
 <translation id="3793710123303304873">ダイアログを終了しました。</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">オートコンプリートはリスト形式</translation>
 <translation id="3810838688059735925">動画</translation>
 <translation id="3813387282697781382">ライトコーラル</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
index 1f4cc71..5a6db7e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">ಈವೆಂಟ್ ಸ್ಟ್ರೀಮ್ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="1088219014394087294">ಯಾವುದೇ ಶೀರ್ಷಿಕೆಗಳಿಲ್ಲ.</translation>
 <translation id="1106741348836243114">ಧ್ವನಿ ಪ್ರತಿಕ್ರಿಯೆ (earcons) ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಿ.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "ಆಲ್ಫಾ", "b": "ಬ್ರಾವೋ", "c": "ಚಾರ್ಲಿ", "d": "ಡೆಲ್ಟಾ", "e": "ಇಕೋ", "f": "ಫಾಕ್ಸ್‌ಟ್ರಾಟ್", "g": "ಗಾಲ್ಫ್", "h": "ಹೋಟೆಲ್", "i": "ಇಂಡಿಯಾ", "j": "ಜೂಲಿಯೆಟ್","k": "ಕಿಲೋ", "l": "ಲಿಮಾ", "m": "ಮೈಕ್", "n": "ನವೆಂಬರ್", "o": "ಆಸ್ಕರ್","p": "ಪಾಪಾ", "q": "ಕ್ವಿಬೆಕ್", "r": "ರೋಮಿಯೋ", "s": "ಸಿಯೆರಾ", "t": "ಟ್ಯಾಂಗೋ", "u": "ಯುನಿಫಾರ್ಮ್", "v": "ವಿಕ್ಟರ್", "w": "ವಿಸ್ಕಿ","x": "ಎಕ್ಸ್‌ರೇ", "y": "ಯಾಂಕೀ", "z": "ಜುಲು"}</translation>
 <translation id="1120938014254001895">ಎರಡು ಬೆರಳುಗಳಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ</translation>
 <translation id="1124771028211010580">ಪ್ರಸ್ತುತ ಡಿಸ್‌ಪ್ಲೇ ಶೈಲಿ ಅಕ್ಕ ಪಕ್ಕ ಆಗಿದೆ.</translation>
 <translation id="1126928665165112660">ಇಟಾಲಿಕ್ ಅಲ್ಲ</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">ಗುಂಪು</translation>
 <translation id="2582407057977008361">ಹೊರತಾಗಿ</translation>
 <translation id="2592212930811759050">ಎಡಿಟಿಂಗ್ ಪ್ರಾರಂಭಿಸಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ</translation>
-<translation id="2606210917827248971">ಜೊತೆ {COUNT,plural, =1{# ಐಟಂ}one{# ಐಟಂಗಳು}other{# ಐಟಂಗಳು}}</translation>
 <translation id="2614981083756825552">ಗಣಿತ ML ಲೇಔಟ್</translation>
 <translation id="2624431853467395961">ಕಲಿಕೆ ಮೋಡ್‌ ತೆರೆಯಿರಿ</translation>
 <translation id="2626530649491650971">ಕ್ಲಿಕ್ ಮಾಡಬಹುದಾದ</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ಗಾಢ ಗುಲಾಬಿ</translation>
 <translation id="3783725005098956899">ಲಾಗ್ ತೋರಿಸಿ</translation>
 <translation id="3793710123303304873">ನಿರ್ಗಮಿಸಲಾದ ಸಂವಾದ.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆ ಪಟ್ಟಿ</translation>
 <translation id="3810838688059735925">ವೀಡಿಯೊ</translation>
 <translation id="3813387282697781382">ತಿಳಿ ಹವಳದ ಬಣ್ಣ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
index debe3a6..c7c68da 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">그룹</translation>
 <translation id="2582407057977008361">사이드 바</translation>
 <translation id="2592212930811759050">수정하려면 두 번 탭하세요.</translation>
-<translation id="2606210917827248971">에{COUNT,plural, =1{항목 #개 포함}other{항목 #개 포함}}</translation>
 <translation id="2614981083756825552">Math ML 레이아웃</translation>
 <translation id="2624431853467395961">학습 모드 열기</translation>
 <translation id="2626530649491650971">clickable</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">진한 분홍색</translation>
 <translation id="3783725005098956899">로그 표시</translation>
 <translation id="3793710123303304873">대화상자를 종료했습니다.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">자동완성 목록</translation>
 <translation id="3810838688059735925">동영상</translation>
 <translation id="3813387282697781382">라이트 코럴</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
index 94e90cc..50448dd8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupė</translation>
 <translation id="2582407057977008361">Šalia</translation>
 <translation id="2592212930811759050">Norėdami pradėti redaguoti palieskite dukart</translation>
-<translation id="2606210917827248971">su {COUNT,plural, =1{# elementu}one{# elementu}few{# elementais}many{# elemento}other{# elementų}}</translation>
 <translation id="2614981083756825552">Matematikos žymėjimo kalbos išdėstymas</translation>
 <translation id="2624431853467395961">Atidarykite mokomąjį režimą</translation>
 <translation id="2626530649491650971">spustelėjamas</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Ryškiai rausva</translation>
 <translation id="3783725005098956899">Rodyti žurnalą</translation>
 <translation id="3793710123303304873">Išeita iš dialogo lango.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Sąrašo automatinis užbaigimas</translation>
 <translation id="3810838688059735925">Vaizdo</translation>
 <translation id="3813387282697781382">Šviesi koralų spalva</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
index 8f84b5f7..9297854a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">malā novietots saturs</translation>
 <translation id="2592212930811759050">Veiciet dubultskārienu, lai sāktu rediģēšanu</translation>
-<translation id="2606210917827248971">ar {COUNT,plural, =1{# vienumu}zero{# vienumiem}one{# vienumu}other{# vienumiem}}</translation>
 <translation id="2614981083756825552">MathML izkārtojums</translation>
 <translation id="2624431853467395961">Atvērt mācību režīmu</translation>
 <translation id="2626530649491650971">klikšķināms</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Spilgti rozā</translation>
 <translation id="3783725005098956899">Rādīt žurnālu</translation>
 <translation id="3793710123303304873">Tika aizvērts dialoglodziņš.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}zero{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">Automātiskā pabeigšana: saraksts</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Gaiša koraļļu</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
index 987a628f..d767fe2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">ഇവന്റ് സ്‌ട്രീം ഫിൽട്ടറുകൾ അദൃശ്യമാക്കുക</translation>
 <translation id="1088219014394087294">ശീർഷകങ്ങളൊന്നുമില്ല.</translation>
 <translation id="1106741348836243114">ശബ്‌ദ ഫീഡ്‌ബാക്ക് (ഇയർകോൺസ്) ഓണാക്കുക അല്ലെങ്കിൽ ഓഫാക്കുക.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "ആൽഫ", "b": "ബ്രാവോ", "c": "ചാർലി", "d": "ഡെൽറ്റ", "e": "എക്കോ", "f": "ഫോക്സ്ട്രോറ്റ്", "g": "ഗോൾഫ്", "h": "ഹോട്ടൽ", "i": "ഇന്ത്യ", "j": "ജൂലിയറ്റ്","k": "കിലോ", "l": "ലിമ", "m": "മൈക്ക്", "n": "നവംബർ", "o": "ഓസ്കാർ","p": "പപ്പ", "q": "ക്വബാക്", "r": "റോമിയോ", "s": "സീറ", "t": "ടാങ്കോ", "u": "യൂണിഫോം", "v": "വിക്ടർ", "w": "വിസ്കി","x": "എക്സ്റേ", "y": "യാങ്കി", "z": "സുളു"}</translation>
 <translation id="1120938014254001895">രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക</translation>
 <translation id="1124771028211010580">നിലവിലുള്ള ഡിസ്‌പ്ലേ ശൈലി വശങ്ങളിൽ കാണിക്കുന്ന തരത്തിലാണ്.</translation>
 <translation id="1126928665165112660">ഇറ്റാലിക്ക് അല്ല</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">ഗ്രൂപ്പ്</translation>
 <translation id="2582407057977008361">അരികിൽ</translation>
 <translation id="2592212930811759050">എഡിറ്റിംഗ് ആരംഭിക്കാൻ രണ്ടുതവണ ടാപ്പ് ചെയ്യുക</translation>
-<translation id="2606210917827248971">ഇവ ഉൾപ്പെടുന്നു {COUNT,plural, =1{# ഇനം}other{# ഇനങ്ങൾ}}</translation>
 <translation id="2614981083756825552">മാത്ത് ML ലേഔട്ട്</translation>
 <translation id="2624431853467395961">"അറിയുക" മോഡ് തുറക്കുക</translation>
 <translation id="2626530649491650971">ക്ലിക്കുചെയ്യാവുന്നത്</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">ഹോട്ട് പിങ്ക്</translation>
 <translation id="3783725005098956899">ലോഗ് കാണിക്കുക</translation>
 <translation id="3793710123303304873">ഡയലോഗിൽ നിന്ന് പുറത്തുകടന്നു.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">യാന്ത്രികപൂർത്തീകരണം ലിസ്റ്റ്</translation>
 <translation id="3810838688059735925">വീഡിയോ</translation>
 <translation id="3813387282697781382">ഇളം കോറൽ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
index df2ce714..454fbae 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">इव्हेंट स्ट्रीम फिल्टर लपवा</translation>
 <translation id="1088219014394087294">कोणतेही मथळे नाहीत.</translation>
 <translation id="1106741348836243114">ध्वनी अभिप्राय (इअरकॉन) चालू किंवा बंद करा.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "अल्फा", "b": "ब्रेव्हो", "c": "चार्ली", "d": "डेल्टा", "e": "इको", "f": "फॉक्सट्रॉट", "g": "गोल्फ", "h": "हॉटेल", "i": "इंडिया", "j": "जुलिएट","k": "किलो", "l": "लिमा", "m": "माइक", "n": "नोव्हेंबर", "o": "ऑस्कर","p": "पापा", "q": "क्वेबेक", "r": "रोमिओ", "s": "सीएरा", "t": "टँगो", "u": "युनिफॉर्म", "v": "व्हिक्टर", "w": "व्हिस्की","x": "एक्सरे", "y": "यंकी", "z": "झुलू"}</translation>
 <translation id="1120938014254001895">दोन बोटांनी वरच्या दिशेला स्वाइप करा</translation>
 <translation id="1124771028211010580">वर्तमान डिस्प्ले आकार शेजारी-शेजारी आहे.</translation>
 <translation id="1126928665165112660">तिर्यक नाही</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">गट</translation>
 <translation id="2582407057977008361">बाजूचा</translation>
 <translation id="2592212930811759050">संपादन सुरू करण्यासाठी दोनदा टॅप करा</translation>
-<translation id="2606210917827248971">यासह {COUNT,plural, =1{# आयटम}other{# आयटम}}</translation>
 <translation id="2614981083756825552">Math ML लेआउट</translation>
 <translation id="2624431853467395961">जाणून घ्या मोड उघडा</translation>
 <translation id="2626530649491650971">क्लिक करण्‍यायोग्य</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">गडद गुलाबी</translation>
 <translation id="3783725005098956899">लॉग दाखवा</translation>
 <translation id="3793710123303304873">डायलॉगच्या बाहेर पडले.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">अॉटोकंप्लीशन सूची</translation>
 <translation id="3810838688059735925">व्हिडिओ</translation>
 <translation id="3813387282697781382">फिकट लाल</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
index 80233e4c..1db7cc3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Kumpulan</translation>
 <translation id="2582407057977008361">Ke sebelah</translation>
 <translation id="2592212930811759050">Ketik dua kali untuk mula mengedit</translation>
-<translation id="2606210917827248971">dengan {COUNT,plural, =1{# item}other{# item}}</translation>
 <translation id="2614981083756825552">Reka Letak ML Matematik</translation>
 <translation id="2624431853467395961">Buka mod belajar</translation>
 <translation id="2626530649491650971">boleh klik</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Merah Jambu Hangat</translation>
 <translation id="3783725005098956899">Tunjukkan Log</translation>
 <translation id="3793710123303304873">Keluar dari dialog.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Senarai autolengkap</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Batu Karang Cerah</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
index 8ca5b88..b3503da 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Filters voor gebeurtenisstream verbergen</translation>
 <translation id="1088219014394087294">Geen koppen.</translation>
 <translation id="1106741348836243114">Geluidsfeedback (earcons) in- of uitschakelen.</translation>
-<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliett","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "anna", "b": "bernard", "c": "cornelis", "d": "dirk", "e": "eduard", "f": "ferdinand", "g": "gerard", "h": "hendrik", "i": "izaak", "j": "johannes", "k": "karel", "l": "lodewijk", "m": "maria", "n": "nico", "o": "otto","p": "pieter", "q": "quirinus", "r": "rudolf", "s": "simon", "t": "tinus", "u": "utrecht", "v": "victor", "w": "willem","x": "xantippe", "y": "ypsilon", "z": "zaandam"}</translation>
 <translation id="1120938014254001895">Veeg met twee vingers omhoog</translation>
 <translation id="1124771028211010580">De huidige weergavestijl is naast elkaar.</translation>
 <translation id="1126928665165112660">Niet cursief</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Groep</translation>
 <translation id="2582407057977008361">Terzijde</translation>
 <translation id="2592212930811759050">Dubbeltik om te beginnen met bewerken</translation>
-<translation id="2606210917827248971">met {COUNT,plural, =1{# item}other{# items}}</translation>
 <translation id="2614981083756825552">MathML-indeling</translation>
 <translation id="2624431853467395961">Leermodus openen</translation>
 <translation id="2626530649491650971">klikbaar</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Felroze</translation>
 <translation id="3783725005098956899">Logbestand weergeven</translation>
 <translation id="3793710123303304873">Dialoogvenster afgesloten.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Automatisch lijst aanvullen</translation>
 <translation id="3810838688059735925">Videobestanden</translation>
 <translation id="3813387282697781382">Lichtkoraal</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
index 2c1997b..b999c99 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Skjul filtre for aktivitetsstrømmer</translation>
 <translation id="1088219014394087294">Det fins ingen overskrifter.</translation>
 <translation id="1106741348836243114">Slå tilbakemelding via lydsignaler av eller på.</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu", "æ": "ærlig", "ø": "østen", "å": "Åse"}</translation>
+<translation id="1120743664840974483">{"a": "Anna", "b": "Bernhard", "c": "Cæsar", "d": "David", "e": "Edith", "f": "Fredrik", "g": "Gustav", "h": "Harald", "i": "Ivar", "j": "Johan","k": "Karin", "l": "Ludvig", "m": "Martin", "n": "Nils", "o": "Olivia","p": "Petter", "q": "Quintus", "r": "Rikard", "s": "Sigrid", "t": "Teodor", "u": "Ulrik", "v": "enkelt-v", "w": "dobbelt-v","x": "Xerxes", "y": "yngling", "z": "Zakarias", "æ": "ærlig", "ø": "østen", "å": "Åse"}</translation>
 <translation id="1120938014254001895">Sveip to fingre opp</translation>
 <translation id="1124771028211010580">Nåværende visningsstil er side om side.</translation>
 <translation id="1126928665165112660">Ikke kursivert</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Gruppe</translation>
 <translation id="2582407057977008361">Aside-tag</translation>
 <translation id="2592212930811759050">Dobbelttrykk for å begynne å redigere</translation>
-<translation id="2606210917827248971">med {COUNT,plural, =1{# element}other{# elementer}}</translation>
 <translation id="2614981083756825552">MathML-utforming</translation>
 <translation id="2624431853467395961">Åpne læremodus</translation>
 <translation id="2626530649491650971">klikkbart</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Knallrosa</translation>
 <translation id="3783725005098956899">Vis logg</translation>
 <translation id="3793710123303304873">Lukket dialogen.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Autofullføringsliste</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Lys korallrød</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
index 9ffd199c..2f023c3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupa</translation>
 <translation id="2582407057977008361">Z boku</translation>
 <translation id="2592212930811759050">Kliknij dwukrotnie, by rozpocząć edycję</translation>
-<translation id="2606210917827248971">z {COUNT,plural, =1{# elementem}few{# elementami}many{# elementami}other{# elementu}}</translation>
 <translation id="2614981083756825552">Układ MathML</translation>
 <translation id="2624431853467395961">Otwórz tryb informacyjny</translation>
 <translation id="2626530649491650971">klikalny</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Ciepłoróżowy</translation>
 <translation id="3783725005098956899">Pokaż dziennik</translation>
 <translation id="3793710123303304873">Okno dialogowe zostało zamknięte</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Autouzupełnianie list</translation>
 <translation id="3810838688059735925">Wideo</translation>
 <translation id="3813387282697781382">Jasnokoralowy</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
index cdf2631d..91a3ecac 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Ocultar filtros de stream de eventos</translation>
 <translation id="1088219014394087294">Nenhum cabeçalho.</translation>
 <translation id="1106741348836243114">Ativa ou desativa o feedback sonoro (earcons).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "x-ray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Deslize para cima usando dois dedos</translation>
 <translation id="1124771028211010580">O estilo de exibição atual está definido como lado a lado.</translation>
 <translation id="1126928665165112660">Sem itálico</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">Lateral</translation>
 <translation id="2592212930811759050">Toque duas vezes para começar a editar</translation>
-<translation id="2606210917827248971">com {COUNT,plural, =1{# item}one{# itens}other{# itens}}</translation>
 <translation id="2614981083756825552">Layout Math ML</translation>
 <translation id="2624431853467395961">Abre o modo de aprendizado</translation>
 <translation id="2626530649491650971">clicável</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Rosa-escuro</translation>
 <translation id="3783725005098956899">Mostrar registro</translation>
 <translation id="3793710123303304873">Caixa de diálogo fechada.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}other{#}}</translation>
 <translation id="3801735343383419236">Lista de preenchimento automático</translation>
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3813387282697781382">Coral-claro</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
index 6b575002..d10c3ac 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Ocultar filtros de transmissões de eventos</translation>
 <translation id="1088219014394087294">Não existe nenhum título.</translation>
 <translation id="1106741348836243114">Ativar ou desativar respostas sonoras (ícones sonoros).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliett","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "x-ray", "y": "yankee", "z": "zulu"}</translation>
 <translation id="1120938014254001895">Deslizar rapidamente com dois dedos para cima</translation>
 <translation id="1124771028211010580">O estilo atual do ecrã é lado a lado.</translation>
 <translation id="1126928665165112660">Sem itálico</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupo</translation>
 <translation id="2582407057977008361">À parte</translation>
 <translation id="2592212930811759050">Toque duas vezes para começar a editar.</translation>
-<translation id="2606210917827248971">com {COUNT,plural, =1{# item}other{# itens}}</translation>
 <translation id="2614981083756825552">Esquema de Matemática ML</translation>
 <translation id="2624431853467395961">Abrir modo de aprendizagem</translation>
 <translation id="2626530649491650971">clicável</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Rosa choque</translation>
 <translation id="3783725005098956899">Mostrar registo</translation>
 <translation id="3793710123303304873">Saiu da caixa de diálogo.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Lista de preenchimento automático</translation>
 <translation id="3810838688059735925">Vídeo</translation>
 <translation id="3813387282697781382">Coral claro</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
index 2efaaeaf..1b87df4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Ascunde filtrele pentru fluxul de evenimente</translation>
 <translation id="1088219014394087294">Nu există titluri.</translation>
 <translation id="1106741348836243114">Activați/dezactivați feedbackul sonor (semnalele audio).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{„a”: „alfa”, „ă”: „ăla”, „â”: „â din a”, „b”: „bravo”, „c”: „Charlie”, „d”: „delta”, „e”: „ecou”, „f”: „foxtrot”, „g”: „golf”, „h”: „hotel”, „i”: „India”, „î”: „început”, „j”: „Julieta”, „k”: „kilogram”, „l”: „Lima”, „m”: „Mike”, „n”: „noiembrie”, „o”: „Oscar”, „p”: „papa”, „q”: „Quebec”, „r”: „Romeo”, „s”: „sierra”, „ș”: „șarpe”, „t”: „tango”, „ț”: „țară”, „u”: „uniformă”, „v”: „Victor”, „w”: „whisky”, „x”: „xilofon”, „y”: „yankeu”, „z”: „zulu”}</translation>
 <translation id="1120938014254001895">Glisează cu două degete în sus</translation>
 <translation id="1124771028211010580">Stilul de afișare actual este alăturat.</translation>
 <translation id="1126928665165112660">Fără cursiv</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">Separat</translation>
 <translation id="2592212930811759050">Atinge de două ori pentru a începe editarea</translation>
-<translation id="2606210917827248971">cu {COUNT,plural, =1{# element}few{# elemente}other{# de elemente}}</translation>
 <translation id="2614981083756825552">Aspect Math ML</translation>
 <translation id="2624431853467395961">Deschide modul de învățare</translation>
 <translation id="2626530649491650971">pe care se poate da clic</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Roz aprins</translation>
 <translation id="3783725005098956899">Afișează jurnalul</translation>
 <translation id="3793710123303304873">S-a ieșit din caseta de dialog.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}few{#}other{#}}</translation>
 <translation id="3801735343383419236">Completare automată listă</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Corai deschis</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
index 10306b44..456431f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Группа.</translation>
 <translation id="2582407057977008361">Боковой блок.</translation>
 <translation id="2592212930811759050">Нажмите дважды, чтобы начать редактировать</translation>
-<translation id="2606210917827248971">из {COUNT,plural, =1{# пункта}one{# пункта}few{# пунктов}many{# пунктов}other{# пункта}}</translation>
 <translation id="2614981083756825552">Схема MathML.</translation>
 <translation id="2624431853467395961">Перейти в режим обучения</translation>
 <translation id="2626530649491650971">clickable</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Ярко-розовый</translation>
 <translation id="3783725005098956899">Показать журнал</translation>
 <translation id="3793710123303304873">Диалоговое окно закрыто.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Список автозаполнения</translation>
 <translation id="3810838688059735925">Видео</translation>
 <translation id="3813387282697781382">Светло-коралловый</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
index d42cbb7..6998bf1 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Vedľa</translation>
 <translation id="2592212930811759050">Začnite upravovať dvojitým klepnutím</translation>
-<translation id="2606210917827248971">s {COUNT,plural, =1{# položkou}few{# položkami}many{# položkami}other{# položkami}}</translation>
 <translation id="2614981083756825552">Rozloženie jazyka Math ML</translation>
 <translation id="2624431853467395961">Otvoriť režim učenia</translation>
 <translation id="2626530649491650971">kliknuteľné</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Jasnoružová</translation>
 <translation id="3783725005098956899">Zobraziť denník</translation>
 <translation id="3793710123303304873">Ukončili ste dialógové okno</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Zoznam automatického dopĺňania</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Svetlokoralová</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
index 4b8b06a..f7fd909 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Skritje filtrov toka dogodkov</translation>
 <translation id="1088219014394087294">Ni naslovov.</translation>
 <translation id="1106741348836243114">Vklop/izklop zvočnih povratnih informacij (zvočnih ikon).</translation>
-<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "celje", "d": "delta", "e": "eho", "f": "fokstrot", "g": "golf", "h": "hotel", "i": "indija", "j": "julija","k": "kilo", "l": "lima", "m": "maribor", "n": "november", "o": "oskar","p": "postojna", "q": "quebec", "r": "romeo", "s": "sežana", "t": "tango", "u": "uniforma", "v": "viktor", "w": "wroclaw","x": "xenia", "y": "yukon", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"a": "alfa", "b": "bravo", "c": "celje", "č": "časopis", "d": "delta", "e": "eho", "f": "fokstrot", "g": "golf", "h": "hotel", "i": "indija", "j": "julija", "k": "kilo", "l": "lima", "m": "maribor", "n": "november", "o": "oskar", "p": "postojna", "q": "quebec", "r": "romeo", "s": "sežana", "š": "štajerska", "t": "tango", "u": "uniforma", "v": "viktor", "w": "washington", "x": "iks", "y": "youtube", "z": "zulu", "ž": "žaba"}</translation>
 <translation id="1120938014254001895">Z dvema prstoma povlecite gor</translation>
 <translation id="1124771028211010580">Trenutno je izbran vzporedni slog prikaza.</translation>
 <translation id="1126928665165112660">Ni ležeče</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Skupina</translation>
 <translation id="2582407057977008361">Razen</translation>
 <translation id="2592212930811759050">Dvakrat se dotaknite, če želite začeti urejati</translation>
-<translation id="2606210917827248971">s/z {COUNT,plural, =1{# elementom}one{# elementom}two{# elementoma}few{# elementi}other{# elementi}}</translation>
 <translation id="2614981083756825552">Postavitev Math ML</translation>
 <translation id="2624431853467395961">Odpiranje načina za učenje</translation>
 <translation id="2626530649491650971">omogoča klikanje</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Živo rožnata</translation>
 <translation id="3783725005098956899">Prikaz dnevnika</translation>
 <translation id="3793710123303304873">Izhod iz pogovornega okna.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}two{#}few{#}other{#}}</translation>
 <translation id="3801735343383419236">Samodokončanje seznama</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Svetlo koralna</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
index 0c5fd3c..751201f3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Сакриј филтере стрима догађаја</translation>
 <translation id="1088219014394087294">Нема заглавља.</translation>
 <translation id="1106741348836243114">Укључивање или искључивање звучних повратних информација (звучна обавештења).</translation>
-<translation id="1120743664840974483">{"a": "alpha", "b": "bravo", "c": "charlie", "d": "delta", "e": "echo", "f": "foxtrot", "g": "golf", "h": "hotel", "i": "india", "j": "juliet","k": "kilo", "l": "lima", "m": "mike", "n": "november", "o": "oscar","p": "papa", "q": "quebec", "r": "romeo", "s": "sierra", "t": "tango", "u": "uniform", "v": "victor", "w": "whiskey","x": "xray", "y": "yankee", "z": "zulu"}</translation>
+<translation id="1120743664840974483">{"а": "авала", "б": "београд", "ц": "цетиње", "д": "дрина", "е": "европа", "ф": "футог", "г": "голија", "х": "херој", "и": "игало", "ј": "јадран", "к": "косово", "л": "ловћен", "м": "морава", "н": "ниш", "о": "обилић", "п": "пирот", "q": "кворум", "р": "рума", "с": "сава", "т": "тимок", "у": "ужице", "в": "ваљево", "w": "дупло ве", "x": "ксилофон", "y": "ипсилон", "з": "земун", "ћ": "ћуприја", "ч": "чачак", "џ": "џеп", "ђ": "ђаковица", "љ": "љубовија", "њ": "његош", "ш": "шабац", "ж": "жабљак"}</translation>
 <translation id="1120938014254001895">Превлачите нагоре помоћу два прста</translation>
 <translation id="1124771028211010580">Актуелни стил приказа је „упоредо“.</translation>
 <translation id="1126928665165112660">Није курзив</translation>
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Додатно</translation>
 <translation id="2592212930811759050">Двапут додирните да бисте почели да мењате</translation>
-<translation id="2606210917827248971">са {COUNT,plural, =1{# ставком}one{# ставком}few{# ставке}other{# ставки}}</translation>
 <translation id="2614981083756825552">Math ML распоред</translation>
 <translation id="2624431853467395961">Отвара режим за учење</translation>
 <translation id="2626530649491650971">елемент на који може да се кликне</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Јаркорозе</translation>
 <translation id="3783725005098956899">Прикажи евиденцију</translation>
 <translation id="3793710123303304873">Изашли сте из дијалога.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}few{#}other{#}}</translation>
 <translation id="3801735343383419236">Аутоматско довршавање листе</translation>
 <translation id="3810838688059735925">Видео</translation>
 <translation id="3813387282697781382">Светлоцрвена</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
index 3e8509f..eeed030 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Grupp</translation>
 <translation id="2582407057977008361">Sidopanel</translation>
 <translation id="2592212930811759050">Börja redigera genom att trycka snabbt två gånger</translation>
-<translation id="2606210917827248971">med {COUNT,plural, =1{# objekt}other{# objekt}}</translation>
 <translation id="2614981083756825552">Math ML-layout</translation>
 <translation id="2624431853467395961">Öppna inlärningsläge</translation>
 <translation id="2626530649491650971">klickbart</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Cerise</translation>
 <translation id="3783725005098956899">Visa logg</translation>
 <translation id="3793710123303304873">Dialogrutan stängdes.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Autoslutför med lista</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Ljust korallröd</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
index 96f1d14e..3988756d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Kikundi</translation>
 <translation id="2582407057977008361">Kando</translation>
 <translation id="2592212930811759050">Gusa mara mbili ili uanze kubadilisha</translation>
-<translation id="2606210917827248971">ina {COUNT,plural, =1{Kipengee #}other{Vipengee #}}</translation>
 <translation id="2614981083756825552">Mpangilio wa Hisabati ML</translation>
 <translation id="2624431853467395961">Fungua hali ya kujifunza</translation>
 <translation id="2626530649491650971">kinabofyeka</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Waridi Inayong'aa</translation>
 <translation id="3783725005098956899">Onyesha Kumbukumbu</translation>
 <translation id="3793710123303304873">Umeondoka kwenye kidirisha.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Orodha inayojijaza kiotomatiki</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Waridi Inayofifia</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
index af490434..8c0574e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">குழு</translation>
 <translation id="2582407057977008361">Aside</translation>
 <translation id="2592212930811759050">திருத்துவதற்கு, இருமுறை தட்டவும்</translation>
-<translation id="2606210917827248971">பட்டியலில் {COUNT,plural, =1{# உருப்படி}other{# உருப்படிகள்}}</translation>
 <translation id="2614981083756825552">கணித ML தளவமைப்பு</translation>
 <translation id="2624431853467395961">கற்றல் பயன்முறையைத் திறக்கவும்</translation>
 <translation id="2626530649491650971">கிளிக் செய்யத்தக்கது</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ஹாட் பிங்க்</translation>
 <translation id="3783725005098956899">பதிவைக் காட்டு</translation>
 <translation id="3793710123303304873">செய்தியில் இருந்து வெளியேறினார்.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">தானே நிரப்புதல் பட்டியல்</translation>
 <translation id="3810838688059735925">வீடியோ</translation>
 <translation id="3813387282697781382">லைட் கோரல்</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
index 5abe3f60..710a9a8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">సమూహం</translation>
 <translation id="2582407057977008361">ప్రక్కన</translation>
 <translation id="2592212930811759050">సవరణను ప్రారంభించడానికి రెండుసార్లు నొక్కండి</translation>
-<translation id="2606210917827248971">{COUNT,plural, =1{# అంశంతో}other{# అంశాలతో}}</translation>
 <translation id="2614981083756825552">గణిత ML లేఅవుట్</translation>
 <translation id="2624431853467395961">తెలుసుకునే మోడ్‌ను తెరవండి</translation>
 <translation id="2626530649491650971">క్లిక్ చేయదగినది</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">ముదురు గులాబి రంగు</translation>
 <translation id="3783725005098956899">లాగ్‌ను చూపు</translation>
 <translation id="3793710123303304873">నిష్క్రమణ డైలాగ్.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">స్వీయపూర్తి జాబితా</translation>
 <translation id="3810838688059735925">వీడియో</translation>
 <translation id="3813387282697781382">పగడం వంటి లేత ఎర్రని రంగు</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
index 3e3e182..a1dd4e0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">กลุ่ม</translation>
 <translation id="2582407057977008361">ส่วนที่ไม่เกี่ยวข้อง</translation>
 <translation id="2592212930811759050">แตะสองครั้งเพื่อเริ่มแก้ไข</translation>
-<translation id="2606210917827248971">ที่มี {COUNT,plural, =1{# รายการ}other{# รายการ}}</translation>
 <translation id="2614981083756825552">รูปแบบ ML คณิตศาสตร์</translation>
 <translation id="2624431853467395961">เปิดโหมดการเรียนรู้</translation>
 <translation id="2626530649491650971">คลิกได้</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">ชมพูเจิดจ้า</translation>
 <translation id="3783725005098956899">แสดงบันทึก</translation>
 <translation id="3793710123303304873">ออกจากช่องโต้ตอบแล้ว</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">รายการเติมข้อความอัตโนมัติ</translation>
 <translation id="3810838688059735925">วิดีโอ</translation>
 <translation id="3813387282697781382">สีส้มอมชมพูอ่อน</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
index 23fc544..4fde8598 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Etkinlik akış filtrelerini gizle</translation>
 <translation id="1088219014394087294">Başlık yok.</translation>
 <translation id="1106741348836243114">Sesli geri bildirimi (ses sinyalleri) aç veya kapat.</translation>
-<translation id="1120743664840974483">{"a": "adana", "b": "bolu", "c": "ceyhan", "ç": "çanakkale", "d": "denizli", "e": "edirne", "f": "fatsa", "g": "giresun", "ğ": "yumuşak ge", "h": "hatay", "ı": "ısparta", "i": "izmir", "j": "jandarma", "k": "kayseri", "l": "lüleburgaz", "m": "muş", "n": "niğde", "o": "ordu","p": "polatlı", "r": "rize", "s": "sinop", "ş": "şırnak", "t": "tokat", "u": "uşak", "ü": "ünye", "v": "van", "y": "yozgat", "z": "zonguldak"}</translation>
+<translation id="1120743664840974483">{"a": "adana", "b": "bolu", "c": "ceyhan", "ç": "çanakkale", "d": "denizli", "e": "edirne", "f": "fatsa", "g": "giresun", "ğ": "yumuşak ge", "h": "hatay", "ı": "ısparta", "i": "izmir", "j": "jandarma", "k": "kars", "l": "lüleburgaz", "m": "muş", "n": "niğde", "o": "ordu", "ö": "ödemiş", "p": "polatlı", "r": "rize", "s": "sinop", "ş": "şırnak", "t": "tokat", "u": "uşak", "ü": "ünye", "v": "van", "y": "yozgat", "z": "zonguldak"}</translation>
 <translation id="1120938014254001895">İki parmağınızı yukarı kaydırın</translation>
 <translation id="1124771028211010580">Mevcut görüntüleme stili yan yanadır.</translation>
 <translation id="1126928665165112660">İtalik değil</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Grup</translation>
 <translation id="2582407057977008361">Kenar</translation>
 <translation id="2592212930811759050">Düzenlemeye başlamak için iki kez dokunun</translation>
-<translation id="2606210917827248971">{COUNT,plural, =1{# öğeyle}other{# öğeyle}}</translation>
 <translation id="2614981083756825552">Matematik ML Düzeni</translation>
 <translation id="2624431853467395961">Öğrenme modunu açar</translation>
 <translation id="2626530649491650971">tıklanabilir</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Canlı Pembe</translation>
 <translation id="3783725005098956899">Günlüğü Göster</translation>
 <translation id="3793710123303304873">İletişim kutusundan çıkıldı.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Otomatik tamamlama listesi</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Açık Mercan</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
index f6e989b..11a02002 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -20,7 +20,7 @@
 <translation id="1087788677726983142">Сховати фільтри потоку подій</translation>
 <translation id="1088219014394087294">Немає заголовків.</translation>
 <translation id="1106741348836243114">Увімкнути або вимкнути звуковий сигнал (звуковий ефект).</translation>
-<translation id="1120743664840974483">{"а": "а-зОт", "б": "бОн-да-рів-на", "в": "віт-ро-гон", "г": "га-ра-кі-рі", "ґ": "ґо-ґо-дзи", "д": "до-ли-на", "е": "ерг", "є": "єд-ність-то-си-ла", "ж": "жа-б'є-се-ло", "з": "зо-ло-ту-ха", "и": "то-не-во-но", "і": "І-ван", "ї": "їж-хто-го-ло-ден", "й": "йди-хо-лод-ком", "к": "ко-лі-но", "л": "лі-со-ру-би", "м": "мо-роз", "н": "но-га", "о": "о-ко-лот", "п": "при-мо-роз-ки", "р": "ри-бонь-ка", "с": "са-ха-ра", "т": "тон", "у": "у-па-док", "ф": "фі-лан-тро-пи", "х": "хо-ло-до-чок", "ц": "цьо-ця-дор-ця", "ч": "чор-но-го-ра", "ш": "шо-ло-ви-ло", "щ": "що-ро-ку-мо-роз", "ь": "то-м'я-кий-тон" "ю": "ю-рій-ко-роль", "я": "я-ро-шен-ко"}</translation>
+<translation id="1120743664840974483">{"а": "андрій", "б": "богдан", "в": "василь", "г": "григорій", "ґ": "ґудзик", "д": "дмитро", "е": "еней", "є": "євген", "ж": "жук", "з": "зеновій", "и": "ігрек", "і": "іван", "ї": "їжак", "й": "йосип", "к": "кіловат", "л": "левко", "м": "марія", "н": "наталка", "о": "ольга", "п": "павло", "р": "роман", "с": "степан", "т": "тарас", "у": "україна", "ф": "федір", "х": "христина", "ц": "центр", "ч": "чоловік", "ш": "шура", "щ": "щука", "ь": "м'який знак", "ю": "юрій", "я": "яків"}</translation>
 <translation id="1120938014254001895">Проведіть двома пальцями вгору</translation>
 <translation id="1124771028211010580">Поточний стиль дисплея – паралельний перегляд.</translation>
 <translation id="1126928665165112660">Без курсиву</translation>
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">Група</translation>
 <translation id="2582407057977008361">Бічний колонтитул</translation>
 <translation id="2592212930811759050">Двічі торкніться, щоб змінити текст</translation>
-<translation id="2606210917827248971">з {COUNT,plural, =1{1 пунктом}one{# пунктом}few{# пунктами}many{# пунктами}other{# пункту}}</translation>
 <translation id="2614981083756825552">Розмітка Math ML</translation>
 <translation id="2624431853467395961">Відкрити сторінку "Докладніше"</translation>
 <translation id="2626530649491650971">інтерактивний</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">Яскраво-рожевий</translation>
 <translation id="3783725005098956899">Показати журнал</translation>
 <translation id="3793710123303304873">Ви закрили діалогове вікно.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}one{#}few{#}many{#}other{#}}</translation>
 <translation id="3801735343383419236">Список автозавершення</translation>
 <translation id="3810838688059735925">Відео</translation>
 <translation id="3813387282697781382">Світло-кораловий</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
index 99e14e00..32f4d43 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">Nhóm</translation>
 <translation id="2582407057977008361">Loại trừ</translation>
 <translation id="2592212930811759050">Nhấn đúp để bắt đầu chỉnh sửa</translation>
-<translation id="2606210917827248971">với {COUNT,plural, =1{# mục}other{# mục}}</translation>
 <translation id="2614981083756825552">Bố cục toán học ML</translation>
 <translation id="2624431853467395961">Mở chế độ học</translation>
 <translation id="2626530649491650971">có thể nhấp được</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">Hồng đậm</translation>
 <translation id="3783725005098956899">Hiển thị nhật ký</translation>
 <translation id="3793710123303304873">Đã thoát khỏi hộp thoại.</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">Tự động hoàn thành danh sách</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3813387282697781382">Màu san hô nhạt</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
index fac52f25..2b176aa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -206,7 +206,6 @@
 <translation id="257674075312929031">群组</translation>
 <translation id="2582407057977008361">边栏内容</translation>
 <translation id="2592212930811759050">点按两次即可开始修改</translation>
-<translation id="2606210917827248971">包含 {COUNT,plural, =1{# 项内容}other{# 项内容}}</translation>
 <translation id="2614981083756825552">数学标记语言布局</translation>
 <translation id="2624431853467395961">打开学习模式</translation>
 <translation id="2626530649491650971">可点击</translation>
@@ -390,7 +389,6 @@
 <translation id="3781428340399460090">艳粉色</translation>
 <translation id="3783725005098956899">显示日志</translation>
 <translation id="3793710123303304873">已退出对话框。</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">自动填充列表</translation>
 <translation id="3810838688059735925">视频</translation>
 <translation id="3813387282697781382">浅珊瑚色</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
index 3e04a59..da4c9d3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -207,7 +207,6 @@
 <translation id="257674075312929031">群組</translation>
 <translation id="2582407057977008361">獨立元素</translation>
 <translation id="2592212930811759050">輕觸兩下即可開始編輯</translation>
-<translation id="2606210917827248971">內含 {COUNT,plural, =1{# 個項目}other{# 個項目}}</translation>
 <translation id="2614981083756825552">MathML 版面配置</translation>
 <translation id="2624431853467395961">開啟學習模式</translation>
 <translation id="2626530649491650971">可點擊</translation>
@@ -391,7 +390,6 @@
 <translation id="3781428340399460090">亮粉色</translation>
 <translation id="3783725005098956899">顯示記錄</translation>
 <translation id="3793710123303304873">結束對話方塊。</translation>
-<translation id="3795836767122514678">+{COUNT,plural, =1{#}other{#}}</translation>
 <translation id="3801735343383419236">自動即時查詢清單</translation>
 <translation id="3810838688059735925">影片</translation>
 <translation id="3813387282697781382">淺珊瑚紅</translation>
diff --git a/chrome/browser/resources/chromeos/crostini_installer/BUILD.gn b/chrome/browser/resources/chromeos/crostini_installer/BUILD.gn
new file mode 100644
index 0000000..2249cc3
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/BUILD.gn
@@ -0,0 +1,25 @@
+# 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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+  deps = [
+    ":app",
+    ":browser_proxy",
+  ]
+}
+
+js_library("app") {
+  deps = [
+    ":browser_proxy",
+  ]
+}
+
+js_library("browser_proxy") {
+  deps = [
+    "//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings_js_library_for_compile",
+    "//ui/webui/resources/js:cr",
+  ]
+}
diff --git a/chrome/browser/resources/chromeos/crostini_installer/OWNERS b/chrome/browser/resources/chromeos/crostini_installer/OWNERS
new file mode 100644
index 0000000..dc48383c
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/chromeos/guest_os/OWNERS
diff --git a/chrome/browser/resources/chromeos/crostini_installer/app.html b/chrome/browser/resources/chromeos/crostini_installer/app.html
new file mode 100644
index 0000000..2248a580
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/app.html
@@ -0,0 +1,13 @@
+<link rel="import" href="chrome://crostini-installer/browser_proxy.html">
+<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
+
+<dom-module id="crostini-installer-app">
+  <template>
+    <div>
+      Hello, Crostini Installer!!!
+      <cr-button on-click="onInstallButtonTap_">Install</cr-button>
+    </div>
+  </template>
+  <script src="chrome://crostini-installer/app.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/chromeos/crostini_installer/app.js b/chrome/browser/resources/chromeos/crostini_installer/app.js
new file mode 100644
index 0000000..1fc0ec7
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/app.js
@@ -0,0 +1,22 @@
+// 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.
+
+Polymer({
+  is: 'crostini-installer-app',
+
+  /** @override */
+  attached: function() {
+    // TODO(lxj)
+  },
+
+  /** @override */
+  detached: function() {
+    // TODO(lxj)
+  },
+
+  /** @private */
+  onInstallButtonTap_: function() {
+    // TODO(lxj)
+  },
+});
diff --git a/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.html b/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.html
new file mode 100644
index 0000000..ea784c4e
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.html
@@ -0,0 +1,5 @@
+<link rel="import" href="chrome://resources/html/cr.html">
+<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
+<link rel="import" href="chrome://crostini-installer/crostini_installer.mojom.html">
+
+<script src="browser_proxy.js"></script>
diff --git a/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.js b/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.js
new file mode 100644
index 0000000..cde666ad
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/browser_proxy.js
@@ -0,0 +1,25 @@
+// 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.
+
+cr.define('crostini_installer', function() {
+  class BrowserProxy {
+    constructor() {
+      /** @type {chromeos.crostiniInstaller.mojom.PageCallbackRouter} */
+      this.callbackRouter =
+          new chromeos.crostiniInstaller.mojom.PageCallbackRouter();
+      /** @type {chromeos.crostiniInstaller.mojom.PageHandlerRemote} */
+      this.handler = new chromeos.crostiniInstaller.mojom.PageHandlerRemote();
+
+      const factory =
+          chromeos.crostiniInstaller.mojom.PageHandlerFactory.getRemote();
+      factory.createPageHandler(
+          this.callbackRouter.$.bindNewPipeAndPassRemote(),
+          this.handler.$.bindNewPipeAndPassReceiver());
+    }
+  }
+
+  cr.addSingletonGetter(BrowserProxy);
+
+  return {BrowserProxy: BrowserProxy};
+});
diff --git a/chrome/browser/resources/chromeos/crostini_installer/index.html b/chrome/browser/resources/chromeos/crostini_installer/index.html
new file mode 100644
index 0000000..23f7bb8
--- /dev/null
+++ b/chrome/browser/resources/chromeos/crostini_installer/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+  <meta charset="utf8">
+</head>
+<body>
+  <crostini-installer-app></crostini-installer-app>
+  <link rel="import" href="chrome://crostini-installer/app.html">
+</body>
+</html>
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.html b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.html
index 9470972..fe684d92 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.html
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.html
@@ -76,7 +76,7 @@
     </style>
 
     <!-- Title section: Icon + name + connection state. -->
-    <div class="section first">
+    <div id="title" class="section first">
       <div class="start layout horizontal center">
         <cr-network-icon
             show-technology-badge="[[showTechnologyBadge_]]"
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
index 8e32ece..d48fb5a 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -24,7 +24,10 @@
     guid: String,
 
     /** @private {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
-    managedProperties_: Object,
+    managedProperties_: {
+      type: Object,
+      observer: 'managedPropertiesChanged_',
+    },
 
     /** @private {?OncMojo.DeviceStateProperties} */
     deviceState_: {
@@ -55,6 +58,12 @@
   },
 
   /**
+   * Set to true once the action button has been focused.
+   * @private {boolean}
+   */
+  didSetFocus_: false,
+
+  /**
    * Set to true to once the initial properties have been received. This
    * prevents setProperties from being called when setting default properties.
    * @private {boolean}
@@ -124,6 +133,8 @@
           loadTimeData.getString('networkListItemInitializing'),
       networkListItemScanning:
           loadTimeData.getString('networkListItemScanning'),
+      networkListItemSimCardLocked:
+          loadTimeData.getString('networkListItemSimCardLocked'),
       networkListItemNotConnected:
           loadTimeData.getString('networkListItemNotConnected'),
       networkListItemNoNetwork:
@@ -133,6 +144,21 @@
   },
 
   /** @private */
+  managedPropertiesChanged_: function() {
+    assert(this.managedProperties_);
+
+    // Focus the action button once the initial state is set.
+    if (!this.didSetFocus_ &&
+        this.showConnectDisconnect_(this.managedProperties_)) {
+      const button = this.$$('#title .action-button:not([hidden])');
+      if (button) {
+        button.focus();
+        this.didSetFocus_ = true;
+      }
+    }
+  },
+
+  /** @private */
   close_: function() {
     chrome.send('dialogClose');
   },
diff --git a/chrome/browser/resources/chromeos/login/network_select_login.js b/chrome/browser/resources/chromeos/login/network_select_login.js
index 969795b..bbcd7917 100644
--- a/chrome/browser/resources/chromeos/login/network_select_login.js
+++ b/chrome/browser/resources/chromeos/login/network_select_login.js
@@ -125,6 +125,8 @@
             loadTimeData.getString('networkListItemInitializing'),
         networkListItemScanning:
             loadTimeData.getString('networkListItemScanning'),
+        networkListItemSimCardLocked:
+            loadTimeData.getString('networkListItemSimCardLocked'),
         networkListItemNotConnected:
             loadTimeData.getString('networkListItemNotConnected'),
         networkListItemNoNetwork:
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js
index 00c3116..fd55fc4 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -39,6 +39,8 @@
     networkListItemInitializing:
         loadTimeData.getString('networkListItemInitializing'),
     networkListItemScanning: loadTimeData.getString('networkListItemScanning'),
+    networkListItemSimCardLocked:
+        loadTimeData.getString('networkListItemSimCardLocked'),
     networkListItemNotConnected:
         loadTimeData.getString('networkListItemNotConnected'),
     networkListItemNoNetwork:
diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd
index f159f9a2..3729569 100644
--- a/chrome/browser/resources/component_extension_resources.grd
+++ b/chrome/browser/resources/component_extension_resources.grd
@@ -100,6 +100,7 @@
         <include name="IDR_PDF_INDEX_CSS" file="pdf/index.css" allowexternalscript="true" type="BINDATA" />
         <include name="IDR_PDF_MAIN_JS" file="pdf/main.js" type="BINDATA" />
         <include name="IDR_PDF_PDF_VIEWER_JS" file="pdf/pdf_viewer.js" type="BINDATA" />
+        <include name="IDR_PDF_CONTROLLER_JS" file="pdf/controller.js" type="BINDATA" />
         <include name="IDR_PDF_TOOLBAR_MANAGER_JS" file="pdf/toolbar_manager.js" type="BINDATA" />
         <include name="IDR_PDF_PDF_FITTING_TYPE_JS" file="pdf/pdf_fitting_type.js" type="BINDATA" />
         <include name="IDR_PDF_VIEWPORT_JS" file="pdf/viewport.js" type="BINDATA" />
diff --git a/chrome/browser/resources/local_ntp/externs.js b/chrome/browser/resources/local_ntp/externs.js
index 489bce1..5df79d6b1 100644
--- a/chrome/browser/resources/local_ntp/externs.js
+++ b/chrome/browser/resources/local_ntp/externs.js
@@ -388,6 +388,8 @@
 window.chrome.embeddedSearch.searchBox.stopCapturingKeyStrokes;
 /** @param {string} input */
 window.chrome.embeddedSearch.searchBox.queryAutocomplete;
+/** @param {boolean} clearResult */
+window.chrome.embeddedSearch.searchBox.stopAutocomplete;
 
 /** @typedef {{offset: number, style: number}} */
 let ACMatchClassification;
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 30c91911..cf1641a 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -1026,7 +1026,6 @@
   margin-inline-start: 40px;
   position: relative;
   width: 568px;
-  z-index: 1;
 }
 
 .menu-panel {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 70a76ee..606892d 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -99,6 +99,11 @@
   USE_NOTIFIER: 'use-notifier',
 };
 
+const SEARCH_HISTORY_MATCH_TYPES = [
+  'search-history',
+  'search-suggest-personalized',
+];
+
 /**
  * Background color for Chrome dark mode. Used to determine if it is possible to
  * display a Google Doodle, or if the notifier should be used instead.
@@ -1028,8 +1033,8 @@
 
     let iconClass;
     if (match.isSearchType) {
-      const isHistory = match.type === 'search-history';
-      const useClock = isHistory && configData.realboxUseClockIcon;
+      const isSearchHistory = SEARCH_HISTORY_MATCH_TYPES.includes(match.type);
+      const useClock = isSearchHistory && configData.realboxUseClockIcon;
       iconClass = useClock ? CLASSES.CLOCK_ICON : CLASSES.SEARCH_ICON;
     } else {
       // TODO(crbug.com/997229): use chrome://favicon/<url> when perms allow.
@@ -1205,15 +1210,16 @@
 
 /** @param {Event} e */
 function onRealboxWrapperFocusIn(e) {
-  if (!e.target.matches(`#${IDS.REALBOX_MATCHES} a`)) {
-    return;
+  if (e.target.matches(`#${IDS.REALBOX}`) && !$(IDS.REALBOX).value) {
+    window.chrome.embeddedSearch.searchBox.queryAutocomplete('');
+  } else if (e.target.matches(`#${IDS.REALBOX_MATCHES} a`)) {
+    const selectedIndex = selectMatchEl(e.target);
+    // It doesn't really make sense to use fillFromMatch() here as the focus
+    // change drops the selection (and is probably just noisy to
+    // screenreaders).
+    const newFill = autocompleteMatches[selectedIndex].fillIntoEdit;
+    updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill});
   }
-  const selectedIndex = selectMatchEl(e.target);
-  // It doesn't really make sense to use fillFromMatch() here as the focus
-  // change drops the selection (and is probably just noisy to
-  // screenreaders).
-  const newFill = autocompleteMatches[selectedIndex].fillIntoEdit;
-  updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill});
 }
 
 /** @param {Event} e */
@@ -1221,6 +1227,8 @@
   const relatedTarget = /** @type {Element} */ (e.relatedTarget);
   if (!$(IDS.REALBOX_INPUT_WRAPPER).contains(relatedTarget)) {
     hideRealboxMatches();  // Hide but don't clear input.
+    window.chrome.embeddedSearch.searchBox.stopAutocomplete(
+        /*clearResult=*/ true);
   }
 }
 
diff --git a/chrome/browser/resources/ntp4/new_tab.html b/chrome/browser/resources/ntp4/new_tab.html
index 2cc968e..de19cad 100644
--- a/chrome/browser/resources/ntp4/new_tab.html
+++ b/chrome/browser/resources/ntp4/new_tab.html
@@ -34,7 +34,6 @@
 <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/util.js"></script>
-<script src="../../../../ui/webui/resources/js/icon.js"></script>
 
 <script src="../../../../ui/webui/resources/js/cr.js"></script>
 <script src="../../../../ui/webui/resources/js/cr/event_target.js"></script>
@@ -49,6 +48,7 @@
 <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/cr/ui/touch_handler.js"></script>
+<script src="../../../../ui/webui/resources/js/icon.js"></script>
 
 <script src="tile_page.js"></script>
 <script src="apps_page.js"></script>
diff --git a/chrome/browser/resources/pdf/controller.js b/chrome/browser/resources/pdf/controller.js
new file mode 100644
index 0000000..1de9864
--- /dev/null
+++ b/chrome/browser/resources/pdf/controller.js
@@ -0,0 +1,404 @@
+// 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.
+
+'use strict';
+
+/**
+ * @typedef {{
+ *   dataToSave: Array,
+ *   token: string,
+ *   fileName: string
+ * }}
+ */
+let SaveDataMessageData;
+
+/**
+ * Creates a cryptographically secure pseudorandom 128-bit token.
+ *
+ * @return {string} The generated token as a hex string.
+ */
+function createToken() {
+  const randomBytes = new Uint8Array(16);
+  return window.crypto.getRandomValues(randomBytes)
+      .map(b => b.toString(16).padStart(2, '0'))
+      .join('');
+}
+
+/** @abstract */
+class ContentController {
+  constructor() {}
+
+  /**
+   * A callback that's called before the zoom changes.
+   */
+  beforeZoom() {}
+
+  /**
+   * A callback that's called after the zoom changes.
+   */
+  afterZoom() {}
+
+  /**
+   * Handles a change to the viewport.
+   */
+  viewportChanged() {}
+
+  /**
+   * Rotates the document 90 degrees in the clockwise direction.
+   * @abstract
+   */
+  rotateClockwise() {}
+
+  /**
+   * Rotates the document 90 degrees in the counter clockwise direction.
+   * @abstract
+   */
+  rotateCounterclockwise() {}
+
+  /**
+   * Triggers printing of the current document.
+   */
+  print() {}
+
+  /**
+   * Undo an edit action.
+   */
+  undo() {}
+
+  /**
+   * Redo an edit action.
+   */
+  redo() {}
+
+  /**
+   * Requests that the current document be saved.
+   * @param {boolean} requireResult whether a response is required, otherwise
+   *     the controller may save the document to disk internally.
+   * @return {Promise<{fileName: string, dataToSave: ArrayBuffer}}
+   * @abstract
+   */
+  save(requireResult) {}
+
+  /**
+   * Loads PDF document from `data` activates UI.
+   * @param {string} fileName
+   * @param {ArrayBuffer} data
+   * @return {Promise<void>}
+   * @abstract
+   */
+  load(fileName, data) {}
+
+  /**
+   * Unloads the current document and removes the UI.
+   * @abstract
+   */
+  unload() {}
+}
+
+class InkController extends ContentController {
+  /**
+   * @param {PDFViewer} viewer
+   * @param {Viewport} viewport
+   */
+  constructor(viewer, viewport) {
+    super();
+    this.viewer_ = viewer;
+    this.viewport_ = viewport;
+
+    /** @type {ViewerInkHost} */
+    this.inkHost_ = null;
+  }
+
+  /** @param {AnnotationTool} tool */
+  setAnnotationTool(tool) {
+    this.tool_ = tool;
+    if (this.inkHost_) {
+      this.inkHost_.setAnnotationTool(tool);
+    }
+  }
+
+  /** @override */
+  rotateClockwise() {
+    // TODO(dstockwell): implement rotation
+  }
+
+  /** @override */
+  rotateCounterclockwise() {
+    // TODO(dstockwell): implement rotation
+  }
+
+  /** @override */
+  viewportChanged() {
+    this.inkHost_.viewportChanged();
+  }
+
+  /** @override */
+  save(requireResult) {
+    return this.inkHost_.saveDocument();
+  }
+
+  /** @override */
+  undo() {
+    this.inkHost_.undo();
+  }
+
+  /** @override */
+  redo() {
+    this.inkHost_.redo();
+  }
+
+  /** @override */
+  load(filename, data) {
+    if (!this.inkHost_) {
+      this.inkHost_ = document.createElement('viewer-ink-host');
+      $('content').appendChild(this.inkHost_);
+      this.inkHost_.viewport = this.viewport_;
+      this.inkHost_.addEventListener('stroke-added', e => {
+        this.viewer_.setHasUnsavedChanges();
+      });
+      this.inkHost_.addEventListener('undo-state-changed', e => {
+        this.viewer_.setAnnotationUndoState(e.detail);
+      });
+    }
+    return this.inkHost_.load(filename, data);
+  }
+
+  /** @override */
+  unload() {
+    this.inkHost_.remove();
+    this.inkHost_ = null;
+  }
+}
+
+class PluginController extends ContentController {
+  /**
+   * @param {HTMLEmbedElement} plugin
+   * @param {PDFViewer} viewer
+   * @param {Viewport} viewport
+   */
+  constructor(plugin, viewer, viewport) {
+    super();
+    this.plugin_ = plugin;
+    this.viewer_ = viewer;
+    this.viewport_ = viewport;
+
+    /** @private {!Map<string, PromiseResolver>} */
+    this.pendingTokens_ = new Map();
+    this.plugin_.addEventListener(
+        'message', e => this.handlePluginMessage_(e), false);
+  }
+
+  /**
+   * Notify the plugin to stop reacting to scroll events while zoom is taking
+   * place to avoid flickering.
+   * @override
+   */
+  beforeZoom() {
+    this.postMessage({type: 'stopScrolling'});
+
+    if (this.viewport_.pinchPhase == Viewport.PinchPhase.PINCH_START) {
+      const position = this.viewport_.position;
+      const zoom = this.viewport_.getZoom();
+      const pinchPhase = this.viewport_.pinchPhase;
+      this.postMessage({
+        type: 'viewport',
+        userInitiated: true,
+        zoom: zoom,
+        xOffset: position.x,
+        yOffset: position.y,
+        pinchPhase: pinchPhase
+      });
+    }
+  }
+
+  /**
+   * Notify the plugin of the zoom change and to continue reacting to scroll
+   * events.
+   * @override
+   */
+  afterZoom() {
+    const position = this.viewport_.position;
+    const zoom = this.viewport_.getZoom();
+    const pinchVector = this.viewport_.pinchPanVector || {x: 0, y: 0};
+    const pinchCenter = this.viewport_.pinchCenter || {x: 0, y: 0};
+    const pinchPhase = this.viewport_.pinchPhase;
+
+    this.postMessage({
+      type: 'viewport',
+      userInitiated: this.viewer_.isUserInitiatedEvent_,
+      zoom: zoom,
+      xOffset: position.x,
+      yOffset: position.y,
+      pinchPhase: pinchPhase,
+      pinchX: pinchCenter.x,
+      pinchY: pinchCenter.y,
+      pinchVectorX: pinchVector.x,
+      pinchVectorY: pinchVector.y
+    });
+  }
+
+  // TODO(dstockwell): this method should be private, add controller APIs that
+  // map to all of the existing usage. crbug.com/913279
+  /**
+   * Post a message to the PPAPI plugin. Some messages will cause an async reply
+   * to be received through handlePluginMessage_().
+   *
+   * @param {Object} message Message to post.
+   */
+  postMessage(message) {
+    this.plugin_.postMessage(message);
+  }
+
+  /** @override */
+  rotateClockwise() {
+    this.postMessage({type: 'rotateClockwise'});
+  }
+
+  /** @override */
+  rotateCounterclockwise() {
+    this.postMessage({type: 'rotateCounterclockwise'});
+  }
+
+  /** @override */
+  print() {
+    this.postMessage({type: 'print'});
+  }
+
+  /** @override */
+  save(requireResult) {
+    const resolver = new PromiseResolver();
+    const newToken = createToken();
+    this.pendingTokens_.set(newToken, resolver);
+    this.postMessage({type: 'save', token: newToken, force: requireResult});
+    return resolver.promise;
+  }
+
+  /** @override */
+  async load(fileName, data) {
+    const url = URL.createObjectURL(new Blob([data]));
+    this.plugin_.removeAttribute('headers');
+    this.plugin_.setAttribute('stream-url', url);
+    this.plugin_.style.display = 'block';
+    try {
+      await this.viewer_.loaded;
+    } finally {
+      URL.revokeObjectURL(url);
+    }
+  }
+
+  /** @override */
+  unload() {
+    this.plugin_.style.display = 'none';
+  }
+
+  /**
+   * An event handler for handling message events received from the plugin.
+   *
+   * @param {MessageObject} message a message event.
+   * @private
+   */
+  handlePluginMessage_(message) {
+    switch (message.data.type.toString()) {
+      case 'beep':
+        this.viewer_.handleBeep();
+        break;
+      case 'documentDimensions':
+        this.viewer_.setDocumentDimensions(message.data);
+        break;
+      case 'email':
+        const href = 'mailto:' + message.data.to + '?cc=' + message.data.cc +
+            '&bcc=' + message.data.bcc + '&subject=' + message.data.subject +
+            '&body=' + message.data.body;
+        window.location.href = href;
+        break;
+      case 'getPassword':
+        this.viewer_.handlePasswordRequest();
+        break;
+      case 'getSelectedTextReply':
+        this.viewer_.handleSelectedTextReply(message.data.selectedText);
+        break;
+      case 'goToPage':
+        this.viewport_.goToPage(message.data.page);
+        break;
+      case 'loadProgress':
+        this.viewer_.updateProgress(message.data.progress);
+        break;
+      case 'navigate':
+        this.viewer_.handleNavigate(message.data.url, message.data.disposition);
+        break;
+      case 'printPreviewLoaded':
+        this.viewer_.handlePrintPreviewLoaded();
+        break;
+      case 'setScrollPosition':
+        this.viewport_.scrollTo(/** @type {!PartialPoint} */ (message.data));
+        break;
+      case 'scrollBy':
+        this.viewport_.scrollBy(/** @type {!Point} */ (message.data));
+        break;
+      case 'metadata':
+        this.viewer_.setDocumentMetadata(
+            message.data.title, message.data.bookmarks,
+            message.data.canSerializeDocument);
+        break;
+      case 'setIsSelecting':
+        this.viewer_.setIsSelecting(message.data.isSelecting);
+        break;
+      case 'getNamedDestinationReply':
+        this.viewer_.paramsParser_.onNamedDestinationReceived(
+            message.data.pageNumber);
+        break;
+      case 'formFocusChange':
+        this.viewer_.setIsFormFieldFocused(message.data.focused);
+        break;
+      case 'saveData':
+        this.saveData_(message.data);
+        break;
+      case 'consumeSaveToken':
+        const resolver = this.pendingTokens_.get(message.data.token);
+        assert(this.pendingTokens_.delete(message.data.token));
+        resolver.resolve(null);
+        break;
+    }
+  }
+
+  /**
+   * Handles the pdf file buffer received from the plugin.
+   *
+   * @param {SaveDataMessageData} messageData data of the message event.
+   * @private
+   */
+  saveData_(messageData) {
+    assert(
+        loadTimeData.getBoolean('pdfFormSaveEnabled') ||
+        loadTimeData.getBoolean('pdfAnnotationsEnabled'));
+
+    // Verify a token that was created by this instance is included to avoid
+    // being spammed.
+    const resolver = this.pendingTokens_.get(messageData.token);
+    assert(this.pendingTokens_.delete(messageData.token));
+
+    if (!messageData.dataToSave) {
+      resolver.reject();
+      return;
+    }
+
+    // Verify the file size and the first bytes to make sure it's a PDF. Cap at
+    // 100 MB. This cap should be kept in sync with and is also enforced in
+    // pdf/out_of_process_instance.cc.
+    const MIN_FILE_SIZE = '%PDF1.0'.length;
+    const MAX_FILE_SIZE = 100 * 1000 * 1000;
+
+    const buffer = messageData.dataToSave;
+    const bufView = new Uint8Array(buffer);
+    assert(
+        bufView.length <= MAX_FILE_SIZE,
+        `File too large to be saved: ${bufView.length} bytes.`);
+    assert(bufView.length >= MIN_FILE_SIZE);
+    assert(
+        String.fromCharCode(bufView[0], bufView[1], bufView[2], bufView[3]) ==
+        '%PDF');
+
+    resolver.resolve(messageData);
+  }
+}
diff --git a/chrome/browser/resources/pdf/index.html b/chrome/browser/resources/pdf/index.html
index 06d219a..d86ddba 100644
--- a/chrome/browser/resources/pdf/index.html
+++ b/chrome/browser/resources/pdf/index.html
@@ -58,6 +58,7 @@
 <script src="chrome://resources/js/promise_resolver.js"></script>
 <script src="browser_api.js"></script>
 <script src="metrics.js"></script>
+<script src="controller.js"></script>
 <script src="pdf_viewer.js"></script>
 <script src="main.js"></script>
 </html>
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js
index 375663f..9bfe0cf 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -5,15 +5,6 @@
 'use strict';
 
 /**
- * @typedef {{
- *   dataToSave: Array,
- *   token: string,
- *   fileName: string
- * }}
- */
-let SaveDataMessageData;
-
-/**
  * @return {number} Width of a scrollbar in pixels
  */
 function getScrollbarWidth() {
@@ -70,24 +61,6 @@
 }
 
 /**
- * Creates a cryptographically secure pseudorandom 128-bit token.
- *
- * @return {string} The generated token as a hex string.
- */
-function createToken() {
-  const randomBytes = new Uint8Array(16);
-  return window.crypto.getRandomValues(randomBytes)
-      .map(b => b.toString(16).padStart(2, '0'))
-      .join('');
-}
-
-/**
- * The minimum number of pixels to offset the toolbar by from the bottom and
- * right side of the screen.
- */
-PDFViewer.MIN_TOOLBAR_OFFSET = 15;
-
-/**
  * The height of the toolbar along the top of the page. The document will be
  * shifted down by this much in the viewport.
  */
@@ -1311,381 +1284,3 @@
     this.toolbar_.canRedoAnnotation = state.canRedo;
   },
 };
-
-/** @abstract */
-class ContentController {
-  constructor() {}
-
-  /**
-   * A callback that's called before the zoom changes.
-   */
-  beforeZoom() {}
-
-  /**
-   * A callback that's called after the zoom changes.
-   */
-  afterZoom() {}
-
-  /**
-   * Handles a change to the viewport.
-   */
-  viewportChanged() {}
-
-  /**
-   * Rotates the document 90 degrees in the clockwise direction.
-   * @abstract
-   */
-  rotateClockwise() {}
-
-  /**
-   * Rotates the document 90 degrees in the counter clockwise direction.
-   * @abstract
-   */
-  rotateCounterclockwise() {}
-
-  /**
-   * Triggers printing of the current document.
-   */
-  print() {}
-
-  /**
-   * Undo an edit action.
-   */
-  undo() {}
-
-  /**
-   * Redo an edit action.
-   */
-  redo() {}
-
-  /**
-   * Requests that the current document be saved.
-   * @param {boolean} requireResult whether a response is required, otherwise
-   *     the controller may save the document to disk internally.
-   * @return {Promise<{fileName: string, dataToSave: ArrayBuffer}}
-   * @abstract
-   */
-  save(requireResult) {}
-
-  /**
-   * Loads PDF document from `data` activates UI.
-   * @param {string} fileName
-   * @param {ArrayBuffer} data
-   * @return {Promise<void>}
-   * @abstract
-   */
-  load(fileName, data) {}
-
-  /**
-   * Unloads the current document and removes the UI.
-   * @abstract
-   */
-  unload() {}
-}
-
-class InkController extends ContentController {
-  /**
-   * @param {PDFViewer} viewer
-   * @param {Viewport} viewport
-   */
-  constructor(viewer, viewport) {
-    super();
-    this.viewer_ = viewer;
-    this.viewport_ = viewport;
-
-    /** @type {ViewerInkHost} */
-    this.inkHost_ = null;
-  }
-
-  /** @param {AnnotationTool} tool */
-  setAnnotationTool(tool) {
-    this.tool_ = tool;
-    if (this.inkHost_) {
-      this.inkHost_.setAnnotationTool(tool);
-    }
-  }
-
-  /** @override */
-  rotateClockwise() {
-    // TODO(dstockwell): implement rotation
-  }
-
-  /** @override */
-  rotateCounterclockwise() {
-    // TODO(dstockwell): implement rotation
-  }
-
-  /** @override */
-  viewportChanged() {
-    this.inkHost_.viewportChanged();
-  }
-
-  /** @override */
-  save(requireResult) {
-    return this.inkHost_.saveDocument();
-  }
-
-  /** @override */
-  undo() {
-    this.inkHost_.undo();
-  }
-
-  /** @override */
-  redo() {
-    this.inkHost_.redo();
-  }
-
-  /** @override */
-  load(filename, data) {
-    if (!this.inkHost_) {
-      this.inkHost_ = document.createElement('viewer-ink-host');
-      $('content').appendChild(this.inkHost_);
-      this.inkHost_.viewport = this.viewport_;
-      this.inkHost_.addEventListener('stroke-added', e => {
-        this.viewer_.setHasUnsavedChanges();
-      });
-      this.inkHost_.addEventListener('undo-state-changed', e => {
-        this.viewer_.setAnnotationUndoState(e.detail);
-      });
-    }
-    return this.inkHost_.load(filename, data);
-  }
-
-  /** @override */
-  unload() {
-    this.inkHost_.remove();
-    this.inkHost_ = null;
-  }
-}
-
-class PluginController extends ContentController {
-  /**
-   * @param {HTMLEmbedElement} plugin
-   * @param {PDFViewer} viewer
-   * @param {Viewport} viewport
-   */
-  constructor(plugin, viewer, viewport) {
-    super();
-    this.plugin_ = plugin;
-    this.viewer_ = viewer;
-    this.viewport_ = viewport;
-
-    /** @private {!Map<string, PromiseResolver>} */
-    this.pendingTokens_ = new Map();
-    this.plugin_.addEventListener(
-        'message', e => this.handlePluginMessage_(e), false);
-  }
-
-  /**
-   * Notify the plugin to stop reacting to scroll events while zoom is taking
-   * place to avoid flickering.
-   * @override
-   */
-  beforeZoom() {
-    this.postMessage({type: 'stopScrolling'});
-
-    if (this.viewport_.pinchPhase == Viewport.PinchPhase.PINCH_START) {
-      const position = this.viewport_.position;
-      const zoom = this.viewport_.getZoom();
-      const pinchPhase = this.viewport_.pinchPhase;
-      this.postMessage({
-        type: 'viewport',
-        userInitiated: true,
-        zoom: zoom,
-        xOffset: position.x,
-        yOffset: position.y,
-        pinchPhase: pinchPhase
-      });
-    }
-  }
-
-  /**
-   * Notify the plugin of the zoom change and to continue reacting to scroll
-   * events.
-   * @override
-   */
-  afterZoom() {
-    const position = this.viewport_.position;
-    const zoom = this.viewport_.getZoom();
-    const pinchVector = this.viewport_.pinchPanVector || {x: 0, y: 0};
-    const pinchCenter = this.viewport_.pinchCenter || {x: 0, y: 0};
-    const pinchPhase = this.viewport_.pinchPhase;
-
-    this.postMessage({
-      type: 'viewport',
-      userInitiated: this.viewer_.isUserInitiatedEvent_,
-      zoom: zoom,
-      xOffset: position.x,
-      yOffset: position.y,
-      pinchPhase: pinchPhase,
-      pinchX: pinchCenter.x,
-      pinchY: pinchCenter.y,
-      pinchVectorX: pinchVector.x,
-      pinchVectorY: pinchVector.y
-    });
-  }
-
-  // TODO(dstockwell): this method should be private, add controller APIs that
-  // map to all of the existing usage. crbug.com/913279
-  /**
-   * Post a message to the PPAPI plugin. Some messages will cause an async reply
-   * to be received through handlePluginMessage_().
-   *
-   * @param {Object} message Message to post.
-   */
-  postMessage(message) {
-    this.plugin_.postMessage(message);
-  }
-
-  /** @override */
-  rotateClockwise() {
-    this.postMessage({type: 'rotateClockwise'});
-  }
-
-  /** @override */
-  rotateCounterclockwise() {
-    this.postMessage({type: 'rotateCounterclockwise'});
-  }
-
-  /** @override */
-  print() {
-    this.postMessage({type: 'print'});
-  }
-
-  /** @override */
-  save(requireResult) {
-    const resolver = new PromiseResolver();
-    const newToken = createToken();
-    this.pendingTokens_.set(newToken, resolver);
-    this.postMessage({type: 'save', token: newToken, force: requireResult});
-    return resolver.promise;
-  }
-
-  /** @override */
-  async load(fileName, data) {
-    const url = URL.createObjectURL(new Blob([data]));
-    this.plugin_.removeAttribute('headers');
-    this.plugin_.setAttribute('stream-url', url);
-    this.plugin_.style.display = 'block';
-    try {
-      await this.viewer_.loaded;
-    } finally {
-      URL.revokeObjectURL(url);
-    }
-  }
-
-  /** @override */
-  unload() {
-    this.plugin_.style.display = 'none';
-  }
-
-  /**
-   * An event handler for handling message events received from the plugin.
-   *
-   * @param {MessageObject} message a message event.
-   * @private
-   */
-  handlePluginMessage_(message) {
-    switch (message.data.type.toString()) {
-      case 'beep':
-        this.viewer_.handleBeep();
-        break;
-      case 'documentDimensions':
-        this.viewer_.setDocumentDimensions(message.data);
-        break;
-      case 'email':
-        const href = 'mailto:' + message.data.to + '?cc=' + message.data.cc +
-            '&bcc=' + message.data.bcc + '&subject=' + message.data.subject +
-            '&body=' + message.data.body;
-        window.location.href = href;
-        break;
-      case 'getPassword':
-        this.viewer_.handlePasswordRequest();
-        break;
-      case 'getSelectedTextReply':
-        this.viewer_.handleSelectedTextReply(message.data.selectedText);
-        break;
-      case 'goToPage':
-        this.viewport_.goToPage(message.data.page);
-        break;
-      case 'loadProgress':
-        this.viewer_.updateProgress(message.data.progress);
-        break;
-      case 'navigate':
-        this.viewer_.handleNavigate(message.data.url, message.data.disposition);
-        break;
-      case 'printPreviewLoaded':
-        this.viewer_.handlePrintPreviewLoaded();
-        break;
-      case 'setScrollPosition':
-        this.viewport_.scrollTo(/** @type {!PartialPoint} */ (message.data));
-        break;
-      case 'scrollBy':
-        this.viewport_.scrollBy(/** @type {!Point} */ (message.data));
-        break;
-      case 'metadata':
-        this.viewer_.setDocumentMetadata(
-            message.data.title, message.data.bookmarks,
-            message.data.canSerializeDocument);
-        break;
-      case 'setIsSelecting':
-        this.viewer_.setIsSelecting(message.data.isSelecting);
-        break;
-      case 'getNamedDestinationReply':
-        this.viewer_.paramsParser_.onNamedDestinationReceived(
-            message.data.pageNumber);
-        break;
-      case 'formFocusChange':
-        this.viewer_.setIsFormFieldFocused(message.data.focused);
-        break;
-      case 'saveData':
-        this.saveData_(message.data);
-        break;
-      case 'consumeSaveToken':
-        const resolver = this.pendingTokens_.get(message.data.token);
-        assert(this.pendingTokens_.delete(message.data.token));
-        resolver.resolve(null);
-        break;
-    }
-  }
-
-  /**
-   * Handles the pdf file buffer received from the plugin.
-   *
-   * @param {SaveDataMessageData} messageData data of the message event.
-   * @private
-   */
-  saveData_(messageData) {
-    assert(
-        loadTimeData.getBoolean('pdfFormSaveEnabled') ||
-        loadTimeData.getBoolean('pdfAnnotationsEnabled'));
-
-    // Verify a token that was created by this instance is included to avoid
-    // being spammed.
-    const resolver = this.pendingTokens_.get(messageData.token);
-    assert(this.pendingTokens_.delete(messageData.token));
-
-    if (!messageData.dataToSave) {
-      resolver.reject();
-      return;
-    }
-
-    // Verify the file size and the first bytes to make sure it's a PDF. Cap at
-    // 100 MB. This cap should be kept in sync with and is also enforced in
-    // pdf/out_of_process_instance.cc.
-    const MIN_FILE_SIZE = '%PDF1.0'.length;
-    const MAX_FILE_SIZE = 100 * 1000 * 1000;
-
-    const buffer = messageData.dataToSave;
-    const bufView = new Uint8Array(buffer);
-    assert(
-        bufView.length <= MAX_FILE_SIZE,
-        `File too large to be saved: ${bufView.length} bytes.`);
-    assert(bufView.length >= MIN_FILE_SIZE);
-    assert(
-        String.fromCharCode(bufView[0], bufView[1], bufView[2], bufView[3]) ==
-        '%PDF');
-
-    resolver.resolve(messageData);
-  }
-}
diff --git a/chrome/browser/resources/print_preview/polymer3/demo.js b/chrome/browser/resources/print_preview/polymer3/demo.js
index 39a1b1b..dbf2c955 100644
--- a/chrome/browser/resources/print_preview/polymer3/demo.js
+++ b/chrome/browser/resources/print_preview/polymer3/demo.js
@@ -6,6 +6,7 @@
 import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
 import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.m.js';
+import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
 import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
 import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.m.js';
@@ -16,6 +17,7 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
 import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/cr_elements/md_select_css.m.js';
+import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.m.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -27,6 +29,15 @@
         cr-toggle {
           display: inline-block;
         }
+
+        .setting {
+          align-items: center;
+          display: flex;
+        }
+
+        div, cr-input, cr-icon-button, select, cr-checkbox {
+          margin-top: 20px;
+        }
       </style>
 
       <cr-checkbox checked="{{checkboxChecked_}}">
@@ -93,6 +104,20 @@
 
       <div>
         <cr-search-field label="test search field"></cr-search-field>
+      </div>
+
+      <div>
+        <cr-expand-button on-click="onExpand_">Expand</cr-expand-button>
+        <div hidden$="[[!expanded_]]">Expanded content</div>
+      </div>
+
+      <div class="setting">
+        <span>Some setting</span>
+        <cr-tooltip-icon tooltip-text="This setting is controlled by policy"
+            icon-class="cr20:domain"
+            icon-aria-label="This setting is controlled by policy">
+        </cr-tooltip-icon>
+        <cr-toggle disabled checked></cr-toggle>
       <div>
     `;
   }
@@ -106,6 +131,12 @@
       checkboxChecked_: Boolean,
 
       /** @private */
+      expanded_: {
+        type: Boolean,
+        value: false,
+      },
+
+      /** @private */
       selectedSubpage_: {
         type: Number,
         value: 0,
@@ -149,6 +180,11 @@
   isTabBSelected_() {
     return this.selectedSubpage_ === 1;
   }
+
+  /** @private */
+  onExpand_() {
+    this.expanded_ = !this.expanded_;
+  }
 }  // class HelloPolymer3
 
 customElements.define('hello-polymer3', HelloPolymer3Element);
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index 98722cc..34e0148 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -112,7 +112,7 @@
 <if expr="chromeos">
         <template is="dom-if" if="[[showOSSettingsBanner_]]">
           <div id="osSettingsBanner" class="settings-box">
-            <div class="start">
+            <div class="start" on-click="onOSSettingsBannerClick_">
               $i18nRaw{osSettingsBannerText}
             </div>
             <cr-icon-button class="icon-clear"
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.js b/chrome/browser/resources/settings/basic_page/basic_page.js
index 281aa4e..f2f0131 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.js
+++ b/chrome/browser/resources/settings/basic_page/basic_page.js
@@ -6,6 +6,26 @@
  * @fileoverview
  * 'settings-basic-page' is the settings page containing the actual settings.
  */
+(function() {
+'use strict';
+
+// <if expr="chromeos">
+const OS_BANNER_INTERACTION_METRIC_NAME =
+    'ChromeOS.Settings.OsBannerInteraction';
+
+/**
+ * These values are persisted to logs and should not be renumbered or re-used.
+ * See tools/metrics/histograms/enums.xml.
+ * @enum {number}
+ */
+const CrosSettingsOsBannerInteraction = {
+  NotShown: 0,
+  Shown: 1,
+  Clicked: 2,
+  Closed: 3,
+};
+// </if>
+
 Polymer({
   is: 'settings-basic-page',
 
@@ -117,6 +137,11 @@
    */
   advancedTogglingInProgress_: false,
 
+  // <if expr="chromeos">
+  /** @private {boolean} */
+  osBannerShowMetricRecorded_: false,
+  // </if>
+
   /** @override */
   attached: function() {
     this.currentRoute_ = settings.getCurrentRoute();
@@ -246,12 +271,37 @@
 
     // Banner only shows on the main page because direct navigations to a
     // sub-page are unlikely to be due to a user looking for an OS setting.
-    return showPref && !this.currentRoute_.isSubpage();
+    const show = showPref && !this.currentRoute_.isSubpage();
+
+    // Record the show metric once. We can't record the metric in attached()
+    // because prefs might not be ready yet.
+    if (!this.osBannerShowMetricRecorded_) {
+      chrome.metricsPrivate.recordEnumerationValue(
+          OS_BANNER_INTERACTION_METRIC_NAME,
+          show ? CrosSettingsOsBannerInteraction.Shown :
+                 CrosSettingsOsBannerInteraction.NotShown,
+          Object.keys(CrosSettingsOsBannerInteraction).length);
+      this.osBannerShowMetricRecorded_ = true;
+    }
+    return show;
+  },
+
+  /** @private */
+  onOSSettingsBannerClick_: function() {
+    // The label has a link that opens the page, so just record the metric.
+    chrome.metricsPrivate.recordEnumerationValue(
+        OS_BANNER_INTERACTION_METRIC_NAME,
+        CrosSettingsOsBannerInteraction.Clicked,
+        Object.keys(CrosSettingsOsBannerInteraction).length);
   },
 
   /** @private */
   onOSSettingsBannerClosed_: function() {
     this.setPrefValue('settings.cros.show_os_banner', false);
+    chrome.metricsPrivate.recordEnumerationValue(
+        OS_BANNER_INTERACTION_METRIC_NAME,
+        CrosSettingsOsBannerInteraction.Closed,
+        Object.keys(CrosSettingsOsBannerInteraction).length);
   },
   // </if>
 
@@ -403,3 +453,4 @@
     return bool.toString();
   },
 });
+})();
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
index 122df02..c3f156e 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
@@ -159,6 +159,8 @@
           loadTimeData.getString('networkListItemInitializing'),
       networkListItemScanning:
           loadTimeData.getString('networkListItemScanning'),
+      networkListItemSimCardLocked:
+          loadTimeData.getString('networkListItemSimCardLocked'),
       networkListItemNotConnected:
           loadTimeData.getString('networkListItemNotConnected'),
       networkListItemNoNetwork:
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.js b/chrome/browser/resources/settings/settings_ui/settings_ui.js
index fdbbef2..1be9ab85 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.js
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.js
@@ -154,6 +154,8 @@
           loadTimeData.getString('networkListItemInitializing'),
       networkListItemScanning:
           loadTimeData.getString('networkListItemScanning'),
+      networkListItemSimCardLocked:
+          loadTimeData.getString('networkListItemSimCardLocked'),
       networkListItemNotConnected:
           loadTimeData.getString('networkListItemNotConnected'),
       networkListItemNoNetwork:
diff --git a/chrome/browser/safe_browsing/advanced_protection_status_manager.cc b/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
index cf373da..830a1de 100644
--- a/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
+++ b/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
@@ -221,9 +221,7 @@
 bool AdvancedProtectionStatusManager::RequestsAdvancedProtectionVerdicts() {
   static bool force_enabled =
       base::FeatureList::IsEnabled(kForceUseAPDownloadProtection);
-  static bool enabled = base::FeatureList::IsEnabled(kUseAPDownloadProtection);
-
-  return force_enabled || (is_under_advanced_protection() && enabled);
+  return force_enabled || is_under_advanced_protection();
 }
 
 bool AdvancedProtectionStatusManager::IsPrimaryAccount(
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index e795dac..30c4489 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -91,6 +91,7 @@
 // The number of user gestures we trace back for login event attribution.
 const int kPasswordEventAttributionUserGestureLimit = 2;
 
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 // If user specifically mark a site as legitimate, we will keep this decision
 // for 2 days.
 const int kOverrideVerdictCacheDurationSec = 2 * 24 * 60 * 60;
@@ -103,7 +104,6 @@
   return (time - base::Time()).InMicroseconds();
 }
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 PasswordReuseLookup::ReputationVerdict GetVerdictToLogFromResponse(
     LoginReputationClientResponse::VerdictType response_verdict) {
   switch (response_verdict) {
@@ -178,7 +178,6 @@
              ? navigation_id
              : 0;
 }
-#endif
 
 // Return a new UserEventSpecifics w/o the navigation_id populated
 std::unique_ptr<UserEventSpecifics> GetNewUserEventSpecifics() {
@@ -188,7 +187,6 @@
   return specifics;
 }
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 // Return a new UserEventSpecifics w/ the navigation_id populated
 std::unique_ptr<UserEventSpecifics> GetUserEventSpecificsWithNavigationId(
     int64_t navigation_id) {
@@ -262,6 +260,7 @@
 }
 
 void ChromePasswordProtectionService::Init() {
+#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // This code is shared by the normal ctor and testing ctor.
 
   sync_password_hash_ = GetSyncPasswordHashFromPrefs();
@@ -285,6 +284,7 @@
       delay = max_delay;
     SetLogPasswordCaptureTimer(delay);
   }
+#endif
 }
 
 ChromePasswordProtectionService::~ChromePasswordProtectionService() {
@@ -349,53 +349,7 @@
                         .Serialize()) != nullptr)
              : false;
 }
-#endif
 
-const policy::BrowserPolicyConnector*
-ChromePasswordProtectionService::GetBrowserPolicyConnector() const {
-  return g_browser_process->browser_policy_connector();
-}
-
-void ChromePasswordProtectionService::FillReferrerChain(
-    const GURL& event_url,
-    SessionID event_tab_id,
-    LoginReputationClientRequest::Frame* frame) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  SafeBrowsingNavigationObserverManager::AttributionResult result =
-      navigation_observer_manager_->IdentifyReferrerChainByEventURL(
-          event_url, event_tab_id, kPasswordEventAttributionUserGestureLimit,
-          frame->mutable_referrer_chain());
-  size_t referrer_chain_length = frame->referrer_chain().size();
-  UMA_HISTOGRAM_COUNTS_100(
-      "SafeBrowsing.ReferrerURLChainSize.PasswordEventAttribution",
-      referrer_chain_length);
-  UMA_HISTOGRAM_ENUMERATION(
-      "SafeBrowsing.ReferrerAttributionResult.PasswordEventAttribution", result,
-      SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX);
-
-  // Determines how many recent navigation events to append to referrer chain.
-  size_t recent_navigations_to_collect =
-      profile_ ? SafeBrowsingNavigationObserverManager::
-                     CountOfRecentNavigationsToAppend(*profile_, result)
-               : 0u;
-  navigation_observer_manager_->AppendRecentNavigations(
-      recent_navigations_to_collect, frame->mutable_referrer_chain());
-}
-
-std::string ChromePasswordProtectionService::GetSyncPasswordHashFromPrefs() {
-  if (!sync_password_hash_provider_for_testing_.is_null())
-    return sync_password_hash_provider_for_testing_.Run();
-
-  password_manager::HashPasswordManager hash_password_manager;
-  hash_password_manager.set_prefs(profile_->GetPrefs());
-  base::Optional<password_manager::PasswordHashData> sync_hash_data =
-      hash_password_manager.RetrievePasswordHash(GetAccountInfo().email,
-                                                 /*is_gaia_password=*/true);
-  return sync_hash_data ? base::NumberToString(sync_hash_data->hash)
-                        : std::string();
-}
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::ShowModalWarning(
     content::WebContents* web_contents,
     RequestOutcome outcome,
@@ -499,7 +453,6 @@
                    password_type);
 }
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::OnUserAction(
     content::WebContents* web_contents,
     ReusedPasswordAccountType password_type,
@@ -530,7 +483,6 @@
       break;
   }
 }
-#endif
 
 void ChromePasswordProtectionService::AddObserver(Observer* observer) {
   observer_list_.AddObserver(observer);
@@ -591,113 +543,7 @@
       TriggerManager::GetSBErrorDisplayOptions(*profile_->GetPrefs(),
                                                web_contents));
 }
-#endif
 
-PrefService* ChromePasswordProtectionService::GetPrefs() {
-  return profile_->GetPrefs();
-}
-
-bool ChromePasswordProtectionService::IsSafeBrowsingEnabled() {
-  return GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled);
-}
-
-bool ChromePasswordProtectionService::IsExtendedReporting() {
-  return IsExtendedReportingEnabled(*GetPrefs());
-}
-
-bool ChromePasswordProtectionService::IsIncognito() {
-  return profile_->IsOffTheRecord();
-}
-
-bool ChromePasswordProtectionService::IsPingingEnabled(
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    RequestOutcome* reason) {
-  if (!IsSafeBrowsingEnabled()) {
-    *reason = RequestOutcome::SAFE_BROWSING_DISABLED;
-    return false;
-  }
-  if (trigger_type == LoginReputationClientRequest::PASSWORD_REUSE_EVENT) {
-    if (password_type.account_type() ==
-        ReusedPasswordAccountType::SAVED_PASSWORD)
-      return IsExtendedReporting();
-
-    PasswordProtectionTrigger trigger_level =
-        GetPasswordProtectionWarningTriggerPref(password_type);
-    // Only override policy if password protection is off for Gmail users.
-    if (trigger_level == PASSWORD_PROTECTION_OFF) {
-      *reason = RequestOutcome::TURNED_OFF_BY_ADMIN;
-      return false;
-    }
-    return true;
-  }
-
-  // Password field on focus pinging is enabled for !incognito &&
-  // extended_reporting.
-  if (IsIncognito()) {
-    *reason = RequestOutcome::DISABLED_DUE_TO_INCOGNITO;
-    return false;
-  }
-  if (!IsExtendedReporting()) {
-    *reason = RequestOutcome::DISABLED_DUE_TO_USER_POPULATION;
-    return false;
-  }
-  return true;
-}
-
-bool ChromePasswordProtectionService::IsHistorySyncEnabled() {
-  syncer::SyncService* sync =
-      ProfileSyncServiceFactory::GetForProfile(profile_);
-  return sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled() &&
-         sync->GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES);
-}
-
-bool ChromePasswordProtectionService::IsPrimaryAccountSyncing() const {
-  syncer::SyncService* sync =
-      ProfileSyncServiceFactory::GetForProfile(profile_);
-  return sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled();
-}
-
-bool ChromePasswordProtectionService::IsPrimaryAccountSignedIn() const {
-  return !GetAccountInfo().account_id.empty() &&
-         !GetAccountInfo().hosted_domain.empty();
-}
-
-// TODO(bdea): Combine the next two methods.
-bool ChromePasswordProtectionService::IsPrimaryAccountGmail() const {
-  return GetAccountInfo().hosted_domain == kNoHostedDomainFound;
-}
-
-bool ChromePasswordProtectionService::IsOtherGaiaAccountGmail(
-    const std::string& username) const {
-  return GetSignedInNonSyncAccount(username).hosted_domain ==
-         kNoHostedDomainFound;
-}
-
-AccountInfo ChromePasswordProtectionService::GetSignedInNonSyncAccount(
-    const std::string& username) const {
-  auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
-      profile_->GetOriginalProfile());
-
-  if (!identity_manager)
-    return AccountInfo();
-
-  std::vector<CoreAccountInfo> signed_in_accounts =
-      identity_manager->GetAccountsWithRefreshTokens();
-  auto account_iterator =
-      std::find_if(signed_in_accounts.begin(), signed_in_accounts.end(),
-                   [username](const auto& account) {
-                     return gaia::AreEmailsSame(account.email, username);
-                   });
-  if (account_iterator == signed_in_accounts.end())
-    return AccountInfo();
-
-  return identity_manager
-      ->FindExtendedAccountInfoForAccountWithRefreshToken(*account_iterator)
-      .value_or(AccountInfo());
-}
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::MaybeLogPasswordReuseDetectedEvent(
     content::WebContents* web_contents) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -764,23 +610,7 @@
   WebUIInfoSingleton::GetInstance()->AddToPGEvents(*specifics);
   user_event_service->RecordUserEvent(std::move(specifics));
 }
-#endif
 
-PasswordReuseEvent::SyncAccountType
-ChromePasswordProtectionService::GetSyncAccountType() const {
-  const AccountInfo account_info = GetAccountInfo();
-  if (!IsPrimaryAccountSignedIn()) {
-    return PasswordReuseEvent::NOT_SIGNED_IN;
-  }
-
-  // For gmail or googlemail account, the hosted_domain will always be
-  // kNoHostedDomainFound.
-  return account_info.hosted_domain == kNoHostedDomainFound
-             ? PasswordReuseEvent::GMAIL
-             : PasswordReuseEvent::GSUITE;
-}
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::MaybeLogPasswordReuseLookupResult(
     content::WebContents* web_contents,
     PasswordReuseLookup::LookupResult result) {
@@ -921,115 +751,7 @@
       break;
   }
 }
-#endif
 
-void ChromePasswordProtectionService::SetLogPasswordCaptureTimer(
-    const base::TimeDelta& delay) {
-  // This will replace any pending timer.
-  log_password_capture_timer_.Start(
-      FROM_HERE, delay,
-      base::BindOnce(&ChromePasswordProtectionService::MaybeLogPasswordCapture,
-                     base::Unretained(this), false));
-}
-
-void ChromePasswordProtectionService::MaybeLogPasswordCapture(bool did_log_in) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  // We skip this event and not set a timer if the profile is in incognito. When
-  // the user logs in in the future, MaybeLogPasswordCapture() will be called
-  // immediately then and will restart the timer.
-  if (IsIncognito() || sync_password_hash_.empty())
-    return;
-
-  syncer::UserEventService* user_event_service =
-      browser_sync::UserEventServiceFactory::GetForProfile(profile_);
-  if (!user_event_service)
-    return;
-
-  std::unique_ptr<UserEventSpecifics> specifics = GetNewUserEventSpecifics();
-  auto* const password_captured =
-      specifics->mutable_gaia_password_captured_event();
-  password_captured->set_event_trigger(
-      did_log_in ? GaiaPasswordCaptured::USER_LOGGED_IN
-                 : GaiaPasswordCaptured::EXPIRED_28D_TIMER);
-
-  WebUIInfoSingleton::GetInstance()->AddToPGEvents(*specifics);
-  user_event_service->RecordUserEvent(std::move(specifics));
-
-  // Set a timer to log it again in 24-28 days. Spread it to avoid hammering the
-  // backend with fixed cycle after this code lands in Stable.
-  base::TimeDelta delay = base::TimeDelta::FromDays(
-      (kPasswordCaptureEventLogFreqDaysMin +
-       base::RandInt(0, kPasswordCaptureEventLogFreqDaysExtra)));
-  SetLogPasswordCaptureTimer(delay);
-
-  // Write the deadline to a pref to carry over restarts.
-  SetDelayInPref(profile_->GetPrefs(),
-                 prefs::kSafeBrowsingNextPasswordCaptureEventLogTime, delay);
-}
-
-void ChromePasswordProtectionService::UpdateSecurityState(
-    SBThreatType threat_type,
-    ReusedPasswordAccountType password_type,
-    content::WebContents* web_contents) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  const GURL url = web_contents->GetLastCommittedURL();
-  if (!url.is_valid())
-    return;
-
-  const GURL url_with_empty_path = url.GetWithEmptyPath();
-  if (threat_type == SB_THREAT_TYPE_SAFE) {
-    ui_manager_->RemoveWhitelistUrlSet(url_with_empty_path, web_contents,
-                                       /*from_pending_only=*/false);
-    // Overrides cached verdicts.
-    LoginReputationClientResponse verdict;
-    GetCachedVerdict(url, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-                     password_type, &verdict);
-    verdict.set_verdict_type(LoginReputationClientResponse::SAFE);
-    verdict.set_cache_duration_sec(kOverrideVerdictCacheDurationSec);
-    CacheVerdict(url, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-                 password_type, verdict, base::Time::Now());
-    return;
-  }
-
-  SBThreatType current_threat_type = SB_THREAT_TYPE_UNUSED;
-  // If user already click-through interstitial warning, or if there's already
-  // a dangerous security state showing, we'll override it.
-  if (ui_manager_->IsUrlWhitelistedOrPendingForWebContents(
-          url_with_empty_path, /*is_subresource=*/false,
-          web_contents->GetController().GetLastCommittedEntry(), web_contents,
-          /*whitelist_only=*/false, &current_threat_type)) {
-    DCHECK_NE(SB_THREAT_TYPE_UNUSED, current_threat_type);
-    if (current_threat_type == threat_type)
-      return;
-    // Resets previous threat type.
-    ui_manager_->RemoveWhitelistUrlSet(url_with_empty_path, web_contents,
-                                       /*from_pending_only=*/false);
-  }
-  ui_manager_->AddToWhitelistUrlSet(url_with_empty_path, web_contents,
-                                    /*is_pending=*/true, threat_type);
-}
-
-void ChromePasswordProtectionService::
-    RemoveUnhandledSyncPasswordReuseOnURLsDeleted(
-        bool all_history,
-        const history::URLRows& deleted_rows) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  DictionaryPrefUpdate unhandled_sync_password_reuses(
-      profile_->GetPrefs(), prefs::kSafeBrowsingUnhandledGaiaPasswordReuses);
-  if (all_history) {
-    unhandled_sync_password_reuses->Clear();
-    return;
-  }
-
-  for (const history::URLRow& row : deleted_rows) {
-    if (!row.url().SchemeIsHTTPOrHTTPS())
-      continue;
-    unhandled_sync_password_reuses->RemoveKey(
-        Origin::Create(row.url()).Serialize());
-  }
-}
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::
     CheckGaiaPasswordChangeForAllSignedInUsers(const std::string& username) {
   // If the sync password has changed, report the change.
@@ -1074,39 +796,7 @@
       (is_other_gaia_password && !IsOtherGaiaAccountGmail(username)))
     ReportPasswordChanged();
 }
-#endif
 
-bool ChromePasswordProtectionService::UserClickedThroughSBInterstitial(
-    content::WebContents* web_contents) {
-  SBThreatType current_threat_type;
-  if (!ui_manager_->IsUrlWhitelistedOrPendingForWebContents(
-          web_contents->GetLastCommittedURL().GetWithEmptyPath(),
-          /*is_subresource=*/false,
-          web_contents->GetController().GetLastCommittedEntry(), web_contents,
-          /*whitelist_only=*/true, &current_threat_type)) {
-    return false;
-  }
-  return current_threat_type == SB_THREAT_TYPE_URL_PHISHING ||
-         current_threat_type == SB_THREAT_TYPE_URL_MALWARE ||
-         current_threat_type == SB_THREAT_TYPE_URL_UNWANTED ||
-         current_threat_type == SB_THREAT_TYPE_URL_CLIENT_SIDE_PHISHING ||
-         current_threat_type == SB_THREAT_TYPE_URL_CLIENT_SIDE_MALWARE;
-}
-
-AccountInfo ChromePasswordProtectionService::GetAccountInfo() const {
-  auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
-      profile_->GetOriginalProfile());
-  if (!identity_manager)
-    return AccountInfo();
-
-  base::Optional<AccountInfo> primary_account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo());
-
-  return primary_account_info.value_or(AccountInfo());
-}
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 GURL ChromePasswordProtectionService::GetEnterpriseChangePasswordURL() const {
   // If change password URL is specified in preferences, returns the
   // corresponding pref value.
@@ -1143,9 +833,7 @@
   return google_util::AppendGoogleLocaleParam(
       change_password_url, g_browser_process->GetApplicationLocale());
 }
-#endif
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::HandleUserActionOnModalWarning(
     content::WebContents* web_contents,
     ReusedPasswordAccountType password_type,
@@ -1278,76 +966,7 @@
                             network::mojom::ReferrerPolicy::kDefault),
           /*in_new_tab=*/false);
 }
-#endif
 
-ChromePasswordProtectionService::ChromePasswordProtectionService(
-    Profile* profile,
-    scoped_refptr<SafeBrowsingUIManager> ui_manager,
-    StringProvider sync_password_hash_provider,
-    VerdictCacheManager* cache_manager)
-    : PasswordProtectionService(nullptr, nullptr, nullptr),
-      ui_manager_(ui_manager),
-      trigger_manager_(nullptr),
-      profile_(profile),
-      cache_manager_(cache_manager),
-      sync_password_hash_provider_for_testing_(sync_password_hash_provider) {
-  Init();
-}
-
-std::unique_ptr<PasswordProtectionNavigationThrottle>
-MaybeCreateNavigationThrottle(content::NavigationHandle* navigation_handle) {
-  Profile* profile = Profile::FromBrowserContext(
-      navigation_handle->GetWebContents()->GetBrowserContext());
-  ChromePasswordProtectionService* service =
-      ChromePasswordProtectionService::GetPasswordProtectionService(profile);
-  // |service| can be null in tests.
-  return service ? service->MaybeCreateNavigationThrottle(navigation_handle)
-                 : nullptr;
-}
-
-PasswordProtectionTrigger
-ChromePasswordProtectionService::GetPasswordProtectionWarningTriggerPref(
-    ReusedPasswordAccountType password_type) const {
-  if (password_type.account_type() == ReusedPasswordAccountType::GMAIL)
-    return PHISHING_REUSE;
-
-  bool is_policy_managed = profile_->GetPrefs()->HasPrefPath(
-      prefs::kPasswordProtectionWarningTrigger);
-  PasswordProtectionTrigger trigger_level =
-      static_cast<PasswordProtectionTrigger>(profile_->GetPrefs()->GetInteger(
-          prefs::kPasswordProtectionWarningTrigger));
-  return is_policy_managed ? trigger_level : PHISHING_REUSE;
-}
-
-bool ChromePasswordProtectionService::IsURLWhitelistedForPasswordEntry(
-    const GURL& url,
-    RequestOutcome* reason) const {
-  if (!profile_)
-    return false;
-
-  PrefService* prefs = profile_->GetPrefs();
-  if (IsURLWhitelistedByPolicy(url, *prefs)) {
-    *reason = RequestOutcome::MATCHED_ENTERPRISE_WHITELIST;
-    return true;
-  }
-
-  // Checks if |url| matches the change password url configured in enterprise
-  // policy.
-  if (MatchesPasswordProtectionChangePasswordURL(url, *prefs)) {
-    *reason = RequestOutcome::MATCHED_ENTERPRISE_CHANGE_PASSWORD_URL;
-    return true;
-  }
-
-  // Checks if |url| matches any login url configured in enterprise policy.
-  if (MatchesPasswordProtectionLoginURL(url, *prefs)) {
-    *reason = RequestOutcome::MATCHED_ENTERPRISE_LOGIN_URL;
-    return true;
-  }
-
-  return false;
-}
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 base::string16 ChromePasswordProtectionService::GetWarningDetailText(
     ReusedPasswordAccountType password_type) const {
   DCHECK(password_type.account_type() == ReusedPasswordAccountType::GSUITE ||
@@ -1440,46 +1059,7 @@
   return web_contents_with_unhandled_enterprise_reuses_.find(web_contents) !=
          web_contents_with_unhandled_enterprise_reuses_.end();
 }
-#endif
 
-// TODO(crbug.com/995926): Enable caching on Android
-#if BUILDFLAG(FULL_SAFE_BROWSING)
-// Stores |verdict| in |settings| based on its |trigger_type|, |url|,
-// reused |password_type|, |verdict| and |receive_time|.
-void ChromePasswordProtectionService::CacheVerdict(
-    const GURL& url,
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    const LoginReputationClientResponse& verdict,
-    const base::Time& receive_time) {
-  if (!CanGetReputationOfURL(url) || IsIncognito())
-    return;
-  cache_manager_->CachePhishGuardVerdict(url, trigger_type, password_type,
-                                         verdict, receive_time);
-}
-
-// Looks up |settings| to find the cached verdict response. If verdict is not
-// available or is expired, return VERDICT_TYPE_UNSPECIFIED. Can be called on
-// any thread.
-LoginReputationClientResponse::VerdictType
-ChromePasswordProtectionService::GetCachedVerdict(
-    const GURL& url,
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    LoginReputationClientResponse* out_response) {
-  if (!url.is_valid() || !CanGetReputationOfURL(url))
-    return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
-  return cache_manager_->GetCachedPhishGuardVerdict(
-      url, trigger_type, password_type, out_response);
-}
-
-int ChromePasswordProtectionService::GetStoredVerdictCount(
-    LoginReputationClientRequest::TriggerType trigger_type) {
-  return cache_manager_->GetStoredPhishGuardVerdictCount(trigger_type);
-}
-#endif
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 void ChromePasswordProtectionService::OnWarningTriggerChanged() {
   const base::Value* pref_value = pref_change_registrar_->prefs()->Get(
       prefs::kPasswordProtectionWarningTrigger);
@@ -1521,9 +1101,410 @@
   LogPasswordAlertModeOutcome(reason, password_type);
   return reason == RequestOutcome::SUCCEEDED;
 }
+
+void ChromePasswordProtectionService::SetLogPasswordCaptureTimer(
+    const base::TimeDelta& delay) {
+  // This will replace any pending timer.
+  log_password_capture_timer_.Start(
+      FROM_HERE, delay,
+      base::BindOnce(&ChromePasswordProtectionService::MaybeLogPasswordCapture,
+                     base::Unretained(this), false));
+}
+
+void ChromePasswordProtectionService::MaybeLogPasswordCapture(bool did_log_in) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // We skip this event and not set a timer if the profile is in incognito. When
+  // the user logs in in the future, MaybeLogPasswordCapture() will be called
+  // immediately then and will restart the timer.
+  if (IsIncognito() || sync_password_hash_.empty())
+    return;
+
+  syncer::UserEventService* user_event_service =
+      browser_sync::UserEventServiceFactory::GetForProfile(profile_);
+  if (!user_event_service)
+    return;
+
+  std::unique_ptr<UserEventSpecifics> specifics = GetNewUserEventSpecifics();
+  auto* const password_captured =
+      specifics->mutable_gaia_password_captured_event();
+  password_captured->set_event_trigger(
+      did_log_in ? GaiaPasswordCaptured::USER_LOGGED_IN
+                 : GaiaPasswordCaptured::EXPIRED_28D_TIMER);
+
+  WebUIInfoSingleton::GetInstance()->AddToPGEvents(*specifics);
+  user_event_service->RecordUserEvent(std::move(specifics));
+
+  // Set a timer to log it again in 24-28 days. Spread it to avoid hammering the
+  // backend with fixed cycle after this code lands in Stable.
+  base::TimeDelta delay = base::TimeDelta::FromDays(
+      (kPasswordCaptureEventLogFreqDaysMin +
+       base::RandInt(0, kPasswordCaptureEventLogFreqDaysExtra)));
+  SetLogPasswordCaptureTimer(delay);
+
+  // Write the deadline to a pref to carry over restarts.
+  SetDelayInPref(profile_->GetPrefs(),
+                 prefs::kSafeBrowsingNextPasswordCaptureEventLogTime, delay);
+}
+
+void ChromePasswordProtectionService::UpdateSecurityState(
+    SBThreatType threat_type,
+    ReusedPasswordAccountType password_type,
+    content::WebContents* web_contents) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  const GURL url = web_contents->GetLastCommittedURL();
+  if (!url.is_valid())
+    return;
+
+  const GURL url_with_empty_path = url.GetWithEmptyPath();
+  if (threat_type == SB_THREAT_TYPE_SAFE) {
+    ui_manager_->RemoveWhitelistUrlSet(url_with_empty_path, web_contents,
+                                       /*from_pending_only=*/false);
+    // Overrides cached verdicts.
+    LoginReputationClientResponse verdict;
+    GetCachedVerdict(url, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
+                     password_type, &verdict);
+    verdict.set_verdict_type(LoginReputationClientResponse::SAFE);
+    verdict.set_cache_duration_sec(kOverrideVerdictCacheDurationSec);
+    CacheVerdict(url, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
+                 password_type, verdict, base::Time::Now());
+    return;
+  }
+
+  SBThreatType current_threat_type = SB_THREAT_TYPE_UNUSED;
+  // If user already click-through interstitial warning, or if there's already
+  // a dangerous security state showing, we'll override it.
+  if (ui_manager_->IsUrlWhitelistedOrPendingForWebContents(
+          url_with_empty_path, /*is_subresource=*/false,
+          web_contents->GetController().GetLastCommittedEntry(), web_contents,
+          /*whitelist_only=*/false, &current_threat_type)) {
+    DCHECK_NE(SB_THREAT_TYPE_UNUSED, current_threat_type);
+    if (current_threat_type == threat_type)
+      return;
+    // Resets previous threat type.
+    ui_manager_->RemoveWhitelistUrlSet(url_with_empty_path, web_contents,
+                                       /*from_pending_only=*/false);
+  }
+  ui_manager_->AddToWhitelistUrlSet(url_with_empty_path, web_contents,
+                                    /*is_pending=*/true, threat_type);
+}
 #endif
 
+const policy::BrowserPolicyConnector*
+ChromePasswordProtectionService::GetBrowserPolicyConnector() const {
+  return g_browser_process->browser_policy_connector();
+}
+
+void ChromePasswordProtectionService::FillReferrerChain(
+    const GURL& event_url,
+    SessionID event_tab_id,
+    LoginReputationClientRequest::Frame* frame) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  SafeBrowsingNavigationObserverManager::AttributionResult result =
+      navigation_observer_manager_->IdentifyReferrerChainByEventURL(
+          event_url, event_tab_id, kPasswordEventAttributionUserGestureLimit,
+          frame->mutable_referrer_chain());
+  size_t referrer_chain_length = frame->referrer_chain().size();
+  UMA_HISTOGRAM_COUNTS_100(
+      "SafeBrowsing.ReferrerURLChainSize.PasswordEventAttribution",
+      referrer_chain_length);
+  UMA_HISTOGRAM_ENUMERATION(
+      "SafeBrowsing.ReferrerAttributionResult.PasswordEventAttribution", result,
+      SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX);
+
+  // Determines how many recent navigation events to append to referrer chain.
+  size_t recent_navigations_to_collect =
+      profile_ ? SafeBrowsingNavigationObserverManager::
+                     CountOfRecentNavigationsToAppend(*profile_, result)
+               : 0u;
+  navigation_observer_manager_->AppendRecentNavigations(
+      recent_navigations_to_collect, frame->mutable_referrer_chain());
+}
+
+std::string ChromePasswordProtectionService::GetSyncPasswordHashFromPrefs() {
+  if (!sync_password_hash_provider_for_testing_.is_null())
+    return sync_password_hash_provider_for_testing_.Run();
+
+  password_manager::HashPasswordManager hash_password_manager;
+  hash_password_manager.set_prefs(profile_->GetPrefs());
+  base::Optional<password_manager::PasswordHashData> sync_hash_data =
+      hash_password_manager.RetrievePasswordHash(GetAccountInfo().email,
+                                                 /*is_gaia_password=*/true);
+  return sync_hash_data ? base::NumberToString(sync_hash_data->hash)
+                        : std::string();
+}
+
+PrefService* ChromePasswordProtectionService::GetPrefs() {
+  return profile_->GetPrefs();
+}
+
+bool ChromePasswordProtectionService::IsSafeBrowsingEnabled() {
+  return GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled);
+}
+
+bool ChromePasswordProtectionService::IsExtendedReporting() {
+  return IsExtendedReportingEnabled(*GetPrefs());
+}
+
+bool ChromePasswordProtectionService::IsIncognito() {
+  return profile_->IsOffTheRecord();
+}
+
+bool ChromePasswordProtectionService::IsPingingEnabled(
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    RequestOutcome* reason) {
+  if (!IsSafeBrowsingEnabled()) {
+    *reason = RequestOutcome::SAFE_BROWSING_DISABLED;
+    return false;
+  }
+  if (trigger_type == LoginReputationClientRequest::PASSWORD_REUSE_EVENT) {
+    if (password_type.account_type() ==
+        ReusedPasswordAccountType::SAVED_PASSWORD)
+      return IsExtendedReporting();
+
+    PasswordProtectionTrigger trigger_level =
+        GetPasswordProtectionWarningTriggerPref(password_type);
+    // Only override policy if password protection is off for Gmail users.
+    if (trigger_level == PASSWORD_PROTECTION_OFF) {
+      *reason = RequestOutcome::TURNED_OFF_BY_ADMIN;
+      return false;
+    }
+    return true;
+  }
+
+  // Password field on focus pinging is enabled for !incognito &&
+  // extended_reporting.
+  if (IsIncognito()) {
+    *reason = RequestOutcome::DISABLED_DUE_TO_INCOGNITO;
+    return false;
+  }
+  if (!IsExtendedReporting()) {
+    *reason = RequestOutcome::DISABLED_DUE_TO_USER_POPULATION;
+    return false;
+  }
+  return true;
+}
+
+bool ChromePasswordProtectionService::IsHistorySyncEnabled() {
+  syncer::SyncService* sync =
+      ProfileSyncServiceFactory::GetForProfile(profile_);
+  return sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled() &&
+         sync->GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES);
+}
+
+bool ChromePasswordProtectionService::IsPrimaryAccountSyncing() const {
+  syncer::SyncService* sync =
+      ProfileSyncServiceFactory::GetForProfile(profile_);
+  return sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled();
+}
+
+bool ChromePasswordProtectionService::IsPrimaryAccountSignedIn() const {
+  return !GetAccountInfo().account_id.empty() &&
+         !GetAccountInfo().hosted_domain.empty();
+}
+
+// TODO(bdea): Combine the next two methods.
+bool ChromePasswordProtectionService::IsPrimaryAccountGmail() const {
+  return GetAccountInfo().hosted_domain == kNoHostedDomainFound;
+}
+
+bool ChromePasswordProtectionService::IsOtherGaiaAccountGmail(
+    const std::string& username) const {
+  return GetSignedInNonSyncAccount(username).hosted_domain ==
+         kNoHostedDomainFound;
+}
+
+AccountInfo ChromePasswordProtectionService::GetSignedInNonSyncAccount(
+    const std::string& username) const {
+  auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
+      profile_->GetOriginalProfile());
+
+  if (!identity_manager)
+    return AccountInfo();
+
+  std::vector<CoreAccountInfo> signed_in_accounts =
+      identity_manager->GetAccountsWithRefreshTokens();
+  auto account_iterator =
+      std::find_if(signed_in_accounts.begin(), signed_in_accounts.end(),
+                   [username](const auto& account) {
+                     return gaia::AreEmailsSame(account.email, username);
+                   });
+  if (account_iterator == signed_in_accounts.end())
+    return AccountInfo();
+
+  return identity_manager
+      ->FindExtendedAccountInfoForAccountWithRefreshToken(*account_iterator)
+      .value_or(AccountInfo());
+}
+
+PasswordReuseEvent::SyncAccountType
+ChromePasswordProtectionService::GetSyncAccountType() const {
+  const AccountInfo account_info = GetAccountInfo();
+  if (!IsPrimaryAccountSignedIn()) {
+    return PasswordReuseEvent::NOT_SIGNED_IN;
+  }
+
+  // For gmail or googlemail account, the hosted_domain will always be
+  // kNoHostedDomainFound.
+  return account_info.hosted_domain == kNoHostedDomainFound
+             ? PasswordReuseEvent::GMAIL
+             : PasswordReuseEvent::GSUITE;
+}
+
+void ChromePasswordProtectionService::
+    RemoveUnhandledSyncPasswordReuseOnURLsDeleted(
+        bool all_history,
+        const history::URLRows& deleted_rows) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  DictionaryPrefUpdate unhandled_sync_password_reuses(
+      profile_->GetPrefs(), prefs::kSafeBrowsingUnhandledGaiaPasswordReuses);
+  if (all_history) {
+    unhandled_sync_password_reuses->Clear();
+    return;
+  }
+
+  for (const history::URLRow& row : deleted_rows) {
+    if (!row.url().SchemeIsHTTPOrHTTPS())
+      continue;
+    unhandled_sync_password_reuses->RemoveKey(
+        Origin::Create(row.url()).Serialize());
+  }
+}
+
+bool ChromePasswordProtectionService::UserClickedThroughSBInterstitial(
+    content::WebContents* web_contents) {
+  SBThreatType current_threat_type;
+  if (!ui_manager_->IsUrlWhitelistedOrPendingForWebContents(
+          web_contents->GetLastCommittedURL().GetWithEmptyPath(),
+          /*is_subresource=*/false,
+          web_contents->GetController().GetLastCommittedEntry(), web_contents,
+          /*whitelist_only=*/true, &current_threat_type)) {
+    return false;
+  }
+  return current_threat_type == SB_THREAT_TYPE_URL_PHISHING ||
+         current_threat_type == SB_THREAT_TYPE_URL_MALWARE ||
+         current_threat_type == SB_THREAT_TYPE_URL_UNWANTED ||
+         current_threat_type == SB_THREAT_TYPE_URL_CLIENT_SIDE_PHISHING ||
+         current_threat_type == SB_THREAT_TYPE_URL_CLIENT_SIDE_MALWARE;
+}
+
+AccountInfo ChromePasswordProtectionService::GetAccountInfo() const {
+  auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
+      profile_->GetOriginalProfile());
+  if (!identity_manager)
+    return AccountInfo();
+
+  base::Optional<AccountInfo> primary_account_info =
+      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
+          identity_manager->GetPrimaryAccountInfo());
+
+  return primary_account_info.value_or(AccountInfo());
+}
+
+ChromePasswordProtectionService::ChromePasswordProtectionService(
+    Profile* profile,
+    scoped_refptr<SafeBrowsingUIManager> ui_manager,
+    StringProvider sync_password_hash_provider,
+    VerdictCacheManager* cache_manager)
+    : PasswordProtectionService(nullptr, nullptr, nullptr),
+      ui_manager_(ui_manager),
+      trigger_manager_(nullptr),
+      profile_(profile),
+      cache_manager_(cache_manager),
+      sync_password_hash_provider_for_testing_(sync_password_hash_provider) {
+  Init();
+}
+
+std::unique_ptr<PasswordProtectionNavigationThrottle>
+MaybeCreateNavigationThrottle(content::NavigationHandle* navigation_handle) {
+  Profile* profile = Profile::FromBrowserContext(
+      navigation_handle->GetWebContents()->GetBrowserContext());
+  ChromePasswordProtectionService* service =
+      ChromePasswordProtectionService::GetPasswordProtectionService(profile);
+  // |service| can be null in tests.
+  return service ? service->MaybeCreateNavigationThrottle(navigation_handle)
+                 : nullptr;
+}
+
+PasswordProtectionTrigger
+ChromePasswordProtectionService::GetPasswordProtectionWarningTriggerPref(
+    ReusedPasswordAccountType password_type) const {
+  if (password_type.account_type() == ReusedPasswordAccountType::GMAIL)
+    return PHISHING_REUSE;
+
+  bool is_policy_managed = profile_->GetPrefs()->HasPrefPath(
+      prefs::kPasswordProtectionWarningTrigger);
+  PasswordProtectionTrigger trigger_level =
+      static_cast<PasswordProtectionTrigger>(profile_->GetPrefs()->GetInteger(
+          prefs::kPasswordProtectionWarningTrigger));
+  return is_policy_managed ? trigger_level : PHISHING_REUSE;
+}
+
+bool ChromePasswordProtectionService::IsURLWhitelistedForPasswordEntry(
+    const GURL& url,
+    RequestOutcome* reason) const {
+  if (!profile_)
+    return false;
+
+  PrefService* prefs = profile_->GetPrefs();
+  if (IsURLWhitelistedByPolicy(url, *prefs)) {
+    *reason = RequestOutcome::MATCHED_ENTERPRISE_WHITELIST;
+    return true;
+  }
+
+  // Checks if |url| matches the change password url configured in enterprise
+  // policy.
+  if (MatchesPasswordProtectionChangePasswordURL(url, *prefs)) {
+    *reason = RequestOutcome::MATCHED_ENTERPRISE_CHANGE_PASSWORD_URL;
+    return true;
+  }
+
+  // Checks if |url| matches any login url configured in enterprise policy.
+  if (MatchesPasswordProtectionLoginURL(url, *prefs)) {
+    *reason = RequestOutcome::MATCHED_ENTERPRISE_LOGIN_URL;
+    return true;
+  }
+
+  return false;
+}
+
+// TODO(crbug.com/995926): Enable caching on Android
 #if BUILDFLAG(FULL_SAFE_BROWSING)
+// Stores |verdict| in |settings| based on its |trigger_type|, |url|,
+// reused |password_type|, |verdict| and |receive_time|.
+void ChromePasswordProtectionService::CacheVerdict(
+    const GURL& url,
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    const LoginReputationClientResponse& verdict,
+    const base::Time& receive_time) {
+  if (!CanGetReputationOfURL(url) || IsIncognito())
+    return;
+  cache_manager_->CachePhishGuardVerdict(url, trigger_type, password_type,
+                                         verdict, receive_time);
+}
+
+// Looks up |settings| to find the cached verdict response. If verdict is not
+// available or is expired, return VERDICT_TYPE_UNSPECIFIED. Can be called on
+// any thread.
+LoginReputationClientResponse::VerdictType
+ChromePasswordProtectionService::GetCachedVerdict(
+    const GURL& url,
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    LoginReputationClientResponse* out_response) {
+  if (!url.is_valid() || !CanGetReputationOfURL(url))
+    return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
+  return cache_manager_->GetCachedPhishGuardVerdict(
+      url, trigger_type, password_type, out_response);
+}
+
+int ChromePasswordProtectionService::GetStoredVerdictCount(
+    LoginReputationClientRequest::TriggerType trigger_type) {
+  return cache_manager_->GetStoredPhishGuardVerdictCount(trigger_type);
+}
+
 bool ChromePasswordProtectionService::IsUnderAdvancedProtection() {
   return AdvancedProtectionStatusManagerFactory::GetForProfile(profile_)
       ->is_under_advanced_protection();
@@ -1534,6 +1515,6 @@
              BrowserList::GetInstance()->GetLastActive())
       ->GetContentsSize();
 }
-#endif  // FULLL_SAFE_BROWSING
+#endif  // FULL_SAFE_BROWSING
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index a75c227..ba18035 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -69,7 +69,6 @@
 std::unique_ptr<PasswordProtectionNavigationThrottle>
 MaybeCreateNavigationThrottle(content::NavigationHandle* navigation_handle);
 
-// TODO(xinghuilu@): Rearrange this file to reduce number of #ifs
 // ChromePasswordProtectionService extends PasswordProtectionService by adding
 // access to SafeBrowsingNaivigationObserverManager and Profile.
 class ChromePasswordProtectionService : public PasswordProtectionService {
@@ -158,41 +157,14 @@
   // specifies whether the account is syncing or not syncing (content area).
   void OnGaiaPasswordChanged(const std::string& username,
                              bool is_other_gaia_password);
-#endif
 
-  // If user has clicked through any Safe Browsing interstitial on this given
-  // |web_contents|.
-  bool UserClickedThroughSBInterstitial(
-      content::WebContents* web_contents) override;
-
-  // If |prefs::kPasswordProtectionWarningTrigger| is not managed by enterprise
-  // policy, this function should always return PHISHING_REUSE. Otherwise,
-  // returns the specified pref value adjusted for the given username's account
-  // type.
-  PasswordProtectionTrigger GetPasswordProtectionWarningTriggerPref(
-      ReusedPasswordAccountType password_type) const override;
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // Gets the enterprise change password URL if specified in policy,
   // otherwise gets the default GAIA change password URL.
   GURL GetEnterpriseChangePasswordURL() const;
 
   // Gets the GAIA change password URL based on |account_info_|.
   GURL GetDefaultChangePasswordURL() const;
-#endif
 
-  // If |url| matches Safe Browsing whitelist domains, password protection
-  // change password URL, or password protection login URLs in the enterprise
-  // policy.
-  bool IsURLWhitelistedForPasswordEntry(const GURL& url,
-                                        RequestOutcome* reason) const override;
-
-  // Gets the type of sync account associated with current profile or
-  // |NOT_SIGNED_IN|.
-  LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType
-  GetSyncAccountType() const override;
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // Gets the detailed warning text that should show in the modal warning dialog
   // and page info bubble.
   base::string16 GetWarningDetailText(
@@ -224,6 +196,29 @@
       content::WebContents* web_contents) const;
 #endif
 
+  // If user has clicked through any Safe Browsing interstitial on this given
+  // |web_contents|.
+  bool UserClickedThroughSBInterstitial(
+      content::WebContents* web_contents) override;
+
+  // If |prefs::kPasswordProtectionWarningTrigger| is not managed by enterprise
+  // policy, this function should always return PHISHING_REUSE. Otherwise,
+  // returns the specified pref value adjusted for the given username's account
+  // type.
+  PasswordProtectionTrigger GetPasswordProtectionWarningTriggerPref(
+      ReusedPasswordAccountType password_type) const override;
+
+  // If |url| matches Safe Browsing whitelist domains, password protection
+  // change password URL, or password protection login URLs in the enterprise
+  // policy.
+  bool IsURLWhitelistedForPasswordEntry(const GURL& url,
+                                        RequestOutcome* reason) const override;
+
+  // Gets the type of sync account associated with current profile or
+  // |NOT_SIGNED_IN|.
+  LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType
+  GetSyncAccountType() const override;
+
 // TODO(crbug.com/995926): Enable caching on Android
 // Note: Before enable verdict cache manager on Android,
 // add CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION to Android
@@ -310,19 +305,7 @@
       RequestOutcome outcome,
       PasswordType password_type,
       const LoginReputationClientResponse* response) override;
-#endif
-  // Updates security state for the current |web_contents| based on
-  // |threat_type| and reused |password_type|, such that page info bubble will
-  // show appropriate status when user clicks on the security chip.
-  void UpdateSecurityState(SBThreatType threat_type,
-                           ReusedPasswordAccountType password_type,
-                           content::WebContents* web_contents) override;
 
-  void RemoveUnhandledSyncPasswordReuseOnURLsDeleted(
-      bool all_history,
-      const history::URLRows& deleted_rows) override;
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   void HandleUserActionOnModalWarning(
       content::WebContents* web_contents,
       ReusedPasswordAccountType password_type,
@@ -341,23 +324,33 @@
 
   void HandleResetPasswordOnInterstitial(content::WebContents* web_contents,
                                          WarningAction action);
-#endif
-  // Returns base-10 string representation of the uint64t hash.
-  std::string GetSyncPasswordHashFromPrefs();
 
-  void SetGaiaPasswordHashForTesting(const std::string& new_password_hash) {
-    sync_password_hash_ = new_password_hash;
-  }
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // Determines if we should show chrome://reset-password interstitial based on
   // previous request outcome, the reused |password_type| and the
   // |main_frame_url|.
   bool CanShowInterstitial(RequestOutcome reason,
                            ReusedPasswordAccountType password_type,
                            const GURL& main_frame_url) override;
+
+  // Updates security state for the current |web_contents| based on
+  // |threat_type| and reused |password_type|, such that page info bubble will
+  // show appropriate status when user clicks on the security chip.
+  void UpdateSecurityState(SBThreatType threat_type,
+                           ReusedPasswordAccountType password_type,
+                           content::WebContents* web_contents) override;
 #endif
 
+  void RemoveUnhandledSyncPasswordReuseOnURLsDeleted(
+      bool all_history,
+      const history::URLRows& deleted_rows) override;
+  // Returns base-10 string representation of the uint64t hash.
+
+  std::string GetSyncPasswordHashFromPrefs();
+
+  void SetGaiaPasswordHashForTesting(const std::string& new_password_hash) {
+    sync_password_hash_ = new_password_hash;
+  }
+
   // Unit tests
   FRIEND_TEST_ALL_PREFIXES(ChromePasswordProtectionServiceTest,
                            VerifyUserPopulationForPasswordOnFocusPing);
@@ -440,14 +433,7 @@
       int64_t navigation_id,
       sync_pb::GaiaPasswordReuse::PasswordReuseDialogInteraction::
           InteractionResult interaction_result);
-#endif
 
-  // Log that we captured the password, either due to log-in or by timer.
-  // This also sets the reoccuring timer.
-  void MaybeLogPasswordCapture(bool did_log_in);
-  void SetLogPasswordCaptureTimer(const base::TimeDelta& delay);
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   void OnModalWarningShownForGaiaPassword(
       content::WebContents* web_contents,
       ReusedPasswordAccountType password_type,
@@ -457,6 +443,24 @@
       content::WebContents* web_contents,
       ReusedPasswordAccountType password_type,
       const std::string& verdict_token);
+
+  // If enterprise admin turns off password protection, removes all captured
+  // enterprise password hashes.
+  void OnWarningTriggerChanged();
+
+  // Informs PasswordReuseDetector that enterprise password URLs (login URL or
+  // change password URL) have been changed.
+  void OnEnterprisePasswordUrlChanged();
+
+  // Log that we captured the password, either due to log-in or by timer.
+  // This also sets the reoccuring timer.
+  void MaybeLogPasswordCapture(bool did_log_in);
+  void SetLogPasswordCaptureTimer(const base::TimeDelta& delay);
+#endif
+
+#if BUILDFLAG(FULL_SAFE_BROWSING)
+  // Get the content area size of current browsing window.
+  gfx::Size GetCurrentContentAreaSize() const override;
 #endif
 
   // Constructor used for tests only.
@@ -469,21 +473,6 @@
   // Code shared by both ctors.
   void Init();
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
-  // If enterprise admin turns off password protection, removes all captured
-  // enterprise password hashes.
-  void OnWarningTriggerChanged();
-
-  // Informs PasswordReuseDetector that enterprise password URLs (login URL or
-  // change password URL) have been changed.
-  void OnEnterprisePasswordUrlChanged();
-#endif
-
-#if BUILDFLAG(FULL_SAFE_BROWSING)
-  // Get the content area size of current browsing window.
-  gfx::Size GetCurrentContentAreaSize() const override;
-#endif
-
   scoped_refptr<SafeBrowsingUIManager> ui_manager_;
   TriggerManager* trigger_manager_;
   // Profile associated with this instance.
diff --git a/chrome/browser/safe_browsing/download_protection/binary_upload_service.cc b/chrome/browser/safe_browsing/download_protection/binary_upload_service.cc
index 1097e5c..b9527c2 100644
--- a/chrome/browser/safe_browsing/download_protection/binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/download_protection/binary_upload_service.cc
@@ -25,7 +25,6 @@
 namespace safe_browsing {
 namespace {
 
-const size_t kMaxUploadSizeBytes = 50 * 1024 * 1024;  // 50 MB
 const int kScanningTimeoutSeconds = 5 * 60;           // 5 minutes
 const char kSbBinaryUploadUrl[] =
     "https://safebrowsing.google.com/safebrowsing/uploads/webprotect";
@@ -55,12 +54,6 @@
   Request* raw_request = request.get();
   active_requests_[raw_request] = std::move(request);
 
-  if (raw_request->GetFileSize() > kMaxUploadSizeBytes) {
-    FinishRequest(raw_request, Result::FILE_TOO_LARGE,
-                  DeepScanningClientResponse());
-    return;
-  }
-
   if (!binary_fcm_service_) {
     FinishRequest(raw_request, Result::FAILED_TO_GET_TOKEN,
                   DeepScanningClientResponse());
@@ -96,16 +89,22 @@
   }
 
   request->set_fcm_token(instance_id);
-  request->GetFileContents(
-      base::BindOnce(&BinaryUploadService::OnGetFileContents,
-                     weakptr_factory_.GetWeakPtr(), request));
+  request->GetRequestData(base::BindOnce(&BinaryUploadService::OnGetRequestData,
+                                         weakptr_factory_.GetWeakPtr(),
+                                         request));
 }
 
-void BinaryUploadService::OnGetFileContents(Request* request,
-                                            const std::string& file_contents) {
+void BinaryUploadService::OnGetRequestData(Request* request,
+                                           Result result,
+                                           const Request::Data& data) {
   if (!IsActive(request))
     return;
 
+  if (result != Result::SUCCESS) {
+    FinishRequest(request, result, DeepScanningClientResponse());
+    return;
+  }
+
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("safe_browsing_binary_upload", R"(
         semantics {
@@ -149,7 +148,7 @@
   base::Base64Encode(metadata, &metadata);
 
   auto upload_request = MultipartUploadRequest::Create(
-      url_loader_factory_, GURL(kSbBinaryUploadUrl), metadata, file_contents,
+      url_loader_factory_, GURL(kSbBinaryUploadUrl), metadata, data.contents,
       traffic_annotation,
       base::BindOnce(&BinaryUploadService::OnUploadComplete,
                      weakptr_factory_.GetWeakPtr(), request));
@@ -255,6 +254,8 @@
   }
 }
 
+BinaryUploadService::Request::Data::Data() = default;
+
 BinaryUploadService::Request::Request(Callback callback)
     : callback_(std::move(callback)) {}
 
diff --git a/chrome/browser/safe_browsing/download_protection/binary_upload_service.h b/chrome/browser/safe_browsing/download_protection/binary_upload_service.h
index 2e2faf2..0ada142 100644
--- a/chrome/browser/safe_browsing/download_protection/binary_upload_service.h
+++ b/chrome/browser/safe_browsing/download_protection/binary_upload_service.h
@@ -23,6 +23,9 @@
 // and asynchronously retrieving a verdict.
 class BinaryUploadService {
  public:
+  // The maximum size of data that can be uploaded via this service.
+  constexpr static size_t kMaxUploadSizeBytes = 50 * 1024 * 1024;  // 50 MB
+
   BinaryUploadService(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       Profile* profile);
@@ -72,16 +75,22 @@
     Request(Request&&) = delete;
     Request& operator=(Request&&) = delete;
 
-    // Asynchronously returns the file contents to upload.
-    // TODO(drubery): This could allocate up to 50MB of memory for a large file
-    // upload. We should see how often that causes errors, and possibly
-    // implement some sort of streaming interface so we don't use so much
-    // memory.
-    virtual void GetFileContents(
-        base::OnceCallback<void(const std::string&)> callback) = 0;
+    // Structure of data returned in the callback to GetRequestData().
+    struct Data {
+      Data();
+      std::string contents;
+    };
 
-    // Returns the content size.
-    virtual size_t GetFileSize() = 0;
+    // Asynchronously returns the file contents to upload.
+    // TODO(drubery): This could allocate up to kMaxUploadSizeBytes of memory
+    // for a large file upload. We should see how often that causes errors,
+    // and possibly implement some sort of streaming interface so we don't use
+    // so much memory.
+    //
+    // |result| is set to SUCCESS if getting the request data succeeded or
+    // some value describing the error.
+    using DataCallback = base::OnceCallback<void(Result, const Data&)>;
+    virtual void GetRequestData(DataCallback callback) = 0;
 
     // Returns the metadata to upload, as a DeepScanningClientRequest.
     const DeepScanningClientRequest& deep_scanning_request() const {
@@ -119,7 +128,9 @@
 
   void OnGetInstanceID(Request* request, const std::string& token);
 
-  void OnGetFileContents(Request* request, const std::string& file_contents);
+  void OnGetRequestData(Request* request,
+                        Result result,
+                        const Request::Data& data);
 
   void OnUploadComplete(Request* request,
                         bool success,
diff --git a/chrome/browser/safe_browsing/download_protection/binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/binary_upload_service_unittest.cc
index d097492..668514c 100644
--- a/chrome/browser/safe_browsing/download_protection/binary_upload_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/binary_upload_service_unittest.cc
@@ -28,9 +28,7 @@
  public:
   explicit MockRequest(BinaryUploadService::Callback callback)
       : BinaryUploadService::Request(std::move(callback)) {}
-  MOCK_METHOD1(GetFileContents,
-               void(base::OnceCallback<void(const std::string&)>));
-  MOCK_METHOD0(GetFileSize, size_t());
+  MOCK_METHOD1(GetRequestData, void(DataCallback));
 };
 
 class FakeMultipartUploadRequest : public MultipartUploadRequest {
@@ -94,8 +92,7 @@
 class BinaryUploadServiceTest : public testing::Test {
  public:
   BinaryUploadServiceTest()
-      : thread_bundle_(
-            base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME),
+      : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
         fake_factory_(true, DeepScanningClientResponse()) {
     MultipartUploadRequest::RegisterFactoryForTests(&fake_factory_);
     auto fcm_service = std::make_unique<MockBinaryFCMService>();
@@ -144,17 +141,19 @@
           *target_response = response;
         },
         scanning_result, scanning_response));
-    ON_CALL(*request, GetFileSize()).WillByDefault(Return(strlen("contents")));
-    ON_CALL(*request, GetFileContents(_))
+    ON_CALL(*request, GetRequestData(_))
         .WillByDefault(
-            Invoke([](base::OnceCallback<void(const std::string&)> callback) {
-              std::move(callback).Run("contents");
+            Invoke([](BinaryUploadService::Request::DataCallback callback) {
+              BinaryUploadService::Request::Data data;
+              data.contents = "contents";
+              std::move(callback).Run(BinaryUploadService::Result::SUCCESS,
+                                      data);
             }));
     return request;
   }
 
  protected:
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<BinaryUploadService> service_;
   MockBinaryFCMService* fcm_service_;
   FakeMultipartUploadRequestFactory fake_factory_;
@@ -164,9 +163,16 @@
   BinaryUploadService::Result scanning_result;
   DeepScanningClientResponse scanning_response;
 
+  ExpectInstanceID("valid id");
   std::unique_ptr<MockRequest> request =
       MakeRequest(&scanning_result, &scanning_response);
-  ON_CALL(*request, GetFileSize()).WillByDefault(Return(100 * 1024 * 1024));
+  ON_CALL(*request, GetRequestData(_))
+      .WillByDefault(
+          Invoke([](BinaryUploadService::Request::DataCallback callback) {
+            BinaryUploadService::Request::Data data;
+            std::move(callback).Run(BinaryUploadService::Result::FILE_TOO_LARGE,
+                                    data);
+          }));
   service_->UploadForDeepScanning(std::move(request));
 
   content::RunAllTasksUntilIdle();
@@ -251,7 +257,7 @@
   ExpectNetworkResponse(true, DeepScanningClientResponse());
   service_->UploadForDeepScanning(std::move(request));
   content::RunAllTasksUntilIdle();
-  thread_bundle_.FastForwardUntilNoTasksRemain();
+  task_environment_.FastForwardUntilNoTasksRemain();
 
   EXPECT_EQ(scanning_result, BinaryUploadService::Result::TIMEOUT);
 }
@@ -276,7 +282,7 @@
   ExpectNetworkResponse(true, DeepScanningClientResponse());
   service_->UploadForDeepScanning(std::move(request));
   content::RunAllTasksUntilIdle();
-  thread_bundle_.FastForwardUntilNoTasksRemain();
+  task_environment_.FastForwardUntilNoTasksRemain();
 
   EXPECT_EQ(scanning_result, BinaryUploadService::Result::TIMEOUT);
 
@@ -300,7 +306,7 @@
   MockRequest* raw_request = request.get();
   service_->UploadForDeepScanning(std::move(request));
   content::RunAllTasksUntilIdle();
-  thread_bundle_.FastForwardUntilNoTasksRemain();
+  task_environment_.FastForwardUntilNoTasksRemain();
   EXPECT_EQ(scanning_result, BinaryUploadService::Result::TIMEOUT);
 
   // Expect nothing to change if the upload finishes after the timeout.
@@ -323,7 +329,7 @@
   MockRequest* raw_request = request.get();
   service_->UploadForDeepScanning(std::move(request));
   content::RunAllTasksUntilIdle();
-  thread_bundle_.FastForwardUntilNoTasksRemain();
+  task_environment_.FastForwardUntilNoTasksRemain();
   EXPECT_EQ(scanning_result, BinaryUploadService::Result::TIMEOUT);
 
   // Expect nothing to change if we get a message after the timeout.
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
index dc1529411..b35e2824 100644
--- a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
+++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
@@ -506,8 +506,6 @@
       "SBClientDownload."
       "DownloadFileHasDmgSignature",
       disk_image_signature_ != nullptr);
-  UMA_HISTOGRAM_BOOLEAN("SBClientDownload.DownloadFileHasDetachedSignatures",
-                        !detached_code_signatures_.empty());
 
   if (disk_image_signature_) {
     request->set_udif_code_signature(disk_image_signature_->data(),
diff --git a/chrome/browser/safe_browsing/download_protection/download_item_request.cc b/chrome/browser/safe_browsing/download_protection/download_item_request.cc
index 40b7f26..1ccca42 100644
--- a/chrome/browser/safe_browsing/download_protection/download_item_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_item_request.cc
@@ -43,7 +43,6 @@
                                          BinaryUploadService::Callback callback)
     : Request(std::move(callback)),
       item_(item),
-      download_item_renamed_(false),
       weakptr_factory_(this) {
   item_->AddObserver(this);
 }
@@ -53,43 +52,39 @@
     item_->RemoveObserver(this);
 }
 
-void DownloadItemRequest::GetFileContents(
-    base::OnceCallback<void(const std::string&)> callback) {
+void DownloadItemRequest::GetRequestData(DataCallback callback) {
   if (item_ == nullptr) {
-    std::move(callback).Run("");
+    std::move(callback).Run(BinaryUploadService::Result::UNKNOWN, Data());
+    return;
+  }
+
+  if (static_cast<size_t>(item_->GetTotalBytes()) >
+      BinaryUploadService::kMaxUploadSizeBytes) {
+    std::move(callback).Run(BinaryUploadService::Result::FILE_TOO_LARGE,
+                            Data());
+    return;
+  }
+
+  if (is_data_valid_) {
+    std::move(callback).Run(BinaryUploadService::Result::SUCCESS, data_);
     return;
   }
 
   pending_callbacks_.push_back(std::move(callback));
-
-  if (download_item_renamed_)
-    RunPendingGetFileContentsCallbacks();
 }
 
 void DownloadItemRequest::RunPendingGetFileContentsCallbacks() {
   for (auto it = pending_callbacks_.begin(); it != pending_callbacks_.end();
        it++) {
-    base::PostTaskAndReplyWithResult(
-        FROM_HERE,
-        {base::ThreadPool(), base::TaskPriority::USER_VISIBLE,
-         base::MayBlock()},
-        base::BindOnce(&GetFileContentsBlocking, item_->GetFullPath()),
-        base::BindOnce(&DownloadItemRequest::OnGotFileContents,
-                       weakptr_factory_.GetWeakPtr(), std::move(*it)));
+    std::move(*it).Run(BinaryUploadService::Result::SUCCESS, data_);
   }
 
   pending_callbacks_.clear();
 }
 
-size_t DownloadItemRequest::GetFileSize() {
-  return item_ == nullptr ? 0 : item_->GetTotalBytes();
-}
-
 void DownloadItemRequest::OnDownloadUpdated(download::DownloadItem* download) {
-  if (download == item_ && item_->GetFullPath() == item_->GetTargetFilePath()) {
-    download_item_renamed_ = true;
-    RunPendingGetFileContentsCallbacks();
-  }
+  if (download == item_ && item_->GetFullPath() == item_->GetTargetFilePath())
+    ReadFile();
 }
 
 void DownloadItemRequest::OnDownloadDestroyed(
@@ -98,10 +93,19 @@
     item_ = nullptr;
 }
 
-void DownloadItemRequest::OnGotFileContents(
-    base::OnceCallback<void(const std::string&)> callback,
-    const std::string& contents) {
-  std::move(callback).Run(contents);
+void DownloadItemRequest::ReadFile() {
+  base::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      {base::ThreadPool(), base::TaskPriority::USER_VISIBLE, base::MayBlock()},
+      base::BindOnce(&GetFileContentsBlocking, item_->GetFullPath()),
+      base::BindOnce(&DownloadItemRequest::OnGotFileContents,
+                     weakptr_factory_.GetWeakPtr()));
+}
+
+void DownloadItemRequest::OnGotFileContents(std::string contents) {
+  data_.contents = std::move(contents);
+  is_data_valid_ = true;
+  RunPendingGetFileContentsCallbacks();
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/download_item_request.h b/chrome/browser/safe_browsing/download_protection/download_item_request.h
index 2f28b2e..095c65de 100644
--- a/chrome/browser/safe_browsing/download_protection/download_item_request.h
+++ b/chrome/browser/safe_browsing/download_protection/download_item_request.h
@@ -27,17 +27,16 @@
   DownloadItemRequest& operator=(DownloadItemRequest&&) = delete;
 
   // BinaryUploadService::Request implementation.
-  void GetFileContents(
-      base::OnceCallback<void(const std::string&)> callback) override;
-  size_t GetFileSize() override;
+  void GetRequestData(DataCallback callback) override;
 
   // download::DownloadItem::Observer implementation.
   void OnDownloadDestroyed(download::DownloadItem* download) override;
   void OnDownloadUpdated(download::DownloadItem* download) override;
 
  private:
-  void OnGotFileContents(base::OnceCallback<void(const std::string&)> callback,
-                         const std::string& contents);
+  void ReadFile();
+
+  void OnGotFileContents(std::string contents);
 
   // Calls to GetFileContents can be deferred if the download item is not yet
   // renamed to its final location. When ready, this method runs those
@@ -48,11 +47,15 @@
   // thread. Unowned.
   download::DownloadItem* item_;
 
-  // Whether the download item has been renamed to its final destination yet.
-  bool download_item_renamed_;
+  // The file's data.
+  Data data_;
+
+  // Is the |data_| member valid?  It becomes valid once the file has been
+  // read successfully.
+  bool is_data_valid_ = false;
 
   // All pending callbacks to GetFileContents before the download item is ready.
-  std::vector<base::OnceCallback<void(const std::string&)>> pending_callbacks_;
+  std::vector<DataCallback> pending_callbacks_;
 
   base::WeakPtrFactory<DownloadItemRequest> weakptr_factory_;
 };
diff --git a/chrome/browser/safe_browsing/download_protection/download_item_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_item_request_unittest.cc
index 9a11b5d5..a156871 100644
--- a/chrome/browser/safe_browsing/download_protection/download_item_request_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_item_request_unittest.cc
@@ -42,7 +42,7 @@
   }
 
  protected:
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   download::MockDownloadItem item_;
   DownloadItemRequest request_;
   base::ScopedTempDir temp_dir_;
@@ -51,18 +51,15 @@
   std::string download_contents_;
 };
 
-TEST_F(DownloadItemRequestTest, GetsSize) {
-  EXPECT_EQ(request_.GetFileSize(), download_contents_.size());
-}
-
 TEST_F(DownloadItemRequestTest, GetsContentsWaitsUntilRename) {
   ON_CALL(item_, GetFullPath())
       .WillByDefault(ReturnRef(download_temporary_path_));
 
   std::string download_contents = "";
-  request_.GetFileContents(base::BindOnce(
-      [](std::string* target_contents, const std::string& contents) {
-        *target_contents = contents;
+  request_.GetRequestData(base::BindOnce(
+      [](std::string* target_contents, BinaryUploadService::Result result,
+         const BinaryUploadService::Request::Data& data) {
+        *target_contents = data.contents;
       },
       &download_contents));
   content::RunAllTasksUntilIdle();
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
index 50e2486..92ed54bbc 100644
--- a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
+++ b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
@@ -179,16 +179,6 @@
   for (const auto& file_name : archive_results.archived_archive_filenames)
     RecordArchivedArchiveFileExtensionType(file_name);
 
-  int64_t uma_file_type =
-      FileTypePolicies::GetInstance()->UmaValueForFile(target_path_);
-  if (archive_results.success) {
-    base::UmaHistogramSparse("SBClientDownload.ZipFileSuccessByType",
-                             uma_file_type);
-  } else {
-    base::UmaHistogramSparse("SBClientDownload.ZipFileFailureByType",
-                             uma_file_type);
-  }
-
   if (!results_.archived_executable) {
     if (archive_results.has_archive) {
       results_.type = ClientDownloadRequest::ZIPPED_ARCHIVE;
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
index f23b8b6..c04aa723 100644
--- a/chrome/browser/search/instant_service.cc
+++ b/chrome/browser/search/instant_service.cc
@@ -56,6 +56,7 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
 #include "ui/gfx/color_analysis.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
 
 namespace {
@@ -411,6 +412,7 @@
 
 void InstantService::UpdateThemeInfo() {
   ApplyOrResetCustomBackgroundThemeInfo();
+  SetNtpElementsThemeInfo();
 
   NotifyAboutThemeInfo();
 }
@@ -665,20 +667,13 @@
   // Get theme colors.
   const ui::ThemeProvider& theme_provider =
       ThemeService::GetThemeProviderForProfile(profile_);
-  SkColor background_color =
-      theme_provider.GetColor(ThemeProperties::COLOR_NTP_BACKGROUND);
-  SkColor text_color = theme_provider.GetColor(ThemeProperties::COLOR_NTP_TEXT);
-  SkColor text_color_light =
-      theme_provider.GetColor(ThemeProperties::COLOR_NTP_TEXT_LIGHT);
 
   // Set colors.
-  theme_info_->background_color = background_color;
-  theme_info_->text_color = text_color;
-  theme_info_->text_color_light = text_color_light;
-
-  int logo_alternate =
-      theme_provider.GetDisplayProperty(ThemeProperties::NTP_LOGO_ALTERNATE);
-  theme_info_->logo_alternate = logo_alternate == 1;
+  theme_info_->background_color =
+      theme_provider.GetColor(ThemeProperties::COLOR_NTP_BACKGROUND);
+  theme_info_->text_color_light =
+      theme_provider.GetColor(ThemeProperties::COLOR_NTP_TEXT_LIGHT);
+  SetNtpElementsThemeInfo();
 
   if (theme_service->UsingExtensionTheme()) {
     const extensions::Extension* extension =
@@ -1015,3 +1010,33 @@
 void InstantService::SetClockForTesting(base::Clock* clock) {
   clock_ = clock;
 }
+
+void InstantService::SetNtpElementsThemeInfo() {
+  ThemeBackgroundInfo* theme_info = GetInitializedThemeInfo();
+  if (IsCustomBackgroundSet()) {
+    theme_info->text_color = gfx::kGoogleGrey050;
+    theme_info->logo_alternate = true;
+    theme_info->logo_color = ThemeProperties::GetDefaultColor(
+        ThemeProperties::COLOR_NTP_LOGO, false);
+    theme_info->shortcut_color = ThemeProperties::GetDefaultColor(
+        ThemeProperties::COLOR_NTP_SHORTCUT, false);
+  } else {
+    const ui::ThemeProvider& theme_provider =
+        ThemeService::GetThemeProviderForProfile(profile_);
+    theme_info->text_color =
+        theme_provider.GetColor(ThemeProperties::COLOR_NTP_TEXT);
+    theme_info->logo_alternate = theme_provider.GetDisplayProperty(
+                                     ThemeProperties::NTP_LOGO_ALTERNATE) == 1;
+    theme_info->logo_color =
+        theme_provider.GetColor(ThemeProperties::COLOR_NTP_LOGO);
+
+    // For default theme in dark mode use dark shortcuts.
+    if (native_theme_->ShouldUseDarkColors() &&
+        ThemeServiceFactory::GetForProfile(profile_)->UsingDefaultTheme()) {
+      theme_info->shortcut_color = gfx::kGoogleGrey900;
+    } else {
+      theme_info->shortcut_color =
+          theme_provider.GetColor(ThemeProperties::COLOR_NTP_SHORTCUT);
+    }
+  }
+}
diff --git a/chrome/browser/search/instant_service.h b/chrome/browser/search/instant_service.h
index 64f80b0df..8bbfbf6 100644
--- a/chrome/browser/search/instant_service.h
+++ b/chrome/browser/search/instant_service.h
@@ -282,6 +282,10 @@
   // Requests a new background image if it hasn't been updated in >24 hours.
   void RefreshBackgroundIfNeeded();
 
+  // Sets NTP elements theme info that are overridden when custom
+  // background is used.
+  void SetNtpElementsThemeInfo();
+
   Profile* const profile_;
 
   // The process ids associated with Instant processes.
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc
index 13e14062..d818ac3 100644
--- a/chrome/browser/search/instant_service_unittest.cc
+++ b/chrome/browser/search/instant_service_unittest.cc
@@ -10,10 +10,14 @@
 #include "base/path_service.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/search/background/ntp_background_service.h"
 #include "chrome/browser/search/instant_service_observer.h"
 #include "chrome/browser/search/instant_unittest_base.h"
 #include "chrome/browser/search/ntp_features.h"
+#include "chrome/browser/themes/theme_properties.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/search/instant_types.h"
@@ -22,6 +26,7 @@
 #include "components/ntp_tiles/ntp_tile.h"
 #include "components/ntp_tiles/section_type.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/native_theme/test_native_theme.h"
@@ -772,3 +777,49 @@
   EXPECT_EQ(kImageUrl2, theme_info->custom_background_url);
   EXPECT_TRUE(instant_service_->IsCustomBackgroundSet());
 }
+
+TEST_F(InstantServiceTest, SetNTPElementsThemeInfo) {
+  ThemeBackgroundInfo* theme_info = instant_service_->GetInitializedThemeInfo();
+  SkColor default_text_color =
+      ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_NTP_TEXT, false);
+  SkColor default_logo_color =
+      ThemeProperties::GetDefaultColor(ThemeProperties::COLOR_NTP_LOGO, false);
+  SkColor default_shortcut_color = ThemeProperties::GetDefaultColor(
+      ThemeProperties::COLOR_NTP_SHORTCUT, false);
+
+  ASSERT_FALSE(instant_service_->IsCustomBackgroundSet());
+
+  // Check defaults when no theme and no custom backgrounds is set.
+  EXPECT_EQ(default_text_color, theme_info->text_color);
+  EXPECT_FALSE(theme_info->logo_alternate);
+  EXPECT_EQ(default_logo_color, theme_info->logo_color);
+  EXPECT_EQ(default_shortcut_color, theme_info->shortcut_color);
+
+  // Install colors, theme update should trigger |SetNTPElementsThemeInfo| and
+  // update NTP themed elements info.
+  ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
+  content::WindowedNotificationObserver theme_change_observer(
+      chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
+      content::Source<ThemeService>(theme_service));
+  theme_service->BuildFromColor(SK_ColorRED);
+  theme_change_observer.Wait();
+
+  theme_info = instant_service_->GetInitializedThemeInfo();
+  EXPECT_NE(default_text_color, theme_info->text_color);
+  EXPECT_TRUE(theme_info->logo_alternate);
+  EXPECT_NE(default_logo_color, theme_info->logo_color);
+  EXPECT_NE(default_shortcut_color, theme_info->shortcut_color);
+
+  // Setting a custom backgrounds should call |SetNTPElementsThemeInfo| and
+  // update NTP themed elements info.
+  const GURL kUrl("https://www.foo.com");
+  instant_service_->AddValidBackdropUrlForTesting(kUrl);
+  instant_service_->SetCustomBackgroundInfo(kUrl, "", "", GURL(), "");
+  ASSERT_TRUE(instant_service_->IsCustomBackgroundSet());
+
+  theme_info = instant_service_->GetInitializedThemeInfo();
+  EXPECT_NE(default_text_color, theme_info->text_color);
+  EXPECT_TRUE(theme_info->logo_alternate);
+  EXPECT_EQ(default_logo_color, theme_info->logo_color);
+  EXPECT_EQ(default_shortcut_color, theme_info->shortcut_color);
+}
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
index a011010..adcca5a9 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
@@ -16,7 +16,6 @@
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/send_tab_to_self/test_send_tab_to_self_model.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "content/public/browser/navigation_entry.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -72,14 +71,11 @@
 
   // Set up all test conditions to let ShouldOfferFeature() return true
   void SetUpAllTrueEnv() {
-    scoped_feature_list_.InitAndEnableFeature(switches::kSyncSendTabToSelf);
-
     AddTab(browser(), url_);
     NavigateAndCommitActiveTabWithTitle(browser(), url_, title_);
   }
 
  protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
   GURL url_;
   base::string16 title_;
 };
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
index 7552030..cb07330 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
@@ -24,13 +24,8 @@
 
 namespace send_tab_to_self {
 
-bool IsReceivingEnabled() {
-  return base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf);
-}
-
 bool IsSendingEnabled() {
-  return IsReceivingEnabled() &&
-         base::FeatureList::IsEnabled(kSendTabToSelfShowSendingUI);
+  return base::FeatureList::IsEnabled(kSendTabToSelfShowSendingUI);
 }
 
 bool IsUserSyncTypeActive(Profile* profile) {
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.h b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
index fcdf580..d04da63 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
@@ -14,9 +14,6 @@
 
 namespace send_tab_to_self {
 
-// Returns true if the 'send tab to self' flag is enabled.
-bool IsReceivingEnabled();
-
 // Returns true if the send-tab-to-self' and 'send-tab-to-self-show-sending-ui'
 // flags are enabled.
 bool IsSendingEnabled();
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
index 1a467b0..888f657f 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
@@ -74,35 +74,15 @@
 };
 
 TEST_F(SendTabToSelfUtilTest, AreFlagsEnabled_True) {
-  scoped_feature_list_.InitWithFeatures(
-      {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI}, {});
+  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI}, {});
 
   EXPECT_TRUE(IsSendingEnabled());
-  EXPECT_TRUE(IsReceivingEnabled());
 }
 
 TEST_F(SendTabToSelfUtilTest, AreFlagsEnabled_False) {
-  scoped_feature_list_.InitWithFeatures(
-      {}, {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI});
+  scoped_feature_list_.InitWithFeatures({}, {kSendTabToSelfShowSendingUI});
 
   EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_FALSE(IsReceivingEnabled());
-}
-
-TEST_F(SendTabToSelfUtilTest, IsReceivingEnabled_True) {
-  scoped_feature_list_.InitWithFeatures({switches::kSyncSendTabToSelf},
-                                        {kSendTabToSelfShowSendingUI});
-
-  EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_TRUE(IsReceivingEnabled());
-}
-
-TEST_F(SendTabToSelfUtilTest, IsOnlySendingEnabled_False) {
-  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI},
-                                        {switches::kSyncSendTabToSelf});
-
-  EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_FALSE(IsReceivingEnabled());
 }
 
 TEST_F(SendTabToSelfUtilTest, HasValidTargetDevice) {
@@ -135,10 +115,7 @@
 TEST_F(SendTabToSelfUtilTest, ShouldOfferFeatureForTelephoneLink) {
   url_ = GURL("tel:07387252578");
 
-  // Set the IsSendingEnable, IsUserSyncTypeActive and
-  // HasValidTargetDevice to true
-  scoped_feature_list_.InitWithFeatures(
-      {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI}, {});
+  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI}, {});
   AddTab(browser(), url_);
   SendTabToSelfSyncServiceFactory::GetInstance()->SetTestingFactory(
       profile(), base::BindRepeating(&BuildTestSendTabToSelfSyncService));
@@ -151,10 +128,7 @@
 }
 
 TEST_F(SendTabToSelfUtilTest, ShouldOfferFeatureForGoogleLink) {
-  // Set the IsSendingEnable, IsUserSyncTypeActive and
-  // HasValidTargetDevice to true
-  scoped_feature_list_.InitWithFeatures(
-      {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI}, {});
+  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI}, {});
   AddTab(browser(), url_);
   SendTabToSelfSyncServiceFactory::GetInstance()->SetTestingFactory(
       profile(), base::BindRepeating(&BuildTestSendTabToSelfSyncService));
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index cfb0225..5678ae8 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -120,9 +120,7 @@
     datatypes.push_back(syncer::TYPED_URLS);
     datatypes.push_back(syncer::USER_EVENTS);
     datatypes.push_back(syncer::USER_CONSENTS);
-    if (base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
-      datatypes.push_back(syncer::SEND_TAB_TO_SELF);
-    }
+    datatypes.push_back(syncer::SEND_TAB_TO_SELF);
     return datatypes;
   }
 
diff --git a/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc b/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc
index 2b514d5..f3ee0df 100644
--- a/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc
+++ b/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc
@@ -8,7 +8,6 @@
 #include "base/memory/singleton.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
 #include "chrome/browser/sync/device_info_sync_service_factory.h"
 #include "chrome/browser/sync/model_type_store_service_factory.h"
 #include "chrome/common/channel_info.h"
@@ -43,8 +42,6 @@
 
 KeyedService* SendTabToSelfSyncServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  DCHECK(send_tab_to_self::IsReceivingEnabled());
-
   Profile* profile = Profile::FromBrowserContext(context);
 
   syncer::OnceModelTypeStoreFactory store_factory =
diff --git a/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc b/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc
index ab5d2b0..ae9f2ca 100644
--- a/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_apps_sync_test.cc
@@ -77,7 +77,8 @@
   ASSERT_TRUE(AllProfilesHaveSameApps());
 }
 
-IN_PROC_BROWSER_TEST_F(SingleClientAppsSyncTest, InstallSomePlatformApps) {
+IN_PROC_BROWSER_TEST_F(SingleClientAppsSyncTest,
+                       MAYBE_InstallSomePlatformApps) {
   ASSERT_TRUE(SetupSync());
 
   const int kNumApps = 5;
@@ -90,7 +91,7 @@
   ASSERT_TRUE(AllProfilesHaveSameApps());
 }
 
-IN_PROC_BROWSER_TEST_F(SingleClientAppsSyncTest, InstallSomeApps) {
+IN_PROC_BROWSER_TEST_F(SingleClientAppsSyncTest, MAYBE_InstallSomeApps) {
   ASSERT_TRUE(SetupSync());
 
   int i = 0;
diff --git a/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc b/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc
index f081270..4405140 100644
--- a/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc
@@ -15,7 +15,6 @@
 #include "components/send_tab_to_self/features.h"
 #include "components/send_tab_to_self/send_tab_to_self_model.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "url/gurl.h"
 
@@ -25,9 +24,7 @@
  public:
   SingleClientSendTabToSelfSyncTest() : SyncTest(SINGLE_CLIENT) {
     scoped_list_.InitWithFeatures(
-        {switches::kSyncSendTabToSelf,
-         send_tab_to_self::kSendTabToSelfShowSendingUI},
-        {});
+        {send_tab_to_self::kSendTabToSelfShowSendingUI}, {});
   }
 
   ~SingleClientSendTabToSelfSyncTest() override {}
@@ -80,12 +77,6 @@
   EXPECT_FALSE(send_tab_to_self::HasValidTargetDevice(GetProfile(0)));
 }
 
-IN_PROC_BROWSER_TEST_F(SingleClientSendTabToSelfSyncTest, IsFlagEnabled) {
-  ASSERT_TRUE(SetupSync());
-
-  EXPECT_TRUE(send_tab_to_self::IsReceivingEnabled());
-}
-
 IN_PROC_BROWSER_TEST_F(SingleClientSendTabToSelfSyncTest, ShouldOfferFeature) {
   ASSERT_TRUE(SetupSync());
 
diff --git a/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc b/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc
index 414a295..b72c5c17 100644
--- a/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc
@@ -16,7 +16,6 @@
 #include "components/send_tab_to_self/send_tab_to_self_model.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/send_tab_to_self/target_device_info.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync_device_info/device_info.h"
 #include "components/sync_device_info/device_info_sync_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -26,9 +25,7 @@
  public:
   TwoClientSendTabToSelfSyncTest() : SyncTest(TWO_CLIENT) {
     scoped_list_.InitWithFeatures(
-        {switches::kSyncSendTabToSelf,
-         send_tab_to_self::kSendTabToSelfShowSendingUI},
-        {});
+        {send_tab_to_self::kSendTabToSelfShowSendingUI}, {});
   }
 
   ~TwoClientSendTabToSelfSyncTest() override {}
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc
index 28fa932a..5783ffb 100644
--- a/chrome/browser/themes/browser_theme_pack.cc
+++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -564,8 +564,41 @@
   DISALLOW_COPY_AND_ASSIGN(ControlButtonBackgroundImageSource);
 };
 
+// Returns whether the color is grayscale.
+bool IsColorGrayscale(SkColor color) {
+  constexpr int kChannelTolerance = 9;
+  auto channels = {SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)};
+  const int range = std::max(channels) - std::min(channels);
+  return range < kChannelTolerance;
+}
+
 }  // namespace
 
+namespace internal {  // for testing
+
+// Calculate contrasting color for given |bg_color|. Returns lighter color if
+// the color is very dark and returns darker color otherwise.
+SkColor GetContrastingColorForBackground(SkColor bg_color,
+                                         float luminosity_change) {
+  color_utils::HSL hsl;
+  SkColorToHSL(bg_color, &hsl);
+
+  // If luminosity is 0, it means |bg_color| is black. Use white for black
+  // backgrounds.
+  if (hsl.l == 0)
+    return SK_ColorWHITE;
+
+  // Decrease luminosity, unless color is already dark.
+  if (hsl.l > 0.15)
+    luminosity_change *= -1;
+
+  hsl.l *= 1 + luminosity_change;
+  if (hsl.l >= 0.0f && hsl.l <= 1.0f)
+    return HSLToSkColor(hsl, 255);
+  return bg_color;
+}
+}  // namespace internal
+
 BrowserThemePack::~BrowserThemePack() {
   if (!data_pack_.get()) {
     delete header_;
@@ -1677,18 +1710,53 @@
 }
 
 void BrowserThemePack::GenerateMissingNtpColors() {
-  // Calculate NTP text color based on NTP background.
-  SkColor ntp_background_color;
   gfx::Image image = GetImageNamed(IDR_THEME_NTP_BACKGROUND);
-  if (!image.IsEmpty()) {
-    ntp_background_color = ComputeImageColor(image, image.Height());
-    SetColorIfUnspecified(
-        TP::COLOR_NTP_TEXT,
-        color_utils::GetColorWithMaxContrast(ntp_background_color));
-  } else if (GetColor(TP::COLOR_NTP_BACKGROUND, &ntp_background_color)) {
-    SetColorIfUnspecified(
-        TP::COLOR_NTP_TEXT,
-        color_utils::GetColorWithMaxContrast(ntp_background_color));
+  bool has_background_image = !image.IsEmpty();
+
+  SkColor background_color;
+  bool has_background_color =
+      GetColor(TP::COLOR_NTP_BACKGROUND, &background_color);
+
+  // Calculate NTP text color based on NTP background.
+  SkColor text_color;
+  if (!GetColor(TP::COLOR_NTP_TEXT, &text_color)) {
+    if (has_background_image)
+      background_color = ComputeImageColor(image, image.Height());
+
+    if (has_background_image || has_background_color) {
+      SetColor(TP::COLOR_NTP_TEXT,
+               color_utils::GetColorWithMaxContrast(background_color));
+    }
+  }
+
+  // Calculate logo alternate, if not specified.
+  int logo_alternate = 0;
+  if (!GetDisplayProperty(TP::NTP_LOGO_ALTERNATE, &logo_alternate)) {
+    logo_alternate =
+        has_background_image ||
+        (has_background_color && !IsColorGrayscale(background_color));
+    SetDisplayProperty(TP::NTP_LOGO_ALTERNATE, logo_alternate);
+  }
+
+  // For themes that use alternate logo and no NTP background image is present,
+  // set logo color in the same hue as NTP background.
+  if (logo_alternate == 1 && !has_background_image && has_background_color) {
+    SkColor logo_color = color_utils::IsDark(background_color)
+                             ? SK_ColorWHITE
+                             : internal::GetContrastingColorForBackground(
+                                   background_color,
+                                   /*luminosity_change=*/0.3f);
+    SetColor(TP::COLOR_NTP_LOGO, logo_color);
+  }
+
+  // Calculate NTP shortcut color.
+  // Use light color for NTPs with images, and themed color for NTPs with solid
+  // color.
+  if (!has_background_image && has_background_color &&
+      background_color != SK_ColorWHITE) {
+    SetColor(TP::COLOR_NTP_SHORTCUT, internal::GetContrastingColorForBackground(
+                                         background_color,
+                                         /*luminosity_change=*/0.2f));
   }
 }
 
diff --git a/chrome/browser/themes/browser_theme_pack_unittest.cc b/chrome/browser/themes/browser_theme_pack_unittest.cc
index 7e326042..8fcf98f2 100644
--- a/chrome/browser/themes/browser_theme_pack_unittest.cc
+++ b/chrome/browser/themes/browser_theme_pack_unittest.cc
@@ -228,7 +228,7 @@
   ASSERT_TRUE(valid_value.get());
   scoped_refptr<Extension> extension(
       Extension::Create(extension_path, extensions::Manifest::INVALID_LOCATION,
-                        *valid_value, Extension::REQUIRE_KEY, &error));
+                        *valid_value, Extension::NO_FLAGS, &error));
   ASSERT_TRUE(extension.get());
   ASSERT_EQ("", error);
   BrowserThemePack::BuildFromExtension(extension.get(), pack);
@@ -1113,3 +1113,91 @@
 
   EXPECT_TRUE(pack_autogenerated->GetColor(TP::COLOR_NTP_TEXT, &ntp_text));
 }
+
+TEST_F(BrowserThemePackTest, TestLogoAndShortcutColors) {
+  // For themes with no background image and no background color, nothing should
+  // be specified.
+  scoped_refptr<BrowserThemePack> theme_minimal(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::EXTENSION));
+  BuildTestExtensionTheme("theme_minimal", theme_minimal.get());
+  SkColor color;
+  EXPECT_FALSE(theme_minimal->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_FALSE(theme_minimal->GetColor(TP::COLOR_NTP_SHORTCUT, &color));
+
+  // For themes with image logo and shortcut colors shouldn't be set.
+  scoped_refptr<BrowserThemePack> theme_with_image(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::EXTENSION));
+  BuildTestExtensionTheme("theme_ntp_background_image", theme_with_image.get());
+  EXPECT_FALSE(theme_with_image->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_FALSE(theme_with_image->GetColor(TP::COLOR_NTP_SHORTCUT, &color));
+
+  // // For themes with no image but with colorful logo, the logo color
+  // shouldn't
+  // // be specified but the shortcut color should be set.
+  scoped_refptr<BrowserThemePack> theme_colorful_logo(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::EXTENSION));
+  BuildTestExtensionTheme("theme_color_ntp_colorful_logo",
+                          theme_colorful_logo.get());
+  EXPECT_FALSE(theme_colorful_logo->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_TRUE(theme_colorful_logo->GetColor(TP::COLOR_NTP_SHORTCUT, &color));
+
+  // For themes with no image and with alternate logo, both logo and shortcut
+  // colors should be set.
+  scoped_refptr<BrowserThemePack> theme_alternate_logo(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::EXTENSION));
+  BuildTestExtensionTheme("theme_color_ntp_white_logo",
+                          theme_alternate_logo.get());
+  EXPECT_TRUE(theme_alternate_logo->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_NE(SK_ColorWHITE, color);
+  EXPECT_TRUE(theme_alternate_logo->GetColor(TP::COLOR_NTP_SHORTCUT, &color));
+
+  // For darker then midpoint themes the logo color should be white.
+  scoped_refptr<BrowserThemePack> dark_theme(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::AUTOGENERATED));
+  BrowserThemePack::BuildFromColor(SkColorSetRGB(120, 120, 120),
+                                   dark_theme.get());
+  EXPECT_TRUE(dark_theme->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_EQ(SK_ColorWHITE, color);
+
+  // For themes with white NTP background the shortcut color shouldn't be set.
+  // The Logo color shouldn't be set either because the colorful logo should be
+  // used on white background.
+  scoped_refptr<BrowserThemePack> white_theme(
+      new BrowserThemePack(CustomThemeSupplier::ThemeType::AUTOGENERATED));
+  BrowserThemePack::BuildFromColor(SK_ColorWHITE, white_theme.get());
+  ASSERT_TRUE(white_theme->GetColor(TP::COLOR_NTP_BACKGROUND, &color));
+  ASSERT_EQ(SK_ColorWHITE, color);
+  EXPECT_FALSE(white_theme->GetColor(TP::COLOR_NTP_LOGO, &color));
+  EXPECT_FALSE(white_theme->GetColor(TP::COLOR_NTP_SHORTCUT, &color));
+}
+
+namespace internal {
+
+// Defined in browser_theme_pack.cc
+SkColor GetContrastingColorForBackground(SkColor bg_color, float change);
+
+TEST(BrowserThemePackInternalTest, TestGetContrastingColor) {
+  const float change = 0.2f;
+
+  // White color for black background.
+  EXPECT_EQ(SK_ColorWHITE,
+            GetContrastingColorForBackground(SK_ColorBLACK, change));
+
+  // Lighter color for too dark colors.
+  SkColor dark_background = SkColorSetARGB(255, 50, 0, 50);
+  EXPECT_LT(color_utils::GetRelativeLuminance(dark_background),
+            color_utils::GetRelativeLuminance(
+                GetContrastingColorForBackground(dark_background, change)));
+
+  // Darker color for light backgrounds.
+  EXPECT_GT(color_utils::GetRelativeLuminance(SK_ColorWHITE),
+            color_utils::GetRelativeLuminance(
+                GetContrastingColorForBackground(SK_ColorWHITE, change)));
+
+  SkColor light_background = SkColorSetARGB(255, 100, 0, 100);
+  EXPECT_GT(color_utils::GetRelativeLuminance(light_background),
+            color_utils::GetRelativeLuminance(
+                GetContrastingColorForBackground(light_background, change)));
+}
+
+}  // namespace internal
diff --git a/chrome/browser/themes/theme_properties.cc b/chrome/browser/themes/theme_properties.cc
index 176776e7..507b5ce2 100644
--- a/chrome/browser/themes/theme_properties.cc
+++ b/chrome/browser/themes/theme_properties.cc
@@ -90,6 +90,10 @@
       // TINT_BUTTONS.
       NOTREACHED();
       return gfx::kPlaceholderColor;
+    case ThemeProperties::COLOR_NTP_LOGO:
+      return SkColorSetRGB(0xEE, 0xEE, 0xEE);
+    case ThemeProperties::COLOR_NTP_SHORTCUT:
+      return gfx::kGoogleGrey100;
 
     // Properties not stored in theme pack.
     case ThemeProperties::COLOR_TAB_ALERT_AUDIO:
diff --git a/chrome/browser/themes/theme_properties.h b/chrome/browser/themes/theme_properties.h
index 18e69af..0791806 100644
--- a/chrome/browser/themes/theme_properties.h
+++ b/chrome/browser/themes/theme_properties.h
@@ -140,6 +140,9 @@
     // These colors don't have constant default values. They are derived from
     // the runtime value of other colors.
     COLOR_NTP_TEXT_LIGHT,
+    COLOR_NTP_LOGO,
+    // Color for the background of the most visited/custom link tile.
+    COLOR_NTP_SHORTCUT,
 
 #if defined(OS_WIN)
     // The color of the 1px border around the window on Windows 10.
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index 4de56554..9cd514f 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -123,17 +123,6 @@
   }
 }
 
-// Heuristic to determine if color is grayscale. This is used to decide whether
-// to use the colorful or white logo, if a theme fails to specify which.
-bool IsColorGrayscale(SkColor color) {
-  const int kChannelTolerance = 9;
-  int r = SkColorGetR(color);
-  int g = SkColorGetG(color);
-  int b = SkColorGetB(color);
-  int range = std::max(r, std::max(g, b)) - std::min(r, std::min(g, b));
-  return range < kChannelTolerance;
-}
-
 }  // namespace
 
 
@@ -872,14 +861,8 @@
     case ThemeProperties::NTP_BACKGROUND_TILING:
       return ThemeProperties::NO_REPEAT;
 
-    case ThemeProperties::NTP_LOGO_ALTERNATE: {
-      if (UsingDefaultTheme() || UsingSystemTheme())
-        return 0;
-      if (HasCustomImage(IDR_THEME_NTP_BACKGROUND))
-        return 1;
-      return IsColorGrayscale(
-          GetColor(ThemeProperties::COLOR_NTP_BACKGROUND, false)) ? 0 : 1;
-    }
+    case ThemeProperties::NTP_LOGO_ALTERNATE:
+      return 0;
 
     case ThemeProperties::SHOULD_FILL_BACKGROUND_TAB_COLOR:
       return 1;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index efab61f..07bf1746 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1646,6 +1646,10 @@
       "webui/chromeos/cellular_setup/mobile_setup_ui.h",
       "webui/chromeos/certificate_manager_dialog_ui.cc",
       "webui/chromeos/certificate_manager_dialog_ui.h",
+      "webui/chromeos/crostini_installer/crostini_installer_page_handler.cc",
+      "webui/chromeos/crostini_installer/crostini_installer_page_handler.h",
+      "webui/chromeos/crostini_installer/crostini_installer_ui.cc",
+      "webui/chromeos/crostini_installer/crostini_installer_ui.h",
       "webui/chromeos/cryptohome_ui.cc",
       "webui/chromeos/cryptohome_ui.h",
       "webui/chromeos/cryptohome_web_ui_handler.cc",
@@ -1902,6 +1906,7 @@
       "//chrome/browser/resources/chromeos:camera_resources",
       "//chrome/browser/ui/webui/app_management:mojo_bindings",
       "//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings",
+      "//chrome/browser/ui/webui/chromeos/crostini_installer:mojo_bindings",
       "//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings",
       "//chrome/services/file_util/public/cpp",
       "//chromeos",
diff --git a/chrome/browser/ui/app_list/app_list_controller_delegate.cc b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
index 54a9a81..5058b21 100644
--- a/chrome/browser/ui/app_list/app_list_controller_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
@@ -74,13 +74,13 @@
   }
 }
 
-bool AppListControllerDelegate::UserMayModifySettings(
-    Profile* profile,
-    const std::string& app_id) {
+bool AppListControllerDelegate::UninstallAllowed(Profile* profile,
+                                                 const std::string& app_id) {
   const extensions::Extension* extension = GetExtension(profile, app_id);
   const extensions::ManagementPolicy* policy =
       extensions::ExtensionSystem::Get(profile)->management_policy();
-  return extension && policy->UserMayModifySettings(extension, NULL);
+  return extension && policy->UserMayModifySettings(extension, nullptr) &&
+         !policy->MustRemainInstalled(extension, nullptr);
 }
 
 bool AppListControllerDelegate::CanDoShowAppInfoFlow() {
diff --git a/chrome/browser/ui/app_list/app_list_controller_delegate.h b/chrome/browser/ui/app_list/app_list_controller_delegate.h
index fb288dc..71fd8aca 100644
--- a/chrome/browser/ui/app_list/app_list_controller_delegate.h
+++ b/chrome/browser/ui/app_list/app_list_controller_delegate.h
@@ -110,7 +110,7 @@
   static std::string AppListSourceToString(AppListSource source);
 
   // True if the user has permission to modify the given app's settings.
-  bool UserMayModifySettings(Profile* profile, const std::string& app_id);
+  bool UninstallAllowed(Profile* profile, const std::string& app_id);
 
   // Uninstall the app identified by |app_id| from |profile|.
   void UninstallApp(Profile* profile, const std::string& app_id);
diff --git a/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc b/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc
index 1822b48..b2135a1b 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc
@@ -89,7 +89,7 @@
   if (command_id == ash::LAUNCH_NEW) {
     delegate()->ExecuteLaunchCommand(event_flags);
   } else if (command_id == ash::UNINSTALL) {
-    arc::ShowArcAppUninstallDialog(profile(), app_id());
+    arc::ShowArcAppUninstallDialog(profile(), controller(), app_id());
   } else if (command_id == ash::SHOW_APP_INFO) {
     ShowPackageInfo();
   } else if (command_id >= ash::LAUNCH_APP_SHORTCUT_FIRST &&
diff --git a/chrome/browser/ui/app_list/arc/arc_app_context_menu.h b/chrome/browser/ui/app_list/arc/arc_app_context_menu.h
index 806d143a..ca0a184 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_context_menu.h
+++ b/chrome/browser/ui/app_list/arc/arc_app_context_menu.h
@@ -34,8 +34,8 @@
   void BuildMenu(ui::SimpleMenuModel* menu_model) override;
 
   // ui::SimpleMenuModel::Delegate overrides:
-  void ExecuteCommand(int command_id, int event_flags) override;
   bool IsCommandIdEnabled(int command_id) const override;
+  void ExecuteCommand(int command_id, int event_flags) override;
 
  private:
   // Build additional app shortcuts menu items.
diff --git a/chrome/browser/ui/app_list/arc/arc_app_dialog.h b/chrome/browser/ui/app_list/arc/arc_app_dialog.h
index 78e319be..f0ffc9e 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_dialog.h
+++ b/chrome/browser/ui/app_list/arc/arc_app_dialog.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 
+class AppListControllerDelegate;
 class Profile;
 
 namespace arc {
@@ -19,6 +20,7 @@
 // Currently, ARC app can only be manually uninstalled from AppList. But it
 // would be simple to enable the dialog to shown from other source.
 void ShowArcAppUninstallDialog(Profile* profile,
+                               AppListControllerDelegate* controller,
                                const std::string& app_id);
 
 // Shows permission request dialog for scan USB device list.
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_context_menu.cc b/chrome/browser/ui/app_list/crostini/crostini_app_context_menu.cc
index ed4859c..6f9e31e 100644
--- a/chrome/browser/ui/app_list/crostini/crostini_app_context_menu.cc
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_context_menu.cc
@@ -18,26 +18,6 @@
 
 CrostiniAppContextMenu::~CrostiniAppContextMenu() = default;
 
-bool CrostiniAppContextMenu::IsUninstallable() const {
-  return crostini::IsUninstallable(profile(), app_id());
-}
-
-// TODO(timloh): Add support for "App Info" and possibly actions defined in
-// .desktop files.
-void CrostiniAppContextMenu::BuildMenu(ui::SimpleMenuModel* menu_model) {
-  app_list::AppContextMenu::BuildMenu(menu_model);
-
-  if (IsUninstallable()) {
-    AddContextMenuOption(menu_model, ash::UNINSTALL,
-                         IDS_APP_LIST_UNINSTALL_ITEM);
-  }
-
-  if (app_id() == crostini::kCrostiniTerminalId) {
-    AddContextMenuOption(menu_model, ash::STOP_APP,
-                         IDS_CROSTINI_SHUT_DOWN_LINUX_MENU_ITEM);
-  }
-}
-
 bool CrostiniAppContextMenu::IsCommandIdEnabled(int command_id) const {
   if (command_id == ash::UNINSTALL) {
     return IsUninstallable();
@@ -70,3 +50,23 @@
   }
   app_list::AppContextMenu::ExecuteCommand(command_id, event_flags);
 }
+
+// TODO(timloh): Add support for "App Info" and possibly actions defined in
+// .desktop files.
+void CrostiniAppContextMenu::BuildMenu(ui::SimpleMenuModel* menu_model) {
+  app_list::AppContextMenu::BuildMenu(menu_model);
+
+  if (IsUninstallable()) {
+    AddContextMenuOption(menu_model, ash::UNINSTALL,
+                         IDS_APP_LIST_UNINSTALL_ITEM);
+  }
+
+  if (app_id() == crostini::kCrostiniTerminalId) {
+    AddContextMenuOption(menu_model, ash::STOP_APP,
+                         IDS_CROSTINI_SHUT_DOWN_LINUX_MENU_ITEM);
+  }
+}
+
+bool CrostiniAppContextMenu::IsUninstallable() const {
+  return crostini::IsUninstallable(profile(), app_id());
+}
diff --git a/chrome/browser/ui/app_list/extension_app_context_menu.cc b/chrome/browser/ui/app_list/extension_app_context_menu.cc
index f012103..41db4f3 100644
--- a/chrome/browser/ui/app_list/extension_app_context_menu.cc
+++ b/chrome/browser/ui/app_list/extension_app_context_menu.cc
@@ -163,7 +163,7 @@
   if (command_id == ash::OPTIONS) {
     return controller()->HasOptionsPage(profile(), app_id());
   } else if (command_id == ash::UNINSTALL) {
-    return controller()->UserMayModifySettings(profile(), app_id());
+    return controller()->UninstallAllowed(profile(), app_id());
   } else if (extensions::ContextMenuMatcher::IsExtensionsCustomCommandId(
                  command_id)) {
     return extension_menu_items_->IsCommandIdEnabled(command_id);
diff --git a/chrome/browser/ui/app_list/search/mixer.cc b/chrome/browser/ui/app_list/search/mixer.cc
index 6be2034..e15bf9f 100644
--- a/chrome/browser/ui/app_list/search/mixer.cc
+++ b/chrome/browser/ui/app_list/search/mixer.cc
@@ -14,6 +14,7 @@
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/numerics/ranges.h"
 #include "chrome/browser/ui/app_list/app_list_model_updater.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
 #include "chrome/browser/ui/app_list/search/search_provider.h"
@@ -53,7 +54,7 @@
         // We cannot rely on providers to give relevance scores in the range
         // [0.0, 1.0]. Clamp to that range.
         const double relevance =
-            std::min(std::max(result->relevance(), 0.0), 1.0);
+            base::ClampToRange(result->relevance(), 0.0, 1.0);
         double boost = boost_;
         results_.emplace_back(result.get(), relevance * multiplier_ + boost);
       }
diff --git a/chrome/browser/ui/app_list/search/tests/zero_state_file_provider_unittest.cc b/chrome/browser/ui/app_list/search/tests/zero_state_file_provider_unittest.cc
index 8c9b63d1..f320ec0 100644
--- a/chrome/browser/ui/app_list/search/tests/zero_state_file_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/tests/zero_state_file_provider_unittest.cc
@@ -54,9 +54,9 @@
     return e;
   }
 
-  void Wait() { thread_bundle_.RunUntilIdle(); }
+  void Wait() { task_environment_.RunUntilIdle(); }
 
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
 
   std::unique_ptr<Profile> profile_;
   std::unique_ptr<ZeroStateFileProvider> provider_;
diff --git a/chrome/browser/ui/app_list/search/tests/zero_state_file_result_unittest.cc b/chrome/browser/ui/app_list/search/tests/zero_state_file_result_unittest.cc
index ae99789..ce8415e 100644
--- a/chrome/browser/ui/app_list/search/tests/zero_state_file_result_unittest.cc
+++ b/chrome/browser/ui/app_list/search/tests/zero_state_file_result_unittest.cc
@@ -23,7 +23,7 @@
 
   ~ZeroStateFileResultTest() override = default;
 
-  content::TestBrowserThreadBundle thread_bundle_;
+  content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<Profile> profile_;
 };
 
diff --git a/chrome/browser/ui/ash/DEPS b/chrome/browser/ui/ash/DEPS
index 30ceec1..af5bf1f 100644
--- a/chrome/browser/ui/ash/DEPS
+++ b/chrome/browser/ui/ash/DEPS
@@ -14,7 +14,6 @@
    "+ash/components/strings/grit/ash_components_strings.h",
    "+ash/keyboard/ui",
    "+ash/public",
-   "+ash/shelf/shelf_constants.h",
   ],
   # AshShellInit supports classic (non-mash) mode so allow ash/ includes.
   "ash_shell_init\.cc": [
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
index 5cad7412..4fa6cdd 100644
--- a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
@@ -33,6 +33,26 @@
   BuildMenu(std::make_unique<ui::SimpleMenuModel>(this), std::move(callback));
 }
 
+bool ArcLauncherContextMenu::IsCommandIdEnabled(int command_id) const {
+  const ArcAppListPrefs* arc_prefs =
+      ArcAppListPrefs::Get(controller()->profile());
+
+  std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
+      arc_prefs ? arc_prefs->GetApp(item().id.app_id) : nullptr;
+
+  switch (command_id) {
+    case ash::UNINSTALL:
+      return app_info && !app_info->sticky &&
+             (app_info->ready || app_info->shortcut);
+    case ash::SHOW_APP_INFO:
+      return app_info && app_info->ready;
+    default:
+      return LauncherContextMenu::IsCommandIdEnabled(command_id);
+  }
+  NOTREACHED();
+  return false;
+}
+
 void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) {
   if (command_id >= ash::LAUNCH_APP_SHORTCUT_FIRST &&
       command_id <= ash::LAUNCH_APP_SHORTCUT_LAST) {
@@ -45,7 +65,8 @@
     return;
   }
   if (command_id == ash::UNINSTALL) {
-    arc::ShowArcAppUninstallDialog(controller()->profile(), item().id.app_id);
+    arc::ShowArcAppUninstallDialog(controller()->profile(),
+                                   nullptr /* controller */, item().id.app_id);
     return;
   }
 
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
index d54d4f8..280d4ce 100644
--- a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
@@ -24,6 +24,7 @@
 
   // LauncherContextMenu:
   void GetMenuModel(GetMenuModelCallback callback) override;
+  bool IsCommandIdEnabled(int command_id) const override;
   void ExecuteCommand(int command_id, int event_flags) override;
 
  private:
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 1aa53b1..5f8adc4 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -88,6 +88,8 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/service_manager_connection.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/management_policy.h"
 #include "extensions/common/extension.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/aura/client/aura_constants.h"
@@ -432,6 +434,16 @@
   return extension ? extension->is_platform_app() : false;
 }
 
+bool ChromeLauncherController::UninstallAllowed(const std::string& app_id) {
+  const extensions::Extension* extension =
+      extensions::ExtensionRegistry::Get(profile())->GetInstalledExtension(
+          app_id);
+  const extensions::ManagementPolicy* policy =
+      extensions::ExtensionSystem::Get(profile())->management_policy();
+  return extension && policy->UserMayModifySettings(extension, nullptr) &&
+         !policy->MustRemainInstalled(extension, nullptr);
+}
+
 void ChromeLauncherController::LaunchApp(const ash::ShelfID& id,
                                          ash::ShelfLaunchSource source,
                                          int event_flags,
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
index 21eed669..5a4e7a0 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
@@ -121,6 +121,9 @@
   // Returns true if the specified item is for a platform app.
   bool IsPlatformApp(const ash::ShelfID& id);
 
+  // Whether the user has permission to modify the given app's settings.
+  bool UninstallAllowed(const std::string& app_id);
+
   // Opens a new instance of the application identified by the ShelfID.
   // Used by the app-list, and by pinned-app shelf items. |display_id| is id of
   // the display from which the app is launched.
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
index 97c02db7..74b91430 100644
--- a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
+++ b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/common/chrome_features.h"
 #include "components/arc/arc_util.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/user_manager/user_manager.h"
@@ -208,6 +209,10 @@
   if (shelf_app_id.empty())
     return;
 
+  // At this point, all remaining windows are Crostini windows. Firstly, we add
+  // support for forcibly closing it.
+  RegisterCrostiniWindowForForceClose(window);
+
   // Failed to uniquely identify the Crostini app that this window is for.
   // The spinners on the shelf have internal app IDs which are valid
   // extensions IDs. If the ID here starts with "crostini:" then it implies
@@ -321,6 +326,16 @@
   app_window->SetController(nullptr);
 }
 
+void CrostiniAppWindowShelfController::RegisterCrostiniWindowForForceClose(
+    aura::Window* window) {
+  if (!base::FeatureList::IsEnabled(features::kCrostiniForceClose))
+    return;
+  exo::ShellSurfaceBase* surface = exo::GetShellSurfaceBaseForWindow(window);
+  if (!surface)
+    return;
+  // TODO(hollingum): force close stuff goes here.
+}
+
 void CrostiniAppWindowShelfController::OnItemDelegateDiscarded(
     ash::ShelfItemDelegate* delegate) {
   for (auto& it : aura_window_to_app_window_) {
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h
index 9dd30aa..b759a12 100644
--- a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h
+++ b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.h
@@ -61,6 +61,7 @@
   void RegisterAppWindow(aura::Window* window, const std::string& shelf_app_id);
   void UnregisterAppWindow(AppWindowBase* app_window);
   void AddToShelf(aura::Window* window, AppWindowBase* app_window);
+  void RegisterCrostiniWindowForForceClose(aura::Window* window);
 
   // Returns ID of the shelf item that is removed, or a null id.
   ash::ShelfID RemoveFromShelf(aura::Window* window, AppWindowBase* app_window);
diff --git a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
index f5bd813..6137ee2 100644
--- a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
@@ -56,6 +56,47 @@
   std::move(callback).Run(std::move(menu_model));
 }
 
+bool CrostiniShelfContextMenu::IsCommandIdEnabled(int command_id) const {
+  if (command_id == ash::UNINSTALL)
+    return IsUninstallable();
+  if (command_id == ash::STOP_APP &&
+      item().id.app_id == crostini::kCrostiniTerminalId) {
+    return crostini::IsCrostiniRunning(controller()->profile());
+  }
+  return LauncherContextMenu::IsCommandIdEnabled(command_id);
+}
+
+void CrostiniShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
+  if (ExecuteCommonCommand(command_id, event_flags))
+    return;
+
+  switch (command_id) {
+    case ash::STOP_APP:
+      if (item().id.app_id == crostini::kCrostiniTerminalId) {
+        crostini::CrostiniManager::GetForProfile(controller()->profile())
+            ->StopVm(crostini::kCrostiniDefaultVmName, base::DoNothing());
+      }
+      return;
+    case ash::MENU_NEW_WINDOW:
+      crostini::LaunchCrostiniApp(controller()->profile(), item().id.app_id,
+                                  display_id());
+      return;
+    case ash::CROSTINI_USE_LOW_DENSITY:
+    case ash::CROSTINI_USE_HIGH_DENSITY: {
+      crostini::CrostiniRegistryService* registry_service =
+          crostini::CrostiniRegistryServiceFactory::GetForProfile(
+              controller()->profile());
+      const bool scaled = command_id == ash::CROSTINI_USE_LOW_DENSITY;
+      registry_service->SetAppScaled(item().id.app_id, scaled);
+      if (controller()->IsOpen(item().id))
+        CrostiniAppRestartView::Show(item().id, display_id());
+      return;
+    }
+    default:
+      NOTREACHED();
+  }
+}
+
 bool CrostiniShelfContextMenu::IsUninstallable() const {
   return crostini::IsUninstallable(controller()->profile(), item().id.app_id);
 }
@@ -109,34 +150,3 @@
     }
   }
 }
-
-void CrostiniShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
-  if (ExecuteCommonCommand(command_id, event_flags))
-    return;
-
-  if (command_id == ash::STOP_APP) {
-    if (item().id.app_id == crostini::kCrostiniTerminalId) {
-      crostini::CrostiniManager::GetForProfile(controller()->profile())
-          ->StopVm(crostini::kCrostiniDefaultVmName, base::DoNothing());
-    }
-    return;
-  }
-
-  if (command_id == ash::MENU_NEW_WINDOW) {
-    crostini::LaunchCrostiniApp(controller()->profile(), item().id.app_id,
-                                display_id());
-    return;
-  }
-  if (command_id == ash::CROSTINI_USE_LOW_DENSITY ||
-      command_id == ash::CROSTINI_USE_HIGH_DENSITY) {
-    crostini::CrostiniRegistryService* registry_service =
-        crostini::CrostiniRegistryServiceFactory::GetForProfile(
-            controller()->profile());
-    bool scaled = command_id == ash::CROSTINI_USE_LOW_DENSITY;
-    registry_service->SetAppScaled(item().id.app_id, scaled);
-    if (controller()->IsOpen(item().id))
-      CrostiniAppRestartView::Show(item().id, display_id());
-    return;
-  }
-  NOTREACHED();
-}
diff --git a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
index fdbc13ebf..d17b1c3 100644
--- a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
@@ -18,6 +18,7 @@
 
   // LauncherContextMenu:
   void GetMenuModel(GetMenuModelCallback callback) override;
+  bool IsCommandIdEnabled(int command_id) const override;
   void ExecuteCommand(int command_id, int event_flags) override;
 
  private:
diff --git a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc
index 01b7524c..c98adb0 100644
--- a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc
@@ -92,6 +92,8 @@
 
 bool ExtensionLauncherContextMenu::IsCommandIdEnabled(int command_id) const {
   switch (command_id) {
+    case ash::UNINSTALL:
+      return controller()->UninstallAllowed(item().id.app_id);
     case ash::MENU_NEW_WINDOW:
       // "Normal" windows are not allowed when incognito is enforced.
       return IncognitoModePrefs::GetAvailability(
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
index 35584f4..d43685a 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
@@ -175,6 +175,10 @@
 void LauncherContextMenu::AddContextMenuOption(ui::SimpleMenuModel* menu_model,
                                                ash::CommandId type,
                                                int string_id) {
+  // Do not include disabled items.
+  if (!IsCommandIdEnabled(type))
+    return;
+
   const gfx::VectorIcon& icon = GetCommandIdVectorIcon(type, string_id);
   if (!icon.is_empty()) {
     menu_model->AddItemWithStringIdAndIcon(type, string_id, icon);
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
index c3c9bbac..7d30b6ca 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -176,8 +176,8 @@
   launcher_context_menu =
       CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
   menu = GetMenuModel(launcher_context_menu.get());
-  // The item should be disabled.
-  ASSERT_TRUE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_INCOGNITO_WINDOW));
+  // The item should be disabled, and therefore not added to the menu.
+  EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_INCOGNITO_WINDOW));
   EXPECT_FALSE(launcher_context_menu->IsCommandIdEnabled(
       ash::MENU_NEW_INCOGNITO_WINDOW));
 }
@@ -201,7 +201,7 @@
   launcher_context_menu =
       CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
   menu = GetMenuModel(launcher_context_menu.get());
-  ASSERT_TRUE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_WINDOW));
+  ASSERT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_WINDOW));
   EXPECT_FALSE(launcher_context_menu->IsCommandIdEnabled(ash::MENU_NEW_WINDOW));
 }
 
@@ -217,30 +217,6 @@
   ASSERT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_CLOSE));
 }
 
-// Verifies that "App Info and Uninstall" are shown in context menu for pinned
-// apps.
-TEST_F(LauncherContextMenuTest, GeneralAppContextMenuInfoUninstall) {
-  const int64_t display_id = GetPrimaryDisplay().id();
-  std::unique_ptr<LauncherContextMenu> launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_PINNED_APP, display_id);
-  std::unique_ptr<ui::MenuModel> menu =
-      GetMenuModel(launcher_context_menu.get());
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
-}
-
-// Verifies that "App Info and Uninstall" are shown in context menu for V1, V2,
-// and ARC apps.
-TEST_F(LauncherContextMenuTest, ArcAppContextMenuInfoUninstall) {
-  const int64_t display_id = GetPrimaryDisplay().id();
-  std::unique_ptr<LauncherContextMenu> launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_APP, display_id);
-  std::unique_ptr<ui::MenuModel> menu =
-      GetMenuModel(launcher_context_menu.get());
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
-}
-
 // Verifies context menu and app menu items for ARC app.
 // The 0th item is sticky but not the following.
 TEST_F(LauncherContextMenuTest, ArcLauncherMenusCheck) {
@@ -362,8 +338,8 @@
     EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_OPEN_NEW));
     EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_PIN));
     EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::MENU_CLOSE));
-    EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
-    EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
+    EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
+    EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 
     menu_list = item_delegate3->GetAppMenuItems(0 /* event_flags */);
     ASSERT_EQ(i + 1, menu_list.size());
@@ -440,7 +416,7 @@
   EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_OPEN_NEW));
   EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::MENU_PIN));
   EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::MENU_CLOSE));
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
+  EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
   EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 
   item_delegate = model()->GetShelfItemDelegate(shelf_id2);
@@ -451,8 +427,8 @@
   EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_OPEN_NEW));
   EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::MENU_PIN));
   EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::MENU_CLOSE));
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
-  EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
+  EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
+  EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 }
 
 TEST_F(LauncherContextMenuTest, CommandIdsMatchEnumsForHistograms) {
@@ -618,6 +594,8 @@
   EXPECT_TRUE(IsItemEnabledInMenu(menu.get(), ash::CROSTINI_USE_LOW_DENSITY) ||
               IsItemEnabledInMenu(menu.get(), ash::CROSTINI_USE_HIGH_DENSITY));
   EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
+  EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::SHOW_APP_INFO));
+  EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 }
 
 // Confirms the menu items for unregistered crostini apps (i.e. apps that do not
diff --git a/chrome/browser/ui/ash/launcher_drag_interactive_uitest.cc b/chrome/browser/ui/ash/launcher_drag_interactive_uitest.cc
index 08128e5..5f2fd248 100644
--- a/chrome/browser/ui/ash/launcher_drag_interactive_uitest.cc
+++ b/chrome/browser/ui/ash/launcher_drag_interactive_uitest.cc
@@ -4,8 +4,8 @@
 
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/test/shell_test_api.h"
-#include "ash/shelf/shelf_constants.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
@@ -72,7 +72,7 @@
   gfx::Rect display_bounds = GetDisplayBounds(browser_window);
   gfx::Point start_point = gfx::Point(
       display_bounds.width() / 4,
-      display_bounds.bottom() - ash::ShelfConstants::shelf_size() / 2);
+      display_bounds.bottom() - ash::ShelfConfig::Get()->shelf_size() / 2);
   gfx::Point end_point(start_point);
   end_point.set_y(10);
   ui_test_utils::DragEventGenerator generator(
@@ -102,7 +102,7 @@
   gfx::Point start_point = gfx::Point(display_bounds.width() / 4, 10);
   gfx::Point end_point(start_point);
   end_point.set_y(display_bounds.bottom() -
-                  ash::ShelfConstants::shelf_size() / 2);
+                  ash::ShelfConfig::Get()->shelf_size() / 2);
   ui_test_utils::DragEventGenerator generator(
       std::make_unique<ui_test_utils::InterpolatedProducer>(
           start_point, end_point, base::TimeDelta::FromMilliseconds(1000)),
diff --git a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
index f36b7c86..c59ca44 100644
--- a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
@@ -12,10 +12,10 @@
 #include "ash/multi_user/multi_user_window_manager_impl.h"
 #include "ash/multi_user/user_switch_animator.h"
 #include "ash/public/cpp/multi_user_window_manager.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_helper.h"
 #include "ash/test_shell_delegate.h"
@@ -1558,7 +1558,7 @@
   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
   // Tests that bounds of both windows are maximized.
   const gfx::Rect maximized_bounds(0, 0, 400,
-                                   200 - ShelfConstants::shelf_size());
+                                   200 - ShelfConfig::Get()->shelf_size());
   EXPECT_EQ(maximized_bounds, window(0)->bounds());
   EXPECT_EQ(maximized_bounds, window(1)->bounds());
 
diff --git a/chrome/browser/ui/ash/network/tether_notification_presenter.cc b/chrome/browser/ui/ash/network/tether_notification_presenter.cc
index 106bf1a..914d3e5 100644
--- a/chrome/browser/ui/ash/network/tether_notification_presenter.cc
+++ b/chrome/browser/ui/ash/network/tether_notification_presenter.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
@@ -82,7 +83,7 @@
   // Convert the [0, 100] range to [0, 4], since there are 5 distinct signal
   // strength icons (0 bars to 4 bars).
   int normalized_signal_strength =
-      std::min(std::max(signal_strength / 25, 0), 4);
+      base::ClampToRange(signal_strength / 25, 0, 4);
 
   return gfx::CanvasImageSource::MakeImageSkia<
       ash::network_icon::SignalStrengthImageSource>(
diff --git a/chrome/browser/ui/ash/tab_scrubber.cc b/chrome/browser/ui/ash/tab_scrubber.cc
index e2d6253b..a7cf41f 100644
--- a/chrome/browser/ui/ash/tab_scrubber.cc
+++ b/chrome/browser/ui/ash/tab_scrubber.cc
@@ -11,6 +11,7 @@
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
@@ -24,14 +25,6 @@
 #include "ui/events/event_utils.h"
 #include "ui/events/gesture_detection/gesture_configuration.h"
 
-namespace {
-
-inline float Clamp(float value, float low, float high) {
-  return std::min(high, std::max(value, low));
-}
-
-}  // namespace
-
 // static
 TabScrubber* TabScrubber::GetInstance() {
   static TabScrubber* instance = nullptr;
@@ -289,8 +282,9 @@
   // Each added tab introduces a reduction of 2% in |x_offset|, with a value of
   // one fourth of |x_offset| as the minimum (i.e. we need 38 tabs to reach
   // that minimum reduction).
-  swipe_x_ += Clamp(x_offset - (tab_strip_->tab_count() * 0.02f * x_offset),
-                    0.25f * x_offset, x_offset);
+  swipe_x_ += base::ClampToRange(
+      x_offset - (tab_strip_->tab_count() * 0.02f * x_offset), 0.25f * x_offset,
+      x_offset);
 
   // In an RTL layout, everything is mirrored, i.e. the index of the first tab
   // (with the smallest X mirrored co-ordinates) is actually the index of the
diff --git a/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc b/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc
index cc3369e..01af374fb 100644
--- a/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc
+++ b/chrome/browser/ui/blocked_content/popup_blocker_browsertest.cc
@@ -431,9 +431,6 @@
   ASSERT_EQ(1, GetBlockedContentsCount());
 }
 
-// This feature is being reverted on trunk but an easily-merged CL is needed for
-// merging back to stable. https://crbug.com/936080
-#if 0
 IN_PROC_BROWSER_TEST_F(PopupBlockerBrowserTest, NoPopupsLaunchWhenTabIsClosed) {
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kDisablePopupBlocking);
@@ -447,7 +444,6 @@
   // Expect no popup.
   ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile()));
 }
-#endif
 
 // This only exists for the AllowPopupsWhenTabIsClosedWithSpecialPolicy test.
 // Remove this in Chrome 82. https://crbug.com/937569
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc
index 648e79e..865ea251 100644
--- a/chrome/browser/ui/search/search_ipc_router.cc
+++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -451,6 +451,14 @@
   delegate_->QueryAutocomplete(input, std::move(callback));
 }
 
+void SearchIPCRouter::StopAutocomplete(bool clear_result) {
+  if (!policy_->ShouldProcessStopAutocomplete(is_active_tab_)) {
+    return;
+  }
+
+  delegate_->StopAutocomplete(clear_result);
+}
+
 void SearchIPCRouter::set_delegate_for_testing(Delegate* delegate) {
   DCHECK(delegate);
   delegate_ = delegate;
diff --git a/chrome/browser/ui/search/search_ipc_router.h b/chrome/browser/ui/search/search_ipc_router.h
index 42087335d..5294764 100644
--- a/chrome/browser/ui/search/search_ipc_router.h
+++ b/chrome/browser/ui/search/search_ipc_router.h
@@ -159,6 +159,8 @@
     virtual void QueryAutocomplete(
         const std::string& input,
         chrome::mojom::EmbeddedSearch::QueryAutocompleteCallback callback) = 0;
+
+    virtual void StopAutocomplete(bool clear_result) = 0;
   };
 
   // An interface to be implemented by consumers of SearchIPCRouter objects to
@@ -198,6 +200,7 @@
     virtual bool ShouldProcessOptOutOfSearchSuggestions() = 0;
     virtual bool ShouldProcessThemeChangeMessages() = 0;
     virtual bool ShouldProcessQueryAutocomplete(bool is_active_tab) = 0;
+    virtual bool ShouldProcessStopAutocomplete(bool is_active_tab) = 0;
   };
 
   // Creates chrome::mojom::EmbeddedSearchClient connections on request.
@@ -307,6 +310,7 @@
       const std::string& input,
       chrome::mojom::EmbeddedSearch::QueryAutocompleteCallback callback)
       override;
+  void StopAutocomplete(bool clear_result) override;
   void set_embedded_search_client_factory_for_testing(
       std::unique_ptr<EmbeddedSearchClientFactory> factory) {
     embedded_search_client_factory_ = std::move(factory);
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
index e789ba62..36321a3 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
@@ -136,3 +136,8 @@
     bool is_active_tab) {
   return is_active_tab && !is_incognito_ && search::IsInstantNTP(web_contents_);
 }
+
+bool SearchIPCRouterPolicyImpl::ShouldProcessStopAutocomplete(
+    bool is_active_tab) {
+  return is_active_tab && !is_incognito_ && search::IsInstantNTP(web_contents_);
+}
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.h b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
index a8213278..7927189 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.h
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
@@ -55,6 +55,7 @@
   bool ShouldProcessOptOutOfSearchSuggestions() override;
   bool ShouldProcessThemeChangeMessages() override;
   bool ShouldProcessQueryAutocomplete(bool is_active_tab) override;
+  bool ShouldProcessStopAutocomplete(bool is_active_tab) override;
 
   // Used by unit tests.
   void set_is_incognito(bool is_incognito) {
diff --git a/chrome/browser/ui/search/search_ipc_router_unittest.cc b/chrome/browser/ui/search/search_ipc_router_unittest.cc
index 3b09c7f..a174fb4 100644
--- a/chrome/browser/ui/search/search_ipc_router_unittest.cc
+++ b/chrome/browser/ui/search/search_ipc_router_unittest.cc
@@ -107,6 +107,7 @@
       QueryAutocomplete,
       void(const std::string& input,
            chrome::mojom::EmbeddedSearch::QueryAutocompleteCallback callback));
+  MOCK_METHOD1(StopAutocomplete, void(bool clear_result));
 };
 
 class MockSearchIPCRouterPolicy : public SearchIPCRouter::Policy {
@@ -142,6 +143,7 @@
   MOCK_METHOD0(ShouldSendLocalBackgroundSelected, bool());
   MOCK_METHOD0(ShouldProcessThemeChangeMessages, bool());
   MOCK_METHOD1(ShouldProcessQueryAutocomplete, bool(bool));
+  MOCK_METHOD1(ShouldProcessStopAutocomplete, bool(bool));
 };
 
 class MockEmbeddedSearchClientFactory
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index 1f55bc1..84e5e6bb 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -552,7 +552,8 @@
                     AutocompleteProvider::TYPE_BUILTIN |
                     AutocompleteProvider::TYPE_HISTORY_QUICK |
                     AutocompleteProvider::TYPE_HISTORY_URL |
-                    AutocompleteProvider::TYPE_SEARCH;
+                    AutocompleteProvider::TYPE_SEARCH |
+                    AutocompleteProvider::TYPE_ZERO_SUGGEST;
     autocomplete_controller_ = std::make_unique<AutocompleteController>(
         std::make_unique<ChromeAutocompleteProviderClient>(profile()), this,
         providers);
@@ -560,9 +561,19 @@
 
   query_autocomplete_callback_ = std::move(callback);
 
-  autocomplete_controller_->Start(AutocompleteInput(
+  AutocompleteInput autocomplete_input(
       base::UTF8ToUTF16(input), metrics::OmniboxEventProto::NTP_REALBOX,
-      ChromeAutocompleteSchemeClassifier(profile())));
+      ChromeAutocompleteSchemeClassifier(profile()));
+  autocomplete_input.set_from_omnibox_focus(input.empty());
+  autocomplete_controller_->Start(autocomplete_input);
+}
+
+void SearchTabHelper::StopAutocomplete(bool clear_result) {
+  if (!autocomplete_controller_) {
+    return;
+  }
+
+  autocomplete_controller_->Stop(clear_result);
 }
 
 OmniboxView* SearchTabHelper::GetOmniboxView() {
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index 8da4549..2503140 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -141,6 +141,7 @@
       const std::string& input,
       chrome::mojom::EmbeddedSearch::QueryAutocompleteCallback callback)
       override;
+  void StopAutocomplete(bool clear_result) override;
 
   // Overridden from InstantServiceObserver:
   void ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) override;
diff --git a/chrome/browser/ui/tabs/tab_menu_model.cc b/chrome/browser/ui/tabs/tab_menu_model.cc
index 0fa042b..50a9ada 100644
--- a/chrome/browser/ui/tabs/tab_menu_model.cc
+++ b/chrome/browser/ui/tabs/tab_menu_model.cc
@@ -109,7 +109,7 @@
     } else {
       send_tab_to_self_sub_menu_model_ =
           std::make_unique<send_tab_to_self::SendTabToSelfSubMenuModel>(
-              tab_strip->GetActiveWebContents(),
+              tab_strip->GetWebContentsAt(index),
               send_tab_to_self::SendTabToSelfMenuType::kTab);
 #if defined(OS_MACOSX)
       AddSubMenuWithStringId(TabStripModel::CommandSendTabToSelf,
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index cfb3019..78295bab 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -1248,7 +1248,7 @@
     }
 
     case CommandSendTabToSelfSingleTarget: {
-      send_tab_to_self::ShareToSingleTarget(GetActiveWebContents());
+      send_tab_to_self::ShareToSingleTarget(GetWebContentsAt(context_index));
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kTabMenu, SendTabToSelfClickResult::kClickItem);
       break;
@@ -1420,8 +1420,8 @@
 
 int TabStripModel::ConstrainInsertionIndex(int index, bool pinned_tab) {
   return pinned_tab
-             ? std::min(std::max(0, index), IndexOfFirstNonPinnedTab())
-             : std::min(count(), std::max(index, IndexOfFirstNonPinnedTab()));
+             ? base::ClampToRange(index, 0, IndexOfFirstNonPinnedTab())
+             : base::ClampToRange(index, IndexOfFirstNonPinnedTab(), count());
 }
 
 std::vector<int> TabStripModel::GetIndicesForCommand(int index) const {
diff --git a/chrome/browser/ui/views/arc_app_dialog_view.cc b/chrome/browser/ui/views/arc_app_dialog_view.cc
index f2c02d59..cf8d60a 100644
--- a/chrome/browser/ui/views/arc_app_dialog_view.cc
+++ b/chrome/browser/ui/views/arc_app_dialog_view.cc
@@ -9,6 +9,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_icon_loader.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
@@ -42,6 +43,7 @@
                          public AppIconLoaderDelegate {
  public:
   ArcAppDialogView(Profile* profile,
+                   AppListControllerDelegate* controller,
                    const std::string& app_id,
                    const base::string16& window_title,
                    const base::string16& heading_text,
@@ -74,11 +76,6 @@
 
   void AddMultiLineLabel(views::View* parent, const base::string16& label_text);
 
-  // Constructs and shows the modal dialog widget.
-  void Show();
-
-  bool initial_setup_ = true;
-
   views::ImageView* icon_view_ = nullptr;
 
   std::unique_ptr<ArcAppIconLoader> icon_loader_;
@@ -98,6 +95,7 @@
 ArcAppDialogView* g_current_arc_app_dialog_view = nullptr;
 
 ArcAppDialogView::ArcAppDialogView(Profile* profile,
+                                   AppListControllerDelegate* controller,
                                    const std::string& app_id,
                                    const base::string16& window_title,
                                    const base::string16& heading_text,
@@ -137,10 +135,18 @@
   if (!subheading_text.empty())
     AddMultiLineLabel(text_container_ptr, subheading_text);
 
+  // The icon should be loaded synchronously (i.e. OnAppImageUpdated() will be
+  // directly called).
   icon_loader_ = std::make_unique<ArcAppIconLoader>(
       profile_, kIconSourceSize, this);
-  // The dialog will show once the icon is loaded.
   icon_loader_->FetchImage(app_id_);
+  DCHECK(!icon_view_->GetImage().isNull());
+
+  g_current_arc_app_dialog_view = this;
+  gfx::NativeWindow parent =
+      controller ? controller->GetAppListWindow() : nullptr;
+  constrained_window::CreateBrowserModalDialogViews(this, parent)->Show();
+
   chrome::RecordDialogCreation(chrome::DialogIdentifier::ARC_APP);
 }
 
@@ -210,16 +216,6 @@
   DCHECK_EQ(image.height(), kIconSourceSize);
   icon_view_->SetImageSize(image.size());
   icon_view_->SetImage(image);
-
-  if (initial_setup_)
-    Show();
-}
-
-void ArcAppDialogView::Show() {
-  initial_setup_ = false;
-
-  g_current_arc_app_dialog_view = this;
-  constrained_window::CreateBrowserModalDialogViews(this, nullptr)->Show();
 }
 
 void HandleArcAppUninstall(base::OnceClosure closure, bool accept) {
@@ -238,6 +234,7 @@
 }  // namespace
 
 void ShowArcAppUninstallDialog(Profile* profile,
+                               AppListControllerDelegate* controller,
                                const std::string& app_id) {
   std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
       GetArcAppInfo(profile, app_id);
@@ -266,7 +263,7 @@
 
   base::string16 cancel_button_text = l10n_util::GetStringUTF16(IDS_CANCEL);
   new ArcAppDialogView(
-      profile, app_id, window_title, heading_text, subheading_text,
+      profile, controller, app_id, window_title, heading_text, subheading_text,
       confirm_button_text, cancel_button_text,
       base::BindOnce(HandleArcAppUninstall,
                      base::BindOnce(UninstallArcApp, app_id, profile)));
@@ -293,8 +290,8 @@
 
   base::string16 cancel_button_text = l10n_util::GetStringUTF16(IDS_CANCEL);
 
-  new ArcAppDialogView(profile, app_id, window_title, heading_text,
-                       base::string16() /*subheading_text*/,
+  new ArcAppDialogView(profile, nullptr /* controller */, app_id, window_title,
+                       heading_text, base::string16() /*subheading_text*/,
                        confirm_button_text, cancel_button_text,
                        std::move(callback));
 }
@@ -322,9 +319,9 @@
 
   base::string16 cancel_button_text = l10n_util::GetStringUTF16(IDS_CANCEL);
 
-  new ArcAppDialogView(profile, app_id, window_title, heading_text,
-                       subheading_text, confirm_button_text, cancel_button_text,
-                       std::move(callback));
+  new ArcAppDialogView(profile, nullptr /* controller */, app_id, window_title,
+                       heading_text, subheading_text, confirm_button_text,
+                       cancel_button_text, std::move(callback));
 }
 
 bool IsArcAppDialogViewAliveForTest() {
diff --git a/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc b/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
index b0effdc2..801896c8 100644
--- a/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/app_list_client_impl.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.h"
@@ -406,22 +407,31 @@
   std::string app_id =
       arc_app_list_pref()->GetAppId(package_name, app_activity);
 
-  ShowArcAppUninstallDialog(browser()->profile(), app_id);
-  content::RunAllPendingInMessageLoop();
+  AppListClientImpl* controller = AppListClientImpl::GetInstance();
+  EXPECT_FALSE(controller->app_list_visible());
+  controller->ShowAppList();
+  EXPECT_TRUE(controller->app_list_visible());
+
+  ShowArcAppUninstallDialog(browser()->profile(), controller, app_id);
+  EXPECT_TRUE(controller->app_list_visible());
+  EXPECT_TRUE(IsArcAppDialogViewAliveForTest());
 
   // Cancelling the dialog won't uninstall any app.
   EXPECT_TRUE(CloseAppDialogViewAndConfirmForTest(false));
   content::RunAllPendingInMessageLoop();
   EXPECT_EQ(2u, arc_app_list_pref()->GetAppIds().size());
+  EXPECT_TRUE(controller->app_list_visible());
 
-  ShowArcAppUninstallDialog(browser()->profile(), app_id);
+  ShowArcAppUninstallDialog(browser()->profile(), controller, app_id);
   content::RunAllPendingInMessageLoop();
   EXPECT_TRUE(IsArcAppDialogViewAliveForTest());
+  EXPECT_TRUE(controller->app_list_visible());
 
   // Accepting the dialog should work now.
   EXPECT_TRUE(CloseAppDialogViewAndConfirmForTest(true));
   content::RunAllPendingInMessageLoop();
   EXPECT_EQ(0u, arc_app_list_pref()->GetAppIds().size());
+  EXPECT_TRUE(controller->app_list_visible());
 }
 
 // User confirms/cancels ARC app shortcut removal. Note that the app is not
@@ -433,15 +443,18 @@
   std::string intent_uri = "Fake Shortcut uri 0";
   std::string app_id = arc_app_list_pref()->GetAppId(package_name, intent_uri);
 
-  ShowArcAppUninstallDialog(browser()->profile(), app_id);
-  content::RunAllPendingInMessageLoop();
+  AppListClientImpl* controller = AppListClientImpl::GetInstance();
+  controller->ShowAppList();
+
+  ShowArcAppUninstallDialog(browser()->profile(), controller, app_id);
+  EXPECT_TRUE(IsArcAppDialogViewAliveForTest());
 
   // Cancelling the dialog won't uninstall any app.
   EXPECT_TRUE(CloseAppDialogViewAndConfirmForTest(false));
   content::RunAllPendingInMessageLoop();
   EXPECT_EQ(2u, arc_app_list_pref()->GetAppIds().size());
 
-  ShowArcAppUninstallDialog(browser()->profile(), app_id);
+  ShowArcAppUninstallDialog(browser()->profile(), controller, app_id);
   content::RunAllPendingInMessageLoop();
   EXPECT_TRUE(IsArcAppDialogViewAliveForTest());
 
@@ -449,6 +462,7 @@
   EXPECT_TRUE(CloseAppDialogViewAndConfirmForTest(true));
   content::RunAllPendingInMessageLoop();
   EXPECT_EQ(1u, arc_app_list_pref()->GetAppIds().size());
+  EXPECT_TRUE(controller->app_list_visible());
 }
 
 }  // namespace arc
diff --git a/chrome/browser/ui/views/chrome_typography_provider.cc b/chrome/browser/ui/views/chrome_typography_provider.cc
index 0d622aa..14d4a8e6 100644
--- a/chrome/browser/ui/views/chrome_typography_provider.cc
+++ b/chrome/browser/ui/views/chrome_typography_provider.cc
@@ -217,14 +217,19 @@
     }
   }
 
+  if (context == views::style::CONTEXT_MENU &&
+      style == views::style::STYLE_DISABLED &&
+      native_theme->ShouldUseDarkColors()) {
+    return gfx::kGoogleGrey600;
+  }
+
   switch (style) {
     case views::style::STYLE_DIALOG_BUTTON_DEFAULT:
       return SK_ColorWHITE;
     case views::style::STYLE_DISABLED:
-      if (!native_theme->ShouldUseDarkColors())
-        return SkColorSetRGB(0x9e, 0x9e, 0x9e);
-      return context == views::style::CONTEXT_MENU ? gfx::kGoogleGrey600
-                                                   : gfx::kGoogleGrey800;
+      return native_theme->ShouldUseDarkColors()
+                 ? gfx::kGoogleGrey800
+                 : SkColorSetRGB(0x9e, 0x9e, 0x9e);
     case views::style::STYLE_LINK:
       return gfx::kGoogleBlue700;
     case views::style::STYLE_SECONDARY:
diff --git a/chrome/browser/ui/views/frame/hosted_app_button_container.cc b/chrome/browser/ui/views/frame/hosted_app_button_container.cc
index 124b2ad4..eec0f61d 100644
--- a/chrome/browser/ui/views/frame/hosted_app_button_container.cc
+++ b/chrome/browser/ui/views/frame/hosted_app_button_container.cc
@@ -6,6 +6,7 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/ui/browser_command_controller.h"
@@ -324,7 +325,7 @@
 
   gfx::Size preferred_size = GetPreferredSize();
   const int width =
-      std::min(preferred_size.width(), std::max(0, trailing_x - leading_x));
+      base::ClampToRange(trailing_x - leading_x, 0, preferred_size.width());
   const int height = preferred_size.height();
   DCHECK_LE(height, available_height);
   SetBounds(trailing_x - width, y + (available_height - height) / 2, width,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 9863fd8..c5b5290 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -142,10 +142,14 @@
         starting_color_(starting_color),
         animation_(
             {
-                gfx::MultiAnimation::Part(4000, gfx::Tween::ZERO),
-                gfx::MultiAnimation::Part(300, gfx::Tween::FAST_OUT_SLOW_IN),
+                gfx::MultiAnimation::Part(
+                    base::TimeDelta::FromMilliseconds(4000),
+                    gfx::Tween::ZERO),
+                gfx::MultiAnimation::Part(
+                    base::TimeDelta::FromMilliseconds(300),
+                    gfx::Tween::FAST_OUT_SLOW_IN),
             },
-            gfx::MultiAnimation::GetDefaultTimerInterval()) {
+            gfx::MultiAnimation::kDefaultTimerInterval) {
     DCHECK(view_);
 
     animation_.set_delegate(this);
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
index 2eb481afa..00c90f9 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -10,6 +10,7 @@
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/avatar_menu.h"
 #include "chrome/browser/profiles/profile.h"
@@ -46,6 +47,9 @@
 constexpr base::TimeDelta kEmailExpansionDuration =
     base::TimeDelta::FromSeconds(3);
 
+constexpr base::TimeDelta kHighlightAnimationDuration =
+    base::TimeDelta::FromSeconds(2);
+
 ProfileAttributesEntry* GetProfileAttributesEntry(Profile* profile) {
   ProfileAttributesEntry* entry;
   if (!g_browser_process->profile_manager()
@@ -127,9 +131,15 @@
   UpdateText();
 
   md_observer_.Add(ui::MaterialDesignController::GetInstance());
+
+  personal_data_manager_ = autofill::PersonalDataManagerFactory::GetForProfile(
+      profile_->GetOriginalProfile());
+  personal_data_manager_->AddObserver(this);
 }
 
-AvatarToolbarButton::~AvatarToolbarButton() {}
+AvatarToolbarButton::~AvatarToolbarButton() {
+  personal_data_manager_->RemoveObserver(this);
+}
 
 void AvatarToolbarButton::UpdateIcon() {
   // If widget isn't set, the button doesn't have access to the theme provider
@@ -178,6 +188,14 @@
       }
       break;
     }
+    case State::kHighlightAnimation:
+      // If the highlight animation is visible, hide the avatar sync
+      // paused/error state even if there is no autofill icon visible in the
+      // parent container.
+      color = AdjustHighlightColorForContrast(
+          GetThemeProvider(), gfx::kGoogleBlue300, gfx::kGoogleBlue600,
+          gfx::kGoogleBlue050, gfx::kGoogleBlue900);
+      break;
     case State::kSyncError:
       color = AdjustHighlightColorForContrast(
           GetThemeProvider(), gfx::kGoogleRed300, gfx::kGoogleRed600,
@@ -203,10 +221,9 @@
   SetTooltipText(GetAvatarTooltipText());
 }
 
-void AvatarToolbarButton::SetSuppressAvatarButtonState(
-    bool suppress_avatar_button_state) {
+void AvatarToolbarButton::SetAutofillIconVisible(bool autofill_icon_visible) {
   DCHECK_NE(GetState(), State::kIncognitoProfile);
-  suppress_avatar_button_state_ = suppress_avatar_button_state;
+  autofill_icon_visible_ = autofill_icon_visible;
   UpdateText();
 }
 
@@ -302,6 +319,19 @@
   PreferredSizeChanged();
 }
 
+void AvatarToolbarButton::OnCreditCardSaved() {
+  DCHECK_NE(GetState(), State::kIncognitoProfile);
+  DCHECK_NE(GetState(), State::kGuestSession);
+  DCHECK(!profile_->IsOffTheRecord());
+  ShowHighlightAnimation();
+
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&AvatarToolbarButton::HideHighlightAnimation,
+                     weak_ptr_factory_.GetWeakPtr()),
+      kHighlightAnimationDuration);
+}
+
 void AvatarToolbarButton::ExpandToShowEmail() {
   DCHECK(user_email_.has_value());
   DCHECK(!waiting_for_image_to_show_user_email_);
@@ -342,6 +372,7 @@
       return l10n_util::GetStringFUTF16(IDS_AVATAR_BUTTON_SYNC_PAUSED_TOOLTIP,
                                         GetProfileName());
     case State::kNormal:
+    case State::kHighlightAnimation:
       return GetProfileName();
   }
   NOTREACHED();
@@ -372,6 +403,7 @@
       return gfx::CreateVectorIcon(kUserAccountAvatarIcon, icon_size,
                                    icon_color);
     case State::kAnimatedSignIn:
+    case State::kHighlightAnimation:
     case State::kSyncError:
     case State::kSyncPaused:
     case State::kNormal:
@@ -448,9 +480,12 @@
   if (user_email_.has_value() && !waiting_for_image_to_show_user_email_)
     return State::kAnimatedSignIn;
 
+  if (highlight_animation_visible_)
+    return State::kHighlightAnimation;
+
 #if !defined(OS_CHROMEOS)
   if (identity_manager->HasPrimaryAccount() && profile_->IsSyncAllowed() &&
-      error_controller_.HasAvatarError() && !suppress_avatar_button_state_) {
+      error_controller_.HasAvatarError() && !autofill_icon_visible_) {
     // When DICE is enabled and the error is an auth error, the sync-paused
     // icon is shown.
     int unused;
@@ -484,3 +519,13 @@
   waiting_for_image_to_show_user_email_ = true;
   UpdateIcon();
 }
+
+void AvatarToolbarButton::ShowHighlightAnimation() {
+  highlight_animation_visible_ = true;
+  UpdateText();
+}
+
+void AvatarToolbarButton::HideHighlightAnimation() {
+  highlight_animation_visible_ = false;
+  UpdateText();
+}
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
index 2c2a4219..c097aa4 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -14,6 +14,8 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
+#include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/personal_data_manager_observer.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "ui/base/material_design/material_design_controller_observer.h"
 #include "ui/events/event.h"
@@ -25,14 +27,15 @@
                             public BrowserListObserver,
                             public ProfileAttributesStorage::Observer,
                             public signin::IdentityManager::Observer,
-                            public ui::MaterialDesignControllerObserver {
+                            public ui::MaterialDesignControllerObserver,
+                            public autofill::PersonalDataManagerObserver {
  public:
   explicit AvatarToolbarButton(Browser* browser);
   ~AvatarToolbarButton() override;
 
   void UpdateIcon();
   void UpdateText();
-  void SetSuppressAvatarButtonState(bool suppress_avatar_button_state);
+  void SetAutofillIconVisible(bool autofill_icon_visible);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(AvatarToolbarButtonTest,
@@ -43,6 +46,7 @@
     kIncognitoProfile,
     kGuestSession,
     kGenericProfile,
+    kHighlightAnimation,
     kAnimatedSignIn,
     kSyncPaused,
     kSyncError,
@@ -84,6 +88,9 @@
   // ui::MaterialDesignControllerObserver:
   void OnTouchUiChanged() override;
 
+  // autofill::PersonalDataManagerObserver:
+  void OnCreditCardSaved() override;
+
   void ExpandToShowEmail();
   void ResetUserEmail();
 
@@ -98,12 +105,22 @@
   // Sets |user_email_| and initiates showing the email (if non-empty).
   void SetUserEmail(const std::string& user_email);
 
+  void ShowHighlightAnimation();
+  void HideHighlightAnimation();
+
   Browser* const browser_;
   Profile* const profile_;
 
-  // Indicates if the avatar icon should show text and update highlight color
-  // when sync state is not normal.
-  bool suppress_avatar_button_state_ = false;
+  autofill::PersonalDataManager* personal_data_manager_;
+
+  // Whether the avatar highlight animation is visible. If true, hide avatar
+  // button sync paused/error state and update highlight color.
+  bool highlight_animation_visible_ = false;
+
+  // Whether any autofill icon is visible in |this|'s parent container. Set by
+  // |ToolbarPageActionIconContainerView|. If true, hide avatar button sync
+  // paused/error state.
+  bool autofill_icon_visible_ = false;
 
   // The user email that we're currently showing in an animation or empty if no
   // animation is in progress.
diff --git a/chrome/browser/ui/views/tabs/alert_indicator.cc b/chrome/browser/ui/views/tabs/alert_indicator.cc
index 0b7f2b70..1a8d8ace 100644
--- a/chrome/browser/ui/views/tabs/alert_indicator.cc
+++ b/chrome/browser/ui/views/tabs/alert_indicator.cc
@@ -20,8 +20,10 @@
 // Fade-in/out duration for the tab indicator animations.  Fade-in is quick to
 // immediately notify the user.  Fade-out is more gradual, so that the user has
 // a chance of finding a tab that has quickly "blipped" on and off.
-constexpr int kIndicatorFadeInDurationMs = 200;
-constexpr int kIndicatorFadeOutDurationMs = 1000;
+constexpr auto kIndicatorFadeInDuration =
+    base::TimeDelta::FromMilliseconds(200);
+constexpr auto kIndicatorFadeOutDuration =
+    base::TimeDelta::FromMilliseconds(1000);
 
 // Interval between frame updates of the tab indicator animations.  This is not
 // the usual 60 FPS because a trade-off must be made between tab UI animation
@@ -33,21 +35,15 @@
 // "in" state.
 class TabRecordingIndicatorAnimation : public gfx::MultiAnimation {
  public:
-  ~TabRecordingIndicatorAnimation() override {}
+  TabRecordingIndicatorAnimation(const gfx::MultiAnimation::Parts& parts,
+                                 const base::TimeDelta interval)
+      : MultiAnimation(parts, interval) {}
+  ~TabRecordingIndicatorAnimation() override = default;
 
   // Overridden to provide alternating "towards in" and "towards out" behavior.
   double GetCurrentValue() const override;
 
   static std::unique_ptr<TabRecordingIndicatorAnimation> Create();
-
- private:
-  TabRecordingIndicatorAnimation(const gfx::MultiAnimation::Parts& parts,
-                                 const base::TimeDelta interval)
-      : MultiAnimation(parts, interval) {}
-
-  // Number of times to "toggle throb" the recording and tab capture indicators
-  // when they first appear.
-  static const int kCaptureIndicatorThrobCycles = 5;
 };
 
 double TabRecordingIndicatorAnimation::GetCurrentValue() const {
@@ -57,18 +53,22 @@
 
 std::unique_ptr<TabRecordingIndicatorAnimation>
 TabRecordingIndicatorAnimation::Create() {
+  // Number of times to "toggle throb" the recording and tab capture indicators
+  // when they first appear.
+  constexpr size_t kCaptureIndicatorThrobCycles = 5;
+
   MultiAnimation::Parts parts;
   static_assert(
       kCaptureIndicatorThrobCycles % 2 != 0,
       "odd number of cycles required so animation finishes in showing state");
-  for (int i = 0; i < kCaptureIndicatorThrobCycles; ++i) {
+  for (size_t i = 0; i < kCaptureIndicatorThrobCycles; ++i) {
     parts.push_back(MultiAnimation::Part(
-        i % 2 ? kIndicatorFadeOutDurationMs : kIndicatorFadeInDurationMs,
+        i % 2 ? kIndicatorFadeOutDuration : kIndicatorFadeInDuration,
         gfx::Tween::EASE_IN));
   }
 
-  std::unique_ptr<TabRecordingIndicatorAnimation> animation(
-      new TabRecordingIndicatorAnimation(parts, kIndicatorFrameInterval));
+  auto animation = std::make_unique<TabRecordingIndicatorAnimation>(
+      parts, kIndicatorFrameInterval);
   animation->set_continuous(false);
   return animation;
 }
@@ -139,10 +139,10 @@
   gfx::MultiAnimation::Parts parts;
   const bool is_for_fade_in = (alert_state != TabAlertState::NONE);
   parts.push_back(gfx::MultiAnimation::Part(
-      is_for_fade_in ? kIndicatorFadeInDurationMs : kIndicatorFadeOutDurationMs,
+      is_for_fade_in ? kIndicatorFadeInDuration : kIndicatorFadeOutDuration,
       gfx::Tween::EASE_IN));
-  std::unique_ptr<gfx::MultiAnimation> animation(
-      new gfx::MultiAnimation(parts, kIndicatorFrameInterval));
+  auto animation =
+      std::make_unique<gfx::MultiAnimation>(parts, kIndicatorFrameInterval);
   animation->set_continuous(false);
   return std::move(animation);
 }
diff --git a/chrome/browser/ui/views/tabs/stacked_tab_strip_layout.cc b/chrome/browser/ui/views/tabs/stacked_tab_strip_layout.cc
index 61cb3a8..61c1d7e9 100644
--- a/chrome/browser/ui/views/tabs/stacked_tab_strip_layout.cc
+++ b/chrome/browser/ui/views/tabs/stacked_tab_strip_layout.cc
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/metrics/user_metrics.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_number_conversions.h"
 
 using base::UserMetricsAction;
@@ -248,7 +249,7 @@
   if (index <= pinned_tab_count_)
     return;
 
-  x = std::min(GetMaxX(index), std::max(x, GetMinX(index)));
+  x = ConstrainActiveX(x);
   if (x == ideal_x(index))
     return;
 
@@ -340,9 +341,9 @@
 
   // Move the active tab to the left so that all tabs between the active tab
   // and |index| (inclusive) can be made visible.
-  const int active_x = std::max(GetMinX(active_index()),
-                                std::min(ideal_x(index) - ideal_delta,
-                                         ideal_x(active_index())));
+  const int active_x =
+      base::ClampToRange(ideal_x(index) - ideal_delta, GetMinX(active_index()),
+                         ideal_x(active_index()));
   SetIdealBoundsAt(active_index(), active_x);
   LayoutByTabOffsetBefore(active_index());
   LayoutByTabOffsetAfter(active_index());
@@ -366,8 +367,8 @@
 }
 
 int StackedTabStripLayout::ConstrainActiveX(int x) const {
-  return std::min(GetMaxX(active_index()),
-                  std::max(GetMinX(active_index()), x));
+  return base::ClampToRange(x, GetMinX(active_index()),
+                            GetMaxX(active_index()));
 }
 
 void StackedTabStripLayout::SetActiveBoundsAndLayoutFromActiveTab() {
@@ -398,11 +399,9 @@
 
 void StackedTabStripLayout::LayoutUsingCurrentAfter(int index) {
   for (int i = index + 1; i < tab_count(); ++i) {
+    int x = std::min(ideal_x(i), ideal_x(i - 1) + tab_offset());
     int min_x = width_ - width_for_count(tab_count() - i);
-    int x = std::max(min_x,
-                     std::min(ideal_x(i), ideal_x(i - 1) + tab_offset()));
-    x = std::min(GetMaxX(i), x);
-    SetIdealBoundsAt(i, x);
+    SetIdealBoundsAt(i, base::ClampToRange(x, min_x, GetMaxX(i)));
   }
 }
 
@@ -432,8 +431,7 @@
   for (int i = index + 1; i < tab_count(); ++i) {
     const int min_x = ideal_x(i - 1) + stacked_padding_;
     const int max_x = ideal_x(i - 1) + tab_offset();
-    SetIdealBoundsAt(
-        i, std::max(min_x, std::min(ideal_x(i), max_x)));
+    SetIdealBoundsAt(i, base::ClampToRange(ideal_x(i), min_x, max_x));
   }
 }
 
@@ -441,8 +439,7 @@
   for (int i = index - 1; i >= pinned_tab_count_; --i) {
     const int max_x = ideal_x(i + 1) - stacked_padding_;
     const int min_x = ideal_x(i + 1) - tab_offset();
-    SetIdealBoundsAt(
-        i, std::max(min_x, std::min(ideal_x(i), max_x)));
+    SetIdealBoundsAt(i, base::ClampToRange(ideal_x(i), min_x, max_x));
   }
 
   if (pinned_tab_count_ == 0)
diff --git a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
index d2e99c9..0ac7c421 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
@@ -158,12 +158,12 @@
   if (browser_->profile()->IsIncognitoProfile())
     return;
 
-  bool suppress_avatar_button_state = false;
+  bool autofill_icon_visible = false;
   for (PageActionIconView* icon_view : page_action_icons_) {
     if (icon_view->GetVisible()) {
-      suppress_avatar_button_state = true;
+      autofill_icon_visible = true;
       break;
     }
   }
-  avatar_->SetSuppressAvatarButtonState(suppress_avatar_button_state);
+  avatar_->SetAutofillIconVisible(autofill_icon_visible);
 }
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
index e5b8e227..1ec9eb3f 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals.mojom
@@ -8,5 +8,5 @@
 
 interface BluetoothInternalsHandler {
   // Gets an Adapter interface. Returns null if Bluetooth is not supported.
-  GetAdapter() => (bluetooth.mojom.Adapter? adapter);
+  GetAdapter() => (pending_remote<bluetooth.mojom.Adapter>? adapter);
 };
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
index 53f4a59..252b190 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.cc
@@ -10,7 +10,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "device/bluetooth/adapter.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "url/gurl.h"
 
 BluetoothInternalsHandler::BluetoothInternalsHandler(
@@ -25,15 +27,15 @@
         base::BindOnce(&BluetoothInternalsHandler::OnGetAdapter,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   } else {
-    std::move(callback).Run(nullptr /* AdapterPtr */);
+    std::move(callback).Run(mojo::NullRemote() /* adapter */);
   }
 }
 
 void BluetoothInternalsHandler::OnGetAdapter(
     GetAdapterCallback callback,
     scoped_refptr<device::BluetoothAdapter> adapter) {
-  bluetooth::mojom::AdapterPtr adapter_ptr;
-  mojo::MakeStrongBinding(std::make_unique<bluetooth::Adapter>(adapter),
-                          mojo::MakeRequest(&adapter_ptr));
-  std::move(callback).Run(std::move(adapter_ptr));
+  mojo::PendingRemote<bluetooth::mojom::Adapter> pending_adapter;
+  mojo::MakeSelfOwnedReceiver(std::make_unique<bluetooth::Adapter>(adapter),
+                              pending_adapter.InitWithNewPipeAndPassReceiver());
+  std::move(callback).Run(std::move(pending_adapter));
 }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index afb64895..89ee3e7 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -163,6 +163,7 @@
 #include "chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_dialog.h"
 #include "chrome/browser/ui/webui/chromeos/cellular_setup/mobile_setup_ui.h"
 #include "chrome/browser/ui/webui/chromeos/certificate_manager_dialog_ui.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h"
 #include "chrome/browser/ui/webui/chromeos/cryptohome_ui.h"
 #include "chrome/browser/ui/webui/chromeos/drive_internals_ui.h"
 #include "chrome/browser/ui/webui/chromeos/first_run/first_run_ui.h"
@@ -540,6 +541,9 @@
     return &NewWebUI<chromeos::cellular_setup::CellularSetupDialogUI>;
   if (url.host_piece() == chrome::kChromeUICertificateManagerHost)
     return &NewWebUI<chromeos::CertificateManagerDialogUI>;
+  if (chromeos::CrostiniInstallerUI::IsEnabled() &&
+      url.host_piece() == chrome::kChromeUICrostiniInstallerHost)
+    return &NewWebUI<chromeos::CrostiniInstallerUI>;
   if (url.host_piece() == chrome::kChromeUICryptohomeHost)
     return &NewWebUI<chromeos::CryptohomeUI>;
   if (url.host_piece() == chrome::kChromeUIDriveInternalsHost)
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
index 9607513..c34e6ca 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_metrics_recorder_browsertest.cc
@@ -42,11 +42,9 @@
   }
 
   void CloseAddSupervisionDialog() {
-    content::WebContents* web_contents = test_web_ui_.GetWebContents();
-    bool out_close_dialog;
-    AddSupervisionDialog::GetInstance()->OnCloseContents(web_contents,
-                                                         &out_close_dialog);
-    ASSERT_TRUE(out_close_dialog);
+    bool out_close_dialog =
+        AddSupervisionDialog::GetInstance()->OnDialogCloseRequested();
+    EXPECT_TRUE(out_close_dialog);
     AddSupervisionDialog::Close();
   }
 
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
index 119ba4e..d01ad32 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.cc
@@ -119,29 +119,16 @@
   size->SetSize(kDialogWidthPx, kDialogHeightPx);
 }
 
-bool AddSupervisionDialog::OnDialogCloseRequested() {
+bool AddSupervisionDialog::CanCloseDialog() const {
   bool showing_confirm_dialog = MaybeShowConfirmSignoutDialog();
   return !showing_confirm_dialog;
 }
 
-void AddSupervisionDialog::OnCloseContents(content::WebContents* source,
-                                           bool* out_close_dialog) {
-  // This code gets called by a different path than OnDialogCloseRequested(),
-  // and actually masks the call to OnDialogCloseRequested() the first time the
-  // user clicks on the [x].  Because the first [x] click comes here, we need to
-  // show the confirmation dialog here and signal the caller to possibly close
-  // the dialog.  Subsequent clicks on [x] during the lifetime of the dialog
-  // will result in direct calls to OnDialogCloseRequested(), skipping this
-  // method.
-  *out_close_dialog = OnDialogCloseRequested();
-  // If |out_close_dialog|, then we are before the point of no return prior to
-  // completing enrollment, and that's the only time we want to record kClosed.
-  if (*out_close_dialog) {
-    // Record UMA metric that user has closed the Add Supervision dialog.
-    AddSupervisionMetricsRecorder::GetInstance()
-        ->RecordAddSupervisionEnrollment(
-            AddSupervisionMetricsRecorder::EnrollmentState::kClosed);
-  }
+bool AddSupervisionDialog::OnDialogCloseRequested() {
+  // Record UMA metric that user has closed the Add Supervision dialog.
+  AddSupervisionMetricsRecorder::GetInstance()->RecordAddSupervisionEnrollment(
+      AddSupervisionMetricsRecorder::EnrollmentState::kClosed);
+  return true;
 }
 
 AddSupervisionDialog::AddSupervisionDialog()
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
index eec2c495..c61ac74 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_ui.h
@@ -37,8 +37,7 @@
   ui::ModalType GetDialogModalType() const override;
   void GetDialogSize(gfx::Size* size) const override;
   bool OnDialogCloseRequested() override;
-  void OnCloseContents(content::WebContents* source,
-                       bool* out_close_dialog) override;
+  bool CanCloseDialog() const override;
 
  protected:
   AddSupervisionDialog();
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/BUILD.gn b/chrome/browser/ui/webui/chromeos/crostini_installer/BUILD.gn
new file mode 100644
index 0000000..998e8618
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/BUILD.gn
@@ -0,0 +1,11 @@
+# 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.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+  sources = [
+    "crostini_installer.mojom",
+  ]
+}
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS b/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom
new file mode 100644
index 0000000..931227b9
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom
@@ -0,0 +1,21 @@
+// 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.
+
+module chromeos.crostini_installer.mojom;
+
+// Lives in the browser process. A renderer uses this to create a page handler
+// for controlling Crostini installation.
+interface PageHandlerFactory {
+  // Create a page handler to control Crostini installation.
+  CreatePageHandler(pending_remote<Page> page,
+                    pending_receiver<PageHandler> handler);
+};
+
+// Lives in the browser process. A renderer use this to control Crostini
+// installation.
+interface PageHandler {};
+
+// Lives in the renderer process. The browser uses this to sends installation
+// updates to the web page in the render.
+interface Page {};
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc
new file mode 100644
index 0000000..4299032
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.cc
@@ -0,0 +1,22 @@
+// 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/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h"
+
+#include <utility>
+
+#include "base/optional.h"
+
+namespace chromeos {
+
+CrostiniInstallerPageHandler::CrostiniInstallerPageHandler(
+    mojo::PendingReceiver<chromeos::crostini_installer::mojom::PageHandler>
+        pending_page_handler,
+    mojo::PendingRemote<chromeos::crostini_installer::mojom::Page> pending_page)
+    : receiver_{this, std::move(pending_page_handler)},
+      page_{std::move(pending_page)} {}
+
+CrostiniInstallerPageHandler::~CrostiniInstallerPageHandler() = default;
+
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h
new file mode 100644
index 0000000..d816d8a
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h
@@ -0,0 +1,36 @@
+// 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_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_PAGE_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_PAGE_HANDLER_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+namespace chromeos {
+
+class CrostiniInstallerPageHandler
+    : public chromeos::crostini_installer::mojom::PageHandler {
+ public:
+  CrostiniInstallerPageHandler(
+      mojo::PendingReceiver<chromeos::crostini_installer::mojom::PageHandler>
+          pending_page_handler,
+      mojo::PendingRemote<chromeos::crostini_installer::mojom::Page>
+          pending_page);
+  ~CrostiniInstallerPageHandler() override;
+
+ private:
+  mojo::Receiver<chromeos::crostini_installer::mojom::PageHandler> receiver_;
+  mojo::Remote<chromeos::crostini_installer::mojom::Page> page_;
+
+  DISALLOW_COPY_AND_ASSIGN(CrostiniInstallerPageHandler);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_PAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
new file mode 100644
index 0000000..b3582ee16
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.cc
@@ -0,0 +1,73 @@
+// 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/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_page_handler.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace chromeos {
+
+bool CrostiniInstallerUI::IsEnabled() {
+  return base::FeatureList::IsEnabled(
+      chromeos::features::kCrostiniWebUIInstaller);
+}
+
+CrostiniInstallerUI::CrostiniInstallerUI(content::WebUI* web_ui)
+    : ui::MojoWebUIController{web_ui} {
+  // TODO(lxj): We might want to make sure there is only one instance of this
+  // class.
+
+  content::WebUIDataSource* source =
+      content::WebUIDataSource::Create(chrome::kChromeUICrostiniInstallerHost);
+
+  source->AddResourcePath("app.html", IDR_CROSTINI_INSTALLER_APP_HTML);
+  source->AddResourcePath("app.js", IDR_CROSTINI_INSTALLER_APP_JS);
+  source->AddResourcePath("browser_proxy.html",
+                          IDR_CROSTINI_INSTALLER_BROWSER_PROXY_HTML);
+  source->AddResourcePath("browser_proxy.js",
+                          IDR_CROSTINI_INSTALLER_BROWSER_PROXY_JS);
+  source->AddResourcePath("crostini_installer.mojom.html",
+                          IDR_CROSTINI_INSTALLER_MOJO_HTML);
+  source->AddResourcePath("crostini_installer.mojom-lite.js",
+                          IDR_CROSTINI_INSTALLER_MOJO_LITE_JS);
+  source->SetDefaultResource(IDR_CROSTINI_INSTALLER_INDEX_HTML);
+  content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
+
+  AddHandlerToRegistry(base::BindRepeating(
+      &CrostiniInstallerUI::BindPageHandlerFactory, base::Unretained(this)));
+}
+
+CrostiniInstallerUI::~CrostiniInstallerUI() = default;
+
+void CrostiniInstallerUI::BindPageHandlerFactory(
+    mojo::PendingReceiver<
+        chromeos::crostini_installer::mojom::PageHandlerFactory>
+        pending_receiver) {
+  if (page_factory_receiver_.is_bound()) {
+    page_factory_receiver_.reset();
+  }
+
+  page_factory_receiver_.Bind(std::move(pending_receiver));
+}
+
+void CrostiniInstallerUI::CreatePageHandler(
+    mojo::PendingRemote<chromeos::crostini_installer::mojom::Page> pending_page,
+    mojo::PendingReceiver<chromeos::crostini_installer::mojom::PageHandler>
+        pending_page_handler) {
+  DCHECK(pending_page.is_valid());
+
+  page_handler_ = std::make_unique<CrostiniInstallerPageHandler>(
+      std::move(pending_page_handler), std::move(pending_page));
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h
new file mode 100644
index 0000000..e24d00f4
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer_ui.h
@@ -0,0 +1,51 @@
+// 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_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_UI_H_
+
+#include "base/macros.h"
+#include "chrome/browser/ui/webui/chromeos/crostini_installer/crostini_installer.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace chromeos {
+
+class CrostiniInstallerPageHandler;
+
+// The WebUI for chrome://crostini-installer
+class CrostiniInstallerUI
+    : public ui::MojoWebUIController,
+      public chromeos::crostini_installer::mojom::PageHandlerFactory {
+ public:
+  static bool IsEnabled();
+
+  explicit CrostiniInstallerUI(content::WebUI* web_ui);
+  ~CrostiniInstallerUI() override;
+
+ private:
+  void BindPageHandlerFactory(
+      mojo::PendingReceiver<
+          chromeos::crostini_installer::mojom::PageHandlerFactory>
+          pending_receiver);
+
+  // chromeos::crostini_installer::mojom::PageHandlerFactory:
+  void CreatePageHandler(
+      mojo::PendingRemote<chromeos::crostini_installer::mojom::Page>
+          pending_page,
+      mojo::PendingReceiver<chromeos::crostini_installer::mojom::PageHandler>
+          pending_page_handler) override;
+
+  std::unique_ptr<CrostiniInstallerPageHandler> page_handler_;
+  mojo::Receiver<chromeos::crostini_installer::mojom::PageHandlerFactory>
+      page_factory_receiver_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(CrostiniInstallerUI);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_CROSTINI_INSTALLER_CROSTINI_INSTALLER_UI_H_
diff --git a/chrome/browser/ui/webui/chromeos/login/DEPS b/chrome/browser/ui/webui/chromeos/login/DEPS
index 6a5d8b5..4994ed9 100644
--- a/chrome/browser/ui/webui/chromeos/login/DEPS
+++ b/chrome/browser/ui/webui/chromeos/login/DEPS
@@ -2,7 +2,6 @@
   # TODO(mash): Fix. https://crbug.com/856375.
   "core_oobe_handler\.cc": [
     "+ash/shell.h",
-    "+ash/shelf/shelf_constants.h",
   ],
   # Tests.
   "oobe_display_chooser_browsertest\.cc": [
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index b39686e..4a6425fc 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -8,9 +8,9 @@
 
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/event_rewriter_controller.h"
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/public/cpp/tablet_mode.h"
 #include "ash/public/mojom/constants.mojom.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -553,7 +553,7 @@
   const gfx::Size size =
       display::Screen::GetScreen()->GetPrimaryDisplay().size();
   SetClientAreaSize(size.width(), size.height());
-  SetShelfHeight(ash::ShelfConstants::shelf_size());
+  SetShelfHeight(ash::ShelfConfig::Get()->shelf_size());
 }
 
 void CoreOobeHandler::OnOobeConfigurationChanged() {
diff --git a/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc b/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
index 7550ea28..e180a8f 100644
--- a/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.cc
@@ -37,6 +37,7 @@
     {"networkListItemConnectingTo", IDS_NETWORK_LIST_CONNECTING_TO},
     {"networkListItemInitializing", IDS_NETWORK_LIST_INITIALIZING},
     {"networkListItemScanning", IDS_SETTINGS_INTERNET_MOBILE_SEARCH},
+    {"networkListItemSimCardLocked", IDS_NETWORK_LIST_SIM_CARD_LOCKED},
     {"networkListItemNotConnected", IDS_NETWORK_LIST_NOT_CONNECTED},
     {"networkListItemNoNetwork", IDS_NETWORK_LIST_NO_NETWORK},
     {"vpnNameTemplate", IDS_NETWORK_LIST_THIRD_PARTY_VPN_NAME_TEMPLATE},
diff --git a/chrome/browser/ui/webui/discards/webui_graph_dump_impl_unittest.cc b/chrome/browser/ui/webui/discards/webui_graph_dump_impl_unittest.cc
index 113c413a..9b9330f 100644
--- a/chrome/browser/ui/webui/discards/webui_graph_dump_impl_unittest.cc
+++ b/chrome/browser/ui/webui/discards/webui_graph_dump_impl_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/time/time.h"
 #include "chrome/browser/performance_manager/graph/mock_graphs.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
-#include "chrome/browser/performance_manager/performance_manager_clock.h"
 #include "content/public/test/browser_task_environment.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -125,7 +124,7 @@
 
   MockMultiplePagesWithMultipleProcessesGraph mock_graph(&graph_);
 
-  base::TimeTicks now = PerformanceManagerClock::NowTicks();
+  base::TimeTicks now = base::TimeTicks::Now();
 
   const GURL kExampleUrl("http://www.example.org");
   mock_graph.page->OnMainFrameNavigationCommitted(now, 1, kExampleUrl);
diff --git a/chrome/browser/ui/webui/flags_ui_unittest.cc b/chrome/browser/ui/webui/flags_ui_unittest.cc
index e5f5a49..59c33e0 100644
--- a/chrome/browser/ui/webui/flags_ui_unittest.cc
+++ b/chrome/browser/ui/webui/flags_ui_unittest.cc
@@ -16,7 +16,7 @@
   FlagsUITest() = default;
 
  private:
-  content::TestBrowserThreadBundle bundle_;
+  content::BrowserTaskEnvironment task_environment_;
 };
 
 TEST_F(FlagsUITest, IsDeprecatedUrl) {
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 a855e2f..aa26f35 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -343,6 +343,7 @@
     int id;
   } kPdfResources[] = {
     {"pdf/browser_api.js", IDR_PDF_BROWSER_API_JS},
+    {"pdf/controller.js", IDR_PDF_CONTROLLER_JS},
     {"pdf/elements/icons.html", IDR_PDF_ICONS_HTML},
     {"pdf/elements/shared-vars.html", IDR_PDF_SHARED_VARS_HTML},
     {"pdf/elements/viewer-bookmark/viewer-bookmark.html",
diff --git a/chrome/browser/ui/window_sizer/window_sizer.cc b/chrome/browser/ui/window_sizer/window_sizer.cc
index 67a1dba..d762180 100644
--- a/chrome/browser/ui/window_sizer/window_sizer.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/numerics/ranges.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
@@ -307,12 +308,10 @@
       !work_area.Contains(*bounds)) {
     bounds->set_width(std::min(bounds->width(), work_area.width()));
     bounds->set_height(std::min(bounds->height(), work_area.height()));
-    bounds->set_x(
-        std::max(work_area.x(),
-                 std::min(bounds->x(), work_area.right() - bounds->width())));
-    bounds->set_y(
-        std::max(work_area.y(),
-                 std::min(bounds->y(), work_area.bottom() - bounds->height())));
+    bounds->set_x(base::ClampToRange(bounds->x(), work_area.x(),
+                                     work_area.right() - bounds->width()));
+    bounds->set_y(base::ClampToRange(bounds->y(), work_area.y(),
+                                     work_area.bottom() - bounds->height()));
   }
 
 #if defined(OS_MACOSX)
@@ -340,8 +339,8 @@
   const int min_x = work_area.x() + kMinVisibleWidth - bounds->width();
   const int max_y = work_area.bottom() - kMinVisibleHeight;
   const int max_x = work_area.right() - kMinVisibleWidth;
-  bounds->set_y(std::max(min_y, std::min(max_y, bounds->y())));
-  bounds->set_x(std::max(min_x, std::min(max_x, bounds->x())));
+  bounds->set_y(base::ClampToRange(bounds->y(), min_y, max_y));
+  bounds->set_x(base::ClampToRange(bounds->x(), min_x, max_x));
 #endif  // defined(OS_MACOSX)
 }
 
diff --git a/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc b/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
index 52efe92..e3de038 100644
--- a/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer_ash_uitest.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf.h"
-#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_view_test_api.h"
 #include "ash/shell.h"
@@ -63,7 +63,7 @@
   // Move the cursor up to the "New window" menu option - assumes menu content.
   const int offset =
       // Top half of the button we just clicked on.
-      ash::ShelfConstants::button_size() / 2 +
+      ash::ShelfConfig::Get()->button_size() / 2 +
       // Space between shelf top and menu bottom. Here we get this menu with
       // a right-click but long-pressing yields the same result. All menus
       // here use a touchable layout.
diff --git a/chrome/browser/vr/elements/environment/stars.cc b/chrome/browser/vr/elements/environment/stars.cc
index 26ef20b..47fc9a7 100644
--- a/chrome/browser/vr/elements/environment/stars.cc
+++ b/chrome/browser/vr/elements/environment/stars.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/vr/elements/environment/stars.h"
 
 #include "base/numerics/math_constants.h"
+#include "base/numerics/ranges.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
 #include "chrome/browser/vr/ui_element_renderer.h"
@@ -155,8 +156,7 @@
 
     float opacity_noise = (base::RandDouble() - 0.5);
     opacity_noise *= opacity_noise * opacity_noise * kOpacityNoiseScale;
-    opacity += opacity_noise;
-    opacity = std::min(1.0f, std::max(0.0f, opacity));
+    opacity = base::ClampToRange(opacity + opacity_noise, 0.0f, 1.0f);
 
     gfx::Transform local;
     local.RotateAboutYAxis(x_rot);
diff --git a/chrome/browser/vr/service/browser_xr_runtime.cc b/chrome/browser/vr/service/browser_xr_runtime.cc
index b848b34..9d89f09 100644
--- a/chrome/browser/vr/service/browser_xr_runtime.cc
+++ b/chrome/browser/vr/service/browser_xr_runtime.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/numerics/ranges.h"
 #include "chrome/browser/vr/service/vr_service_impl.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -97,9 +98,9 @@
   // release builds to ensure valid state.
   DCHECK(eye->render_width < kMaxSize);
   DCHECK(eye->render_height < kMaxSize);
-  ret->render_width = std::max(std::min(kMaxSize, eye->render_width), kMinSize);
+  ret->render_width = base::ClampToRange(eye->render_width, kMinSize, kMaxSize);
   ret->render_height =
-      std::max(std::min(kMaxSize, eye->render_height), kMinSize);
+      base::ClampToRange(eye->render_height, kMinSize, kMaxSize);
   return ret;
 }
 
diff --git a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
index 1c7b4c5..bc7a361 100644
--- a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
+++ b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
@@ -582,7 +582,7 @@
 
 // This mimics the Chrome side of the IPC.
 MULTIPROCESS_TEST_MAIN(ProtoChromePromptIPCClientMain) {
-  base::test::ScopedTaskEnvironment scoped_task_environment;
+  base::test::TaskEnvironment task_environment;
 
   ChildProcess child_process;
   if (!child_process.Run()) {
@@ -596,7 +596,7 @@
     : public ::testing::TestWithParam<
           std::tuple<bool, bool, PromptAcceptance, ChromeDisconnectPoint>> {
  private:
-  base::test::ScopedTaskEnvironment scoped_task_environment;
+  base::test::TaskEnvironment task_environment;
 };
 
 class ParentProcess {
@@ -839,7 +839,7 @@
   }
 
  protected:
-  base::test::ScopedTaskEnvironment scoped_task_environment;
+  base::test::TaskEnvironment task_environment;
 
   std::unique_ptr<MockChrome> mock_chrome_;
   std::unique_ptr<ProtoChromePromptIPC> chrome_prompt_ipc_;
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 810b6ad..f9c3641 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -202,6 +202,10 @@
 const base::Feature kCrostiniAnsibleSoftwareManagement{
     "CrostiniAnsibleSoftwareManagement", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables custom UI for forcibly closing unresponsive windows.
+const base::Feature kCrostiniForceClose{"CrostiniForceClose",
+                                        base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables the UI overhaul for Cups Printers in settings page.
 const base::Feature kCupsPrintersUiOverhaul{"CupsPrintersUiOverhaul",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
@@ -765,10 +769,6 @@
 const base::Feature kArcCupsApi{"ArcCupsApi",
                                 base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables or disables serving printing requests from VMs on ChromeOS.
-const base::Feature kCrosVmCupsProxy{"CrosVmCupsProxy",
-                                     base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enables or disables pin quick unlock.
 // TODO(https://crbug.com/935613): Remove this & the backing code.
 const base::Feature kQuickUnlockPin{"QuickUnlockPin",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 659e164..9ba711d 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -127,6 +127,8 @@
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kCrostiniAnsibleSoftwareManagement;
 COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kCrostiniForceClose;
+COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kCupsPrintersUiOverhaul;
 COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kPluginVm;
 COMPONENT_EXPORT(CHROME_FEATURES)
@@ -483,8 +485,6 @@
 #if defined(OS_CHROMEOS)
 COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kArcCupsApi;
 
-COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kCrosVmCupsProxy;
-
 COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kQuickUnlockPin;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/extensions/docs/templates/intros/webRequest.html b/chrome/common/extensions/docs/templates/intros/webRequest.html
index 9bc247a..8e8b339 100644
--- a/chrome/common/extensions/docs/templates/intros/webRequest.html
+++ b/chrome/common/extensions/docs/templates/intros/webRequest.html
@@ -119,16 +119,16 @@
 </p>
 
 <p>
-<span class="availability">Starting from Chrome 76</span>, header modifications
+<span class="availability">Starting from Chrome 79</span>, header modifications
 affect Cross-Origin Resource Sharing (CORS) checks. If modified headers for
 cross-origin requests do not meet the criteria, it will result in sending a CORS
-preflight to ask the server if such headers can be accepted.
-If you really need to modify headers in a way to violate the CORS protocol, you
-need to specify <code>'extraHeaders'</code> in <code>opt_extraInfoSpec</code>.
+preflight to ask the server if such headers can be accepted. If you really need
+to modify headers in a way to violate the CORS protocol, you need to specify
+<code>'extraHeaders'</code> in <code>opt_extraInfoSpec</code>.
 </p>
 
 <p>
-<span class="availability">Starting from Chrome 76</span>, the following request
+<span class="availability">Starting from Chrome 79</span>, the following request
 header is <strong>not provided</strong> and cannot be modified or removed
 without specifying <code>'extraHeaders'</code> in
 <code>opt_extraInfoSpec</code>:
diff --git a/chrome/common/instant_mojom_traits.h b/chrome/common/instant_mojom_traits.h
index ee31e8b..93ee65be 100644
--- a/chrome/common/instant_mojom_traits.h
+++ b/chrome/common/instant_mojom_traits.h
@@ -85,4 +85,6 @@
   IPC_STRUCT_TRAITS_MEMBER(color_dark)
   IPC_STRUCT_TRAITS_MEMBER(color_light)
   IPC_STRUCT_TRAITS_MEMBER(color_picked)
+  IPC_STRUCT_TRAITS_MEMBER(logo_color)
+  IPC_STRUCT_TRAITS_MEMBER(shortcut_color)
 IPC_STRUCT_TRAITS_END()
diff --git a/chrome/common/search.mojom b/chrome/common/search.mojom
index 40b57c4..6727ab0 100644
--- a/chrome/common/search.mojom
+++ b/chrome/common/search.mojom
@@ -165,6 +165,10 @@
 
   // Gets autocomplete matches from the browser.
   QueryAutocomplete(string input) => (array<AutocompleteMatch> matches);
+
+  // Cancels the current autocomplete query. Clears the result set if
+  // |clear_result| is true.
+  StopAutocomplete(bool clear_result);
 };
 
 [Native]
diff --git a/chrome/common/search/instant_types.cc b/chrome/common/search/instant_types.cc
index ee660c4..f94c1be9 100644
--- a/chrome/common/search/instant_types.cc
+++ b/chrome/common/search/instant_types.cc
@@ -33,7 +33,8 @@
          has_theme_image == rhs.has_theme_image &&
          theme_name == rhs.theme_name && color_id == rhs.color_id &&
          color_dark == rhs.color_dark && color_light == rhs.color_light &&
-         color_picked == rhs.color_picked;
+         color_picked == rhs.color_picked && logo_color == rhs.logo_color &&
+         shortcut_color == rhs.shortcut_color;
 }
 
 InstantMostVisitedItem::InstantMostVisitedItem()
diff --git a/chrome/common/search/instant_types.h b/chrome/common/search/instant_types.h
index 331ee75d..99916b21 100644
--- a/chrome/common/search/instant_types.h
+++ b/chrome/common/search/instant_types.h
@@ -127,6 +127,12 @@
   // The picked custom color for Chrome Colors. Valid only if Chrome Colors is
   // set.
   SkColor color_picked = gfx::kPlaceholderColor;
+
+  // Color used for alternative Google logo on NTP.
+  SkColor logo_color = gfx::kPlaceholderColor;
+
+  // Color for NTP shortcut backgrounds.
+  SkColor shortcut_color = gfx::kPlaceholderColor;
 };
 
 struct InstantMostVisitedItem {
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index fb7e6795..13c0a64 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -213,6 +213,7 @@
 const char kChromeUIConfirmPasswordChangeHost[] = "confirm-password-change";
 const char kChromeUIConfirmPasswordChangeUrl[] =
     "chrome://confirm-password-change";
+const char kChromeUICrostiniInstallerHost[] = "crostini-installer";
 const char kChromeUICryptohomeHost[] = "cryptohome";
 const char kChromeUIDeviceEmulatorHost[] = "device-emulator";
 const char kChromeUIDiscoverURL[] = "chrome://oobe/discover";
@@ -276,6 +277,7 @@
       kChromeUIBluetoothPairingHost,
       kChromeUICellularSetupHost,
       kChromeUICertificateManagerHost,
+      kChromeUICrostiniInstallerHost,
       kChromeUICryptohomeHost,
       kChromeUIDeviceEmulatorHost,
       kChromeUIFirstRunHost,
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 525a8b2..18ea78c 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -209,6 +209,7 @@
 extern const char kChromeUICertificateManagerHost[];
 extern const char kChromeUIConfirmPasswordChangeHost[];
 extern const char kChromeUIConfirmPasswordChangeUrl[];
+extern const char kChromeUICrostiniInstallerHost[];
 extern const char kChromeUICryptohomeHost[];
 extern const char kChromeUIDeviceEmulatorHost[];
 extern const char kChromeUIDiscoverURL[];
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index de28dbe..97d0fbd 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -211,7 +211,8 @@
 
 void NetErrorHelper::SendCommand(
     security_interstitials::SecurityInterstitialCommand command) {
-  security_interstitials::mojom::InterstitialCommandsAssociatedPtr interface;
+  mojo::AssociatedRemote<security_interstitials::mojom::InterstitialCommands>
+      interface;
   render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&interface);
   switch (command) {
     case security_interstitials::CMD_DONT_PROCEED: {
@@ -437,8 +438,10 @@
   NetErrorPageController::Install(
       render_frame(), weak_controller_delegate_factory_.GetWeakPtr());
 
-  render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(
-      &supervised_user_interface_);
+  if (!supervised_user_interface_) {
+    render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(
+        &supervised_user_interface_);
+  }
   SupervisedUserErrorPageController::Install(
       render_frame(),
       weak_supervised_user_error_controller_delegate_factory_.GetWeakPtr());
@@ -634,13 +637,15 @@
 }
 
 void NetErrorHelper::OnNetworkDiagnosticsClientRequest(
-    chrome::mojom::NetworkDiagnosticsClientAssociatedRequest request) {
-  network_diagnostics_client_bindings_.AddBinding(this, std::move(request));
+    mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnosticsClient>
+        receiver) {
+  network_diagnostics_client_receivers_.Add(this, std::move(receiver));
 }
 
 void NetErrorHelper::OnNavigationCorrectorRequest(
-    chrome::mojom::NavigationCorrectorAssociatedRequest request) {
-  navigation_corrector_bindings_.AddBinding(this, std::move(request));
+    mojo::PendingAssociatedReceiver<chrome::mojom::NavigationCorrector>
+        receiver) {
+  navigation_corrector_receivers_.Add(this, std::move(receiver));
 }
 
 void NetErrorHelper::SetCanShowNetworkDiagnosticsDialog(bool can_show) {
diff --git a/chrome/renderer/net/net_error_helper.h b/chrome/renderer/net/net_error_helper.h
index ca15e5e4..5606f38 100644
--- a/chrome/renderer/net/net_error_helper.h
+++ b/chrome/renderer/net/net_error_helper.h
@@ -27,7 +27,9 @@
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/public/renderer/render_frame_observer_tracker.h"
 #include "content/public/renderer/render_thread_observer.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "net/base/net_errors.h"
 
 class GURL;
@@ -165,9 +167,11 @@
   void OnTrackingRequestComplete(std::unique_ptr<std::string> response_body);
 
   void OnNetworkDiagnosticsClientRequest(
-      chrome::mojom::NetworkDiagnosticsClientAssociatedRequest request);
+      mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnosticsClient>
+          receiver);
   void OnNavigationCorrectorRequest(
-      chrome::mojom::NavigationCorrectorAssociatedRequest request);
+      mojo::PendingAssociatedReceiver<chrome::mojom::NavigationCorrector>
+          receiver);
 
   // chrome::mojom::NetworkDiagnosticsClient:
   void SetCanShowNetworkDiagnosticsDialog(bool can_show) override;
@@ -185,14 +189,16 @@
 
   std::unique_ptr<NetErrorHelperCore> core_;
 
-  mojo::AssociatedBindingSet<chrome::mojom::NetworkDiagnosticsClient>
-      network_diagnostics_client_bindings_;
-  chrome::mojom::NetworkDiagnosticsAssociatedPtr remote_network_diagnostics_;
-  mojo::AssociatedBindingSet<chrome::mojom::NavigationCorrector>
-      navigation_corrector_bindings_;
-  chrome::mojom::NetworkEasterEggAssociatedPtr remote_network_easter_egg_;
+  mojo::AssociatedReceiverSet<chrome::mojom::NetworkDiagnosticsClient>
+      network_diagnostics_client_receivers_;
+  mojo::AssociatedRemote<chrome::mojom::NetworkDiagnostics>
+      remote_network_diagnostics_;
+  mojo::AssociatedReceiverSet<chrome::mojom::NavigationCorrector>
+      navigation_corrector_receivers_;
+  mojo::AssociatedRemote<chrome::mojom::NetworkEasterEgg>
+      remote_network_easter_egg_;
 
-  supervised_user::mojom::SupervisedUserCommandsAssociatedPtr
+  mojo::AssociatedRemote<supervised_user::mojom::SupervisedUserCommands>
       supervised_user_interface_;
 
   // Weak factories for vending weak pointers to PageControllers. Weak
diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc
index e2ed2098..4cc0a95 100644
--- a/chrome/renderer/searchbox/searchbox.cc
+++ b/chrome/renderer/searchbox/searchbox.cc
@@ -438,6 +438,10 @@
                             weak_ptr_factory_.GetWeakPtr()));
 }
 
+void SearchBox::StopAutocomplete(bool clear_result) {
+  embedded_search_service_->StopAutocomplete(clear_result);
+}
+
 void SearchBox::QueryAutocompleteResult(
     std::vector<chrome::mojom::AutocompleteMatchPtr> results) {
   if (can_run_js_in_renderframe_) {
diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h
index e2b4b0af..3c06cdb 100644
--- a/chrome/renderer/searchbox/searchbox.h
+++ b/chrome/renderer/searchbox/searchbox.h
@@ -193,6 +193,10 @@
   // search term. Handled by |QueryAutocompleteResult|.
   void QueryAutocomplete(const std::string& input);
 
+  // Cancels the current autocomplete query. Clears the result set if
+  // |clear_result| is true.
+  void StopAutocomplete(bool clear_result);
+
   bool is_focused() const { return is_focused_; }
   bool is_input_in_progress() const { return is_input_in_progress_; }
   bool is_key_capture_enabled() const { return is_key_capture_enabled_; }
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc
index bcfc7f4..3147d97 100644
--- a/chrome/renderer/searchbox/searchbox_extension.cc
+++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -59,75 +59,6 @@
 #include "url/url_constants.h"
 #include "v8/include/v8.h"
 
-namespace internal {  // for testing.
-
-// Whether NTP background should be considered dark, so the colors of various
-// UI elements can be adjusted. Light text implies dark theme.
-bool IsNtpBackgroundDark(SkColor ntp_text) {
-  return !color_utils::IsDark(ntp_text);
-}
-
-// Calculate contrasting color for given |bg_color|. Returns lighter color if
-// the color is very dark and returns darker color otherwise.
-SkColor GetContrastingColorForBackground(SkColor bg_color,
-                                         float luminosity_change) {
-  color_utils::HSL hsl;
-  SkColorToHSL(bg_color, &hsl);
-
-  // If luminosity is 0, it means |bg_color| is black. Use white for black
-  // backgrounds.
-  if (hsl.l == 0)
-    return SK_ColorWHITE;
-
-  // Decrease luminosity, unless color is already dark.
-  if (hsl.l > 0.15)
-    luminosity_change *= -1;
-
-  hsl.l *= 1 + luminosity_change;
-  if (hsl.l >= 0.0f && hsl.l <= 1.0f)
-    return HSLToSkColor(hsl, 255);
-  return bg_color;
-}
-
-// Use dark icon when in dark mode and no background. Otherwise, use
-// light icon for NTPs with images, and themed icon for NTPs with solid color.
-SkColor GetIconColor(const ThemeBackgroundInfo& theme_info) {
-  bool has_background_image = theme_info.has_theme_image ||
-                              !theme_info.custom_background_url.is_empty();
-  if (has_background_image)
-    return kNTPLightIconColor;
-
-  if (theme_info.using_dark_colors && theme_info.using_default_theme)
-    return kNTPDarkIconColor;
-
-  SkColor bg_color = theme_info.background_color;
-  SkColor icon_color = kNTPLightIconColor;
-  if (!theme_info.using_default_theme && bg_color != SK_ColorWHITE) {
-    icon_color =
-        GetContrastingColorForBackground(bg_color, /*luminosity_change=*/0.2f);
-  }
-
-  return icon_color;
-}
-
-// For themes that use alternate logo and no NTP background image is present,
-// set logo color in the same hue as NTP background.
-SkColor GetLogoColor(const ThemeBackgroundInfo& theme_info) {
-  SkColor logo_color = kNTPLightLogoColor;
-  bool has_background_image = theme_info.has_theme_image ||
-                              !theme_info.custom_background_url.is_empty();
-  if (theme_info.logo_alternate && !has_background_image) {
-    if (color_utils::IsDark(theme_info.background_color))
-      logo_color = SK_ColorWHITE;
-    else
-      logo_color = GetContrastingColorForBackground(theme_info.background_color,
-                                                    /*luminosity_change=*/0.3f);
-  }
-
-  return logo_color;
-}
-}  // namespace internal
-
 namespace {
 
 const char kCSSBackgroundImageFormat[] = "-webkit-image-set("
@@ -309,8 +240,6 @@
   return true;
 }
 
-// TODO(gayane): Move all non-trival logic to |instant_service| and do only
-// mapping here. crbug.com/983717.
 v8::Local<v8::Object> GenerateThemeBackgroundInfo(
     v8::Isolate* isolate,
     const ThemeBackgroundInfo& theme_info) {
@@ -326,12 +255,16 @@
   builder.Set("backgroundColorRgba",
               SkColorToArray(isolate, theme_info.background_color));
 
+  // Theme color for text as an array with the RGBA components in order.
+  // Value is always valid.
+  builder.Set("textColorRgba", SkColorToArray(isolate, theme_info.text_color));
+
   // Theme color for light text as an array with the RGBA components in order.
   // Value is always valid.
   builder.Set("textColorLightRgba",
               SkColorToArray(isolate, theme_info.text_color_light));
 
-  // The theme alternate logo value indicates a white logo when TRUE and a
+  // The theme alternate logo value indicates same color when TRUE and a
   // colorful one when FALSE.
   builder.Set("alternateLogo", theme_info.logo_alternate);
 
@@ -406,17 +339,12 @@
   builder.Set("themeId", theme_info.theme_id);
   builder.Set("themeName", theme_info.theme_name);
 
-  // Assume that a custom background has not been configured and then
-  // override based on the condition below.
-  builder.Set("customBackgroundConfigured", false);
-  SkColor ntp_text = theme_info.text_color;
+  builder.Set("customBackgroundConfigured",
+              !theme_info.custom_background_url.is_empty());
 
   // If a custom background has been set provide the relevant information to the
   // page.
   if (!theme_info.custom_background_url.is_empty()) {
-    ntp_text = SkColorSetARGB(255, 248, 249, 250);  // GG050
-    builder.Set("alternateLogo", true);
-    builder.Set("customBackgroundConfigured", true);
     builder.Set("imageUrl", theme_info.custom_background_url.spec());
     builder.Set("attributionActionUrl",
                 theme_info.custom_background_attribution_action_url.spec());
@@ -430,20 +358,18 @@
     builder.Set("attributionUrl", std::string());
   }
 
-  // Theme color for text as an array with the RGBA components in order.
-  // Value is always valid.
-  builder.Set("textColorRgba", SkColorToArray(isolate, ntp_text));
-
-  // Generate fields for themeing NTP elements.
-  builder.Set("isNtpBackgroundDark", internal::IsNtpBackgroundDark(ntp_text));
+  // Set fields for themeing NTP elements.
+  builder.Set("isNtpBackgroundDark",
+              !color_utils::IsDark(theme_info.text_color));
   builder.Set("useTitleContainer", theme_info.has_theme_image);
 
-  SkColor icon_color = internal::GetIconColor(theme_info);
-  builder.Set("iconBackgroundColor", SkColorToArray(isolate, icon_color));
-  builder.Set("useWhiteAddIcon", color_utils::IsDark(icon_color));
+  // TODO(gayane): Rename icon color to shortcut color in JS for consitancy.
+  builder.Set("iconBackgroundColor",
+              SkColorToArray(isolate, theme_info.shortcut_color));
+  builder.Set("useWhiteAddIcon",
+              color_utils::IsDark(theme_info.shortcut_color));
 
-  builder.Set("logoColor",
-              SkColorToArray(isolate, internal::GetLogoColor(theme_info)));
+  builder.Set("logoColor", SkColorToArray(isolate, theme_info.logo_color));
 
   builder.Set("colorId", theme_info.color_id);
   if (theme_info.color_id != -1) {
@@ -620,6 +546,7 @@
   // Handlers for JS functions.
   static void Paste(const std::string& text);
   static void QueryAutocomplete(const std::string& input);
+  static void StopAutocomplete(bool clear_result);
   static void StartCapturingKeyStrokes();
   static void StopCapturingKeyStrokes();
 
@@ -641,6 +568,7 @@
                    &SearchBoxBindings::IsKeyCaptureEnabled)
       .SetMethod("paste", &SearchBoxBindings::Paste)
       .SetMethod("queryAutocomplete", &SearchBoxBindings::QueryAutocomplete)
+      .SetMethod("stopAutocomplete", &SearchBoxBindings::StopAutocomplete)
       .SetMethod("startCapturingKeyStrokes",
                  &SearchBoxBindings::StartCapturingKeyStrokes)
       .SetMethod("stopCapturingKeyStrokes",
@@ -684,6 +612,14 @@
 }
 
 // static
+void SearchBoxBindings::StopAutocomplete(bool clear_result) {
+  SearchBox* search_box = GetSearchBoxForCurrentContext();
+  if (!search_box)
+    return;
+  search_box->StopAutocomplete(clear_result);
+}
+
+// static
 void SearchBoxBindings::StartCapturingKeyStrokes() {
   SearchBox* search_box = GetSearchBoxForCurrentContext();
   if (!search_box)
diff --git a/chrome/renderer/searchbox/searchbox_extension_unittest.cc b/chrome/renderer/searchbox/searchbox_extension_unittest.cc
deleted file mode 100644
index 0f2d43c..0000000
--- a/chrome/renderer/searchbox/searchbox_extension_unittest.cc
+++ /dev/null
@@ -1,140 +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/renderer/searchbox/searchbox_extension.h"
-
-#include "chrome/common/search/instant_types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/color_palette.h"
-#include "ui/gfx/color_utils.h"
-
-namespace internal {
-
-// Defined in searchbox_extension.cc
-bool IsNtpBackgroundDark(SkColor ntp_text);
-SkColor GetContrastingColorForBackground(SkColor bg_color, float change);
-SkColor GetIconColor(const ThemeBackgroundInfo& theme_info);
-SkColor GetLogoColor(const ThemeBackgroundInfo& theme_info);
-
-TEST(SearchboxExtensionTest, TestIsNtpBackgroundDark) {
-  // Dark font means light background.
-  EXPECT_FALSE(IsNtpBackgroundDark(SK_ColorBLACK));
-
-  // Light font means dark background.
-  EXPECT_TRUE(IsNtpBackgroundDark(SK_ColorWHITE));
-
-  // Light but close to mid point color text implies dark background.
-  EXPECT_TRUE(IsNtpBackgroundDark(SkColorSetARGB(255, 30, 144, 255)));
-}
-
-TEST(SearchboxExtensionTest, TestGetContrastingColor) {
-  const float change = 0.2f;
-
-  // White icon for black background.
-  EXPECT_EQ(SK_ColorWHITE,
-            GetContrastingColorForBackground(SK_ColorBLACK, change));
-
-  // Lighter icon for too dark colors.
-  SkColor dark_background = SkColorSetARGB(255, 50, 0, 50);
-  EXPECT_LT(color_utils::GetRelativeLuminance(dark_background),
-            color_utils::GetRelativeLuminance(
-                GetContrastingColorForBackground(dark_background, change)));
-
-  // Darker icon for light backgrounds.
-  EXPECT_GT(color_utils::GetRelativeLuminance(SK_ColorWHITE),
-            color_utils::GetRelativeLuminance(
-                GetContrastingColorForBackground(SK_ColorWHITE, change)));
-
-  SkColor light_background = SkColorSetARGB(255, 100, 0, 100);
-  EXPECT_GT(color_utils::GetRelativeLuminance(light_background),
-            color_utils::GetRelativeLuminance(
-                GetContrastingColorForBackground(light_background, change)));
-}
-
-TEST(SearchboxExtensionTest, TestGetIconColor) {
-  ThemeBackgroundInfo theme_info;
-  theme_info.using_default_theme = true;
-  theme_info.using_dark_colors = false;
-  theme_info.background_color = SK_ColorRED;
-
-  // Default theme in light mode.
-  EXPECT_EQ(kNTPLightIconColor, GetIconColor(theme_info));
-
-  // Default theme in dark mode.
-  theme_info.using_dark_colors = true;
-  EXPECT_EQ(kNTPDarkIconColor, GetIconColor(theme_info));
-
-  // Default theme with custom background, in dark mode.
-  theme_info.custom_background_url = GURL("https://www.foo.com");
-  EXPECT_EQ(kNTPLightIconColor, GetIconColor(theme_info));
-
-  // Default theme with custom background.
-  theme_info.using_dark_colors = false;
-  EXPECT_EQ(kNTPLightIconColor, GetIconColor(theme_info));
-
-  // Theme with image.
-  theme_info.using_default_theme = false;
-  theme_info.custom_background_url = GURL();
-  theme_info.has_theme_image = true;
-  EXPECT_EQ(kNTPLightIconColor, GetIconColor(theme_info));
-
-  // Theme with image in dark mode.
-  theme_info.using_dark_colors = true;
-  EXPECT_EQ(kNTPLightIconColor, GetIconColor(theme_info));
-
-  SkColor red_icon_color = GetContrastingColorForBackground(SK_ColorRED, 0.2f);
-
-  // Theme with no image, in dark mode.
-  theme_info.has_theme_image = false;
-  EXPECT_EQ(red_icon_color, GetIconColor(theme_info));
-
-  // Theme with no image.
-  theme_info.using_dark_colors = false;
-  EXPECT_EQ(red_icon_color, GetIconColor(theme_info));
-}
-
-TEST(SearchboxExtensionTest, TestGetLogoColor) {
-  ThemeBackgroundInfo theme_info;
-  theme_info.using_default_theme = true;
-  theme_info.logo_alternate = false;
-  theme_info.background_color = SK_ColorWHITE;
-
-  // Default theme.
-  EXPECT_EQ(kNTPLightLogoColor, GetLogoColor(theme_info));
-
-  // Default theme in dark mode.
-  theme_info.using_dark_colors = true;
-  theme_info.background_color = SK_ColorBLACK;
-  EXPECT_EQ(kNTPLightLogoColor, GetLogoColor(theme_info));
-
-  // Default theme with custom background.
-  theme_info.using_dark_colors = false;
-  theme_info.background_color = SK_ColorWHITE;
-  theme_info.custom_background_url = GURL("https://www.foo.com");
-  EXPECT_EQ(kNTPLightLogoColor, GetLogoColor(theme_info));
-
-  // Theme with image.
-  theme_info.using_default_theme = false;
-  theme_info.logo_alternate = true;
-  theme_info.custom_background_url = GURL();
-  theme_info.has_theme_image = true;
-  theme_info.background_color = SK_ColorRED;
-  EXPECT_EQ(kNTPLightLogoColor, GetLogoColor(theme_info));
-
-  // Theme with no image.
-  theme_info.has_theme_image = false;
-  theme_info.background_color = SK_ColorBLACK;
-  EXPECT_EQ(SK_ColorWHITE, GetLogoColor(theme_info));
-
-  // Close to midpoint but still dark color should have white logo.
-  theme_info.background_color = SkColorSetRGB(120, 120, 120);
-  EXPECT_EQ(SK_ColorWHITE, GetLogoColor(theme_info));
-
-  // Light color should have themed logo.
-  theme_info.background_color = SkColorSetRGB(130, 130, 130);
-  EXPECT_NE(kNTPLightLogoColor, GetLogoColor(theme_info));
-  EXPECT_NE(SK_ColorWHITE, GetLogoColor(theme_info));
-  EXPECT_NE(theme_info.background_color, GetLogoColor(theme_info));
-}
-}  // namespace internal
diff --git a/chrome/services/cups_proxy/BUILD.gn b/chrome/services/cups_proxy/BUILD.gn
index 869f668..170ac17a 100644
--- a/chrome/services/cups_proxy/BUILD.gn
+++ b/chrome/services/cups_proxy/BUILD.gn
@@ -30,6 +30,7 @@
     "//base",
     "//chrome/services/cups_proxy/public/cpp",
     "//chrome/services/cups_proxy/public/mojom",
+    "//chrome/services/ipp_parser",
     "//chromeos/dbus",
     "//net",
   ]
diff --git a/chrome/services/cups_proxy/ipp_validator_unittest.cc b/chrome/services/cups_proxy/ipp_validator_unittest.cc
index 311f475..f954d9953 100644
--- a/chrome/services/cups_proxy/ipp_validator_unittest.cc
+++ b/chrome/services/cups_proxy/ipp_validator_unittest.cc
@@ -56,7 +56,7 @@
  public:
   IppValidatorTest() {
     delegate_ = std::make_unique<FakeServiceDelegate>();
-    ipp_validator_ = std::make_unique<IppValidator>(delegate_->GetWeakPtr());
+    ipp_validator_ = std::make_unique<IppValidator>(delegate_.get());
   }
 
   ~IppValidatorTest() override = default;
diff --git a/chrome/services/cups_proxy/printer_installer_unittest.cc b/chrome/services/cups_proxy/printer_installer_unittest.cc
index 72e41797..fd9ce12 100644
--- a/chrome/services/cups_proxy/printer_installer_unittest.cc
+++ b/chrome/services/cups_proxy/printer_installer_unittest.cc
@@ -83,8 +83,7 @@
  public:
   PrinterInstallerTest() : weak_factory_(this) {
     delegate_ = std::make_unique<FakeServiceDelegate>();
-    printer_installer_ =
-        std::make_unique<PrinterInstaller>(delegate_->GetWeakPtr());
+    printer_installer_ = std::make_unique<PrinterInstaller>(delegate_.get());
   }
 
   ~PrinterInstallerTest() override = default;
diff --git a/chrome/services/cups_proxy/socket_manager_unittest.cc b/chrome/services/cups_proxy/socket_manager_unittest.cc
index 79a4c67f..6194d5bd 100644
--- a/chrome/services/cups_proxy/socket_manager_unittest.cc
+++ b/chrome/services/cups_proxy/socket_manager_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <algorithm>
+#include <memory>
 #include <string>
 #include <utility>
 
@@ -178,14 +179,14 @@
     std::unique_ptr<FakeSocket> socket = std::make_unique<FakeSocket>();
     socket_ = socket.get();
 
-    manager_ = SocketManager::CreateForTesting(std::move(socket),
-                                               delegate_->GetWeakPtr());
+    manager_ =
+        SocketManager::CreateForTesting(std::move(socket), delegate_.get());
   }
 
-  base::Optional<std::vector<uint8_t>> ProxyToCups(std::string request) {
+  std::unique_ptr<std::vector<uint8_t>> ProxyToCups(std::string request) {
     std::vector<uint8_t> request_as_bytes =
         ipp_converter::ConvertToByteBuffer(request);
-    base::Optional<std::vector<uint8_t>> response;
+    std::unique_ptr<std::vector<uint8_t>> response;
 
     base::RunLoop run_loop;
     manager_->ProxyToCups(std::move(request_as_bytes),
@@ -201,8 +202,8 @@
   base::test::TaskEnvironment task_environment_;
 
   void OnProxyToCups(base::OnceClosure finish_cb,
-                     base::Optional<std::vector<uint8_t>>* ret,
-                     base::Optional<std::vector<uint8_t>> result) {
+                     std::unique_ptr<std::vector<uint8_t>>* ret,
+                     std::unique_ptr<std::vector<uint8_t>> result) {
     *ret = std::move(result);
     std::move(finish_cb).Run();
   }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index fc6cbca6f..d4869c1 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -983,6 +983,7 @@
       "../browser/net/websocket_browsertest.cc",
       "../browser/no_best_effort_tasks_browsertest.cc",
       "../browser/no_best_effort_tasks_during_startup_browsertest.cc",
+      "../browser/notifications/scheduler/notification_schedule_service_browsertest.cc",
       "../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc",
       "../browser/ntp_tiles/ntp_tiles_browsertest.cc",
       "../browser/optimization_guide/optimization_guide_keyed_service_browsertest.cc",
@@ -3884,7 +3885,6 @@
       "../common/importer/mock_importer_bridge.h",
       "../common/multi_process_lock_unittest.cc",
       "../renderer/searchbox/search_bouncer_unittest.cc",
-      "../renderer/searchbox/searchbox_extension_unittest.cc",
       "../renderer/searchbox/searchbox_unittest.cc",
       "../test/base/browser_with_test_window_test.cc",
       "../test/base/browser_with_test_window_test.h",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
index 3eff9bd..cb6b049 100644
--- a/chrome/test/android/BUILD.gn
+++ b/chrome/test/android/BUILD.gn
@@ -151,6 +151,7 @@
     "javatests/src/org/chromium/chrome/test/util/SadTabRule.java",
     "javatests/src/org/chromium/chrome/test/util/TabStripUtils.java",
     "javatests/src/org/chromium/chrome/test/util/TranslateUtil.java",
+    "javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java",
   ]
   deps = [
     "$google_play_services_package:google_play_services_base_java",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
index 6aaa94a1..c718d72 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
@@ -55,6 +55,7 @@
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.MenuUtils;
 import org.chromium.chrome.test.util.NewTabPageTestUtils;
+import org.chromium.chrome.test.util.WaitForFocusHelper;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
@@ -567,11 +568,12 @@
      * TODO(yolandyan): split this into the seperate test rule, this only applies to tabbed mode
      */
     public void typeInOmnibox(String text, boolean oneCharAtATime) throws InterruptedException {
-        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar);
+        final UrlBar urlBar = getActivity().findViewById(R.id.url_bar);
         Assert.assertNotNull(urlBar);
 
+        WaitForFocusHelper.acquireFocusForView(urlBar);
+
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            urlBar.requestFocus();
             if (!oneCharAtATime) {
                 urlBar.setText(text);
             }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java
new file mode 100644
index 0000000..6cf41fc
--- /dev/null
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java
@@ -0,0 +1,63 @@
+// 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.test.util;
+
+import android.view.View;
+
+import org.junit.Assert;
+
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+
+import java.text.MessageFormat;
+
+/**
+ * An implementation of View.OnFocusChangeListener which composites an existing listener (if any)
+ * and allows tests to wait for focus to occur. To use this, call #acquireFocusForView with the
+ * view you want to have focus.
+ */
+public class WaitForFocusHelper implements View.OnFocusChangeListener {
+    private static final String WAITING_FOR_FOCUS_TEMPLATE =
+            "Failed waiting for url focus for view [{0}]";
+
+    /**
+     * Acquires focus for the given view. Will crash and burn if focus isn't acquired successfully.
+     * @param view The view which will be focused.
+     */
+    public static void acquireFocusForView(View view) {
+        try {
+            WaitForFocusHelper listener = new WaitForFocusHelper(view.getOnFocusChangeListener());
+            view.setOnFocusChangeListener(listener);
+            int callCount = listener.getOnFocusCallbackHelper().getCallCount();
+            TestThreadUtils.runOnUiThreadBlocking(() -> view.requestFocus());
+            if (!view.hasFocus()) {
+                listener.getOnFocusCallbackHelper().waitForCallback(
+                        MessageFormat.format(WAITING_FOR_FOCUS_TEMPLATE, view), callCount);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            assert false : MessageFormat.format(WAITING_FOR_FOCUS_TEMPLATE, view);
+        }
+        Assert.assertTrue(view.hasFocus());
+    }
+
+    private CallbackHelper mOnFocusCallbackHelper;
+    private View.OnFocusChangeListener mExistingListener;
+
+    WaitForFocusHelper(View.OnFocusChangeListener existingListener) {
+        mOnFocusCallbackHelper = new CallbackHelper();
+        mExistingListener = existingListener;
+    }
+
+    CallbackHelper getOnFocusCallbackHelper() {
+        return mOnFocusCallbackHelper;
+    }
+
+    @Override
+    public void onFocusChange(View v, boolean hasFocus) {
+        if (mExistingListener != null) mExistingListener.onFocusChange(v, hasFocus);
+        mOnFocusCallbackHelper.notifyCalled();
+    }
+}
\ No newline at end of file
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc
index bac49d5f..6434dbe 100644
--- a/chrome/test/chromedriver/chrome_launcher.cc
+++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -88,10 +88,6 @@
     "password-store=basic",
     "use-mock-keychain",
     "test-type=webdriver",
-    // In theory the following switch should have no effects, but its absence
-    // would cause VizHitTestSurfaceLayer feature to be enabled on Chromium
-    // builds, causing a test failure due to https://crbug.com/996865.
-    "force-fieldtrials",
     // TODO(yoichio): This is temporary switch to support chrome internal
     // components migration from the old web APIs.
     // After completion of the migration, we should remove this.
diff --git a/chrome/test/chromedriver/net/websocket.cc b/chrome/test/chromedriver/net/websocket.cc
index c705781..fb8cc3f 100644
--- a/chrome/test/chromedriver/net/websocket.cc
+++ b/chrome/test/chromedriver/net/websocket.cc
@@ -286,7 +286,7 @@
       current_masking_key_ = header->masking_key;
     }
 
-    auto& buffer = frame_chunks[i]->data;
+    auto& buffer = frame_chunks[i]->payload;
     std::vector<char> payload(buffer.begin(), buffer.end());
     if (is_current_frame_masked_) {
       MaskWebSocketFramePayload(current_masking_key_, current_frame_offset_,
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index ef32ec0..608ab3d 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -314,24 +314,9 @@
   session->capabilities =
       CreateCapabilities(session, capabilities, *desired_caps);
 
-  if (session->chrome->GetBrowserInfo()->is_headless) {
-    std::string download_directory;
-    if (capabilities.prefs &&
-        (capabilities.prefs->GetString("download.default_directory",
-                                       &download_directory) ||
-         capabilities.prefs->GetStringWithoutPathExpansion(
-             "download.default_directory", &download_directory)))
-      session->headless_download_directory =
-          std::make_unique<std::string>(download_directory);
-    else
-      session->headless_download_directory = std::make_unique<std::string>(".");
-    WebView* first_view;
-    session->chrome->GetWebViewById(session->window, &first_view);
-    status = first_view->OverrideDownloadDirectoryIfNeeded(
-        *session->headless_download_directory);
-    if (status.IsError())
-      return status;
-  }
+  status = internal::ConfigureHeadlessSession(session, capabilities);
+  if (status.IsError())
+    return status;
 
   if (session->w3c_compliant) {
     std::unique_ptr<base::DictionaryValue> capabilities =
@@ -349,6 +334,33 @@
 
 }  // namespace
 
+namespace internal {
+
+Status ConfigureHeadlessSession(Session* session,
+                                const Capabilities& capabilities) {
+  if (session->chrome->GetBrowserInfo()->is_headless) {
+    std::string download_directory;
+    if (capabilities.prefs &&
+        (capabilities.prefs->GetString("download.default_directory",
+                                       &download_directory) ||
+         capabilities.prefs->GetStringWithoutPathExpansion(
+             "download.default_directory", &download_directory)))
+      session->headless_download_directory =
+          std::make_unique<std::string>(download_directory);
+    else
+      session->headless_download_directory = std::make_unique<std::string>(".");
+    WebView* first_view;
+    session->chrome->GetWebViewById(session->window, &first_view);
+    Status status = first_view->OverrideDownloadDirectoryIfNeeded(
+        *session->headless_download_directory);
+    return status;
+  }
+  // session is not headless
+  return Status(kOk);
+}
+
+}  // namespace internal
+
 bool MergeCapabilities(const base::DictionaryValue* always_match,
                        const base::DictionaryValue* first_match,
                        base::DictionaryValue* merged) {
diff --git a/chrome/test/chromedriver/session_commands.h b/chrome/test/chromedriver/session_commands.h
index f0bfc08..befaf387a 100644
--- a/chrome/test/chromedriver/session_commands.h
+++ b/chrome/test/chromedriver/session_commands.h
@@ -18,6 +18,7 @@
 class Value;
 }
 
+struct Capabilities;
 class DeviceManager;
 struct Session;
 class Status;
@@ -164,4 +165,9 @@
                                  const base::DictionaryValue& params,
                                  std::unique_ptr<base::Value>* value);
 
+namespace internal {
+Status ConfigureHeadlessSession(Session* session,
+                                const Capabilities& capabilities);
+}  // namespace internal
+
 #endif  // CHROME_TEST_CHROMEDRIVER_SESSION_COMMANDS_H_
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc
index ce189ca..8d4ac01b1 100644
--- a/chrome/test/chromedriver/session_commands_unittest.cc
+++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -16,8 +16,10 @@
 #include "base/system/sys_info.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
+#include "chrome/test/chromedriver/capabilities.h"
 #include "chrome/test/chromedriver/chrome/status.h"
 #include "chrome/test/chromedriver/chrome/stub_chrome.h"
+#include "chrome/test/chromedriver/chrome/stub_web_view.h"
 #include "chrome/test/chromedriver/commands.h"
 #include "chrome/test/chromedriver/session.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -422,3 +424,116 @@
   std::unique_ptr<base::Value> value;
   ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code());
 }
+
+namespace {
+
+class MockChrome : public StubChrome {
+ public:
+  explicit MockChrome(BrowserInfo& binfo) : web_view_("1") {
+    browser_info_ = binfo;
+  }
+  ~MockChrome() override {}
+
+  const BrowserInfo* GetBrowserInfo() const override { return &browser_info_; }
+
+  Status GetWebViewById(const std::string& id, WebView** web_view) override {
+    *web_view = &web_view_;
+    return Status(kOk);
+  }
+
+ private:
+  BrowserInfo browser_info_;
+  StubWebView web_view_;
+};
+
+}  // namespace
+
+TEST(SessionCommandsTest, ConfigureHeadlessSession_dotNotation) {
+  Capabilities capabilities;
+  base::DictionaryValue caps;
+  base::Value::ListStorage args;
+  args.emplace_back("headless");
+  caps.SetPath({"goog:chromeOptions", "args"}, base::Value(args));
+
+  base::DictionaryValue prefs;
+  prefs.SetKey("download.default_directory",
+               base::Value("/examples/python/downloads"));
+  caps.SetPath({"goog:chromeOptions", "prefs"}, prefs.Clone());
+
+  Status status = capabilities.Parse(caps);
+  BrowserInfo binfo;
+  binfo.is_headless = true;
+  MockChrome* chrome = new MockChrome(binfo);
+  Session session("id", std::unique_ptr<Chrome>(chrome));
+
+  status = internal::ConfigureHeadlessSession(&session, capabilities);
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  ASSERT_TRUE(session.chrome->GetBrowserInfo()->is_headless);
+  ASSERT_STREQ("/examples/python/downloads",
+               session.headless_download_directory->c_str());
+}
+
+TEST(SessionCommandsTest, ConfigureHeadlessSession_nestedMap) {
+  Capabilities capabilities;
+  base::DictionaryValue caps;
+  base::Value::ListStorage args;
+  args.emplace_back("headless");
+  caps.SetPath({"goog:chromeOptions", "args"}, base::Value(args));
+
+  base::DictionaryValue prefs;
+  std::unique_ptr<base::DictionaryValue> download(new base::DictionaryValue());
+  download->SetStringPath("default_directory", "/examples/python/downloads");
+  prefs.SetDictionary("download", std::move(download));
+  caps.SetPath({"goog:chromeOptions", "prefs"}, prefs.Clone());
+
+  Status status = capabilities.Parse(caps);
+  BrowserInfo binfo;
+  binfo.is_headless = true;
+  MockChrome* chrome = new MockChrome(binfo);
+  Session session("id", std::unique_ptr<Chrome>(chrome));
+
+  status = internal::ConfigureHeadlessSession(&session, capabilities);
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  ASSERT_TRUE(session.chrome->GetBrowserInfo()->is_headless);
+  ASSERT_STREQ("/examples/python/downloads",
+               session.headless_download_directory->c_str());
+}
+
+TEST(SessionCommandsTest, ConfigureHeadlessSession_noDownloadDir) {
+  Capabilities capabilities;
+  base::DictionaryValue caps;
+  base::Value::ListStorage args;
+  args.emplace_back("headless");
+  caps.SetPath({"goog:chromeOptions", "args"}, base::Value(args));
+
+  Status status = capabilities.Parse(caps);
+  BrowserInfo binfo;
+  binfo.is_headless = true;
+  MockChrome* chrome = new MockChrome(binfo);
+  Session session("id", std::unique_ptr<Chrome>(chrome));
+
+  status = internal::ConfigureHeadlessSession(&session, capabilities);
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  ASSERT_TRUE(session.chrome->GetBrowserInfo()->is_headless);
+  ASSERT_STREQ(".", session.headless_download_directory->c_str());
+}
+
+TEST(SessionCommandsTest, ConfigureHeadlessSession_notHeadless) {
+  Capabilities capabilities;
+  base::DictionaryValue caps;
+  base::DictionaryValue prefs;
+  std::unique_ptr<base::DictionaryValue> download(new base::DictionaryValue());
+  download->SetStringPath("default_directory", "/examples/python/downloads");
+  prefs.SetDictionary("download", std::move(download));
+  caps.SetPath({"goog:chromeOptions", "prefs"}, prefs.Clone());
+
+  Status status = capabilities.Parse(caps);
+  BrowserInfo binfo;
+  MockChrome* chrome = new MockChrome(binfo);
+  Session session("id", std::unique_ptr<Chrome>(chrome));
+
+  status = internal::ConfigureHeadlessSession(&session, capabilities);
+  ASSERT_EQ(kOk, status.code()) << status.message();
+  ASSERT_FALSE(session.chrome->GetBrowserInfo()->is_headless);
+  ASSERT_FALSE(session.headless_download_directory);
+}
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc
index 9a6cf84f..62ef052 100644
--- a/chrome/test/chromedriver/window_commands.cc
+++ b/chrome/test/chromedriver/window_commands.cc
@@ -1286,6 +1286,22 @@
   }
 
   for (size_t i = 0; i < longest_action_list_size; i++) {
+    // Find the last pointer action, and it has to be sent synchronously by
+    // default.
+    size_t last_action = 0;
+    for (size_t j = 0; j < actions_list.size(); j++) {
+      if (actions_list[j].size() > i) {
+        const base::DictionaryValue* action = actions_list[j][i].get();
+        std::string type;
+        std::string action_type;
+        action->GetString("type", &type);
+        action->GetString("subtype", &action_type);
+        if (type != "none" && action_type != "pause") {
+          last_action = j;
+        }
+      }
+    }
+
     // Implements "compute the tick duration" algorithm from W3C spec
     // (https://w3c.github.io/webdriver/#dfn-computing-the-tick-duration).
     // This is the duration for actions in one tick.
@@ -1334,8 +1350,11 @@
           GetOptionalInt(action, "duration", &duration);
           tick_duration = std::max(tick_duration, duration);
         } else {
-          bool async_dispatch_event = false;
-          GetOptionalBool(action, "asyncDispatch", &async_dispatch_event);
+          bool async_dispatch_event = true;
+          if (j == last_action) {
+            async_dispatch_event = false;
+            GetOptionalBool(action, "asyncDispatch", &async_dispatch_event);
+          }
 
           if (type == "key") {
             std::list<KeyEvent> dispatch_key_events;
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 5e34b4f6..e7aca6a7 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -33,6 +33,7 @@
   ]
   data = [
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_checkbox_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_icon_button_focus_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_input_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_tabs_test.m.js",
@@ -162,8 +163,10 @@
   ]
   data = [
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_button_tests.m.js",
+    "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_dialog_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_drawer_tests.m.js",
+    "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_expand_button_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_icon_button_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_button_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_radio_group_test.m.js",
@@ -200,6 +203,7 @@
 
   if (is_chromeos) {
     sources += [
+      "chromeos/crostini_installer_browsertest.js",
       "chromeos/machine_learning_internals_browsertest.js",
       "multidevice_setup/multidevice_setup_browsertest.js",
     ]
diff --git a/chrome/test/data/webui/chromeos/crostini_installer_browsertest.js b/chrome/test/data/webui/chromeos/crostini_installer_browsertest.js
new file mode 100644
index 0000000..5b60be8
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/crostini_installer_browsertest.js
@@ -0,0 +1,31 @@
+// 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.
+
+
+/**
+ * @fileoverview Test suite for the Crostini Installer page.
+ */
+GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);
+GEN('#include "chromeos/constants/chromeos_features.h"');
+
+function CrostiniInstallerBrowserTest() {}
+
+CrostiniInstallerBrowserTest.prototype = {
+  __proto__: PolymerTest.prototype,
+
+  browsePreload: 'chrome://crostini-installer',
+
+  featureList: {enabled: ['chromeos::features::kCrostiniWebUIInstaller']},
+};
+
+TEST_F('CrostiniInstallerBrowserTest', 'All', function() {
+  suite('<crostini-installer-app>', () => {
+    test('install', done => {
+      // TODO(lxj)
+      done();
+    });
+  });
+
+  mocha.run();
+});
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn
index 0ffea88..8843f7dd 100644
--- a/chrome/test/data/webui/cr_elements/BUILD.gn
+++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -8,8 +8,11 @@
   input_files = [
     "cr_button_tests.js",
     "cr_checkbox_test.js",
+    "cr_container_shadow_behavior_test.js",
     "cr_dialog_test.js",
     "cr_drawer_tests.js",
+    "cr_expand_button_tests.js",
+    "cr_expand_button_focus_tests.js",
     "cr_icon_button_tests.js",
     "cr_icon_button_focus_tests.js",
     "cr_input_test.js",
diff --git a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.js b/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.js
index 925acab..5c15615 100644
--- a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.js
+++ b/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.js
@@ -2,6 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.m.js';
+// #import {Polymer, html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// clang-format on
+
 suite('CrContainerShadowBehavior', function() {
   suiteSetup(function() {
     document.body.innerHTML = `
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js
index e43168b..7d3289f 100644
--- a/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js
+++ b/chrome/test/data/webui/cr_elements/cr_elements_v3_browsertest.js
@@ -54,6 +54,20 @@
 });
 
 // eslint-disable-next-line no-var
+var CrElementsContainerShadowBehaviorV3Test =
+    class extends CrElementsV3BrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://test?module=cr_elements/cr_container_shadow_behavior_test.m.js';
+  }
+};
+
+TEST_F('CrElementsContainerShadowBehaviorV3Test', 'All', function() {
+  mocha.run();
+});
+
+
+// eslint-disable-next-line no-var
 var CrElementsDialogV3Test = class extends CrElementsV3BrowserTest {
   /** @override */
   get browsePreload() {
@@ -78,6 +92,18 @@
 });
 
 // eslint-disable-next-line no-var
+var CrElementsExpandButtonV3Test = class extends CrElementsV3BrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://test?module=cr_elements/cr_expand_button_tests.m.js';
+  }
+};
+
+TEST_F('CrElementsExpandButtonV3Test', 'All', function() {
+  mocha.run();
+});
+
+// eslint-disable-next-line no-var
 var CrElementsIconButtonV3Test = class extends CrElementsV3BrowserTest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js b/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js
index 4b1c1c4..74b8b2ef 100644
--- a/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js
+++ b/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js
@@ -41,6 +41,18 @@
 });
 
 // eslint-disable-next-line no-var
+var CrElementsExpandButtonV3FocusTest = class extends CrElementsV3FocusTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://test?module=cr_elements/cr_expand_button_focus_tests.m.js';
+  }
+};
+
+TEST_F('CrElementsExpandButtonV3FocusTest', 'All', function() {
+  mocha.run();
+});
+
+// eslint-disable-next-line no-var
 var CrElementsIconButtonV3FocusTest = class extends CrElementsV3FocusTest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js b/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js
index a6833230..80519a70 100644
--- a/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js
+++ b/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js
@@ -2,6 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js';
+//
+// #import {eventToPromise} from 'chrome://test/test_util.m.js';
+// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+// #import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
+// clang-format on
+
 suite('cr-expand-button-focus-tests', () => {
   let button;
 
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 db1e35d..5f0cc33 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
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js';
+// clang-format on
+
 suite('cr-expand-button', function() {
   let button;
 
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index b634485..710f710 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -298,6 +298,8 @@
       "extensions/api/bookmarks/bookmarks_api.h",
       "extensions/api/braille_display_private/braille_display_private_api.cc",
       "extensions/api/braille_display_private/braille_display_private_api.h",
+      "extensions/api/command_line_private/command_line_private_api.cc",
+      "extensions/api/command_line_private/command_line_private_api.h",
       "extensions/api/history/history_api.cc",
       "extensions/api/history/history_api.h",
       "extensions/api/i18n/i18n_api.cc",
diff --git a/chromecast/browser/extensions/api/command_line_private/command_line_private_api.cc b/chromecast/browser/extensions/api/command_line_private/command_line_private_api.cc
new file mode 100644
index 0000000..68ce1a00
--- /dev/null
+++ b/chromecast/browser/extensions/api/command_line_private/command_line_private_api.cc
@@ -0,0 +1,24 @@
+// 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 "chromecast/browser/extensions/api/command_line_private/command_line_private_api.h"
+
+#include <memory>
+#include <string>
+
+#include "base/command_line.h"
+#include "base/values.h"
+#include "chromecast/common/extensions_api/command_line_private.h"
+
+namespace extensions {
+
+namespace command_line_private = cast::api::command_line_private;
+
+ExtensionFunction::ResponseAction CommandLinePrivateHasSwitchFunction::Run() {
+  // This API is stubbed on chromecast to always return false.
+  return RespondNow(
+      ArgumentList(command_line_private::HasSwitch::Results::Create(false)));
+}
+
+}  // namespace extensions
diff --git a/chromecast/browser/extensions/api/command_line_private/command_line_private_api.h b/chromecast/browser/extensions/api/command_line_private/command_line_private_api.h
new file mode 100644
index 0000000..2929d44
--- /dev/null
+++ b/chromecast/browser/extensions/api/command_line_private/command_line_private_api.h
@@ -0,0 +1,24 @@
+// 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 CHROMECAST_BROWSER_EXTENSIONS_API_COMMAND_LINE_PRIVATE_COMMAND_LINE_PRIVATE_API_H_
+#define CHROMECAST_BROWSER_EXTENSIONS_API_COMMAND_LINE_PRIVATE_COMMAND_LINE_PRIVATE_API_H_
+
+#include "extensions/browser/extension_function.h"
+
+namespace extensions {
+
+class CommandLinePrivateHasSwitchFunction : public ExtensionFunction {
+  DECLARE_EXTENSION_FUNCTION("commandLinePrivate.hasSwitch",
+                             COMMANDLINEPRIVATE_HASSWITCH)
+ protected:
+  ~CommandLinePrivateHasSwitchFunction() override {}
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+};
+
+}  // namespace extensions
+
+#endif  // CHROMECAST_BROWSER_EXTENSIONS_API_COMMAND_LINE_PRIVATE_COMMAND_LINE_PRIVATE_API_H_
diff --git a/chromecast/browser/extensions/cast_extension_system.cc b/chromecast/browser/extensions/cast_extension_system.cc
index d1cd9990..64b25634 100644
--- a/chromecast/browser/extensions/cast_extension_system.cc
+++ b/chromecast/browser/extensions/cast_extension_system.cc
@@ -115,7 +115,7 @@
   int load_flags = Extension::FOLLOW_SYMLINKS_ANYWHERE;
   std::string load_error;
   scoped_refptr<Extension> extension = file_util::LoadExtension(
-      extension_dir, Manifest::COMMAND_LINE, load_flags, &load_error);
+      extension_dir, Manifest::COMPONENT, load_flags, &load_error);
   if (!extension.get()) {
     LOG(ERROR) << "Loading extension at " << extension_dir.value()
                << " failed with: " << load_error;
diff --git a/chromecast/common/extensions_api/BUILD.gn b/chromecast/common/extensions_api/BUILD.gn
index 258e6357..08dec751b 100644
--- a/chromecast/common/extensions_api/BUILD.gn
+++ b/chromecast/common/extensions_api/BUILD.gn
@@ -17,6 +17,7 @@
   "accessibility_private.json",
   "bookmarks.json",
   "braille_display_private.idl",
+  "command_line_private.json",
   "history.json",
   "identity.idl",
   "i18n.json",
diff --git a/chromecast/common/extensions_api/_api_features.json b/chromecast/common/extensions_api/_api_features.json
index 12b07352..0c87498 100644
--- a/chromecast/common/extensions_api/_api_features.json
+++ b/chromecast/common/extensions_api/_api_features.json
@@ -15,6 +15,10 @@
     "dependencies": ["permission:brailleDisplayPrivate"],
     "contexts": ["blessed_extension"]
   },
+  "commandLinePrivate": {
+    "dependencies": ["permission:commandLinePrivate"],
+    "contexts": ["blessed_extension"]
+  },
   "i18n": {
     "channel": "stable",
     "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
diff --git a/chromecast/common/extensions_api/_permission_features.json b/chromecast/common/extensions_api/_permission_features.json
index edcf6f4..c460311 100644
--- a/chromecast/common/extensions_api/_permission_features.json
+++ b/chromecast/common/extensions_api/_permission_features.json
@@ -17,6 +17,11 @@
     "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
     "location": "component"
   },
+  "commandLinePrivate": {
+    "channel": "stable",
+    "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
+    "location": "component"
+  },
   "history": {
     "channel": "stable",
     "extension_types": ["extension", "legacy_packaged_app"]
diff --git a/chromecast/common/extensions_api/command_line_private.json b/chromecast/common/extensions_api/command_line_private.json
new file mode 100644
index 0000000..57a158ee
--- /dev/null
+++ b/chromecast/common/extensions_api/command_line_private.json
@@ -0,0 +1,35 @@
+// 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.
+
+[
+  {
+    "namespace": "commandLinePrivate",
+    "description": "none",
+    "functions": [
+      {
+        "name": "hasSwitch",
+        "type": "function",
+        "description": "Returns whether a switch is specified on the command line when launching Chrome.",
+        "parameters": [
+          {
+            "name": "name",
+            "type": "string",
+            "description": "The name of a command line switch, without leading \"--\", such as \"enable-experimental-extension-apis\"."
+          },
+          {
+            "name": "callback",
+            "type": "function",
+            "parameters": [
+              {
+                "name": "result",
+                "type": "boolean",
+                "description": "Whether the switch is specified on the command line."
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+]
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
index 506f096e..be139efb 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
+++ b/chromecast/media/cma/backend/media_pipeline_backend_manager.cc
@@ -35,12 +35,8 @@
 
 namespace {
 
-#if BUILDFLAG(IS_CAST_AUDIO_ONLY) || BUILDFLAG(ENABLE_ASSISTANT)
 constexpr int kAudioDecoderLimit = std::numeric_limits<int>::max();
-#else
-constexpr int kAudioDecoderLimit = 1;
-#endif
-
+constexpr int kVideoDecoderLimit = 1;
 constexpr base::TimeDelta kPowerSaveWaitTime = base::TimeDelta::FromSeconds(5);
 
 }  // namespace
@@ -113,7 +109,8 @@
 bool MediaPipelineBackendManager::IncrementDecoderCount(DecoderType type) {
   DCHECK(media_task_runner_->BelongsToCurrentThread());
   DCHECK(type < NUM_DECODER_TYPES);
-  const int limit = (type == AUDIO_DECODER) ? kAudioDecoderLimit : 1;
+  const int limit =
+      (type == VIDEO_DECODER) ? kVideoDecoderLimit : kAudioDecoderLimit;
   if (decoder_count_[type] >= limit) {
     LOG(WARNING) << "Decoder limit reached for type " << type;
     return false;
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index beea153..293bddd 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -419,16 +419,16 @@
     if (features::IsTimerNotificationEnabled()) {
       // Bind to the AssistantAlarmTimerController in ash.
       client_->RequestAssistantAlarmTimerController(
-          mojo::MakeRequest(&assistant_alarm_timer_controller_));
+          assistant_alarm_timer_controller_.BindNewPipeAndPassReceiver());
     }
 
     // Bind to the AssistantNotificationController in ash.
     client_->RequestAssistantNotificationController(
-        mojo::MakeRequest(&assistant_notification_controller_));
+        assistant_notification_controller_.BindNewPipeAndPassReceiver());
 
     // Bind to the AssistantScreenContextController in ash.
     client_->RequestAssistantScreenContextController(
-        mojo::MakeRequest(&assistant_screen_context_controller_));
+        assistant_screen_context_controller_.BindNewPipeAndPassReceiver());
 
     AddAshSessionObserver();
   }
diff --git a/chromeos/services/assistant/service.h b/chromeos/services/assistant/service.h
index cf0e11d..4ce3622 100644
--- a/chromeos/services/assistant/service.h
+++ b/chromeos/services/assistant/service.h
@@ -28,6 +28,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/identity/public/mojom/identity_accessor.mojom.h"
 
 class GoogleServiceAuthError;
@@ -205,11 +206,11 @@
 
   mojom::AssistantControllerPtr assistant_controller_;
 
-  ash::mojom::AssistantAlarmTimerControllerPtr
+  mojo::Remote<ash::mojom::AssistantAlarmTimerController>
       assistant_alarm_timer_controller_;
-  ash::mojom::AssistantNotificationControllerPtr
+  mojo::Remote<ash::mojom::AssistantNotificationController>
       assistant_notification_controller_;
-  ash::mojom::AssistantScreenContextControllerPtr
+  mojo::Remote<ash::mojom::AssistantScreenContextController>
       assistant_screen_context_controller_;
   AssistantStateProxy assistant_state_;
 
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index eab3dcb..10d171ce 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -205,7 +205,14 @@
     // is not connectable.
     const DeviceState* device =
         network_state_handler->GetDeviceState(network->device_path());
-    DCHECK(device) << "Device path not found: " << network->device_path();
+    if (!device) {
+      // When a device is removed (e.g. cellular modem unplugged) it's possible
+      // for the device object to disappear before networks on that device
+      // are cleaned up.  This fixes crbug/1001687.
+      NET_LOG(DEBUG) << "Cellular is not available.";
+      return nullptr;
+    }
+
     if (device->IsSimLocked() || device->scanning())
       result->connectable = false;
   }
@@ -251,6 +258,11 @@
                                                 onc::kNetworkTechnologyTable);
       cellular->roaming = network->IndicateRoaming();
       cellular->signal_strength = network->signal_strength();
+
+      const DeviceState* cellular_device =
+          network_state_handler->GetDeviceState(network->device_path());
+      cellular->sim_locked = !cellular_device->IsSimAbsent() &&
+                             cellular_device->sim_lock_enabled();
       result->cellular = std::move(cellular);
       break;
     }
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc
index 6463504..8ed0c6f 100644
--- a/chromeos/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -119,6 +119,9 @@
     helper().device_test()->SetDeviceProperty(
         kCellularDevicePath, shill::kSIMLockStatusProperty, sim_value,
         /*notify_changed=*/false);
+    helper().device_test()->SetDeviceProperty(
+        kCellularDevicePath, shill::kSIMPresentProperty, base::Value(true),
+        /*notify_changed=*/false);
 
     // Note: These are Shill dictionaries, not ONC.
     helper().ConfigureService(
@@ -417,6 +420,7 @@
   EXPECT_EQ(mojom::ActivationStateType::kActivated,
             network->cellular->activation_state);
   EXPECT_EQ(mojom::OncSource::kNone, network->source);
+  EXPECT_TRUE(network->cellular->sim_locked);
 
   network = GetNetworkState("vpn_guid");
   ASSERT_TRUE(network);
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
index 867deb1e..907e7f97 100644
--- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom
+++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -191,6 +191,8 @@
   bool roaming = false;
   // The signal strength of the cellular connection.
   int32 signal_strength;
+  // True when a SIM is present and locked.
+  bool sim_locked = false;
 };
 
 struct EthernetStateProperties {
diff --git a/components/arc/mojom/net.mojom b/components/arc/mojom/net.mojom
index 731445ab..edcf943 100644
--- a/components/arc/mojom/net.mojom
+++ b/components/arc/mojom/net.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Next MinVersion: 11
+// Next MinVersion: 12
 
 // This file defines the mojo interface between the ARC networking stack and
 // Chrome OS. There are three different groups of interactions:
@@ -207,6 +207,9 @@
 
   // The network interface associated with this network service.
   [MinVersion=10] string? network_interface;
+
+  // True if this network is the host default network.
+  [MinVersion=11] bool is_default_network;
 };
 
 // Describes a Wifi network configuration that ARC has requested the host to
diff --git a/components/arc/net/arc_net_host_impl.cc b/components/arc/net/arc_net_host_impl.cc
index 83ff44b4..c970423 100644
--- a/components/arc/net/arc_net_host_impl.cc
+++ b/components/arc/net/arc_net_host_impl.cc
@@ -314,12 +314,25 @@
   return mojo;
 }
 
-// Convenience helper for returning a mojo NetworkConfiguration from
-// a NetworkState.
-arc::mojom::NetworkConfigurationPtr TranslateNetworkState(
-    const chromeos::NetworkState* state) {
-  return TranslateONCConfiguration(
-      state, chromeos::network_util::TranslateNetworkStateToONC(state).get());
+// Convenience helper for translating a vector of NetworkState objects to a
+// vector of mojo NetworkConfiguration objects.
+std::vector<arc::mojom::NetworkConfigurationPtr> TranslateNetworkStates(
+    const std::string& default_network_path,
+    const std::string& arc_vpn_path,
+    const chromeos::NetworkStateHandler::NetworkStateList& network_states) {
+  std::vector<arc::mojom::NetworkConfigurationPtr> networks;
+  for (const chromeos::NetworkState* state : network_states) {
+    const std::string& network_path = state->path();
+    if (network_path == arc_vpn_path) {
+      // Never tell Android about its own VPN.
+      continue;
+    }
+    auto network = TranslateONCConfiguration(
+        state, chromeos::network_util::TranslateNetworkStateToONC(state).get());
+    network->is_default_network = network_path == default_network_path;
+    networks.push_back(std::move(network));
+  }
+  return networks;
 }
 
 const chromeos::NetworkState* GetShillBackedNetwork(
@@ -532,9 +545,8 @@
         kGetNetworksListLimit, &network_states);
   }
 
-  std::vector<mojom::NetworkConfigurationPtr> networks;
-  for (const chromeos::NetworkState* state : network_states)
-    networks.push_back(TranslateNetworkState(state));
+  std::vector<mojom::NetworkConfigurationPtr> networks = TranslateNetworkStates(
+      default_network_path_, arc_vpn_service_path_, network_states);
   std::move(callback).Run(mojom::GetNetworksResponseType::New(
       arc::mojom::NetworkResult::SUCCESS, std::move(networks)));
 }
@@ -777,6 +789,7 @@
 
   if (!default_network) {
     VLOG(1) << "No default network";
+    default_network_path_.clear();
     auto* net_instance = ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->net(),
                                                      DefaultNetworkChanged);
     if (net_instance)
@@ -786,6 +799,7 @@
 
   VLOG(1) << "New default network: " << default_network->path() << " ("
           << default_network->type() << ")";
+  default_network_path_ = default_network->path();
   std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
   GetManagedConfigurationHandler()->GetProperties(
       user_id_hash, default_network->path(),
@@ -1023,9 +1037,9 @@
   if (!net_instance)
     return;
 
-  std::vector<arc::mojom::NetworkConfigurationPtr> network_configurations;
-  for (const chromeos::NetworkState* state : active_networks)
-    network_configurations.push_back(TranslateNetworkState(state));
+  std::vector<arc::mojom::NetworkConfigurationPtr> network_configurations =
+      TranslateNetworkStates(default_network_path_, arc_vpn_service_path_,
+                             active_networks);
   net_instance->ActiveNetworksChanged(std::move(network_configurations));
 }
 
diff --git a/components/arc/net/arc_net_host_impl.h b/components/arc/net/arc_net_host_impl.h
index 79d1967..f324cec 100644
--- a/components/arc/net/arc_net_host_impl.h
+++ b/components/arc/net/arc_net_host_impl.h
@@ -159,7 +159,7 @@
 
   std::string cached_service_path_;
   std::string cached_guid_;
-
+  std::string default_network_path_;
   std::string arc_vpn_service_path_;
   // Owned by the user profile whose context was used to initialize |this|.
   PrefService* pref_service_ = nullptr;
diff --git a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
index 54e7595..0e035f6 100644
--- a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
@@ -13,7 +13,6 @@
 #include "components/arc/video_accelerator/protected_buffer_manager.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_types.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/gpu_video_decode_accelerator_factory.h"
 #include "media/gpu/macros.h"
 #include "mojo/public/cpp/system/platform_handle.h"
diff --git a/components/arc/video_accelerator/gpu_arc_video_protected_buffer_allocator.cc b/components/arc/video_accelerator/gpu_arc_video_protected_buffer_allocator.cc
index e37df87..91fa440e 100644
--- a/components/arc/video_accelerator/gpu_arc_video_protected_buffer_allocator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_protected_buffer_allocator.cc
@@ -13,7 +13,7 @@
 #include "components/arc/video_accelerator/arc_video_accelerator_util.h"
 #include "components/arc/video_accelerator/protected_buffer_allocator.h"
 #include "components/arc/video_accelerator/protected_buffer_manager.h"
-#include "media/gpu/format_utils.h"
+#include "media/base/format_utils.h"
 #include "media/gpu/macros.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/system/platform_handle.h"
diff --git a/components/autofill/content/browser/risk/fingerprint.cc b/components/autofill/content/browser/risk/fingerprint.cc
index e640bf8..925fd90 100644
--- a/components/autofill/content/browser/risk/fingerprint.cc
+++ b/components/autofill/content/browser/risk/fingerprint.cc
@@ -296,7 +296,7 @@
   if (gpu_data_manager_->GpuAccessAllowed(nullptr) &&
       !gpu_data_manager_->IsEssentialGpuInfoAvailable()) {
     gpu_observer_.Add(gpu_data_manager_);
-    gpu_data_manager_->RequestCompleteGpuInfoIfNeeded();
+    OnGpuInfoUpdate();
   }
 
 #if BUILDFLAG(ENABLE_PLUGINS)
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager.cc b/components/autofill/core/browser/payments/credit_card_save_manager.cc
index 05b70b7..f695406c 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager.cc
@@ -311,6 +311,11 @@
     // removed.
     GetCreditCardSaveStrikeDatabase()->ClearStrikes(
         base::UTF16ToUTF8(upload_request_.card.LastFourDigits()));
+
+    // After a card is successfully saved to server, notifies the
+    // |personal_data_manager_|. PDM uses this information to update the avatar
+    // button UI.
+    personal_data_manager_->OnCreditCardSaved();
   } else if (show_save_prompt_.has_value() && show_save_prompt_.value()) {
     // If the upload failed and the bubble was actually shown (NOT just the
     // icon), count that as a strike against offering upload in the future.
diff --git a/components/autofill/core/browser/payments/local_card_migration_manager.cc b/components/autofill/core/browser/payments/local_card_migration_manager.cc
index f3dae8c54..d38f803b 100644
--- a/components/autofill/core/browser/payments/local_card_migration_manager.cc
+++ b/components/autofill/core/browser/payments/local_card_migration_manager.cc
@@ -330,6 +330,12 @@
         NOTREACHED();
       }
     }
+
+    // If at least one card was migrated, notifies the |personal_data_manager_|.
+    // PDM uses this information to update the avatar button UI.
+    if (!migrated_cards.empty())
+      personal_data_manager_->OnCreditCardSaved();
+
     // Remove cards that were successfully migrated from local storage.
     personal_data_manager_->DeleteLocalCreditCards(migrated_cards);
   }
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 41cd4d5b..58d5ec7 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -47,6 +47,7 @@
 #include "components/autofill/core/common/autofill_clock.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/autofill_switches.h"
 #include "components/autofill/core/common/autofill_util.h"
@@ -1799,6 +1800,10 @@
     credit_cards.push_back(imported_card);
 
   SetCreditCards(&credit_cards);
+
+  // After a card is saved locally, notifies the observers.
+  OnCreditCardSaved();
+
   return guid;
 }
 
@@ -2033,6 +2038,15 @@
   }
 }
 
+void PersonalDataManager::OnCreditCardSaved() {
+  if (!base::FeatureList::IsEnabled(
+          features::kAutofillCreditCardUploadFeedback)) {
+    return;
+  }
+  for (PersonalDataManagerObserver& observer : observers_)
+    observer.OnCreditCardSaved();
+}
+
 std::vector<Suggestion> PersonalDataManager::GetSuggestionsForCards(
     const AutofillType& type,
     const base::string16& field_contents,
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 912b454..7826b0d 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -387,6 +387,9 @@
   // Notifies observers that the waiting should be stopped.
   void NotifyPersonalDataObserver();
 
+  // Called when at least one (can be multiple) card was saved.
+  void OnCreditCardSaved();
+
   void set_client_profile_validator_for_test(
       AutofillProfileValidator* validator) {
     client_profile_validator_ = validator;
diff --git a/components/autofill/core/browser/personal_data_manager_observer.h b/components/autofill/core/browser/personal_data_manager_observer.h
index d09bc934..c653a85 100644
--- a/components/autofill/core/browser/personal_data_manager_observer.h
+++ b/components/autofill/core/browser/personal_data_manager_observer.h
@@ -13,7 +13,7 @@
 class PersonalDataManagerObserver {
  public:
   // Notifies the observer that the PersonalDataManager changed in some way.
-  virtual void OnPersonalDataChanged() = 0;
+  virtual void OnPersonalDataChanged() {}
 
   // Called when there is insufficient data to fill a form. Used for testing.
   virtual void OnInsufficientFormData() {}
@@ -22,6 +22,13 @@
   // handle.
   virtual void OnPersonalDataFinishedProfileTasks() {}
 
+  // Notifies the observer whenever at least one (can be multiple) credit card
+  // is suceesfully saved.
+  // TODO(crbug.com/964127): Need to add a bool to separate server card save and
+  // local card save to decide whether to show the Autofill sign-in after local
+  // save promo bubble.
+  virtual void OnCreditCardSaved() {}
+
  protected:
   virtual ~PersonalDataManagerObserver() {}
 };
diff --git a/components/bookmarks/browser/bookmark_expanded_state_tracker_unittest.cc b/components/bookmarks/browser/bookmark_expanded_state_tracker_unittest.cc
index 3c08725..59c5a95 100644
--- a/components/bookmarks/browser/bookmark_expanded_state_tracker_unittest.cc
+++ b/components/bookmarks/browser/bookmark_expanded_state_tracker_unittest.cc
@@ -32,7 +32,7 @@
   void SetUp() override;
   void TearDown() override;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   TestingPrefServiceSimple prefs_;
   std::unique_ptr<BookmarkModel> model_;
 
diff --git a/components/bookmarks/browser/bookmark_utils_unittest.cc b/components/bookmarks/browser/bookmark_utils_unittest.cc
index bda7273..05d2fb8 100644
--- a/components/bookmarks/browser/bookmark_utils_unittest.cc
+++ b/components/bookmarks/browser/bookmark_utils_unittest.cc
@@ -72,7 +72,7 @@
     ++grouped_changes_ended_count_;
   }
 
-  // Clipboard requires a message loop.
+  // Clipboard requires a full TaskEnvironment.
   base::test::TaskEnvironment task_environment_;
 
   int grouped_changes_beginning_count_;
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
index 2a704a9..232bbdc 100644
--- a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
+++ b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
@@ -165,7 +165,7 @@
   }
 
   base::ScopedTempDir scoped_temp_dir_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   TestingPrefServiceSimple prefs_;
   std::unique_ptr<BookmarkModel> model_;
   MockBookmarkModelObserver observer_;
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index f00987f..a1de20ba8 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -361,8 +361,7 @@
             CreateForwardingControllerDelegate(syncer::USER_EVENTS)));
   }
 
-  if (!disabled_types.Has(syncer::SEND_TAB_TO_SELF) &&
-      base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
+  if (!disabled_types.Has(syncer::SEND_TAB_TO_SELF)) {
     controllers.push_back(
         std::make_unique<send_tab_to_self::SendTabToSelfModelTypeController>(
             sync_service,
diff --git a/components/browsing_data/core/browsing_data_utils_unittest.cc b/components/browsing_data/core/browsing_data_utils_unittest.cc
index 870446b..78f79bf7 100644
--- a/components/browsing_data/core/browsing_data_utils_unittest.cc
+++ b/components/browsing_data/core/browsing_data_utils_unittest.cc
@@ -50,7 +50,7 @@
   PrefService* prefs() { return &prefs_; }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   sync_preferences::TestingPrefServiceSyncable prefs_;
 };
 
diff --git a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
index 77f8f603..98b35646 100644
--- a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
+++ b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
@@ -104,7 +104,7 @@
  private:
   std::unique_ptr<TestingPrefServiceSimple> pref_service_;
   std::unique_ptr<MockBrowsingDataCounter> counter_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 TEST_F(BrowsingDataCounterTest, NoResponse) {
diff --git a/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc b/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc
index 917452a4..0fd7c1b4 100644
--- a/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc
+++ b/components/chromeos_camera/mjpeg_decode_accelerator_unittest.cc
@@ -36,11 +36,11 @@
 #include "build/build_config.h"
 #include "components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.h"
 #include "components/chromeos_camera/mjpeg_decode_accelerator.h"
+#include "media/base/format_utils.h"
 #include "media/base/test_data_util.h"
 #include "media/base/video_frame_layout.h"
 #include "media/capture/video/chromeos/local_gpu_memory_buffer_manager.h"
 #include "media/gpu/buildflags.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/test/video_accelerator_unittest_helpers.h"
 #include "media/gpu/test/video_frame_helpers.h"
 #include "media/parsers/jpeg_parser.h"
diff --git a/components/exo/shell_surface_util.cc b/components/exo/shell_surface_util.cc
index 4d8d2ad..0b14930 100644
--- a/components/exo/shell_surface_util.cc
+++ b/components/exo/shell_surface_util.cc
@@ -5,6 +5,7 @@
 #include "components/exo/shell_surface_util.h"
 
 #include "base/trace_event/trace_event.h"
+#include "components/exo/shell_surface_base.h"
 #include "components/exo/surface.h"
 #include "components/exo/wm_helper.h"
 #include "ui/aura/client/capture_client.h"
@@ -63,6 +64,16 @@
   return window->GetProperty(kMainSurfaceKey);
 }
 
+ShellSurfaceBase* GetShellSurfaceBaseForWindow(aura::Window* window) {
+  // Only windows with a surface can have a shell surface.
+  if (!GetShellMainSurface(window))
+    return nullptr;
+  views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window);
+  if (!widget)
+    return nullptr;
+  return static_cast<ShellSurfaceBase*>(widget->widget_delegate());
+}
+
 Surface* GetTargetSurfaceForLocatedEvent(ui::LocatedEvent* event) {
   aura::Window* window =
       WMHelper::GetInstance()->GetCaptureClient()->GetCaptureWindow();
diff --git a/components/exo/shell_surface_util.h b/components/exo/shell_surface_util.h
index e2fa1f49..7fe1a02 100644
--- a/components/exo/shell_surface_util.h
+++ b/components/exo/shell_surface_util.h
@@ -20,6 +20,7 @@
 namespace exo {
 
 class Surface;
+class ShellSurfaceBase;
 
 // Sets the application ID for the window. The application ID identifies the
 // general class of applications to which the window belongs.
@@ -40,6 +41,10 @@
 // |window| must not be nullptr.
 Surface* GetShellMainSurface(const aura::Window* window);
 
+// Returns the ShellSurfaceBase for the given |window|, or nullptr if no such
+// surface exists.
+ShellSurfaceBase* GetShellSurfaceBaseForWindow(aura::Window* window);
+
 // Returns the target surface for the located event |event|.  If an
 // event handling is grabbed by an window, it'll first examine that
 // window, then traverse to its transient parent if the parent also
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index fe3fd8c8..536df0b 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -369,8 +369,11 @@
         name, 1, 1000, 50, base::Histogram::kUmaTargetedHistogramFlag);
     counter->Add(static_cast<int>((end_time - start_time).InMilliseconds()));
   }
-  in_start_ = false;
+
+  // This will usually set |done_| to false, unless all of the providers are
+  // are finished after the synchronous pass we just completed.
   CheckIfDone();
+
   // The second true forces saying the default match has changed.
   // This triggers the edit model to update things such as the inline
   // autocomplete state.  In particular, if the user has typed a key
@@ -386,6 +389,8 @@
   // need the edit model to update the display.
   UpdateResult(false, true);
 
+  in_start_ = false;
+
   // Omnibox has dependencies that may be lazily initialized. This metric will
   // help tracking regression on the first use.
   if (first_query_) {
@@ -464,10 +469,20 @@
 }
 
 void AutocompleteController::OnProviderUpdate(bool updated_matches) {
+  // Providers should only call this method during the asynchronous pass.
+  // There's no reason to call this during the synchronous pass, since we
+  // perform these operations anyways after all providers are started.
+  //
+  // This is not a DCHECK, because in the unusual case that a provider calls an
+  // asynchronous method, and that method early exits by calling the callback
+  // immediately, it's not necessarily a programmer error. We should just no-op.
+  if (in_start_)
+    return;
+
   CheckIfDone();
   // Multiple providers may provide synchronous results, so we only update the
   // results if we're not in Start().
-  if (!in_start_ && (updated_matches || done_))
+  if (updated_matches || done_)
     UpdateResult(false, false);
 }
 
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h
index b129d7ea..64d38a3 100644
--- a/components/omnibox/browser/autocomplete_controller.h
+++ b/components/omnibox/browser/autocomplete_controller.h
@@ -280,7 +280,8 @@
   bool done_;
 
   // Are we in Start()? This is used to avoid updating |result_| and sending
-  // notifications until Start() has been invoked on all providers.
+  // notifications until Start() has been invoked on all providers. When this
+  // boolean is true, we are definitely within the synchronous pass.
   bool in_start_;
 
   // Indicate whether it is the first query since startup.
diff --git a/components/omnibox/browser/autocomplete_provider_listener.h b/components/omnibox/browser/autocomplete_provider_listener.h
index 8318647..9955837 100644
--- a/components/omnibox/browser/autocomplete_provider_listener.h
+++ b/components/omnibox/browser/autocomplete_provider_listener.h
@@ -16,6 +16,9 @@
   // NOTE: Providers MUST only call this method while processing asynchronous
   // queries.  Do not call this for a synchronous query.
   //
+  // NOTE: If a provider has finished, it should set done() to true BEFORE
+  // calling this method.
+  //
   // NOTE: There's no parameter to tell the listener _which_ provider is
   // calling it.  Because the AutocompleteController (the typical listener)
   // doesn't cache the providers' individual matches locally, it has to get
diff --git a/components/omnibox/browser/clipboard_provider.cc b/components/omnibox/browser/clipboard_provider.cc
index fe54f6a..1646d4d5 100644
--- a/components/omnibox/browser/clipboard_provider.cc
+++ b/components/omnibox/browser/clipboard_provider.cc
@@ -295,6 +295,10 @@
 
   match.transition = ui::PAGE_TRANSITION_GENERATED;
 
+  field_trial_triggered_ = true;
+  field_trial_triggered_in_session_ = true;
+  done_ = true;
+
   // Some users may be in a counterfactual study arm in which we perform all
   // necessary work but do not forward the autocomplete matches.
   bool in_counterfactual_group = base::GetFieldTrialParamByFeatureAsBool(
@@ -304,9 +308,6 @@
     AddCreatedMatchWithTracking(input, match, clipboard_contents_age);
     listener_->OnProviderUpdate(true);
   }
-  field_trial_triggered_ = true;
-  field_trial_triggered_in_session_ = true;
-  done_ = true;
 }
 
 void ClipboardProvider::AddProviderInfo(ProvidersInfo* provider_info) const {
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index 8197333..e4c6de1f 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -266,7 +266,7 @@
 // Feature to use material design weather icons in the omnibox when displaying
 // weather answers.
 const base::Feature kOmniboxMaterialDesignWeatherIcons{
-    "OmniboxMaterialDesignWeatherIcons", base::FEATURE_DISABLED_BY_DEFAULT};
+    "OmniboxMaterialDesignWeatherIcons", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Returns whether IsInstantExtendedAPIEnabled should be ignored when deciding
 // the number of Google-provided search suggestions.
diff --git a/components/optimization_guide/hints_fetcher.cc b/components/optimization_guide/hints_fetcher.cc
index c50e7cda..47b8252 100644
--- a/components/optimization_guide/hints_fetcher.cc
+++ b/components/optimization_guide/hints_fetcher.cc
@@ -75,14 +75,15 @@
       hosts_fetched->FindDoubleKey(HashHostForDictionary(host));
   if (!value) {
     UMA_HISTOGRAM_BOOLEAN(
-        "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", false);
+        "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", false);
     return;
   }
 
   base::Time host_valid_time = base::Time::FromDeltaSinceWindowsEpoch(
       base::TimeDelta::FromSecondsD(*value));
-  UMA_HISTOGRAM_BOOLEAN("OptimizationGuide.HintsFetcher.WasHostCoveredByFetch",
-                        host_valid_time > base::Time::Now());
+  UMA_HISTOGRAM_BOOLEAN(
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch",
+      host_valid_time > base::Time::Now());
 }
 
 bool HintsFetcher::FetchOptimizationGuideServiceHints(
diff --git a/components/optimization_guide/hints_fetcher_unittest.cc b/components/optimization_guide/hints_fetcher_unittest.cc
index 710bb6a..8d93ec87 100644
--- a/components/optimization_guide/hints_fetcher_unittest.cc
+++ b/components/optimization_guide/hints_fetcher_unittest.cc
@@ -270,7 +270,7 @@
   SimulateNavigation(hosts[0]);
   SimulateNavigation(hosts[1]);
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 2);
 }
 
 TEST_F(HintsFetcherTest, HintsFetcherCoveredHostExpired) {
@@ -294,7 +294,7 @@
   SimulateNavigation(hosts[0]);
   SimulateNavigation(hosts[1]);
   histogram_tester.ExpectUniqueSample(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", false, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", false, 2);
 
   // The first pair of hosts should be removed from the dictionary
   // pref as they have expired.
@@ -307,7 +307,7 @@
   SimulateNavigation(hosts_valid[0]);
   SimulateNavigation(hosts_valid[1]);
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 2);
 }
 
 TEST_F(HintsFetcherTest, HintsFetcherHostNotCovered) {
@@ -325,9 +325,9 @@
   SimulateNavigation(hosts[1]);
   SimulateNavigation("newhost.com");
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 2);
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", false, 1);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", false, 1);
 }
 
 TEST_F(HintsFetcherTest, HintsFetcherRemoveExpiredOnSuccessfullyFetched) {
@@ -355,12 +355,12 @@
   SimulateNavigation(hosts_expired[0]);
   SimulateNavigation(hosts_expired[1]);
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", false, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", false, 2);
 
   SimulateNavigation(hosts_valid[0]);
   SimulateNavigation(hosts_valid[1]);
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 2);
 }
 
 TEST_F(HintsFetcherTest, HintsFetcherSuccessfullyFetchedHostsFull) {
@@ -392,7 +392,7 @@
   SimulateNavigation(extra_hosts[0]);
   SimulateNavigation(extra_hosts[1]);
   histogram_tester.ExpectUniqueSample(
-      "OptimizationGuide.HintsFetcher.WasHostCoveredByFetch", true, 2);
+      "OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch", true, 2);
 }
 
 }  // namespace optimization_guide
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index 56a9fd8..d910d21 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -11,6 +11,7 @@
 #include "components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl.h"
 #include "components/password_manager/core/browser/leak_detection_delegate_helper.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
+#include "components/password_manager/core/browser/password_feature_manager.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
@@ -58,9 +59,11 @@
     logger.LogBoolean(Logger::STRING_LEAK_DETECTION_FINISHED, is_leaked);
   }
   if (is_leaked) {
-    if (client_->GetPasswordSyncState() != SYNCING_NORMAL_ENCRYPTION) {
-      // If the credentials are not synced, the |CredentialLeakType| needed to
-      // show the correct notification is already determined.
+    if (!client_->GetPasswordFeatureManager()
+             ->ShouldCheckReuseOnLeakDetection()) {
+      // If we should not check leaked password reuse, then the
+      // |CredentialLeakType| needed to show the correct notification is already
+      // determined.
       OnShowLeakDetectionNotification(
           CreateLeakType(IsSaved(false), IsReused(false), IsSyncing(false)),
           std::move(url), std::move(username));
diff --git a/components/password_manager/core/browser/mock_password_feature_manager.h b/components/password_manager/core/browser/mock_password_feature_manager.h
index 835eb5f..623639ab 100644
--- a/components/password_manager/core/browser/mock_password_feature_manager.h
+++ b/components/password_manager/core/browser/mock_password_feature_manager.h
@@ -16,6 +16,7 @@
   ~MockPasswordFeatureManager() override;
 
   MOCK_CONST_METHOD0(IsGenerationEnabled, bool());
+  MOCK_CONST_METHOD0(ShouldCheckReuseOnLeakDetection, bool());
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_feature_manager.h b/components/password_manager/core/browser/password_feature_manager.h
index 1878e6b..384492ea 100644
--- a/components/password_manager/core/browser/password_feature_manager.h
+++ b/components/password_manager/core/browser/password_feature_manager.h
@@ -17,6 +17,11 @@
 
   virtual bool IsGenerationEnabled() const = 0;
 
+  // Whether we should, upon the detection of a leaked password, check if the
+  // same password is reused on other website. That's used only for the UI
+  // string.
+  virtual bool ShouldCheckReuseOnLeakDetection() const = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(PasswordFeatureManager);
 };
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc
index 08802070..9f78462 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.cc
+++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -23,4 +23,17 @@
   }
 }
 
+bool PasswordFeatureManagerImpl::ShouldCheckReuseOnLeakDetection() const {
+  switch (password_manager_util::GetPasswordSyncState(sync_service_)) {
+    // We currently check the reuse of the leaked password only for users who
+    // can access passwords.google.com. Therefore, if the credentials are not
+    // synced, no need to check for password use.
+    case NOT_SYNCING:
+    case SYNCING_WITH_CUSTOM_PASSPHRASE:
+      return false;
+    case SYNCING_NORMAL_ENCRYPTION:
+      return true;
+  }
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.h b/components/password_manager/core/browser/password_feature_manager_impl.h
index 987e0ef0..a481814 100644
--- a/components/password_manager/core/browser/password_feature_manager_impl.h
+++ b/components/password_manager/core/browser/password_feature_manager_impl.h
@@ -23,6 +23,8 @@
 
   bool IsGenerationEnabled() const override;
 
+  bool ShouldCheckReuseOnLeakDetection() const override;
+
  private:
   const syncer::SyncService* const sync_service_;
   DISALLOW_COPY_AND_ASSIGN(PasswordFeatureManagerImpl);
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 8c6a1cf4..52b6f3d 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1184,7 +1184,7 @@
 <translation id="3016255526521614822">Auf dem <ph name="PRODUCT_OS_NAME" />-Sperrbildschirm zulässige Notizen-Apps auf die weiße Liste setzen</translation>
 <translation id="3021562480854470924">Rollback bei erreichter Anzahl von Meilensteinen ist erlaubt</translation>
 <translation id="3023572080620427845">URL einer XML-Datei, die URLs enthält, mit denen ein alternativer Browser geladen werden kann.</translation>
-<translation id="3026740867910702435">Mit dieser Richtlinie kann die Bedienungshilfe für den großen Cursor auf der Anmeldeseite aktiviert werden.
+<translation id="3026740867910702435">Mit dieser Richtlinie kann die Bedienungshilfe "großer Cursor" auf der Anmeldeseite aktiviert werden.
 
           Wird die Richtlinie auf "true" gesetzt, ist der große Cursor auf dem Anmeldebildschirm immer aktiviert.
 
@@ -1488,7 +1488,7 @@
 <translation id="3631099945620529777">Wenn diese Richtlinie auf "false" gesetzt ist, ist die Schaltfläche "Prozess beenden" im Task-Manager deaktiviert.
 
       Ist sie auf "true" gesetzt oder nicht konfiguriert, kann der Nutzer Prozesse im Task-Manager beenden.</translation>
-<translation id="3639444551396586995">Google unsichere Ereignisse in Chrome melden</translation>
+<translation id="3639444551396586995">Unsichere Ereignisse in Chrome an Google melden</translation>
 <translation id="3643284063603988867">Funktion zum Speichern des Passworts aktivieren</translation>
 <translation id="3646859102161347133">Lupentyp festlegen</translation>
 <translation id="3653237928288822292">Symbol der Standardsuchmaschine</translation>
@@ -1904,7 +1904,7 @@
           Der Richtlinienwert sollte in Millisekunden angegeben werden. Werte müssen kleiner oder gleich dem Wert für die Inaktivitätsverzögerung sein.
 
           Die Warnung wird nur eingeblendet, wenn infolge der Inaktivität der Nutzer abgemeldet oder das Gerät heruntergefahren wird.</translation>
-<translation id="4344356660952451291">Liste der Domains, für die heruntergeladene Inhalte auf Compliance geprüft werden müssen.</translation>
+<translation id="4344356660952451291">Liste der Domains, für die heruntergeladene Inhalte auf Regeleinhaltung geprüft werden müssen</translation>
 <translation id="4346674324214534449">Hiermit kann festgelegt werden, ob die Werbung auf Websites mit aufdringlichen Werbeanzeigen blockiert wird.
 
       Wenn diese Richtlinie auf "2" gesetzt wird, wird die Werbung auf Websites mit aufdringlichen Werbeanzeigen blockiert.
@@ -2362,15 +2362,15 @@
 <translation id="5323128137188992869">Hiermit wird das Streamen von Inhalten an das Gerät über <ph name="PRODUCT_NAME" /> erlaubt.
 
           Wird diese Richtlinie auf "false" gesetzt, ist es Nutzern nicht möglich, Inhalte auf ihr Gerät zu streamen. Wird diese Richtlinie auf "true" gesetzt, können Nutzer Inhalte streamen. Ist diese Richtlinie nicht definiert, so können Nutzer zwar keine Inhalte an angemeldete Chrome OS-Geräte streamen, aber an andere Geräte.</translation>
-<translation id="5325625566921364045">Mit dieser Richtlinie legen Sie fest, wie Daten, die hochgeladen, heruntergeladen oder aus der Zwischenablage bzw. per Drag-and-drop eingefügt werden, in <ph name="PRODUCT_NAME" /> mit Enterprise Rules auf Compliance geprüft werden.
+<translation id="5325625566921364045">Mit dieser Richtlinie legen Sie fest, wie Daten, die hochgeladen, heruntergeladen oder aus der Zwischenablage bzw. per Drag-and-drop eingefügt werden, in <ph name="PRODUCT_NAME" /> auf Einhaltung von Unternehmensregeln geprüft werden.
 
-      Wenn diese Richtlinie nicht konfiguriert oder auf "None" (Keine) gesetzt ist, werden Daten in <ph name="PRODUCT_NAME" /> nicht auf Compliance geprüft.
+      Wenn diese Richtlinie nicht konfiguriert oder auf "Nicht auf Inhaltscompliance prüfen" gesetzt ist, werden Daten in <ph name="PRODUCT_NAME" /> nicht auf Regeleinhaltung geprüft.
 
-      Ist sie auf "Check downloads" (Downloads prüfen) gesetzt und der Nutzer versucht, eine Datei von einer URL herunterzuladen, die in der Richtlinie "<ph name="DOMAINS_TO_CHECK_COMPLIANCE_OF_DOWNLOADED_CONTENT_POLICTY_NAME" />" enthalten ist, werden die Daten in <ph name="PRODUCT_NAME" /> mit Enterprise Rules auf Compliance geprüft.
+      Ist sie auf "Inhaltscompliance von Downloads prüfen" gesetzt und der Nutzer versucht, eine Datei von einer URL herunterzuladen, die in der Richtlinie "<ph name="DOMAINS_TO_CHECK_COMPLIANCE_OF_DOWNLOADED_CONTENT_POLICTY_NAME" />" enthalten ist, werden die Daten in <ph name="PRODUCT_NAME" /> auf Einhaltung von Unternehmensregeln geprüft.
 
-      Wenn die Richtlinie auf "Check uploads" (Uploads prüfen) gesetzt ist und der Nutzer versucht, eine Datei in eine Domain hochzuladen, die nicht in der Richtlinie "<ph name="DOMAINS_TO_NOT_CHECK_COMPLIANCE_OF_UPLOADED_CONTENT_POLICY_NAME" />" enthalten ist, werden die hochgeladene Datei oder die Daten, die aus der Zwischenablage bzw. per Drag-and-drop eingefügt wurden, in <ph name="PRODUCT_NAME" /> mit Enterprise Rules auf Compliance geprüft.
+      Wenn die Richtlinie auf "Inhaltscompliance von Uploads prüfen" gesetzt ist und der Nutzer versucht, eine Datei auf eine Domain hochzuladen, die nicht in der Richtlinie "<ph name="DOMAINS_TO_NOT_CHECK_COMPLIANCE_OF_UPLOADED_CONTENT_POLICY_NAME" />" enthalten ist, werden die hochgeladene Datei oder die Daten, die aus der Zwischenablage bzw. per Drag-and-drop eingefügt wurden, in <ph name="PRODUCT_NAME" /> auf Einhaltung von Unternehmensregeln geprüft.
 
-      Ist sie auf "Check uploads and downloads" (Uploads und Downloads prüfen) gesetzt, werden in <ph name="PRODUCT_NAME" /> die Regeln verwendet, die unter "Check downloads" und "Check uploads" beschrieben sind.
+      Ist sie auf "Inhaltscompliance von Uploads und Downloads prüfen" gesetzt, werden in <ph name="PRODUCT_NAME" /> die Regeln verwendet, die unter "Inhaltscompliance von Downloads prüfen" und "Inhaltscompliance von Uploads prüfen" beschrieben sind.
       </translation>
 <translation id="532848608876725157">DoH-Modus mit unsicherem Fallback-Verhalten aktivieren</translation>
 <translation id="5329007337159326804">Achtung: Die Richtlinie zur TLS-Höchstversion wird voraussichtlich in Version 75 (etwa im Juni 2019) vollständig aus <ph name="PRODUCT_NAME" /> entfernt.
@@ -2393,7 +2393,7 @@
 <translation id="5369937289900051171">Nur Farbdruck</translation>
 <translation id="5370279767682621504">HTTP/0.9-Unterstützung für nicht standardmäßige Ports aktivieren</translation>
 <translation id="5378985487213287085">Ermöglicht Ihnen festzulegen, ob Websites Desktop-Benachrichtigungen anzeigen dürfen. Das Anzeigen von Desktop-Benachrichtigungen kann entweder standardmäßig gestattet oder nicht gestattet werden oder auf Anfrage beim Nutzer geschehen. Wenn diese Richtlinie nicht konfiguriert ist, so kommt "AskNotifications" zum Einsatz, wobei dies vom Nutzer geändert werden kann.</translation>
-<translation id="5380329473151894945">Hiermit wird der Standardstatus der Bedienungshilfe für den großen Cursor auf der Anmeldeseite festgelegt.
+<translation id="5380329473151894945">Hiermit wird der Standardstatus der Bedienungshilfe "großer Cursor" auf der Anmeldeseite festgelegt.
 
           Ist diese Richtlinie auf "true" gesetzt, ist der große Cursor aktiviert, wenn die Anmeldeseite angezeigt wird.
 
@@ -2401,7 +2401,7 @@
 
           Wenn Sie diese Richtlinie konfigurieren, können Nutzer sie vorübergehend überschreiben, indem sie den großen Cursor aktivieren oder deaktivieren. Die Nutzerauswahl wird jedoch nicht beibehalten und die Standardeinstellung wird wiederhergestellt, sobald die Anmeldeseite neu angezeigt wird oder der Nutzer auf der Anmeldeseite eine Minute lang inaktiv ist.
 
-          Falls diese Richtlinie nicht konfiguriert wird, ist der große Cursor deaktiviert, wenn die Anmeldeseite das erste Mal angezeigt wird. Die Nutzer können den großen Cursor jederzeit aktivieren oder deaktivieren und dieser Status bleibt auf der Anmeldeseite erhalten.
+          Wenn diese Richtlinie nicht konfiguriert wird, ist der große Cursor deaktiviert, wenn die Anmeldeseite das erste Mal angezeigt wird. Die Nutzer können den großen Cursor jederzeit aktivieren oder deaktivieren und dieser Status bleibt auf der Anmeldeseite erhalten.
 
           Hinweis: Sofern konfiguriert, überschreibt "<ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />" diese Richtlinie.</translation>
 <translation id="538108065117008131">Verarbeitung der folgenden Inhaltstypen durch <ph name="PRODUCT_FRAME_NAME" /> zulassen</translation>
@@ -2789,7 +2789,7 @@
 <translation id="6034341625190551415">Legt die Typen für öffentliche Sitzungen und Kiosk-Konten fest.</translation>
 <translation id="6034603289689965535">Erlaubt einer Seite, während des Unloads Pop-ups einzublenden</translation>
 <translation id="6036523166753287175">Firewallausnahme über Host für Remotezugriff aktivieren</translation>
-<translation id="6038407313189625985">Ist diese Richtlinie aktiviert oder nicht konfiguriert, ist Renderer Code Integrity aktiviert. Sie sollte nur deaktiviert werden, wenn Kompatibilitätsprobleme mit Drittanbieter-Software auftreten, die innerhalb der Rendererprozesse von Chrome ausgeführt werden muss.
+<translation id="6038407313189625985">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, ist Renderer-Codeintegrität aktiviert. Sie sollte nur deaktiviert werden, wenn Kompatibilitätsprobleme mit Drittanbieter-Software auftreten, die innerhalb der Rendererprozesse von Chrome ausgeführt werden muss.
 
       Eine Deaktivierung hat negative Auswirkungen auf die Sicherheit und Stabilität von Chrome, da dann unbekannter und potenziell schädlicher Code in den Rendererprozessen von Chrome geladen werden kann. Weitere Informationen finden Sie unter: https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md#Process-mitigation-policies.</translation>
 <translation id="605475635122964053">Hiermit wird der PIN-Druckmodus eingeschränkt. Wenn die Richtlinie nicht konfiguriert ist, gelten keine Einschränkungen. Ist der Modus nicht verfügbar, wird diese Richtlinie ignoriert. Der PIN-Druckmodus wird nur für Drucker angewendet, die das IPPS- oder USB-Protokoll bzw. IPP über USB verwenden. </translation>
@@ -2835,9 +2835,9 @@
 <translation id="6141402445226505817">Immer die grobe Erkennung der Zeitzone verwenden</translation>
 <translation id="6145799962557135888">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, denen die Ausführung von JavaScript gestattet ist. Wenn diese Richtlinie nicht konfiguriert ist, kommt für alle Websites entweder der globale Standardwert der Richtlinie "DefaultJavaScriptSetting", falls konfiguriert, oder der persönlichen Konfiguration des Nutzers zum Einsatz.</translation>
 <translation id="614662973812186053">Diese Richtlinie steuert zudem die Erfassung von Nutzungs- und Diagnosedaten in Android.</translation>
-<translation id="6150961766041720393">Die Liste der Domains, für die hochgeladene Inhalte oder Daten, die aus der Zwischenablage bzw. per Drag-and-drop eingefügt wurden, nicht auf Compliance geprüft werden müssen.  Diese Richtlinie wird nur verwendet, wenn "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" aktiviert ist.
+<translation id="6150961766041720393">Die Liste der Domains, für die hochgeladene Inhalte oder Daten, die aus der Zwischenablage bzw. per Drag-and-drop eingefügt wurden, nicht auf Regeleinhaltung geprüft werden müssen.  Diese Richtlinie wird nur verwendet, wenn "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" aktiviert ist.
 
-      Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, werden alle Inhalte auf Compliance geprüft.
+      Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, werden alle Inhalte auf Regeleinhaltung geprüft.
       </translation>
 <translation id="6153048425064249648">Mit dieser Richtlinie wird festgelegt, ob Cloud-Berichte für <ph name="PRODUCT_NAME" /> erstellt werden. Dabei werden Daten zum Betrieb des Browsers an die Google Admin-Konsole gesendet.
 
@@ -2913,15 +2913,15 @@
 <translation id="6281043242780654992">Konfiguriert Richtlinien für das native Messaging. Hosts für natives Messaging auf der schwarzen Liste können nur geladen werden, wenn sie auch auf der weißen Liste stehen.</translation>
 <translation id="6282799760374509080">Audioaufzeichnung gestatten oder ablehnen</translation>
 <translation id="6284362063448764300">TLS 1.1</translation>
-<translation id="6305895953906663275">Mit dieser Richtlinie wird festgelegt, was in <ph name="PRODUCT_NAME" /> passiert, wenn ein Nutzer versucht, Dateien hoch- oder herunterzuladen, die aufgrund ihrer Größe nicht zum Scannen auf Malware oder Inhaltscompliance gesendet werden können (50 MB oder größer).  Die Beschränkung gilt nur für Dateien, die gemäß den folgenden Richtlinien gescannt werden müssen: "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />", "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" und die Richtlinien, über die die Listen der Domains gesteuert werden, für die Überprüfungen aktiviert sind.
+<translation id="6305895953906663275">Mit dieser Richtlinie wird festgelegt, was in <ph name="PRODUCT_NAME" /> passiert, wenn ein Nutzer versucht, Dateien hoch- oder herunterzuladen, die aufgrund ihrer Größe nicht auf Malware oder Inhaltscompliance gescannt werden können (50 MB oder größer).  Die Beschränkung gilt nur für Dateien, die gemäß den folgenden Richtlinien gescannt werden müssen: "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />", "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" und die Richtlinien, über die die Listen der Domains gesteuert werden, für die Überprüfungen aktiviert sind.
 
-      Wenn diese Richtlinie nicht konfiguriert oder auf "None" (Keine) gesetzt ist, gibt es in <ph name="PRODUCT_NAME" /> keine Größenbeschränkung für den Up- oder Download von Dateien.
+      Wenn diese Richtlinie nicht konfiguriert oder auf "Große Dateien nicht blockieren" gesetzt ist, gibt es in <ph name="PRODUCT_NAME" /> keine Größenbeschränkung für den Up- oder Download von Dateien.
 
-      Ist sie auf "Block large downloads" (Große Downloads blockieren) gesetzt, werden Dateien, die aufgrund ihrer Größe nicht gescannt werden können, gelöscht.  Die Größe lässt sich nicht immer vor dem Download ermitteln. Aus diesem Grund werden Dateien eventuell in <ph name="PRODUCT_NAME" /> heruntergeladen, bevor erkannt wird, dass sie zu groß sind.
+      Ist sie auf "Große Dateidownloads blockieren" gesetzt, werden Dateien, die aufgrund ihrer Größe nicht gescannt werden können, gelöscht.  Die Größe lässt sich nicht immer vor dem Download ermitteln. Aus diesem Grund werden Dateien eventuell in <ph name="PRODUCT_NAME" /> heruntergeladen, bevor erkannt wird, dass sie zu groß sind.
 
-      Ist diese Richtlinie auf "Block large uploads" (Große Uploads blockieren) gesetzt, lassen sich Dateien, die aufgrund ihrer Größe nicht gescannt werden können, nicht zum Hochladen auswählen.
+      Ist diese Richtlinie auf "Große Dateiuploads blockieren" gesetzt, lassen sich Dateien, die aufgrund ihrer Größe nicht gescannt werden können, nicht zum Hochladen auswählen.
 
-      Wenn sie auf "Block large file uploads and downloads" (Große Uploads und Downloads blockieren) gesetzt ist, werden in <ph name="PRODUCT_NAME" /> die Regeln angewendet, die unter "Block large downloads" und "Block large uploads" beschrieben sind.
+      Wenn sie auf "Große Dateiuploads und -downloads blockieren" gesetzt ist, werden in <ph name="PRODUCT_NAME" /> die Regeln angewendet, die unter "Große Dateidownloads blockieren" und "Große Dateiuploads blockieren" beschrieben sind.
       </translation>
 <translation id="6310223829319187614">Automatische Vervollständigung des Domainnamens während der Nutzeranmeldung aktivieren</translation>
 <translation id="6315673513957120120">Chrome zeigt eine Seite mit einer Warnmeldung an, wenn Nutzer Websites aufrufen, die SSL-Fehler aufweisen. Standardmäßig oder bei Festlegung von "true" für diese Richtlinie ist es Nutzern gestattet, durch diese Seiten mit Warnmeldung zu klicken.
@@ -3146,7 +3146,7 @@
 
 Ist sie nicht konfiguriert oder auf "true" gesetzt, wird das Standardverhalten verwendet: Die Anmeldung in einem anderen Google-Konto aus dem Inhaltsbereich eines Browsers und in Android-Apps ist dann erlaubt; hiervon ausgenommen sind jedoch Konten für Kinder, bei denen die Anmeldung für den Inhaltsbereich eines Browsers, der nicht im Inkognitomodus ist, blockiert wird.
 
-Falls die Anmeldung in einem anderen Konto über den Inkognitomodus nicht erlaubt ist, können Sie diesen Modus mithilfe der Richtlinie "IncognitoModeAvailability" blockieren.
+Falls die Anmeldung in einem anderen Konto über den Inkognitomodus nicht erlaubt sein soll, können Sie diesen Modus mithilfe der Richtlinie "IncognitoModeAvailability" blockieren.
 
 Hinweis: Nutzer können Cookies blockieren und so auf Google-Dienste zugreifen, die nicht authentifiziert sind.</translation>
 <translation id="6837480141980366278">Legt fest, ob der integrierte DNS-Client von  <ph name="PRODUCT_NAME" /> verwendet werden soll.
@@ -3362,7 +3362,7 @@
 
       Wenn die Richtlinie nicht festgelegt ist, kann der Nutzer selbst wählen.</translation>
 <translation id="7145335384492396213">Standardmodus PIN-Druck</translation>
-<translation id="7152605873936173525">Über diese Richtlinie wird der Modus des DoH-Resolvers gesteuert. Bei dieser Richtlinie wird der Standardmodus nur auf Anfrageebene festgelegt. Für bestimmte Anfragetypen kann der Modus überschrieben werden, etwa bei Anfragen zum Auflösen des Hostnamens eines DoH-Servers.
+<translation id="7152605873936173525">Über diese Richtlinie wird der Modus des DoH-Resolvers gesteuert. Bei dieser Richtlinie wird nur der Standardmodus auf Anfrageebene festgelegt. Für bestimmte Anfragetypen kann der Modus überschrieben werden, etwa bei Anfragen zum Auflösen des Hostnamens eines DoH-Servers.
 
       Durch den Modus "<ph name="SECURE_DNS_MODE_OFF" />" wird DoH (DNS over HTTPS) deaktiviert.
 
@@ -3370,9 +3370,9 @@
 
       Im Modus "<ph name="SECURE_DNS_MODE_SECURE" />" werden nur DoH-Anfragen gesendet. Im Fehlerfall ist keine Auflösung möglich.
 
-      Ab <ph name="ANDROID_VERSION" />: Ist DNS-over-TLS aktiviert, werden in <ph name="PRODUCT_NAME" /> keine unsicheren DNS-Anfragen gesendet.
+      Ab <ph name="ANDROID_VERSION" />: Ist DNS over TLS aktiviert, werden in <ph name="PRODUCT_NAME" /> keine unsicheren DNS-Anfragen gesendet.
 
-      Wenn diese Richtlinie nicht konfiguriert ist, sendet der Browser eventuell DoH-Anfragen an einen Resolver, der dem konfigurierten System-Resolver des Nutzers zugewiesen ist.</translation>
+      Wenn diese Richtlinie nicht konfiguriert ist, sendet der Browser eventuell DoH-Anfragen an einen Resolver, der dem vom Nutzer auf Systemebene konfigurierten Resolver zugewiesen ist.</translation>
 <translation id="7158064522994309072">Mit dieser Richtlinie wird festgelegt, welcher Befehl zum Öffnen von URLs in einem alternativen Browser verwendet werden soll.
 
       Wenn die Richtlinie nicht festgelegt ist, wird eine plattformspezifische Standardeinstellung verwendet: Bei Windows wird der Internet Explorer geöffnet und bei Mac OS X Safari. Unter Linux wird kein alternativer Browser geöffnet, wenn die Richtlinie nicht festgelegt ist.
@@ -3531,15 +3531,15 @@
 <translation id="7359307926583593395">
       Diese Richtlinie gilt für die Anmeldeseite. Sehen Sie sich auch die Richtlinie "<ph name="SITE_PER_PROCESS_POLICY_NAME" />" für die eigentliche Nutzersitzung an. Es wird empfohlen, für beide Richtlinien denselben Wert festzulegen. Wenn die Werte nicht übereinstimmen, kann es beim Beginn einer Nutzersitzung zu einer Verzögerung kommen, weil der von der Nutzerrichtlinie angegebene Wert erst angewendet werden muss.
       </translation>
-<translation id="7360181094056034924">Mit dieser Richtlinie wird festgelegt, was in <ph name="PRODUCT_NAME" /> mit hochgeladenen und heruntergeladenen Daten passiert, die gescannt werden müssen.  Wird die Bereitstellung hinausgezögert, kann der Nutzer in <ph name="PRODUCT_NAME" /> nicht auf eine heruntergeladene Datei zugreifen, keine Datei zum Upload auswählen und keine Daten aus der Zwischenablage oder per Drag-and-drop einfügen, bis sie gescannt wurden und die Ergebnisse des Scans vorliegen.  Die Beschränkung gilt nur für Dateien oder Daten, die gemäß den folgenden Richtlinien gescannt werden müssen: "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />", "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" und die Richtlinien, über die die Listen der Domains gesteuert werden, für die Überprüfungen aktiviert sind.
+<translation id="7360181094056034924">Mit dieser Richtlinie wird festgelegt, was in <ph name="PRODUCT_NAME" /> mit hochgeladenen und heruntergeladenen Daten passiert, die gescannt werden müssen.  Wird die Bereitstellung hinausgezögert, kann der Nutzer in <ph name="PRODUCT_NAME" /> nicht auf eine heruntergeladene Datei zugreifen, Dateien zum Upload nicht auswählen und Daten aus der Zwischenablage oder per Drag-and-drop nicht einfügen, bis sie gescannt wurden und die Ergebnisse des Scans vorliegen.  Die Beschränkung gilt nur für Dateien oder Daten, die gemäß den folgenden Richtlinien gescannt werden müssen: "<ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />", "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" und die Richtlinien, über die die Listen der Domains gesteuert werden, für die Überprüfungen aktiviert sind.
 
-      Wenn diese Richtlinie nicht konfiguriert oder auf "None" (Keine) gesetzt ist, gibt es in <ph name="PRODUCT_NAME" /> keine Verzögerungen für Dateien zum Upload, den Zugriff auf heruntergeladene Dateien oder Daten, die aus der Zwischenablage oder per Drag-and-drop eingefügt werden sollen.  Der Scan wird im Hintergrund ausgeführt.
+      Wenn diese Richtlinie nicht konfiguriert oder auf "Bereitstellungen nicht hinauszögern" gesetzt ist, gibt es in <ph name="PRODUCT_NAME" /> keine Verzögerungen für Dateien zum Upload, den Zugriff auf heruntergeladene Dateien oder Daten, die aus der Zwischenablage oder per Drag-and-drop eingefügt werden sollen.  Der Scan wird im Hintergrund ausgeführt.
 
-      Ist die Richtlinie auf "Delay downloads" (Downloads hinauszögern) gesetzt, können Nutzer erst auf heruntergeladene Dateien zugreifen, wenn diese gescannt wurden und die Ergebnisse des Scans vorliegen.
+      Ist die Richtlinie auf "Downloads hinauszögern, bis Scanergebnisse vorliegen" gesetzt, können Nutzer erst auf heruntergeladene Dateien zugreifen, wenn diese gescannt wurden und die Ergebnisse des Scans vorliegen.
 
-      Wenn die Richtlinie auf "Delay uploads" (Uploads hinauszögern) gesetzt ist und der Nutzer versucht, eine Datei hochzuladen oder Daten aus der Zwischenablage bzw. per Drag-and-drop einzufügen, wird der Vorgang erst fortgesetzt, wenn die Daten gescannt wurden und die Ergebnisse des Scans vorliegen.
+      Wenn die Richtlinie auf "Uploads hinauszögern, bis Scanergebnisse vorliegen" gesetzt ist und der Nutzer versucht, eine Datei hochzuladen oder Daten aus der Zwischenablage bzw. per Drag-and-drop einzufügen, wird der Vorgang erst fortgesetzt, wenn die Daten gescannt wurden und die Ergebnisse des Scans vorliegen.
 
-      Wenn "Delay both uploads and downloads" (Uploads und Downloads hinauszögern) festgelegt ist, werden in <ph name="PRODUCT_NAME" /> die Regeln verwendet, die unter "Delay downloads" und "Delay uploads" beschrieben sind.
+      Wenn "Uploads und Downloads hinauszögern, bis Scanergebnisse vorliegen" festgelegt ist, werden in <ph name="PRODUCT_NAME" /> die Regeln verwendet, die unter "Downloads hinauszögern, bis Scanergebnisse vorliegen" und "Uploads hinauszögern, bis Scanergebnisse vorliegen" beschrieben sind.
       </translation>
 <translation id="7372831798009983116">Bedienungshilfe "Automatisch klicken" aktivieren</translation>
 <translation id="737655323154569539">Dadurch wird die Druckseitengröße eingeschränkt. Ist die Richtlinie nicht konfiguriert, wird keine Einschränkung angewendet.</translation>
@@ -3703,9 +3703,9 @@
 <translation id="7713608076604149344">Download-Einschränkungen</translation>
 <translation id="7715711044277116530">Prozentsatz für die Skalierung der Spanne für die Bildschirmabdunkelung im Präsentationsmodus</translation>
 <translation id="7717938661004793600">Hiermit konfigurieren Sie die Zugänglichkeitsfunktionen für <ph name="PRODUCT_OS_NAME" />.</translation>
-<translation id="7744220323108979821">Hiermit wird die Liste der Domains angegeben, für die heruntergeladene Inhalte auf Compliance geprüft werden müssen, bevor sie lokal gespeichert werden.  Diese Richtlinie wird nur verwendet, wenn "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" aktiviert ist.
+<translation id="7744220323108979821">Hiermit wird die Liste der Domains angegeben, für die heruntergeladene Inhalte auf Regeleinhaltung geprüft werden müssen, bevor sie lokal gespeichert werden.  Diese Richtlinie wird nur verwendet, wenn "<ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" />" aktiviert ist.
 
-      Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, werden heruntergeladene Inhalte nicht auf Compliance geprüft.
+      Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, werden heruntergeladene Inhalte nicht auf Regeleinhaltung geprüft.
       </translation>
 <translation id="7747447585227954402">Geräten erlauben, <ph name="PLUGIN_VM_NAME" /> auf <ph name="PRODUCT_OS_NAME" /> zu verwenden</translation>
 <translation id="7749402620209366169">Aktiviert die Zwei-Faktor-Authentifizierung für Remotezugriff-Hosts anstelle einer vom Nutzer angegebenen PIN.
@@ -3976,11 +3976,11 @@
 
       Wird die Richtlinie auf "false" gesetzt, werden keine Statistiken gemeldet.
       Wird die Richtlinie auf "true" gesetzt oder nicht konfiguriert, werden Statistiken gemeldet.</translation>
-<translation id="829337533107201925">Ist diese Richtlinie aktiviert, werden Richtlinien aus atomischen Gruppen, die eine andere Quelle als die höchste Priorität der entsprechenden Gruppe haben, ignoriert.
+<translation id="829337533107201925">Ist diese Richtlinie aktiviert, werden Richtlinien aus atomischen Gruppen, die eine andere Quelle als die Quelle mit der höchsten Priorität der entsprechenden Gruppe haben, ignoriert.
 
       Wenn die Richtlinie deaktiviert ist, werden Richtlinien nicht aufgrund ihrer Quelle ignoriert. Sie werden dann nur ignoriert, wenn ein Konflikt besteht und sie nicht die höchste Priorität haben.
 
-      Wird diese Richtlinie von einer cloudbasierten Quelle konfiguriert, kann sie nicht auf einen bestimmten Nutzer ausgerichtet werden.</translation>
+      Wird diese Richtlinie von einer cloudbasierten Quelle konfiguriert, kann sie nicht auf bestimmte einzelne Nutzer ausgerichtet werden.</translation>
 <translation id="8294750666104911727">Normalerweise werden Seiten, bei denen das Metatag "X-UA-Compatible" auf "chrome=1" gesetzt ist, unabhängig von der Richtlinie "ChromeFrameRendererSettings" in <ph name="PRODUCT_FRAME_NAME" /> gerendert.
 
           Bei aktivierter Einstellung werden die Seiten nicht nach Metatags durchsucht.
@@ -4081,7 +4081,7 @@
           Beispielmuster finden Sie unter https://www.chromium.org/developers/how-tos/chrome-frame-getting-started.</translation>
 <translation id="8489964335640955763">PluginVm</translation>
 <translation id="8493645415242333585">Speichern des Browserverlaufs deaktivieren</translation>
-<translation id="8495279065011513838">Inhaltscompliance prüfen</translation>
+<translation id="8495279065011513838">Inhalte auf Regeleinhaltung prüfen</translation>
 <translation id="8499172469244085141">Standardeinstellungen (können vom Nutzer überschrieben werden)</translation>
 <translation id="849962487677588458">Diese Richtlinie ist veraltet und soll in Chrome 78 ersatzlos entfernt werden.
 
@@ -4172,7 +4172,7 @@
 <translation id="8685024486845674965">Die Passwortschutzwarnung wird durch die Wiederverwendung eines Passworts ausgelöst</translation>
 <translation id="8693243869659262736">Integrierten DNS-Client verwenden</translation>
 <translation id="8698286761337647563">Gibt an, wie viele Tage SAML-Nutzer vorab benachrichtigt werden, wenn ihr Passwort bald abläuft</translation>
-<translation id="870193046368370542">Die Liste der Domains, für die hochgeladene Inhalte nicht auf Compliance geprüft werden müssen</translation>
+<translation id="870193046368370542">Liste der Domains, für die hochgeladene Inhalte nicht auf Regeleinhaltung geprüft werden müssen</translation>
 <translation id="8703488928438047864">Boardstatus melden</translation>
 <translation id="8704831857353097849">Liste der deaktivierten Plug-ins</translation>
 <translation id="8711086062295757690">Gibt das Suchkürzel an, das als die Verknüpfung fungiert, die in der Omnibox als Auslöser der Suche für diesen Anbieter verwendet wird. Diese Richtlinie ist optional. Wenn sie nicht konfiguriert ist, so wird der Suchanbieter von keinem Suchkürzel aktiviert. Diese Richtlinie wird nur umgesetzt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation>
@@ -4241,7 +4241,7 @@
           Wenn Sie diese Einstellung aktivieren, werden alle Proxyoptionen, die über die Befehlszeile eingegeben werden, von <ph name="PRODUCT_NAME" /> und ARC-Apps ignoriert.
 
           Wird die Richtlinie nicht konfiguriert, so können Nutzer ihre eigenen Proxyeinstellungen vornehmen.</translation>
-<translation id="8852579753940989645">Renderer Code Integrity aktivieren</translation>
+<translation id="8852579753940989645">Renderer-Codeintegrität aktivieren</translation>
 <translation id="8858642179038618439">YouTube-Sicherheitsmodus erzwingen</translation>
 <translation id="8860342862142842017">Erzwingung der Zertifikatstransparenz für eine Liste mit subjectPublicKeyInfo-Hashes deaktivieren</translation>
 <translation id="8864975621965365890">Unterdrückung des Hinweises auf Einstellung des Frames, der beim Rendern einer Website durch <ph name="PRODUCT_FRAME_NAME" /> erscheint</translation>
@@ -4350,7 +4350,7 @@
       Der Wert sollte in Sekunden angegeben werden.</translation>
 <translation id="9035086760683255833">Mit dieser Richtlinie wird die Bedienungshilfe "Objekt mit Tastaturfokus hervorheben" aktiviert.
 
-          Dabei wird das Objekt im Fokus der Tastatur hervorgehoben.
+          Dabei wird das Objekt hervorgehoben, das mit der Tastatur ausgewählt wurde.
 
           Wenn diese Richtlinie aktiviert ist, ist die Funktion immer aktiviert.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index dbeedcd..dd9ac71 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -3370,11 +3370,11 @@
 
       Si la política no se configura, el usuario puede tomar su propia decisión.</translation>
 <translation id="7145335384492396213">Modo de impresión con PIN predeterminado</translation>
-<translation id="7152605873936173525">Controla el modo del agente de resolución DNS sobre HTTPS. Ten en cuenta que esta política solo establecerá el modo predeterminado para cada consulta. Se puede anular el modo en tipos de solicitudes especiales, como las que se usan para resolver el nombre de host de un servidor con el protocolo DNS sobre HTTPS.
+<translation id="7152605873936173525">Controla el modo del agente de resolución de DNS sobre HTTPS. Ten en cuenta que esta política solo establecerá el modo predeterminado para cada consulta. Se puede anular el modo en tipos de solicitudes especiales, como las que se usan para resolver el nombre de host de un servidor con el protocolo DNS sobre HTTPS.
 
       El modo <ph name="SECURE_DNS_MODE_OFF" /> inhabilitará DNS sobre HTTPS.
 
-      El modo <ph name="SECURE_DNS_MODE_AUTOMATIC" /> primero enviará consultas DNS sobre HTTPS si hay un servidor de este tipo disponible. En caso de error, es posible que recurra a solicitudes inseguras.
+      El modo <ph name="SECURE_DNS_MODE_AUTOMATIC" /> primero enviará consultas de DNS sobre HTTPS si hay un servidor de este tipo disponible. En caso de error, es posible que recurra a solicitudes inseguras.
 
       El modo <ph name="SECURE_DNS_MODE_SECURE" /> solo enviará solicitudes de DNS sobre HTTPS. En caso de error, no se resolverá el nombre.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 71eeebdc..80cd523 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -2021,7 +2021,7 @@
 <translation id="4604931264910482931">Konfigurasikan daftar hitam perpesanan asli</translation>
 <translation id="4617338332148204752">Lewati pemeriksaan tag meta pada <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="4625915093043961294">Mengonfigurasi daftar putih pemasangan ekstensi</translation>
-<translation id="4632261735235986857">Melarang pemindaian file</translation>
+<translation id="4632261735235986857">Larang pemindaian file</translation>
 <translation id="4632343302005518762">Izinkan <ph name="PRODUCT_FRAME_NAME" /> menangani jenis konten yang tercantum</translation>
 <translation id="4632566332417930481">Larang penggunaan Developer Tools pada ekstensi yang diinstal oleh kebijakan perusahaan, izinkan penggunaan Developer Tools dalam konteks lainnya</translation>
 <translation id="4633786464238689684">Mengubah perilaku default tombol baris teratas ke tombol fungsi.
@@ -2238,7 +2238,7 @@
 <translation id="5148753489738115745">Memungkinkan Anda menentukan parameter tambahan yang digunakan saat <ph name="PRODUCT_FRAME_NAME" /> meluncurkan <ph name="PRODUCT_NAME" />.
 
           Jika kebijakan ini tidak disetel, baris perintah default akan digunakan.</translation>
-<translation id="5150323673529584553">Tidak memindai file</translation>
+<translation id="5150323673529584553">Jangan pindai file</translation>
 <translation id="5152787786897382519">Chromium dan Google Chrome memiliki beberapa grup kebijakan yang saling bergantung satu sama lain untuk memberikan kontrol terhadap fitur. Kumpulan ini ditunjukkan oleh grup kebijakan berikut. Karena kebijakan dapat memiliki beberapa sumber, hanya nilai yang berasal dari sumber dengan prioritas tertinggi yang akan diterapkan. Nilai yang berasal dari sumber dengan prioritas lebih rendah di grup yang sama akan diabaikan. Urutan prioritas ditentukan di <ph name="POLICY_PRIORITY_DOC_URL" />.</translation>
 <translation id="5159469559091666409">Frekuensi pengiriman paket jaringan pemantauan, dalam milidetik.
 
@@ -4110,7 +4110,7 @@
 
       Jika kebijakan ini ditetapkan ke false atau tidak dikonfigurasi, pengguna dapat menggunakan browser tanpa harus login ke <ph name="PRODUCT_NAME" />.</translation>
 <translation id="858309738002328421">Blokir upload file berukuran besar</translation>
-<translation id="8585558195682146109">Mengirimkan download pengguna untuk pemindaian</translation>
+<translation id="8585558195682146109">Kirimkan download pengguna untuk pemindaian</translation>
 <translation id="8586528890725660268">Menentukan printer yang tidak dapat digunakan pengguna.
 
       Kebijakan ini hanya digunakan jika <ph name="PRINTERS_BLACKLIST" /> dipilih untuk <ph name="BULK_PRINTERS_ACCESS_MODE" />.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 175cdb69..dde0d05 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2458,7 +2458,7 @@
 
           Als je dit beleid instelt, kunnen gebruikers dit tijdelijk overschrijven door de grote muisaanwijzer in of uit te schakelen. De keuze van de gebruiker is echter niet permanent en de standaardinstelling wordt hersteld als het inlogscherm opnieuw wordt weergegeven of de gebruiker gedurende een minuut niet actief is op het inlogscherm.
 
-          Als dit beleid niet is ingesteld, wordt de grote muisaanwijzer uitgeschakeld wanneer het inlogscherm voor de eerste keer wordt weergegeven. Gebruikers kunnen de grote muisaanwijzer op elk gewenst moment in- of uitschakelen en de status op het inlogscherm is van toepassing op alle gebruikers.
+          Als dit beleid niet is ingesteld, wordt de grote muisaanwijzer uitgeschakeld wanneer het inlogscherm voor de eerste keer wordt weergegeven. Gebruikers kunnen de grote muisaanwijzer op elk gewenst moment in- of uitschakelen. De status op het inlogscherm is van toepassing op alle gebruikers.
 
           Opmerking: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> overschrijft dit beleid als het is opgegeven.</translation>
 <translation id="538108065117008131"><ph name="PRODUCT_FRAME_NAME" /> toestaan de volgende soorten content te verwerken.</translation>
@@ -4233,7 +4233,7 @@
 
       Als dit beleid is ingesteld op 'False' of niet is geconfigureerd, kan de gebruiker de browser gebruiken zonder in te loggen bij <ph name="PRODUCT_NAME" />.</translation>
 <translation id="858309738002328421">Grote bestandsuploads blokkeren</translation>
-<translation id="8585558195682146109">Gebruikersdownloads verzenden voor scannen</translation>
+<translation id="8585558195682146109">Gebruikersdownloads sturen om te laten scannen</translation>
 <translation id="8586528890725660268">Hiermee worden de printers gespecificeerd die een gebruiker niet kan gebruiken.
 
       Dit beleid wordt alleen gebruikt als <ph name="PRINTERS_BLACKLIST" /> is gekozen voor <ph name="BULK_PRINTERS_ACCESS_MODE" />.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index b14fc0e..080f53f 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2392,7 +2392,7 @@
 
           Если правило не настроено, при первом переходе на экран входа большой курсор будет отключен. Пользователи смогут в любое время включить или отключить большой курсор, и эта настройка будет действовать для всех пользователей на экране входа.
 
-          Примечание. Если настроено правило <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />, его значение будет иметь приоритет над этим правилом.</translation>
+          Примечание. Если настроено правило "<ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />", его значение будет иметь приоритет над этим правилом.</translation>
 <translation id="538108065117008131">Разрешить <ph name="PRODUCT_FRAME_NAME" /> обрабатывать следующие типы содержания.</translation>
 <translation id="5391388690191341203">Локальный аккаунт для автоматического входа</translation>
 <translation id="5392172595902933844">Отправляет информацию о состоянии Android
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 0a6e67a..50d769d 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -4143,7 +4143,7 @@
 
       หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้กำหนดค่า ผู้ใช้จะใช้เบราว์เซอร์ได้โดยไม่ต้องลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /></translation>
 <translation id="858309738002328421">บล็อกการอัปโหลดไฟล์ขนาดใหญ่</translation>
-<translation id="8585558195682146109">ส่งการดาวน์โหลดของผู้ใช้เข้ารับการสแกน</translation>
+<translation id="8585558195682146109">ส่งไฟล์ที่ผู้ใช้ดาวน์โหลดไปสแกน</translation>
 <translation id="8586528890725660268">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานไม่ได้
 
       ใช้นโยบายนี้ต่อเมื่อเลือก <ph name="PRINTERS_BLACKLIST" /> สำหรับโหมด <ph name="BULK_PRINTERS_ACCESS_MODE" /> เท่านั้น
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 4ee44e7..58b149a 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -2066,7 +2066,7 @@
 <translation id="4604931264910482931">Yerel mesajlaşma kara listesini yapılandır</translation>
 <translation id="4617338332148204752"><ph name="PRODUCT_FRAME_NAME" /> cihazında meta etiket kontrolünü atla</translation>
 <translation id="4625915093043961294">Uzantı yükleme beyaz listesini yapılandır</translation>
-<translation id="4632261735235986857">Dosyaları taramayı yasakla</translation>
+<translation id="4632261735235986857">Dosyaların taranmasını yasakla</translation>
 <translation id="4632343302005518762"><ph name="PRODUCT_FRAME_NAME" /> için listelenen içerik türlerini işlemeye izin ver</translation>
 <translation id="4632566332417930481">Kurumsal politika tarafından yüklenen uzantılarda Geliştirici Araçları kullanımına izin verme, diğer bağlamlarda Geliştirici Araçları kullanımına izin ver</translation>
 <translation id="4633786464238689684">Üst sıra tuşlarının varsayılan davranışını işlev tuşları olarak değiştirir.
@@ -2448,15 +2448,15 @@
 <translation id="5378985487213287085">Web sitelerinin masaüstü bildirimleri görüntülemesine izin verilip verilmeyeceğini ayarlamanıza olanak tanır. Varsayılan olarak masaüstü bildirimlerinin görüntülenmesine izin verilebilir, varsayılan olarak bu reddedilebilir veya bir web sitesi her masaüstü bildirimi gösterme isteğinde bulunduğunda kullanıcıya sorulabilir.
 
           Bu politika ayarlanmadan bırakılırsa, 'AskNotifications' kullanılır ve kullanıcı ayarı değiştirebilir.</translation>
-<translation id="5380329473151894945">Giriş ekranında büyük imleç kullanılan erişilebilirlik özelliğinin durumunu ayarlayın.
+<translation id="5380329473151894945">Giriş ekranında büyük imleç erişilebilirlik özelliğinin durumunu ayarlayın.
 
           Bu politika true (doğru) değerine ayarlanırsa giriş ekranı gösterildiğinde büyük imleç etkinleştirilir.
 
           Bu politika false (yanlış) değerine ayarlanırsa giriş ekranı gösterildiğinde büyük imleç devre dışı bırakılır.
 
-          Bu politikayı ayarlarsanız kullanıcılar büyük imleci etkinleştirerek veya devre dışı bırakarak geçici olarak geçersiz kılabilirler. Bununla birlikte, kullanıcının yaptığı seçim kalıcı olmaz ve giriş ekranı yeniden gösterildiğinde veya kullanıcı giriş ekranında bir dakika süreyle işlem yapmazsa varsayılan ayar geri yüklenir.
+          Bu politikayı ayarlarsanız kullanıcılar büyük imleci etkinleştirerek veya devre dışı bırakarak geçici olarak geçersiz kılabilirler. Bununla birlikte, kullanıcının yaptığı seçim kalıcı değildir. Giriş ekranı yeniden gösterildiğinde veya kullanıcı giriş ekranında bir dakika süreyle işlem yapmazsa varsayılan ayar geri yüklenir.
 
-          Bu politika ayarlanmadan bırakılırsa, giriş ekranı ilk kez gösterildiğinde büyük imleç devre dışı bırakılır. Kullanıcılar istedikleri zaman büyük imleci etkinleştirebilir veya devre dışı bırakabilirler ve bu durum kullanıcı değiştiğinde de giriş ekranında kalmaya devam eder.
+          Bu politika ayarlanmadan bırakılırsa giriş ekranı ilk kez gösterildiğinde büyük imleç devre dışı bırakılır. Kullanıcılar istedikleri zaman büyük imleci etkinleştirebilir veya devre dışı bırakabilirler. İmlecin durumu kullanıcı değiştiğinde de aynı kalır.
 
           Not: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> belirtilmişse bu politikayı geçersiz kılar.</translation>
 <translation id="538108065117008131"><ph name="PRODUCT_FRAME_NAME" /> için aşağıdaki içerik türlerini işlemeye izin ver.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 36ad1ede..c8f67be 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -2416,7 +2416,7 @@
 
           Якщо для цього правила вибрано значення false, великий курсор на екрані входу буде вимкнено.
 
-          Якщо це правило налаштовано, користувачі можуть тимчасово замінювати його, вмикаючи або вимикаючи великий курсор. Проте вибір користувача не буде постійним. Значення за умовчанням відновиться, коли знову з'явиться екран входу або користувач нічого не робитиме на ньому впродовж хвилини.
+          Якщо це правило налаштовано, користувачі можуть тимчасово замінювати його, увімкнувши або вимкнувши великий курсор. Проте вибір користувача не буде постійним. Значення за умовчанням відновиться, коли знову з'явиться екран входу або користувач нічого не робитиме на ньому впродовж хвилини.
 
           Якщо це правило не налаштовано, великий курсор вимикається під час першої появи екрана входу. Його можна будь-коли увімкнути чи вимкнути. Такий вибір на екрані входу діятиме для всіх користувачів.
 
@@ -4179,7 +4179,7 @@
 
       Якщо це правило не налаштовано або для нього вибрано значення "False", користувач зможе працювати у веб-переглядачі, не входячи в профіль <ph name="PRODUCT_NAME" />.</translation>
 <translation id="858309738002328421">Блокувати додавання великих файлів</translation>
-<translation id="8585558195682146109">Надсилати завантаження на перевірку</translation>
+<translation id="8585558195682146109">Надсилати завантажені файли на перевірку</translation>
 <translation id="8586528890725660268">Указує принтери, недоступні для користувачів.
 
       Це правило застосовується, якщо для <ph name="BULK_PRINTERS_ACCESS_MODE" /> вибрано <ph name="PRINTERS_BLACKLIST" />.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 3bd3beb..80a0a3a8 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -429,7 +429,7 @@
       </translation>
 <translation id="1700811900332333712">Cho phép thiết bị yêu cầu chức năng Powerwash</translation>
 <translation id="1708496595873025510">Đặt giới hạn cho quá trình tìm nạp khởi đầu Biến thể</translation>
-<translation id="1715151459541210849">Bật tính năng hỗ trợ tiếp cận nhập bằng giọng nói</translation>
+<translation id="1715151459541210849">Bật tính năng hỗ trợ tiếp cận về đọc chính tả</translation>
 <translation id="1717817358640580294">Nếu bạn không đặt chính sách này và tính năng Làm sạch Chrome phát hiện phần mềm không mong muốn, thì tính năng này có thể báo cáo siêu dữ liệu về lần quét đó cho Google theo chính sách do SafeBrowsingExtendedReportingEnabled đặt. Sau đó, tính năng Làm sạch Chrome sẽ hỏi người dùng xem họ có muốn xóa phần mềm không mong muốn hay không. Người dùng có thể chọn chia sẻ kết quả của quá trình làm sạch với Google để hỗ trợ việc phát hiện phần mềm không mong muốn trong tương lai. Những kết quả này chứa siêu dữ liệu tệp, tiện ích tự động cài đặt và khóa sổ đăng ký như mô tả trong Báo cáo chính thức về quyền riêng tư của Chrome.
 
       Nếu bạn tắt tùy chọn cài đặt này và tính năng Làm sạch Chrome phát hiện thấy phần mềm không mong muốn, thì tính năng này sẽ không báo cáo siêu dữ liệu về lần quét đó cho Google, ghi đè bất kỳ chính sách nào do SafeBrowsingExtendedReportingEnabled đặt. Tính năng Làm sạch Chrome sẽ hỏi người dùng xem họ có muốn xóa phần mềm không mong muốn hay không.  Kết quả của quá trình làm sạch sẽ không được báo cáo cho Google và người dùng sẽ không có tùy chọn để làm như vậy.
@@ -468,7 +468,7 @@
 <translation id="1793346220873697538">Tắt tính năng in mã PIN theo mặc định</translation>
 <translation id="1797233582739332495">Hiển thị lời nhắc định kỳ cho người dùng cho biết bắt buộc phải chạy lại</translation>
 <translation id="1798559516913615713">Thời gian tồn tại của bộ nhớ đệm GPO</translation>
-<translation id="1802205074307397126">Trì hoãn tệp tải lên cho đến khi biết kết quả quét</translation>
+<translation id="1802205074307397126">Trì hoãn tải tệp lên cho đến khi biết kết quả quét</translation>
 <translation id="1803646570632580723">Danh sách các ứng dụng được ghim sẽ hiển thị trong trình chạy</translation>
 <translation id="1808715480127969042">Chặn cookie trên các trang web này</translation>
 <translation id="1810261428246410396">Cho phép sử dụng tính năng Chia sẻ kết nối tức thì.</translation>
@@ -863,17 +863,17 @@
 
       Nếu chính sách này được đặt thành Sai, thông báo lỗi sẽ được hiển thị thay vì lời nhắc về cấu hình mạng.</translation>
 <translation id="2498238926436517902">Luôn tự động ẩn giá</translation>
-<translation id="250670737672448119">Bật tính năng hỗ trợ tiếp cận đánh dấu điểm chèn.
+<translation id="250670737672448119">Bật tính năng hỗ trợ tiếp cận về làm nổi bật dấu chèn.
 
-          Tính năng này giúp bạn đánh dấu vị trí xung quanh điểm chèn khi chỉnh sửa.
+          Tính năng này giúp bạn làm nổi bật khu vực xung quanh dấu chèn khi chỉnh sửa.
 
-          Nếu bạn đặt chính sách này thành bật, thì tính năng đánh dấu điểm chèn sẽ luôn bật.
+          Nếu bạn đặt chính sách này thành bật, thì tính năng làm nổi bật dấu chèn sẽ luôn bật.
 
-          Nếu bạn đặt chính sách này thành tắt, thì tính năng đánh dấu điểm chèn sẽ luôn tắt.
+          Nếu bạn đặt chính sách này thành tắt, thì tính năng làm nổi bật dấu chèn sẽ luôn tắt.
 
           Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
-          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng đánh dấu điểm chèn sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
+          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng làm nổi bật dấu chèn sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
 <translation id="2514328368635166290">Chỉ định URL biểu tượng yêu thích của nhà cung cấp dịch vụ tìm kiếm mặc định.
 
           Chính sách này là tùy chọn. Nếu không thiết lập chính sách này, sẽ không có biểu tượng nào được hiển thị cho nhà cung cấp dịch vụ tìm kiếm.
@@ -1184,7 +1184,7 @@
           Khi bạn không đặt chính sách này, hoạt động của các chính sách cụ thể hơn sẽ không bị ảnh hưởng.</translation>
 <translation id="2987155890997901449">Bật ARC</translation>
 <translation id="2987227569419001736">Kiểm soát việc sử dụng API Web Bluetooth</translation>
-<translation id="2989466284538293869">Kiểm tra tính tuân thủ nội dung của tệp tải lên</translation>
+<translation id="2989466284538293869">Kiểm tra tính tuân thủ nội dung của tệp đã tải lên</translation>
 <translation id="3011301228198307065">Định cấu hình URL trang chủ mặc định trong <ph name="PRODUCT_NAME" /> và ngăn không cho người dùng thay đổi URL đó.
 
           Trang chủ là trang mở ra khi người dùng nhấn nút Trang chủ. Các trang mở ra khi khởi động chịu sự kiểm soát của chính sách RestoreOnStartup.
@@ -1201,7 +1201,7 @@
 <translation id="3016255526521614822">Đưa các ứng dụng ghi chú được phép trên màn hình khóa của <ph name="PRODUCT_OS_NAME" /> vào danh sách cho phép</translation>
 <translation id="3021562480854470924">Số mốc cho phép khôi phục</translation>
 <translation id="3023572080620427845">URL của một tệp XML chứa các URL sẽ tải trên một trình duyệt thay thế.</translation>
-<translation id="3026740867910702435">Bật tính năng hỗ trợ tiếp cận con trỏ lớn trên màn hình đăng nhập.
+<translation id="3026740867910702435">Bật tính năng hỗ trợ tiếp cận về con trỏ lớn trên màn hình đăng nhập.
 
           Nếu bạn đặt chính sách này thành true, thì con trỏ lớn sẽ luôn bật trên màn hình đăng nhập.
 
@@ -1349,7 +1349,7 @@
       Nếu cài đặt này được bật hoặc không được định cấu hình, người dùng có thể bật proxy máy in máy chủ ảo bằng cách xác thực bằng tài khoản Google của họ.
 
       Nếu cài đặt này được bật, người dùng không thể bật proxy và máy sẽ không được phép chia sẻ máy in với <ph name="CLOUD_PRINT_NAME" />.</translation>
-<translation id="3307971460556020865">Chặn tệp tải lên và tệp tải xuống có kích thước lớn</translation>
+<translation id="3307971460556020865">Chặn tải lên và tải xuống tệp có kích thước lớn</translation>
 <translation id="3312206664202507568">Cho phép một trang tại chrome://password-change cho phép người dùng SAML đổi mật khẩu SAML ngay trong phiên đăng nhập. Điều này đảm bảo rằng mật khẩu SAML và mật khẩu màn hình khóa của thiết bị luôn đồng bộ.
 
       Chính sách này cũng cho phép các thông báo cảnh báo người dùng SAML khi mật khẩu SAML của họ sắp hết hạn để họ có thể giải quyết vấn đề này ngay lập tức bằng cách đổi mật khẩu ngay trong phiên đăng nhập.
@@ -1532,7 +1532,7 @@
 <translation id="3711895659073496551">Tạm ngừng</translation>
 <translation id="3715569262675717862">Xác thực dựa trên chứng chỉ ứng dụng khách</translation>
 <translation id="3736879847913515635">Cho phép thêm người trong trình quản lý người dùng</translation>
-<translation id="3737890474637805114">Chặn tệp tải xuống có kích thước lớn</translation>
+<translation id="3737890474637805114">Chặn tải tệp có kích thước lớn xuống</translation>
 <translation id="3738723882663496016">Chính sách này chỉ định khóa cấp phép <ph name="PLUGIN_VM_NAME" /> cho thiết bị này.</translation>
 <translation id="3748900290998155147">Nêu rõ có cho phép tính năng khóa chế độ thức hay không. Các ứng dụng ARC và các tiện ích (thông qua API tiện ích quản lý điện năng) có thể yêu cầu tính năng khóa chế độ thức.
 
@@ -1687,7 +1687,7 @@
           Nếu không được đặt hoặc được đặt thành False thì người dùng có thể chuyển các tệp đến Google Drive.</translation>
 <translation id="3915395663995367577">URL tới một tệp .pac proxy</translation>
 <translation id="3925377537407648234">Đặt độ phân giải màn hình và hệ số tỷ lệ</translation>
-<translation id="3936481697920057199">Kiểm tra tính tuân thủ nội dung của tệp tải lên và tệp tải xuống</translation>
+<translation id="3936481697920057199">Kiểm tra tính tuân thủ nội dung của tệp đã tải lên và tệp đã tải xuống</translation>
 <translation id="3939893074578116847">Gửi gói mạng tới máy chủ quản lý để theo dõi trạng thái trực tuyến, để cho phép
       máy chủ phát hiện xem thiết bị có ngoại tuyến hay không.
 
@@ -1714,7 +1714,7 @@
       Khi bạn đặt chính sách này thành true, thì Chrome sẽ tìm cách chạy một số URL trong trình duyệt thay thế (chẳng hạn như Internet Explorer). Tính năng này được định cấu hình bằng các chính sách trong nhóm <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />.
 
       Tính năng này thay thế cho tiện ích <ph name="LEGACY_BROWSER_SUPPORT_EXTENSION_NAME" />. Mặc dù cấu hình từ tiện ích sẽ được chuyển sang tính năng này, nhưng thay vào đó bạn nên sử dụng các chính sách của Chrome. Điều này đảm bảo khả năng tương thích cao hơn trong tương lai.</translation>
-<translation id="3993187551086357615">Trì hoãn cả tệp tải lên và tệp tải xuống cho đến khi biết kết quả quét</translation>
+<translation id="3993187551086357615">Trì hoãn cả tải tệp lên và tải tệp xuống cho đến khi biết kết quả quét</translation>
 <translation id="3997519162482760140">URL sẽ được cấp quyền truy cập thiết bị quay video trên các trang đăng nhập SAML</translation>
 <translation id="4001275826058808087">Quản trị viên CNTT của thiết bị doanh nghiệp có thể sử dụng cờ này để kiểm soát xem có cho phép người dùng đổi phiếu mua hàng thông qua Đăng ký Chrome OS hay không.
 
@@ -1868,9 +1868,9 @@
 <translation id="420512303455129789">Từ điển ánh xạ các URL đến cờ boolean nêu rõ nên cho phép (true) hay chặn (false) quyền truy cập đến máy chủ lưu trữ.
 
           Chính sách này dành cho <ph name="PRODUCT_NAME" /> sử dụng nội bộ.</translation>
-<translation id="4209297478239988291">Bật tính năng hỗ trợ tiếp cận tự động nhấp.
+<translation id="4209297478239988291">Bật tính năng hỗ trợ tiếp cận về tự động nhấp.
 
-          Nhờ có tính năng này, bạn chỉ cần di chuột qua đối tượng muốn nhấp mà không cần nhấn chuột hoặc bàn di chuột.
+          Khi bật tính năng này, hệ thống sẽ tự động nhấp mà bạn không cần phải dùng tay ấn vào con chuột hoặc bàn di chuột. Bạn chỉ cần di chuột đến đối tượng muốn nhấp.
 
           Nếu bạn đặt chính sách này thành bật, thì tính năng tự động nhấp sẽ luôn bật.
 
@@ -2043,7 +2043,7 @@
           Nếu đặt chính sách này thành false, thì <ph name="PRODUCT_NAME" /> sẽ bị tắt.</translation>
 <translation id="4510923771103268849">Người dùng được phép truy cập gốc vào vùng chứa Crostini</translation>
 <translation id="4515404363392014383">Bật tính năng Duyệt web an toàn cho các nguồn đáng tin cậy</translation>
-<translation id="4517928394515633751">Quét tệp tải xuống của người dùng bằng tính năng Duyệt web an toàn</translation>
+<translation id="4517928394515633751">Quét tệp người dùng đã tải xuống bằng tính năng Duyệt web an toàn</translation>
 <translation id="4518251772179446575">Hỏi bất cứ khi nào trang web muốn theo dõi vị trí thực của người dùng.</translation>
 <translation id="4519046672992331730">Bật đề xuất tìm kiếm trong thanh địa chỉ của <ph name="PRODUCT_NAME" /> và không cho phép người dùng thay đổi cài đặt này.
 
@@ -2127,7 +2127,7 @@
 
           Nếu bạn không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ không ủy quyền thông tin xác thực cho người dùng ngay cả khi máy chủ được phát hiện là mạng nội bộ.</translation>
 <translation id="4752880493649142945">Chứng chỉ ứng dụng để kết nối với RemoteAccessHostTokenValidationUrl</translation>
-<translation id="4757053978738874325">Bật tính năng hỗ trợ tiếp cận đơn âm.
+<translation id="4757053978738874325">Bật tính năng hỗ trợ tiếp cận về đơn âm.
 
           Tính năng này giúp bạn tạo ra âm thanh nổi, trong đó có các kênh bên phải và bên trái khác nhau nên mỗi tai nghe sẽ có âm thanh khác nhau.
 
@@ -2423,15 +2423,15 @@
 <translation id="5323128137188992869">Cho phép truyền nội dung đến thiết bị này bằng cách sử dụng <ph name="PRODUCT_NAME" />.
 
           Nếu bạn đặt chính sách này thành False, người dùng sẽ không thể truyền nội dung đến thiết bị của họ. Nếu bạn đặt chính sách này thành True, người dùng sẽ được phép truyền nội dung. Nếu bạn không đặt chính sách này, người dùng sẽ không được phép truyền nội dung đến thiết bị Chrome OS đã đăng ký, nhưng có thể truyền đến các thiết bị không được đăng ký.</translation>
-<translation id="5325625566921364045">Kiểm soát cách <ph name="PRODUCT_NAME" /> kiểm tra dữ liệu đã tải lên, tải xuống, dán từ khay nhớ tạm hoặc kéo và thả xem có tuân thủ các quy tắc của doanh nghiệp hay không.
+<translation id="5325625566921364045">Kiểm soát cách <ph name="PRODUCT_NAME" /> kiểm tra dữ liệu được tải lên, tải xuống, dán từ khay nhớ tạm hoặc kéo và thả xem có tuân thủ các quy tắc của doanh nghiệp hay không.
 
       Nếu bạn không đặt hoặc đặt chính sách này thành 'None', thì <ph name="PRODUCT_NAME" /> sẽ không kiểm tra tính tuân thủ của bất kỳ dữ liệu nào.
 
-      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp tải xuống' và người dùng cố tải tệp xuống từ một URL trong chính sách <ph name="DOMAINS_TO_CHECK_COMPLIANCE_OF_DOWNLOADED_CONTENT_POLICTY_NAME" />, thì <ph name="PRODUCT_NAME" /> sẽ kiểm tra dữ liệu tải xuống xem có tuân thủ các quy tắc của doanh nghiệp hay không.
+      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp đã tải xuống' và người dùng cố tải tệp xuống từ một URL trong chính sách <ph name="DOMAINS_TO_CHECK_COMPLIANCE_OF_DOWNLOADED_CONTENT_POLICTY_NAME" />, thì <ph name="PRODUCT_NAME" /> sẽ kiểm tra dữ liệu tải xuống xem có tuân thủ các quy tắc của doanh nghiệp hay không.
 
-      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp tải lên' và người dùng cố tải tệp lên một miền không có trong <ph name="DOMAINS_TO_NOT_CHECK_COMPLIANCE_OF_UPLOADED_CONTENT_POLICY_NAME" />, thì <ph name="PRODUCT_NAME" /> sẽ kiểm tra tệp đã tải lên, dữ liệu đã dán từ khay nhớ tạm hoặc dữ liệu đã kéo và thả xem có tuân thủ các quy tắc của doanh nghiệp hay không.
+      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp đã tải lên' và người dùng cố tải tệp lên một miền không có trong <ph name="DOMAINS_TO_NOT_CHECK_COMPLIANCE_OF_UPLOADED_CONTENT_POLICY_NAME" />, thì <ph name="PRODUCT_NAME" /> sẽ kiểm tra tệp được tải lên, dữ liệu đã dán từ khay nhớ tạm hoặc dữ liệu đã kéo và thả xem có tuân thủ các quy tắc của doanh nghiệp hay không.
 
-      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp tải lên và tệp tải xuống', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Kiểm tra tệp tải xuống' và 'Kiểm tra tệp tải lên'.
+      Nếu bạn đặt chính sách này thành 'Kiểm tra tệp đã tải lên và tệp đã tải xuống', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Kiểm tra tệp đã tải xuống' và 'Kiểm tra tệp đã tải lên'.
       </translation>
 <translation id="532848608876725157">Bật chế độ DNS qua HTTPS có phương án dự phòng cho truy vấn không an toàn</translation>
 <translation id="5329007337159326804">Cảnh báo: Chúng tôi sẽ xóa hoàn toàn chính sách phiên bản TLS tối đa khỏi <ph name="PRODUCT_NAME" /> từ khoảng phiên bản 75 (vào khoảng tháng 6 năm 2019).
@@ -2456,17 +2456,17 @@
 <translation id="5378985487213287085">Cho phép bạn đặt liệu các trang web có được phép hiển thị thông báo trên màn hình hay không. Việc hiển thị thông báo trên màn hình có thể được cho phép theo mặc định, từ chối theo mặc định hoặc người dùng có thể được hỏi mỗi lần trang web muốn hiển thị thông báo trên màn hình.
 
           Nếu không thiết lập chính sách này, 'AskNotifications' sẽ được sử dụng và người dùng có thể thay đổi cài đặt này.</translation>
-<translation id="5380329473151894945">Đặt trạng thái mặc định cho tính năng hỗ trợ tiếp cận con trỏ lớn trên màn hình đăng nhập.
+<translation id="5380329473151894945">Đặt trạng thái mặc định cho tính năng hỗ trợ tiếp cận về con trỏ lớn trên màn hình đăng nhập.
 
           Nếu bạn đặt chính sách này thành true, thì con trỏ lớn sẽ bật khi màn hình đăng nhập hiển thị.
 
           Nếu bạn đặt chính sách này thành false, thì con trỏ lớn sẽ tắt khi màn hình đăng nhập hiển thị.
 
-          Nếu bạn đặt chính sách này, thì người dùng có thể tạm thời ghi đè chính sách bằng cách bật hoặc tắt con trỏ lớn. Tuy nhiên, lựa chọn này không cố định và tùy chọn mặc định sẽ được khôi phục mỗi khi màn hình đăng nhập hiển thị lại hoặc người dùng không dùng màn hình đăng nhập trong 1 phút.
+          Nếu bạn đặt chính sách này, thì người dùng có thể tạm thời ghi đè chính sách bằng cách bật hoặc tắt con trỏ lớn. Tuy nhiên, sự lựa chọn của người dùng là không cố định và chế độ mặc định sẽ được khôi phục mỗi khi màn hình đăng nhập hiển thị lại hoặc người dùng không dùng màn hình đăng nhập trong 1 phút.
 
           Nếu bạn không đặt chính sách này, thì con trỏ lớn sẽ tắt khi màn hình đăng nhập hiển thị lần đầu. Người dùng có thể bật hoặc tắt con trỏ lớn bất cứ lúc nào và trạng thái của con trỏ trên màn hình đăng nhập sẽ được duy trì giữa những người dùng.
 
-          Lưu ý: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> sẽ ghi đè chính sách này nếu chính sách trước đó được chỉ định.</translation>
+          Lưu ý: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> (nếu đã được chỉ định) sẽ ghi đè chính sách này.</translation>
 <translation id="538108065117008131">Cho phép <ph name="PRODUCT_FRAME_NAME" /> xử lý các loại nội dung sau.</translation>
 <translation id="5391388690191341203">Tự động đăng nhập vào tài khoản trên thiết bị</translation>
 <translation id="5392172595902933844">Thông tin về trạng thái của Android được gửi lại cho
@@ -2493,7 +2493,7 @@
 <translation id="5405289061476885481">Định cấu hình bố cục bàn phím được cho phép trên màn hình đăng nhập <ph name="PRODUCT_OS_NAME" />.
 
       Nếu chính sách này được đặt thành danh sách số nhận dạng phương thức nhập, phương thức nhập được cung cấp sẽ có sẵn trên màn hình đăng nhập. Phương thức nhập được cung cấp đầu tiên sẽ được chọn sẵn. Mặc dù nhóm người dùng được lấy tiêu điểm trên màn hình đăng nhập, phương thức nhập được sử dụng gần đây nhất của người dùng sẽ có sẵn ngoài phương thức nhập được cung cấp bởi chính sách này. Nếu chính sách này chưa được đặt, các phương thức nhập trên màn hình đăng nhập sẽ được lấy từ ngôn ngữ mà màn hình đăng nhập hiển thị. Các giá trị không phải số nhận dạng phương thức nhập hợp lệ sẽ bị bỏ qua.</translation>
-<translation id="540659115481372611">Kiểm tra tính tuân thủ nội dung của các tệp tải xuống</translation>
+<translation id="540659115481372611">Kiểm tra tính tuân thủ nội dung của các tệp đã tải xuống</translation>
 <translation id="5412057811596122582">Nếu bạn bật hoặc không định cấu hình chính sách này (mặc định), người dùng sẽ được nhắc
       cấp quyền truy cập ghi âm, ngoại trừ các URL được định cấu hình trong danh sách
       AudioCaptureAllowedUrls sẽ được cấp quyền truy cập mà không hiển thị lời nhắc.
@@ -2693,7 +2693,7 @@
           Nếu bạn bật hoặc không đặt chính sách này, người dùng có thể xem mật khẩu của họ ở dạng văn bản rõ ràng trong trình quản lý mật khẩu.</translation>
 <translation id="5620392548325769024">Bật chế độ hiển thị trang chào mừng vào lần đầu tiên chạy trình duyệt sau khi nâng cấp hệ điều hành</translation>
 <translation id="5630352020869108293">Khôi phục phiên trước đó</translation>
-<translation id="5633871703004128675">Bật tính năng hỗ trợ tiếp cận đánh dấu điểm chèn</translation>
+<translation id="5633871703004128675">Bật tính năng hỗ trợ tiếp cận về làm nổi bật dấu chèn</translation>
 <translation id="5643906875497889108">Kiểm soát những loại ứng dụng/tiện ích được phép cài đặt và hạn chế truy cập trong thời gian chạy.
 
           Tùy chọn cài đặt này đưa vào danh sách cho phép những loại tiện ích/ứng dụng mà người dùng có thể cài đặt trong <ph name="PRODUCT_NAME" />, cũng như những máy chủ mà các tiện ích/ứng dụng này có thể tương tác. Giá trị này là một danh sách các chuỗi. Mỗi chuỗi trong danh sách này phải là một trong những chuỗi sau: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Hãy xem tài liệu về tiện ích <ph name="PRODUCT_NAME" /> để biết thêm thông tin về các loại này.
@@ -3015,11 +3015,11 @@
 
       Nếu bạn không đặt hoặc đặt chính sách này thành 'None', thì <ph name="PRODUCT_NAME" /> sẽ cho phép người dùng tải lên hoặc tải xuống các tệp có kích thước bất kỳ.
 
-      Nếu bạn đặt chính sách này thành 'Chặn tệp tải xuống có kích thước lớn', thì các tệp không quét được do kích thước quá lớn sẽ bị xóa trước khi hiển thị với người dùng.  Do không phải lúc nào cũng xác định được kích thước trước khi tải xuống nên <ph name="PRODUCT_NAME" /> có thể tải tệp xuống rồi mới xác định xem các tệp đó có vượt quá giới hạn kích thước cho phép hay không.
+      Nếu bạn đặt chính sách này thành 'Chặn tải tệp có kích thước lớn xuống', thì các tệp không quét được do kích thước quá lớn sẽ bị xóa trước khi hiển thị với người dùng.  Do không phải lúc nào cũng xác định được kích thước trước khi tải xuống nên <ph name="PRODUCT_NAME" /> có thể tải tệp xuống rồi mới xác định xem các tệp đó có vượt quá giới hạn kích thước cho phép hay không.
 
-      Nếu bạn đặt chính sách này thành 'Chặn tệp tải lên có kích thước lớn', thì sẽ không thể chọn các tệp không quét được do kích thước quá lớn để tải lên.
+      Nếu bạn đặt chính sách này thành 'Chặn tải tệp có kích thước lớn lên', thì các tệp quá lớn không thể quét được sẽ không được chọn để tải lên.
 
-      Nếu bạn đặt chính sách này thành 'Chặn tệp tải lên và tệp tải xuống có kích thước lớn', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Chặn tệp tải xuống có kích thước lớn' và 'Chặn tệp tải lên có kích thước lớn'.
+      Nếu bạn đặt chính sách này thành 'Chặn tải lên và tải xuống các tệp có kích thước lớn', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Chặn tải tệp có kích thước lớn xuống' và 'Chặn tải tệp có kích thước lớn lên'.
       </translation>
 <translation id="6310223829319187614">Bật tự động hoàn tất tên miền trong khi người dùng đăng nhập</translation>
 <translation id="6315673513957120120">Chrome hiển thị trang cảnh báo khi người dùng truy cập các trang web gặp lỗi SSL. Theo mặc định hoặc khi chính sách này được đặt thành true, người dùng được phép nhấp qua các trang cảnh báo này.
@@ -3259,7 +3259,7 @@
       Nếu bạn không đặt hoặc đặt chính sách này thành tắt, thì <ph name="PRODUCT_NAME" /> sẽ không báo cáo các sự kiện không an toàn.
       </translation>
 <translation id="684856667300805181">Chính sách này đã bị xóa trong <ph name="PRODUCT_NAME" /> 68 và thay thế bằng <ph name="ARC_GLS_POLICY_NAME" />.</translation>
-<translation id="6851199885688265233">Bật tính năng hỗ trợ tiếp cận đánh dấu con trỏ</translation>
+<translation id="6851199885688265233">Bật tính năng hỗ trợ tiếp cận về làm nổi bật con trỏ</translation>
 <translation id="6856743875250214792">Chính sách này không được dùng nữa và đã bị xóa trong M66, vì chính sách này trước đây chỉ dùng để kiểm tra nội bộ và tiềm ẩn nguy cơ bảo mật.
 
       Chỉ định cờ sẽ được áp dụng cho <ph name="PRODUCT_NAME" /> khi khởi động. Cờ được chỉ định sẽ chỉ được áp dụng trên màn hình đăng nhập. Các cờ được đặt qua chính sách này không phản ánh trong các phiên của người dùng.</translation>
@@ -3506,7 +3506,7 @@
 <translation id="7177857088692019405">Mở khóa nhanh</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">Các loại kết nối được cho phép để cập nhật</translation>
-<translation id="7190286937411178540">Bật tính năng hỗ trợ tiếp cận đánh dấu tiêu điểm bằng bàn phím</translation>
+<translation id="7190286937411178540">Bật tính năng hỗ trợ tiếp cận về làm nổi bật tiêu điểm bằng bàn phím</translation>
 <translation id="7194407337890404814">Tên nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
 <translation id="7199304109870655950">Định cấu hình tùy chọn truy cập từ xa trên máy chủ Chrome Remote Desktop.
 
@@ -3647,17 +3647,17 @@
 <translation id="7359307926583593395">
       Chính sách này áp dụng cho màn hình đăng nhập. Vui lòng xem cả chính sách <ph name="SITE_PER_PROCESS_POLICY_NAME" /> áp dụng cho phiên người dùng. Bạn nên đặt cả hai chính sách về cùng một giá trị. Nếu các giá trị không khớp nhau, thì có thể xảy ra tình trạng chậm trễ khi vào một phiên người dùng mặc dù đang áp dụng giá trị do chính sách người dùng chỉ định.
       </translation>
-<translation id="7360181094056034924">Kiểm soát hành vi của <ph name="PRODUCT_NAME" /> đối với dữ liệu đã tải lên và tải xuống được cho là cần quét.  Việc trì hoãn phân phối nghĩa là <ph name="PRODUCT_NAME" /> sẽ không cho phép người dùng truy cập vào tệp tải xuống, chọn tệp để tải lên, dán từ khay nhớ tạm hoặc kéo và thả dữ liệu cho đến khi quét xong và có kết quả quét.  Hạn chế này chỉ áp dụng với các tệp hoặc dữ liệu cần quét theo yêu cầu của <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> và các chính sách kiểm soát danh sách miền được phép thực hiện quá trình kiểm tra.
+<translation id="7360181094056034924">Kiểm soát hành vi của <ph name="PRODUCT_NAME" /> đối với dữ liệu đã tải lên và tải xuống được cho là cần quét.  Việc trì hoãn phân phối nghĩa là <ph name="PRODUCT_NAME" /> sẽ không cho phép người dùng truy cập vào tệp tải đã xuống, chọn tệp để tải lên, dán từ khay nhớ tạm hoặc kéo và thả dữ liệu cho đến khi quét xong và có kết quả quét.  Hạn chế này chỉ áp dụng với các tệp hoặc dữ liệu cần quét theo yêu cầu của <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> và các chính sách kiểm soát danh sách miền được phép thực hiện quá trình kiểm tra.
 
-      Nếu bạn không đặt hoặc đặt chính sách này thành 'None', thì <ph name="PRODUCT_NAME" /> sẽ không trì hoãn tải tệp lên, dán từ khay nhớ tạm, kéo và thả dữ liệu hoặc trì hoãn truy cập vào bất kỳ tệp tải xuống nào.  Quá trình quét này sẽ thực hiện trong nền.
+      Nếu bạn không đặt hoặc đặt chính sách này thành 'None', thì <ph name="PRODUCT_NAME" /> sẽ không trì hoãn tải tệp lên, dán từ khay nhớ tạm, kéo và thả dữ liệu hoặc trì hoãn truy cập vào bất kỳ tệp đã tải xuống nào.  Quá trình quét này sẽ thực hiện trong nền.
 
-      Nếu bạn đặt chính sách này thành 'Trì hoãn tệp tải xuống', thì người dùng sẽ không thể truy cập vào các tệp tải xuống cho đến khi quét xong và có kết quả quét.
+      Nếu bạn đặt chính sách này thành 'Trì hoãn tải tệp xuống', thì người dùng sẽ không thể truy cập vào các tệp tải xuống cho đến khi quét xong và có kết quả quét.
 
-      Nếu bạn đặt chính sách này thành 'Trì hoãn tệp tải lên' và người dùng cố tải tệp lên, dán từ khay nhớ tạm hoặc kéo và thả dữ liệu, thì hoạt động này sẽ không thực hiện được cho đến khi quét xong dữ liệu và có kết quả quét.
+      Nếu bạn đặt chính sách này thành 'Trì hoãn tải tệp lên' và người dùng cố tải tệp lên, dán từ khay nhớ tạm hoặc kéo và thả dữ liệu, thì hoạt động này sẽ không thực hiện được cho đến khi quét xong dữ liệu và có kết quả quét.
 
-      Nếu bạn đặt chính sách này thành 'Trì hoãn cả tệp tải lên và tệp tải xuống', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Trì hoãn tệp tải xuống' và 'Trì hoãn tệp tải lên'.
+      Nếu bạn đặt chính sách này thành 'Trì hoãn cả tải tệp lên và tải tệp xuống', thì <ph name="PRODUCT_NAME" /> sẽ hoạt động theo các quy tắc nêu trong phần 'Trì hoãn tải tệp xuống' và 'Trì hoãn tải tệp lên'.
       </translation>
-<translation id="7372831798009983116">Bật tính năng hỗ trợ tiếp cận tự động nhấp</translation>
+<translation id="7372831798009983116">Bật tính năng hỗ trợ tiếp cận về tự động nhấp</translation>
 <translation id="737655323154569539">Hạn chế kích thước trang in. Nếu bạn không đặt hoặc để trống chính sách, thì hệ thống sẽ coi là không có hạn chế.</translation>
 <translation id="7389872682701720082">Nếu bạn bật tùy chọn cài đặt này, các plugin không bị lỗi thời sẽ luôn chạy.
 
@@ -3679,7 +3679,7 @@
 <translation id="7458437477941640506">Không thể khôi phục về phiên bản đích nếu phiên bản hệ điều hành mới hơn phiên bản đích. Các bản cập nhật cũng sẽ bị tắt.</translation>
 <translation id="7464991223784276288">Hạn chế cookie so khớp các URL với phiên hiện tại</translation>
 <translation id="7469554574977894907">Bật đề xuất tìm kiếm</translation>
-<translation id="7477231245051133709">Bật tính năng hỗ trợ tiếp cận đơn âm</translation>
+<translation id="7477231245051133709">Bật tính năng hỗ trợ tiếp cận về đơn âm</translation>
 <translation id="7485481791539008776">Quy tắc chọn máy in mặc định</translation>
 <translation id="7485730741952775732">Nếu bạn đặt chính sách này, máy chủ truy cập từ xa sẽ dùng URL này để xác thực mã xác thực từ các ứng dụng truy cập từ xa để chấp nhận kết nối. Phải sử dụng chính sách này cùng với RemoteAccessHostTokenUrl.
 
@@ -4030,17 +4030,17 @@
 
       Nếu chính sách được đặt ở trạng thái tắt hoặc không được đặt, việc đăng nhập sẽ dẫn tới cấu hình thông thường.</translation>
 <translation id="8158758865057576716">Bật tạo bản sao chuyển vùng cho dữ liệu hồ sơ của <ph name="PRODUCT_NAME" />.</translation>
-<translation id="8159760979508295709">Bật tính năng hỗ trợ tiếp cận đánh dấu con trỏ.
+<translation id="8159760979508295709">Bật tính năng hỗ trợ tiếp cận về làm nổi bật con trỏ.
 
           Tính năng này giúp bạn đánh dấu vị trí xung quanh con trỏ chuột trong khi di chuyển.
 
-          Nếu bạn đặt chính sách này thành bật, thì tính năng đánh dấu con trỏ sẽ luôn bật.
+          Nếu bạn đặt chính sách này thành bật, thì tính năng làm nổi bật con trỏ sẽ luôn bật.
 
-          Nếu bạn đặt chính sách này thành tắt, thì tính năng đánh dấu con trỏ sẽ luôn tắt.
+          Nếu bạn đặt chính sách này thành tắt, thì tính năng làm nổi bật con trỏ sẽ luôn tắt.
 
           Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
-          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng đánh dấu con trỏ sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
+          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng làm nổi bật con trỏ sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
 <translation id="8172676363520748127">Nếu bạn bật chính sách này, người dùng sẽ không thể chụp ảnh màn hình bằng phím tắt hoặc các API tiện ích.
 
       Nếu bạn tắt hoặc không chỉ định chính sách này, người dùng sẽ được phép chụp ảnh màn hình.</translation>
@@ -4082,24 +4082,24 @@
 <translation id="8274603902181597201">Xóa thư mục chính ecryptf của người dùng và bắt đầu bằng một thư mục chính mới được mã hóa ext4.</translation>
 <translation id="8285435910062771358">Đã bật kính lúp toàn màn hình</translation>
 <translation id="8288199156259560552">Bật Dịch vụ vị trí của Google trên thiết bị Android</translation>
-<translation id="8290875622178450531">Bật tính năng hỗ trợ tiếp cận nhập bằng giọng nói.
+<translation id="8290875622178450531">Bật tính năng hỗ trợ tiếp cận về đọc chính tả.
 
-          Nếu bạn đặt chính sách này thành bật, thì tính năng nhập bằng giọng nói sẽ luôn bật.
+          Nếu bạn đặt chính sách này thành bật, thì tính năng đọc chính tả sẽ luôn bật.
 
-          Nếu bạn đặt chính sách này thành tắt, thì tính năng nhập bằng giọng nói sẽ luôn tắt.
+          Nếu bạn đặt chính sách này thành tắt, thì tính năng đọc chính tả nói sẽ luôn tắt.
 
           Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
-          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng nhập bằng giọng nói sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
+          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng đọc chính tả sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
 <translation id="8292322992383748446">Báo cáo thống kê phần cứng cho các thành phần SoC.
 
       Nếu bạn đặt chính sách này thành false, thì số liệu thống kê sẽ không được báo cáo.
       Nếu bạn đặt chính sách này thành true hoặc không đặt, thì số liệu thống kê sẽ được báo cáo.</translation>
-<translation id="829337533107201925">Nếu bạn bật chính sách này, thì các chính sách trong nhóm không thể phân chia không có chung nguồn với các chính sách có mức độ ưu tiên cao nhất trong nhóm đó sẽ bị bỏ qua.
+<translation id="829337533107201925">Nếu bạn bật chính sách này, thì các chính sách từ một nhóm không thể phân chia không có chung nguồn với các chính sách có mức độ ưu tiên cao nhất trong nhóm đó sẽ bị bỏ qua.
 
       Nếu bạn tắt chính sách này, thì sẽ không có chính sách nào bị bỏ qua do nguồn liên quan nữa. Các chính sách sẽ chỉ bị bỏ qua nếu có xung đột và chính sách này không có mức độ ưu tiên cao nhất.
 
-      Nếu bạn đặt chính sách này từ một nguồn trên đám mây, thì chính sách sẽ không thể nhắm mục tiêu một người dùng cụ thể</translation>
+      Nếu bạn đặt chính sách này từ một nguồn trên đám mây, thì chính sách sẽ không thể nhắm đến một người dùng cụ thể</translation>
 <translation id="8294750666104911727">Thông thường các trang có Tương thích với X-UA được đặt thành chrome=1 sẽ được hiển thị trong <ph name="PRODUCT_FRAME_NAME" /> bất kể chính sách 'ChromeFrameRendererSettings'.
 
           Nếu bạn bật cài đặt này, trang sẽ không được quét tìm thẻ meta.
@@ -4255,8 +4255,8 @@
       Nếu bạn đặt chính sách này thành true, người dùng sẽ phải đăng nhập vào <ph name="PRODUCT_NAME" /> bằng hồ sơ của họ trước khi sử dụng trình duyệt. Giá trị mặc định của BrowserGuestModeEnabled sẽ được đặt thành false. Lưu ý rằng các hồ sơ chưa ký hiện tại sẽ bị khóa và không truy cập được sau khi bật chính sách này. Để biết thêm thông tin, hãy xem bài viết trên trung tâm trợ giúp.
 
       Nếu bạn đặt chính sách này thành false hoặc chưa định cấu hình, thì người dùng có thể sử dụng trình duyệt mà không cần đăng nhập vào <ph name="PRODUCT_NAME" />.</translation>
-<translation id="858309738002328421">Chặn tệp tải lên có kích thước lớn</translation>
-<translation id="8585558195682146109">Gửi tệp tải xuống của người dùng để quét</translation>
+<translation id="858309738002328421">Chặn tải tệp có kích thước lớn lên</translation>
+<translation id="8585558195682146109">Gửi các tệp người dùng đã tải xuống để quét</translation>
 <translation id="8586528890725660268">Chỉ định các máy in mà người dùng không thể sử dụng.
 
       Chỉ sử dụng chính sách này nếu đã chọn <ph name="PRINTERS_BLACKLIST" /> cho <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -4492,17 +4492,17 @@
       Chính sách này chỉ ảnh hưởng đến người dùng đã xác thực bằng Ngôn ngữ đánh dấu xác nhận bảo mật (SAML).
 
       Bạn nên chỉ định giá trị tính bằng giây cho chính sách này.</translation>
-<translation id="9035086760683255833">Bật tính năng hỗ trợ tiếp cận đánh dấu tiêu điểm bằng bàn phím.
+<translation id="9035086760683255833">Bật tính năng hỗ trợ tiếp cận về làm nổi bật tiêu điểm bằng bàn phím.
 
-          Tính năng này giúp bạn đánh dấu đối tượng có tiêu điểm bằng bàn phím.
+          Tính năng này giúp bạn làm nổi bật đối tượng có tiêu điểm bằng bàn phím.
 
-          Nếu bạn đặt chính sách này thành bật, thì tính năng đánh dấu tiêu điểm bằng bàn phím sẽ luôn bật.
+          Nếu bạn đặt chính sách này thành bật, thì tính năng làm nổi bật tiêu điểm bằng bàn phím sẽ luôn bật.
 
-          Nếu bạn đặt chính sách này thành tắt, thì tính năng đánh dấu tiêu điểm bằng bàn phím sẽ luôn tắt.
+          Nếu bạn đặt chính sách này thành tắt, thì tính năng làm nổi bật tiêu điểm bằng bàn phím sẽ luôn tắt.
 
           Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
-          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng đánh dấu tiêu điểm bằng bàn phím sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
+          Nếu bạn không đặt chính sách này, thì ban đầu, tính năng làm nổi bật tiêu điểm bằng bàn phím sẽ tắt nhưng người dùng có thể bật bất cứ lúc nào.</translation>
 <translation id="9035964157729712237">Các ID tiện ích được miễn khỏi danh sách đen</translation>
 <translation id="9038839118379817310">Bật Wi-Fi</translation>
 <translation id="9039822628127365650">Khi bạn đặt chính sách này, chính sách sẽ chỉ định thời lượng mà sau đó một người dùng tự động bị đăng xuất, chấm dứt phiên. Người dùng được thông báo về thời gian còn lại bằng đồng hồ đếm ngược hiển thị trong khay hệ thống.
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 7f0bbd1..8a8aa39 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2372,13 +2372,13 @@
 
           如果將這項政策設為 True,系統會在登入畫面顯示時啟用大型游標。
 
-          如果將這項政策設為 True,系統會在登入畫面顯示時停用大型游標。
+          如果將這項政策設為 False,系統會在登入畫面顯示時停用大型游標。
 
           設定這項政策後,使用者可以啟用或停用大型游標以暫時覆寫此政策。不過,使用者的選擇並非持續有效;每當系統顯示新的登入畫面,或使用者在登入畫面上閒置一分鐘後,系統便會還原預設設定。
 
-          如果不設定這項政策,系統會在初次顯示登入畫面時停用大型游標。使用者隨時可以啟用或停用大型游標,這項功能在登入畫面中的狀態,會在不同使用者之間持續下去。
+          如果不設定這項政策,系統會在初次顯示登入畫面時停用大型游標。使用者隨時可以啟用或停用大型游標,且所有使用者的登入畫面將一律維持相同的狀態。
 
-          注意:如果你已指定 <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />,這項政策會遭到覆寫。</translation>
+          注意:如果指定 <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />,這項政策會遭到覆寫。</translation>
 <translation id="538108065117008131">允許 <ph name="PRODUCT_FRAME_NAME" /> 處理下列內容類型。</translation>
 <translation id="5391388690191341203">用於自動登入的裝置本機帳戶</translation>
 <translation id="5392172595902933844">將 Android 狀態的相關資訊傳回
diff --git a/components/policy/test_support/policy_testserver.py b/components/policy/test_support/policy_testserver.py
index dbf49275..0c1f76fa 100644
--- a/components/policy/test_support/policy_testserver.py
+++ b/components/policy/test_support/policy_testserver.py
@@ -1004,7 +1004,12 @@
       # policy config file.
       for field in group_message.DESCRIPTOR.fields:
         field_value = None
-        if field.name in policies:
+        full_name = '{}.{}'.format(group.name, field.name)
+        if full_name in policies:
+          got_fields = True
+          field_value = policies[full_name]
+          self.SetProtobufMessageField(group_message, field, field_value)
+        elif field.name in policies:
           got_fields = True
           field_value = policies[field.name]
           self.SetProtobufMessageField(group_message, field, field_value)
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
index edfb453..6fc74421 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -853,6 +853,9 @@
     bool actual_fullscreen_state) {
   in_fullscreen_transition_ = false;
 
+  // Add any children that were skipped during the fullscreen transition.
+  OrderChildren();
+
   if (has_deferred_window_close_) {
     [ns_window() close];
     return;
diff --git a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
index 2d11612..20abd0e 100644
--- a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
+++ b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
@@ -81,6 +81,18 @@
         }
     }
 
+    /**
+     * TODO(crbug.com/995926): Make this call async
+     * Starts a Safe Browsing Allowlist check.
+     *
+     * If the uri is in the allowlist, return true. Otherwise, return false.
+     */
+    @CalledByNative
+    private static boolean startAllowlistLookup(
+            SafeBrowsingApiHandler handler, String uri, int[] threatsOfInterest) {
+        return handler.startAllowlistLookup(uri, threatsOfInterest);
+    }
+
     private static native boolean nativeAreLocalBlacklistsEnabled();
     private static native void nativeOnUrlCheckDone(
             long callbackId, int resultStatus, String metadata, long checkDelta);
diff --git a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java
index 328863b..850f379b 100644
--- a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java
+++ b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java
@@ -71,4 +71,20 @@
      * This is called on every URL resource Chrome loads, on the same sequence as |init|.
      */
     public void startUriLookup(long callbackId, String uri, int[] threatsOfInterest);
+
+    /**
+     * Start a check to determine if a uri is in a set of allowlists. If true, password protection
+     * service will assume the url to be safe and skip it. This feature is not applicable to Android
+     * Webview, because there is no saved password or GAIA password in AW.
+     *
+     * @param uri The uri from a password protection event(user focuses on password form
+     *      * or user reuses their password)
+     * @param threatsOfInterest determines the type of allowlists that the uri will be matched to.
+     *
+     * @return true if the uri is found in the set of allowlists. Otherwise, false.
+     */
+    // TODO(xinghuilu@): remove default once downstream implementation is patched
+    default boolean startAllowlistLookup(String uri, int[] threatsOfInterest) {
+        return false;
+    }
 }
diff --git a/components/safe_browsing/android/remote_database_manager.cc b/components/safe_browsing/android/remote_database_manager.cc
index 055ed6c..876f60b 100644
--- a/components/safe_browsing/android/remote_database_manager.cc
+++ b/components/safe_browsing/android/remote_database_manager.cc
@@ -271,8 +271,17 @@
 AsyncMatch RemoteSafeBrowsingDatabaseManager::CheckCsdWhitelistUrl(
     const GURL& url,
     Client* client) {
-  // TODO(crbug.com/995926): Enable CSD allowlist on Android
-  return AsyncMatch::NO_MATCH;
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  // If this URL's scheme isn't supported, call is safe.
+  if (!CanCheckUrl(url)) {
+    return AsyncMatch::MATCH;
+  }
+
+  // TODO(crbug.com/995926): Make this call async
+  SafeBrowsingApiHandler* api_handler = SafeBrowsingApiHandler::GetInstance();
+  bool is_match = api_handler->StartCSDAllowlistCheck(url);
+  return is_match ? AsyncMatch::MATCH : AsyncMatch::NO_MATCH;
 }
 
 bool RemoteSafeBrowsingDatabaseManager::MatchDownloadWhitelistString(
diff --git a/components/safe_browsing/android/remote_database_manager_unittest.cc b/components/safe_browsing/android/remote_database_manager_unittest.cc
index cb07c70..b49312a 100644
--- a/components/safe_browsing/android/remote_database_manager_unittest.cc
+++ b/components/safe_browsing/android/remote_database_manager_unittest.cc
@@ -27,6 +27,7 @@
   void StartURLCheck(std::unique_ptr<URLCheckCallbackMeta> callback,
                      const GURL& url,
                      const SBThreatTypeSet& threat_types) override {}
+  bool StartCSDAllowlistCheck(const GURL& url) override { return false; }
 };
 
 }  // namespace
diff --git a/components/safe_browsing/android/safe_browsing_api_handler.h b/components/safe_browsing/android/safe_browsing_api_handler.h
index c82a765..f1896df 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler.h
+++ b/components/safe_browsing/android/safe_browsing_api_handler.h
@@ -36,6 +36,8 @@
                              const GURL& url,
                              const SBThreatTypeSet& threat_types) = 0;
 
+  virtual bool StartCSDAllowlistCheck(const GURL& url) = 0;
+
   virtual ~SafeBrowsingApiHandler() {}
 
  private:
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc b/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc
index 19c2555b..2e5fc4ad 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc
+++ b/components/safe_browsing/android/safe_browsing_api_handler_bridge.cc
@@ -63,6 +63,8 @@
       return safe_browsing::JAVA_THREAT_TYPE_POTENTIALLY_HARMFUL_APPLICATION;
     case SB_THREAT_TYPE_URL_UNWANTED:
       return safe_browsing::JAVA_THREAT_TYPE_UNWANTED_SOFTWARE;
+    case SB_THREAT_TYPE_CSD_WHITELIST:
+      return safe_browsing::JAVA_THREAT_TYPE_CSD_ALLOWLIST;
     default:
       NOTREACHED();
       return 0;
@@ -118,8 +120,6 @@
                               jint result_status,
                               const std::string metadata) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DVLOG(1) << __FUNCTION__ << ": check: " << callback_id
-           << " status: " << result_status << " metadata: [" << metadata << "]";
 
   PendingCallbacksMap* pending_callbacks = GetPendingCallbacksMapOnIOThread();
   bool found = base::Contains(*pending_callbacks, callback_id);
@@ -137,7 +137,6 @@
       CHECK(!callback->is_null());  // Remove after fixing crbug.com/889972
 
       ReportUmaResult(UMA_STATUS_TIMEOUT);
-      DVLOG(1) << "Safe browsing API call timed-out";
     } else {
       CHECK(!callback->is_null());  // Remove after fixing crbug.com/889972
 
@@ -162,9 +161,6 @@
     ThreatMetadata threat_metadata;
     ReportUmaResult(
         ParseJsonFromGMSCore(metadata, &worst_threat, &threat_metadata));
-    if (worst_threat != SB_THREAT_TYPE_SAFE) {
-      DVLOG(1) << "Check " << callback_id << " was a MATCH";
-    }
 
     std::move(*callback).Run(worst_threat, threat_metadata);
   }
@@ -195,10 +191,6 @@
   TRACE_EVENT1("safe_browsing", "SafeBrowsingApiHandlerBridge::OnUrlCheckDone",
                "metadata", metadata_str);
 
-  DVLOG(1) << "OnURLCheckDone invoked for check " << callback_id
-           << " with status=" << result_status << " and metadata=["
-           << metadata_str << "]";
-
   base::PostTask(FROM_HERE, {BrowserThread::IO},
                  base::BindOnce(&OnUrlCheckDoneOnIOThread, callback_id,
                                 result_status, metadata_str));
@@ -215,7 +207,6 @@
 bool SafeBrowsingApiHandlerBridge::CheckApiIsSupported() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (!checked_api_support_) {
-    DVLOG(1) << "Checking API support.";
     j_api_handler_ = base::android::ScopedJavaGlobalRef<jobject>(
         Java_SafeBrowsingApiBridge_create(AttachCurrentThread()));
     checked_api_support_ = true;
@@ -235,7 +226,6 @@
         Java_SafeBrowsingApiBridge_getSafetyNetId(env, j_api_handler_);
     safety_net_id =
         jsafety_net_id ? ConvertJavaStringToUTF8(env, jsafety_net_id) : "";
-    DVLOG(1) << __FUNCTION__ << ": safety_net_id: " << safety_net_id;
   }
 
   return safety_net_id;
@@ -258,7 +248,6 @@
   jlong callback_id = next_callback_id_++;
   GetPendingCallbacksMapOnIOThread()->insert(
       {callback_id, std::move(callback)});
-  DVLOG(1) << "Starting check " << callback_id << " for URL " << url;
 
   DCHECK(!threat_types.empty());
 
@@ -271,4 +260,22 @@
                                             j_url, j_threat_types);
 }
 
+bool SafeBrowsingApiHandlerBridge::StartCSDAllowlistCheck(const GURL& url) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (!CheckApiIsSupported()) {
+    return false;
+  }
+
+  SBThreatTypeSet threat_types(
+      CreateSBThreatTypeSet({safe_browsing::SB_THREAT_TYPE_CSD_WHITELIST}));
+
+  // TODO(crbug.com/999344): Add UMA metrics
+  JNIEnv* env = AttachCurrentThread();
+  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
+  ScopedJavaLocalRef<jintArray> j_threat_types =
+      SBThreatTypeSetToJavaArray(env, threat_types);
+  return Java_SafeBrowsingApiBridge_startAllowlistLookup(env, j_api_handler_,
+                                                         j_url, j_threat_types);
+}
+
 }  // namespace safe_browsing
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_bridge.h b/components/safe_browsing/android/safe_browsing_api_handler_bridge.h
index bc8da6f..040ab09c 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler_bridge.h
+++ b/components/safe_browsing/android/safe_browsing_api_handler_bridge.h
@@ -32,6 +32,8 @@
                      const GURL& url,
                      const SBThreatTypeSet& threat_types) override;
 
+  bool StartCSDAllowlistCheck(const GURL& url) override;
+
  private:
   // Creates the |j_api_handler_| if it hasn't been already.  If the API is not
   // supported, this will return false and j_api_handler_ will remain nullptr.
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_util.cc b/components/safe_browsing/android/safe_browsing_api_handler_util.cc
index 944db05b..aebc6f85c 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler_util.cc
+++ b/components/safe_browsing/android/safe_browsing_api_handler_util.cc
@@ -163,6 +163,8 @@
       return 3;
     case JAVA_THREAT_TYPE_BILLING:
       return 4;
+    case JAVA_THREAT_TYPE_CSD_ALLOWLIST:
+      return 5;
     case JAVA_THREAT_TYPE_MAX_VALUE:
       return std::numeric_limits<int>::max();
   }
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_util.h b/components/safe_browsing/android/safe_browsing_api_handler_util.h
index c33f4ae..c5fd735 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler_util.h
+++ b/components/safe_browsing/android/safe_browsing_api_handler_util.h
@@ -28,6 +28,9 @@
   JAVA_THREAT_TYPE_SOCIAL_ENGINEERING = 5,
   JAVA_THREAT_TYPE_SUBRESOURCE_FILTER = 13,
   JAVA_THREAT_TYPE_BILLING = 15,
+  // TODO(crbug.com/999344): temp magic number, update once GMSCore is
+  // available.
+  JAVA_THREAT_TYPE_CSD_ALLOWLIST = 16,
   JAVA_THREAT_TYPE_MAX_VALUE
 };
 
diff --git a/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc b/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
index be7e177..ea34673 100644
--- a/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
+++ b/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/metrics/histogram_macros_local.h"
 #include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "components/safe_browsing/browser/url_checker_delegate.h"
@@ -170,8 +171,11 @@
       url_checker_delegate_->MaybeDestroyPrerenderContents(
           web_contents_getter_);
     }
-    UMA_HISTOGRAM_ENUMERATION("SB2.ResourceTypes2.UnsafePrefetchCanceled",
-                              resource_type_);
+    // Record the result of canceled unsafe prefetch. This is used as a signal
+    // for testing.
+    LOCAL_HISTOGRAM_ENUMERATION("SB2Test.ResourceTypes2.UnsafePrefetchCanceled",
+                                resource_type_);
+
     BlockAndProcessUrls(false);
     return;
   }
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
index 8405ba7..2c1c99c 100644
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
@@ -72,9 +72,6 @@
     "SafeBrowsingTriggerThrottlerDailyQuota",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kUseAPDownloadProtection{"UseAPDownloadProtection",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kUseLocalBlacklistsV2{"SafeBrowsingUseLocalBlacklistsV2",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -111,7 +108,6 @@
     {&kThreatDomDetailsTagAndAttributeFeature, false},
     {&kTriggerThrottlerDailyQuotaFeature, false},
     {&kUseLocalBlacklistsV2, true},
-    {&kUseAPDownloadProtection, true},
 };
 
 // Adds the name and the enabled/disabled status of a given feature.
diff --git a/components/safe_browsing/features.h b/components/safe_browsing/features.h
index c6260e1..b8b99205 100644
--- a/components/safe_browsing/features.h
+++ b/components/safe_browsing/features.h
@@ -43,7 +43,7 @@
 
 // Controls whether the user has forcibly enabled AP download protection. This
 // flag will enable AP downloads protections even for users not enrolled in
-// APP. See also |kUseAPDownloadProtection|.
+// APP.
 extern const base::Feature kForceUseAPDownloadProtection;
 
 // Enable GAIA password protection for signed-in users.
@@ -81,10 +81,6 @@
 // trials simultaneously.
 extern const base::Feature kTriggerThrottlerDailyQuotaFeature;
 
-// Controls whether we use AP download protection. This flag only has any effect
-// for users enrolled in APP. See also |kForceUseAPDownloadProtection|.
-extern const base::Feature kUseAPDownloadProtection;
-
 // Controls whether Chrome on Android uses locally cached blacklists.
 extern const base::Feature kUseLocalBlacklistsV2;
 
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h
index 3a2d6e19..bf23783 100644
--- a/components/safe_browsing/password_protection/password_protection_request.h
+++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -166,6 +166,16 @@
   // Called when the visual feature extraction is complete.
   void OnVisualFeatureCollectionDone(
       std::unique_ptr<VisualFeatures> visual_features);
+
+  // Called when the DOM feature extraction is complete.
+  void OnGetDomFeatures(const std::string& verdict);
+
+  // Called when the DOM feature extraction times out.
+  void OnGetDomFeatureTimeout();
+
+  // If appropriate, collects visual features, otherwise continues on to sending
+  // the request.
+  void MaybeCollectVisualFeatures();
 #endif
 
   // Initiates network request to Safe Browsing backend.
@@ -178,18 +188,6 @@
   void Finish(RequestOutcome outcome,
               std::unique_ptr<LoginReputationClientResponse> response);
 
-#if BUILDFLAG(FULL_SAFE_BROWSING)
-  // Called when the DOM feature extraction is complete.
-  void OnGetDomFeatures(const std::string& verdict);
-
-  // Called when the DOM feature extraction times out.
-  void OnGetDomFeatureTimeout();
-
-  // If appropriate, collects visual features, otherwise continues on to sending
-  // the request.
-  void MaybeCollectVisualFeatures();
-#endif
-
   // WebContents of the password protection event.
   content::WebContents* web_contents_;
 
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index f55e4b2..b836d99a 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -83,58 +83,6 @@
          hostname.find('.') != std::string::npos;
 }
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
-bool PasswordProtectionService::ShouldShowModalWarning(
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    LoginReputationClientResponse::VerdictType verdict_type) {
-  if (trigger_type != LoginReputationClientRequest::PASSWORD_REUSE_EVENT ||
-      !IsSupportedPasswordTypeForModalWarning(password_type)) {
-    return false;
-  }
-
-  return (verdict_type == LoginReputationClientResponse::PHISHING ||
-          verdict_type == LoginReputationClientResponse::LOW_REPUTATION) &&
-         IsWarningEnabled(password_type);
-}
-#endif
-
-LoginReputationClientResponse::VerdictType
-PasswordProtectionService::GetCachedVerdict(
-    const GURL& url,
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    LoginReputationClientResponse* out_response) {
-  return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
-}
-
-void PasswordProtectionService::CacheVerdict(
-    const GURL& url,
-    LoginReputationClientRequest::TriggerType trigger_type,
-    ReusedPasswordAccountType password_type,
-    const LoginReputationClientResponse& verdict,
-    const base::Time& receive_time) {}
-
-void PasswordProtectionService::StartRequest(
-    WebContents* web_contents,
-    const GURL& main_frame_url,
-    const GURL& password_form_action,
-    const GURL& password_form_frame_url,
-    const std::string& username,
-    PasswordType password_type,
-    const std::vector<std::string>& matching_domains,
-    LoginReputationClientRequest::TriggerType trigger_type,
-    bool password_field_exists) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  scoped_refptr<PasswordProtectionRequest> request(
-      new PasswordProtectionRequest(
-          web_contents, main_frame_url, password_form_action,
-          password_form_frame_url, username, password_type, matching_domains,
-          trigger_type, password_field_exists, this, GetRequestTimeoutInMS()));
-  request->Start();
-  pending_requests_.insert(std::move(request));
-}
-
 #if defined(ON_FOCUS_PING_ENABLED)
 void PasswordProtectionService::MaybeStartPasswordFieldOnFocusRequest(
     WebContents* web_contents,
@@ -204,8 +152,77 @@
     ShowInterstitial(web_contents, reused_password_account_type);
   }
 }
+
+bool PasswordProtectionService::ShouldShowModalWarning(
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    LoginReputationClientResponse::VerdictType verdict_type) {
+  if (trigger_type != LoginReputationClientRequest::PASSWORD_REUSE_EVENT ||
+      !IsSupportedPasswordTypeForModalWarning(password_type)) {
+    return false;
+  }
+
+  return (verdict_type == LoginReputationClientResponse::PHISHING ||
+          verdict_type == LoginReputationClientResponse::LOW_REPUTATION) &&
+         IsWarningEnabled(password_type);
+}
+
+void PasswordProtectionService::RemoveWarningRequestsByWebContents(
+    content::WebContents* web_contents) {
+  for (auto it = warning_requests_.begin(); it != warning_requests_.end();) {
+    if (it->get()->web_contents() == web_contents)
+      it = warning_requests_.erase(it);
+    else
+      ++it;
+  }
+}
+
+bool PasswordProtectionService::IsModalWarningShowingInWebContents(
+    content::WebContents* web_contents) {
+  for (const auto& request : warning_requests_) {
+    if (request->web_contents() == web_contents)
+      return true;
+  }
+  return false;
+}
 #endif
 
+LoginReputationClientResponse::VerdictType
+PasswordProtectionService::GetCachedVerdict(
+    const GURL& url,
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    LoginReputationClientResponse* out_response) {
+  return LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
+}
+
+void PasswordProtectionService::CacheVerdict(
+    const GURL& url,
+    LoginReputationClientRequest::TriggerType trigger_type,
+    ReusedPasswordAccountType password_type,
+    const LoginReputationClientResponse& verdict,
+    const base::Time& receive_time) {}
+
+void PasswordProtectionService::StartRequest(
+    WebContents* web_contents,
+    const GURL& main_frame_url,
+    const GURL& password_form_action,
+    const GURL& password_form_frame_url,
+    const std::string& username,
+    PasswordType password_type,
+    const std::vector<std::string>& matching_domains,
+    LoginReputationClientRequest::TriggerType trigger_type,
+    bool password_field_exists) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  scoped_refptr<PasswordProtectionRequest> request(
+      new PasswordProtectionRequest(
+          web_contents, main_frame_url, password_form_action,
+          password_form_frame_url, username, password_type, matching_domains,
+          trigger_type, password_field_exists, this, GetRequestTimeoutInMS()));
+  request->Start();
+  pending_requests_.insert(std::move(request));
+}
+
 bool PasswordProtectionService::CanSendPing(
     LoginReputationClientRequest::TriggerType trigger_type,
     const GURL& main_frame_url,
@@ -397,27 +414,6 @@
   return nullptr;
 }
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
-void PasswordProtectionService::RemoveWarningRequestsByWebContents(
-    content::WebContents* web_contents) {
-  for (auto it = warning_requests_.begin(); it != warning_requests_.end();) {
-    if (it->get()->web_contents() == web_contents)
-      it = warning_requests_.erase(it);
-    else
-      ++it;
-  }
-}
-
-bool PasswordProtectionService::IsModalWarningShowingInWebContents(
-    content::WebContents* web_contents) {
-  for (const auto& request : warning_requests_) {
-    if (request->web_contents() == web_contents)
-      return true;
-  }
-  return false;
-}
-#endif
-
 bool PasswordProtectionService::IsWarningEnabled(
     ReusedPasswordAccountType password_type) {
   return GetPasswordProtectionWarningTriggerPref(password_type) ==
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index 5a3f8e1..0f681fcf 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -128,20 +128,7 @@
   // Records a Chrome Sync event that sync password reuse was detected.
   virtual void MaybeLogPasswordReuseDetectedEvent(
       content::WebContents* web_contents) = 0;
-#endif
 
-  scoped_refptr<SafeBrowsingDatabaseManager> database_manager();
-
-  // Safe Browsing backend cannot get a reliable reputation of a URL if
-  // (1) URL is not valid
-  // (2) URL doesn't have http or https scheme
-  // (3) It maps to a local host.
-  // (4) Its hostname is an IP Address in an IANA-reserved range.
-  // (5) Its hostname is a not-yet-assigned by ICANN gTLD.
-  // (6) Its hostname is a dotless domain.
-  static bool CanGetReputationOfURL(const GURL& url);
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // If we want to show password reuse modal warning.
   bool ShouldShowModalWarning(
       LoginReputationClientRequest::TriggerType trigger_type,
@@ -160,11 +147,33 @@
   // Shows chrome://reset-password interstitial.
   virtual void ShowInterstitial(content::WebContents* web_contens,
                                 ReusedPasswordAccountType password_type) = 0;
-#endif
+
+  // Triggers the safeBrowsingPrivate.OnPolicySpecifiedPasswordReuseDetected.
+  virtual void MaybeReportPasswordReuseDetected(
+      content::WebContents* web_contents,
+      const std::string& username,
+      PasswordType password_type,
+      bool is_phishing_url) = 0;
+
+  // Called when a protected password change is detected. Must be called on
+  // UI thread.
+  virtual void ReportPasswordChanged() = 0;
 
   virtual void UpdateSecurityState(safe_browsing::SBThreatType threat_type,
                                    ReusedPasswordAccountType password_type,
                                    content::WebContents* web_contents) = 0;
+#endif
+
+  scoped_refptr<SafeBrowsingDatabaseManager> database_manager();
+
+  // Safe Browsing backend cannot get a reliable reputation of a URL if
+  // (1) URL is not valid
+  // (2) URL doesn't have http or https scheme
+  // (3) It maps to a local host.
+  // (4) Its hostname is an IP Address in an IANA-reserved range.
+  // (5) Its hostname is a not-yet-assigned by ICANN gTLD.
+  // (6) Its hostname is a dotless domain.
+  static bool CanGetReputationOfURL(const GURL& url);
 
   // If user has clicked through any Safe Browsing interstitial on this given
   // |web_contents|.
@@ -191,18 +200,6 @@
       const GURL& url,
       RequestOutcome* reason) const = 0;
 
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
-  // Triggers the safeBrowsingPrivate.OnPolicySpecifiedPasswordReuseDetected.
-  virtual void MaybeReportPasswordReuseDetected(
-      content::WebContents* web_contents,
-      const std::string& username,
-      PasswordType password_type,
-      bool is_phishing_url) = 0;
-
-  // Called when a protected password change is detected. Must be called on
-  // UI thread.
-  virtual void ReportPasswordChanged() = 0;
-#endif
   // Converts from password::metrics_util::PasswordType to
   // LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordType.
   static ReusedPasswordType GetPasswordProtectionReusedPasswordType(
@@ -341,11 +338,6 @@
   virtual bool IsUnderAdvancedProtection() = 0;
 #endif
 
-  // Gets the type of sync account associated with current profile or
-  // |NOT_SIGNED_IN|.
-  virtual LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType
-  GetSyncAccountType() const = 0;
-
 #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   // Records a Chrome Sync event for the result of the URL reputation lookup
   // if the user enters their sync password on a website.
@@ -354,11 +346,7 @@
       RequestOutcome,
       PasswordType password_type,
       const LoginReputationClientResponse*) = 0;
-#endif
 
-  void CheckCsdWhitelistOnIOThread(const GURL& url, bool* check_result);
-
-#if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   void RemoveWarningRequestsByWebContents(content::WebContents* web_contents);
 
   bool IsModalWarningShowingInWebContents(content::WebContents* web_contents);
@@ -371,6 +359,13 @@
                                    const GURL& main_frame_url) = 0;
 #endif
 
+  void CheckCsdWhitelistOnIOThread(const GURL& url, bool* check_result);
+
+  // Gets the type of sync account associated with current profile or
+  // |NOT_SIGNED_IN|.
+  virtual LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType
+  GetSyncAccountType() const = 0;
+
  private:
   friend class PasswordProtectionServiceTest;
   friend class TestPasswordProtectionService;
diff --git a/components/send_tab_to_self/features.cc b/components/send_tab_to_self/features.cc
index 4cda965..49abd94 100644
--- a/components/send_tab_to_self/features.cc
+++ b/components/send_tab_to_self/features.cc
@@ -6,7 +6,6 @@
 
 #include "components/sync/base/sync_prefs.h"
 #include "components/sync/base/user_selectable_type.h"
-#include "components/sync/driver/sync_driver_switches.h"
 
 namespace send_tab_to_self {
 
@@ -21,13 +20,11 @@
 
 bool IsReceivingEnabledByUserOnThisDevice(PrefService* prefs) {
   syncer::SyncPrefs sync_prefs(prefs);
-  return base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf) &&
-         sync_prefs.GetSelectedTypes().Has(syncer::UserSelectableType::kTabs);
+  return sync_prefs.GetSelectedTypes().Has(syncer::UserSelectableType::kTabs);
 }
 
 bool EnabledOnSignIn() {
-  return base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf) &&
-         base::FeatureList::IsEnabled(kSendTabToSelfWhenSignedIn);
+  return base::FeatureList::IsEnabled(kSendTabToSelfWhenSignedIn);
 }
 
 }  // namespace send_tab_to_self
diff --git a/components/services/heap_profiling/json_exporter.cc b/components/services/heap_profiling/json_exporter.cc
index e2ec70c..ea9f2be6 100644
--- a/components/services/heap_profiling/json_exporter.cc
+++ b/components/services/heap_profiling/json_exporter.cc
@@ -234,10 +234,12 @@
 
   for (const auto& alloc : allocations) {
     int allocator = static_cast<int>(alloc.first.allocator);
+    // We use double to store size and count, as it can precisely represent
+    // values up to 2^52 ~ 4.5 petabytes.
     counts[allocator].push_back(
-        base::Value(static_cast<int>(alloc.second.count)));
+        base::Value(static_cast<double>(alloc.second.count)));
     sizes[allocator].push_back(
-        base::Value(static_cast<int>(alloc.second.size)));
+        base::Value(static_cast<double>(alloc.second.size)));
     types[allocator].push_back(base::Value(alloc.first.context_id));
     nodes[allocator].push_back(base::Value(alloc_to_node_id.at(&alloc.first)));
   }
@@ -300,7 +302,9 @@
   result.SetKey("heaps_v2", std::move(heaps_v2));
 
   std::string result_json;
-  bool ok = base::JSONWriter::Write(result, &result_json);
+  bool ok = base::JSONWriter::WriteWithOptions(
+      result, base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION,
+      &result_json);
   DCHECK(ok);
   return result_json;
 }
diff --git a/components/services/heap_profiling/json_exporter_unittest.cc b/components/services/heap_profiling/json_exporter_unittest.cc
index e9974d9..f9bf760 100644
--- a/components/services/heap_profiling/json_exporter_unittest.cc
+++ b/components/services/heap_profiling/json_exporter_unittest.cc
@@ -421,4 +421,43 @@
   ASSERT_TRUE(found_no_context);
 }
 
+#if defined(ARCH_CPU_64_BITS)
+TEST(ProfilingJsonExporterTest, LargeAllocation) {
+  std::vector<Address> stack1{Address(0x5678), Address(0x1234)};
+  AllocationMap allocs;
+  InsertAllocation(&allocs, AllocatorType::kMalloc,
+                   static_cast<size_t>(0x9876543210ul), stack1, 0);
+
+  ExportParams params;
+  params.allocs = std::move(allocs);
+  std::string json = ExportMemoryMapsAndV2StackTraceToJSON(&params);
+
+  // JSON should parse.
+  base::JSONReader json_reader(base::JSON_PARSE_RFC);
+  base::Optional<base::Value> result = json_reader.ReadToValue(json);
+  ASSERT_TRUE(result.has_value()) << json_reader.GetErrorMessage();
+
+  // Validate the allocators summary.
+  const base::Value* malloc_summary =
+      result.value().FindPath({"allocators", "malloc"});
+  ASSERT_TRUE(malloc_summary);
+  const base::Value* malloc_size =
+      malloc_summary->FindPath({"attrs", "size", "value"});
+  ASSERT_TRUE(malloc_size);
+  EXPECT_EQ("9876543210", malloc_size->GetString());
+  const base::Value* malloc_virtual_size =
+      malloc_summary->FindPath({"attrs", "virtual_size", "value"});
+  ASSERT_TRUE(malloc_virtual_size);
+  EXPECT_EQ("9876543210", malloc_virtual_size->GetString());
+
+  // Validate allocators details.
+  // heaps_v2.allocators.malloc.sizes.reduce((a,s)=>a+s,0).
+  const base::Value* malloc =
+      result.value().FindPath({"heaps_v2", "allocators", "malloc"});
+  const base::Value* malloc_sizes = malloc->FindKey("sizes");
+  EXPECT_EQ(1u, malloc_sizes->GetList().size());
+  EXPECT_EQ(0x9876543210ul, malloc_sizes->GetList()[0].GetDouble());
+}
+#endif
+
 }  // namespace heap_profiling
diff --git a/components/services/storage/partition_impl_unittest.cc b/components/services/storage/partition_impl_unittest.cc
index baa6f45..1cd6ad7 100644
--- a/components/services/storage/partition_impl_unittest.cc
+++ b/components/services/storage/partition_impl_unittest.cc
@@ -38,7 +38,7 @@
   PartitionImpl* test_partition_impl() { return test_partition_impl_; }
 
  private:
-  base::test::ScopedTaskEnvironment task_environment_;
+  base::test::TaskEnvironment task_environment_;
   mojo::Remote<mojom::StorageService> remote_service_;
   StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver()};
   mojo::Remote<mojom::Partition> remote_test_partition_;
diff --git a/components/services/storage/storage_service_impl_unittest.cc b/components/services/storage/storage_service_impl_unittest.cc
index b852bbc..0533bf3 100644
--- a/components/services/storage/storage_service_impl_unittest.cc
+++ b/components/services/storage/storage_service_impl_unittest.cc
@@ -26,7 +26,7 @@
   StorageServiceImpl& service_impl() { return service_; }
 
  private:
-  base::test::ScopedTaskEnvironment task_environment_;
+  base::test::TaskEnvironment task_environment_;
   mojo::Remote<mojom::StorageService> remote_service_;
   StorageServiceImpl service_{remote_service_.BindNewPipeAndPassReceiver()};
 
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 782e8b2b..7dcd815 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -300,7 +300,6 @@
 <translation id="2479410451996844060">ልክ ያልሆነ የፍለጋ ዩአርኤል።</translation>
 <translation id="2482878487686419369">ማስታወቂያዎች</translation>
 <translation id="248348093745724435">የማሽን መመሪያዎች</translation>
-<translation id="2485387744899240041">የእርስዎ መሣሪያ እና አሳሽ የተጠቃሚ ስሞች</translation>
 <translation id="2491120439723279231">የአገልጋይ እውቅና ማረጋገጫ ስህተቶችን ይዟል።</translation>
 <translation id="2493640343870896922">ደብዳቤ-ፕላስ</translation>
 <translation id="2495083838625180221">JSON ተንታኝ</translation>
@@ -865,7 +864,6 @@
 <translation id="5565735124758917034">ገባሪ</translation>
 <translation id="5570825185877910964">መለያን ጠብቅ</translation>
 <translation id="5571083550517324815">ከዚህ አድራሻ ላይ መውሰድ አይቻልም። የተለየ አድራሻ ይምረጡ።</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 ጥቅም ላይ ያለ}one{# ጥቅም ላይ ያለ}other{# ጥቅም ላይ}})</translation>
 <translation id="5580958916614886209">የእርስዎን የአገልግሎት ማብቂያ ወር ይመልከቱ እና እንደገና ይሞክሩ</translation>
 <translation id="5586446728396275693">ምንም የተቀመጡ አድራሻዎች የሉም</translation>
 <translation id="5595485650161345191">አድራሻ አርትዕ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 317f197..066551c 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">‏عنوان URL للبحث غير صالح.</translation>
 <translation id="2482878487686419369">الإشعارات</translation>
 <translation id="248348093745724435">سياسات الأجهزة</translation>
-<translation id="2485387744899240041">أسماء المستخدمين لجهازك ومتصفِّحك</translation>
 <translation id="2491120439723279231">تحتوي شهادة الخادم على أخطاء.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">‏محلل JSON اللغوي</translation>
@@ -874,7 +873,6 @@
 <translation id="5565735124758917034">نشط</translation>
 <translation id="5570825185877910964">حماية الحساب</translation>
 <translation id="5571083550517324815">لا يمكن الاستلام من هذا العنوان. حدِّد عنوانًا آخر.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 قيد الاستخدام}zero{# قيد الاستخدام}two{# قيد الاستخدام}few{# قيد الاستخدام}many{# قيد الاستخدام}other{# قيد الاستخدام}})</translation>
 <translation id="5580958916614886209">تحقق من شهر انتهاء الصلاحية وأعِد المحاولة مرة أخرى</translation>
 <translation id="5586446728396275693">لا توجد عناوين محفوظة</translation>
 <translation id="5595485650161345191">تعديل العنوان</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 77a10f89..ad57d29 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Невалиден URL адрес за търсене.</translation>
 <translation id="2482878487686419369">Известия</translation>
 <translation id="248348093745724435">Правила за компютъра</translation>
-<translation id="2485387744899240041">Потребителските имена за устройството и браузъра ви</translation>
 <translation id="2491120439723279231">Сертификатът на сървъра съдържа грешки.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Синтактичен анализ на JSON</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">Активно</translation>
 <translation id="5570825185877910964">Защита на профила</translation>
 <translation id="5571083550517324815">Този адрес за вземане не се поддържа. Изберете друг.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{използва се 1}other{използват се #}})</translation>
 <translation id="5580958916614886209">Проверете месеца на валидност и опитайте отново</translation>
 <translation id="5586446728396275693">Няма запазени адреси</translation>
 <translation id="5595485650161345191">Редактиране на адреса</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index ba1708a1..1a2d6ea2 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -307,7 +307,6 @@
 <translation id="2479410451996844060">ভুল সার্চের ইউআরএল৷</translation>
 <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation>
 <translation id="248348093745724435">মেশিনের নীতি</translation>
-<translation id="2485387744899240041">আপনার ডিভাইস এবং ব্রাউজারের জন্য ইউজারনেম</translation>
 <translation id="2491120439723279231">সার্ভারের সার্টিফিকেটে ত্রুটি আছে৷</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON বিশ্লেষক</translation>
@@ -876,7 +875,6 @@
 <translation id="5565735124758917034">সক্রিয়</translation>
 <translation id="5570825185877910964">অ্যাকাউন্ট সুরক্ষিত রাখুন</translation>
 <translation id="5571083550517324815">এই ঠিকানা থেকে পিক-আপ করা যাবে না। অন্য ঠিকানা বেছে নিন।</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{১টি ব্যবহৃত হচ্ছে}one{#টি ব্যবহৃত হচ্ছে}other{#টি ব্যবহৃত হচ্ছে}})</translation>
 <translation id="5580958916614886209">আপনার মেয়াদ শেষের মাস পরীক্ষা করে আবার চেষ্টা করুন</translation>
 <translation id="5586446728396275693">কোনও ঠিকানা সংরক্ষণ করা নেই</translation>
 <translation id="5595485650161345191">ঠিকানা সম্পাদনা করুন</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 51d5cc1..8152fe9c 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">URL de cerca no vàlid.</translation>
 <translation id="2482878487686419369">Notificacions</translation>
 <translation id="248348093745724435">Polítiques de l'ordinador</translation>
-<translation id="2485387744899240041">Noms d'usuari del dispositiu i del navegador</translation>
 <translation id="2491120439723279231">El certificat del servidor conté errors.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analitzador JSON</translation>
@@ -864,7 +863,6 @@
 <translation id="5565735124758917034">Actiu</translation>
 <translation id="5570825185877910964">Protegeix el compte</translation>
 <translation id="5571083550517324815">No es pot fer la recollida en aquesta adreça. Selecciona'n una altra.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 en ús}other{# en ús}})</translation>
 <translation id="5580958916614886209">Comprova el mes de caducitat i torna-ho a provar</translation>
 <translation id="5586446728396275693">No hi ha cap adreça desada</translation>
 <translation id="5595485650161345191">Edita l'adreça</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 370e14b..180220d 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Neplatná adresa URL vyhledávání.</translation>
 <translation id="2482878487686419369">Oznámení</translation>
 <translation id="248348093745724435">Zásady zařízení</translation>
-<translation id="2485387744899240041">Uživatelská jména pro zařízení a prohlížeč</translation>
 <translation id="2491120439723279231">Certifikát serveru obsahuje chyby.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analyzátor souborů JSON</translation>
@@ -860,7 +859,6 @@
 <translation id="5565735124758917034">Aktivní</translation>
 <translation id="5570825185877910964">Ochránit účet</translation>
 <translation id="5571083550517324815">Vyzvednutí na této adrese není možné. Vyberte jinou adresu.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{používá se 1}few{používají se #}many{používá se #}other{používá se #}})</translation>
 <translation id="5580958916614886209">Zkontrolujte měsíc vypršení platnosti a zkuste to znovu.</translation>
 <translation id="5586446728396275693">Žádné uložené adresy</translation>
 <translation id="5595485650161345191">Upravit adresu</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 788aa2c..e64c7f71 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -120,7 +120,7 @@
 <translation id="1521655867290435174">Google Sheets</translation>
 <translation id="1527263332363067270">Venter på forbindelse…</translation>
 <translation id="1529521330346880926">10x15 (Envelope)</translation>
-<translation id="1530707389502320859">Det website, du netop forsøgte at gå til, ser falsk ud. Svindlere efterligner nogle gange websites ved at lave små ændringer af webadressen, som er svære at se.</translation>
+<translation id="1530707389502320859">Det website, du netop forsøgte at gå til, ser ud til at være falsk. Svindlere efterligner nogle gange websites ved at lave små ændringer af webadressen, som er svære at se.</translation>
 <translation id="1531205177818805254">Exec</translation>
 <translation id="1532118530259321453">Denne side siger</translation>
 <translation id="153384715582417236">Det var det hele indtil videre</translation>
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Ugyldig søgewebadresse.</translation>
 <translation id="2482878487686419369">Notifikationer</translation>
 <translation id="248348093745724435">Maskinpolitikker</translation>
-<translation id="2485387744899240041">Brugernavne for din enhed og browser</translation>
 <translation id="2491120439723279231">Serverens certifikat indeholder fejl.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Værktøj til parsing af JSON-filer</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5570825185877910964">Beskyt konto</translation>
 <translation id="5571083550517324815">Der kan ikke afhentes på denne adresse. Vælg en anden adresse.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 i brug}one{# i brug}other{# i brug}})</translation>
 <translation id="5580958916614886209">Kontrollér, om udløbsmåneden er korrekt, og prøv igen.</translation>
 <translation id="5586446728396275693">Der er ikke nogen gemte adresser</translation>
 <translation id="5595485650161345191">Rediger adresse</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 39b9e60..c7ba86f4 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Ungültige Such-URL</translation>
 <translation id="2482878487686419369">Benachrichtigungen</translation>
 <translation id="248348093745724435">Computerrichtlinien</translation>
-<translation id="2485387744899240041">Nutzernamen für Ihr Gerät und Ihren Browser</translation>
 <translation id="2491120439723279231">Das Serverzertifikat enthält Fehler.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON-Parser</translation>
@@ -862,7 +861,6 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5570825185877910964">Konto schützen</translation>
 <translation id="5571083550517324815">Diese Abholadresse wird nicht unterstützt. Bitte wählen Sie eine andere Adresse aus.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 wird verwendet}other{# werden verwendet}})</translation>
 <translation id="5580958916614886209">Prüfen Sie Ihren Ablaufmonat und versuchen Sie es dann erneut</translation>
 <translation id="5586446728396275693">Keine gespeicherten Adressen</translation>
 <translation id="5595485650161345191">Adresse bearbeiten</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index b0d9dfe..e00b3ea 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Μη έγκυρη διεύθυνση URL αναζήτησης.</translation>
 <translation id="2482878487686419369">Ειδοποιήσεις</translation>
 <translation id="248348093745724435">Πολιτικές συσκευής</translation>
-<translation id="2485387744899240041">Τα ονόματα χρήστη για τη συσκευή και το πρόγραμμα περιήγησής σας</translation>
 <translation id="2491120439723279231">Το πιστοποιητικό του διακομιστή περιέχει σφάλματα.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Συντακτικός αναλυτής JSON</translation>
@@ -876,7 +875,6 @@
 <translation id="5565735124758917034">Ενεργό</translation>
 <translation id="5570825185877910964">Προστασία λογαριασμού</translation>
 <translation id="5571083550517324815">Δεν είναι δυνατή η παραλαβή από αυτήν τη διεύθυνση. Επιλέξτε μια άλλη διεύθυνση.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 σε χρήση}other{# σε χρήση}})</translation>
 <translation id="5580958916614886209">Ελέγξτε τον μήνα λήξης σας και δοκιμάστε ξανά</translation>
 <translation id="5586446728396275693">Δεν υπάρχουν αποθηκευμένες διευθύνσεις</translation>
 <translation id="5595485650161345191">Επεξεργασία διεύθυνσης</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 153d906..3b8b123 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Invalid search URL.</translation>
 <translation id="2482878487686419369">Notifications</translation>
 <translation id="248348093745724435">Machine policies</translation>
-<translation id="2485387744899240041">Usernames for your device and browser</translation>
 <translation id="2491120439723279231">Server's certificate contains errors.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -583,6 +582,7 @@
 <translation id="4103249731201008433">Device serial number is invalid</translation>
 <translation id="410351446219883937">Auto-play</translation>
 <translation id="4103763322291513355">Visit &lt;strong&gt;chrome://policy&lt;/strong&gt; to see the list of blacklisted URLs and other policies enforced by your system administrator.</translation>
+<translation id="4108231218301530806">Use fingerprint to verify this card next time.</translation>
 <translation id="4110652170750985508">Review your payment</translation>
 <translation id="4112140312785995938">Seek backwards</translation>
 <translation id="4116663294526079822">Always allow on this site</translation>
@@ -867,7 +867,6 @@
 <translation id="5565735124758917034">Active</translation>
 <translation id="5570825185877910964">Protect account</translation>
 <translation id="5571083550517324815">Can’t pick up from this address. Select a different address.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{One in use}other{# in use}})</translation>
 <translation id="5580958916614886209">Check your expiry month and try again</translation>
 <translation id="5586446728396275693">No saved addresses</translation>
 <translation id="5595485650161345191">Edit address</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 8f5a4f4..c8a8141 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL de búsqueda no válida</translation>
 <translation id="2482878487686419369">Notificaciones</translation>
 <translation id="248348093745724435">Políticas de la máquina</translation>
-<translation id="2485387744899240041">Nombres de usuario para tu dispositivo y navegador</translation>
 <translation id="2491120439723279231">El certificado del servidor contiene errores.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analizador de JSON</translation>
@@ -873,7 +872,6 @@
 <translation id="5565735124758917034">Activo</translation>
 <translation id="5570825185877910964">Proteger cuenta</translation>
 <translation id="5571083550517324815">No se puede retirar el artículo en esta dirección. Selecciona una diferente.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 en uso}other{# en uso}})</translation>
 <translation id="5580958916614886209">Comprueba el mes de vencimiento y vuelve a intentarlo</translation>
 <translation id="5586446728396275693">No hay direcciones guardadas</translation>
 <translation id="5595485650161345191">Editar dirección</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 6164759..b7488c90c 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">La URL de búsqueda no es válida.</translation>
 <translation id="2482878487686419369">Notificaciones</translation>
 <translation id="248348093745724435">Políticas del equipo</translation>
-<translation id="2485387744899240041">Nombres de usuario de tu dispositivo y navegador</translation>
 <translation id="2491120439723279231">El certificado del servidor contiene errores.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analizador de archivos JSON</translation>
@@ -867,7 +866,6 @@
 <translation id="5565735124758917034">Activo</translation>
 <translation id="5570825185877910964">Proteger cuenta</translation>
 <translation id="5571083550517324815">Los pedidos no se pueden recoger en esta dirección. Selecciona otra.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 en uso}other{# en uso}})</translation>
 <translation id="5580958916614886209">Consulta el mes de vencimiento y vuelve a intentarlo</translation>
 <translation id="5586446728396275693">Ninguna dirección guardada</translation>
 <translation id="5595485650161345191">Editar dirección</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 4a4d0fe..4a2174e5 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Kehtetu otsingu URL.</translation>
 <translation id="2482878487686419369">Märguanded</translation>
 <translation id="248348093745724435">Seadme reeglid</translation>
-<translation id="2485387744899240041">Teie seadme ja brauseri kasutajanimed</translation>
 <translation id="2491120439723279231">Serveri sertifikaat sisaldab vigu.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON-i parser</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktiivne</translation>
 <translation id="5570825185877910964">Kaitse kontot</translation>
 <translation id="5571083550517324815">Sellelt aadressilt ei saa kaupa kätte. Valige mõni teine aadress.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{kasutusel on 1}other{kasutusel on #}})</translation>
 <translation id="5580958916614886209">Kontrollige aegumiskuud ja proovige uuesti</translation>
 <translation id="5586446728396275693">Salvestatud aadresse pole</translation>
 <translation id="5595485650161345191">Muuda aadressi</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index 0504f55..3f9cfae 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">‏URL جستجو نامعتبر است.</translation>
 <translation id="2482878487686419369">اعلان‌ها</translation>
 <translation id="248348093745724435">خط‌مشی‌های ماشین</translation>
-<translation id="2485387744899240041">نام کاربری دستگاه و مرورگرتان</translation>
 <translation id="2491120439723279231">گواهی سرور دارای چندین خطاست.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">‏تجزیه‌کننده JSON</translation>
@@ -873,7 +872,6 @@
 <translation id="5565735124758917034">فعال</translation>
 <translation id="5570825185877910964">محافظت از حساب</translation>
 <translation id="5571083550517324815">تحویل گرفتن از این نشانی ممکن نیست. نشانی دیگری را انتخاب کنید.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{۱ کوکی درحال استفاده}one{# کوکی درحال استفاده}other{# کوکی درحال استفاده}})</translation>
 <translation id="5580958916614886209">ماه انقضا را بررسی و دوباره امتحان کنید</translation>
 <translation id="5586446728396275693">نشانی ذخیره‌شده‌ای وجود ندارد</translation>
 <translation id="5595485650161345191">ویرایش آدرس</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 8fc9592c..d8bbb12 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Virheellinen hakukoneen URL-osoite.</translation>
 <translation id="2482878487686419369">Ilmoitukset</translation>
 <translation id="248348093745724435">Laitteen käytännöt</translation>
-<translation id="2485387744899240041">Laitteen ja selaimen käyttäjänimet</translation>
 <translation id="2491120439723279231">Palvelimen varmenteessa on virheitä.</translation>
 <translation id="2493640343870896922">Kirje-plus</translation>
 <translation id="2495083838625180221">JSON-jäsentäjä</translation>
@@ -876,7 +875,6 @@
 <translation id="5565735124758917034">Aktiivinen</translation>
 <translation id="5570825185877910964">Suojaa tili</translation>
 <translation id="5571083550517324815">Nouto tästä osoitteesta ei onnistu. Valitse eri osoite.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 käytössä}other{# käytössä}})</translation>
 <translation id="5580958916614886209">Tarkista vanhentumiskuukausi ja yritä uudelleen.</translation>
 <translation id="5586446728396275693">Ei tallennettuja osoitteita</translation>
 <translation id="5595485650161345191">Osoitteen muokkaus</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index d61dc8bd2b..9852f2ec 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -120,7 +120,7 @@
 <translation id="1521655867290435174">Google Sheets</translation>
 <translation id="1527263332363067270">Naghihintay ng koneksyon…</translation>
 <translation id="1529521330346880926">10x15 (Envelope)</translation>
-<translation id="1530707389502320859">Mukhang peke ang site na sinubukan mong bisitahin. Kung minsan, ginagaya ng mga nang-aatake ang mga site sa pamamagitan ng paggawa ng maliliit at mahirap makitang pagbabago sa URL.</translation>
+<translation id="1530707389502320859">Mukhang peke ang site na sinubukan mong bisitahin. Kung minsan, ginagaya ng mga nang-aatake ang mga site sa pamamagitan ng paggawa ng mga pagbabago sa URL na maliit at mahirap makita.</translation>
 <translation id="1531205177818805254">Exec</translation>
 <translation id="1532118530259321453">Isinasaad ng page na ito na</translation>
 <translation id="153384715582417236">'Yan na muna sa ngayon</translation>
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Di-wastong URL ng paghahanap.</translation>
 <translation id="2482878487686419369">Mga Abiso</translation>
 <translation id="248348093745724435">Mga patakaran sa machine</translation>
-<translation id="2485387744899240041">Mga username para sa iyong device at browser</translation>
 <translation id="2491120439723279231">Naglalaman ng mga error ang certificate ng server.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Pang-parse ng JSON</translation>
@@ -355,7 +354,9 @@
 <translation id="2721148159707890343">Matagumpay ang kahilingan</translation>
 <translation id="2728127805433021124">Nilagdaan ang certificate ng server gamit ang mahinang algorithm ng lagda.</translation>
 <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Magpatakbo ng Connectivity Diagnostics<ph name="END_LINK" /></translation>
-<translation id="2734544361860335147">Sa pamamagitan ng pag-enable sa mga feature na ito, puwedeng mawala ang iyong data mula sa pag-browse o makompromiso ang seguridad o privacy mo. Nalalapat ang mga naka-enable na feature sa lahat ng user ng browser na ito.</translation>
+<translation id="2734544361860335147">Sa pamamagitan ng pag-enable sa mga feature na ito, puwedeng mawala ang data sa iyong browser o
+    makompromiso ang seguridad o privacy mo. Nalalapat ang mga naka-enable na feature sa lahat
+    ng user ng browser na ito.</translation>
 <translation id="2735043616039983645">Mayroong higit sa isang pinagmulan na may magkakasalungat na value para sa patakarang ito!</translation>
 <translation id="2738330467931008676">Pumili ng Address sa Pag-pick up</translation>
 <translation id="2740531572673183784">Ok</translation>
@@ -522,7 +523,7 @@
 <translation id="3678529606614285348">Buksan ang page sa bagong Incognito window (Ctrl-Shift-N)</translation>
 <translation id="3679803492151881375">Nakuha ang ulat ng pag-crash noong <ph name="CRASH_TIME" />, na-upload noong <ph name="UPLOAD_TIME" /></translation>
 <translation id="3681007416295224113">Impormasyon sa certificate</translation>
-<translation id="3701427423622901115">Kinilala ang pag-reset.</translation>
+<translation id="3701427423622901115">Tinanggap ang pag-reset.</translation>
 <translation id="3704162925118123524">Ang network na ginagamit mo ay maaaring humiling sa iyo na bisitahin ang page ng pag-login nito.</translation>
 <translation id="3704609568417268905"><ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="370665806235115550">Naglo-load...</translation>
@@ -812,7 +813,7 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5252000469029418751">C7 (Envelope)</translation>
 <translation id="5254958791078852567">E1</translation>
-<translation id="5269999699920406580">Ang mga feature na nalalapat sa buong system ay maitatakda lang ng may-ari: <ph name="OWNER_EMAIL" /></translation>
+<translation id="5269999699920406580">Ang makakapagtakda lang ng mga feature na nalalapat sa buong system ay ang may-ari: <ph name="OWNER_EMAIL" /></translation>
 <translation id="5273658854610202413">Babala: Hindi na-merge ang patakarang ito bilang tinukoy sa patakarang PolicyDictionaryMultipleSourceMergeList dahil hindi ito bahagi ng mga patakaran ng diksyunaryo na puwedeng i-merge.</translation>
 <translation id="5283044957620376778">B1</translation>
 <translation id="528468243742722775">Tapusin</translation>
@@ -849,7 +850,8 @@
 <translation id="5457113250005438886">Di-wasto</translation>
 <translation id="5458150163479425638">{CONTACT,plural, =0{<ph name="CONTACT_PREVIEW" />}=1{<ph name="CONTACT_PREVIEW" /> at <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> pa}one{<ph name="CONTACT_PREVIEW" /> at <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> pa}other{<ph name="CONTACT_PREVIEW" /> at <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> pa}}</translation>
 <translation id="5470861586879999274">&amp;Gawing muli ang pag-e-edit</translation>
-<translation id="5473728911100096288">Sa pamamagitan ng pag-enable sa mga feature na ito, gagamit ka ng mga hindi na ginagamit na feature na mawawala sa mga bersyon sa hinaharap.</translation>
+<translation id="5473728911100096288">Sa pamamagitan ng pag-enable sa mga feature na ito, gagamit ka ng mga hindi na ginagamit na feature
+    na mawawala sa mga bersyon sa hinaharap.</translation>
 <translation id="5478437291406423475">B6/C4 (Envelope)</translation>
 <translation id="5481076368049295676">Maaaring subukan ng content na ito na mag-install ng mapanganib na software sa iyong device na magnanakaw o magde-delete ng impormasyon mo. <ph name="BEGIN_LINK" />Ipakita pa rin<ph name="END_LINK" /></translation>
 <translation id="54817484435770891">Magdagdag ng wastong address</translation>
@@ -872,7 +874,6 @@
 <translation id="5565735124758917034">Aktibo</translation>
 <translation id="5570825185877910964">Protektahan ang account</translation>
 <translation id="5571083550517324815">Hindi maaaring mag-pick up mula sa address na ito. Pumili ng ibang address.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 ang ginagamit}one{# ang ginagamit}other{# ang ginagamit}})</translation>
 <translation id="5580958916614886209">Tingnan ang iyong buwan ng pag-expire at subukang muli</translation>
 <translation id="5586446728396275693">Walang naka-save na address</translation>
 <translation id="5595485650161345191">Mag-edit ng address</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 8d95aca..c3c79752 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">URL de recherche incorrecte</translation>
 <translation id="2482878487686419369">Notifications</translation>
 <translation id="248348093745724435">Règles associées à la machine</translation>
-<translation id="2485387744899240041">Noms d'utilisateur pour votre appareil et votre navigateur</translation>
 <translation id="2491120439723279231">Le certificat du serveur contient des erreurs.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analyse de fichiers JSON</translation>
@@ -864,7 +863,6 @@
 <translation id="5565735124758917034">Actif</translation>
 <translation id="5570825185877910964">Protéger le compte</translation>
 <translation id="5571083550517324815">Enlèvement impossible à cette adresse. Sélectionnez-en une autre.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 en cours d'utilisation}one{# en cours d'utilisation}other{# en cours d'utilisation}})</translation>
 <translation id="5580958916614886209">Veuillez vérifier le mois d'expiration, puis réessayer</translation>
 <translation id="5586446728396275693">Aucune adresse enregistrée</translation>
 <translation id="5595485650161345191">Modifier l'adresse</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index eb1214c..b18846a 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">અમાન્ય શોધ URL.</translation>
 <translation id="2482878487686419369">સૂચનાઓ</translation>
 <translation id="248348093745724435">મશીન નીતિઓ</translation>
-<translation id="2485387744899240041">તમારા ડિવાઇસ અને બ્રાઉઝર માટે વપરાશકર્તાનું નામ</translation>
 <translation id="2491120439723279231">સર્વરના પ્રમાણપત્રમાં ભૂલો છે.</translation>
 <translation id="2493640343870896922">લેટર-પ્લસ</translation>
 <translation id="2495083838625180221">JSON વિશ્લેષક</translation>
@@ -874,7 +873,6 @@
 <translation id="5565735124758917034">સક્રિય</translation>
 <translation id="5570825185877910964">એકાઉન્ટ સુરક્ષિત કરો</translation>
 <translation id="5571083550517324815">આ સરનામેથી પિકઅપ કરી શકતા નથી. કોઈ ભિન્ન સરનામું પસંદ કરો.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 ઉપયોગમાં છે}one{# ઉપયોગમાં છે}other{# ઉપયોગમાં છે}})</translation>
 <translation id="5580958916614886209">તમારો સમાપ્તિ મહિનો તપાસો અને ફરી પ્રયાસ કરો</translation>
 <translation id="5586446728396275693">કોઈ સાચવેલ ઍડ્રેસ નથી</translation>
 <translation id="5595485650161345191">ઍડ્રેસમાં ફેરફાર કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index ed0a81b2..58a7c09 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -305,7 +305,6 @@
 <translation id="2479410451996844060">गलत खोज URL.</translation>
 <translation id="2482878487686419369">सूचनाएं</translation>
 <translation id="248348093745724435">मशीन के लिए नीतियां</translation>
-<translation id="2485387744899240041">आपके डिवाइस और ब्राउज़र के लिए उपयोगकर्ता नाम</translation>
 <translation id="2491120439723279231">सर्वर के प्रमाणपत्र में त्रुटियां हैं.</translation>
 <translation id="2493640343870896922">लेटर-प्लस</translation>
 <translation id="2495083838625180221">JSON पार्सर</translation>
@@ -870,7 +869,6 @@
 <translation id="5565735124758917034">सक्रिय</translation>
 <translation id="5570825185877910964">खाते की सुरक्षा करें</translation>
 <translation id="5571083550517324815">इस पते से पिक अप नहीं किया जा सकता. कोई दूसरा पता चुनें.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 इस्तेमाल में है}one{# इस्तेमाल में हैं}other{# इस्तेमाल में हैं}})</translation>
 <translation id="5580958916614886209">अपने क्रेडिट कार्ड की समय सीमा खत्म होने का महीना जांचें और फिर से कोशिश करें</translation>
 <translation id="5586446728396275693">कोई सहेजा गया पता नहीं है</translation>
 <translation id="5595485650161345191">पते में बदलाव करें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 6eb1c2b19..7920f6ab 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Nevažeći URL pretraživanja.</translation>
 <translation id="2482878487686419369">Obavijesti</translation>
 <translation id="248348093745724435">Pravila uređaja</translation>
-<translation id="2485387744899240041">Korisnička imena za uređaj i preglednik</translation>
 <translation id="2491120439723279231">Certifikat poslužitelja sadrži pogreške.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Raščlanjivanje JSON datoteka</translation>
@@ -874,7 +873,6 @@
 <translation id="5565735124758917034">Aktivno</translation>
 <translation id="5570825185877910964">Zaštitite račun</translation>
 <translation id="5571083550517324815">Preuzimanje na toj adresi nije moguće. Odaberite drugu adresu.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 u upotrebi}one{# u upotrebi}few{# u upotrebi}other{# u upotrebi}})</translation>
 <translation id="5580958916614886209">Provjerite mjesec isteka, pa pokušajte ponovo</translation>
 <translation id="5586446728396275693">Nema nijedne spremljene adrese</translation>
 <translation id="5595485650161345191">Uređivanje adrese</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 0d4f462..b3d55ba2 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Érvénytelen keresési URL</translation>
 <translation id="2482878487686419369">Értesítések</translation>
 <translation id="248348093745724435">A számítógép házirendjei</translation>
-<translation id="2485387744899240041">Az eszköz és a böngésző felhasználónevei</translation>
 <translation id="2491120439723279231">A szervezet tanúsítványa hibákat tartalmaz.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -870,7 +869,6 @@
 <translation id="5565735124758917034">Aktív</translation>
 <translation id="5570825185877910964">Fiók védelme</translation>
 <translation id="5571083550517324815">Ezen a címen nem lehetséges az átvétel. Válasszon másik címet.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 van használatban}other{# van használatban}})</translation>
 <translation id="5580958916614886209">Ellenőrizze a lejárati hónapot, majd próbálja újra</translation>
 <translation id="5586446728396275693">Nincsenek mentett címek</translation>
 <translation id="5595485650161345191">Cím szerkesztése</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 271ee726..894123f 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL penelusuran tidak valid.</translation>
 <translation id="2482878487686419369">Notifikasi</translation>
 <translation id="248348093745724435">Kebijakan mesin</translation>
-<translation id="2485387744899240041">Nama pengguna untuk perangkat dan browser Anda</translation>
 <translation id="2491120439723279231">Sertifikat server mengandung kesalahan.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Pengurai JSON</translation>
@@ -874,7 +873,6 @@
 <translation id="5565735124758917034">Aktif</translation>
 <translation id="5570825185877910964">Lindungi akun</translation>
 <translation id="5571083550517324815">Tidak dapat mengambil dari alamat ini. Pilih alamat lain.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 terpakai}other{# terpakai}})</translation>
 <translation id="5580958916614886209">Periksa bulan kedaluwarsa dan coba lagi</translation>
 <translation id="5586446728396275693">Tidak ada alamat yang disimpan</translation>
 <translation id="5595485650161345191">Edit alamat</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 87d7f8e2..770cecbe 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL ricerca non valido.</translation>
 <translation id="2482878487686419369">Notifiche</translation>
 <translation id="248348093745724435">Norme macchina</translation>
-<translation id="2485387744899240041">Nomi utente del dispositivo e del browser</translation>
 <translation id="2491120439723279231">Il certificato del server contiene degli errori.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">Attivo</translation>
 <translation id="5570825185877910964">Proteggi account</translation>
 <translation id="5571083550517324815">Impossibile ritirare dall'indirizzo specificato. Seleziona un indirizzo diverso.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 in uso}other{# in uso}})</translation>
 <translation id="5580958916614886209">Controlla il mese di scadenza e riprova</translation>
 <translation id="5586446728396275693">Nessun indirizzo salvato</translation>
 <translation id="5595485650161345191">Modifica indirizzo</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index e300e2c..edfff14d 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">כתובת אתר לא חוקית של חיפוש</translation>
 <translation id="2482878487686419369">התראות</translation>
 <translation id="248348093745724435">מדיניות המחשב</translation>
-<translation id="2485387744899240041">שמות משתמש למכשיר ולדפדפן שלך</translation>
 <translation id="2491120439723279231">אישור השרת מכיל שגיאות.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">‏מנתח JSON</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">פעיל</translation>
 <translation id="5570825185877910964">הגנה על החשבון</translation>
 <translation id="5571083550517324815">לא ניתן לבצע איסוף מהכתובת הזו. עליך לבחור כתובת אחרת.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{אחד נמצא בשימוש}two{שניים נמצאים בשימוש}many{# נמצאים בשימוש}other{# נמצאים בשימוש}})</translation>
 <translation id="5580958916614886209">בדוק את חודש התפוגה ונסה שוב</translation>
 <translation id="5586446728396275693">לא נשמרו כתובות</translation>
 <translation id="5595485650161345191">עריכת כתובת</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 69226a4..34adacad 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">検索 URL が無効です。</translation>
 <translation id="2482878487686419369">通知</translation>
 <translation id="248348093745724435">マシンポリシー</translation>
-<translation id="2485387744899240041">デバイスとブラウザのユーザー名</translation>
 <translation id="2491120439723279231">サーバーの証明書にエラーがあります。</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON パーサー</translation>
@@ -864,7 +863,6 @@
 <translation id="5565735124758917034">有効</translation>
 <translation id="5570825185877910964">アカウントを保護</translation>
 <translation id="5571083550517324815">この住所での受け取りはできません。別の住所を選択してください。</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 個が使用中}other{# 個が使用中}})</translation>
 <translation id="5580958916614886209">有効期限の「月」を確認してもう一度お試しください</translation>
 <translation id="5586446728396275693">保存されている住所がありません</translation>
 <translation id="5595485650161345191">住所の編集</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 8a78b490..7222565 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -304,7 +304,6 @@
 <translation id="2479410451996844060">ಅಮಾನ್ಯವಾದ ಹುಡುಕಾಟ URL.</translation>
 <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation>
 <translation id="248348093745724435">ಯಂತ್ರದ ಕಾರ್ಯನೀತಿಗಳು</translation>
-<translation id="2485387744899240041">ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಬ್ರೌಸರ್‌ಗಾಗಿ ಬಳಕೆದಾರ ಹೆಸರುಗಳು</translation>
 <translation id="2491120439723279231">ಸರ್ವರ್‌ನ ಪ್ರಮಾಣಪತ್ರವು ದೋಷಗಳನ್ನು ಹೊಂದಿದೆ.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON ವಿಶ್ಲೇಷಕ</translation>
@@ -868,7 +867,6 @@
 <translation id="5565735124758917034">ಸಕ್ರಿಯ</translation>
 <translation id="5570825185877910964">ಖಾತೆಯನ್ನು ಸಂರಕ್ಷಿಸಿ</translation>
 <translation id="5571083550517324815">ಈ ವಿಳಾಸದಿಂದ ಪಿಕಪ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ವಿಳಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 ಬಳಕೆಯಲ್ಲಿದೆ}one{# ಬಳಕೆಯಲ್ಲಿದೆ}other{# ಬಳಕೆಯಲ್ಲಿದೆ}})</translation>
 <translation id="5580958916614886209">ನಿಮ್ಮ ಮುಕ್ತಾಯ ತಿಂಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="5586446728396275693">ಯಾವುದೇ ಉಳಿಸಲಾದ ವಿಳಾಸಗಳಿಲ್ಲ</translation>
 <translation id="5595485650161345191">ವಿಳಾಸ ಎಡಿಟ್ ಮಾಡಿ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 7c6632f2..f7f91c9 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -120,7 +120,7 @@
 <translation id="1521655867290435174">Google 스프레드시트</translation>
 <translation id="1527263332363067270">연결 대기 중...</translation>
 <translation id="1529521330346880926">10x15(봉투)</translation>
-<translation id="1530707389502320859">방문하려고 한 사이트가 허위 사이트로 보입니다. 일부 공격자는 사이트의 URL을 알아보기 어려울 정도로 약간 변경하여 다른 사이트를 모방합니다.</translation>
+<translation id="1530707389502320859">방문하려고 한 사이트가 허위 사이트로 보입니다. 일부 공격자는 사이트의 URL을 알아채기 어려울 정도로 약간 변경하여 다른 사이트를 모방합니다.</translation>
 <translation id="1531205177818805254">Exec</translation>
 <translation id="1532118530259321453">이 페이지 내용:</translation>
 <translation id="153384715582417236">새 콘텐츠 없음</translation>
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">검색 URL이 잘못됨</translation>
 <translation id="2482878487686419369">알림</translation>
 <translation id="248348093745724435">컴퓨터 정책</translation>
-<translation id="2485387744899240041">기기 및 브라우저에서 사용 중인 사용자 이름</translation>
 <translation id="2491120439723279231">서버 인증서에 오류가 있습니다.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON 파서</translation>
@@ -849,7 +848,7 @@
 <translation id="5457113250005438886">잘못된 데이터</translation>
 <translation id="5458150163479425638">{CONTACT,plural, =0{<ph name="CONTACT_PREVIEW" />}=1{<ph name="CONTACT_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" />개}other{<ph name="CONTACT_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" />개}}</translation>
 <translation id="5470861586879999274">수정 다시 실행(&amp;R)</translation>
-<translation id="5473728911100096288">이 기능을 사용 설정하면 향후 버전에서 정리될 지원 중단 기능을 사용하게 됩니다.</translation>
+<translation id="5473728911100096288">이 기능을 사용 설정하면 향후 버전에서 제외될 지원 중단 기능을 사용하게 됩니다.</translation>
 <translation id="5478437291406423475">B6/C4(봉투)</translation>
 <translation id="5481076368049295676">이 콘텐츠는 사용자의 정보를 도용하거나 삭제하는 위험한 소프트웨어를 기기에 설치하려 할 수도 있습니다. <ph name="BEGIN_LINK" />표시하기<ph name="END_LINK" /></translation>
 <translation id="54817484435770891">유효한 주소 추가</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">활성</translation>
 <translation id="5570825185877910964">계정 보호</translation>
 <translation id="5571083550517324815">이 주소에서 수령할 수 없습니다. 다른 주소를 선택하세요.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1개 사용 중}other{#개 사용 중}})</translation>
 <translation id="5580958916614886209">유효기간 월을 확인한 후 다시 시도해 주세요.</translation>
 <translation id="5586446728396275693">저장된 주소 없음</translation>
 <translation id="5595485650161345191">주소 수정</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 32b4eccf..cd5911a 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Netinkamas paieškos URL.</translation>
 <translation id="2482878487686419369">Pranešimai</translation>
 <translation id="248348093745724435">Įrenginio politikos</translation>
-<translation id="2485387744899240041">Jūsų įrenginio ir naršyklės naudotojo vardai</translation>
 <translation id="2491120439723279231">Serverio sertifikate yra klaidų.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON analizavimo įrankis</translation>
@@ -876,7 +875,6 @@
 <translation id="5565735124758917034">Aktyvus</translation>
 <translation id="5570825185877910964">Apsaugoti paskyrą</translation>
 <translation id="5571083550517324815">Negalima paimti šiuo adresu. Pasirinkite kitą adresą.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{naudojama: 1}one{naudojama: #}few{naudojama: #}many{naudojama: #}other{naudojama: #}})</translation>
 <translation id="5580958916614886209">Patikrinkite galiojimo pabaigos mėnesį ir bandykite dar kartą</translation>
 <translation id="5586446728396275693">Nėra išsaugotų adresų</translation>
 <translation id="5595485650161345191">Adreso redagavimas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 640c879..ba0c7e1 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -299,7 +299,6 @@
 <translation id="2479410451996844060">Nederīgs meklēšanas URL.</translation>
 <translation id="2482878487686419369">Paziņojumi</translation>
 <translation id="248348093745724435">Ierīces politikas</translation>
-<translation id="2485387744899240041">Lietotājvārdi jūsu ierīcei un pārlūkam</translation>
 <translation id="2491120439723279231">Servera sertifikātā ir kļūdas.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON parsētājs</translation>
@@ -864,7 +863,6 @@
 <translation id="5565735124758917034">Aktīvs</translation>
 <translation id="5570825185877910964">Aizsargāt kontu</translation>
 <translation id="5571083550517324815">Nevar saņemt sūtījumu šajā adresē. Atlasiet citu adresi.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 tiek lietots}zero{# tiek lietoti}one{# tiek lietots}other{# tiek lietoti}})</translation>
 <translation id="5580958916614886209">Pārbaudiet derīguma termiņa mēnesi un mēģiniet vēlreiz.</translation>
 <translation id="5586446728396275693">Nav saglabātu adrešu.</translation>
 <translation id="5595485650161345191">Rediģēt adresi</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 2fdabe7..33efe64 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">തിരയൽ URL അസാധുവാണ്.</translation>
 <translation id="2482878487686419369">വിജ്ഞാപനങ്ങള്‍‌</translation>
 <translation id="248348093745724435">മെഷീന്‍ നയങ്ങള്‍</translation>
-<translation id="2485387744899240041">നിങ്ങളുടെ ഉപകരണത്തിനും ബ്രൗസറിനുമുള്ള ഉപയോക്തൃനാമങ്ങൾ</translation>
 <translation id="2491120439723279231">സെർവറിന്റെ സർട്ടിഫിക്കറ്റിൽ പിശകുകൾ ഉണ്ട്.</translation>
 <translation id="2493640343870896922">ലെറ്റർ-പ്ലസ്</translation>
 <translation id="2495083838625180221">JSON പാർസർ</translation>
@@ -863,7 +862,6 @@
 <translation id="5565735124758917034">സജീവമാണ്</translation>
 <translation id="5570825185877910964">അക്കൗണ്ട് പരിരക്ഷിക്കുക</translation>
 <translation id="5571083550517324815">ഈ വിലാസത്തിൽ നിന്ന് പിക്ക്അപ്പ് ചെയ്യാൻ കഴിയില്ല. മറ്റൊരു വിലാസം തിരഞ്ഞെടുക്കുക.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{ഒരെണ്ണം ഉപയോഗത്തിലുണ്ട്}other{# എണ്ണം ഉപയോഗത്തിലുണ്ട്}})</translation>
 <translation id="5580958916614886209">കാലാവധി തീരുന്ന മാസം പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="5586446728396275693">സംരക്ഷിച്ച വിലാസങ്ങളൊന്നുമില്ല</translation>
 <translation id="5595485650161345191">വിലാസം എഡിറ്റുചെയ്യുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index badb0c1..8bfcc73e6 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">चुकीचे शोध URL.</translation>
 <translation id="2482878487686419369">सूचना</translation>
 <translation id="248348093745724435">मशीन धोरणे</translation>
-<translation id="2485387744899240041">तुमच्या डिव्हाइस आणि ब्राउझरसाठी वापरकर्तानावे</translation>
 <translation id="2491120439723279231">सर्व्हरच्या सर्टिफिकेटमध्ये एरर आहेत.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON पार्सर</translation>
@@ -874,7 +873,6 @@
 <translation id="5565735124758917034">सक्रिय</translation>
 <translation id="5570825185877910964">खात्याचे संरक्षण करा</translation>
 <translation id="5571083550517324815">या पत्त्यावरून पिक अप करू शकत नाही. वेगळा पत्ता निवडा.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 वापरात आहे}other{# वापरात आहेत}})</translation>
 <translation id="5580958916614886209">तुमचा कालबाह्यता महिना तपासा आणि पुन्हा प्रयत्न करा</translation>
 <translation id="5586446728396275693">कोणतेही सेव्ह केलेले ॲड्रेस नाही</translation>
 <translation id="5595485650161345191">पत्ता संपादित करा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index f52eb5e..9e235a1d 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -299,7 +299,6 @@
 <translation id="2479410451996844060">URL carian tidak sah.</translation>
 <translation id="2482878487686419369">Pemberitahuan</translation>
 <translation id="248348093745724435">Dasar mesin</translation>
-<translation id="2485387744899240041">Nama pengguna bagi peranti dan penyemak imbas anda</translation>
 <translation id="2491120439723279231">Sijil pelayan mengandungi ralat.</translation>
 <translation id="2493640343870896922">Surat-Plus</translation>
 <translation id="2495083838625180221">Penghurai JSON</translation>
@@ -869,7 +868,6 @@
 <translation id="5565735124758917034">Aktif</translation>
 <translation id="5570825185877910964">Lindungi akaun</translation>
 <translation id="5571083550517324815">Tidak boleh mengambil dari alamat ini. Pilih alamat lain.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 sedang digunakan}other{# sedang digunakan}})</translation>
 <translation id="5580958916614886209">Semak bulan tamat tempoh anda dan cuba lagi</translation>
 <translation id="5586446728396275693">Tiada alamat yang disimpan</translation>
 <translation id="5595485650161345191">Edit alamat</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index fd415f76..cf0e5aec 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Ongeldige zoek-URL.</translation>
 <translation id="2482878487686419369">Meldingen</translation>
 <translation id="248348093745724435">Apparaatbeleid</translation>
-<translation id="2485387744899240041">Gebruikersnamen voor je apparaat en browser</translation>
 <translation id="2491120439723279231">Het servercertificaat bevat fouten.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -859,7 +858,6 @@
 <translation id="5565735124758917034">Actief</translation>
 <translation id="5570825185877910964">Account beschermen</translation>
 <translation id="5571083550517324815">Kan niet ophalen van dit adres. Selecteer een ander adres.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 in gebruik}other{# in gebruik}})</translation>
 <translation id="5580958916614886209">Controleer de vervalmaand en probeer het opnieuw</translation>
 <translation id="5586446728396275693">Geen opgeslagen adressen</translation>
 <translation id="5595485650161345191">Adres bewerken</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 26e0a388..939a83c3 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Ugyldig nettadresse for søk.</translation>
 <translation id="2482878487686419369">Varsler</translation>
 <translation id="248348093745724435">Maskininnstillinger</translation>
-<translation id="2485387744899240041">Brukernavn for enheten og nettleseren din</translation>
 <translation id="2491120439723279231">Tjenerens sertifikat inneholder feil.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5570825185877910964">Beskytt kontoen</translation>
 <translation id="5571083550517324815">Kan ikke hente på denne adressen. Velg en annen adresse.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 er i bruk}other{# er i bruk}})</translation>
 <translation id="5580958916614886209">Kontrollér utløpsmåneden, og prøv igjen</translation>
 <translation id="5586446728396275693">Ingen adresser er lagret</translation>
 <translation id="5595485650161345191">Rediger adresse</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index db44b1e..bef59408 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Nieprawidłowy URL wyszukiwania</translation>
 <translation id="2482878487686419369">Powiadomienia</translation>
 <translation id="248348093745724435">Zasady dotyczące komputera</translation>
-<translation id="2485387744899240041">Nazwy użytkownika z urządzenia i przeglądarki</translation>
 <translation id="2491120439723279231">Certyfikat serwera zawiera błędy.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Parser JSON</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktywny</translation>
 <translation id="5570825185877910964">Chroń konto</translation>
 <translation id="5571083550517324815">Odbiór spod tego adresu jest niemożliwy. Wybierz inny adres.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{W użyciu: 1}few{W użyciu: #}many{W użyciu: #}other{W użyciu: #}})</translation>
 <translation id="5580958916614886209">Sprawdź miesiąc ważności i spróbuj ponownie</translation>
 <translation id="5586446728396275693">Brak zapisanych adresów</translation>
 <translation id="5595485650161345191">Edytuj adres</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index ca369fa..3487f0b 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL de pesquisa inválido.</translation>
 <translation id="2482878487686419369">Notificações</translation>
 <translation id="248348093745724435">Políticas do computador</translation>
-<translation id="2485387744899240041">Nomes de usuário para seu dispositivo e navegador</translation>
 <translation id="2491120439723279231">O certificado do servidor contém erros.</translation>
 <translation id="2493640343870896922">Letter Plus</translation>
 <translation id="2495083838625180221">Analisador JSON</translation>
@@ -589,6 +588,7 @@
 <translation id="4103249731201008433">O número de série do dispositivo é inválido</translation>
 <translation id="410351446219883937">Reprodução automática</translation>
 <translation id="4103763322291513355">Visite &lt;strong&gt;chrome://policy&lt;/strong&gt; para ver a lista de URLs adicionados à lista de proibições e outras políticas aplicadas pelo administrador do seu sistema.</translation>
+<translation id="4108231218301530806">Usar impressão digital para verificar o cartão na próxima vez.</translation>
 <translation id="4110652170750985508">Analisar seu pagamento</translation>
 <translation id="4112140312785995938">Retroceder</translation>
 <translation id="4116663294526079822">Sempre permitir neste site</translation>
@@ -872,7 +872,6 @@
 <translation id="5565735124758917034">Ativo</translation>
 <translation id="5570825185877910964">Proteger conta</translation>
 <translation id="5571083550517324815">Não é possível fazer a retirada nesse endereço. Tente um endereço diferente.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 em uso}one{# em uso}other{# em uso}})</translation>
 <translation id="5580958916614886209">Verifique o mês de validade e tente novamente</translation>
 <translation id="5586446728396275693">Nenhum endereço salvo</translation>
 <translation id="5595485650161345191">Editar endereço</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index ce0c930f..89d8b75 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL de pesquisa inválido.</translation>
 <translation id="2482878487686419369">Notificações</translation>
 <translation id="248348093745724435">Políticas do computador</translation>
-<translation id="2485387744899240041">Os nomes de utilizador para o dispositivo e o navegador.</translation>
 <translation id="2491120439723279231">O certificado do servidor contém erros.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analisador JSON</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Ativo</translation>
 <translation id="5570825185877910964">Proteger conta</translation>
 <translation id="5571083550517324815">Não é possível recolher a partir deste endereço. Selecione um diferente.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 em utilização}other{# em utilização}})</translation>
 <translation id="5580958916614886209">Verifique o mês de validade e tente novamente</translation>
 <translation id="5586446728396275693">Nenhum endereço guardado</translation>
 <translation id="5595485650161345191">Editar morada</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 348f1e2..9d204223 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Adresă URL de căutare nevalidă.</translation>
 <translation id="2482878487686419369">Notificări</translation>
 <translation id="248348093745724435">Politicile dispozitivului</translation>
-<translation id="2485387744899240041">Nume de utilizator pentru dispozitivul și browserul tău</translation>
 <translation id="2491120439723279231">Certificatul serverului conține erori.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Analizor JSON</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">Activ</translation>
 <translation id="5570825185877910964">Protejează contul</translation>
 <translation id="5571083550517324815">Nu se poate prelua de la această adresă. Selectează altă adresă.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 în uz}few{# în uz}other{# în uz}})</translation>
 <translation id="5580958916614886209">Verifică luna în care expiră și încearcă din nou</translation>
 <translation id="5586446728396275693">Nu există adrese salvate</translation>
 <translation id="5595485650161345191">Editează adresa</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 3097eb83..2bef94e 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Недействительный URL поисковой системы.</translation>
 <translation id="2482878487686419369">Уведомления</translation>
 <translation id="248348093745724435">Правила для компьютера</translation>
-<translation id="2485387744899240041">Имена пользователей для вашего устройства и браузера</translation>
 <translation id="2491120439723279231">Сертификат сервера содержит ошибки.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Синтаксический анализатор JSON</translation>
@@ -863,7 +862,6 @@
 <translation id="5565735124758917034">Активен</translation>
 <translation id="5570825185877910964">Защитить аккаунт</translation>
 <translation id="5571083550517324815">Этот адрес не поддерживается. Выберите другой.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{используется 1 файл}one{используется # файл}few{используется # файла}many{используется # файлов}other{используется # файла}})</translation>
 <translation id="5580958916614886209">Проверьте месяц в сроке действия карты и повторите попытку</translation>
 <translation id="5586446728396275693">Нет сохраненных адресов</translation>
 <translation id="5595485650161345191">Изменить адрес</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index df93d29b..257464a 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">Neplatná webová adresa vyhľadávania.</translation>
 <translation id="2482878487686419369">Upozornenia</translation>
 <translation id="248348093745724435">Pravidlá počítača</translation>
-<translation id="2485387744899240041">Používateľské mená pre vaše zariadenie a prehliadač</translation>
 <translation id="2491120439723279231">Certifikát servera obsahuje chyby.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Parser</translation>
@@ -860,7 +859,6 @@
 <translation id="5565735124758917034">Aktívne</translation>
 <translation id="5570825185877910964">Ochrániť účet</translation>
 <translation id="5571083550517324815">Vyzdvihnutie na tejto adrese nie je možné. Vyberte inú adresu.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{Používa sa 1}few{Používajú sa #}many{Používa sa #}other{Používa sa #}})</translation>
 <translation id="5580958916614886209">Skontrolujte mesiac vypršania platnosti a skúste to znova</translation>
 <translation id="5586446728396275693">Žiadne uložené adresy</translation>
 <translation id="5595485650161345191">Upraviť adresu</translation>
@@ -1039,7 +1037,7 @@
 <translation id="6596325263575161958">Možnosti šifrovania</translation>
 <translation id="6604181099783169992">Senzory pohybu alebo svetla</translation>
 <translation id="6609880536175561541">Prc7 (obálka)</translation>
-<translation id="6624427990725312378">Kontaktné informácie</translation>
+<translation id="6624427990725312378">Kontaktné údaje</translation>
 <translation id="6626291197371920147">Pridanie platného čísla karty</translation>
 <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Útočníci na webe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sa môžu pokúsiť vo vašom počítači Mac nainštalovať nebezpečné programy, pomocou ktorých ukradnú alebo odstránia informácie (napríklad fotky, heslá, správy a kreditné karty). <ph name="BEGIN_LEARN_MORE_LINK" />Ďalšie informácie<ph name="END_LEARN_MORE_LINK" /></translation>
@@ -1109,7 +1107,7 @@
 <translation id="705310974202322020">{NUM_CARDS,plural, =1{Túto kartu nie je momentálne možné uložiť}few{Tieto karty nie je momentálne možné uložiť}many{Tieto karty nie je momentálne možné uložiť}other{Tieto karty nie je momentálne možné uložiť}}</translation>
 <translation id="7053983685419859001">Blokovať</translation>
 <translation id="7062635574500127092">Modrozelená</translation>
-<translation id="7064851114919012435">Kontaktné informácie</translation>
+<translation id="7064851114919012435">Kontaktné údaje</translation>
 <translation id="7075452647191940183">Žiadosť je príliš veľká</translation>
 <translation id="7079718277001814089">Tento web obsahuje malvér</translation>
 <translation id="7087282848513945231">Okres</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 88b32a7..05578530 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Neveljaven URL iskanja.</translation>
 <translation id="2482878487686419369">Obvestila</translation>
 <translation id="248348093745724435">Pravilniki naprave</translation>
-<translation id="2485387744899240041">Uporabniška imena za napravo in brskalnik</translation>
 <translation id="2491120439723279231">V potrdilu strežnika so napake.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Razčlenjevalnik za JSON</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktivno</translation>
 <translation id="5570825185877910964">Zaščita računa</translation>
 <translation id="5571083550517324815">Prevzem na tem naslovu ni mogoč. Izberite drugega.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 v uporabi}one{# v uporabi}two{# v uporabi}few{# v uporabi}other{# v uporabi}})</translation>
 <translation id="5580958916614886209">Preverite mesec poteka veljavnosti in poskusite znova</translation>
 <translation id="5586446728396275693">Ni shranjenih naslovov</translation>
 <translation id="5595485650161345191">Uredi naslov</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index f991dbe..82a5639 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Неважећа URL адреса претраге.</translation>
 <translation id="2482878487686419369">Обавештења</translation>
 <translation id="248348093745724435">Смернице за уређаје</translation>
-<translation id="2485387744899240041">Корисничка имена за уређај и прегледач</translation>
 <translation id="2491120439723279231">Сертификат сервера садржи грешке.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Рашчлањивач JSON датотека</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Активно</translation>
 <translation id="5570825185877910964">Заштити налог</translation>
 <translation id="5571083550517324815">Преузимање са ове адресе није могуће. Изаберите другу адресу.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{Користи се 1}one{Користи се #}few{Користе се #}other{Користи се #}})</translation>
 <translation id="5580958916614886209">Проверите месец истека и пробајте поново</translation>
 <translation id="5586446728396275693">Нема сачуваних адреса</translation>
 <translation id="5595485650161345191">Измена адресе</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 3972827..89a042f 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Ogiltig sökadress.</translation>
 <translation id="2482878487686419369">Aviseringar</translation>
 <translation id="248348093745724435">Datorprinciper</translation>
-<translation id="2485387744899240041">Användarnamn för din enhet och webbläsare</translation>
 <translation id="2491120439723279231">Servercertifikatet innehåller fel.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON-analysator</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Aktiv</translation>
 <translation id="5570825185877910964">Skydda kontot</translation>
 <translation id="5571083550517324815">Utlämning erbjuds inte på den här adressen. Välj en annan adress.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 används}other{# används}})</translation>
 <translation id="5580958916614886209">Kontrollera utgångsmånad och försök igen</translation>
 <translation id="5586446728396275693">Inga sparade adresser</translation>
 <translation id="5595485650161345191">Redigera adress</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index ef3e18c..3c342306 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
-<translation id="1008557486741366299">Sio Sasa</translation>
+<translation id="1008557486741366299">Si Sasa</translation>
 <translation id="1010200102790553230">Pakia ukurasa baadaye</translation>
 <translation id="1015730422737071372">Toa maelezo ya ziada</translation>
 <translation id="1021110881106174305">Kadi zinazokubaliwa</translation>
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL batili ya utafutaji.</translation>
 <translation id="2482878487686419369">Arifa</translation>
 <translation id="248348093745724435">Sera za mashine</translation>
-<translation id="2485387744899240041">Majina ya watumiaji kwenye kivinjari na kifaa chako</translation>
 <translation id="2491120439723279231">Cheti cha seva kina hitilafu.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Kichanganuzi cha JSON</translation>
@@ -488,7 +487,7 @@
 <translation id="3462200631372590220">Ficha mahiri</translation>
 <translation id="3467763166455606212">Jina la mwenye kadi linahitajika</translation>
 <translation id="3468054117417088249"><ph name="TAB_SWITCH_SUFFIX" />, kwa sasa kimefunguka, bonyeza Kichupo kisha Enter ili uende kwenye kichupo ambacho kimefunguliwa</translation>
-<translation id="3479552764303398839">Sio sasa</translation>
+<translation id="3479552764303398839">Si sasa</translation>
 <translation id="3484560055331845446">Unaweza kupoteza uwezo wa kufikia Akaunti yako ya Google. Chrome inapendekeza ubadilishe nenosiri lako sasa. Utaombwa uingie katika akaunti.</translation>
 <translation id="3495081129428749620">Pata katika ukurasa wa
     <ph name="PAGE_TITLE" /></translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Inatumika</translation>
 <translation id="5570825185877910964">Linda akaunti</translation>
 <translation id="5571083550517324815">Haiwezi kuchukua kutoka kwenye anwani hii. Chagua anwani tofauti.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 kinatumika}other{ # vinatumika}})</translation>
 <translation id="5580958916614886209">Angalia mwezi kuisha kwa muda wa matumizi halafu ujajibu tena</translation>
 <translation id="5586446728396275693">Hakuna anwani zilizohifadhiwa</translation>
 <translation id="5595485650161345191">Badilisha anwani</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 4949f24..6ee45ea 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -307,7 +307,6 @@
 <translation id="2479410451996844060">தவறான தேடல் URL.</translation>
 <translation id="2482878487686419369">அறிவிப்புகள்</translation>
 <translation id="248348093745724435">சாதனக் கொள்கைகள்</translation>
-<translation id="2485387744899240041">உங்கள் சாதனம் மற்றும் உலாவியின் பயனர்பெயர்கள்</translation>
 <translation id="2491120439723279231">சேவையகச் சான்றிதழில் பிழைகள் உள்ளன.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON பார்சர்</translation>
@@ -869,7 +868,6 @@
 <translation id="5565735124758917034">செயலில் உள்ளது</translation>
 <translation id="5570825185877910964">கணக்கைப் பாதுகாத்திடு</translation>
 <translation id="5571083550517324815">இந்த முகவரியிலிருந்து பிக்அப் செய்ய முடியாது. வேறு முகவரியைத் தேர்ந்தெடுக்கவும்.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{ஒரு குக்கீ பயன்படுத்தப்படுகிறது}other{# குக்கீகள் பயன்படுத்தப்படுகின்றன}})</translation>
 <translation id="5580958916614886209">காலாவதி மாதத்தைச் சரிபார்த்து, மீண்டும் முயலவும்</translation>
 <translation id="5586446728396275693">சேமித்த முகவரிகள் இல்லை</translation>
 <translation id="5595485650161345191">முகவரியைத் திருத்து</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 5f8ac53f..30d1585 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -300,7 +300,6 @@
 <translation id="2479410451996844060">శోధన URL చెల్లదు.</translation>
 <translation id="2482878487686419369">ప్రకటనలు</translation>
 <translation id="248348093745724435">మెషీన్ విధానాలు</translation>
-<translation id="2485387744899240041">మీ పరికరం, బ్రౌజర్‌ల వినియోగదారు పేర్లు</translation>
 <translation id="2491120439723279231">సర్వర్ యొక్క ప్రమాణపత్రంలో లోపాలు ఉన్నాయి.</translation>
 <translation id="2493640343870896922">లెటర్-ప్లస్</translation>
 <translation id="2495083838625180221">JSON పార్సర్</translation>
@@ -866,7 +865,6 @@
 <translation id="5565735124758917034">సక్రియం</translation>
 <translation id="5570825185877910964">ఖాతాను సంరక్షించు</translation>
 <translation id="5571083550517324815">ఈ చిరునామా నుండి పికప్ చేసుకోవడం సాధ్యం కాదు. వేరే చిరునామాని ఎంచుకోండి.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 వినియోగంలో ఉంది}other{# వినియోగంలో ఉన్నాయి}})</translation>
 <translation id="5580958916614886209">మీ గడువు ముగింపు నెలను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి</translation>
 <translation id="5586446728396275693">సేవ్ చేయబడిన చిరునామాలు లేవు</translation>
 <translation id="5595485650161345191">చిరునామాను సవరించు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 99d1e49..7eb8fe95 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL ค้นหาไม่ถูกต้อง</translation>
 <translation id="2482878487686419369">การแจ้งเตือน</translation>
 <translation id="248348093745724435">นโยบายเครื่อง</translation>
-<translation id="2485387744899240041">ชื่อผู้ใช้สำหรับอุปกรณ์และเบราว์เซอร์ของคุณ</translation>
 <translation id="2491120439723279231">ใบรับรองของเซิร์ฟเวอร์มีข้อผิดพลาด</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">โปรแกรมแยกวิเคราะห์ JSON</translation>
@@ -355,7 +354,7 @@
 <translation id="2721148159707890343">คำขอสำเร็จ</translation>
 <translation id="2728127805433021124">ใบรับรองของเซิร์ฟเวอร์ถูกเซ็นชื่อด้วยอัลกอริทึมลายเซ็นที่ไม่รัดกุม</translation>
 <translation id="2730326759066348565"><ph name="BEGIN_LINK" />เรียกใช้การวินิจฉัยการเชื่อมต่อ<ph name="END_LINK" /></translation>
-<translation id="2734544361860335147">การเปิดใช้ฟีเจอร์เหล่านี้อาจทำให้คุณสูญเสียข้อมูลในเบราว์เซอร์หรือทำให้ความปลอดภัยและความเป็นส่วนตัวมีความเสี่ยง ฟีเจอร์ที่เปิดใช้จะมีผลกับผู้ใช้ทั้งหมดของเบราว์เซอร์นี้</translation>
+<translation id="2734544361860335147">การเปิดใช้ฟีเจอร์เหล่านี้อาจทำให้คุณสูญเสียข้อมูลในเบราว์เซอร์หรือทำให้เกิดความเสี่ยงต่อความปลอดภัยหรือความเป็นส่วนตัว ฟีเจอร์ที่เปิดใช้จะมีผลกับผู้ใช้ทั้งหมดของเบราว์เซอร์นี้</translation>
 <translation id="2735043616039983645">นโยบายนี้มีแหล่งที่มามากกว่า 1 แห่งที่มีค่าขัดแย้งกัน</translation>
 <translation id="2738330467931008676">เลือกที่อยู่สำหรับรับสินค้า</translation>
 <translation id="2740531572673183784">ตกลง</translation>
@@ -871,7 +870,6 @@
 <translation id="5565735124758917034">ใช้งานอยู่</translation>
 <translation id="5570825185877910964">ปกป้องบัญชี</translation>
 <translation id="5571083550517324815">ไม่สามารถรับสินค้าจากที่อยู่นี้ โปรดเลือกที่อยู่อื่น</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{ใช้งานอยู่ 1 รายการ}other{ใช้งานอยู่ # รายการ}})</translation>
 <translation id="5580958916614886209">ตรวจสอบเดือนหมดอายุแล้วลองอีกครั้ง</translation>
 <translation id="5586446728396275693">ไม่มีที่อยู่ที่บันทึกไว้</translation>
 <translation id="5595485650161345191">แก้ไขที่อยู่</translation>
@@ -1072,7 +1070,7 @@
 <translation id="6738516213925468394">ข้อมูลของคุณเข้ารหัสลับไว้ด้วย<ph name="BEGIN_LINK" />รหัสผ่านการซิงค์<ph name="END_LINK" />เมื่อ <ph name="TIME" /> ป้อนรหัสผ่านเพื่อเริ่มซิงค์</translation>
 <translation id="674375294223700098">ข้อผิดพลาดใบรับรองของเซิร์ฟเวอร์ที่ไม่รู้จัก</translation>
 <translation id="6744009308914054259">ระหว่างที่รอการเชื่อมต่อ คุณไปที่หน้า "ดาวน์โหลด" เพื่ออ่านบทความออฟไลน์ได้</translation>
-<translation id="6747611005629681221">คำเตือน: พบฟีเจอร์ที่เลิกใช้งานแล้ว</translation>
+<translation id="6747611005629681221">คำเตือน: พบฟีเจอร์ที่เลิกใช้งาน</translation>
 <translation id="6753269504797312559">ค่านโยบาย</translation>
 <translation id="6757797048963528358">อุปกรณ์ของคุณเข้าสู่โหมดสลีปแล้ว</translation>
 <translation id="6768213884286397650">Hagaki (โปสการ์ด)</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 19fc3c9..537bbea7 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Geçersiz arama URL'si.</translation>
 <translation id="2482878487686419369">Bildirimler</translation>
 <translation id="248348093745724435">Makine politikaları</translation>
-<translation id="2485387744899240041">Cihazınız ve tarayıcınız için kullanıcı adları</translation>
 <translation id="2491120439723279231">Sunucu sertifikası hatalar içeriyor.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON Ayrıştırıcı</translation>
@@ -873,7 +872,6 @@
 <translation id="5565735124758917034">Etkin</translation>
 <translation id="5570825185877910964">Hesabı koru</translation>
 <translation id="5571083550517324815">Bu adresten alım yapılamıyor. Farklı bir adres seçin.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{1 çerez kullanımda}other{# çerez kullanımda}})</translation>
 <translation id="5580958916614886209">Son kullanma tarihinin ayını kontrol edip tekrar deneyin</translation>
 <translation id="5586446728396275693">Kaydedilmiş adres yok</translation>
 <translation id="5595485650161345191">Adresi düzenle</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 3b74221..7be11d7 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">Недійсна URL-адреса для пошуку.</translation>
 <translation id="2482878487686419369">Сповіщення</translation>
 <translation id="248348093745724435">Правила пристрою</translation>
-<translation id="2485387744899240041">Імена користувачів пристрою та веб-переглядача</translation>
 <translation id="2491120439723279231">Сертифікат сервера містить помилки.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Синтаксичний аналізатор файлів JSON</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">Активний клієнт</translation>
 <translation id="5570825185877910964">Захистити обліковий запис</translation>
 <translation id="5571083550517324815">Адреса отримання не підтримується. Укажіть іншу адресу.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{Використовується 1 файл}one{Використовується # файл}few{Використовуються # файли}many{Використовуються # файлів}other{Використовуються # файлу}})</translation>
 <translation id="5580958916614886209">Перевірте місяць закінчення терміну дії та повторіть спробу</translation>
 <translation id="5586446728396275693">Немає збережених адрес</translation>
 <translation id="5595485650161345191">Редагувати адресу</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index f5d85a92..dd0afa5b1 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">URL tìm kiếm hợp lệ.</translation>
 <translation id="2482878487686419369">Thông báo</translation>
 <translation id="248348093745724435">Chính sách về máy</translation>
-<translation id="2485387744899240041">Tên người dùng dành cho thiết bị và trình duyệt của bạn</translation>
 <translation id="2491120439723279231">Chứng chỉ của máy chủ có lỗi.</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">Trình phân tích cú pháp JSON</translation>
@@ -875,7 +874,6 @@
 <translation id="5565735124758917034">Đang hoạt động</translation>
 <translation id="5570825185877910964">Bảo vệ tài khoản</translation>
 <translation id="5571083550517324815">Không thể nhận hàng từ địa chỉ này. Chọn một địa chỉ khác.</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{Đang sử dụng 1 cookie}other{Đang sử dụng # cookie}})</translation>
 <translation id="5580958916614886209">Kiểm tra tháng hết hạn của bạn và thử lại</translation>
 <translation id="5586446728396275693">Không có địa chỉ nào được lưu</translation>
 <translation id="5595485650161345191">Chỉnh sửa địa chỉ</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index dac5353..66f94038 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -298,7 +298,6 @@
 <translation id="2479410451996844060">搜索网址无效。</translation>
 <translation id="2482878487686419369">通知</translation>
 <translation id="248348093745724435">设备政策</translation>
-<translation id="2485387744899240041">您的设备和浏览器的用户名</translation>
 <translation id="2491120439723279231">服务器证书中包含错误。</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON 解析器</translation>
@@ -860,7 +859,6 @@
 <translation id="5565735124758917034">主动</translation>
 <translation id="5570825185877910964">保护帐号</translation>
 <translation id="5571083550517324815">无法从此地址取货。请另选一个地址。</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{目前使用了 1 个}other{目前使用了 # 个}})</translation>
 <translation id="5580958916614886209">请检查您的信用卡到期月份,然后重试</translation>
 <translation id="5586446728396275693">没有已保存的地址</translation>
 <translation id="5595485650161345191">修改地址</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 6f96886..c5a6292 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -306,7 +306,6 @@
 <translation id="2479410451996844060">無效的搜尋網址。</translation>
 <translation id="2482878487686419369">通知</translation>
 <translation id="248348093745724435">裝置政策</translation>
-<translation id="2485387744899240041">你在裝置和瀏覽器中的使用者名稱</translation>
 <translation id="2491120439723279231">伺服器憑證含有錯誤。</translation>
 <translation id="2493640343870896922">Letter-Plus</translation>
 <translation id="2495083838625180221">JSON 剖析器</translation>
@@ -872,7 +871,6 @@
 <translation id="5565735124758917034">管理中</translation>
 <translation id="5570825185877910964">保護帳戶</translation>
 <translation id="5571083550517324815">無法在這個地址取件,請改用其他地址。</translation>
-<translation id="5571347317547569613">({NUM_COOKIES,plural, =1{目前使用 1 個 Cookie}other{目前使用 # 個 Cookie}})</translation>
 <translation id="5580958916614886209">請檢查信用卡到期月份,然後再試一次</translation>
 <translation id="5586446728396275693">沒有已儲存的地址</translation>
 <translation id="5595485650161345191">編輯地址</translation>
diff --git a/components/sync/base/pref_names.cc b/components/sync/base/pref_names.cc
index e282444..fcaf241 100644
--- a/components/sync/base/pref_names.cc
+++ b/components/sync/base/pref_names.cc
@@ -54,7 +54,6 @@
 const char kSyncPriorityPreferences[] = "sync.priority_preferences";
 const char kSyncReadingList[] = "sync.reading_list";
 const char kSyncSearchEngines[] = "sync.search_engines";
-const char kSyncSendTabToSelf[] = "sync.send_tab_to_self";
 const char kSyncSessions[] = "sync.sessions";
 const char kSyncSupervisedUserSettings[] = "sync.managed_user_settings";
 const char kSyncSupervisedUserSharedSettings[] =
diff --git a/components/sync/base/pref_names.h b/components/sync/base/pref_names.h
index 6c4bd2b6..5bad100 100644
--- a/components/sync/base/pref_names.h
+++ b/components/sync/base/pref_names.h
@@ -42,7 +42,6 @@
 extern const char kSyncPrinters[];
 extern const char kSyncReadingList[];
 extern const char kSyncSearchEngines[];
-extern const char kSyncSendTabToSelf[];
 extern const char kSyncSessions[];
 extern const char kSyncSupervisedUserSettings[];
 extern const char kSyncSupervisedUserSharedSettings[];
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc
index 74c1bc9..93261734 100644
--- a/components/sync/base/sync_prefs.cc
+++ b/components/sync/base/sync_prefs.cc
@@ -83,8 +83,7 @@
           prefs::kSyncArcPackage,
           prefs::kSyncUserEvents,
           prefs::kSyncMountainShares,
-          prefs::kSyncUserConsents,
-          prefs::kSyncSendTabToSelf};
+          prefs::kSyncUserConsents};
 }
 
 void RegisterObsoleteUserTypePrefs(user_prefs::PrefRegistrySyncable* registry) {
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc
index a257faa..34039804 100644
--- a/components/sync/driver/sync_driver_switches.cc
+++ b/components/sync/driver/sync_driver_switches.cc
@@ -53,10 +53,6 @@
 const base::Feature kStopSyncInPausedState{"StopSyncInPausedState",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Controls whether a user can receive tabs from their synced devices
-const base::Feature kSyncSendTabToSelf{"SyncSendTabToSelf",
-                                       base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable USS implementation of Bookmarks datatype.
 const base::Feature kSyncUSSBookmarks{"SyncUSSBookmarks",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h
index 92e9ace..84f0338 100644
--- a/components/sync/driver/sync_driver_switches.h
+++ b/components/sync/driver/sync_driver_switches.h
@@ -29,7 +29,6 @@
 extern const base::Feature kStopSyncInPausedState;
 extern const base::Feature
     kSyncAllowWalletDataInTransportModeWithCustomPassphrase;
-extern const base::Feature kSyncSendTabToSelf;
 extern const base::Feature kSyncUSSBookmarks;
 extern const base::Feature kSyncUSSPasswords;
 extern const base::Feature kSyncUSSNigori;
diff --git a/components/tracing/common/tracing_switches.cc b/components/tracing/common/tracing_switches.cc
index 1c74ee9c..8f7157f2 100644
--- a/components/tracing/common/tracing_switches.cc
+++ b/components/tracing/common/tracing_switches.cc
@@ -37,7 +37,7 @@
 // all events since startup.
 const char kTraceStartupFile[]              = "trace-startup-file";
 
-// If supplied, sets the tracing record mode; otherwise, the default
+// If supplied, sets the tracing record mode and options; otherwise, the default
 // "record-until-full" mode will be used.
 const char kTraceStartupRecordMode[] = "trace-startup-record-mode";
 
@@ -58,6 +58,11 @@
 // through the normal methods for stopping system traces.
 const char kTraceStartupOwner[] = "trace-startup-owner";
 
+// If the perfetto tracing backend is used, this enables privacy filtering in
+// the TraceEvent data sources for the startup tracing session.
+const char kTraceStartupEnablePrivacyFiltering[] =
+    "trace-startup-enable-privacy-filtering";
+
 // Disables the perfetto tracing backend. We need a separate command line
 // argument from the kTracingPerfettoBackend feature, because feature flags are
 // parsed too late during startup for early startup tracing support.
diff --git a/components/tracing/common/tracing_switches.h b/components/tracing/common/tracing_switches.h
index b06520d6..c04df64 100644
--- a/components/tracing/common/tracing_switches.h
+++ b/components/tracing/common/tracing_switches.h
@@ -16,6 +16,7 @@
 TRACING_EXPORT extern const char kTraceStartupFile[];
 TRACING_EXPORT extern const char kTraceStartupRecordMode[];
 TRACING_EXPORT extern const char kTraceStartupOwner[];
+TRACING_EXPORT extern const char kTraceStartupEnablePrivacyFiltering[];
 TRACING_EXPORT extern const char kDisablePerfetto[];
 TRACING_EXPORT extern const char kEnablePerfetto[];
 TRACING_EXPORT extern const char kPerfettoDisableInterning[];
diff --git a/components/viz/host/gpu_client.cc b/components/viz/host/gpu_client.cc
index f914de2..3f213deae 100644
--- a/components/viz/host/gpu_client.cc
+++ b/components/viz/host/gpu_client.cc
@@ -211,8 +211,8 @@
 }
 
 void GpuClient::CreateGpuMemoryBufferFactory(
-    mojom::GpuMemoryBufferFactoryRequest request) {
-  gpu_memory_buffer_factory_bindings_.AddBinding(this, std::move(request));
+    mojo::PendingReceiver<mojom::GpuMemoryBufferFactory> receiver) {
+  gpu_memory_buffer_factory_receivers_.Add(this, std::move(receiver));
 }
 
 }  // namespace viz
diff --git a/components/viz/host/gpu_client.h b/components/viz/host/gpu_client.h
index 9b9cdc0..54b27c72 100644
--- a/components/viz/host/gpu_client.h
+++ b/components/viz/host/gpu_client.h
@@ -11,6 +11,7 @@
 #include "components/viz/host/gpu_host_impl.h"
 #include "components/viz/host/viz_host_export.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
 #include "services/viz/public/mojom/gpu.mojom.h"
 
 namespace viz {
@@ -52,7 +53,7 @@
 
   // mojom::Gpu overrides:
   void CreateGpuMemoryBufferFactory(
-      mojom::GpuMemoryBufferFactoryRequest request) override;
+      mojo::PendingReceiver<mojom::GpuMemoryBufferFactory> receiver) override;
   void EstablishGpuChannel(EstablishGpuChannelCallback callback) override;
 
 #if defined(OS_CHROMEOS)
@@ -83,8 +84,8 @@
   std::unique_ptr<GpuClientDelegate> delegate_;
   const int client_id_;
   const uint64_t client_tracing_id_;
-  mojo::BindingSet<mojom::GpuMemoryBufferFactory>
-      gpu_memory_buffer_factory_bindings_;
+  mojo::ReceiverSet<mojom::GpuMemoryBufferFactory>
+      gpu_memory_buffer_factory_receivers_;
   mojo::BindingSet<mojom::Gpu> gpu_bindings_;
   bool gpu_channel_requested_ = false;
   EstablishGpuChannelCallback callback_;
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc
index 57afe81..a6a217b 100644
--- a/components/viz/service/display/direct_renderer.cc
+++ b/components/viz/service/display/direct_renderer.cc
@@ -792,10 +792,12 @@
 gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass(
     const RenderPass* render_pass) const {
   const RenderPass* root_render_pass = current_frame()->root_render_pass;
-  const gfx::Rect root_damage_rect = current_frame()->root_damage_rect;
+  gfx::Rect root_damage_rect = current_frame()->root_damage_rect;
 
-  if (render_pass == root_render_pass)
+  if (render_pass == root_render_pass) {
+    root_damage_rect.Union(output_surface_->GetCurrentFramebufferDamage());
     return root_damage_rect;
+  }
 
   // If the root damage rect has been expanded due to overlays, all the other
   // damage rect calculations are incorrect.
diff --git a/components/viz/service/display/output_surface.cc b/components/viz/service/display/output_surface.cc
index 81f92a2..fa147f3 100644
--- a/components/viz/service/display/output_surface.cc
+++ b/components/viz/service/display/output_surface.cc
@@ -6,6 +6,8 @@
 
 #include <stdint.h>
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/macros.h"
@@ -16,6 +18,7 @@
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/swap_result.h"
 
 namespace viz {
@@ -35,6 +38,10 @@
 
 OutputSurface::~OutputSurface() = default;
 
+gfx::Rect OutputSurface::GetCurrentFramebufferDamage() const {
+  return gfx::Rect();
+}
+
 SkiaOutputSurface* OutputSurface::AsSkiaOutputSurface() {
   return nullptr;
 }
diff --git a/components/viz/service/display/output_surface.h b/components/viz/service/display/output_surface.h
index dd36626..44b7d28 100644
--- a/components/viz/service/display/output_surface.h
+++ b/components/viz/service/display/output_surface.h
@@ -27,6 +27,7 @@
 
 namespace gfx {
 class ColorSpace;
+class Rect;
 class Size;
 struct SwapResponse;
 }  // namespace gfx
@@ -141,6 +142,16 @@
   // after returning from this method in order to unblock the next frame.
   virtual void SwapBuffers(OutputSurfaceFrame frame) = 0;
 
+  // Returns a rectangle whose contents may have changed since the current
+  // buffer was last submitted and needs to be redrawn. For partial swap,
+  // the contents outside this rectangle can be considered valid and do not need
+  // to be redrawn.
+  // In cases where partial swap is disabled, this method will still be called.
+  // The direct renderer will union the returned rect with the rectangle of the
+  // surface itself.
+  // TODO(dcastagna): Consider making the following pure virtual.
+  virtual gfx::Rect GetCurrentFramebufferDamage() const;
+
   // Updates the GpuFence associated with this surface. The id of a newly
   // created GpuFence is returned, or if an error occurs, or fences are not
   // supported, the special id of 0 (meaning "no fence") is returned.  In all
diff --git a/components/viz/service/display/software_output_device.cc b/components/viz/service/display/software_output_device.cc
index 90b65bc..4efef8d 100644
--- a/components/viz/service/display/software_output_device.cc
+++ b/components/viz/service/display/software_output_device.cc
@@ -4,6 +4,8 @@
 
 #include "components/viz/service/display/software_output_device.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -56,4 +58,8 @@
                                                    viewport_pixel_size_));
 }
 
+int SoftwareOutputDevice::MaxFramesPending() const {
+  return 1;
+}
+
 }  // namespace viz
diff --git a/components/viz/service/display/software_output_device.h b/components/viz/service/display/software_output_device.h
index f7ad234..6fa80d6 100644
--- a/components/viz/service/display/software_output_device.h
+++ b/components/viz/service/display/software_output_device.h
@@ -73,6 +73,8 @@
   // completes.
   virtual void OnSwapBuffers(SwapBuffersCallback swap_ack_callback);
 
+  virtual int MaxFramesPending() const;
+
  protected:
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
   SoftwareOutputDeviceClient* client_ = nullptr;
diff --git a/components/viz/service/display_embedder/buffer_queue.cc b/components/viz/service/display_embedder/buffer_queue.cc
index e874cd7..7003bbb 100644
--- a/components/viz/service/display_embedder/buffer_queue.cc
+++ b/components/viz/service/display_embedder/buffer_queue.cc
@@ -12,11 +12,8 @@
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 #include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
-#include "third_party/skia/include/core/SkRect.h"
-#include "third_party/skia/include/core/SkRegion.h"
 #include "ui/display/types/display_snapshot.h"
 #include "ui/gfx/gpu_memory_buffer.h"
-#include "ui/gfx/skia_util.h"
 
 namespace viz {
 
@@ -52,21 +49,6 @@
   return 0u;
 }
 
-void BufferQueue::CopyBufferDamage(unsigned texture,
-                                   unsigned source_texture,
-                                   const gfx::Rect& new_damage,
-                                   const gfx::Rect& old_damage) {
-  SkRegion region(gfx::RectToSkIRect(old_damage));
-  if (!region.op(gfx::RectToSkIRect(new_damage), SkRegion::kDifference_Op))
-    return;
-  for (SkRegion::Iterator it(region); !it.done(); it.next()) {
-    const SkIRect& rect = it.rect();
-    gl_->CopySubTextureCHROMIUM(
-        source_texture, 0, texture_target_, texture, 0, rect.x(), rect.y(),
-        rect.x(), rect.y(), rect.width(), rect.height(), false, false, false);
-  }
-}
-
 void BufferQueue::UpdateBufferDamage(const gfx::Rect& damage) {
   if (displayed_surface_)
     displayed_surface_->damage.Union(damage);
@@ -78,40 +60,15 @@
   }
 }
 
-void BufferQueue::CopyDamageForCurrentSurface(const gfx::Rect& damage) {
-  if (!current_surface_)
-    return;
-
-  if (damage != gfx::Rect(size_)) {
-    // Copy damage from the most recently swapped buffer. In the event that
-    // the buffer was destroyed and failed to recreate, pick from the most
-    // recently available buffer.
-    unsigned texture_id = 0;
-    for (auto& surface : base::Reversed(in_flight_surfaces_)) {
-      if (surface) {
-        texture_id = surface->texture;
-        break;
-      }
-    }
-    if (!texture_id && displayed_surface_)
-      texture_id = displayed_surface_->texture;
-
-    if (texture_id) {
-      CopyBufferDamage(current_surface_->texture, texture_id, damage,
-                       current_surface_->damage);
-    }
-  }
-  current_surface_->damage = gfx::Rect();
+gfx::Rect BufferQueue::CurrentBufferDamage() const {
+  DCHECK(current_surface_);
+  return current_surface_->damage;
 }
 
 void BufferQueue::SwapBuffers(const gfx::Rect& damage) {
-  if (damage.IsEmpty()) {
-    in_flight_surfaces_.push_back(std::move(current_surface_));
-    return;
-  }
-
-  DCHECK(!current_surface_ || current_surface_->damage.IsEmpty());
   UpdateBufferDamage(damage);
+  if (current_surface_)
+    current_surface_->damage = gfx::Rect();
   in_flight_surfaces_.push_back(std::move(current_surface_));
 }
 
diff --git a/components/viz/service/display_embedder/buffer_queue.h b/components/viz/service/display_embedder/buffer_queue.h
index 4baa6acb..2821e942 100644
--- a/components/viz/service/display_embedder/buffer_queue.h
+++ b/components/viz/service/display_embedder/buffer_queue.h
@@ -53,10 +53,16 @@
   // current buffer and one could not be created.
   unsigned GetCurrentBuffer(unsigned* stencil);
 
+  // Returns a rectangle whose contents may have changed since the current
+  // buffer was last submitted and needs to be redrawn. For partial swap,
+  // only the contents outside this rectangle can be considered valid and do not
+  // need to be redrawn.
+  gfx::Rect CurrentBufferDamage() const;
+
   // Called by the user of this object to indicate that the buffer currently
-  // marked for drawing should be moved to the list of in-flight buffers. If
-  // |damage| is not empty, the damage rectangle for all buffers except the
-  // one currently marked for drawing is unioned with |damage|.
+  // marked for drawing should be moved to the list of in-flight buffers.
+  // |damage| represents the rectangle containing the damaged area since the
+  // last SwapBuffers.
   void SwapBuffers(const gfx::Rect& damage);
 
   // Called by the user of this object to indicate that a previous request to
@@ -78,10 +84,6 @@
                const gfx::ColorSpace& color_space,
                bool use_stencil);
 
-  // Copies the damage from the most recently swapped available buffer into the
-  // current buffer.
-  void CopyDamageForCurrentSurface(const gfx::Rect& damage);
-
   uint32_t internal_format() const { return internal_format_; }
   gfx::BufferFormat buffer_format() const { return format_; }
   uint32_t texture_target() const { return texture_target_; }
@@ -108,13 +110,6 @@
 
   void FreeSurfaceResources(AllocatedSurface* surface);
 
-  // Copy everything that is in |copy_rect|, except for what is in
-  // |exclude_rect| from |source_texture| to |texture|.
-  virtual void CopyBufferDamage(unsigned texture,
-                                unsigned source_texture,
-                                const gfx::Rect& new_damage,
-                                const gfx::Rect& old_damage);
-
   void UpdateBufferDamage(const gfx::Rect& damage);
 
   // Return a surface, available to be drawn into.
diff --git a/components/viz/service/display_embedder/buffer_queue_unittest.cc b/components/viz/service/display_embedder/buffer_queue_unittest.cc
index a6ecd16..47a709c 100644
--- a/components/viz/service/display_embedder/buffer_queue_unittest.cc
+++ b/components/viz/service/display_embedder/buffer_queue_unittest.cc
@@ -104,20 +104,6 @@
 const unsigned int kBufferQueueInternalformat = GL_RGBA;
 const gfx::BufferFormat kBufferQueueFormat = gfx::BufferFormat::RGBA_8888;
 
-class MockBufferQueue : public BufferQueue {
- public:
-  MockBufferQueue(gpu::gles2::GLES2Interface* gl,
-                  gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
-                  const gpu::Capabilities& capabilities)
-      : BufferQueue(gl,
-                    kBufferQueueFormat,
-                    gpu_memory_buffer_manager,
-                    kFakeSurfaceHandle,
-                    capabilities) {}
-  MOCK_METHOD4(CopyBufferDamage,
-               void(unsigned, unsigned, const gfx::Rect&, const gfx::Rect&));
-};
-
 class BufferQueueTest : public ::testing::Test {
  public:
   BufferQueueTest() {}
@@ -130,9 +116,10 @@
     context_provider_ = TestContextProvider::Create(std::move(context));
     context_provider_->BindToCurrentThread();
     gpu_memory_buffer_manager_.reset(new StubGpuMemoryBufferManager);
-    mock_output_surface_ = new MockBufferQueue(
-        context_provider_->ContextGL(), gpu_memory_buffer_manager_.get(),
-        context_provider_->ContextCapabilities());
+    mock_output_surface_ =
+        new BufferQueue(context_provider_->ContextGL(), kBufferQueueFormat,
+                        gpu_memory_buffer_manager_.get(), kFakeSurfaceHandle,
+                        context_provider_->ContextCapabilities());
     output_surface_.reset(mock_output_surface_);
   }
 
@@ -184,7 +171,6 @@
   }
 
   void SwapBuffers(const gfx::Rect& damage) {
-    output_surface_->CopyDamageForCurrentSurface(damage);
     output_surface_->SwapBuffers(damage);
   }
 
@@ -214,7 +200,7 @@
   scoped_refptr<TestContextProvider> context_provider_;
   std::unique_ptr<StubGpuMemoryBufferManager> gpu_memory_buffer_manager_;
   std::unique_ptr<BufferQueue> output_surface_;
-  MockBufferQueue* mock_output_surface_;
+  BufferQueue* mock_output_surface_;
 };
 
 namespace {
@@ -300,43 +286,9 @@
   EXPECT_GT(output_surface->GetCurrentBuffer(&stencil), 0u);
 }
 
-TEST(BufferQueueStandaloneTest, CopyBufferDamage) {
-  scoped_refptr<TestContextProvider> context_provider =
-      TestContextProvider::Create();
-  context_provider->BindToCurrentThread();
-  std::unique_ptr<StubGpuMemoryBufferManager> gpu_memory_buffer_manager;
-  std::unique_ptr<BufferQueue> output_surface;
-  gpu_memory_buffer_manager.reset(new StubGpuMemoryBufferManager);
-
-  output_surface.reset(
-      new BufferQueue(context_provider->ContextGL(), kBufferQueueFormat,
-                      gpu_memory_buffer_manager.get(), kFakeSurfaceHandle,
-                      context_provider->ContextCapabilities()));
-  EXPECT_TRUE(
-      output_surface->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false));
-  // Trigger a sub-buffer copy to exercise all paths.
-  unsigned stencil;
-  EXPECT_GT(output_surface->GetCurrentBuffer(&stencil), 0u);
-  output_surface->CopyDamageForCurrentSurface(screen_rect);
-  output_surface->SwapBuffers(screen_rect);
-  output_surface->PageFlipComplete();
-  EXPECT_GT(output_surface->GetCurrentBuffer(&stencil), 0u);
-  output_surface->CopyDamageForCurrentSurface(small_damage);
-  output_surface->SwapBuffers(small_damage);
-}
-
 TEST_F(BufferQueueTest, PartialSwapReuse) {
   EXPECT_TRUE(
       output_surface_->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false));
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, small_damage, screen_rect))
-      .Times(1);
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, small_damage, small_damage))
-      .Times(1);
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, large_damage, small_damage))
-      .Times(1);
   SendFullFrame();
   SendDamagedFrame(small_damage);
   SendDamagedFrame(small_damage);
@@ -348,9 +300,6 @@
 TEST_F(BufferQueueTest, PartialSwapFullFrame) {
   EXPECT_TRUE(
       output_surface_->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false));
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, small_damage, screen_rect))
-      .Times(1);
   SendFullFrame();
   SendDamagedFrame(small_damage);
   SendFullFrame();
@@ -358,15 +307,37 @@
   EXPECT_EQ(next_frame()->damage, screen_rect);
 }
 
+// Make sure that each time we swap buffers, the damage gets propagated to the
+// previously swapped buffers.
+TEST_F(BufferQueueTest, PartialSwapWithTripleBuffering) {
+  unsigned stencil = 0;
+  EXPECT_TRUE(
+      output_surface_->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false));
+  SendFullFrame();
+  SendFullFrame();
+  // Let's triple buffer.
+  EXPECT_GT(output_surface_->GetCurrentBuffer(&stencil), 0u);
+  SwapBuffers(small_damage);
+  EXPECT_GT(output_surface_->GetCurrentBuffer(&stencil), 0u);
+  EXPECT_EQ(3, CountBuffers());
+  // The whole buffer needs to be redrawn since it's a newly allocated buffer
+  EXPECT_EQ(output_surface_->CurrentBufferDamage(), screen_rect);
+
+  SendDamagedFrame(overlapping_damage);
+  // The next buffer should include damage from |overlapping_damage| and
+  // |small_damage|.
+  EXPECT_GT(output_surface_->GetCurrentBuffer(&stencil), 0u);
+  const auto current_buffer_damage = output_surface_->CurrentBufferDamage();
+  EXPECT_TRUE(current_buffer_damage.Contains(overlapping_damage));
+  EXPECT_TRUE(current_buffer_damage.Contains(small_damage));
+
+  // Let's make sure the damage is not trivially the whole screen.
+  EXPECT_NE(current_buffer_damage, screen_rect);
+}
+
 TEST_F(BufferQueueTest, PartialSwapOverlapping) {
   EXPECT_TRUE(
       output_surface_->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false));
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, small_damage, screen_rect))
-      .Times(1);
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(_, _, overlapping_damage, small_damage))
-      .Times(1);
 
   SendFullFrame();
   SendDamagedFrame(small_damage);
@@ -596,38 +567,20 @@
   SwapBuffers(screen_rect);
   EXPECT_FALSE(current_frame());
 
-  // Try another swap. It should copy the buffer damage from the back
-  // surface.
   gpu_memory_buffer_manager_->set_allocate_succeeds(true);
   EXPECT_GT(output_surface_->GetCurrentBuffer(&stencil), 0u);
-  unsigned int source_texture = in_flight_surfaces().front()->texture;
-  unsigned int target_texture = current_frame()->texture;
-  testing::Mock::VerifyAndClearExpectations(mock_output_surface_);
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(target_texture, source_texture, small_damage, _))
-      .Times(1);
   SwapBuffers(small_damage);
-  testing::Mock::VerifyAndClearExpectations(mock_output_surface_);
 
-  // Destroy the just-created buffer, and try another swap. The copy should
-  // come from the displayed surface (because both in-flight surfaces are
-  // gone now).
+  // Destroy the just-created buffer, and try another swap.
   output_surface_->PageFlipComplete();
   in_flight_surfaces().back().reset();
   EXPECT_EQ(2u, in_flight_surfaces().size());
   for (auto& surface : in_flight_surfaces())
     EXPECT_FALSE(surface);
   EXPECT_GT(output_surface_->GetCurrentBuffer(&stencil), 0u);
-  source_texture = displayed_frame()->texture;
   EXPECT_TRUE(current_frame());
   EXPECT_TRUE(displayed_frame());
-  target_texture = current_frame()->texture;
-  testing::Mock::VerifyAndClearExpectations(mock_output_surface_);
-  EXPECT_CALL(*mock_output_surface_,
-              CopyBufferDamage(target_texture, source_texture, small_damage, _))
-      .Times(1);
   SwapBuffers(small_damage);
-  testing::Mock::VerifyAndClearExpectations(mock_output_surface_);
 }
 
 }  // namespace
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
index 01db6191..a45dae7 100644
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
+++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
@@ -100,11 +100,6 @@
   }
 }
 
-void GLOutputSurfaceBufferQueue::SetDrawRectangle(const gfx::Rect& damage) {
-  GLOutputSurface::SetDrawRectangle(damage);
-  buffer_queue_->CopyDamageForCurrentSurface(damage);
-}
-
 void GLOutputSurfaceBufferQueue::SwapBuffers(OutputSurfaceFrame frame) {
   DCHECK(buffer_queue_);
 
@@ -120,6 +115,10 @@
   GLOutputSurface::SwapBuffers(std::move(frame));
 }
 
+gfx::Rect GLOutputSurfaceBufferQueue::GetCurrentFramebufferDamage() const {
+  return buffer_queue_->CurrentBufferDamage();
+}
+
 uint32_t GLOutputSurfaceBufferQueue::GetFramebufferCopyTextureFormat() {
   return buffer_queue_->internal_format();
 }
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
index 594b38b..a20efaa 100644
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
+++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
@@ -14,6 +14,7 @@
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display_embedder/gl_output_surface.h"
 #include "components/viz/service/display_embedder/viz_process_context_provider.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/swap_result.h"
@@ -57,11 +58,11 @@
   // OutputSurface implementation.
   void BindFramebuffer() override;
   void SwapBuffers(OutputSurfaceFrame frame) override;
+  gfx::Rect GetCurrentFramebufferDamage() const override;
   uint32_t GetFramebufferCopyTextureFormat() override;
   bool IsDisplayedAsOverlayPlane() const override;
   unsigned GetOverlayTextureId() const override;
   gfx::BufferFormat GetOverlayBufferFormat() const override;
-  void SetDrawRectangle(const gfx::Rect& damage) override;
 
   // GLOutputSurface:
   void DidReceiveSwapBuffersAck(const gfx::SwapResponse& response) override;
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.cc b/components/viz/service/display_embedder/output_surface_provider_impl.cc
index e3c8e9d..0880cf5 100644
--- a/components/viz/service/display_embedder/output_surface_provider_impl.cc
+++ b/components/viz/service/display_embedder/output_surface_provider_impl.cc
@@ -243,7 +243,10 @@
   return std::make_unique<SoftwareOutputDeviceOzone>(
       std::move(platform_window_surface), std::move(surface_ozone));
 #elif defined(USE_X11)
-  return std::make_unique<SoftwareOutputDeviceX11>(surface_handle);
+  return std::make_unique<SoftwareOutputDeviceX11>(
+      surface_handle, gpu_service_impl_->in_host_process()
+                          ? nullptr
+                          : gpu_service_impl_->main_runner());
 #endif
 }
 
diff --git a/components/viz/service/display_embedder/software_output_device_x11.cc b/components/viz/service/display_embedder/software_output_device_x11.cc
index ab13e1e3..3c303092 100644
--- a/components/viz/service/display_embedder/software_output_device_x11.cc
+++ b/components/viz/service/display_embedder/software_output_device_x11.cc
@@ -8,9 +8,13 @@
 #include <stdint.h>
 #include <string.h>
 
+#include <memory>
+#include <utility>
+
 #include "base/macros.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
+#include "ui/base/x/x11_shm_image_pool.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/base/x/x11_util_internal.h"
 #include "ui/gfx/x/x11.h"
@@ -21,6 +25,8 @@
 
 namespace {
 
+constexpr int kMaxFramesPending = 2;
+
 class ScopedPixmap {
  public:
   ScopedPixmap(XDisplay* display, Pixmap pixmap)
@@ -39,24 +45,21 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedPixmap);
 };
 
-struct XImageDeleter {
-  void operator()(XImage* image) const { XDestroyImage(image); }
-};
+}  // namespace
 
-// Draw |data| over |widget|'s parent-relative background, and write the
-// resulting image to |widget|.  Returns true on success.
-bool CompositeBitmap(XDisplay* display,
-                     XID widget,
-                     int x,
-                     int y,
-                     int width,
-                     int height,
-                     int depth,
-                     GC gc,
-                     const void* data) {
+// static
+bool SoftwareOutputDeviceX11::CompositeBitmap(XDisplay* display,
+                                              XID widget,
+                                              int x,
+                                              int y,
+                                              int width,
+                                              int height,
+                                              int depth,
+                                              GC gc,
+                                              const void* data) {
   XClearArea(display, widget, x, y, width, height, false);
 
-  std::unique_ptr<XImage, XImageDeleter> bg;
+  ui::XScopedImage bg;
   {
     gfx::X11ErrorTracker ignore_x_errors;
     bg.reset(
@@ -111,9 +114,8 @@
   return true;
 }
 
-}  // namespace
-
-SoftwareOutputDeviceX11::SoftwareOutputDeviceX11(gfx::AcceleratedWidget widget)
+SoftwareOutputDeviceX11::SoftwareOutputDeviceX11(gfx::AcceleratedWidget widget,
+                                                 base::TaskRunner* task_runner)
     : widget_(widget), display_(gfx::GetXDisplay()), gc_(nullptr) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
@@ -122,6 +124,14 @@
     LOG(ERROR) << "XGetWindowAttributes failed for window " << widget_;
     return;
   }
+
+  shm_pool_ = base::MakeRefCounted<ui::XShmImagePool>(
+      task_runner_.get(), task_runner, display_, widget_, attributes_.visual,
+      attributes_.depth, kMaxFramesPending);
+  shm_pool_->Initialize();
+
+  // TODO(thomasanderson): Avoid going through the X11 server to plumb this
+  // property in.
   ui::GetIntProperty(widget_, "CHROMIUM_COMPOSITE_WINDOW", &composite_);
 }
 
@@ -129,21 +139,60 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   XFreeGC(display_, gc_);
+
+  shm_pool_->Teardown();
+}
+
+void SoftwareOutputDeviceX11::Resize(const gfx::Size& pixel_size,
+                                     float scale_factor) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // Fallback to the non-shm codepath when |composite_| is true, which only
+  // happens for status icon windows that are typically 16x16px.  It's possible
+  // to add a shm codepath, but it wouldn't be buying much since it would only
+  // affect windows that are tiny and infrequently updated.
+  if (!composite_ && shm_pool_->Resize(pixel_size)) {
+    needs_swap_ = false;
+    viewport_pixel_size_ = pixel_size;
+    return;
+  }
+
+  SoftwareOutputDevice::Resize(pixel_size, scale_factor);
+}
+
+SkCanvas* SoftwareOutputDeviceX11::BeginPaint(const gfx::Rect& damage_rect) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  damage_rect_ = damage_rect;
+
+  if (shm_pool_->Ready())
+    return new SkCanvas(shm_pool_->CurrentBitmap());
+
+  return SoftwareOutputDevice::BeginPaint(damage_rect);
 }
 
 void SoftwareOutputDeviceX11::EndPaint() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
   SoftwareOutputDevice::EndPaint();
 
-  if (!surface_)
-    return;
-
   gfx::Rect rect = damage_rect_;
   rect.Intersect(gfx::Rect(viewport_pixel_size_));
   if (rect.IsEmpty())
     return;
 
+  if (shm_pool_->Ready()) {
+    // TODO(thomasanderson): Investigate direct rendering with DRI3 to avoid any
+    // unnecessary X11 IPC or buffer copying.
+    if (XShmPutImage(display_, widget_, gc_, shm_pool_->CurrentImage(),
+                     rect.x(), rect.y(), rect.x(), rect.y(), rect.width(),
+                     rect.height(), x11::True)) {
+      needs_swap_ = true;
+      XFlush(display_);
+    }
+  }
+
+  if (!surface_)
+    return;
+
   if (composite_) {
     SkPixmap pixmap;
     surface_->peekPixels(&pixmap);
@@ -208,7 +257,6 @@
     XRenderFreePicture(display_, dest_picture);
     XFreePixmap(display_, pixmap);
   } else {
-    // TODO(jbauman): Switch to XShmPutImage since it's async.
     SkPixmap pixmap;
     surface_->peekPixels(&pixmap);
     gfx::PutARGBImage(display_, attributes_.visual, attributes_.depth, widget_,
@@ -225,4 +273,22 @@
   XFlush(display_);
 }
 
+void SoftwareOutputDeviceX11::OnSwapBuffers(
+    SwapBuffersCallback swap_ack_callback) {
+  if (shm_pool_->Ready()) {
+    if (needs_swap_)
+      shm_pool_->SwapBuffers(std::move(swap_ack_callback));
+    else
+      std::move(swap_ack_callback).Run(viewport_pixel_size_);
+    needs_swap_ = false;
+    return;
+  }
+
+  return SoftwareOutputDevice::OnSwapBuffers(std::move(swap_ack_callback));
+}
+
+int SoftwareOutputDeviceX11::MaxFramesPending() const {
+  return kMaxFramesPending;
+}
+
 }  // namespace viz
diff --git a/components/viz/service/display_embedder/software_output_device_x11.h b/components/viz/service/display_embedder/software_output_device_x11.h
index 79a5252..be846e6 100644
--- a/components/viz/service/display_embedder/software_output_device_x11.h
+++ b/components/viz/service/display_embedder/software_output_device_x11.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_X11_H_
 
 #include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/threading/thread_checker.h"
 #include "components/viz/service/display/software_output_device.h"
 #include "components/viz/service/viz_service_export.h"
@@ -13,24 +14,51 @@
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_types.h"
 
+namespace ui {
+class XShmImagePool;
+}
+
 namespace viz {
 
 class VIZ_SERVICE_EXPORT SoftwareOutputDeviceX11 : public SoftwareOutputDevice {
  public:
-  explicit SoftwareOutputDeviceX11(gfx::AcceleratedWidget widget);
+  explicit SoftwareOutputDeviceX11(gfx::AcceleratedWidget widget,
+                                   base::TaskRunner* task_runner);
 
   ~SoftwareOutputDeviceX11() override;
 
-  void EndPaint() override;
-
  private:
+  // Draw |data| over |widget|'s parent-relative background, and write the
+  // resulting image to |widget|.  Returns true on success.
+  static bool CompositeBitmap(XDisplay* display,
+                              XID widget,
+                              int x,
+                              int y,
+                              int width,
+                              int height,
+                              int depth,
+                              GC gc,
+                              const void* data);
+
+  // SoftwareOutputDevice:
+  void Resize(const gfx::Size& pixel_size, float scale_factor) override;
+  SkCanvas* BeginPaint(const gfx::Rect& damage_rect) override;
+  void EndPaint() override;
+  void OnSwapBuffers(SwapBuffersCallback swap_ack_callback) override;
+  int MaxFramesPending() const override;
+
   gfx::AcceleratedWidget widget_;
   XDisplay* display_;
   GC gc_;
   XWindowAttributes attributes_;
+
   // If nonzero, indicates that the widget should be drawn over its
   // parent-relative background.
   int composite_ = 0;
+
+  scoped_refptr<ui::XShmImagePool> shm_pool_;
+  bool needs_swap_ = false;
+
   THREAD_CHECKER(thread_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceX11);
diff --git a/components/viz/service/display_embedder/software_output_surface.cc b/components/viz/service/display_embedder/software_output_surface.cc
index af0e1858bc..85a2040 100644
--- a/components/viz/service/display_embedder/software_output_surface.cc
+++ b/components/viz/service/display_embedder/software_output_surface.cc
@@ -24,7 +24,9 @@
 
 SoftwareOutputSurface::SoftwareOutputSurface(
     std::unique_ptr<SoftwareOutputDevice> software_device)
-    : OutputSurface(std::move(software_device)) {}
+    : OutputSurface(std::move(software_device)) {
+  capabilities_.max_frames_pending = software_device_->MaxFramesPending();
+}
 
 SoftwareOutputSurface::~SoftwareOutputSurface() = default;
 
@@ -67,10 +69,7 @@
         ui::INPUT_EVENT_LATENCY_FRAME_SWAP_COMPONENT, swap_time);
   }
 
-  DCHECK(stored_latency_info_.empty())
-      << "A second frame is not expected to "
-      << "arrive before the previous latency info is processed.";
-  stored_latency_info_ = std::move(frame.latency_info);
+  stored_latency_info_.emplace(std::move(frame.latency_info));
 
   software_device()->OnSwapBuffers(
       base::BindOnce(&SoftwareOutputSurface::SwapBuffersCallback,
@@ -110,10 +109,12 @@
 
 void SoftwareOutputSurface::SwapBuffersCallback(base::TimeTicks swap_time,
                                                 const gfx::Size& pixel_size) {
-  latency_tracker_.OnGpuSwapBuffersCompleted(stored_latency_info_);
-  client_->DidFinishLatencyInfo(stored_latency_info_);
-  std::vector<ui::LatencyInfo>().swap(stored_latency_info_);
+  auto& latency_info = stored_latency_info_.front();
+  latency_tracker_.OnGpuSwapBuffersCompleted(latency_info);
+  client_->DidFinishLatencyInfo(latency_info);
+  std::vector<ui::LatencyInfo>().swap(latency_info);
   client_->DidReceiveSwapBuffersAck({swap_time, swap_time});
+  stored_latency_info_.pop();
 
   base::TimeTicks now = base::TimeTicks::Now();
   base::TimeDelta interval_to_next_refresh =
diff --git a/components/viz/service/display_embedder/software_output_surface.h b/components/viz/service/display_embedder/software_output_surface.h
index df55a34..eb3ef42 100644
--- a/components/viz/service/display_embedder/software_output_surface.h
+++ b/components/viz/service/display_embedder/software_output_surface.h
@@ -6,6 +6,8 @@
 #define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_SURFACE_H_
 
 #include <memory>
+#include <queue>
+#include <vector>
 
 #include "base/memory/weak_ptr.h"
 #include "components/viz/common/display/update_vsync_parameters_callback.h"
@@ -64,7 +66,7 @@
   base::TimeTicks refresh_timebase_;
   base::TimeDelta refresh_interval_ = BeginFrameArgs::DefaultInterval();
 
-  std::vector<ui::LatencyInfo> stored_latency_info_;
+  std::queue<std::vector<ui::LatencyInfo>> stored_latency_info_;
   ui::LatencyTracker latency_tracker_;
 
 #if defined(USE_X11)
diff --git a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
index 17eb480..15a0d82 100644
--- a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
+++ b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
@@ -3073,4 +3073,42 @@
   EXPECT_EQ(parent_id2, parent_support().last_activated_surface_id());
 }
 
+// Check that if two different SurfaceIds with the same embed token are
+// embedded, viz doesn't crash. https://crbug.com/1001143
+TEST_F(SurfaceSynchronizationTest,
+       DuplicateAllocationGroupInActivationDependencies) {
+  const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
+  const SurfaceId child1_id1 = MakeSurfaceId(kChildFrameSink1, 1);
+  const SurfaceId child1_id2 = MakeSurfaceId(kChildFrameSink1, 2);
+  const SurfaceId child2_id1 = MakeSurfaceId(kChildFrameSink2, 1);
+
+  // Submit a CompositorFrame to |child1_id1| embedding |child2_id1|.
+  CompositorFrame child1_frame =
+      CompositorFrameBuilder()
+          .AddDefaultRenderPass()
+          .SetActivationDependencies({child2_id1})
+          .SetReferencedSurfaces({SurfaceRange(base::nullopt, child2_id1)})
+          .Build();
+  child_support1().SubmitCompositorFrame(child1_id1.local_surface_id(),
+                                         std::move(child1_frame));
+
+  // Submit a CompositorFrame to |parent_id| embedding both |child1_id1| and
+  // |child1_id2|.
+  CompositorFrame parent_frame =
+      CompositorFrameBuilder()
+          .AddDefaultRenderPass()
+          .SetActivationDependencies({child1_id1, child1_id2})
+          .SetReferencedSurfaces({SurfaceRange(base::nullopt, child1_id1),
+                                  SurfaceRange(base::nullopt, child1_id2)})
+          .Build();
+  // This shouldn't crash.
+  parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
+                                         std::move(parent_frame));
+
+  // When multiple dependencies have the same embed token, only the first one
+  // should be taken into account.
+  EXPECT_EQ(1u, parent_surface()->activation_dependencies().size());
+  EXPECT_EQ(child1_id1, *parent_surface()->activation_dependencies().begin());
+}
+
 }  // namespace viz
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc
index 3dd511b..7603ec3 100644
--- a/components/viz/service/gl/gpu_service_impl.cc
+++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -534,8 +534,10 @@
       &gpu_info_.dx12_vulkan_version_info);
   std::move(callback).Run(gpu_info_.dx12_vulkan_version_info);
 
-  // The unsandboxed GPU process fulfilled its duty. Bye bye.
-  MaybeExit(false);
+  // The unsandboxed GPU process fulfilled its duty and Dxdiag task is not
+  // running. Bye bye.
+  if (!long_dx_task_different_thread_in_progress_)
+    MaybeExit(false);
 }
 
 void GpuServiceImpl::RequestCompleteGpuInfo(
@@ -556,6 +558,7 @@
              RequestCompleteGpuInfoCallback callback) {
             std::move(callback).Run(gpu_service->gpu_info_.dx_diagnostics);
             // The unsandboxed GPU process fulfilled its duty. Bye bye.
+            gpu_service->long_dx_task_different_thread_in_progress_ = false;
             gpu_service->MaybeExit(false);
           },
           this, std::move(callback))));
@@ -591,6 +594,7 @@
 
   // We can continue on shutdown here because we're not writing any critical
   // state in this task.
+  long_dx_task_different_thread_in_progress_ = true;
   base::PostTaskAndReplyWithResult(
       base::CreateCOMSTATaskRunner(
           {base::ThreadPool(), base::TaskPriority::USER_VISIBLE,
@@ -843,15 +847,7 @@
 
 void GpuServiceImpl::Hang() {
   DCHECK(io_runner_->BelongsToCurrentThread());
-
-  main_runner_->PostTask(FROM_HERE, base::BindOnce([] {
-                           DVLOG(1) << "GPU: Simulating GPU hang";
-                           for (;;) {
-                             // Do not sleep here. The GPU watchdog timer tracks
-                             // the amount of user time this thread is using and
-                             // it doesn't use much while calling Sleep.
-                           }
-                         }));
+  main_runner_->PostTask(FROM_HERE, base::BindOnce(&gl::Hang));
 }
 
 void GpuServiceImpl::ThrowJavaException() {
diff --git a/components/viz/service/gl/gpu_service_impl.h b/components/viz/service/gl/gpu_service_impl.h
index 71f5ca88..cdb9efa 100644
--- a/components/viz/service/gl/gpu_service_impl.h
+++ b/components/viz/service/gl/gpu_service_impl.h
@@ -5,6 +5,9 @@
 #ifndef COMPONENTS_VIZ_SERVICE_GL_GPU_SERVICE_IMPL_H_
 #define COMPONENTS_VIZ_SERVICE_GL_GPU_SERVICE_IMPL_H_
 
+#include <memory>
+#include <string>
+
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/memory/scoped_refptr.h"
@@ -225,6 +228,8 @@
   }
   gpu::Scheduler* scheduler() { return scheduler_.get(); }
 
+  base::TaskRunner* main_runner() { return main_runner_.get(); }
+
   gpu::GpuWatchdogThread* watchdog_thread() { return watchdog_thread_.get(); }
 
   const gpu::GpuFeatureInfo& gpu_feature_info() const {
@@ -341,6 +346,12 @@
   base::CancelableTaskTracker bind_task_tracker_;
   std::unique_ptr<mojo::BindingSet<mojom::GpuService>> bindings_;
 
+#if defined(OS_WIN)
+  // Used to track if the Dx Diag task on a different thread is still running.
+  // The status is checked before exiting the unsandboxed GPU process.
+  bool long_dx_task_different_thread_in_progress_ = false;
+#endif
+
 #if defined(OS_CHROMEOS)
   scoped_refptr<arc::ProtectedBufferManager> protected_buffer_manager_;
 #endif  // defined(OS_CHROMEOS)
diff --git a/components/viz/service/surfaces/surface.cc b/components/viz/service/surfaces/surface.cc
index 0998764..a3f9565 100644
--- a/components/viz/service/surfaces/surface.cc
+++ b/components/viz/service/surfaces/surface.cc
@@ -493,12 +493,14 @@
   if (current_frame.metadata.deadline.IsZero())
     return;
 
-  std::vector<SurfaceAllocationGroup*> new_blocking_allocation_groups;
+  base::flat_set<SurfaceAllocationGroup*> new_blocking_allocation_groups;
   std::vector<SurfaceId> new_activation_dependencies;
   for (const SurfaceId& surface_id :
        current_frame.metadata.activation_dependencies) {
     SurfaceAllocationGroup* group =
         surface_manager_->GetOrCreateAllocationGroupForSurfaceId(surface_id);
+    if (base::Contains(new_blocking_allocation_groups, group))
+      continue;
     if (group)
       group->UpdateLastPendingReferenceAndMaybeActivate(surface_id);
     Surface* dependency = surface_manager_->GetSurfaceForId(surface_id);
@@ -511,7 +513,7 @@
     }
     if (group) {
       group->RegisterBlockedEmbedder(this, surface_id);
-      new_blocking_allocation_groups.push_back(group);
+      new_blocking_allocation_groups.insert(group);
     }
     TRACE_EVENT_WITH_FLOW2(
         TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
diff --git a/content/app/strings/content_strings.grd b/content/app/strings/content_strings.grd
index 47303ea..38b452eb 100644
--- a/content/app/strings/content_strings.grd
+++ b/content/app/strings/content_strings.grd
@@ -273,7 +273,7 @@
         checkbox
       </message>
       <message name="IDS_AX_ROLE_CONTENT_INFO" desc="Accessibility role description for credits and information about the content of the page, like copyrights and privacy statements">
-        content info
+        content information
       </message>
       <message name="IDS_AX_ROLE_DATE" desc="Accessibility role description for a date input">
         date picker
diff --git a/content/app/strings/translations/content_strings_am.xtb b/content/app/strings/translations/content_strings_am.xtb
index 3527a38..99c0fb8 100644
--- a/content/app/strings/translations/content_strings_am.xtb
+++ b/content/app/strings/translations/content_strings_am.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">ቀዳሚውን ወር አሳይ</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="4248100235867064564">የምናሌ አሞሌ</translation>
+<translation id="4254339807215791271">የይዘት መረጃ</translation>
 <translation id="4360991593054037559">እባክዎ የሚሰራ ዋጋ ያስገቡ። ሁለቱ የሚቀርቡ ዋጋዎች <ph name="VALID_VALUE_LOW" /> እና <ph name="VALID_VALUE_HIGHER" /> ናቸው።</translation>
 <translation id="4384583879834880242">ጥያቄ እና መልስ</translation>
 <translation id="4413860115965805769">የምናሌ አዝራር</translation>
diff --git a/content/app/strings/translations/content_strings_ar.xtb b/content/app/strings/translations/content_strings_ar.xtb
index 77d54b7..dc3a5a6 100644
--- a/content/app/strings/translations/content_strings_ar.xtb
+++ b/content/app/strings/translations/content_strings_ar.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">عرض الشهر السابق</translation>
 <translation id="421884353938374759">علبة الألوان</translation>
 <translation id="4248100235867064564">شريط قوائم</translation>
+<translation id="4254339807215791271">معلومات المحتوى</translation>
 <translation id="4360991593054037559">يُرجى إدخال قيمة صالحة. علمًا بأن القيم الصالحة تتراوح بين <ph name="VALID_VALUE_LOW" /> و<ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">سين وجيم</translation>
 <translation id="4413860115965805769">زر القائمة</translation>
diff --git a/content/app/strings/translations/content_strings_bg.xtb b/content/app/strings/translations/content_strings_bg.xtb
index d7533f98..73fadcf 100644
--- a/content/app/strings/translations/content_strings_bg.xtb
+++ b/content/app/strings/translations/content_strings_bg.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Показване на предишния месец</translation>
 <translation id="421884353938374759">инструмент за избор на цветове</translation>
 <translation id="4248100235867064564">лента с менюта</translation>
+<translation id="4254339807215791271">информация за съдържанието</translation>
 <translation id="4360991593054037559">Моля, въведете валидна стойност. Двете най-близки такива са <ph name="VALID_VALUE_LOW" /> и <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Въпроси и отговори</translation>
 <translation id="4413860115965805769">бутон за меню</translation>
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb
index d52036e..1c6dec4c 100644
--- a/content/app/strings/translations/content_strings_bn.xtb
+++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">পূর্ববর্তী মাস দেখান</translation>
 <translation id="421884353938374759">রঙ চয়নকারী</translation>
 <translation id="4248100235867064564">মেনু বার</translation>
+<translation id="4254339807215791271">কন্টেন্টের তথ্য</translation>
 <translation id="4360991593054037559">দয়া করে একটি বৈধ মান লিখুন৷ দুটি কাছাকাছির বৈধ মান হল <ph name="VALID_VALUE_LOW" /> এবং <ph name="VALID_VALUE_HIGHER" />৷</translation>
 <translation id="4384583879834880242">প্রশ্ন এবং উত্তর</translation>
 <translation id="4413860115965805769">মেনু বোতাম</translation>
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb
index 3fd4a439..3497a8be 100644
--- a/content/app/strings/translations/content_strings_ca.xtb
+++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostra el mes anterior</translation>
 <translation id="421884353938374759">selector de color</translation>
 <translation id="4248100235867064564">barra de menús</translation>
+<translation id="4254339807215791271">informació sobre el contingut</translation>
 <translation id="4360991593054037559">Introduïu un valor vàlid. Els valors vàlids més propers són <ph name="VALID_VALUE_LOW" /> i <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Preguntes</translation>
 <translation id="4413860115965805769">botó de menú</translation>
@@ -234,7 +235,7 @@
 <translation id="8541249477527128034">control de mitjans</translation>
 <translation id="8550857728288566671">símbol gràfic</translation>
 <translation id="8583702881314752957">llista de definicions</translation>
-<translation id="8597182159515967513">Encapçalament</translation>
+<translation id="8597182159515967513">capçalera</translation>
 <translation id="8603553056539299761">dreta i esquerra per avançar i retrocedir</translation>
 <translation id="860475260694818407">taula de continguts</translation>
 <translation id="8613126697340063924">reproducció amb comandament</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb
index 0b5826c..11d11a5 100644
--- a/content/app/strings/translations/content_strings_cs.xtb
+++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Zobrazit předchozí měsíc</translation>
 <translation id="421884353938374759">výběr barev</translation>
 <translation id="4248100235867064564">panel nabídky</translation>
+<translation id="4254339807215791271">informace o obsahu</translation>
 <translation id="4360991593054037559">Zadejte platnou hodnotu. Dvě nejbližší hodnoty jsou <ph name="VALID_VALUE_LOW" /> a <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Dotazy</translation>
 <translation id="4413860115965805769">tlačítko nabídky</translation>
diff --git a/content/app/strings/translations/content_strings_da.xtb b/content/app/strings/translations/content_strings_da.xtb
index b3991721..843d817 100644
--- a/content/app/strings/translations/content_strings_da.xtb
+++ b/content/app/strings/translations/content_strings_da.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Vis den foregående måned</translation>
 <translation id="421884353938374759">farvevælger</translation>
 <translation id="4248100235867064564">menulinje</translation>
+<translation id="4254339807215791271">indholdsoplysninger</translation>
 <translation id="4360991593054037559">Angiv en gyldig værdi. De to nærmeste gyldige værdier er <ph name="VALID_VALUE_LOW" /> og <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Spørgsmål og svar</translation>
 <translation id="4413860115965805769">menuknap</translation>
diff --git a/content/app/strings/translations/content_strings_de.xtb b/content/app/strings/translations/content_strings_de.xtb
index eab91de..7147100 100644
--- a/content/app/strings/translations/content_strings_de.xtb
+++ b/content/app/strings/translations/content_strings_de.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Vorherigen Monat anzeigen</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="4248100235867064564">Menüleiste</translation>
+<translation id="4254339807215791271">Inhaltsinformationen</translation>
 <translation id="4360991593054037559">Geben Sie einen gültigen Wert ein. Die zwei nächstliegenden gültigen Werte sind <ph name="VALID_VALUE_LOW" /> und <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Fragen und Antworten</translation>
 <translation id="4413860115965805769">Menüschaltfläche</translation>
diff --git a/content/app/strings/translations/content_strings_el.xtb b/content/app/strings/translations/content_strings_el.xtb
index a8fd8db1..43b3c3e8 100644
--- a/content/app/strings/translations/content_strings_el.xtb
+++ b/content/app/strings/translations/content_strings_el.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Εμφάνιση προηγούμενου μήνα</translation>
 <translation id="421884353938374759">επιλογέας χρώματος</translation>
 <translation id="4248100235867064564">γραμμή μενού</translation>
+<translation id="4254339807215791271">πληροφορίες περιεχομένου</translation>
 <translation id="4360991593054037559">Καταχωρίστε μια έγκυρη τιμή. Οι δύο πιο κοντινές έγκυρες τιμές είναι <ph name="VALID_VALUE_LOW" /> και <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Ερωτήσεις και απαντήσεις</translation>
 <translation id="4413860115965805769">κουμπί μενού</translation>
diff --git a/content/app/strings/translations/content_strings_en-GB.xtb b/content/app/strings/translations/content_strings_en-GB.xtb
index 61b5894d..a0e1a1859 100644
--- a/content/app/strings/translations/content_strings_en-GB.xtb
+++ b/content/app/strings/translations/content_strings_en-GB.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Show previous month</translation>
 <translation id="421884353938374759">colour picker</translation>
 <translation id="4248100235867064564">menu bar</translation>
+<translation id="4254339807215791271">content info</translation>
 <translation id="4360991593054037559">Please enter a valid value. The two nearest valid values are <ph name="VALID_VALUE_LOW" /> and <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4413860115965805769">menu button</translation>
diff --git a/content/app/strings/translations/content_strings_es-419.xtb b/content/app/strings/translations/content_strings_es-419.xtb
index 6800e77..327481f 100644
--- a/content/app/strings/translations/content_strings_es-419.xtb
+++ b/content/app/strings/translations/content_strings_es-419.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostrar el mes anterior</translation>
 <translation id="421884353938374759">selector de color</translation>
 <translation id="4248100235867064564">barra de menús</translation>
+<translation id="4254339807215791271">información del contenido</translation>
 <translation id="4360991593054037559">Ingresa un valor válido. Los dos valores válidos más aproximados son <ph name="VALID_VALUE_LOW" /> y <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Preguntas y respuestas</translation>
 <translation id="4413860115965805769">botón de menú</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb
index 4437656f..06f8d4d 100644
--- a/content/app/strings/translations/content_strings_es.xtb
+++ b/content/app/strings/translations/content_strings_es.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostrar mes anterior</translation>
 <translation id="421884353938374759">selector de color</translation>
 <translation id="4248100235867064564">barra de menús</translation>
+<translation id="4254339807215791271">información del contenido</translation>
 <translation id="4360991593054037559">Introduce un valor válido. Los dos valores válidos más aproximados son <ph name="VALID_VALUE_LOW" /> y <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Preguntas</translation>
 <translation id="4413860115965805769">botón de menú</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb
index 2a2f0d1..af50a29b 100644
--- a/content/app/strings/translations/content_strings_et.xtb
+++ b/content/app/strings/translations/content_strings_et.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Eelmise kuu kuvamine</translation>
 <translation id="421884353938374759">värvivalija</translation>
 <translation id="4248100235867064564">menüüriba</translation>
+<translation id="4254339807215791271">sisu teave</translation>
 <translation id="4360991593054037559">Sisestage kehtiv väärtus. Kaks lähimat kehtivat väärtust on <ph name="VALID_VALUE_LOW" /> ja <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Küsimused ja vastused</translation>
 <translation id="4413860115965805769">menüünupp</translation>
diff --git a/content/app/strings/translations/content_strings_fa.xtb b/content/app/strings/translations/content_strings_fa.xtb
index 3d5ab451..07efa6a 100644
--- a/content/app/strings/translations/content_strings_fa.xtb
+++ b/content/app/strings/translations/content_strings_fa.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">نمایش ماه قبلی</translation>
 <translation id="421884353938374759">انتخابگر رنگ</translation>
 <translation id="4248100235867064564">نوار منو</translation>
+<translation id="4254339807215791271">اطلاعات محتوا</translation>
 <translation id="4360991593054037559">لطفاً یک مقدار معتبر وارد کنید. نزدیک‌ترین مقادیر معتبر <ph name="VALID_VALUE_LOW" /> و <ph name="VALID_VALUE_HIGHER" /> هستند.</translation>
 <translation id="4384583879834880242">پرسش و پاسخ</translation>
 <translation id="4413860115965805769">دکمه منو</translation>
diff --git a/content/app/strings/translations/content_strings_fi.xtb b/content/app/strings/translations/content_strings_fi.xtb
index bd3d57e05..fe8060f 100644
--- a/content/app/strings/translations/content_strings_fi.xtb
+++ b/content/app/strings/translations/content_strings_fi.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Näytä edellinen kuukausi</translation>
 <translation id="421884353938374759">värinvalitsin</translation>
 <translation id="4248100235867064564">valikkopalkki</translation>
+<translation id="4254339807215791271">sisällön tiedot</translation>
 <translation id="4360991593054037559">Syötä kelvollinen arvo. Kaksi lähintä kelvollista arvoa ovat <ph name="VALID_VALUE_LOW" /> ja <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">K &amp; V</translation>
 <translation id="4413860115965805769">valikkopainike</translation>
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb
index 1d10c2d..3f7b8c6 100644
--- a/content/app/strings/translations/content_strings_fil.xtb
+++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Ipakita ang nakaraang buwan</translation>
 <translation id="421884353938374759">tagapili ng kulay</translation>
 <translation id="4248100235867064564">menu bar</translation>
+<translation id="4254339807215791271">impormasyon ng content</translation>
 <translation id="4360991593054037559">Mangyaring maglagay ng isang wastong value. Ang dalawang pinakamalapit na wastong value ay <ph name="VALID_VALUE_LOW" /> at <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4413860115965805769">button ng menu</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb
index d746982..4399bae0 100644
--- a/content/app/strings/translations/content_strings_fr.xtb
+++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Afficher le mois précédent</translation>
 <translation id="421884353938374759">palette couleurs</translation>
 <translation id="4248100235867064564">barre de menu</translation>
+<translation id="4254339807215791271">infos sur le contenu</translation>
 <translation id="4360991593054037559">Veuillez saisir une valeur valide. Les deux valeurs valides les plus proches sont "<ph name="VALID_VALUE_LOW" />" et "<ph name="VALID_VALUE_HIGHER" />".</translation>
 <translation id="4384583879834880242">Questions/Réponses</translation>
 <translation id="4413860115965805769">bouton de menu</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb
index bbe2ed9..fb8f225 100644
--- a/content/app/strings/translations/content_strings_gu.xtb
+++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">પાછળનો મહિનો બતાવો</translation>
 <translation id="421884353938374759">રંગ ચૂંટનાર</translation>
 <translation id="4248100235867064564">મેનૂ બાર</translation>
+<translation id="4254339807215791271">કન્ટેન્ટની માહિતી</translation>
 <translation id="4360991593054037559">કૃપા કરીને એક માન્ય મૂલ્ય દાખલ કરો. બે નિકટતમ માન્ય મૂલ્યો <ph name="VALID_VALUE_LOW" /> અને <ph name="VALID_VALUE_HIGHER" /> છે.</translation>
 <translation id="4384583879834880242">પ્રશ્ન અને જવાબ</translation>
 <translation id="4413860115965805769">મેનૂ બટન</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb
index 35720792..4cdfbe05 100644
--- a/content/app/strings/translations/content_strings_hi.xtb
+++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">पिछला महीना दिखाएं</translation>
 <translation id="421884353938374759">रंग पिकर</translation>
 <translation id="4248100235867064564">मेन्यू बार</translation>
+<translation id="4254339807215791271">सामग्री की जानकारी</translation>
 <translation id="4360991593054037559">कृपया कोई मान्य मान डालें. दो निकटतम मान्य मान <ph name="VALID_VALUE_LOW" /> और <ph name="VALID_VALUE_HIGHER" /> हैं.</translation>
 <translation id="4384583879834880242">सवाल और जवाब</translation>
 <translation id="4413860115965805769">मेन्यू बटन</translation>
diff --git a/content/app/strings/translations/content_strings_hr.xtb b/content/app/strings/translations/content_strings_hr.xtb
index f6d5ca8..fdb977a 100644
--- a/content/app/strings/translations/content_strings_hr.xtb
+++ b/content/app/strings/translations/content_strings_hr.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Prikaži prethodni mjesec</translation>
 <translation id="421884353938374759">odabir boja</translation>
 <translation id="4248100235867064564">traka izbornika</translation>
+<translation id="4254339807215791271">informacije o sadržaju</translation>
 <translation id="4360991593054037559">Unesite važeću vrijednost. Dvije su najbliže važeće vrijednosti <ph name="VALID_VALUE_LOW" /> i <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Pitanja i odgovori</translation>
 <translation id="4413860115965805769">gumb izbornika</translation>
diff --git a/content/app/strings/translations/content_strings_hu.xtb b/content/app/strings/translations/content_strings_hu.xtb
index 6003b2a..7766e19 100644
--- a/content/app/strings/translations/content_strings_hu.xtb
+++ b/content/app/strings/translations/content_strings_hu.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Az előző hónap megjelenítése</translation>
 <translation id="421884353938374759">színválasztó</translation>
 <translation id="4248100235867064564">menüsor</translation>
+<translation id="4254339807215791271">tartalominformáció</translation>
 <translation id="4360991593054037559">Kérjük, érvényes értéket adjon meg. A két legközelebbi érvényes érték <ph name="VALID_VALUE_LOW" /> és <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Kérdések és válaszok</translation>
 <translation id="4413860115965805769">menügomb</translation>
diff --git a/content/app/strings/translations/content_strings_id.xtb b/content/app/strings/translations/content_strings_id.xtb
index 21cfc5a..9733b71 100644
--- a/content/app/strings/translations/content_strings_id.xtb
+++ b/content/app/strings/translations/content_strings_id.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Tampilkan bulan sebelumnya</translation>
 <translation id="421884353938374759">pemilih warna</translation>
 <translation id="4248100235867064564">bilah menu</translation>
+<translation id="4254339807215791271">info konten</translation>
 <translation id="4360991593054037559">Masukkan nilai yang valid. Dua nilai valid terdekat adalah <ph name="VALID_VALUE_LOW" /> dan <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Tanya Jawab</translation>
 <translation id="4413860115965805769">tombol menu</translation>
diff --git a/content/app/strings/translations/content_strings_it.xtb b/content/app/strings/translations/content_strings_it.xtb
index 0b432b7..07cac3bf 100644
--- a/content/app/strings/translations/content_strings_it.xtb
+++ b/content/app/strings/translations/content_strings_it.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostra mese precedente</translation>
 <translation id="421884353938374759">selettore colori</translation>
 <translation id="4248100235867064564">barra dei menu</translation>
+<translation id="4254339807215791271">informazioni sui contenuti</translation>
 <translation id="4360991593054037559">Inserisci un valore valido. I due valori validi più vicini sono <ph name="VALID_VALUE_LOW" /> e <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Domande e risposte</translation>
 <translation id="4413860115965805769">pulsante di menu</translation>
diff --git a/content/app/strings/translations/content_strings_iw.xtb b/content/app/strings/translations/content_strings_iw.xtb
index f942fac..0cb50dfd 100644
--- a/content/app/strings/translations/content_strings_iw.xtb
+++ b/content/app/strings/translations/content_strings_iw.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">הצג חודש קודם</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="4248100235867064564">שורת תפריטים</translation>
+<translation id="4254339807215791271">פרטי תוכן</translation>
 <translation id="4360991593054037559">הזן ערך חוקי. שני הערכים החוקיים הקרובים ביותר הם <ph name="VALID_VALUE_LOW" /> ו-<ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">שאלות ותשובות</translation>
 <translation id="4413860115965805769">לחצן תפריט</translation>
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb
index 14a5d32..288a3a93 100644
--- a/content/app/strings/translations/content_strings_ja.xtb
+++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">前の月を表示</translation>
 <translation id="421884353938374759">カラー選択ツール</translation>
 <translation id="4248100235867064564">メニューバー</translation>
+<translation id="4254339807215791271">コンテンツ情報</translation>
 <translation id="4360991593054037559">有効な値を入力してください。有効な値として最も近いのは <ph name="VALID_VALUE_LOW" /> と <ph name="VALID_VALUE_HIGHER" /> です。</translation>
 <translation id="4384583879834880242">Q&A</translation>
 <translation id="4413860115965805769">メニューボタン</translation>
diff --git a/content/app/strings/translations/content_strings_kn.xtb b/content/app/strings/translations/content_strings_kn.xtb
index f61aa5f..02c19f3 100644
--- a/content/app/strings/translations/content_strings_kn.xtb
+++ b/content/app/strings/translations/content_strings_kn.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">ಹಿಂದಿನ ತಿಂಗಳು ತೋರಿಸು</translation>
 <translation id="421884353938374759">ಬಣ್ಣದ ಆಯ್ಕೆಮಾಡುವಿಕೆ</translation>
 <translation id="4248100235867064564">ಮೆನು ಬಾರ್‌</translation>
+<translation id="4254339807215791271">ವಿಷಯ ಮಾಹಿತಿ</translation>
 <translation id="4360991593054037559">ಮಾನ್ಯವಾದ ಮೌಲ್ಯವನ್ನು ನಮೂದಿಸಿ. <ph name="VALID_VALUE_LOW" /> ಮತ್ತು <ph name="VALID_VALUE_HIGHER" /> ಎರಡು ಹತ್ತಿರದ ಮಾನ್ಯ ಮೌಲ್ಯಗಳಾಗಿವೆ.</translation>
 <translation id="4384583879834880242">ಪ್ರಶ್ನೋತ್ತರ</translation>
 <translation id="4413860115965805769">ಮೆನು ಬಟನ್</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb
index 8f16e08..b6c17a6 100644
--- a/content/app/strings/translations/content_strings_ko.xtb
+++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">이전 달 표시</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="4248100235867064564">메뉴 표시줄</translation>
+<translation id="4254339807215791271">콘텐츠 정보</translation>
 <translation id="4360991593054037559">유효한 값을 입력해 주세요. 가장 근접한 유효 값 2개는 <ph name="VALID_VALUE_LOW" /> 및 <ph name="VALID_VALUE_HIGHER" />입니다.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4413860115965805769">메뉴 버튼</translation>
diff --git a/content/app/strings/translations/content_strings_lt.xtb b/content/app/strings/translations/content_strings_lt.xtb
index 52f922a..dd05df5 100644
--- a/content/app/strings/translations/content_strings_lt.xtb
+++ b/content/app/strings/translations/content_strings_lt.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Rodyti ankstesnį mėnesį</translation>
 <translation id="421884353938374759">spalvos parinkiklis</translation>
 <translation id="4248100235867064564">meniu juosta</translation>
+<translation id="4254339807215791271">turinio informacija</translation>
 <translation id="4360991593054037559">Įveskite galiojančią vertę. Dvi artimiausios vertės yra <ph name="VALID_VALUE_LOW" /> ir <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Klausimai ir atsakymai</translation>
 <translation id="4413860115965805769">meniu mygtukas</translation>
diff --git a/content/app/strings/translations/content_strings_lv.xtb b/content/app/strings/translations/content_strings_lv.xtb
index b788d75..8908f64 100644
--- a/content/app/strings/translations/content_strings_lv.xtb
+++ b/content/app/strings/translations/content_strings_lv.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Rādīt iepriekšējo mēnesi</translation>
 <translation id="421884353938374759">krāsu izvēle</translation>
 <translation id="4248100235867064564">izvēļņu josla</translation>
+<translation id="4254339807215791271">satura informācija</translation>
 <translation id="4360991593054037559">Lūdzu, ievadiet derīgu vērtību. Divas tuvākās derīgās vērtības ir <ph name="VALID_VALUE_LOW" /> un <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Jautājumi un atbildes</translation>
 <translation id="4413860115965805769">izvēlnes poga</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb
index ab6a6da..0d731381 100644
--- a/content/app/strings/translations/content_strings_ml.xtb
+++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">മുൻ മാസം കാണിക്കുക</translation>
 <translation id="421884353938374759">വർണ്ണ പിക്കർ</translation>
 <translation id="4248100235867064564">മെനു ബാർ</translation>
+<translation id="4254339807215791271">ഉള്ളടക്ക വിവരം</translation>
 <translation id="4360991593054037559">സാധുവായ മൂല്യം നൽകുക. സാധുവായ ഏറ്റവുമടുത്ത രണ്ട് മൂല്യങ്ങൾ <ph name="VALID_VALUE_LOW" />, <ph name="VALID_VALUE_HIGHER" /> എന്നിവയാണ്.</translation>
 <translation id="4384583879834880242">ചോദ്യോത്തരം</translation>
 <translation id="4413860115965805769">മെനു ബട്ടൺ</translation>
diff --git a/content/app/strings/translations/content_strings_mr.xtb b/content/app/strings/translations/content_strings_mr.xtb
index b0afcf27..cf93b0f5 100644
--- a/content/app/strings/translations/content_strings_mr.xtb
+++ b/content/app/strings/translations/content_strings_mr.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">मागील महिना दर्शवा</translation>
 <translation id="421884353938374759">रंग निवडक</translation>
 <translation id="4248100235867064564">मेनू बार</translation>
+<translation id="4254339807215791271">आशय माहिती</translation>
 <translation id="4360991593054037559">कृपया एक वैध मूल्य एंटर करा. दोन जवळील वैध मूल्ये <ph name="VALID_VALUE_LOW" /> आणि <ph name="VALID_VALUE_HIGHER" /> आहेत.</translation>
 <translation id="4384583879834880242">प्रश्नोत्तरे</translation>
 <translation id="4413860115965805769">मेनू बटण</translation>
diff --git a/content/app/strings/translations/content_strings_ms.xtb b/content/app/strings/translations/content_strings_ms.xtb
index 8bbee989..92f4af9 100644
--- a/content/app/strings/translations/content_strings_ms.xtb
+++ b/content/app/strings/translations/content_strings_ms.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Tunjukkan bulan sebelumnya</translation>
 <translation id="421884353938374759">pemilih warna</translation>
 <translation id="4248100235867064564">bar menu</translation>
+<translation id="4254339807215791271">maklumat kandungan</translation>
 <translation id="4360991593054037559">Sila masukkan nilai yang sah. Dua nilai sah yang terdekat ialah <ph name="VALID_VALUE_LOW" /> dan <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Soal Jawab</translation>
 <translation id="4413860115965805769">butang menu</translation>
diff --git a/content/app/strings/translations/content_strings_nl.xtb b/content/app/strings/translations/content_strings_nl.xtb
index d2efff1..5abea9e 100644
--- a/content/app/strings/translations/content_strings_nl.xtb
+++ b/content/app/strings/translations/content_strings_nl.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Vorige maand weergeven</translation>
 <translation id="421884353938374759">kleurkiezer</translation>
 <translation id="4248100235867064564">menubalk</translation>
+<translation id="4254339807215791271">informatie over content</translation>
 <translation id="4360991593054037559">Geef een geldige waarde op. De twee dichtstbijzijnde geldige waarden zijn <ph name="VALID_VALUE_LOW" /> en <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4413860115965805769">menuknop</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb
index c5d6513..6620521 100644
--- a/content/app/strings/translations/content_strings_no.xtb
+++ b/content/app/strings/translations/content_strings_no.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Se forrige måned</translation>
 <translation id="421884353938374759">fargevelger</translation>
 <translation id="4248100235867064564">menyrad</translation>
+<translation id="4254339807215791271">innholdsinformasjon</translation>
 <translation id="4360991593054037559">Skriv inn en gyldig verdi. De to nærmeste, gyldige verdiene er <ph name="VALID_VALUE_LOW" /> og <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Spørsmål og svar</translation>
 <translation id="4413860115965805769">menyknapp</translation>
diff --git a/content/app/strings/translations/content_strings_pl.xtb b/content/app/strings/translations/content_strings_pl.xtb
index a896f71..129769dd 100644
--- a/content/app/strings/translations/content_strings_pl.xtb
+++ b/content/app/strings/translations/content_strings_pl.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Pokaż poprzedni miesiąc</translation>
 <translation id="421884353938374759">selektor kolorów</translation>
 <translation id="4248100235867064564">pasek menu</translation>
+<translation id="4254339807215791271">informacje o zawartości</translation>
 <translation id="4360991593054037559">Podaj prawidłową wartość. Dwie najbliższe prawidłowe wartości to <ph name="VALID_VALUE_LOW" /> i <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Pytania i odpowiedzi</translation>
 <translation id="4413860115965805769">przycisk menu</translation>
diff --git a/content/app/strings/translations/content_strings_pt-BR.xtb b/content/app/strings/translations/content_strings_pt-BR.xtb
index 4f73fa1..9af7af3 100644
--- a/content/app/strings/translations/content_strings_pt-BR.xtb
+++ b/content/app/strings/translations/content_strings_pt-BR.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostrar mês anterior</translation>
 <translation id="421884353938374759">Seletor de cores</translation>
 <translation id="4248100235867064564">barra de menu</translation>
+<translation id="4254339807215791271">informações sobre o conteúdo</translation>
 <translation id="4360991593054037559">Insira um valor válido. Os dois valores válidos mais próximos são <ph name="VALID_VALUE_LOW" /> e <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Perguntas e respostas</translation>
 <translation id="4413860115965805769">botão de menu</translation>
diff --git a/content/app/strings/translations/content_strings_pt-PT.xtb b/content/app/strings/translations/content_strings_pt-PT.xtb
index 49dca17..d9c4c98 100644
--- a/content/app/strings/translations/content_strings_pt-PT.xtb
+++ b/content/app/strings/translations/content_strings_pt-PT.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Mostrar mês anterior</translation>
 <translation id="421884353938374759">seletor de cores</translation>
 <translation id="4248100235867064564">barra de menu</translation>
+<translation id="4254339807215791271">informações do conteúdo</translation>
 <translation id="4360991593054037559">Introduza um valor válido. Os dois valores válidos mais próximos são <ph name="VALID_VALUE_LOW" /> e <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Perg e Resp</translation>
 <translation id="4413860115965805769">botão de menu</translation>
diff --git a/content/app/strings/translations/content_strings_ro.xtb b/content/app/strings/translations/content_strings_ro.xtb
index 6677abe..e0a306e9 100644
--- a/content/app/strings/translations/content_strings_ro.xtb
+++ b/content/app/strings/translations/content_strings_ro.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Afișează luna anterioară</translation>
 <translation id="421884353938374759">selector de culoare</translation>
 <translation id="4248100235867064564">bară de meniu</translation>
+<translation id="4254339807215791271">informații privind conținutul</translation>
 <translation id="4360991593054037559">Introduceți o valoare validă. Cele mai apropiate valori valide sunt <ph name="VALID_VALUE_LOW" /> și <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Întrebări și răspunsuri</translation>
 <translation id="4413860115965805769">buton de meniu</translation>
diff --git a/content/app/strings/translations/content_strings_ru.xtb b/content/app/strings/translations/content_strings_ru.xtb
index c7e614ea..af6b792 100644
--- a/content/app/strings/translations/content_strings_ru.xtb
+++ b/content/app/strings/translations/content_strings_ru.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Показать предыдущий месяц</translation>
 <translation id="421884353938374759">color picker</translation>
 <translation id="4248100235867064564">панель меню</translation>
+<translation id="4254339807215791271">сведения о контенте</translation>
 <translation id="4360991593054037559">Введите допустимое значение. Ближайшие допустимые значения: <ph name="VALID_VALUE_LOW" /> и <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Вопросы и ответы</translation>
 <translation id="4413860115965805769">кнопка меню</translation>
diff --git a/content/app/strings/translations/content_strings_sk.xtb b/content/app/strings/translations/content_strings_sk.xtb
index fc959b4d..7e1ee17a 100644
--- a/content/app/strings/translations/content_strings_sk.xtb
+++ b/content/app/strings/translations/content_strings_sk.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Zobraziť predchádzajúci mesiac</translation>
 <translation id="421884353938374759">výber farieb</translation>
 <translation id="4248100235867064564">panel s ponukami</translation>
+<translation id="4254339807215791271">informácie o obsahu</translation>
 <translation id="4360991593054037559">Zadajte platnú hodnotu. Najbližšie platné hodnoty sú <ph name="VALID_VALUE_LOW" /> a <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Otázky a odpovede</translation>
 <translation id="4413860115965805769">tlačidlo ponuky</translation>
diff --git a/content/app/strings/translations/content_strings_sl.xtb b/content/app/strings/translations/content_strings_sl.xtb
index 9469e112..eaa4358 100644
--- a/content/app/strings/translations/content_strings_sl.xtb
+++ b/content/app/strings/translations/content_strings_sl.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Prikaz prejšnjega meseca</translation>
 <translation id="421884353938374759">izbirnik barve</translation>
 <translation id="4248100235867064564">menijska vrstica</translation>
+<translation id="4254339807215791271">podatki o vsebini</translation>
 <translation id="4360991593054037559">Vnesite veljavno vrednost. Najbližji veljavni vrednosti sta <ph name="VALID_VALUE_LOW" /> in <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Vprašanja</translation>
 <translation id="4413860115965805769">menijski gumb</translation>
diff --git a/content/app/strings/translations/content_strings_sr.xtb b/content/app/strings/translations/content_strings_sr.xtb
index 1b31cb5..556d6cd6 100644
--- a/content/app/strings/translations/content_strings_sr.xtb
+++ b/content/app/strings/translations/content_strings_sr.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Прикажи претходни месец</translation>
 <translation id="421884353938374759">бирач боја</translation>
 <translation id="4248100235867064564">трака са менијима</translation>
+<translation id="4254339807215791271">информације о садржају</translation>
 <translation id="4360991593054037559">Унесите важећу вредност. Две најближе важеће вредности су <ph name="VALID_VALUE_LOW" /> и <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Питања и одговори</translation>
 <translation id="4413860115965805769">дугме менија</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb
index 73c1595..d6dc0f1 100644
--- a/content/app/strings/translations/content_strings_sv.xtb
+++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Visa föregående månad</translation>
 <translation id="421884353938374759">färgval</translation>
 <translation id="4248100235867064564">menyfält</translation>
+<translation id="4254339807215791271">innehållsinformation</translation>
 <translation id="4360991593054037559">Ange ett giltigt värde. De två närmaste giltiga värdena är <ph name="VALID_VALUE_LOW" /> och <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Frågor och svar</translation>
 <translation id="4413860115965805769">menyknapp</translation>
diff --git a/content/app/strings/translations/content_strings_sw.xtb b/content/app/strings/translations/content_strings_sw.xtb
index 0665062..28e3992 100644
--- a/content/app/strings/translations/content_strings_sw.xtb
+++ b/content/app/strings/translations/content_strings_sw.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Onyesha mwezi uliotangulia</translation>
 <translation id="421884353938374759">kiteua rangi</translation>
 <translation id="4248100235867064564">upau wa menyu</translation>
+<translation id="4254339807215791271">maelezo ya maudhui</translation>
 <translation id="4360991593054037559">Tafadhali ingiza thamani halali. Thamani mbili halali za karibu ni <ph name="VALID_VALUE_LOW" /> na <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Maswali na Majibu</translation>
 <translation id="4413860115965805769">kitufe cha menyu</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb
index 4a4b19ab..e17cd33 100644
--- a/content/app/strings/translations/content_strings_ta.xtb
+++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">முந்தைய மாதத்தைக் காட்டு</translation>
 <translation id="421884353938374759">வண்ணத் தேர்வி</translation>
 <translation id="4248100235867064564">மெனுப் பட்டி</translation>
+<translation id="4254339807215791271">உள்ளடக்கத் தகவல்</translation>
 <translation id="4360991593054037559">சரியான மதிப்பை உள்ளிடவும். <ph name="VALID_VALUE_LOW" /> மற்றும் <ph name="VALID_VALUE_HIGHER" /> ஆகியவை மிக நெருக்கமான சரியான இரண்டு மதிப்புகளாகும்.</translation>
 <translation id="4384583879834880242">கேள்வி-பதில்</translation>
 <translation id="4413860115965805769">மெனு பொத்தான்</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb
index de09f31..6c13d80 100644
--- a/content/app/strings/translations/content_strings_te.xtb
+++ b/content/app/strings/translations/content_strings_te.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">మునుపటి నెలను చూపుతుంది</translation>
 <translation id="421884353938374759">రంగు ఎంపిక</translation>
 <translation id="4248100235867064564">మెనూ బార్</translation>
+<translation id="4254339807215791271">కంటెంట్ సమాచారం</translation>
 <translation id="4360991593054037559">దయచేసి చెల్లుబాటు అయ్యే విలువను నమోదు చేయండి. <ph name="VALID_VALUE_LOW" /> మరియు <ph name="VALID_VALUE_HIGHER" /> అనేవి రెండు సమీప చెల్లుబాటు విలువలు.</translation>
 <translation id="4384583879834880242">Q&amp;A</translation>
 <translation id="4413860115965805769">మెను బటన్</translation>
diff --git a/content/app/strings/translations/content_strings_th.xtb b/content/app/strings/translations/content_strings_th.xtb
index 74cc269c..c4c3c85 100644
--- a/content/app/strings/translations/content_strings_th.xtb
+++ b/content/app/strings/translations/content_strings_th.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">แสดงเดือนที่ผ่านมา</translation>
 <translation id="421884353938374759">ตัวเลือกสี</translation>
 <translation id="4248100235867064564">แถบเมนู</translation>
+<translation id="4254339807215791271">ข้อมูลเนื้อหา</translation>
 <translation id="4360991593054037559">โปรดป้อนค่าที่ถูกต้อง ค่าใกล้เคียงที่สุดที่ถูกต้องสองรายการคือ <ph name="VALID_VALUE_LOW" /> และ <ph name="VALID_VALUE_HIGHER" /></translation>
 <translation id="4384583879834880242">ถามและตอบ</translation>
 <translation id="4413860115965805769">ปุ่มเมนู</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb
index c27d999..3c96e0a4 100644
--- a/content/app/strings/translations/content_strings_tr.xtb
+++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Önceki ayı göster</translation>
 <translation id="421884353938374759">renk seçici</translation>
 <translation id="4248100235867064564">menü çubuğu</translation>
+<translation id="4254339807215791271">içerik bilgileri</translation>
 <translation id="4360991593054037559">Lütfen geçerli bir değer girin. En yakın iki geçerli değer şunlardır: <ph name="VALID_VALUE_LOW" /> ve <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Soru-Cevap</translation>
 <translation id="4413860115965805769">menü düğmesi</translation>
diff --git a/content/app/strings/translations/content_strings_uk.xtb b/content/app/strings/translations/content_strings_uk.xtb
index c4d5ccd..e41f14a 100644
--- a/content/app/strings/translations/content_strings_uk.xtb
+++ b/content/app/strings/translations/content_strings_uk.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Показати попередній місяць</translation>
 <translation id="421884353938374759">вибір кольору</translation>
 <translation id="4248100235867064564">панель меню</translation>
+<translation id="4254339807215791271">інформація про вміст</translation>
 <translation id="4360991593054037559">Введіть дійсне значення. Два найближчі дійсні значення: <ph name="VALID_VALUE_LOW" /> і <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Запитання</translation>
 <translation id="4413860115965805769">кнопка меню</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb
index 359e2b8..8265587 100644
--- a/content/app/strings/translations/content_strings_vi.xtb
+++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">Hiển thị tháng trước</translation>
 <translation id="421884353938374759">công cụ chọn màu</translation>
 <translation id="4248100235867064564">thanh menu</translation>
+<translation id="4254339807215791271">thông tin nội dung</translation>
 <translation id="4360991593054037559">Vui lòng nhập giá trị hợp lệ. Hai giá trị hợp lệ gần nhất là <ph name="VALID_VALUE_LOW" /> và <ph name="VALID_VALUE_HIGHER" />.</translation>
 <translation id="4384583879834880242">Giải đáp</translation>
 <translation id="4413860115965805769">nút menu</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb
index 3535338..e9269b9 100644
--- a/content/app/strings/translations/content_strings_zh-CN.xtb
+++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">显示上一个月</translation>
 <translation id="421884353938374759">颜色选择器</translation>
 <translation id="4248100235867064564">菜单栏</translation>
+<translation id="4254339807215791271">内容信息</translation>
 <translation id="4360991593054037559">请输入有效值。两个最接近的有效值分别为<ph name="VALID_VALUE_LOW" />和<ph name="VALID_VALUE_HIGHER" />。</translation>
 <translation id="4384583879834880242">问答</translation>
 <translation id="4413860115965805769">菜单按钮</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb
index 54d93f0..04f6651 100644
--- a/content/app/strings/translations/content_strings_zh-TW.xtb
+++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -94,6 +94,7 @@
 <translation id="4201051445878709314">顯示上一個月</translation>
 <translation id="421884353938374759">顏色選擇器</translation>
 <translation id="4248100235867064564">選單列</translation>
+<translation id="4254339807215791271">內容資訊</translation>
 <translation id="4360991593054037559">請輸入有效值。最接近的兩個有效值分別是 <ph name="VALID_VALUE_LOW" /> 和 <ph name="VALID_VALUE_HIGHER" />。</translation>
 <translation id="4384583879834880242">問與答</translation>
 <translation id="4413860115965805769">選單按鈕</translation>
diff --git a/content/app_shim_remote_cocoa/ns_view_bridge_factory_impl.mm b/content/app_shim_remote_cocoa/ns_view_bridge_factory_impl.mm
index 93885435..85f739a 100644
--- a/content/app_shim_remote_cocoa/ns_view_bridge_factory_impl.mm
+++ b/content/app_shim_remote_cocoa/ns_view_bridge_factory_impl.mm
@@ -31,11 +31,12 @@
  public:
   explicit RenderWidgetHostNSViewBridgeOwner(
       mojom::RenderWidgetHostNSViewHostAssociatedPtr client,
-      mojom::RenderWidgetHostNSViewAssociatedRequest bridge_request)
+      mojo::PendingAssociatedReceiver<mojom::RenderWidgetHostNSView>
+          bridge_receiver)
       : host_(std::move(client)) {
     bridge_ = std::make_unique<remote_cocoa::RenderWidgetHostNSViewBridge>(
         host_.get(), this);
-    bridge_->BindRequest(std::move(bridge_request));
+    bridge_->BindReceiver(std::move(bridge_receiver));
     host_.set_connection_error_handler(
         base::BindOnce(&RenderWidgetHostNSViewBridgeOwner::OnConnectionError,
                        base::Unretained(this)));
@@ -130,7 +131,7 @@
 
 void CreateRenderWidgetHostNSView(
     mojo::ScopedInterfaceEndpointHandle host_handle,
-    mojo::ScopedInterfaceEndpointHandle view_request_handle) {
+    mojo::ScopedInterfaceEndpointHandle view_receiver_handle) {
   // Cast from the stub interface to the mojom::RenderWidgetHostNSViewHost
   // and mojom::RenderWidgetHostNSView private interfaces.
   // TODO(ccameron): Remove the need for this cast.
@@ -138,13 +139,13 @@
   mojom::RenderWidgetHostNSViewHostAssociatedPtr host(
       mojo::AssociatedInterfacePtrInfo<mojom::RenderWidgetHostNSViewHost>(
           std::move(host_handle), 0));
-  mojom::RenderWidgetHostNSViewAssociatedRequest ns_view_request(
-      std::move(view_request_handle));
 
   // Create a RenderWidgetHostNSViewBridgeOwner. The resulting object will be
   // destroyed when its underlying pipe is closed.
   ignore_result(new RenderWidgetHostNSViewBridgeOwner(
-      std::move(host), std::move(ns_view_request)));
+      std::move(host),
+      mojo::PendingAssociatedReceiver<mojom::RenderWidgetHostNSView>(
+          std::move(view_receiver_handle))));
 }
 
 void CreateWebContentsNSView(
diff --git a/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.h b/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.h
index 772b60e1..45ca8fb 100644
--- a/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.h
+++ b/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.h
@@ -12,7 +12,8 @@
 #import "content/app_shim_remote_cocoa/render_widget_host_view_cocoa.h"
 #include "content/common/render_widget_host_ns_view.mojom.h"
 #include "content/public/common/widget_type.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "ui/accelerated_widget_mac/display_ca_layer_tree.h"
 #include "ui/display/display_observer.h"
 
@@ -28,9 +29,10 @@
                                RenderWidgetHostNSViewHostHelper* client_helper);
   ~RenderWidgetHostNSViewBridge() override;
 
-  // Bind to a remote request for a mojo interface.
-  void BindRequest(
-      mojom::RenderWidgetHostNSViewAssociatedRequest bridge_request);
+  // Bind to a remote receiver for a mojo interface.
+  void BindReceiver(
+      mojo::PendingAssociatedReceiver<mojom::RenderWidgetHostNSView>
+          bridge_receiver);
 
   // TODO(ccameron): RenderWidgetHostViewMac and other functions currently use
   // this method to communicate directly with RenderWidgetHostViewCocoa. The
@@ -91,8 +93,8 @@
   // Cached copy of the tooltip text, to avoid redundant calls.
   base::string16 tooltip_text_;
 
-  // The binding for this object (only used when remotely instantiated).
-  mojo::AssociatedBinding<mojom::RenderWidgetHostNSView> binding_;
+  // The receiver for this object (only used when remotely instantiated).
+  mojo::AssociatedReceiver<mojom::RenderWidgetHostNSView> receiver_{this};
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostNSViewBridge);
 };
diff --git a/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.mm b/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.mm
index e4ebe13..8fc6959 100644
--- a/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.mm
+++ b/content/app_shim_remote_cocoa/render_widget_host_ns_view_bridge.mm
@@ -20,8 +20,7 @@
 
 RenderWidgetHostNSViewBridge::RenderWidgetHostNSViewBridge(
     mojom::RenderWidgetHostNSViewHost* host,
-    RenderWidgetHostNSViewHostHelper* host_helper)
-    : binding_(this) {
+    RenderWidgetHostNSViewHostHelper* host_helper) {
   display::Screen::GetScreen()->AddObserver(this);
 
   cocoa_view_.reset([[RenderWidgetHostViewCocoa alloc]
@@ -49,10 +48,11 @@
   popup_window_.reset();
 }
 
-void RenderWidgetHostNSViewBridge::BindRequest(
-    mojom::RenderWidgetHostNSViewAssociatedRequest bridge_request) {
-  binding_.Bind(std::move(bridge_request),
-                ui::WindowResizeHelperMac::Get()->task_runner());
+void RenderWidgetHostNSViewBridge::BindReceiver(
+    mojo::PendingAssociatedReceiver<mojom::RenderWidgetHostNSView>
+        bridge_receiver) {
+  receiver_.Bind(std::move(bridge_receiver),
+                 ui::WindowResizeHelperMac::Get()->task_runner());
 }
 
 RenderWidgetHostViewCocoa* RenderWidgetHostNSViewBridge::GetNSView() {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index f10e1a8..7ce756e 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1994,7 +1994,7 @@
     ]
   }
 
-  if (is_chromeos || is_android || is_chromecast) {
+  if (is_chromeos || is_android || is_chromecast || is_fuchsia) {
     defines += [ "ENABLE_PROTECTED_MEDIA_IDENTIFIER_PERMISSION" ]
   }
 
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index a0829c02..03a00a2c 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1860,6 +1860,9 @@
     case ax::mojom::Role::kColorWell:
       return content_client->GetLocalizedString(IDS_AX_ROLE_COLOR_WELL);
 
+    case ax::mojom::Role::kContentInfo:
+      return content_client->GetLocalizedString(IDS_AX_ROLE_CONTENT_INFO);
+
     case ax::mojom::Role::kDate:
       return content_client->GetLocalizedString(IDS_AX_ROLE_DATE);
 
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index 5d799ab..ff2a153 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -1665,8 +1665,11 @@
 
 bool BrowserAccessibilityAndroid::ShouldExposeValueAsName() const {
   switch (GetRole()) {
+    case ax::mojom::Role::kDate:
+    case ax::mojom::Role::kDateTime:
     case ax::mojom::Role::kTextField:
     case ax::mojom::Role::kTextFieldWithComboBox:
+    case ax::mojom::Role::kTime:
       return true;
     default:
       break;
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index 48af764..6333e21 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -676,7 +676,7 @@
   TestLocalizedLandmarkType(1, ax::mojom::Role::kComplementary, "aside",
                             base::ASCIIToUTF16("complementary"));
   TestLocalizedLandmarkType(2, ax::mojom::Role::kFooter, "footer",
-                            base::ASCIIToUTF16("content info"));
+                            base::ASCIIToUTF16("content information"));
   TestLocalizedLandmarkType(3, ax::mojom::Role::kForm, "form");
   TestLocalizedLandmarkType(4, ax::mojom::Role::kMain, "main");
   TestLocalizedLandmarkType(5, ax::mojom::Role::kNavigation, "nav");
@@ -689,7 +689,7 @@
   TestLocalizedLandmarkType(9, ax::mojom::Role::kComplementary, "complementary",
                             base::ASCIIToUTF16("complementary"));
   TestLocalizedLandmarkType(10, ax::mojom::Role::kContentInfo, "contentinfo",
-                            base::ASCIIToUTF16("content info"));
+                            base::ASCIIToUTF16("content information"));
   TestLocalizedLandmarkType(11, ax::mojom::Role::kForm, "role_form");
   TestLocalizedLandmarkType(12, ax::mojom::Role::kMain, "role_main");
   TestLocalizedLandmarkType(13, ax::mojom::Role::kNavigation, "role_nav");
@@ -720,14 +720,15 @@
       "<input type='week'>"
       "<meter></meter>"
       "<output></output>"
-      "<time></time>");
+      "<time></time>"
+      "<div role='contentinfo' aria-label='contentinfo'></div>");
 
   NavigateToURL(shell(), url);
   waiter.WaitForNotification();
 
   BrowserAccessibility* root = GetManager()->GetRoot();
   ASSERT_NE(nullptr, root);
-  ASSERT_EQ(15u, root->PlatformChildCount());
+  ASSERT_EQ(16u, root->PlatformChildCount());
 
   auto TestLocalizedRoleDescription =
       [root](int child_index,
@@ -756,6 +757,7 @@
   TestLocalizedRoleDescription(12, base::ASCIIToUTF16("meter"));
   TestLocalizedRoleDescription(13, base::ASCIIToUTF16("output"));
   TestLocalizedRoleDescription(14, base::ASCIIToUTF16("time"));
+  TestLocalizedRoleDescription(15, base::ASCIIToUTF16("content information"));
 }
 
 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index af58856..c222b64 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -55,6 +55,7 @@
 #include "net/websockets/websocket_channel.h"
 #include "services/service_manager/embedder/switches.h"
 #include "services/service_manager/public/cpp/constants.h"
+#include "services/tracing/public/cpp/trace_startup.h"
 
 #if defined(OS_MACOSX)
 #include "content/browser/child_process_task_port_provider_mac.h"
@@ -217,24 +218,7 @@
 // static
 void BrowserChildProcessHostImpl::CopyTraceStartupFlags(
     base::CommandLine* cmd_line) {
-  if (tracing::TraceStartupConfig::GetInstance()->IsEnabled()) {
-    const auto trace_config =
-        tracing::TraceStartupConfig::GetInstance()->GetTraceConfig();
-    if (!trace_config.IsArgumentFilterEnabled()) {
-      // The only trace option that we can pass through switches is the record
-      // mode. Other trace options should have the default value.
-      //
-      // TODO(chiniforooshan): Add other trace options to switches if, for
-      // example, they are used in a telemetry test that needs startup trace
-      // events from renderer processes.
-      cmd_line->AppendSwitchASCII(switches::kTraceStartup,
-                                  trace_config.ToCategoryFilterString());
-      cmd_line->AppendSwitchASCII(
-          switches::kTraceStartupRecordMode,
-          base::trace_event::TraceConfig::TraceRecordModeToStr(
-              trace_config.GetTraceRecordMode()));
-    }
-  }
+  tracing::PropagateTracingFlagsToChildProcessCmdLine(cmd_line);
 }
 
 void BrowserChildProcessHostImpl::Launch(
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 3f0931ad..28521684 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -1416,8 +1416,8 @@
     // The default is to delay the secondary GPU process for 120 seconds.
     bool delayed = !parsed_command_line_.HasSwitch(
         switches::kNoDelayForDX12VulkanInfoCollection);
-    GpuDataManagerImpl::GetInstance()->RequestGpuSupportedRuntimeVersion(
-        delayed);
+    GpuDataManagerImpl::GetInstance()->RequestCompleteGpuInfoIfNeeded(
+        kGpuInfoRequestDx12Vulkan, delayed);
   }
 
 #endif
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 66d95df..82707fc 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -213,7 +213,7 @@
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kHeadless))
-    return base::WrapUnique(new viz::SoftwareOutputDevice);
+    return std::make_unique<viz::SoftwareOutputDevice>();
 
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 #if defined(USE_OZONE)
@@ -227,10 +227,11 @@
   return std::make_unique<viz::SoftwareOutputDeviceOzone>(
       std::move(platform_window_surface), std::move(surface_ozone));
 #elif defined(USE_X11)
-  return std::make_unique<viz::SoftwareOutputDeviceX11>(widget);
+  return std::make_unique<viz::SoftwareOutputDeviceX11>(
+      widget, base::ThreadTaskRunnerHandle::Get().get());
 #else
   NOTREACHED();
-  return std::unique_ptr<viz::SoftwareOutputDevice>();
+  return nullptr;
 #endif
 }
 
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
index c5fb634..18046599 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -120,6 +120,12 @@
   }
 }
 
+gfx::Rect
+GpuSurfacelessBrowserCompositorOutputSurface::GetCurrentFramebufferDamage()
+    const {
+  return buffer_queue_->CurrentBufferDamage();
+}
+
 GLenum GpuSurfacelessBrowserCompositorOutputSurface::
     GetFramebufferCopyTextureFormat() {
   return buffer_queue_->internal_format();
@@ -182,7 +188,6 @@
 void GpuSurfacelessBrowserCompositorOutputSurface::SetDrawRectangle(
     const gfx::Rect& damage) {
   GpuBrowserCompositorOutputSurface::SetDrawRectangle(damage);
-  buffer_queue_->CopyDamageForCurrentSurface(damage);
 }
 
 }  // namespace content
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
index 8f78788..036c1266 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
@@ -36,6 +36,7 @@
   // viz::OutputSurface implementation.
   void SwapBuffers(viz::OutputSurfaceFrame frame) override;
   void BindFramebuffer() override;
+  gfx::Rect GetCurrentFramebufferDamage() const override;
   uint32_t GetFramebufferCopyTextureFormat() override;
   void Reshape(const gfx::Size& size,
                float device_scale_factor,
@@ -46,6 +47,7 @@
   unsigned GetOverlayTextureId() const override;
   gfx::BufferFormat GetOverlayBufferFormat() const override;
   unsigned UpdateGpuFence() override;
+
   void SetDrawRectangle(const gfx::Rect& damage) override;
 
   // BrowserCompositorOutputSurface implementation.
diff --git a/content/browser/file_url_loader_factory.cc b/content/browser/file_url_loader_factory.cc
index 99fb316..7ba913f 100644
--- a/content/browser/file_url_loader_factory.cc
+++ b/content/browser/file_url_loader_factory.cc
@@ -798,8 +798,7 @@
     DCHECK(shared_cors_origin_access_list_);
     cors_flag =
         shared_cors_origin_access_list_->GetOriginAccessList().CheckAccessState(
-            *request.request_initiator, request.url) !=
-        network::cors::OriginAccessList::AccessState::kAllowed;
+            request) != network::cors::OriginAccessList::AccessState::kAllowed;
   }
 
   CreateLoaderAndStartInternal(request, std::move(loader), std::move(client),
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 70e00ce1..52f857a5 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1918,7 +1918,8 @@
 
   // Initialize the BundledExchangesHandle.
   if (GetContentClient()->browser()->CanAcceptUntrustedExchangesIfNeeded() &&
-      common_params_->url.SchemeIsFile() &&
+      (common_params_->url.SchemeIsFile() ||
+       common_params_->url.SchemeIs(url::kContentScheme)) &&
       base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kTrustableBundledExchangesFileUrl)) {
     // Fast path for testing navigation to a trustable BundledExchanges source.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 21e7f3b..8d9bb40 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -173,7 +173,7 @@
 #include "media/mojo/services/media_interface_provider.h"
 #include "media/mojo/services/media_metrics_provider.h"
 #include "media/mojo/services/video_decode_perf_history.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
@@ -1378,21 +1378,23 @@
 blink::AssociatedInterfaceProvider*
 RenderFrameHostImpl::GetRemoteAssociatedInterfaces() {
   if (!remote_associated_interfaces_) {
-    blink::mojom::AssociatedInterfaceProviderAssociatedPtr remote_interfaces;
+    mojo::AssociatedRemote<blink::mojom::AssociatedInterfaceProvider>
+        remote_interfaces;
     IPC::ChannelProxy* channel = GetProcess()->GetChannel();
     if (channel) {
       RenderProcessHostImpl* process =
           static_cast<RenderProcessHostImpl*>(GetProcess());
       process->GetRemoteRouteProvider()->GetRoute(
-          GetRoutingID(), mojo::MakeRequest(&remote_interfaces));
+          GetRoutingID(), remote_interfaces.BindNewEndpointAndPassReceiver());
     } else {
       // The channel may not be initialized in some tests environments. In this
       // case we set up a dummy interface provider.
-      mojo::MakeRequestAssociatedWithDedicatedPipe(&remote_interfaces);
+      ignore_result(remote_interfaces
+                        .BindNewEndpointAndPassDedicatedReceiverForTesting());
     }
     remote_associated_interfaces_ =
         std::make_unique<blink::AssociatedInterfaceProvider>(
-            std::move(remote_interfaces));
+            remote_interfaces.Unbind());
   }
   return remote_associated_interfaces_.get();
 }
@@ -7030,6 +7032,11 @@
     mojo::PendingRemote<network::mojom::URLLoaderFactory>
         prefetch_loader_factory,
     const base::UnguessableToken& devtools_navigation_token) {
+  // TODO(lfg): Temporary to debug https://crbug.com/996337.
+  if (common_params->url.SchemeIsCryptographic() &&
+      response_head.ssl_info.has_value() && !response_head.ssl_info->cert) {
+    base::debug::DumpWithoutCrashing();
+  }
   if (navigation_client) {
     navigation_client->CommitNavigation(
         std::move(common_params), std::move(commit_params), response_head,
diff --git a/content/browser/gpu/gpu_data_manager_impl.cc b/content/browser/gpu/gpu_data_manager_impl.cc
index 3a735b1..21930892 100644
--- a/content/browser/gpu/gpu_data_manager_impl.cc
+++ b/content/browser/gpu/gpu_data_manager_impl.cc
@@ -35,9 +35,10 @@
   return private_->GpuAccessAllowed(reason);
 }
 
-void GpuDataManagerImpl::RequestCompleteGpuInfoIfNeeded() {
+void GpuDataManagerImpl::RequestCompleteGpuInfoIfNeeded(GpuInfoRequest request,
+                                                        bool delayed) {
   base::AutoLock auto_lock(lock_);
-  private_->RequestCompleteGpuInfoIfNeeded();
+  private_->RequestCompleteGpuInfoIfNeeded(request, delayed);
 }
 
 bool GpuDataManagerImpl::IsEssentialGpuInfoAvailable() {
@@ -95,11 +96,6 @@
   private_->AppendGpuCommandLine(command_line, kind);
 }
 
-void GpuDataManagerImpl::RequestGpuSupportedRuntimeVersion(bool delayed) const {
-  base::AutoLock auto_lock(lock_);
-  private_->RequestGpuSupportedRuntimeVersion(delayed);
-}
-
 bool GpuDataManagerImpl::GpuProcessStartAllowed() const {
   base::AutoLock auto_lock(lock_);
   return private_->GpuProcessStartAllowed();
@@ -125,6 +121,11 @@
   private_->UpdateDx12VulkanInfo(dx12_vulkan_version_info);
 }
 
+void GpuDataManagerImpl::UpdateDxDiagNodeRequestStatus(bool request_continues) {
+  base::AutoLock auto_lock(lock_);
+  private_->UpdateDxDiagNodeRequestStatus(request_continues);
+}
+
 void GpuDataManagerImpl::UpdateDx12VulkanRequestStatus(bool request_continues) {
   base::AutoLock auto_lock(lock_);
   private_->UpdateDx12VulkanRequestStatus(request_continues);
diff --git a/content/browser/gpu/gpu_data_manager_impl.h b/content/browser/gpu/gpu_data_manager_impl.h
index 08f29a16..23c13b2b 100644
--- a/content/browser/gpu/gpu_data_manager_impl.h
+++ b/content/browser/gpu/gpu_data_manager_impl.h
@@ -49,7 +49,8 @@
   void BlacklistWebGLForTesting() override;
   gpu::GPUInfo GetGPUInfo() override;
   bool GpuAccessAllowed(std::string* reason) override;
-  void RequestCompleteGpuInfoIfNeeded() override;
+  void RequestCompleteGpuInfoIfNeeded(GpuInfoRequest request,
+                                      bool delayed) override;
   bool IsEssentialGpuInfoAvailable() override;
   void RequestVideoMemoryUsageStatsUpdate(
       VideoMemoryUsageStatsCallback callback) override;
@@ -65,7 +66,6 @@
   void AppendGpuCommandLine(base::CommandLine* command_line,
                             GpuProcessKind kind) override;
 
-  void RequestGpuSupportedRuntimeVersion(bool delayed) const;
   bool GpuProcessStartAllowed() const;
 
   bool IsDx12VulkanVersionAvailable() const;
@@ -76,9 +76,10 @@
       const gpu::GPUInfo& gpu_info,
       const base::Optional<gpu::GPUInfo>& gpu_info_for_hardware_gpu);
 #if defined(OS_WIN)
+  void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics);
   void UpdateDx12VulkanInfo(
       const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info);
-  void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics);
+  void UpdateDxDiagNodeRequestStatus(bool request_continues);
   void UpdateDx12VulkanRequestStatus(bool request_continues);
 #endif
   // Update the GPU feature info. This updates the blacklist and enabled status
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 6dc592c..14de90926 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -360,40 +360,48 @@
   return false;
 }
 
-void GpuDataManagerImplPrivate::RequestCompleteGpuInfoIfNeeded() {
-  if (complete_gpu_info_already_requested_)
-    return;
-  if (!NeedsCompleteGpuInfoCollection())
+void GpuDataManagerImplPrivate::RequestCompleteGpuInfoIfNeeded(
+    GpuInfoRequest request,
+    bool delayed) {
+  if (request & kGpuInfoRequestDxDiag) {
+    // Delay is not supported in DxDiag request
+    DCHECK(!delayed);
+    RequestDxDiagNodeData();
+  }
+
+  if (request & kGpuInfoRequestDx12Vulkan)
+    RequestGpuSupportedRuntimeVersion(delayed);
+}
+
+void GpuDataManagerImplPrivate::RequestDxDiagNodeData() {
+#if defined(OS_WIN)
+  if (gpu_info_dx_diag_requested_)
     return;
 
-#if defined(OS_WIN)
-  complete_gpu_info_already_requested_ = true;
-  GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_UNSANDBOXED_NO_GL,
-                           true /* force_create */,
-                           base::BindOnce([](GpuProcessHost* host) {
-                             if (!host)
-                               return;
-                             host->gpu_service()->RequestCompleteGpuInfo(
-                                 base::BindOnce(
-                                     [](const gpu::DxDiagNode& dx_diagnostics) {
-                                       GpuDataManagerImpl::GetInstance()
-                                           ->UpdateDxDiagNode(dx_diagnostics);
-                                     }));
-                           }));
-#else
-  // NeedsCompleteGpuInfoCollection() always returns false on platforms other
-  // than Windows.
-  NOTREACHED();
+  gpu_info_dx_diag_requested_ = true;
+  GpuProcessHost::CallOnIO(
+      GPU_PROCESS_KIND_UNSANDBOXED_NO_GL, true /* force_create */,
+      base::BindOnce([](GpuProcessHost* host) {
+        if (!host) {
+          GpuDataManagerImpl::GetInstance()->UpdateDxDiagNodeRequestStatus(
+              false);
+          return;
+        }
+        GpuDataManagerImpl::GetInstance()->UpdateDxDiagNodeRequestStatus(true);
+        host->gpu_service()->RequestCompleteGpuInfo(
+            base::BindOnce([](const gpu::DxDiagNode& dx_diagnostics) {
+              GpuDataManagerImpl::GetInstance()->UpdateDxDiagNode(
+                  dx_diagnostics);
+            }));
+      }));
 #endif
 }
 
 void GpuDataManagerImplPrivate::RequestGpuSupportedRuntimeVersion(
     bool delayed) {
 #if defined(OS_WIN)
-  if (gpu_info_dx12_vulkan_valid_) {
-    NotifyGpuInfoUpdate();
+  if (gpu_info_dx12_vulkan_requested_)
     return;
-  }
 
   base::OnceClosure task = base::BindOnce([]() {
     GpuProcessHost* host = GpuProcessHost::Get(
@@ -417,9 +425,6 @@
     gpu_info_dx12_vulkan_request_failed_ = false;
     base::PostTask(FROM_HERE, {BrowserThread::IO}, std::move(task));
   }
-
-#else
-  NOTREACHED();
 #endif
 }
 
@@ -533,8 +538,6 @@
 void GpuDataManagerImplPrivate::UpdateDxDiagNode(
     const gpu::DxDiagNode& dx_diagnostics) {
   gpu_info_.dx_diagnostics = dx_diagnostics;
-  if (complete_gpu_info_already_requested_)
-    complete_gpu_info_already_requested_ = false;
   // No need to call GetContentClient()->SetGpuInfo().
   NotifyGpuInfoUpdate();
 }
@@ -548,6 +551,14 @@
   NotifyGpuInfoUpdate();
 }
 
+void GpuDataManagerImplPrivate::UpdateDxDiagNodeRequestStatus(
+    bool request_continues) {
+  gpu_info_dx_diag_request_failed_ = !request_continues;
+
+  if (gpu_info_dx_diag_request_failed_)
+    NotifyGpuInfoUpdate();
+}
+
 void GpuDataManagerImplPrivate::UpdateDx12VulkanRequestStatus(
     bool request_continues) {
   gpu_info_dx12_vulkan_requested_ = true;
@@ -928,14 +939,6 @@
   return kBlockAllDomainsMs;
 }
 
-bool GpuDataManagerImplPrivate::NeedsCompleteGpuInfoCollection() const {
-#if defined(OS_WIN)
-  return gpu_info_.dx_diagnostics.IsEmpty();
-#else
-  return false;
-#endif
-}
-
 gpu::GpuMode GpuDataManagerImplPrivate::GetGpuMode() const {
   return gpu_mode_;
 }
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.h b/content/browser/gpu/gpu_data_manager_impl_private.h
index 8fc37d8..0f0c81f 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.h
+++ b/content/browser/gpu/gpu_data_manager_impl_private.h
@@ -44,8 +44,7 @@
   gpu::GPUInfo GetGPUInfoForHardwareGpu() const;
   bool GpuAccessAllowed(std::string* reason) const;
   bool GpuProcessStartAllowed() const;
-  void RequestCompleteGpuInfoIfNeeded();
-  void RequestGpuSupportedRuntimeVersion(bool delayed);
+  void RequestCompleteGpuInfoIfNeeded(GpuInfoRequest request, bool delayed);
   bool IsEssentialGpuInfoAvailable() const;
   bool IsDx12VulkanVersionAvailable() const;
   bool IsGpuFeatureInfoAvailable() const;
@@ -66,6 +65,7 @@
   void UpdateDx12VulkanInfo(
       const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info);
   void UpdateDx12VulkanRequestStatus(bool request_continues);
+  void UpdateDxDiagNodeRequestStatus(bool request_continues);
 #endif
   void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info,
                             const base::Optional<gpu::GpuFeatureInfo>&
@@ -177,21 +177,19 @@
                                            base::Time at_time) const;
   int64_t GetBlockAllDomainsDurationInMs() const;
 
-  // This is platform specific. At the moment:
-  //   1) on Windows, if DxDiagnostics are missing, this returns true;
-  //   2) all other platforms, this returns false.
-  bool NeedsCompleteGpuInfoCollection() const;
-
   // Notify all observers whenever there is a GPU info update.
   void NotifyGpuInfoUpdate();
 
-  GpuDataManagerImpl* const owner_;
+  void RequestDxDiagNodeData();
+  void RequestGpuSupportedRuntimeVersion(bool delayed);
 
-  bool complete_gpu_info_already_requested_ = false;
+  GpuDataManagerImpl* const owner_;
 
   gpu::GpuFeatureInfo gpu_feature_info_;
   gpu::GPUInfo gpu_info_;
 #if defined(OS_WIN)
+  bool gpu_info_dx_diag_requested_ = false;
+  bool gpu_info_dx_diag_request_failed_ = false;
   bool gpu_info_dx12_vulkan_valid_ = false;
   bool gpu_info_dx12_vulkan_requested_ = false;
   bool gpu_info_dx12_vulkan_request_failed_ = false;
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index 788c2781..9249325 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -643,7 +643,8 @@
 
   // Tell GpuDataManager it should have full GpuInfo. If the
   // Gpu process has not run yet, this will trigger its launch.
-  GpuDataManagerImpl::GetInstance()->RequestCompleteGpuInfoIfNeeded();
+  GpuDataManagerImpl::GetInstance()->RequestCompleteGpuInfoIfNeeded(
+      kGpuInfoRequestAll, /*delayed*/ false);
 
   // Run callback immediately in case the info is ready and no update in the
   // future.
@@ -726,8 +727,13 @@
                                          *(gpu_info_val.get()));
 }
 
+// TODO(magchen): RequestCompleteGpuInfoIfNeeded(), which collects Dxdiag and
+// Dx12/Vulkan info, only runs once. If this same information is not needed,
+// GPU switch observer should be deleted. If more information is needed, it
+// should be fixed.
 void GpuMessageHandler::OnGpuSwitched() {
-  GpuDataManagerImpl::GetInstance()->RequestCompleteGpuInfoIfNeeded();
+  GpuDataManagerImpl::GetInstance()->RequestCompleteGpuInfoIfNeeded(
+      kGpuInfoRequestDxDiag, /*delayed*/ false);
 }
 
 }  // namespace
diff --git a/content/browser/media/media_browsertest.cc b/content/browser/media/media_browsertest.cc
index 7278ae5b..460a4c8 100644
--- a/content/browser/media/media_browsertest.cc
+++ b/content/browser/media/media_browsertest.cc
@@ -13,6 +13,7 @@
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/shell/browser/shell.h"
+#include "content/shell/common/shell_switches.h"
 #include "media/base/media_switches.h"
 #include "media/base/test_data_util.h"
 #include "media/media_buildflags.h"
@@ -30,6 +31,8 @@
   command_line->AppendSwitchASCII(
       switches::kAutoplayPolicy,
       switches::autoplay::kNoUserGestureRequiredPolicy);
+  command_line->AppendSwitch(switches::kExposeInternalsForTesting);
+
   // Disable fallback after decode error to avoid unexpected test pass on the
   // fallback path.
   scoped_feature_list_.InitAndDisableFeature(media::kFallbackAfterDecodeError);
diff --git a/content/browser/network_service_restart_browsertest.cc b/content/browser/network_service_restart_browsertest.cc
index 33be4cb..f38e9df 100644
--- a/content/browser/network_service_restart_browsertest.cc
+++ b/content/browser/network_service_restart_browsertest.cc
@@ -11,6 +11,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_command_line.h"
 #include "base/test/scoped_environment_variable_override.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "base/thread_annotations.h"
 #include "base/threading/thread_restrictions.h"
@@ -50,6 +51,7 @@
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/public/mojom/network_service_test.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
+#include "third_party/blink/public/common/features.h"
 
 #if BUILDFLAG(ENABLE_PLUGINS)
 #include "content/public/test/ppapi_test_utils.h"
@@ -665,8 +667,34 @@
   EXPECT_EQ(last_request_relative_url(), "/title2.html");
 }
 
+// Run tests with PlzDedicatedWorker.
+// TODO(https://crbug.com/906991): Merge this test fixture into
+// NetworkServiceRestartBrowserTest once PlzDedicatedWorker is enabled by
+// default.
+class NetworkServiceRestartForWorkerBrowserTest
+    : public NetworkServiceRestartBrowserTest,
+      public ::testing::WithParamInterface<bool> {
+ public:
+  NetworkServiceRestartForWorkerBrowserTest() {
+    if (GetParam()) {
+      scoped_feature_list_.InitAndEnableFeature(
+          blink::features::kPlzDedicatedWorker);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          blink::features::kPlzDedicatedWorker);
+    }
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(,
+                         NetworkServiceRestartForWorkerBrowserTest,
+                         ::testing::Values(false, true));
+
 // Make sure worker fetch works after crash.
-IN_PROC_BROWSER_TEST_F(NetworkServiceRestartBrowserTest, WorkerFetch) {
+IN_PROC_BROWSER_TEST_P(NetworkServiceRestartForWorkerBrowserTest, WorkerFetch) {
   if (IsInProcessNetworkService())
     return;
   StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
@@ -691,7 +719,8 @@
 }
 
 // Make sure multiple workers are tracked correctly and work after crash.
-IN_PROC_BROWSER_TEST_F(NetworkServiceRestartBrowserTest, MultipleWorkerFetch) {
+IN_PROC_BROWSER_TEST_P(NetworkServiceRestartForWorkerBrowserTest,
+                       MultipleWorkerFetch) {
   if (IsInProcessNetworkService())
     return;
   StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 9c87984..dba628e 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2193,20 +2193,22 @@
 
 void RenderProcessHostImpl::GetRoute(
     int32_t routing_id,
-    blink::mojom::AssociatedInterfaceProviderAssociatedRequest request) {
-  DCHECK(request.is_pending());
-  associated_interface_provider_bindings_.AddBinding(
-      this, std::move(request), routing_id);
+    mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterfaceProvider>
+        receiver) {
+  DCHECK(receiver.is_valid());
+  associated_interface_provider_receivers_.Add(this, std::move(receiver),
+                                               routing_id);
 }
 
 void RenderProcessHostImpl::GetAssociatedInterface(
     const std::string& name,
-    blink::mojom::AssociatedInterfaceAssociatedRequest request) {
+    mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
+        receiver) {
   int32_t routing_id =
-      associated_interface_provider_bindings_.dispatch_context();
+      associated_interface_provider_receivers_.current_context();
   IPC::Listener* listener = listeners_.Lookup(routing_id);
   if (listener)
-    listener->OnAssociatedInterfaceRequest(name, request.PassHandle());
+    listener->OnAssociatedInterfaceRequest(name, receiver.PassHandle());
 }
 
 void RenderProcessHostImpl::CreateEmbeddedFrameSinkProvider(
@@ -4151,8 +4153,9 @@
 void RenderProcessHostImpl::ResetIPC() {
   if (renderer_host_binding_.is_bound())
     renderer_host_binding_.Unbind();
+
   route_provider_receiver_.reset();
-  associated_interface_provider_bindings_.CloseAllBindings();
+  associated_interface_provider_receivers_.Clear();
   associated_interfaces_.reset();
 
   // Destroy all embedded CompositorFrameSinks.
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index feceb469..c57d844 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -51,8 +51,8 @@
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_platform_file.h"
 #include "media/media_buildflags.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/generic_pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
@@ -559,14 +559,16 @@
   void RegisterMojoInterfaces();
 
   // mojom::RouteProvider:
-  void GetRoute(int32_t routing_id,
-                blink::mojom::AssociatedInterfaceProviderAssociatedRequest
-                    request) override;
+  void GetRoute(
+      int32_t routing_id,
+      mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterfaceProvider>
+          receiver) override;
 
   // blink::mojom::AssociatedInterfaceProvider:
   void GetAssociatedInterface(
       const std::string& name,
-      blink::mojom::AssociatedInterfaceAssociatedRequest request) override;
+      mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
+          receiver) override;
 
   // mojom::RendererHost
   using BrowserHistogramCallback =
@@ -766,8 +768,9 @@
   std::unique_ptr<blink::AssociatedInterfaceRegistry> associated_interfaces_;
 
   mojo::AssociatedReceiver<mojom::RouteProvider> route_provider_receiver_{this};
-  mojo::AssociatedBindingSet<blink::mojom::AssociatedInterfaceProvider, int32_t>
-      associated_interface_provider_bindings_;
+  mojo::AssociatedReceiverSet<blink::mojom::AssociatedInterfaceProvider,
+                              int32_t>
+      associated_interface_provider_receivers_;
 
   // These fields are cached values that are updated in
   // UpdateProcessPriorityInputs, and are used to compute priority sent to
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 01ea601..d8b8b8d6 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -432,6 +432,12 @@
   return GetDelegate()->GetFrameTree()->GetFocusedFrame();
 }
 
+void RenderViewHostImpl::UpdatePageVisualProperties(
+    const VisualProperties& visual_properties) {
+  Send(new ViewMsg_UpdateLocalMainFrameVisualProperties(GetRoutingID(),
+                                                        visual_properties));
+}
+
 void RenderViewHostImpl::ShowContextMenu(RenderFrameHost* render_frame_host,
                                          const ContextMenuParams& params) {
   GetDelegate()->GetDelegateView()->ShowContextMenu(render_frame_host, params);
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 0b2ad958b..baf1e84 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -232,6 +232,9 @@
   bool IsNeverVisible() override;
   WebPreferences GetWebkitPreferencesForWidget() override;
   FrameTreeNode* GetFocusedFrame() override;
+  void UpdatePageVisualProperties(
+      const VisualProperties& visual_properties) override;
+
   void ShowContextMenu(RenderFrameHost* render_frame_host,
                        const ContextMenuParams& params) override;
 
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 1fb9487..e5104b8 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -891,36 +891,28 @@
       old_visual_properties_->visible_viewport_size !=
           visual_properties->visible_viewport_size;
 
-  // TODO(jonross): Enable on ChromeOS once blocking mus bugs are fixed:
-  // https://crbug.com/920642 https://crbug.com/920006
-  // TODO(jonross): Enable on Android once root cause of crash is found and
-  // fixed: https://crbug.com/923742
-#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
-  // When the size has changed, we must ensure that there is a new, updated
-  // viz::LocalSurfaceId. Otherwise we encounter Surface Invariants Violation at
-  // the time of frame submission. Check for this violation here in order to
-  // detect the source of the bug.
-  if (old_visual_properties_ &&
-      old_visual_properties_->new_size != visual_properties->new_size &&
-      old_visual_properties_->local_surface_id_allocation &&
-      visual_properties->local_surface_id_allocation) {
-    // We suspect that we may not be updating viz::LocalSurfaceIds correctly
-    // when auto-resize is enabled. Logging this additional information to
-    // confirm if that is the case. https://crbug.com/900948
-    CHECK_NE(old_visual_properties_->local_surface_id_allocation.value(),
-             visual_properties->local_surface_id_allocation.value())
-        << "Invalid Surface Id State: size changed without a change in "
-           "LocalSurfaceId: auto_resize_enabled "
-        << visual_properties->auto_resize_enabled << " old "
-        << old_visual_properties_->local_surface_id_allocation->ToString()
-        << " new "
-        << visual_properties->local_surface_id_allocation->ToString();
-  }
-#endif
-
   bool sent_visual_properties = false;
-  if (Send(new WidgetMsg_SynchronizeVisualProperties(routing_id_,
-                                                     *visual_properties))) {
+
+  // If the RenderWidget is associated with a RenderView, then we send the
+  // visual properties to the RenderView instead of the RenderWidget. The
+  // RenderView will pass along the relevant properties to the RenderWidget,
+  // which will send back an ACK.
+  if (owner_delegate_) {
+    owner_delegate_->UpdatePageVisualProperties(*visual_properties);
+
+    // TODO(erikchen): Remove sent_visual_properties. It's unused and doesn't
+    // even make sense, since we're potentially sending multiple IPC messages.
+    sent_visual_properties = true;
+  } else {
+    sent_visual_properties = Send(new WidgetMsg_SynchronizeVisualProperties(
+        routing_id_, *visual_properties));
+  }
+  if (delegate() && visible_viewport_size_changed) {
+    delegate()->NotifyVisibleViewportSizeChanged(
+        visual_properties->visible_viewport_size);
+  }
+
+  if (sent_visual_properties) {
     TRACE_EVENT_WITH_FLOW2(
         TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
         "RenderWidgetHostImpl::SynchronizeVisualProperties send message",
@@ -932,12 +924,7 @@
             .ToString());
     visual_properties_ack_pending_ =
         DoesVisualPropertiesNeedAck(old_visual_properties_, *visual_properties);
-    if (delegate() && visible_viewport_size_changed) {
-      delegate()->NotifyVisibleViewportSizeChanged(
-          visual_properties->visible_viewport_size);
-    }
     old_visual_properties_.swap(visual_properties);
-    sent_visual_properties = true;
   }
 
   if (delegate_)
diff --git a/content/browser/renderer_host/render_widget_host_owner_delegate.h b/content/browser/renderer_host/render_widget_host_owner_delegate.h
index fb8a3113..c714a4c 100644
--- a/content/browser/renderer_host/render_widget_host_owner_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_owner_delegate.h
@@ -7,6 +7,7 @@
 
 #include "build/build_config.h"
 #include "content/common/content_export.h"
+#include "content/common/visual_properties.h"
 
 namespace blink {
 class WebMouseEvent;
@@ -86,6 +87,11 @@
   virtual void ShowContextMenu(RenderFrameHost* render_frame_host,
                                const ContextMenuParams& params) = 0;
 
+  // Update VisualProperties for the page. For now, this only updates the main
+  // frame renderer.
+  virtual void UpdatePageVisualProperties(
+      const VisualProperties& visual_properties) = 0;
+
  protected:
   virtual ~RenderWidgetHostOwnerDelegate() {}
 };
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index a736944d..c98beec 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -435,6 +435,8 @@
     : public StubRenderWidgetHostOwnerDelegate {
  public:
   MOCK_METHOD1(SetBackgroundOpaque, void(bool opaque));
+  MOCK_METHOD1(UpdatePageVisualProperties,
+               void(const VisualProperties& visual_properties));
 };
 
 // RenderWidgetHostTest --------------------------------------------------------
@@ -732,30 +734,28 @@
 
 TEST_F(RenderWidgetHostTest, SynchronizeVisualProperties) {
   // The initial zoom is 0 so host should not send a sync message
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   delegate_->SetZoomLevel(0);
   EXPECT_FALSE(host_->SynchronizeVisualProperties());
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // The zoom has changed so host should send out a sync message
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   double new_zoom_level = content::ZoomFactorToZoomLevel(0.25);
   delegate_->SetZoomLevel(new_zoom_level);
   EXPECT_TRUE(host_->SynchronizeVisualProperties());
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_NEAR(new_zoom_level, host_->old_visual_properties_->zoom_level, 0.01);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // The initial bounds is the empty rect, so setting it to the same thing
   // shouldn't send the resize message.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   view_->SetBounds(gfx::Rect());
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // No visual properties ACK if the physical backing gets set, but the view
   // bounds are zero.
@@ -765,32 +765,29 @@
 
   // Setting the view bounds to nonzero should send out the notification.
   // but should not expect ack for empty physical backing size.
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   gfx::Rect original_size(0, 0, 100, 100);
-  process_->sink().ClearMessages();
   view_->SetBounds(original_size);
   view_->SetMockCompositorViewportPixelSize(gfx::Size());
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(original_size.size(), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Setting the bounds and physical backing size to nonzero should send out
   // the notification and expect an ack.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->ClearMockCompositorViewportPixelSize();
   host_->SynchronizeVisualProperties();
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(original_size.size(), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
   cc::RenderFrameMetadata metadata;
   metadata.viewport_size_in_pixels = original_size.size();
   metadata.local_surface_id_allocation = base::nullopt;
   host_->DidUpdateVisualProperties(metadata);
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
-  process_->sink().ClearMessages();
   gfx::Rect second_size(0, 0, 110, 110);
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   view_->SetBounds(second_size);
@@ -799,83 +796,77 @@
 
   // Sending out a new notification should NOT send out a new IPC message since
   // a visual properties ACK is pending.
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   gfx::Rect third_size(0, 0, 120, 120);
   process_->sink().ClearMessages();
   view_->SetBounds(third_size);
   EXPECT_FALSE(host_->SynchronizeVisualProperties());
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
-  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Send a update that's a visual properties ACK, but for the original_size we
   // sent. Since this isn't the second_size, the message handler should
   // immediately send a new resize message for the new size to the renderer.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   metadata.viewport_size_in_pixels = original_size.size();
   metadata.local_surface_id_allocation = base::nullopt;
   host_->DidUpdateVisualProperties(metadata);
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(third_size.size(), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Send the visual properties ACK for the latest size.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   metadata.viewport_size_in_pixels = third_size.size();
   metadata.local_surface_id_allocation = base::nullopt;
   host_->DidUpdateVisualProperties(metadata);
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(third_size.size(), host_->old_visual_properties_->new_size);
-  EXPECT_FALSE(process_->sink().GetFirstMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Now clearing the bounds should send out a notification but we shouldn't
   // expect a visual properties ACK (since the renderer won't ack empty sizes).
   // The message should contain the new size (0x0) and not the previous one that
   // we skipped.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetBounds(gfx::Rect());
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(gfx::Size(), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Send a rect that has no area but has either width or height set.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetBounds(gfx::Rect(0, 0, 0, 30));
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(gfx::Size(0, 30), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Set the same size again. It should not be sent again.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(gfx::Size(0, 30), host_->old_visual_properties_->new_size);
-  EXPECT_FALSE(process_->sink().GetFirstMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // A different size should be sent again, however.
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetBounds(gfx::Rect(0, 0, 0, 31));
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(gfx::Size(0, 31), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // An invalid LocalSurfaceId should result in no change to the
   // |visual_properties_ack_pending_| bit.
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetBounds(gfx::Rect(25, 25));
   view_->InvalidateLocalSurfaceId();
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(gfx::Size(25, 25), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 }
 
 // Test that a resize event is sent if SynchronizeVisualProperties() is called
@@ -888,55 +879,49 @@
   screen_info.orientation_angle = 0;
   screen_info.orientation_type = SCREEN_ORIENTATION_VALUES_PORTRAIT_PRIMARY;
 
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetScreenInfo(screen_info);
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
-  process_->sink().ClearMessages();
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   screen_info.orientation_angle = 180;
   screen_info.orientation_type = SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY;
 
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetScreenInfo(screen_info);
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
-  process_->sink().ClearMessages();
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   screen_info.device_scale_factor = 2.f;
 
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   view_->SetScreenInfo(screen_info);
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
-  process_->sink().ClearMessages();
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // No screen change.
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   view_->SetScreenInfo(screen_info);
   host_->SynchronizeVisualProperties();
   EXPECT_FALSE(host_->visual_properties_ack_pending_);
-  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 }
 
 // Test for crbug.com/25097. If a renderer crashes between a resize and the
 // corresponding update message, we must be sure to clear the visual properties
 // ACK logic.
 TEST_F(RenderWidgetHostTest, ResizeThenCrash) {
-  // Clear the first Resize message that carried screen info.
-  process_->sink().ClearMessages();
-
   // Setting the bounds to a "real" rect should send out the notification.
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   gfx::Rect original_size(0, 0, 100, 100);
   view_->SetBounds(original_size);
   host_->SynchronizeVisualProperties();
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
   EXPECT_EQ(original_size.size(), host_->old_visual_properties_->new_size);
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
+  ::testing::Mock::VerifyAndClearExpectations(&mock_owner_delegate_);
 
   // Simulate a renderer crash before the update message. Ensure all the visual
   // properties ACK logic is cleared. Must clear the view first so it doesn't
@@ -1625,9 +1610,8 @@
   // with the reqiest to new up the RenderView and so subsequent
   // SynchronizeVisualProperties calls should not result in new IPC (unless the
   // size has actually changed).
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(0);
   EXPECT_FALSE(host_->SynchronizeVisualProperties());
-  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
   EXPECT_EQ(initial_size_, host_->old_visual_properties_->new_size);
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
 }
@@ -1635,10 +1619,8 @@
 TEST_F(RenderWidgetHostTest, HideUnthrottlesResize) {
   gfx::Size original_size(100, 100);
   view_->SetBounds(gfx::Rect(original_size));
-  process_->sink().ClearMessages();
+  EXPECT_CALL(mock_owner_delegate_, UpdatePageVisualProperties(_)).Times(1);
   EXPECT_TRUE(host_->SynchronizeVisualProperties());
-  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
-      WidgetMsg_SynchronizeVisualProperties::ID));
   EXPECT_EQ(original_size, host_->old_visual_properties_->new_size);
   EXPECT_TRUE(host_->visual_properties_ack_pending_);
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 0bf2a26..2ae90677 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -24,6 +24,7 @@
 #include "content/common/render_widget_host_ns_view.mojom.h"
 #include "ipc/ipc_sender.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
 #include "ui/base/cocoa/accessibility_focus_overrider.h"
 #include "ui/base/cocoa/remote_layer_api.h"
@@ -524,7 +525,7 @@
   void GetPageTextForSpeech(SpeechCallback callback);
 
   // Interface through which the NSView is to be manipulated. This points either
-  // to |in_process_ns_view_bridge_| or to |remote_ns_view_ptr_|.
+  // to |in_process_ns_view_bridge_| or to |remote_ns_view_|.
   remote_cocoa::mojom::RenderWidgetHostNSView* ns_view_ = nullptr;
 
   // If |ns_view_| is hosted in this process, then this will be non-null,
@@ -535,9 +536,10 @@
       in_process_ns_view_bridge_;
 
   // If the NSView is hosted in a remote process and accessed via mojo then
-  // - |ns_view_| will point to |remote_ns_view_ptr_|
+  // - |ns_view_| will point to |remote_ns_view_|
   // - |remote_ns_view_client_binding_| is the binding provided to the bridge.
-  remote_cocoa::mojom::RenderWidgetHostNSViewAssociatedPtr remote_ns_view_ptr_;
+  mojo::AssociatedRemote<remote_cocoa::mojom::RenderWidgetHostNSView>
+      remote_ns_view_;
   mojo::AssociatedBinding<remote_cocoa::mojom::RenderWidgetHostNSViewHost>
       remote_ns_view_client_binding_;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 7a3503fc..df19099 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -251,7 +251,7 @@
   // destroying the associated bridge), and close the binding (to allow it
   // to be re-bound). Note that |in_process_ns_view_bridge_| remains valid.
   remote_ns_view_client_binding_.Close();
-  remote_ns_view_ptr_.reset();
+  remote_ns_view_.reset();
 
   // Enable accessibility focus overriding for remote NSViews.
   accessibility_focus_overrider_.SetAppIsRemote(remote_cocoa_application !=
@@ -265,24 +265,24 @@
 
   remote_cocoa::mojom::RenderWidgetHostNSViewHostAssociatedPtr client;
   remote_ns_view_client_binding_.Bind(mojo::MakeRequest(&client));
-  remote_cocoa::mojom::RenderWidgetHostNSViewAssociatedRequest bridge_request =
-      mojo::MakeRequest(&remote_ns_view_ptr_);
+  mojo::PendingAssociatedReceiver<remote_cocoa::mojom::RenderWidgetHostNSView>
+      view_receiver = remote_ns_view_.BindNewEndpointAndPassReceiver();
 
   // Cast from mojom::RenderWidgetHostNSViewHostPtr and
-  // mojom::RenderWidgetHostNSViewBridgeRequest to the public interfaces
-  // accepted by the application.
+  // mojo::PendingAssociatedReceiver<mojom::RenderWidgetHostNSView> to the
+  // public interfaces accepted by the application.
   // TODO(ccameron): Remove the need for this cast.
   // https://crbug.com/888290
   mojo::AssociatedInterfacePtrInfo<remote_cocoa::mojom::StubInterface>
       stub_client(client.PassInterface().PassHandle(), 0);
   remote_cocoa::mojom::StubInterfaceAssociatedRequest stub_bridge_request(
-      bridge_request.PassHandle());
+      view_receiver.PassHandle());
 
   remote_cocoa_application->CreateRenderWidgetHostNSView(
       std::move(stub_client), std::move(stub_bridge_request));
 
-  ns_view_ = remote_ns_view_ptr_.get();
-  remote_ns_view_ptr_->SetParentWebContentsNSView(parent_ns_view_id);
+  ns_view_ = remote_ns_view_.get();
+  remote_ns_view_->SetParentWebContentsNSView(parent_ns_view_id);
 }
 
 void RenderWidgetHostViewMac::SetParentUiLayer(ui::Layer* parent_ui_layer) {
@@ -702,7 +702,7 @@
   ns_view_ = nullptr;
   in_process_ns_view_bridge_.reset();
   remote_ns_view_client_binding_.Close();
-  remote_ns_view_ptr_.reset();
+  remote_ns_view_.reset();
 
   // Delete the delegated frame state, which will reach back into
   // host().
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index cf4fae2..bf977e7 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -34,6 +34,7 @@
 #include "third_party/blink/public/mojom/service_worker/embedded_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 #include "url/gurl.h"
 
 namespace content {
@@ -370,7 +371,7 @@
 
   // Remote interface to talk to a running service worker. Used to update
   // subresource loader factories in the service worker.
-  mojo::Remote<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+  mojo::Remote<blink::mojom::SubresourceLoaderUpdater>
       subresource_loader_updater_;
 
   base::WeakPtrFactory<EmbeddedWorkerInstance> weak_factory_{this};
diff --git a/content/browser/tracing/background_tracing_active_scenario.cc b/content/browser/tracing/background_tracing_active_scenario.cc
index fb390be..f96e4ba 100644
--- a/content/browser/tracing/background_tracing_active_scenario.cc
+++ b/content/browser/tracing/background_tracing_active_scenario.cc
@@ -356,7 +356,25 @@
   uint8_t modes = base::trace_event::TraceLog::RECORDING_MODE;
   if (!chrome_config.event_filters().empty())
     modes |= base::trace_event::TraceLog::FILTERING_MODE;
+
+  // Perfetto backend configures buffer sizes when tracing is started in the
+  // service (see perfetto_config.cc). Zero them out here to avoid DCHECKs in
+  // TraceConfig::Merge.
+  if (tracing::TracingUsesPerfettoBackend()) {
+    chrome_config.SetTraceBufferSizeInKb(0);
+    chrome_config.SetTraceBufferSizeInEvents(0);
+  }
+
+#if defined(OS_ANDROID)
+  // TODO(crbug.com/941318): Re-enable startup tracing for Perfetto backend on
+  // Android once all Perfetto-related deadlocks are resolved.
+  if (!tracing::TracingUsesPerfettoBackend()) {
+    base::trace_event::TraceLog::GetInstance()->SetEnabled(chrome_config,
+                                                           modes);
+  }
+#else   // defined(OS_ANDROID)
   base::trace_event::TraceLog::GetInstance()->SetEnabled(chrome_config, modes);
+#endif  // defined(OS_ANDROID)
 
   DCHECK(!tracing_session_);
   if (base::FeatureList::IsEnabled(features::kBackgroundTracingProtoOutput)) {
diff --git a/content/browser/tracing/startup_tracing_browsertest.cc b/content/browser/tracing/startup_tracing_browsertest.cc
index a99af71..86076ca 100644
--- a/content/browser/tracing/startup_tracing_browsertest.cc
+++ b/content/browser/tracing/startup_tracing_browsertest.cc
@@ -128,6 +128,10 @@
 
   auto config = tracing::TraceStartupConfig::GetInstance()
                     ->GetDefaultBrowserStartupConfig();
+  if (tracing::TracingUsesPerfettoBackend()) {
+    config.SetTraceBufferSizeInEvents(0);
+    config.SetTraceBufferSizeInKb(0);
+  }
   uint8_t modes = base::trace_event::TraceLog::RECORDING_MODE;
   base::trace_event::TraceLog::GetInstance()->SetEnabled(config, modes);
 
diff --git a/content/browser/web_package/bundled_exchanges_browsertest.cc b/content/browser/web_package/bundled_exchanges_browsertest.cc
index eab151e8..c1ca01d 100644
--- a/content/browser/web_package/bundled_exchanges_browsertest.cc
+++ b/content/browser/web_package/bundled_exchanges_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/optional.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
@@ -19,9 +20,21 @@
 #include "content/shell/browser/shell.h"
 #include "net/base/filename_util.h"
 
+#if defined(OS_ANDROID)
+#include "base/android/content_uri_utils.h"
+#endif  // OS_ANDROID
+
 namespace content {
 namespace {
 
+base::FilePath GetDefaultTestDataPath() {
+  base::FilePath test_data_dir;
+  CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
+  return test_data_dir.Append(
+      base::FilePath(FILE_PATH_LITERAL("content/test/data/bundled_exchanges/"
+                                       "bundled_exchanges_browsertest.wbn")));
+}
+
 class TestBrowserClient : public ContentBrowserClient {
  public:
   TestBrowserClient() = default;
@@ -54,13 +67,12 @@
 
 }  // namespace
 
-class BundledExchangesTrustableFileBrowserTest : public ContentBrowserTest {
+class BundledExchangesTrustableFileBrowserTestBase : public ContentBrowserTest {
  protected:
-  BundledExchangesTrustableFileBrowserTest() {}
-  ~BundledExchangesTrustableFileBrowserTest() override = default;
+  BundledExchangesTrustableFileBrowserTestBase() = default;
+  ~BundledExchangesTrustableFileBrowserTestBase() override = default;
 
   void SetUp() override {
-    test_data_path_ = GetTestDataPath();
     ContentBrowserTest::SetUp();
   }
 
@@ -80,9 +92,8 @@
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitchASCII(
-        switches::kTrustableBundledExchangesFileUrl,
-        net::FilePathToFileURL(test_data_path()).spec());
+    command_line->AppendSwitchASCII(switches::kTrustableBundledExchangesFileUrl,
+                                    test_data_url().spec());
   }
 
   void TearDownOnMainThread() override {
@@ -94,8 +105,7 @@
   void NavigateToBundleAndWaitForReady() {
     base::string16 expected_title = base::ASCIIToUTF16("Ready");
     TitleWatcher title_watcher(shell()->web_contents(), expected_title);
-    EXPECT_TRUE(NavigateToURL(shell()->web_contents(),
-                              net::FilePathToFileURL(test_data_path()),
+    EXPECT_TRUE(NavigateToURL(shell()->web_contents(), test_data_url(),
                               GURL("https://test.example.org/")));
     EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
   }
@@ -110,28 +120,54 @@
     EXPECT_EQ(ok, title_watcher.WaitAndGetTitle());
   }
 
-  virtual base::FilePath GetTestDataPath() const {
-    base::FilePath test_data_dir;
-    CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
-    return test_data_dir.AppendASCII("content")
-        .AppendASCII("test")
-        .AppendASCII("data")
-        .AppendASCII("bundled_exchanges")
-        .AppendASCII("bundled_exchanges_browsertest.wbn");
-  }
-
-  const base::FilePath& test_data_path() const { return test_data_path_; }
+  const GURL& test_data_url() const { return test_data_url_; }
 
   ContentBrowserClient* original_client_ = nullptr;
+  GURL test_data_url_;
 
  private:
   TestBrowserClient browser_client_;
-  base::FilePath test_data_path_;
 
+  DISALLOW_COPY_AND_ASSIGN(BundledExchangesTrustableFileBrowserTestBase);
+};
+
+enum class TestFilePathMode {
+  kNormalFilePath,
+#if defined(OS_ANDROID)
+  kContentURI,
+#endif  // OS_ANDROID
+};
+
+class BundledExchangesTrustableFileBrowserTest
+    : public testing::WithParamInterface<TestFilePathMode>,
+      public BundledExchangesTrustableFileBrowserTestBase {
+ protected:
+  BundledExchangesTrustableFileBrowserTest() {
+    if (GetParam() == TestFilePathMode::kNormalFilePath) {
+      test_data_url_ = net::FilePathToFileURL(GetDefaultTestDataPath());
+      return;
+    }
+#if defined(OS_ANDROID)
+    DCHECK_EQ(TestFilePathMode::kContentURI, GetParam());
+    base::FilePath tmp_dir;
+    CHECK(base::GetTempDir(&tmp_dir));
+    // The directory name "bundled_exchanges" must be kept in sync with
+    // content/shell/android/browsertests_apk/res/xml/file_paths.xml
+    base::FilePath tmp_wbn_dir = tmp_dir.AppendASCII("bundled_exchanges");
+    CHECK(base::CreateDirectoryAndGetError(tmp_wbn_dir, nullptr));
+    base::FilePath temp_file;
+    CHECK(base::CreateTemporaryFileInDir(tmp_wbn_dir, &temp_file));
+    CHECK(base::CopyFile(GetDefaultTestDataPath(), temp_file));
+    test_data_url_ = GURL(base::GetContentUriFromFilePath(temp_file).value());
+#endif  // OS_ANDROID
+  }
+  ~BundledExchangesTrustableFileBrowserTest() override = default;
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(BundledExchangesTrustableFileBrowserTest);
 };
 
-IN_PROC_BROWSER_TEST_F(BundledExchangesTrustableFileBrowserTest,
+IN_PROC_BROWSER_TEST_P(BundledExchangesTrustableFileBrowserTest,
                        TrustableBundledExchangesFile) {
   // Don't run the test if we couldn't override BrowserClient. It happens only
   // on Android Kitkat or older systems.
@@ -140,7 +176,7 @@
   NavigateToBundleAndWaitForReady();
 }
 
-IN_PROC_BROWSER_TEST_F(BundledExchangesTrustableFileBrowserTest, RangeRequest) {
+IN_PROC_BROWSER_TEST_P(BundledExchangesTrustableFileBrowserTest, RangeRequest) {
   // Don't run the test if we couldn't override BrowserClient. It happens only
   // on Android Kitkat or older systems.
   if (!original_client_)
@@ -150,17 +186,25 @@
   RunTestScript("test-range-request.js");
 }
 
-class BundledExchangesTrustableFileNotFoundBrowserTest
-    : public BundledExchangesTrustableFileBrowserTest {
- protected:
-  BundledExchangesTrustableFileNotFoundBrowserTest() = default;
-  ~BundledExchangesTrustableFileNotFoundBrowserTest() override = default;
+INSTANTIATE_TEST_SUITE_P(BundledExchangesTrustableFileBrowserTests,
+                         BundledExchangesTrustableFileBrowserTest,
+                         testing::Values(TestFilePathMode::kNormalFilePath
+#if defined(OS_ANDROID)
+                                         ,
+                                         TestFilePathMode::kContentURI
+#endif  // OS_ANDROID
+                                         ));
 
-  base::FilePath GetTestDataPath() const override {
+class BundledExchangesTrustableFileNotFoundBrowserTest
+    : public BundledExchangesTrustableFileBrowserTestBase {
+ protected:
+  BundledExchangesTrustableFileNotFoundBrowserTest() {
     base::FilePath test_data_dir;
     CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
-    return test_data_dir.AppendASCII("not_found");
+    test_data_url_ =
+        net::FilePathToFileURL(test_data_dir.AppendASCII("not_found"));
   }
+  ~BundledExchangesTrustableFileNotFoundBrowserTest() override = default;
 };
 
 IN_PROC_BROWSER_TEST_F(BundledExchangesTrustableFileNotFoundBrowserTest,
@@ -173,8 +217,7 @@
   base::RunLoop run_loop;
   FinishNavigationObserver finish_navigation_observer(shell()->web_contents(),
                                                       run_loop.QuitClosure());
-  EXPECT_FALSE(NavigateToURL(shell()->web_contents(),
-                             net::FilePathToFileURL(test_data_path()),
+  EXPECT_FALSE(NavigateToURL(shell()->web_contents(), test_data_url(),
                              GURL("https://test.example.org/")));
   run_loop.Run();
   ASSERT_TRUE(finish_navigation_observer.error_code());
diff --git a/content/browser/web_package/bundled_exchanges_handle.cc b/content/browser/web_package/bundled_exchanges_handle.cc
index eb089b94..a4f5b14 100644
--- a/content/browser/web_package/bundled_exchanges_handle.cc
+++ b/content/browser/web_package/bundled_exchanges_handle.cc
@@ -54,6 +54,56 @@
     "by Blink, but based on a user initiated navigation."
   )");
 
+// A class to provide a network::mojom::URLLoader interface to redirect a
+// request to the BundledExchanges to the main resource url.
+class PrimaryURLRedirectLoader final : public network::mojom::URLLoader {
+ public:
+  PrimaryURLRedirectLoader(
+      mojo::PendingRemote<network::mojom::URLLoaderClient> client)
+      : client_(std::move(client)) {}
+
+  void OnReadyToRedirect(const network::ResourceRequest& resource_request,
+                         const GURL& url) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    DCHECK(client_.is_connected());
+    network::ResourceResponseHead response_head;
+    response_head.encoded_data_length = 0;
+    response_head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
+        net::HttpUtil::AssembleRawHeaders(
+            base::StringPrintf("HTTP/1.1 %d %s\r\n", 303, "See Other")));
+
+    net::RedirectInfo redirect_info = net::RedirectInfo::ComputeRedirectInfo(
+        "GET", resource_request.url, resource_request.site_for_cookies,
+        resource_request.top_frame_origin,
+        resource_request.update_first_party_url_on_redirect
+            ? net::URLRequest::FirstPartyURLPolicy::
+                  UPDATE_FIRST_PARTY_URL_ON_REDIRECT
+            : net::URLRequest::FirstPartyURLPolicy::
+                  NEVER_CHANGE_FIRST_PARTY_URL,
+        resource_request.referrer_policy, resource_request.referrer.spec(), 303,
+        url, /*referrer_policy_header=*/base::nullopt,
+        /*insecure_scheme_was_upgraded=*/false, /*copy_fragment=*/true,
+        /*is_signed_exchange_fallback_redirect=*/false);
+    client_->OnReceiveRedirect(redirect_info, response_head);
+  }
+
+ private:
+  // mojom::URLLoader overrides:
+  void FollowRedirect(const std::vector<std::string>& removed_headers,
+                      const net::HttpRequestHeaders& modified_headers,
+                      const base::Optional<GURL>& new_url) override {}
+  void SetPriority(net::RequestPriority priority,
+                   int intra_priority_value) override {}
+  void PauseReadingBodyFromNet() override {}
+  void ResumeReadingBodyFromNet() override {}
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  mojo::Remote<network::mojom::URLLoaderClient> client_;
+
+  DISALLOW_COPY_AND_ASSIGN(PrimaryURLRedirectLoader);
+};
+
 // A class to inherit NavigationLoaderInterceptor for the navigation to a
 // BundledExchanges.
 class Interceptor final : public NavigationLoaderInterceptor {
@@ -89,69 +139,6 @@
 
 }  // namespace
 
-// A class to provide a network::mojom::URLLoader interface to redirect a
-// request to the BundledExchanges to the main resource url.
-class BundledExchangesHandle::PrimaryURLRedirectLoader final
-    : public network::mojom::URLLoader {
- public:
-  PrimaryURLRedirectLoader(
-      const network::ResourceRequest& resource_request,
-      mojo::PendingRemote<network::mojom::URLLoaderClient> client)
-      : client_(std::move(client)) {
-    redirect_info_ = net::RedirectInfo::ComputeRedirectInfo(
-        "GET", resource_request.url, resource_request.site_for_cookies,
-        resource_request.top_frame_origin,
-        resource_request.update_first_party_url_on_redirect
-            ? net::URLRequest::FirstPartyURLPolicy::
-                  UPDATE_FIRST_PARTY_URL_ON_REDIRECT
-            : net::URLRequest::FirstPartyURLPolicy::
-                  NEVER_CHANGE_FIRST_PARTY_URL,
-        resource_request.referrer_policy, resource_request.referrer.spec(), 303,
-        GURL(), /*referrer_policy_header=*/base::nullopt,
-        /*insecure_scheme_was_upgraded=*/false, /*copy_fragment=*/true,
-        /*is_signed_exchange_fallback_redirect=*/false);
-  }
-
-  void OnReadyToRedirect(
-      const GURL& url,
-      data_decoder::mojom::BundleMetadataParseErrorPtr error) {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    DCHECK(client_.is_connected());
-
-    // TODO(crbug.com/966753): Handle |error|.
-
-    network::ResourceResponseHead response_head;
-    response_head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
-        net::HttpUtil::AssembleRawHeaders(
-            base::StringPrintf("HTTP/1.1 %d %s\r\n", 303, "See Other")));
-    redirect_info_.new_url = url;
-    client_->OnReceiveRedirect(redirect_info_, response_head);
-  }
-
-  base::WeakPtr<PrimaryURLRedirectLoader> GetWeakPtr() {
-    return weak_factory_.GetWeakPtr();
-  }
-
- private:
-  // mojom::URLLoader overrides:
-  void FollowRedirect(const std::vector<std::string>& removed_headers,
-                      const net::HttpRequestHeaders& modified_headers,
-                      const base::Optional<GURL>& new_url) override {}
-  void SetPriority(net::RequestPriority priority,
-                   int intra_priority_value) override {}
-  void PauseReadingBodyFromNet() override {}
-  void ResumeReadingBodyFromNet() override {}
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  mojo::Remote<network::mojom::URLLoaderClient> client_;
-  net::RedirectInfo redirect_info_;
-
-  base::WeakPtrFactory<PrimaryURLRedirectLoader> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(PrimaryURLRedirectLoader);
-};
-
 BundledExchangesHandle::BundledExchangesHandle() {}
 
 BundledExchangesHandle::BundledExchangesHandle(
@@ -223,14 +210,10 @@
   }
 
   auto redirect_loader =
-      std::make_unique<BundledExchangesHandle::PrimaryURLRedirectLoader>(
-          resource_request, client.PassInterface());
-  redirect_loader->OnReadyToRedirect(std::move(primary_url_),
-                                     std::move(metadata_error_));
-  std::unique_ptr<network::mojom::URLLoader> url_loader(
-      std::move(redirect_loader));
+      std::make_unique<PrimaryURLRedirectLoader>(client.PassInterface());
+  redirect_loader->OnReadyToRedirect(resource_request, primary_url_);
   mojo::MakeSelfOwnedReceiver(
-      std::move(url_loader),
+      std::move(redirect_loader),
       mojo::PendingReceiver<network::mojom::URLLoader>(std::move(request)));
 }
 
diff --git a/content/browser/web_package/bundled_exchanges_handle.h b/content/browser/web_package/bundled_exchanges_handle.h
index 5a5a2c0..828974095 100644
--- a/content/browser/web_package/bundled_exchanges_handle.h
+++ b/content/browser/web_package/bundled_exchanges_handle.h
@@ -48,8 +48,6 @@
   bool IsReadyForLoading();
 
  private:
-  class PrimaryURLRedirectLoader;
-
   void CreateURLLoader(const network::ResourceRequest& resource_request,
                        network::mojom::URLLoaderRequest request,
                        network::mojom::URLLoaderClientPtr client);
diff --git a/content/browser/web_package/bundled_exchanges_reader.cc b/content/browser/web_package/bundled_exchanges_reader.cc
index d49c3b6..2ba23cce 100644
--- a/content/browser/web_package/bundled_exchanges_reader.cc
+++ b/content/browser/web_package/bundled_exchanges_reader.cc
@@ -23,16 +23,14 @@
 
 namespace content {
 
-BundledExchangesReader::SharedFile::SharedFile(const base::FilePath& file_path)
-    : file_path_(file_path) {
+BundledExchangesReader::SharedFile::SharedFile(
+    const BundledExchangesSource& source) {
   base::PostTaskAndReplyWithResult(
       FROM_HERE, {base::ThreadPool(), base::MayBlock()},
       base::BindOnce(
-          [](const base::FilePath& file_path) -> std::unique_ptr<base::File> {
-            return std::make_unique<base::File>(
-                file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-          },
-          file_path_),
+          [](std::unique_ptr<BundledExchangesSource> source)
+              -> std::unique_ptr<base::File> { return source->OpenFile(); },
+          source.Clone()),
       base::BindOnce(&SharedFile::SetFile, base::RetainedRef(this)));
 }
 
@@ -142,7 +140,7 @@
     : parser_(ServiceManagerConnection::GetForProcess()
                   ? ServiceManagerConnection::GetForProcess()->GetConnector()
                   : nullptr),
-      file_(base::MakeRefCounted<SharedFile>(source.file_path())) {}
+      file_(base::MakeRefCounted<SharedFile>(source)) {}
 
 BundledExchangesReader::~BundledExchangesReader() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/content/browser/web_package/bundled_exchanges_reader.h b/content/browser/web_package/bundled_exchanges_reader.h
index f5594427..74f52ad5 100644
--- a/content/browser/web_package/bundled_exchanges_reader.h
+++ b/content/browser/web_package/bundled_exchanges_reader.h
@@ -75,7 +75,7 @@
   // SharedFileDataSource instances.
   class SharedFile final : public base::RefCountedThreadSafe<SharedFile> {
    public:
-    explicit SharedFile(const base::FilePath& file_path);
+    explicit SharedFile(const BundledExchangesSource& source);
     void DuplicateFile(base::OnceCallback<void(base::File)> callback);
     base::File* operator->();
 
diff --git a/content/browser/web_package/bundled_exchanges_source.cc b/content/browser/web_package/bundled_exchanges_source.cc
index e250227..068bf686 100644
--- a/content/browser/web_package/bundled_exchanges_source.cc
+++ b/content/browser/web_package/bundled_exchanges_source.cc
@@ -4,15 +4,27 @@
 
 #include "content/browser/web_package/bundled_exchanges_source.h"
 
+#include "base/files/file.h"
 #include "base/memory/ptr_util.h"
+#include "build/build_config.h"
 #include "net/base/filename_util.h"
 #include "url/gurl.h"
 
+#if defined(OS_ANDROID)
+#include "base/android/content_uri_utils.h"
+#endif
+
 namespace content {
 
 // static
 std::unique_ptr<BundledExchangesSource>
 BundledExchangesSource::CreateFromTrustedFileUrl(const GURL& url) {
+#if defined(OS_ANDROID)
+  if (url.SchemeIs(url::kContentScheme)) {
+    const base::FilePath file_path = base::FilePath(url.spec());
+    return base::WrapUnique(new BundledExchangesSource(true, file_path, url));
+  }
+#endif
   DCHECK(url.SchemeIsFile());
   base::FilePath file_path;
   if (!net::FileURLToFilePath(url, &file_path))
@@ -25,6 +37,17 @@
       new BundledExchangesSource(is_trusted_, file_path_, url_));
 }
 
+std::unique_ptr<base::File> BundledExchangesSource::OpenFile() const {
+#if defined(OS_ANDROID)
+  if (file_path_.IsContentUri()) {
+    return std::make_unique<base::File>(
+        base::OpenContentUriForRead(file_path_));
+  }
+#endif
+  return std::make_unique<base::File>(
+      file_path_, base::File::FLAG_OPEN | base::File::FLAG_READ);
+}
+
 BundledExchangesSource::BundledExchangesSource(bool is_trusted,
                                                const base::FilePath& file_path,
                                                const GURL& url)
diff --git a/content/browser/web_package/bundled_exchanges_source.h b/content/browser/web_package/bundled_exchanges_source.h
index b123023..2b2985a4 100644
--- a/content/browser/web_package/bundled_exchanges_source.h
+++ b/content/browser/web_package/bundled_exchanges_source.h
@@ -5,11 +5,17 @@
 #ifndef CONTENT_BROWSER_WEB_PACKAGE_BUNDLED_EXCHANGES_SOURCE_H_
 #define CONTENT_BROWSER_WEB_PACKAGE_BUNDLED_EXCHANGES_SOURCE_H_
 
+#include <memory>
+
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "content/common/content_export.h"
 #include "url/gurl.h"
 
+namespace base {
+class File;
+}  // namespace base
+
 namespace content {
 
 // A class to abstract required information to access a BundledExchanges.
@@ -18,9 +24,11 @@
   static std::unique_ptr<BundledExchangesSource> CreateFromTrustedFileUrl(
       const GURL& url);
 
+  ~BundledExchangesSource() = default;
+
   std::unique_ptr<BundledExchangesSource> Clone() const;
 
-  ~BundledExchangesSource() = default;
+  std::unique_ptr<base::File> OpenFile() const;
 
   // A flag to represent if this source can be trusted, i.e. using the URL in
   // the BundledExchanges as the origin for the content. Otherwise, we will use
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc
index a84cda5..99335fc94 100644
--- a/content/browser/webauth/authenticator_common.cc
+++ b/content/browser/webauth/authenticator_common.cc
@@ -601,7 +601,8 @@
 
   std::vector<device::CableDiscoveryData> cable_extension;
   if (ctap_get_assertion_request_->cable_extension &&
-      request_delegate_->ShouldPermitCableExtension(caller_origin_)) {
+      request_delegate_->ShouldPermitCableExtension(caller_origin_) &&
+      IsFocused()) {
     cable_extension = *ctap_get_assertion_request_->cable_extension;
   }
 
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc
index c4287066..57848544 100644
--- a/content/browser/worker_host/dedicated_worker_host.cc
+++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -22,6 +22,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/service_worker_context.h"
+#include "content/public/common/network_service_util.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
@@ -200,6 +201,14 @@
         appcache_handle->appcache_host_id());
   }
 
+  // Set if the subresource loader factories support file URLs so that we can
+  // recreate the factories after Network Service crashes.
+  // TODO(nhiroki): Currently this flag is calculated based on the request
+  // initiator origin to keep consistency with WorkerScriptFetchInitiator, but
+  // probably this should be calculated based on the worker origin as the
+  // factories be used for subresource loading on the worker.
+  file_url_support_ = request_initiator_origin.scheme() == url::kFileScheme;
+
   service_worker_handle_ = std::make_unique<ServiceWorkerNavigationHandle>(
       storage_partition_impl->GetServiceWorkerContext());
 
@@ -261,6 +270,12 @@
     return;
   }
 
+  // Start observing Network Service crash when it's running out-of-process.
+  if (IsOutOfProcessNetworkService()) {
+    ObserveNetworkServiceCrash(static_cast<StoragePartitionImpl*>(
+        worker_process_host->GetStoragePartition()));
+  }
+
   // Set up the default network loader factory.
   bool bypass_redirect_checks = false;
   subresource_loader_factories->pending_default_factory() =
@@ -282,10 +297,12 @@
     service_worker_state = controller->object_info->state;
   }
 
-  client_->OnScriptLoadStarted(service_worker_handle_->TakeProviderInfo(),
-                               std::move(main_script_load_params),
-                               std::move(subresource_loader_factories),
-                               std::move(controller));
+  client_->OnScriptLoadStarted(
+      service_worker_handle_->TakeProviderInfo(),
+      std::move(main_script_load_params),
+      std::move(subresource_loader_factories),
+      subresource_loader_updater_.BindNewPipeAndPassReceiver(),
+      std::move(controller));
 
   // |service_worker_remote_object| is an associated remote, so calls can't be
   // made on it until its receiver is sent. Now that the receiver was sent, it
@@ -409,6 +426,67 @@
       ->CreateService(std::move(receiver));
 }
 
+void DedicatedWorkerHost::ObserveNetworkServiceCrash(
+    StoragePartitionImpl* storage_partition_impl) {
+  auto params = network::mojom::URLLoaderFactoryParams::New();
+  params->process_id = worker_process_id_;
+  storage_partition_impl->GetNetworkContext()->CreateURLLoaderFactory(
+      mojo::MakeRequest(&network_service_connection_error_handler_holder_),
+      std::move(params));
+  network_service_connection_error_handler_holder_.set_connection_error_handler(
+      base::BindOnce(&DedicatedWorkerHost::UpdateSubresourceLoaderFactories,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void DedicatedWorkerHost::UpdateSubresourceLoaderFactories() {
+  DCHECK(IsOutOfProcessNetworkService());
+  DCHECK(subresource_loader_updater_.is_bound());
+  DCHECK(network_service_connection_error_handler_holder_);
+  DCHECK(network_service_connection_error_handler_holder_.encountered_error());
+
+  // Get a storage partition.
+  auto* worker_process_host = RenderProcessHost::FromID(worker_process_id_);
+  if (!worker_process_host)
+    return;
+  auto* storage_partition_impl = static_cast<StoragePartitionImpl*>(
+      worker_process_host->GetStoragePartition());
+
+  // Get a storage domain.
+  if (!GetAncestorRenderFrameHost() ||
+      !GetAncestorRenderFrameHost()->GetSiteInstance())
+    return;
+  std::string storage_domain;
+  std::string partition_name;
+  bool in_memory;
+  GetContentClient()->browser()->GetStoragePartitionConfigForSite(
+      storage_partition_impl->browser_context(),
+      GetAncestorRenderFrameHost()->GetSiteInstance()->GetSiteURL(),
+      /*can_be_default=*/true, &storage_domain, &partition_name, &in_memory);
+
+  // Start observing Network Service crash again.
+  ObserveNetworkServiceCrash(storage_partition_impl);
+
+  // Recreate the default URLLoaderFactory. This doesn't support
+  // AppCache-specific factory.
+  std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
+      subresource_loader_factories =
+          WorkerScriptFetchInitiator::CreateFactoryBundle(
+              worker_process_id_, storage_partition_impl, storage_domain,
+              file_url_support_, /*filesystem_url_support=*/true);
+
+  bool bypass_redirect_checks = false;
+  subresource_loader_factories->pending_default_factory() =
+      CreateNetworkFactoryForSubresources(worker_process_host,
+                                          GetAncestorRenderFrameHost(),
+                                          &bypass_redirect_checks);
+  subresource_loader_factories->set_bypass_redirect_checks(
+      bypass_redirect_checks);
+
+  subresource_loader_updater_->UpdateSubresourceLoaderFactories(
+      std::move(subresource_loader_factories));
+}
+
+// May return a nullptr.
 RenderFrameHostImpl* DedicatedWorkerHost::GetAncestorRenderFrameHost() {
   // Use |worker_process_id_| as the ancestor render frame's process ID as the
   // frame surely lives in the same process for dedicated workers.
diff --git a/content/browser/worker_host/dedicated_worker_host.h b/content/browser/worker_host/dedicated_worker_host.h
index 4e56abf..bb0b7dc0 100644
--- a/content/browser/worker_host/dedicated_worker_host.h
+++ b/content/browser/worker_host/dedicated_worker_host.h
@@ -19,6 +19,7 @@
 #include "third_party/blink/public/mojom/websockets/websocket_connector.mojom-forward.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 
 namespace url {
 class Origin;
@@ -28,6 +29,7 @@
 
 class ServiceWorkerNavigationHandle;
 class ServiceWorkerObjectHost;
+class StoragePartitionImpl;
 
 // Creates a host factory for a dedicated worker. This must be called on the UI
 // thread.
@@ -115,6 +117,9 @@
           controller_service_worker_object_host,
       bool success);
 
+  // Sets up the observer of network service crash.
+  void ObserveNetworkServiceCrash(StoragePartitionImpl* storage_partition_impl);
+
   // Creates a network factory for subresource requests from this worker. The
   // network factory is meant to be passed to the renderer.
   mojo::PendingRemote<network::mojom::URLLoaderFactory>
@@ -131,6 +136,10 @@
   void CreateNestedDedicatedWorker(
       mojo::PendingReceiver<blink::mojom::DedicatedWorkerHostFactory> receiver);
 
+  // Updates subresource loader factories. This is supposed to be called when
+  // out-of-process Network Service crashes.
+  void UpdateSubresourceLoaderFactories();
+
   // May return a nullptr.
   RenderFrameHostImpl* GetAncestorRenderFrameHost();
 
@@ -167,9 +176,18 @@
       &broker_};
   mojo::Receiver<blink::mojom::DedicatedWorkerHost> host_receiver_;
 
+  // Indicates if subresource loaders of this worker support file URLs.
+  bool file_url_support_ = false;
+
   // The liveness state of the dedicated worker in the renderer.
   bool is_frozen_ = false;
 
+  // For observing Network Service connection errors only.
+  network::mojom::URLLoaderFactoryPtr
+      network_service_connection_error_handler_holder_;
+  mojo::Remote<blink::mojom::SubresourceLoaderUpdater>
+      subresource_loader_updater_;
+
   base::WeakPtrFactory<DedicatedWorkerHost> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(DedicatedWorkerHost);
diff --git a/content/browser/worker_host/worker_script_fetch_initiator.h b/content/browser/worker_host/worker_script_fetch_initiator.h
index 1d9ff92..19d6183 100644
--- a/content/browser/worker_host/worker_script_fetch_initiator.h
+++ b/content/browser/worker_host/worker_script_fetch_initiator.h
@@ -77,7 +77,6 @@
       const std::string& storage_domain,
       CompletionCallback callback);
 
- private:
   // Creates a loader factory bundle. Must be called on the UI thread.
   static std::unique_ptr<blink::URLLoaderFactoryBundleInfo> CreateFactoryBundle(
       int worker_process_id,
@@ -86,6 +85,7 @@
       bool file_support,
       bool filesystem_url_support);
 
+ private:
   // Adds additional request headers to |resource_request|. Must be called on
   // the UI thread.
   static void AddAdditionalRequestHeaders(
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index be70e341..5ae2848 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -912,19 +912,21 @@
 
 void ChildThreadImpl::GetRoute(
     int32_t routing_id,
-    blink::mojom::AssociatedInterfaceProviderAssociatedRequest request) {
-  associated_interface_provider_bindings_.AddBinding(
-      this, std::move(request), routing_id);
+    mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterfaceProvider>
+        receiver) {
+  associated_interface_provider_receivers_.Add(this, std::move(receiver),
+                                               routing_id);
 }
 
 void ChildThreadImpl::GetAssociatedInterface(
     const std::string& name,
-    blink::mojom::AssociatedInterfaceAssociatedRequest request) {
+    mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
+        receiver) {
   int32_t routing_id =
-      associated_interface_provider_bindings_.dispatch_context();
+      associated_interface_provider_receivers_.current_context();
   Listener* route = router_.GetRoute(routing_id);
   if (route)
-    route->OnAssociatedInterfaceRequest(name, request.PassHandle());
+    route->OnAssociatedInterfaceRequest(name, receiver.PassHandle());
 }
 
 bool ChildThreadImpl::IsInBrowserProcess() const {
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h
index 96fa9d2..c6d66ba 100644
--- a/content/child/child_thread_impl.h
+++ b/content/child/child_thread_impl.h
@@ -28,10 +28,11 @@
 #include "ipc/ipc_buildflags.h"  // For BUILDFLAG(IPC_MESSAGE_LOG_ENABLED).
 #include "ipc/ipc_platform_file.h"
 #include "ipc/message_router.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/generic_pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/cpp/bindings/shared_remote.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
 #include "third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom.h"
@@ -204,14 +205,16 @@
   void EnsureConnected();
 
   // mojom::RouteProvider:
-  void GetRoute(int32_t routing_id,
-                blink::mojom::AssociatedInterfaceProviderAssociatedRequest
-                    request) override;
+  void GetRoute(
+      int32_t routing_id,
+      mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterfaceProvider>
+          receiver) override;
 
   // blink::mojom::AssociatedInterfaceProvider:
   void GetAssociatedInterface(
       const std::string& name,
-      blink::mojom::AssociatedInterfaceAssociatedRequest request) override;
+      mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
+          receiver) override;
 
 #if defined(OS_WIN)
   mojom::FontCacheWin* GetFontCacheWin();
@@ -221,8 +224,9 @@
   std::unique_ptr<ServiceManagerConnection> service_manager_connection_;
 
   mojo::AssociatedReceiver<mojom::RouteProvider> route_provider_receiver_{this};
-  mojo::AssociatedBindingSet<blink::mojom::AssociatedInterfaceProvider, int32_t>
-      associated_interface_provider_bindings_;
+  mojo::AssociatedReceiverSet<blink::mojom::AssociatedInterfaceProvider,
+                              int32_t>
+      associated_interface_provider_receivers_;
   mojo::AssociatedRemote<mojom::RouteProvider> remote_route_provider_;
 #if defined(OS_WIN)
   mojom::FontCacheWinPtr font_cache_win_ptr_;
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index fa7f266..74efad6 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -59,6 +59,9 @@
     "browser_plugin/browser_plugin_messages.h",
     "child_process_host_impl.cc",
     "child_process_host_impl.h",
+    "common_param_traits.cc",
+    "common_param_traits.h",
+    "common_param_traits_macros.h",
     "common_sandbox_support_linux.cc",
     "content_constants_internal.cc",
     "content_constants_internal.h",
diff --git a/content/common/associated_interfaces.mojom b/content/common/associated_interfaces.mojom
index cc8bdcb..a890215 100644
--- a/content/common/associated_interfaces.mojom
+++ b/content/common/associated_interfaces.mojom
@@ -10,5 +10,5 @@
 // ID to an AssociatedInterfaceProvider.
 interface RouteProvider {
   GetRoute(int32 routing_id,
-           associated blink.mojom.AssociatedInterfaceProvider& request);
+           pending_associated_receiver<blink.mojom.AssociatedInterfaceProvider> receiver);
 };
diff --git a/content/common/common_param_traits.cc b/content/common/common_param_traits.cc
new file mode 100644
index 0000000..a2125ec
--- /dev/null
+++ b/content/common/common_param_traits.cc
@@ -0,0 +1,27 @@
+// 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.
+
+// Get basic type definitions.
+#include "content/common/common_param_traits.h"
+
+// Generate param traits write methods.
+#include "ipc/param_traits_write_macros.h"
+namespace IPC {
+#undef CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+#include "content/common/common_param_traits_macros.h"
+}  // namespace IPC
+
+// Generate param traits read methods.
+#include "ipc/param_traits_read_macros.h"
+namespace IPC {
+#undef CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+#include "content/common/common_param_traits_macros.h"
+}  // namespace IPC
+
+// Generate param traits log methods.
+#include "ipc/param_traits_log_macros.h"
+namespace IPC {
+#undef CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+#include "content/common/common_param_traits_macros.h"
+}  // namespace IPC
diff --git a/content/common/common_param_traits.h b/content/common/common_param_traits.h
new file mode 100644
index 0000000..d375a2a1
--- /dev/null
+++ b/content/common/common_param_traits.h
@@ -0,0 +1,13 @@
+// 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 CONTENT_COMMON_COMMON_PARAM_TRAITS_H_
+#define CONTENT_COMMON_COMMON_PARAM_TRAITS_H_
+
+// This file provides declarations of IPC serialization macros that are used
+// in more than one IPC message file.
+
+#include "content/common/common_param_traits_macros.h"
+
+#endif  // CONTENT_COMMON_COMMON_PARAM_TRAITS_H_
diff --git a/content/common/common_param_traits_macros.h b/content/common/common_param_traits_macros.h
new file mode 100644
index 0000000..1d79a8a
--- /dev/null
+++ b/content/common/common_param_traits_macros.h
@@ -0,0 +1,54 @@
+// 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.
+
+// Singly or Multiply-included shared traits file depending on circumstances.
+// This allows the use of IPC serialization macros in more than one IPC message
+// file.
+#ifndef CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+#define CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
+
+#include "content/common/frame_messages.h"
+#include "content/common/visual_properties.h"
+#include "ipc/ipc_message_macros.h"
+#include "third_party/blink/public/web/web_device_emulation_params.h"
+
+#undef IPC_MESSAGE_EXPORT
+#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
+
+// Traits for VisualProperties.
+IPC_ENUM_TRAITS_MAX_VALUE(blink::WebDeviceEmulationParams::ScreenPosition,
+                          blink::WebDeviceEmulationParams::kScreenPositionLast)
+
+IPC_ENUM_TRAITS_MAX_VALUE(content::ScreenOrientationValues,
+                          content::SCREEN_ORIENTATION_VALUES_LAST)
+
+IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::WebScreenOrientationType,
+                              blink::kWebScreenOrientationUndefined,
+                              blink::WebScreenOrientationTypeLast)
+
+IPC_ENUM_TRAITS_MAX_VALUE(blink::WebDisplayMode,
+                          blink::WebDisplayMode::kWebDisplayModeLast)
+
+IPC_STRUCT_TRAITS_BEGIN(content::VisualProperties)
+  IPC_STRUCT_TRAITS_MEMBER(screen_info)
+  IPC_STRUCT_TRAITS_MEMBER(auto_resize_enabled)
+  IPC_STRUCT_TRAITS_MEMBER(min_size_for_auto_resize)
+  IPC_STRUCT_TRAITS_MEMBER(max_size_for_auto_resize)
+  IPC_STRUCT_TRAITS_MEMBER(new_size)
+  IPC_STRUCT_TRAITS_MEMBER(compositor_viewport_pixel_rect)
+  IPC_STRUCT_TRAITS_MEMBER(browser_controls_shrink_blink_size)
+  IPC_STRUCT_TRAITS_MEMBER(scroll_focused_node_into_view)
+  IPC_STRUCT_TRAITS_MEMBER(top_controls_height)
+  IPC_STRUCT_TRAITS_MEMBER(bottom_controls_height)
+  IPC_STRUCT_TRAITS_MEMBER(local_surface_id_allocation)
+  IPC_STRUCT_TRAITS_MEMBER(visible_viewport_size)
+  IPC_STRUCT_TRAITS_MEMBER(is_fullscreen_granted)
+  IPC_STRUCT_TRAITS_MEMBER(display_mode)
+  IPC_STRUCT_TRAITS_MEMBER(capture_sequence_number)
+  IPC_STRUCT_TRAITS_MEMBER(zoom_level)
+  IPC_STRUCT_TRAITS_MEMBER(page_scale_factor)
+  IPC_STRUCT_TRAITS_MEMBER(is_pinch_gesture_active)
+IPC_STRUCT_TRAITS_END()
+
+#endif  // CONTENT_COMMON_COMMON_PARAM_TRAITS_MACROS_H_
diff --git a/content/common/service_manager/service_manager_connection_impl_unittest.cc b/content/common/service_manager/service_manager_connection_impl_unittest.cc
index 0de95f88..44a23dd 100644
--- a/content/common/service_manager/service_manager_connection_impl_unittest.cc
+++ b/content/common/service_manager/service_manager_connection_impl_unittest.cc
@@ -23,7 +23,7 @@
 }  // namespace
 
 TEST(ServiceManagerConnectionImplTest, ServiceLaunchThreading) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::Thread io_thread("ServiceManagerConnectionImplTest IO Thread");
   io_thread.Start();
   service_manager::mojom::ServicePtr service;
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 632b7b8..848ac033 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -23,6 +23,7 @@
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/resources/shared_bitmap.h"
+#include "content/common/common_param_traits_macros.h"
 #include "content/common/content_export.h"
 #include "content/common/content_param_traits.h"
 #include "content/common/frame_replication_state.h"
@@ -199,6 +200,13 @@
                     bool /* result */)
 #endif
 
+// Sent to the renderer hosting the local main frame when view visual properties
+// are updated. Currently also carries state for main widget visual properties.
+// Eventually we want this to be used for all page visual updates, not just
+// local main frame view visual updates.
+IPC_MESSAGE_ROUTED1(ViewMsg_UpdateLocalMainFrameVisualProperties,
+                    content::VisualProperties /* visual_properties */)
+
 // Sent to the main-frame's view to request performing a page scale animation
 // based on the point/rect provided.
 IPC_MESSAGE_ROUTED2(ViewMsg_AnimateDoubleTapZoom,
diff --git a/content/common/widget_messages.h b/content/common/widget_messages.h
index 54ca0be..405771f 100644
--- a/content/common/widget_messages.h
+++ b/content/common/widget_messages.h
@@ -10,6 +10,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "cc/input/touch_action.h"
+#include "content/common/common_param_traits_macros.h"
 #include "content/common/content_param_traits.h"
 #include "content/common/cursors/webcursor.h"
 #include "content/common/tab_switch_time_recorder.h"
@@ -22,7 +23,6 @@
 #include "third_party/blink/public/platform/web_float_point.h"
 #include "third_party/blink/public/platform/web_float_rect.h"
 #include "third_party/blink/public/platform/web_intrinsic_sizing_info.h"
-#include "third_party/blink/public/web/web_device_emulation_params.h"
 #include "third_party/blink/public/web/web_text_direction.h"
 #include "ui/base/ime/text_input_action.h"
 #include "ui/base/ime/text_input_mode.h"
@@ -35,41 +35,6 @@
 
 #define IPC_MESSAGE_START WidgetMsgStart
 
-// Traits for VisualProperties.
-IPC_ENUM_TRAITS_MAX_VALUE(blink::WebDeviceEmulationParams::ScreenPosition,
-                          blink::WebDeviceEmulationParams::kScreenPositionLast)
-
-IPC_ENUM_TRAITS_MAX_VALUE(content::ScreenOrientationValues,
-                          content::SCREEN_ORIENTATION_VALUES_LAST)
-
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::WebScreenOrientationType,
-                              blink::kWebScreenOrientationUndefined,
-                              blink::WebScreenOrientationTypeLast)
-
-IPC_ENUM_TRAITS_MAX_VALUE(blink::WebDisplayMode,
-                          blink::WebDisplayMode::kWebDisplayModeLast)
-
-IPC_STRUCT_TRAITS_BEGIN(content::VisualProperties)
-  IPC_STRUCT_TRAITS_MEMBER(screen_info)
-  IPC_STRUCT_TRAITS_MEMBER(auto_resize_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(min_size_for_auto_resize)
-  IPC_STRUCT_TRAITS_MEMBER(max_size_for_auto_resize)
-  IPC_STRUCT_TRAITS_MEMBER(new_size)
-  IPC_STRUCT_TRAITS_MEMBER(compositor_viewport_pixel_rect)
-  IPC_STRUCT_TRAITS_MEMBER(browser_controls_shrink_blink_size)
-  IPC_STRUCT_TRAITS_MEMBER(scroll_focused_node_into_view)
-  IPC_STRUCT_TRAITS_MEMBER(top_controls_height)
-  IPC_STRUCT_TRAITS_MEMBER(bottom_controls_height)
-  IPC_STRUCT_TRAITS_MEMBER(local_surface_id_allocation)
-  IPC_STRUCT_TRAITS_MEMBER(visible_viewport_size)
-  IPC_STRUCT_TRAITS_MEMBER(is_fullscreen_granted)
-  IPC_STRUCT_TRAITS_MEMBER(display_mode)
-  IPC_STRUCT_TRAITS_MEMBER(capture_sequence_number)
-  IPC_STRUCT_TRAITS_MEMBER(zoom_level)
-  IPC_STRUCT_TRAITS_MEMBER(page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(is_pinch_gesture_active)
-IPC_STRUCT_TRAITS_END()
-
 // Traits for WebDeviceEmulationParams.
 IPC_STRUCT_TRAITS_BEGIN(blink::WebFloatPoint)
   IPC_STRUCT_TRAITS_MEMBER(x)
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContactsDialogHost.java b/content/public/android/java/src/org/chromium/content/browser/ContactsDialogHost.java
index 62f2ec1c..82717bfb 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContactsDialogHost.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContactsDialogHost.java
@@ -84,6 +84,8 @@
     @Override
     public void onContactsPickerUserAction(@ContactsPickerAction int action, List<Contact> contacts,
             int percentageShared, int propertiesRequested) {
+        if (mNativeContactsProviderAndroid == 0) return;
+
         switch (action) {
             case ContactsPickerAction.CANCEL:
                 ContactsDialogHostJni.get().endContactsList(
diff --git a/content/public/browser/gpu_data_manager.h b/content/public/browser/gpu_data_manager.h
index 76a2d18..1332bd6 100644
--- a/content/public/browser/gpu_data_manager.h
+++ b/content/public/browser/gpu_data_manager.h
@@ -28,6 +28,12 @@
   GPU_PROCESS_KIND_COUNT
 };
 
+enum GpuInfoRequest {
+  kGpuInfoRequestDxDiag = 1 << 0,
+  kGpuInfoRequestDx12Vulkan = 1 << 1,
+  kGpuInfoRequestAll = kGpuInfoRequestDxDiag | kGpuInfoRequestDx12Vulkan,
+};
+
 class GpuDataManagerObserver;
 
 // This class is fully thread-safe.
@@ -54,7 +60,8 @@
   virtual bool GpuAccessAllowed(std::string* reason) = 0;
 
   // Requests complete GPU info if it has not already been requested
-  virtual void RequestCompleteGpuInfoIfNeeded() = 0;
+  virtual void RequestCompleteGpuInfoIfNeeded(GpuInfoRequest request,
+                                              bool delayed) = 0;
 
   // Check if basic and context GPU info have been collected.
   virtual bool IsEssentialGpuInfoAvailable() = 0;
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 2150e36..c6f6b8ca 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -242,7 +242,7 @@
 // API font fallback calls to retrieve a fallback font family name as opposed to
 // using a hard-coded font lookup table.
 const base::Feature kLegacyWindowsDWriteFontFallback{
-    "LegacyWindowsDWriteFontFallback", base::FEATURE_DISABLED_BY_DEFAULT};
+    "LegacyWindowsDWriteFontFallback", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kLogJsConsoleMessages{"LogJsConsoleMessages",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/test/browser_task_environment.h b/content/public/test/browser_task_environment.h
index 4e68d7f..a921eed3 100644
--- a/content/public/test/browser_task_environment.h
+++ b/content/public/test/browser_task_environment.h
@@ -202,12 +202,6 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserTaskEnvironment);
 };
 
-// TODO(gab): Mass migrate users and remove this.
-class TestBrowserThreadBundle : public BrowserTaskEnvironment {
- public:
-  using BrowserTaskEnvironment::BrowserTaskEnvironment;
-};
-
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_TEST_BROWSER_TASK_ENVIRONMENT_H_
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 1a9ae2bc5..9d1f9b1e 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -254,8 +254,6 @@
     "p2p/mdns_responder_adapter.h",
     "p2p/network_list_manager.h",
     "p2p/network_list_observer.h",
-    "p2p/network_manager_uma.cc",
-    "p2p/network_manager_uma.h",
     "p2p/port_allocator.cc",
     "p2p/port_allocator.h",
     "p2p/socket_client.h",
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index 8205da7..cd1cb06 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -659,6 +659,8 @@
       resource_request->request_initiator = request.RequestorOrigin();
     }
   }
+  if (!request.IsolatedWorldOrigin().IsNull())
+    resource_request->isolated_world_origin = request.IsolatedWorldOrigin();
   resource_request->referrer = referrer_url;
 
   resource_request->referrer_policy =
diff --git a/content/renderer/loader/web_worker_fetch_context_impl.cc b/content/renderer/loader/web_worker_fetch_context_impl.cc
index d1e5c86..235d3f8 100644
--- a/content/renderer/loader/web_worker_fetch_context_impl.cc
+++ b/content/renderer/loader/web_worker_fetch_context_impl.cc
@@ -19,6 +19,7 @@
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/url_loader_throttle_provider.h"
 #include "content/public/renderer/websocket_handshake_throttle_provider.h"
+#include "content/renderer/loader/child_url_loader_factory_bundle.h"
 #include "content/renderer/loader/code_cache_loader_impl.h"
 #include "content/renderer/loader/frame_request_blocker.h"
 #include "content/renderer/loader/request_extra_data.h"
@@ -152,8 +153,9 @@
     mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
         watcher_receiver,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
-    std::unique_ptr<network::SharedURLLoaderFactoryInfo>
-        fallback_factory_info) {
+    std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory_info,
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+        pending_subresource_loader_updater) {
   mojo::PendingReceiver<blink::mojom::ServiceWorkerWorkerClient>
       service_worker_client_receiver;
   mojo::PendingRemote<blink::mojom::ServiceWorkerWorkerClientRegistry>
@@ -183,6 +185,7 @@
           std::move(service_worker_worker_client_registry),
           std::move(service_worker_container_host),
           std::move(loader_factory_info), std::move(fallback_factory_info),
+          std::move(pending_subresource_loader_updater),
           GetContentClient()->renderer()->CreateURLLoaderThrottleProvider(
               URLLoaderThrottleProviderType::kWorker),
           GetContentClient()
@@ -213,6 +216,8 @@
         service_worker_container_host,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory_info,
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+        pending_subresource_loader_updater,
     std::unique_ptr<URLLoaderThrottleProvider> throttle_provider,
     std::unique_ptr<WebSocketHandshakeThrottleProvider>
         websocket_handshake_throttle_provider,
@@ -226,6 +231,8 @@
           std::move(service_worker_container_host)),
       loader_factory_info_(std::move(loader_factory_info)),
       fallback_factory_info_(std::move(fallback_factory_info)),
+      pending_subresource_loader_updater_(
+          std::move(pending_subresource_loader_updater)),
       thread_safe_sender_(thread_safe_sender),
       renderer_preferences_(std::move(renderer_preferences)),
       preference_watcher_pending_receiver_(
@@ -270,12 +277,16 @@
         service_worker_container_host.InitWithNewPipeAndPassReceiver());
   }
 
+  // |pending_subresource_loader_updater| is not used for
+  // non-PlzDedicatedWorker.
   scoped_refptr<WebWorkerFetchContextImpl> new_context =
       CloneForNestedWorkerInternal(
           std::move(service_worker_client_receiver),
           std::move(service_worker_worker_client_registry),
           std::move(service_worker_container_host), loader_factory_->Clone(),
-          fallback_factory_->Clone(), std::move(task_runner));
+          fallback_factory_->Clone(),
+          /*pending_subresource_loader_updater=*/mojo::NullReceiver(),
+          std::move(task_runner));
   new_context->controller_service_worker_mode_ =
       controller_service_worker_mode_;
 
@@ -287,6 +298,8 @@
     ServiceWorkerProviderContext* service_worker_provider_context,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory_info,
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+        pending_subresource_loader_updater,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
   DCHECK(loader_factory_info);
@@ -298,7 +311,8 @@
         /*service_worker_client_receiver=*/mojo::NullReceiver(),
         /*service_worker_worker_client_registry=*/mojo::NullRemote(),
         /*container_host=*/mojo::NullRemote(), std::move(loader_factory_info),
-        std::move(fallback_factory_info), std::move(task_runner));
+        std::move(fallback_factory_info),
+        std::move(pending_subresource_loader_updater), std::move(task_runner));
   }
 
   mojo::PendingRemote<blink::mojom::ServiceWorkerWorkerClientRegistry>
@@ -323,6 +337,7 @@
           std::move(service_worker_worker_client_registry),
           std::move(service_worker_container_host),
           std::move(loader_factory_info), std::move(fallback_factory_info),
+          std::move(pending_subresource_loader_updater),
           std::move(task_runner));
   new_context->controller_service_worker_mode_ =
       service_worker_provider_context->GetControllerServiceWorkerMode();
@@ -343,6 +358,9 @@
       network::SharedURLLoaderFactory::Create(std::move(loader_factory_info_));
   fallback_factory_ = network::SharedURLLoaderFactory::Create(
       std::move(fallback_factory_info_));
+  subresource_loader_updater_.Bind(
+      std::move(pending_subresource_loader_updater_));
+
   if (service_worker_client_receiver_.is_valid())
     receiver_.Bind(std::move(service_worker_client_receiver_));
 
@@ -548,6 +566,8 @@
         service_worker_container_host,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory_info,
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+        pending_subresource_loader_updater,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   mojo::PendingRemote<blink::mojom::RendererPreferenceWatcher>
       preference_watcher;
@@ -558,6 +578,7 @@
       std::move(service_worker_worker_client_registry),
       std::move(service_worker_container_host), std::move(loader_factory_info),
       std::move(fallback_factory_info),
+      std::move(pending_subresource_loader_updater),
       throttle_provider_ ? throttle_provider_->Clone() : nullptr,
       websocket_handshake_throttle_provider_
           ? websocket_handshake_throttle_provider_->Clone(
@@ -608,6 +629,22 @@
       std::move(service_worker_url_loader_factory));
 }
 
+void WebWorkerFetchContextImpl::UpdateSubresourceLoaderFactories(
+    std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
+        subresource_loader_factories) {
+  auto subresource_loader_factory_bundle =
+      base::MakeRefCounted<ChildURLLoaderFactoryBundle>(
+          std::make_unique<ChildURLLoaderFactoryBundleInfo>(
+              std::move(subresource_loader_factories)));
+  loader_factory_ = network::SharedURLLoaderFactory::Create(
+      subresource_loader_factory_bundle->Clone());
+  fallback_factory_ = network::SharedURLLoaderFactory::Create(
+      subresource_loader_factory_bundle->CloneWithoutAppCacheFactory());
+  web_loader_factory_ = std::make_unique<Factory>(
+      resource_dispatcher_->GetWeakPtr(), loader_factory_);
+  ResetServiceWorkerURLLoaderFactory();
+}
+
 void WebWorkerFetchContextImpl::NotifyUpdate(
     blink::mojom::RendererPreferencesPtr new_prefs) {
   if (accept_languages_watcher_ &&
diff --git a/content/renderer/loader/web_worker_fetch_context_impl.h b/content/renderer/loader/web_worker_fetch_context_impl.h
index 83da021..9569bcb 100644
--- a/content/renderer/loader/web_worker_fetch_context_impl.h
+++ b/content/renderer/loader/web_worker_fetch_context_impl.h
@@ -26,6 +26,7 @@
 #include "third_party/blink/public/mojom/service_worker/service_worker_container.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "url/gurl.h"
@@ -50,6 +51,7 @@
 // service workers, ServiceWorkerFetchContextImpl class is used instead.
 class CONTENT_EXPORT WebWorkerFetchContextImpl
     : public blink::WebWorkerFetchContext,
+      public blink::mojom::SubresourceLoaderUpdater,
       public blink::mojom::ServiceWorkerWorkerClient,
       public blink::mojom::RendererPreferenceWatcher {
  public:
@@ -78,7 +80,9 @@
           watcher_receiver,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo>
-          fallback_factory_info);
+          fallback_factory_info,
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+          pending_subresource_loader_updater);
 
   // Clones this fetch context for a nested worker.
   // For non-PlzDedicatedWorker. This will be removed once PlzDedicatedWorker is
@@ -93,6 +97,8 @@
       std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo>
           fallback_factory_info,
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+          pending_subresource_loader_updater,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
   // blink::WebWorkerFetchContext implementation:
@@ -188,6 +194,8 @@
       std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo>
           fallback_factory_info,
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+          pending_subresource_loader_updater,
       std::unique_ptr<URLLoaderThrottleProvider> throttle_provider,
       std::unique_ptr<WebSocketHandshakeThrottleProvider>
           websocket_handshake_throttle_provider,
@@ -206,6 +214,8 @@
       std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo>
           fallback_factory_info,
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+          pending_subresource_loader_updater,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
   bool Send(IPC::Message* message);
@@ -216,6 +226,11 @@
   // controlled by a service worker.
   void ResetServiceWorkerURLLoaderFactory();
 
+  // Implements blink::mojom::SubresourceLoaderUpdater.
+  void UpdateSubresourceLoaderFactories(
+      std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
+          subresource_loader_factories) override;
+
   // Implements blink::mojom::RendererPreferenceWatcher.
   void NotifyUpdate(blink::mojom::RendererPreferencesPtr new_prefs) override;
 
@@ -270,6 +285,18 @@
   scoped_refptr<network::SharedURLLoaderFactory> fallback_factory_;
 
   // Initialized on the worker thread when InitializeOnWorkerThread() is called.
+  // Used to reconnect to the Network Service after the Network Service crash.
+  // This is only used for dedicated workers when PlzDedicatedWorker is enabled.
+  // When PlzDedicatedWorker is disabled, the ancestor render frame updates the
+  // loaders via Host/TrackedChildURLLoaderFactoryBundle. For shared workers,
+  // the renderer process detects the crash, and terminates the worker instead
+  // of recovery.
+  mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+      pending_subresource_loader_updater_;
+  mojo::Receiver<blink::mojom::SubresourceLoaderUpdater>
+      subresource_loader_updater_{this};
+
+  // Initialized on the worker thread when InitializeOnWorkerThread() is called.
   scoped_refptr<base::RefCountedData<mojo::Remote<blink::mojom::BlobRegistry>>>
       blob_registry_;
 
diff --git a/content/renderer/p2p/empty_network_manager.cc b/content/renderer/p2p/empty_network_manager.cc
index 76165e2..121b518 100644
--- a/content/renderer/p2p/empty_network_manager.cc
+++ b/content/renderer/p2p/empty_network_manager.cc
@@ -8,7 +8,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "content/renderer/p2p/network_manager_uma.h"
+#include "third_party/blink/public/platform/modules/p2p/network_manager_uma.h"
 
 namespace content {
 
@@ -56,7 +56,7 @@
     return;
 
   if (!sent_first_update_)
-    ReportIPPermissionStatus(PERMISSION_NOT_REQUESTED);
+    blink::ReportIPPermissionStatus(blink::PERMISSION_NOT_REQUESTED);
 
   sent_first_update_ = true;
   SignalNetworksChanged();
diff --git a/content/renderer/p2p/filtering_network_manager.cc b/content/renderer/p2p/filtering_network_manager.cc
index 93d42f7..4dead8a 100644
--- a/content/renderer/p2p/filtering_network_manager.cc
+++ b/content/renderer/p2p/filtering_network_manager.cc
@@ -125,7 +125,7 @@
   DCHECK_GT(pending_permission_checks_, 0);
   VLOG(1) << "FilteringNetworkManager received permission status: "
           << (granted ? "granted" : "denied");
-  IPPermissionStatus old_status = GetIPPermissionStatus();
+  blink::IPPermissionStatus old_status = GetIPPermissionStatus();
 
   --pending_permission_checks_;
 
@@ -166,31 +166,32 @@
   // We wait until our permission status is known before firing a network
   // change signal, so that the listener(s) don't miss out on receiving a
   // full network list.
-  if (changed && GetIPPermissionStatus() != PERMISSION_UNKNOWN)
+  if (changed && GetIPPermissionStatus() != blink::PERMISSION_UNKNOWN)
     FireEventIfStarted();
 }
 
 void FilteringNetworkManager::ReportMetrics(bool report_start_latency) {
   if (report_start_latency) {
-    ReportTimeToUpdateNetworkList(base::TimeTicks::Now() -
-                                  start_updating_time_);
+    blink::ReportTimeToUpdateNetworkList(base::TimeTicks::Now() -
+                                         start_updating_time_);
   }
 
   ReportIPPermissionStatus(GetIPPermissionStatus());
 }
 
-IPPermissionStatus FilteringNetworkManager::GetIPPermissionStatus() const {
+blink::IPPermissionStatus FilteringNetworkManager::GetIPPermissionStatus()
+    const {
   if (enumeration_permission() == ENUMERATION_ALLOWED) {
-    return media_permission_ ? PERMISSION_GRANTED_WITH_CHECKING
-                             : PERMISSION_GRANTED_WITHOUT_CHECKING;
+    return media_permission_ ? blink::PERMISSION_GRANTED_WITH_CHECKING
+                             : blink::PERMISSION_GRANTED_WITHOUT_CHECKING;
   }
 
   if (!pending_permission_checks_ &&
       enumeration_permission() == ENUMERATION_BLOCKED) {
-    return PERMISSION_DENIED;
+    return blink::PERMISSION_DENIED;
   }
 
-  return PERMISSION_UNKNOWN;
+  return blink::PERMISSION_UNKNOWN;
 }
 
 void FilteringNetworkManager::FireEventIfStarted() {
diff --git a/content/renderer/p2p/filtering_network_manager.h b/content/renderer/p2p/filtering_network_manager.h
index f15f7623..eeff4d8e 100644
--- a/content/renderer/p2p/filtering_network_manager.h
+++ b/content/renderer/p2p/filtering_network_manager.h
@@ -10,7 +10,7 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "content/common/content_export.h"
-#include "content/renderer/p2p/network_manager_uma.h"
+#include "third_party/blink/public/platform/modules/p2p/network_manager_uma.h"
 #include "third_party/webrtc/rtc_base/network.h"
 #include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h"
 #include "url/gurl.h"
@@ -77,7 +77,7 @@
   // A tri-state permission checking status. It starts with UNKNOWN and will
   // change to GRANTED if one of permissions is granted. Otherwise, DENIED will
   // be returned.
-  IPPermissionStatus GetIPPermissionStatus() const;
+  blink::IPPermissionStatus GetIPPermissionStatus() const;
 
   void FireEventIfStarted();
 
diff --git a/content/renderer/p2p/network_manager_uma.h b/content/renderer/p2p/network_manager_uma.h
deleted file mode 100644
index 370acf9..0000000
--- a/content/renderer/p2p/network_manager_uma.h
+++ /dev/null
@@ -1,31 +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.
-
-#ifndef CONTENT_RENDERER_P2P_NETWORK_MANAGER_UMA_H_
-#define CONTENT_RENDERER_P2P_NETWORK_MANAGER_UMA_H_
-
-namespace base {
-class TimeDelta;
-}  // namespace
-
-namespace content {
-
-// Need to be kept the same order as in histograms.xml
-enum IPPermissionStatus {
-  PERMISSION_UNKNOWN,  // Requested but have never fired SignalNetworksChanged.
-  PERMISSION_NOT_REQUESTED,             // Multiple routes is not requested.
-  PERMISSION_DENIED,                    // Requested but denied.
-  PERMISSION_GRANTED_WITH_CHECKING,     // Requested and granted after checking
-                                        // mic/camera permission.
-  PERMISSION_GRANTED_WITHOUT_CHECKING,  // Requested and granted without
-                                        // checking mic/camera permission.
-  PERMISSION_MAX,
-};
-
-void ReportIPPermissionStatus(IPPermissionStatus status);
-void ReportTimeToUpdateNetworkList(const base::TimeDelta& ticks);
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_P2P_NETWORK_MANAGER_UMA_H_
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index e3d4ffc..16938bb3 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -146,6 +146,7 @@
 #include "content/renderer/web_ui_extension_data.h"
 #include "content/renderer/worker/dedicated_worker_host_factory_client.h"
 #include "crypto/sha2.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/data_url.h"
 #include "net/base/load_flags.h"
@@ -3206,9 +3207,10 @@
   if (!remote_associated_interfaces_) {
     ChildThreadImpl* thread = ChildThreadImpl::current();
     if (thread) {
-      blink::mojom::AssociatedInterfaceProviderAssociatedPtr remote_interfaces;
+      mojo::PendingAssociatedRemote<blink::mojom::AssociatedInterfaceProvider>
+          remote_interfaces;
       thread->GetRemoteRouteProvider()->GetRoute(
-          routing_id_, mojo::MakeRequest(&remote_interfaces));
+          routing_id_, remote_interfaces.InitWithNewEndpointAndPassReceiver());
       remote_associated_interfaces_ =
           std::make_unique<blink::AssociatedInterfaceProvider>(
               std::move(remote_interfaces),
@@ -4208,11 +4210,14 @@
       watcher_receiver = watcher.InitWithNewPipeAndPassReceiver();
   render_view()->RegisterRendererPreferenceWatcher(std::move(watcher));
 
+  // |pending_subresource_loader_updater| is not used for non-PlzDedicatedWorker
+  // and worklets.
   scoped_refptr<WebWorkerFetchContextImpl> worker_fetch_context =
       WebWorkerFetchContextImpl::Create(
           provider->context(), render_view_->renderer_preferences(),
           std::move(watcher_receiver), GetLoaderFactoryBundle()->Clone(),
-          GetLoaderFactoryBundle()->CloneWithoutAppCacheFactory());
+          GetLoaderFactoryBundle()->CloneWithoutAppCacheFactory(),
+          /*pending_subresource_loader_updater=*/mojo::NullReceiver());
 
   worker_fetch_context->set_ancestor_frame_id(routing_id_);
   worker_fetch_context->set_frame_request_blocker(frame_request_blocker_);
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 5e483c5..97be359 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -35,6 +35,7 @@
 #include "content/renderer/render_widget.h"
 #include "content/renderer/resource_timing_info_conversions.h"
 #include "ipc/ipc_message_macros.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "printing/buildflags/buildflags.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
@@ -946,9 +947,10 @@
 RenderFrameProxy::GetRemoteAssociatedInterfaces() {
   if (!remote_associated_interfaces_) {
     ChildThreadImpl* thread = ChildThreadImpl::current();
-    blink::mojom::AssociatedInterfaceProviderAssociatedPtr remote_interfaces;
+    mojo::PendingAssociatedRemote<blink::mojom::AssociatedInterfaceProvider>
+        remote_interfaces;
     thread->GetRemoteRouteProvider()->GetRoute(
-        routing_id_, mojo::MakeRequest(&remote_interfaces));
+        routing_id_, remote_interfaces.InitWithNewEndpointAndPassReceiver());
     remote_associated_interfaces_ =
         std::make_unique<blink::AssociatedInterfaceProvider>(
             std::move(remote_interfaces));
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 36012ef..d76b5b9 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1240,6 +1240,8 @@
     IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
     IPC_MESSAGE_HANDLER(ViewMsg_EnablePreferredSizeChangedMode,
                         OnEnablePreferredSizeChangedMode)
+    IPC_MESSAGE_HANDLER(ViewMsg_UpdateLocalMainFrameVisualProperties,
+                        OnUpdateLocalMainFramePageVisualProperties)
     IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs)
     IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt)
     IPC_MESSAGE_HANDLER(ViewMsg_AnimateDoubleTapZoom,
@@ -2003,8 +2005,21 @@
     GetWidget()->set_screen_info(screen_info);
 }
 
+void RenderViewImpl::OnUpdateLocalMainFramePageVisualProperties(
+    const VisualProperties& visual_properties) {
+  // TODO(https://crbug.com/998273): We should not forward visual properties to
+  // frozen render widgets.
+  // If the main frame is detached while the IPC is in flight, then
+  // render_widget_ may be nullptr when we get here [once we get rid of frozen
+  // RenderWidgets]. In that case, don't forward anything.
+  if (render_widget_) {
+    render_widget_->OnSynchronizeVisualProperties(visual_properties);
+  }
+}
+
 void RenderViewImpl::OnUpdatePageVisualProperties(
     const gfx::Size& viewport_size) {
+  // TODO(https://crbug.com/998273): Handle visual_properties appropriately.
   // Using this pathway to update the visual viewport should only happen for
   // remote main frames. Local main frames will update the viewport size by
   // RenderWidget calling RenderViewImpl::ResizeVisualViewport() directly.
@@ -2026,9 +2041,9 @@
     const gfx::Size& scaled_viewport_size) {
   // This function is currently only called for local main frames. Once remote
   // main frames no longer have a RenderWidget, they may also route through
-  // here via RenderViewImpl::OnUpdatePageVisualProperties(). In that case,
-  // WebViewImpl will need to implement its Size() function based on something
-  // other than the widget size.
+  // here via RenderViewImpl::OnUpdateLocalMainFramePageVisualProperties(). In
+  // that case, WebViewImpl will need to implement its Size() function based on
+  // something other than the widget size.
   webview()->ResizeVisualViewport(scaled_viewport_size);
 }
 
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 7562387..d27c0b3 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -463,6 +463,8 @@
   void OnPageWasHidden();
   void OnPageWasShown();
   void OnUpdateScreenInfo(const ScreenInfo& screen_info);
+  void OnUpdateLocalMainFramePageVisualProperties(
+      const VisualProperties& visual_properties);
   void OnUpdatePageVisualProperties(const gfx::Size& visible_viewport_size);
   void SetPageFrozen(bool frozen);
   void PutPageIntoBackForwardCache();
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index f22e72c..11b0575 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -107,7 +107,7 @@
     mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
         preference_watcher_receiver,
     std::unique_ptr<blink::URLLoaderFactoryBundleInfo> subresource_loaders,
-    mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
         subresource_loader_updater,
     const GURL& script_url_to_skip_throttling,
     scoped_refptr<base::SingleThreadTaskRunner> initiator_thread_task_runner)
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index f86654d..fb78255 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -34,6 +34,7 @@
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_error.h"
 #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h"
 #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h"
@@ -103,7 +104,7 @@
       mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
           preference_watcher_receiver,
       std::unique_ptr<blink::URLLoaderFactoryBundleInfo> subresource_loaders,
-      mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
           subresource_loader_updater,
       const GURL& script_url_to_skip_throttling,
       scoped_refptr<base::SingleThreadTaskRunner> initiator_thread_task_runner);
@@ -223,7 +224,7 @@
       pending_service_worker_receiver_;
   mojo::PendingReceiver<blink::mojom::ControllerServiceWorker>
       controller_receiver_;
-  mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+  mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
       pending_subresource_loader_updater_;
 
   // This is bound on the initiator thread.
diff --git a/content/renderer/service_worker/service_worker_fetch_context_impl.cc b/content/renderer/service_worker/service_worker_fetch_context_impl.cc
index 87baf90..dfa2054 100644
--- a/content/renderer/service_worker/service_worker_fetch_context_impl.cc
+++ b/content/renderer/service_worker/service_worker_fetch_context_impl.cc
@@ -32,7 +32,7 @@
         websocket_handshake_throttle_provider,
     mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
         preference_watcher_receiver,
-    mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
         pending_subresource_loader_updater)
     : renderer_preferences_(renderer_preferences),
       worker_script_url_(worker_script_url),
diff --git a/content/renderer/service_worker/service_worker_fetch_context_impl.h b/content/renderer/service_worker/service_worker_fetch_context_impl.h
index aa2678cd..21651514 100644
--- a/content/renderer/service_worker/service_worker_fetch_context_impl.h
+++ b/content/renderer/service_worker/service_worker_fetch_context_impl.h
@@ -12,6 +12,7 @@
 #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "url/gurl.h"
 
@@ -22,7 +23,7 @@
 
 class CONTENT_EXPORT ServiceWorkerFetchContextImpl final
     : public blink::WebWorkerFetchContext,
-      public blink::mojom::ServiceWorkerSubresourceLoaderUpdater,
+      public blink::mojom::SubresourceLoaderUpdater,
       public blink::mojom::RendererPreferenceWatcher {
  public:
   // |url_loader_factory_info| is used for regular loads from the service worker
@@ -48,7 +49,7 @@
           websocket_handshake_throttle_provider,
       mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
           preference_watcher_receiver,
-      mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
           pending_subresource_loader_updater);
 
   // blink::WebWorkerFetchContext implementation:
@@ -108,14 +109,14 @@
 
   mojo::Receiver<blink::mojom::RendererPreferenceWatcher>
       preference_watcher_receiver_{this};
-  mojo::Receiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+  mojo::Receiver<blink::mojom::SubresourceLoaderUpdater>
       subresource_loader_updater_{this};
 
   // These mojo objects are kept while starting up the worker thread. Valid
   // until InitializeOnWorkerThread().
   mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
       preference_watcher_pending_receiver_;
-  mojo::PendingReceiver<blink::mojom::ServiceWorkerSubresourceLoaderUpdater>
+  mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
       pending_subresource_loader_updater_;
 
   // This is owned by ThreadedMessagingProxyBase on the main thread.
diff --git a/content/renderer/worker/dedicated_worker_host_factory_client.cc b/content/renderer/worker/dedicated_worker_host_factory_client.cc
index 9272a579..ee7b3b1 100644
--- a/content/renderer/worker/dedicated_worker_host_factory_client.cc
+++ b/content/renderer/worker/dedicated_worker_host_factory_client.cc
@@ -85,11 +85,13 @@
   if (base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)) {
     worker_fetch_context =
         static_cast<WebWorkerFetchContextImpl*>(web_worker_fetch_context)
-            ->CloneForNestedWorker(service_worker_provider_context_.get(),
-                                   subresource_loader_factory_bundle_->Clone(),
-                                   subresource_loader_factory_bundle_
-                                       ->CloneWithoutAppCacheFactory(),
-                                   std::move(task_runner));
+            ->CloneForNestedWorker(
+                service_worker_provider_context_.get(),
+                subresource_loader_factory_bundle_->Clone(),
+                subresource_loader_factory_bundle_
+                    ->CloneWithoutAppCacheFactory(),
+                std::move(pending_subresource_loader_updater_),
+                std::move(task_runner));
     worker_fetch_context->SetResponseOverrideForMainScript(
         std::move(response_override_for_main_script_));
   } else {
@@ -118,7 +120,8 @@
           service_worker_provider_context_.get(),
           std::move(renderer_preference), std::move(watcher_receiver),
           subresource_loader_factory_bundle_->Clone(),
-          subresource_loader_factory_bundle_->CloneWithoutAppCacheFactory());
+          subresource_loader_factory_bundle_->CloneWithoutAppCacheFactory(),
+          std::move(pending_subresource_loader_updater_));
   worker_fetch_context->SetResponseOverrideForMainScript(
       std::move(response_override_for_main_script_));
   return worker_fetch_context;
@@ -138,6 +141,8 @@
     blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
     std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
         subresource_loader_factory_bundle_info,
+    mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+        subresource_loader_updater,
     blink::mojom::ControllerServiceWorkerInfoPtr controller_info) {
   DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
   DCHECK(main_script_load_params);
@@ -150,6 +155,9 @@
           std::make_unique<ChildURLLoaderFactoryBundleInfo>(
               std::move(subresource_loader_factory_bundle_info)));
 
+  DCHECK(!pending_subresource_loader_updater_);
+  pending_subresource_loader_updater_ = std::move(subresource_loader_updater);
+
   DCHECK(!service_worker_provider_context_);
   if (service_worker_provider_info) {
     service_worker_provider_context_ =
diff --git a/content/renderer/worker/dedicated_worker_host_factory_client.h b/content/renderer/worker/dedicated_worker_host_factory_client.h
index 9692cce..d47c545 100644
--- a/content/renderer/worker/dedicated_worker_host_factory_client.h
+++ b/content/renderer/worker/dedicated_worker_host_factory_client.h
@@ -76,6 +76,8 @@
       blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
       std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
           subresource_loader_factory_bundle_info,
+      mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+          subresource_loader_updater,
       blink::mojom::ControllerServiceWorkerInfoPtr controller_info) override;
   void OnScriptLoadStartFailed() override;
 
@@ -83,6 +85,9 @@
   blink::WebDedicatedWorker* worker_;
 
   scoped_refptr<ChildURLLoaderFactoryBundle> subresource_loader_factory_bundle_;
+  mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
+      pending_subresource_loader_updater_;
+
   scoped_refptr<ServiceWorkerProviderContext> service_worker_provider_context_;
   std::unique_ptr<NavigationResponseOverrideParameters>
       response_override_for_main_script_;
diff --git a/content/renderer/worker/embedded_shared_worker_stub.cc b/content/renderer/worker/embedded_shared_worker_stub.cc
index 65a66ec4..8a6374b5 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -175,13 +175,15 @@
   std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory =
       subresource_loader_factory_bundle_->CloneWithoutAppCacheFactory();
 
+  // |pending_subresource_loader_updater| is not used for shared workers.
   scoped_refptr<WebWorkerFetchContextImpl> worker_fetch_context =
       WebWorkerFetchContextImpl::Create(
           service_worker_provider_context_.get(),
           std::move(renderer_preferences_),
           std::move(preference_watcher_receiver_),
           subresource_loader_factory_bundle_->Clone(),
-          std::move(fallback_factory));
+          std::move(fallback_factory),
+          /*pending_subresource_loader_updater*/ mojo::NullReceiver());
 
   // TODO(horo): To get the correct first_party_to_cookies for the shared
   // worker, we need to check the all documents bounded by the shared worker.
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn
index 89c910d..c42bba7 100644
--- a/content/shell/android/BUILD.gn
+++ b/content/shell/android/BUILD.gn
@@ -353,6 +353,7 @@
     "//base:base_java",
     "//content/public/android:content_java",
     "//testing/android/native_test:native_test_java",
+    "//third_party/android_deps:com_android_support_support_compat_java",
     "//ui/android:ui_java",
   ]
   java_files = [ "browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java" ]
diff --git a/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java b/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
index e372cb3..4641d47 100644
--- a/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
+++ b/content/shell/android/browsertests/src/org/chromium/content_shell/browsertests/ContentShellBrowserTestActivity.java
@@ -4,9 +4,14 @@
 
 package org.chromium.content_shell.browsertests;
 
+import android.content.Context;
+import android.net.Uri;
+import android.support.v4.content.FileProvider;
 import android.view.Window;
 import android.view.WindowManager;
 
+import org.chromium.base.ContentUriUtils;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.library_loader.LibraryLoader;
@@ -20,6 +25,8 @@
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.base.WindowAndroid;
 
+import java.io.File;
+
 /** An Activity base class for running browser tests against ContentShell. */
 public abstract class ContentShellBrowserTestActivity extends NativeBrowserTestActivity {
 
@@ -28,6 +35,17 @@
     private ShellManager mShellManager;
     private WindowAndroid mWindowAndroid;
 
+    private static class FileProviderHelper implements ContentUriUtils.FileProviderUtil {
+        // Keep this variable in sync with the value defined in file_paths.xml.
+        private static final String API_AUTHORITY_SUFFIX = ".FileProvider";
+
+        @Override
+        public Uri getContentUriFromFile(File file) {
+            Context appContext = ContextUtils.getApplicationContext();
+            return FileProvider.getUriForFile(
+                    appContext, appContext.getPackageName() + API_AUTHORITY_SUFFIX, file);
+        }
+    }
     /**
      * Initializes the browser process.
      *
@@ -43,6 +61,7 @@
             System.exit(-1);
         }
 
+        ContentUriUtils.setFileProviderUtil(new FileProviderHelper());
         setContentView(getTestActivityViewId());
         mShellManager = (ShellManager) findViewById(getShellManagerViewId());
         mWindowAndroid = new ActivityWindowAndroid(this);
diff --git a/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2 b/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2
index 3bac4f2c..a2eeced 100644
--- a/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2
+++ b/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2
@@ -57,6 +57,13 @@
                  android:exported="false" />
         {% endfor %}
 
+        <provider android:name="android.support.v4.content.FileProvider"
+            android:authorities="org.chromium.content_browsertests_apk.FileProvider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
     </application>
 
     <instrumentation android:name="org.chromium.native_test.NativeTestInstrumentationTestRunner"
diff --git a/content/shell/android/browsertests_apk/res/xml/file_paths.xml b/content/shell/android/browsertests_apk/res/xml/file_paths.xml
new file mode 100644
index 0000000..3cf2917b
--- /dev/null
+++ b/content/shell/android/browsertests_apk/res/xml/file_paths.xml
@@ -0,0 +1,12 @@
+<?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. -->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the ContentProvider. -->
+
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <cache-path name="bundled_exchanges" path="bundled_exchanges/"/>
+</paths>
+
diff --git a/content/shell/browser/web_test/fake_bluetooth_chooser.cc b/content/shell/browser/web_test/fake_bluetooth_chooser.cc
index b38ba43a..232f67aa9 100644
--- a/content/shell/browser/web_test/fake_bluetooth_chooser.cc
+++ b/content/shell/browser/web_test/fake_bluetooth_chooser.cc
@@ -14,10 +14,9 @@
 namespace content {
 
 FakeBluetoothChooser::FakeBluetoothChooser(
-    mojom::FakeBluetoothChooserRequest request,
-    mojom::FakeBluetoothChooserClientAssociatedPtrInfo client_ptr_info)
-    : binding_(this, std::move(request)),
-      client_ptr_(std::move(client_ptr_info)) {
+    mojo::PendingReceiver<mojom::FakeBluetoothChooser> receiver,
+    mojo::PendingAssociatedRemote<mojom::FakeBluetoothChooserClient> client)
+    : receiver_(this, std::move(receiver)), client_(std::move(client)) {
   SetTestBluetoothScanDuration(BluetoothTestScanDurationSetting::kNeverTimeout);
 }
 
@@ -25,7 +24,7 @@
   SetTestBluetoothScanDuration(
       BluetoothTestScanDurationSetting::kImmediateTimeout);
 
-  client_ptr_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
+  client_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
       mojom::ChooserEventType::CHOOSER_CLOSED, /*origin=*/base::nullopt,
       /*peripheral_address=*/base::nullopt));
 }
@@ -34,7 +33,7 @@
     const EventHandler& event_handler,
     const url::Origin& origin) {
   event_handler_ = event_handler;
-  client_ptr_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
+  client_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
       mojom::ChooserEventType::CHOOSER_OPENED, origin,
       /*peripheral_address=*/base::nullopt));
 }
@@ -49,7 +48,7 @@
 void FakeBluetoothChooser::Cancel() {
   DCHECK(event_handler_);
   event_handler_.Run(BluetoothChooser::Event::CANCELLED, std::string());
-  client_ptr_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
+  client_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
       mojom::ChooserEventType::CHOOSER_CLOSED, /*origin=*/base::nullopt,
       /*peripheral_address=*/base::nullopt));
 }
@@ -57,7 +56,7 @@
 void FakeBluetoothChooser::Rescan() {
   DCHECK(event_handler_);
   event_handler_.Run(BluetoothChooser::Event::RESCAN, std::string());
-  client_ptr_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
+  client_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
       mojom::ChooserEventType::DISCOVERING, /*origin=*/base::nullopt,
       /*peripheral_address=*/base::nullopt));
 }
@@ -78,7 +77,7 @@
       event_ptr->type = mojom::ChooserEventType::ADAPTER_ENABLED;
       break;
   }
-  client_ptr_->OnEvent(std::move(event_ptr));
+  client_->OnEvent(std::move(event_ptr));
 }
 
 void FakeBluetoothChooser::ShowDiscoveryState(DiscoveryState state) {
@@ -95,7 +94,7 @@
       event_ptr->type = mojom::ChooserEventType::DISCOVERY_IDLE;
       break;
   }
-  client_ptr_->OnEvent(std::move(event_ptr));
+  client_->OnEvent(std::move(event_ptr));
 }
 
 void FakeBluetoothChooser::AddOrUpdateDevice(const std::string& device_id,
@@ -104,7 +103,7 @@
                                              bool is_gatt_connected,
                                              bool is_paired,
                                              int signal_strength_level) {
-  client_ptr_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
+  client_->OnEvent(mojom::FakeBluetoothChooserEvent::New(
       mojom::ChooserEventType::ADD_OR_UPDATE_DEVICE,
       /*origin=*/base::nullopt, /*peripheral_address=*/device_id));
 }
diff --git a/content/shell/browser/web_test/fake_bluetooth_chooser.h b/content/shell/browser/web_test/fake_bluetooth_chooser.h
index a08fd47..ca3c5b3 100644
--- a/content/shell/browser/web_test/fake_bluetooth_chooser.h
+++ b/content/shell/browser/web_test/fake_bluetooth_chooser.h
@@ -9,8 +9,10 @@
 
 #include "content/public/browser/bluetooth_chooser.h"
 #include "content/shell/common/web_test/fake_bluetooth_chooser.mojom.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "url/origin.h"
 
 namespace content {
@@ -36,8 +38,8 @@
   // is opened, ownership of this instance will shift to the caller of
   // WebContentsDelegate::RunBluetoothChooser.
   FakeBluetoothChooser(
-      mojom::FakeBluetoothChooserRequest request,
-      mojom::FakeBluetoothChooserClientAssociatedPtrInfo client_ptr_info);
+      mojo::PendingReceiver<mojom::FakeBluetoothChooser> receiver,
+      mojo::PendingAssociatedRemote<mojom::FakeBluetoothChooserClient> client);
 
   // Resets the test scan duration to timeout immediately and sends a
   // |CHOOSER_CLOSED| event to the client.
@@ -68,11 +70,11 @@
   // Stores the callback function that handles chooser events.
   EventHandler event_handler_;
 
-  mojo::Binding<mojom::FakeBluetoothChooser> binding_;
+  mojo::Receiver<mojom::FakeBluetoothChooser> receiver_;
 
   // Stores the associated pointer to the client that will be receiving events
   // from FakeBluetoothChooser.
-  mojom::FakeBluetoothChooserClientAssociatedPtr client_ptr_;
+  mojo::AssociatedRemote<mojom::FakeBluetoothChooserClient> client_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeBluetoothChooser);
 };
diff --git a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.cc b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.cc
index 1bd85d1..58bf6b0e 100644
--- a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.cc
+++ b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.cc
@@ -11,11 +11,11 @@
 FakeBluetoothChooserFactory::~FakeBluetoothChooserFactory() {}
 
 void FakeBluetoothChooserFactory::CreateFakeBluetoothChooser(
-    mojom::FakeBluetoothChooserRequest request,
-    mojom::FakeBluetoothChooserClientAssociatedPtrInfo client_ptr_info) {
+    mojo::PendingReceiver<mojom::FakeBluetoothChooser> receiver,
+    mojom::FakeBluetoothChooserClientAssociatedPtrInfo client) {
   DCHECK(!next_fake_bluetooth_chooser_);
   next_fake_bluetooth_chooser_ = std::make_unique<FakeBluetoothChooser>(
-      std::move(request), std::move(client_ptr_info));
+      std::move(receiver), std::move(client));
 }
 
 std::unique_ptr<FakeBluetoothChooser>
@@ -24,7 +24,7 @@
 }
 
 FakeBluetoothChooserFactory::FakeBluetoothChooserFactory(
-    mojom::FakeBluetoothChooserFactoryRequest request)
-    : binding_(this, std::move(request)) {}
+    mojo::PendingReceiver<mojom::FakeBluetoothChooserFactory> receiver)
+    : receiver_(this, std::move(receiver)) {}
 
 }  // namespace content
diff --git a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
index 2ffeebcd..e1137000 100644
--- a/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
+++ b/content/shell/browser/web_test/fake_bluetooth_chooser_factory.h
@@ -8,7 +8,8 @@
 #include <memory>
 
 #include "content/shell/common/web_test/fake_bluetooth_chooser.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 
 namespace content {
 
@@ -16,8 +17,9 @@
 
 // Implementation of FakeBluetoothChooserFactory in
 // src/content/shell/common/web_test/fake_bluetooth_chooser.mojom to create
-// FakeBluetoothChoosers with a FakeBluetoothChooserClientAssociatedPtr that
-// they can use to send events to the client.
+// FakeBluetoothChoosers with a
+// mojo::PendingAssociatedRemote<FakeBluetoothChooserClient> that they can use
+// to send events to the client.
 //
 // The implementation details for FakeBluetoothChooser can be found in the Web
 // Bluetooth Test Scanning design document.
@@ -29,29 +31,28 @@
   ~FakeBluetoothChooserFactory() override;
 
   // WebTestContentBrowserClient will create an instance of this class when a
-  // request is bound. It will maintain ownership of the instance.
+  // receiver is bound. It will maintain ownership of the instance.
   static std::unique_ptr<FakeBluetoothChooserFactory> Create(
-      mojom::FakeBluetoothChooserFactoryRequest request) {
-    return std::unique_ptr<FakeBluetoothChooserFactory>(
-        new FakeBluetoothChooserFactory(std::move(request)));
+      mojo::PendingReceiver<mojom::FakeBluetoothChooserFactory> receiver) {
+    return base::WrapUnique(
+        new FakeBluetoothChooserFactory(std::move(receiver)));
   }
 
   // Creates an instance of FakeBluetoothChooser and stores it in
   // |next_fake_bluetooth_chooser_|. This will DCHECK if
   // |next_fake_bluetooth_chooser_| is not null.
   void CreateFakeBluetoothChooser(
-      mojom::FakeBluetoothChooserRequest request,
-      mojom::FakeBluetoothChooserClientAssociatedPtrInfo client_ptr_info)
-      override;
+      mojo::PendingReceiver<mojom::FakeBluetoothChooser> receiver,
+      mojom::FakeBluetoothChooserClientAssociatedPtrInfo client) override;
 
   // Transfers ownership of |next_fake_bluetooth_chooser_| to the caller.
   std::unique_ptr<FakeBluetoothChooser> GetNextFakeBluetoothChooser();
 
  private:
   explicit FakeBluetoothChooserFactory(
-      mojom::FakeBluetoothChooserFactoryRequest request);
+      mojo::PendingReceiver<mojom::FakeBluetoothChooserFactory> receiver);
 
-  mojo::Binding<mojom::FakeBluetoothChooserFactory> binding_;
+  mojo::Receiver<mojom::FakeBluetoothChooserFactory> receiver_;
 
   std::unique_ptr<FakeBluetoothChooser> next_fake_bluetooth_chooser_;
 };
diff --git a/content/shell/browser/web_test/web_test_content_browser_client.cc b/content/shell/browser/web_test/web_test_content_browser_client.cc
index e0e6f18..5faaea37 100644
--- a/content/shell/browser/web_test/web_test_content_browser_client.cc
+++ b/content/shell/browser/web_test/web_test_content_browser_client.cc
@@ -344,10 +344,10 @@
 
 // private
 void WebTestContentBrowserClient::CreateFakeBluetoothChooserFactory(
-    mojom::FakeBluetoothChooserFactoryRequest request) {
+    mojo::PendingReceiver<mojom::FakeBluetoothChooserFactory> receiver) {
   DCHECK(!fake_bluetooth_chooser_factory_);
   fake_bluetooth_chooser_factory_ =
-      FakeBluetoothChooserFactory::Create(std::move(request));
+      FakeBluetoothChooserFactory::Create(std::move(receiver));
 }
 
 }  // namespace content
diff --git a/content/shell/browser/web_test/web_test_content_browser_client.h b/content/shell/browser/web_test/web_test_content_browser_client.h
index 1a71494..435f204 100644
--- a/content/shell/browser/web_test/web_test_content_browser_client.h
+++ b/content/shell/browser/web_test/web_test_content_browser_client.h
@@ -9,6 +9,7 @@
 
 #include "content/shell/browser/shell_content_browser_client.h"
 #include "content/shell/common/web_test/fake_bluetooth_chooser.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "third_party/blink/public/mojom/clipboard/clipboard.mojom.h"
 
 namespace content {
@@ -89,7 +90,7 @@
  private:
   // Creates and stores a FakeBluetoothChooserFactory instance.
   void CreateFakeBluetoothChooserFactory(
-      mojom::FakeBluetoothChooserFactoryRequest request);
+      mojo::PendingReceiver<mojom::FakeBluetoothChooserFactory> receiver);
   // TODO(https://crbug.com/955171): Remove this and use BindClipboardHost
   // directly once it uses service_manager::BinderMap instead of
   // service_manager::BinderRegistry.
diff --git a/content/shell/common/web_test/fake_bluetooth_chooser.mojom b/content/shell/common/web_test/fake_bluetooth_chooser.mojom
index a093ca91..b8f66e0 100644
--- a/content/shell/common/web_test/fake_bluetooth_chooser.mojom
+++ b/content/shell/common/web_test/fake_bluetooth_chooser.mojom
@@ -52,8 +52,12 @@
 
 // FakeBluetoothChooserFactory ensures that FakeBluetoothChoosers are created
 // with an associated FakeBluetoothChooserClient.
+// TODO(crbug.com/955171): Use |pending_associated_remote| instead of
+// |associated| after supporting mojom_js_generator.py completely for
+// associated interfaces.
 interface FakeBluetoothChooserFactory {
-  CreateFakeBluetoothChooser(FakeBluetoothChooser& fake_chooser,
+  CreateFakeBluetoothChooser(
+      pending_receiver<FakeBluetoothChooser> fake_chooser,
       associated FakeBluetoothChooserClient client);
 };
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index b0af8ba..e6eff17 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -813,12 +813,14 @@
 if (is_android) {
   import("//build/config/android/rules.gni")
 
+  content_browsertests_manifest =
+      "${target_gen_dir}/content_browsertests_manifest/AndroidManifest.xml"
+
   jinja_template("content_browsertests_manifest") {
     testonly = true
     input =
         "//content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2"
-    output =
-        "${target_gen_dir}/content_browsertests_manifest/AndroidManifest.xml"
+    output = content_browsertests_manifest
   }
 
   android_library("content_browsertests_java") {
@@ -828,6 +830,7 @@
       "../shell/android/browsertests_apk/src/org/chromium/content_browsertests_apk/ContentBrowserTestsApplication.java",
     ]
     deps = [
+      ":content_browsertests_manifest",
       ":content_browsertests_resources",
       "//base:base_java",
       "//base:base_java_test_support",
@@ -839,6 +842,7 @@
       "//testing/android/native_test:native_test_java",
       "//ui/android:ui_java",
     ]
+    android_manifest_for_lint = content_browsertests_manifest
   }
 
   android_resources("content_browsertests_resources") {
diff --git a/content/test/data/accessibility/aria/aria-contentinfo-expected-android.txt b/content/test/data/accessibility/aria/aria-contentinfo-expected-android.txt
index b27e2440..0c7d874e 100644
--- a/content/test/data/accessibility/aria/aria-contentinfo-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-contentinfo-expected-android.txt
@@ -1,2 +1,2 @@
 android.webkit.WebView focusable focused scrollable
-++android.view.View role_description='content info' name='This is ARIA role contentinfo.'
\ No newline at end of file
+++android.view.View role_description='content information' name='This is ARIA role contentinfo.'
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win.txt
new file mode 100644
index 0000000..99519c3c
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win.txt
@@ -0,0 +1,3 @@
+document
+++contentinfo LocalizedControlType='content information' LocalizedLandmarkType='content information'
+++++description Name='This is ARIA role contentinfo.'
diff --git a/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win7.txt b/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win7.txt
new file mode 100644
index 0000000..4a188f5
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-contentinfo-expected-uia-win7.txt
@@ -0,0 +1,3 @@
+document
+++contentinfo LocalizedControlType='content information'
+++++description Name='This is ARIA role contentinfo.'
diff --git a/content/test/data/accessibility/aria/aria-contentinfo-expected-win.txt b/content/test/data/accessibility/aria/aria-contentinfo-expected-win.txt
index 2071e6d..6583f9a 100644
--- a/content/test/data/accessibility/aria/aria-contentinfo-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-contentinfo-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++IA2_ROLE_LANDMARK xml-roles:contentinfo
+++IA2_ROLE_LANDMARK xml-roles:contentinfo localized_extended_role='content information'
 ++++ROLE_SYSTEM_STATICTEXT name='This is ARIA role contentinfo.'
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-contentinfo.html b/content/test/data/accessibility/aria/aria-contentinfo.html
index 637ddc3..a8fde58 100644
--- a/content/test/data/accessibility/aria/aria-contentinfo.html
+++ b/content/test/data/accessibility/aria/aria-contentinfo.html
@@ -2,6 +2,9 @@
 @MAC-ALLOW:AXRole=*
 @MAC-ALLOW:AXSubrole=*
 @MAC-ALLOW:AXRoleDescription=*
+@UIA-WIN-ALLOW:LocalizedControlType='content information'
+@UIA-WIN-ALLOW:LocalizedLandmarkType='content information'
+@WIN-ALLOW:localized_extended_role='content information'
 @WIN-ALLOW:xml-roles:*
 @AURALINUX-ALLOW:xml-roles:*
 -->
diff --git a/content/test/data/accessibility/html/footer-expected-uia-win.txt b/content/test/data/accessibility/html/footer-expected-uia-win.txt
index 2cb67be..061970c20 100644
--- a/content/test/data/accessibility/html/footer-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/footer-expected-uia-win.txt
@@ -1,3 +1,3 @@
 document
-++contentinfo
+++contentinfo LocalizedLandmarkType='content information'
 ++++description Name='Footer element'
diff --git a/content/test/data/accessibility/html/footer-expected-uia-win7.txt b/content/test/data/accessibility/html/footer-expected-uia-win7.txt
new file mode 100644
index 0000000..2cb67be
--- /dev/null
+++ b/content/test/data/accessibility/html/footer-expected-uia-win7.txt
@@ -0,0 +1,3 @@
+document
+++contentinfo
+++++description Name='Footer element'
diff --git a/content/test/data/accessibility/html/footer.html b/content/test/data/accessibility/html/footer.html
index 4087ce2..b5e12d9 100644
--- a/content/test/data/accessibility/html/footer.html
+++ b/content/test/data/accessibility/html/footer.html
@@ -1,6 +1,7 @@
 <!--
 @MAC-ALLOW:AXRole*
 @MAC-ALLOW:AXSubrole*
+@UIA-WIN-ALLOW:LocalizedLandmarkType='content information'
 @WIN-ALLOW:xml-roles:*
 @AURALINUX-ALLOW:xml-roles:*
 -->
diff --git a/content/test/data/accessibility/html/input-date-expected-android.txt b/content/test/data/accessibility/html/input-date-expected-android.txt
index d6b30acc..1979c77 100644
--- a/content/test/data/accessibility/html/input-date-expected-android.txt
+++ b/content/test/data/accessibility/html/input-date-expected-android.txt
@@ -1,3 +1,4 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
 ++++android.widget.Spinner role_description='date picker' clickable focusable name='2008-09-01' input_type=20
+++++android.widget.Spinner role_description='date picker' clickable focusable name='2008-09-01' hint='When' input_type=20
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date-expected-auralinux.txt b/content/test/data/accessibility/html/input-date-expected-auralinux.txt
index 3ed3756..59939a0 100644
--- a/content/test/data/accessibility/html/input-date-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/input-date-expected-auralinux.txt
@@ -12,3 +12,15 @@
 ++++++++++[spin button] name='Year' current=2008.000000 minimum=1.000000 maximum=275760.000000
 ++++++++++++[text] name='2008'
 ++++++[push button] name='Show date picker'
+++++[dateeditor] name='When'
+++++++[section]
+++++++++[section]
+++++++++++[spin button] name='Month When' current=9.000000 minimum=1.000000 maximum=12.000000
+++++++++++++[text] name='09'
+++++++++++[text] name='/'
+++++++++++[spin button] name='Day When' current=1.000000 minimum=1.000000 maximum=31.000000
+++++++++++++[text] name='01'
+++++++++++[text] name='/'
+++++++++++[spin button] name='Year When' current=2008.000000 minimum=1.000000 maximum=275760.000000
+++++++++++++[text] name='2008'
+++++++[push button] name='Show date picker'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date-expected-blink.txt b/content/test/data/accessibility/html/input-date-expected-blink.txt
index 1a17258..8fdff62 100644
--- a/content/test/data/accessibility/html/input-date-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-date-expected-blink.txt
@@ -17,3 +17,20 @@
 ++++++++++++staticText name='2008'
 ++++++++++++++inlineTextBox name='2008'
 ++++++popUpButton name='Show date picker'
+++++date inputType='date' name='When' value='2008-09-01'
+++++++genericContainer
+++++++++genericContainer
+++++++++++spinButton name='Month When' value='09' valueForRange=9.00 minValueForRange=1.00 maxValueForRange=12.00
+++++++++++++staticText name='09'
+++++++++++++++inlineTextBox name='09'
+++++++++++staticText name='/'
+++++++++++++inlineTextBox name='/'
+++++++++++spinButton name='Day When' value='01' valueForRange=1.00 minValueForRange=1.00 maxValueForRange=31.00
+++++++++++++staticText name='01'
+++++++++++++++inlineTextBox name='01'
+++++++++++staticText name='/'
+++++++++++++inlineTextBox name='/'
+++++++++++spinButton name='Year When' value='2008' valueForRange=2008.00 minValueForRange=1.00 maxValueForRange=275760.00
+++++++++++++staticText name='2008'
+++++++++++++++inlineTextBox name='2008'
+++++++popUpButton name='Show date picker'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date-expected-mac.txt b/content/test/data/accessibility/html/input-date-expected-mac.txt
index 4251264..747554b 100644
--- a/content/test/data/accessibility/html/input-date-expected-mac.txt
+++ b/content/test/data/accessibility/html/input-date-expected-mac.txt
@@ -12,3 +12,15 @@
 ++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='2008' AXDescription='Year'
 ++++++++++++AXStaticText AXRoleDescription='text' AXValue='2008'
 ++++++AXPopUpButton AXRoleDescription='pop up button' AXDescription='Show date picker'
+++++AXDateField AXRoleDescription='date field' AXValue='2008-09-01' AXDescription='When'
+++++++AXGroup AXRoleDescription='group'
+++++++++AXGroup AXRoleDescription='group'
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='9' AXDescription='Month When'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='09'
+++++++++++AXStaticText AXRoleDescription='text' AXValue='/'
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='1' AXDescription='Day When'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='01'
+++++++++++AXStaticText AXRoleDescription='text' AXValue='/'
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='2008' AXDescription='Year When'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='2008'
+++++++AXPopUpButton AXRoleDescription='pop up button' AXDescription='Show date picker'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date-expected-uia-win.txt b/content/test/data/accessibility/html/input-date-expected-uia-win.txt
index c8e980e9..50e5ca0 100644
--- a/content/test/data/accessibility/html/input-date-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/input-date-expected-uia-win.txt
@@ -12,3 +12,15 @@
 ++++++++++spinbutton Name='Year' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=275760.00 RangeValue.Minimum=1.00 RangeValue.Value=2008.00 Value.Value='2008'
 ++++++++++++description Name='2008'
 ++++++menu Name='Show date picker' ExpandCollapse.ExpandCollapseState='LeafNode'
+++++textbox LocalizedControlType='date picker' Name='When'
+++++++group
+++++++++group
+++++++++++spinbutton Name='Month When' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=12.00 RangeValue.Minimum=1.00 RangeValue.Value=9.00 Value.Value='09'
+++++++++++++description Name='09'
+++++++++++description Name='/'
+++++++++++spinbutton Name='Day When' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=31.00 RangeValue.Minimum=1.00 RangeValue.Value=1.00 Value.Value='01'
+++++++++++++description Name='01'
+++++++++++description Name='/'
+++++++++++spinbutton Name='Year When' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=275760.00 RangeValue.Minimum=1.00 RangeValue.Value=2008.00 Value.Value='2008'
+++++++++++++description Name='2008'
+++++++menu Name='Show date picker' ExpandCollapse.ExpandCollapseState='LeafNode'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date-expected-win.txt b/content/test/data/accessibility/html/input-date-expected-win.txt
index 0deeeec..c05dd7c 100644
--- a/content/test/data/accessibility/html/input-date-expected-win.txt
+++ b/content/test/data/accessibility/html/input-date-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>'
-++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
+++IA2_ROLE_SECTION ia2_hypertext='<obj0><obj1>'
 ++++IA2_ROLE_DATE_EDITOR value='2008-09-01' FOCUSABLE ia2_hypertext='<obj0><obj1>' localized_extended_role='date picker'
 ++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
 ++++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>/<obj2>/<obj4>'
@@ -12,3 +12,15 @@
 ++++++++++ROLE_SYSTEM_SPINBUTTON name='Year' value='2008' FOCUSABLE ia2_hypertext='2008'
 ++++++++++++ROLE_SYSTEM_STATICTEXT name='2008' ia2_hypertext='2008'
 ++++++ROLE_SYSTEM_BUTTONMENU name='Show date picker' FOCUSABLE HASPOPUP ia2_hypertext='Show date picker'
+++++IA2_ROLE_DATE_EDITOR name='When' value='2008-09-01' FOCUSABLE ia2_hypertext='<obj0><obj1>' localized_extended_role='date picker'
+++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
+++++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>/<obj2>/<obj4>'
+++++++++++ROLE_SYSTEM_SPINBUTTON name='Month When' value='09' FOCUSABLE ia2_hypertext='09'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='09' ia2_hypertext='09'
+++++++++++ROLE_SYSTEM_STATICTEXT name='/' ia2_hypertext='/'
+++++++++++ROLE_SYSTEM_SPINBUTTON name='Day When' value='01' FOCUSABLE ia2_hypertext='01'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='01' ia2_hypertext='01'
+++++++++++ROLE_SYSTEM_STATICTEXT name='/' ia2_hypertext='/'
+++++++++++ROLE_SYSTEM_SPINBUTTON name='Year When' value='2008' FOCUSABLE ia2_hypertext='2008'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='2008' ia2_hypertext='2008'
+++++++ROLE_SYSTEM_BUTTONMENU name='Show date picker' FOCUSABLE HASPOPUP ia2_hypertext='Show date picker'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-date.html b/content/test/data/accessibility/html/input-date.html
index c84f138695..07b845a1 100644
--- a/content/test/data/accessibility/html/input-date.html
+++ b/content/test/data/accessibility/html/input-date.html
@@ -9,5 +9,6 @@
 <html>
 <body>
   <input type="date" value="2008-09-01">
+  <input type="date" value="2008-09-01" aria-label="When">
 </body>
 </html>
diff --git a/content/test/data/accessibility/html/input-datetime-expected-android.txt b/content/test/data/accessibility/html/input-datetime-expected-android.txt
index 99a0ce7..6d21175 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-android.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-android.txt
@@ -1,3 +1,4 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='1/1/2015 1:00AM' input_type=4 text_change_added_count=15
+++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='1/1/2015 1:00AM' hint='Launch' input_type=4 text_change_added_count=15
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime-expected-auralinux.txt b/content/test/data/accessibility/html/input-datetime-expected-auralinux.txt
index 05223202..8f138135d 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-auralinux.txt
@@ -1,3 +1,4 @@
 [document web] focusable focused
 ++[section]
 ++++[entry] editable focusable selectable-text text-input-type:datetime
+++++[entry] name='Launch' editable focusable selectable-text text-input-type:datetime
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime-expected-blink.txt b/content/test/data/accessibility/html/input-datetime-expected-blink.txt
index 1e1d0db..ac8d2a03 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-blink.txt
@@ -4,3 +4,7 @@
 ++++++genericContainer
 ++++++++staticText name='1/1/2015 1:00AM'
 ++++++++++inlineTextBox name='1/1/2015 1:00AM'
+++++textField inputType='datetime' name='Launch' value='1/1/2015 1:00AM'
+++++++genericContainer
+++++++++staticText name='1/1/2015 1:00AM'
+++++++++++inlineTextBox name='1/1/2015 1:00AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime-expected-mac.txt b/content/test/data/accessibility/html/input-datetime-expected-mac.txt
index aaa4951..88f64f4b 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-mac.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-mac.txt
@@ -1,3 +1,4 @@
 AXWebArea AXRoleDescription='HTML content'
 ++AXGroup AXRoleDescription='group'
 ++++AXTextField AXRoleDescription='text field' AXValue='1/1/2015 1:00AM'
+++++AXTextField AXRoleDescription='text field' AXValue='1/1/2015 1:00AM' AXDescription='Launch'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime-expected-uia-win.txt b/content/test/data/accessibility/html/input-datetime-expected-uia-win.txt
index 45b4b43..4ae5c09f 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-uia-win.txt
@@ -1,3 +1,4 @@
 document
 ++group
 ++++textbox Value.Value='1/1/2015 1:00AM'
+++++textbox Name='Launch' Value.Value='1/1/2015 1:00AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime-expected-win.txt b/content/test/data/accessibility/html/input-datetime-expected-win.txt
index 77512e93..c127625 100644
--- a/content/test/data/accessibility/html/input-datetime-expected-win.txt
+++ b/content/test/data/accessibility/html/input-datetime-expected-win.txt
@@ -1,3 +1,4 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>'
-++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
+++IA2_ROLE_SECTION ia2_hypertext='<obj0><obj1>'
 ++++ROLE_SYSTEM_TEXT value='1/1/2015 1:00AM' FOCUSABLE ia2_hypertext='1/1/2015 1:00AM'
+++++ROLE_SYSTEM_TEXT name='Launch' value='1/1/2015 1:00AM' FOCUSABLE ia2_hypertext='1/1/2015 1:00AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-datetime.html b/content/test/data/accessibility/html/input-datetime.html
index c9e98a0..488a85f 100644
--- a/content/test/data/accessibility/html/input-datetime.html
+++ b/content/test/data/accessibility/html/input-datetime.html
@@ -11,5 +11,6 @@
 <html>
 <body>
   <input type="datetime" value="1/1/2015 1:00AM">
+  <input type="datetime" value="1/1/2015 1:00AM" aria-label="Launch">
 </body>
 </html>
diff --git a/content/test/data/accessibility/html/input-time-expected-android.txt b/content/test/data/accessibility/html/input-time-expected-android.txt
index e18bebc..1ae797b9 100644
--- a/content/test/data/accessibility/html/input-time-expected-android.txt
+++ b/content/test/data/accessibility/html/input-time-expected-android.txt
@@ -1,3 +1,4 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
-++++android.widget.Spinner role_description='time picker' clickable focusable name='00:00:00' input_type=36
\ No newline at end of file
+++++android.widget.Spinner role_description='time picker' clickable focusable name='00:00:00' input_type=36
+++++android.widget.Spinner role_description='time picker' clickable focusable name='Breakfast' input_type=36
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-expected-auralinux.txt b/content/test/data/accessibility/html/input-time-expected-auralinux.txt
index 2be2851..2887c00 100644
--- a/content/test/data/accessibility/html/input-time-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/input-time-expected-auralinux.txt
@@ -11,3 +11,14 @@
 ++++++++++[text] name=' '
 ++++++++++[spin button] name='AM/PM' xml-roles:spinbutton current=1.000000 minimum=1.000000 maximum=2.000000
 ++++++++++++[text] name='AM'
+++++[dateeditor] name='Breakfast'
+++++++[section]
+++++++++[section]
+++++++++++[spin button] name='Hours Breakfast' xml-roles:spinbutton current=12.000000 minimum=1.000000 maximum=12.000000
+++++++++++++[text] name='12'
+++++++++++[text] name=':'
+++++++++++[spin button] name='Minutes Breakfast' xml-roles:spinbutton current=0.000000 minimum=0.000000 maximum=59.000000
+++++++++++++[text] name='00'
+++++++++++[text] name=' '
+++++++++++[spin button] name='AM/PM Breakfast' xml-roles:spinbutton current=1.000000 minimum=1.000000 maximum=2.000000
+++++++++++++[text] name='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-expected-blink.txt b/content/test/data/accessibility/html/input-time-expected-blink.txt
index 02e3298..e96d4c9d 100644
--- a/content/test/data/accessibility/html/input-time-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-time-expected-blink.txt
@@ -16,3 +16,19 @@
 ++++++++++spinButton name='AM/PM' value='AM' valueForRange=1.00 minValueForRange=1.00 maxValueForRange=2.00
 ++++++++++++staticText name='AM'
 ++++++++++++++inlineTextBox name='AM'
+++++inputTime inputType='time' name='Breakfast' value='00:00:00'
+++++++genericContainer
+++++++++genericContainer
+++++++++++spinButton name='Hours Breakfast' value='12' valueForRange=12.00 minValueForRange=1.00 maxValueForRange=12.00
+++++++++++++staticText name='12'
+++++++++++++++inlineTextBox name='12'
+++++++++++staticText name=':'
+++++++++++++inlineTextBox name=':'
+++++++++++spinButton name='Minutes Breakfast' value='00' valueForRange=0.00 minValueForRange=0.00 maxValueForRange=59.00
+++++++++++++staticText name='00'
+++++++++++++++inlineTextBox name='00'
+++++++++++staticText name=' '
+++++++++++++inlineTextBox name=' '
+++++++++++spinButton name='AM/PM Breakfast' value='AM' valueForRange=1.00 minValueForRange=1.00 maxValueForRange=2.00
+++++++++++++staticText name='AM'
+++++++++++++++inlineTextBox name='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-expected-mac.txt b/content/test/data/accessibility/html/input-time-expected-mac.txt
index acf774d8..54fdd4b2 100644
--- a/content/test/data/accessibility/html/input-time-expected-mac.txt
+++ b/content/test/data/accessibility/html/input-time-expected-mac.txt
@@ -10,4 +10,15 @@
 ++++++++++++AXStaticText AXRoleDescription='text' AXValue='00'
 ++++++++++AXStaticText AXRoleDescription='text' AXValue=' '
 ++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='1' AXDescription='AM/PM'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='AM'
+++++AXTimeField AXRoleDescription='time field' AXValue='00:00:00' AXDescription='Breakfast'
+++++++AXGroup AXRoleDescription='group'
+++++++++AXGroup AXRoleDescription='group'
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='12' AXDescription='Hours Breakfast'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='12'
+++++++++++AXStaticText AXRoleDescription='text' AXValue=':'
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='0' AXDescription='Minutes Breakfast'
+++++++++++++AXStaticText AXRoleDescription='text' AXValue='00'
+++++++++++AXStaticText AXRoleDescription='text' AXValue=' '
+++++++++++AXIncrementor AXRoleDescription='stepper' AXValue='1' AXDescription='AM/PM Breakfast'
 ++++++++++++AXStaticText AXRoleDescription='text' AXValue='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-expected-uia-win.txt b/content/test/data/accessibility/html/input-time-expected-uia-win.txt
index b84a31e..9510067 100644
--- a/content/test/data/accessibility/html/input-time-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/input-time-expected-uia-win.txt
@@ -11,3 +11,14 @@
 ++++++++++description Name=' '
 ++++++++++spinbutton Name='AM/PM' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=2.00 RangeValue.Minimum=1.00 RangeValue.Value=1.00 Value.Value='AM'
 ++++++++++++description Name='AM'
+++++group Name='Breakfast'
+++++++group
+++++++++group
+++++++++++spinbutton Name='Hours Breakfast' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=12.00 RangeValue.Minimum=1.00 RangeValue.Value=12.00 Value.Value='12'
+++++++++++++description Name='12'
+++++++++++description Name=':'
+++++++++++spinbutton Name='Minutes Breakfast' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=59.00 RangeValue.Minimum=0.00 RangeValue.Value=0.00 Value.Value='00'
+++++++++++++description Name='00'
+++++++++++description Name=' '
+++++++++++spinbutton Name='AM/PM Breakfast' RangeValue.IsReadOnly=false RangeValue.LargeChange=0.00 RangeValue.SmallChange=0.00 RangeValue.Maximum=2.00 RangeValue.Minimum=1.00 RangeValue.Value=1.00 Value.Value='AM'
+++++++++++++description Name='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-expected-win.txt b/content/test/data/accessibility/html/input-time-expected-win.txt
index 70214468..41ca7c8 100644
--- a/content/test/data/accessibility/html/input-time-expected-win.txt
+++ b/content/test/data/accessibility/html/input-time-expected-win.txt
@@ -1,5 +1,5 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>'
-++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
+++IA2_ROLE_SECTION ia2_hypertext='<obj0><obj1>'
 ++++ROLE_SYSTEM_GROUPING value='00:00:00' FOCUSABLE ia2_hypertext='<obj0>'
 ++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
 ++++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>:<obj2> <obj4>'
@@ -11,3 +11,14 @@
 ++++++++++ROLE_SYSTEM_STATICTEXT name=' ' ia2_hypertext=' '
 ++++++++++ROLE_SYSTEM_SPINBUTTON name='AM/PM' value='AM' FOCUSABLE xml-roles:spinbutton ia2_hypertext='AM'
 ++++++++++++ROLE_SYSTEM_STATICTEXT name='AM' ia2_hypertext='AM'
+++++ROLE_SYSTEM_GROUPING name='Breakfast' value='00:00:00' FOCUSABLE ia2_hypertext='<obj0>'
+++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>'
+++++++++IA2_ROLE_SECTION ia2_hypertext='<obj0>:<obj2> <obj4>'
+++++++++++ROLE_SYSTEM_SPINBUTTON name='Hours Breakfast' value='12' FOCUSABLE xml-roles:spinbutton ia2_hypertext='12'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='12' ia2_hypertext='12'
+++++++++++ROLE_SYSTEM_STATICTEXT name=':' ia2_hypertext=':'
+++++++++++ROLE_SYSTEM_SPINBUTTON name='Minutes Breakfast' value='00' FOCUSABLE xml-roles:spinbutton ia2_hypertext='00'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='00' ia2_hypertext='00'
+++++++++++ROLE_SYSTEM_STATICTEXT name=' ' ia2_hypertext=' '
+++++++++++ROLE_SYSTEM_SPINBUTTON name='AM/PM Breakfast' value='AM' FOCUSABLE xml-roles:spinbutton ia2_hypertext='AM'
+++++++++++++ROLE_SYSTEM_STATICTEXT name='AM' ia2_hypertext='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time.html b/content/test/data/accessibility/html/input-time.html
index 20fadac..1dec5ef0 100644
--- a/content/test/data/accessibility/html/input-time.html
+++ b/content/test/data/accessibility/html/input-time.html
@@ -11,5 +11,6 @@
 <html>
   <body>
     <input type="time" value="00:00:00">
+    <input type="time" value="00:00:00" aria-label="Breakfast">
   </body>
 </html>
diff --git a/content/test/data/accessibility/html/landmark-expected-android.txt b/content/test/data/accessibility/html/landmark-expected-android.txt
index 8dd34dd..da18dadd 100644
--- a/content/test/data/accessibility/html/landmark-expected-android.txt
+++ b/content/test/data/accessibility/html/landmark-expected-android.txt
@@ -9,7 +9,7 @@
 ++android.view.View role_description='application' name='This is an ARIA application landmark.'
 ++android.view.View role_description='banner' name='This is an ARIA banner landmark.'
 ++android.view.View role_description='complementary' name='This is an ARIA complementary landmark.'
-++android.view.View role_description='content info' name='This is an ARIA contentinfo landmark.'
+++android.view.View role_description='content information' name='This is an ARIA contentinfo landmark.'
 ++android.view.View name='This is an ARIA form landmark.'
 ++android.view.View role_description='main' name='This is an ARIA main landmark.'
 ++android.view.View role_description='navigation' name='This is an ARIA navigation landmark.'
diff --git a/content/test/data/accessibility/html/time-expected-android.txt b/content/test/data/accessibility/html/time-expected-android.txt
index d7b0b3c0..299b8982 100644
--- a/content/test/data/accessibility/html/time-expected-android.txt
+++ b/content/test/data/accessibility/html/time-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
-++++android.view.View role_description='time' name='10:00'
+++++android.view.View role_description='time'
 ++++android.view.View name=' '
-++++android.view.View role_description='time' name='Valentines day'
\ No newline at end of file
+++++android.view.View role_description='time'
\ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
index b585a332..03d6c98b 100644
--- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -29,11 +29,6 @@
 crbug.com/923134 [ mac ] ContextLost_WebGL2Blocked [ Skip ]
 crbug.com/923134 [ android ] ContextLost_WebGL2Blocked [ Skip ]
 
-# 'Browser must support tab control' raised on Android
-crbug.com/609629 [ android ] GpuCrash_GPUProcessCrashesExactlyOncePerVisitToAboutGpuCrash [ Skip ]
-crbug.com/609629 [ android ] ContextLost_WebGLContextLostFromGPUProcessExit [ Skip ]
-crbug.com/609629 [ android ] ContextLost_WebGLContextLostInHiddenTab [ Skip ]
-
 # Flaking on Nexus 5X
 crbug.com/965268 [ android qualcomm-adreno-(tm)-418 ] ContextLost_WebGLBlockedAfterJSNavigation [ Skip ]
 crbug.com/965268 [ android qualcomm-adreno-(tm)-418 ] ContextLost_WebGLUnblockedAfterUserInitiatedReload [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 3c540465..13f972e 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -108,6 +108,12 @@
 crbug.com/772037 [ win7 debug amd d3d11 passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ RetryOnFailure ]
 crbug.com/772037 [ win7 release amd d3d11 passthrough ] conformance/extensions/oes-texture-half-float.html [ RetryOnFailure ]
 
+crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/extensions/oes-texture-float-with-video.html [ Failure ]
+crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ Failure ]
+crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/misc/tex-input-validation.html [ Failure ]
+crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ]
+crbug.com/1002269 [ win10 amd opengl passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ]
+
 # Win / NVIDIA / Passthrough command decoder / D3D11
 crbug.com/751849 [ win7 debug nvidia d3d11 passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ RetryOnFailure ]
 # crbug.com/737016 [ win nvidia d3d11 passthrough ] conformance/programs/program-test.html [ RetryOnFailure ]
@@ -420,7 +426,7 @@
 crbug.com/352645 [ android ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Skip ]
 crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Skip ]
 crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Skip ]
-crbug.com/352645 [ android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Skip ]
+crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Skip ]
 crbug.com/352645 [ android android-webview-instrumentation no-angle ] conformance/textures/misc/texture-npot-video.html [ Skip ]
 
 # These video tests appear to be flaky.
diff --git a/content/test/stub_render_widget_host_owner_delegate.h b/content/test/stub_render_widget_host_owner_delegate.h
index 3185b79..f00c61ca 100644
--- a/content/test/stub_render_widget_host_owner_delegate.h
+++ b/content/test/stub_render_widget_host_owner_delegate.h
@@ -27,6 +27,8 @@
   bool IsNeverVisible() override;
   WebPreferences GetWebkitPreferencesForWidget() override;
   FrameTreeNode* GetFocusedFrame() override;
+  void UpdatePageVisualProperties(
+      const VisualProperties& visual_properties) override {}
   void ShowContextMenu(RenderFrameHost* render_frame_host,
                        const ContextMenuParams& params) override {}
 };
diff --git a/device/bluetooth/adapter.cc b/device/bluetooth/adapter.cc
index dd2091c..1235997 100644
--- a/device/bluetooth/adapter.cc
+++ b/device/bluetooth/adapter.cc
@@ -12,12 +12,12 @@
 #include "device/bluetooth/device.h"
 #include "device/bluetooth/discovery_session.h"
 #include "device/bluetooth/public/mojom/connect_result_type_converter.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
 namespace bluetooth {
 
 Adapter::Adapter(scoped_refptr<device::BluetoothAdapter> adapter)
-    : adapter_(std::move(adapter)), client_(nullptr) {
+    : adapter_(std::move(adapter)) {
   adapter_->AddObserver(this);
 }
 
@@ -68,8 +68,8 @@
   std::move(callback).Run(std::move(adapter_info));
 }
 
-void Adapter::SetClient(mojom::AdapterClientPtr client) {
-  client_ = std::move(client);
+void Adapter::SetClient(mojo::PendingRemote<mojom::AdapterClient> client) {
+  client_.Bind(std::move(client));
 }
 
 void Adapter::StartDiscoverySession(StartDiscoverySessionCallback callback) {
@@ -148,15 +148,15 @@
 void Adapter::OnStartDiscoverySession(
     StartDiscoverySessionCallback callback,
     std::unique_ptr<device::BluetoothDiscoverySession> session) {
-  mojom::DiscoverySessionPtr session_ptr;
-  mojo::MakeStrongBinding(
+  mojo::PendingRemote<mojom::DiscoverySession> pending_session;
+  mojo::MakeSelfOwnedReceiver(
       std::make_unique<DiscoverySession>(std::move(session)),
-      mojo::MakeRequest(&session_ptr));
-  std::move(callback).Run(std::move(session_ptr));
+      pending_session.InitWithNewPipeAndPassReceiver());
+  std::move(callback).Run(std::move(pending_session));
 }
 
 void Adapter::OnDiscoverySessionError(StartDiscoverySessionCallback callback) {
-  std::move(callback).Run(nullptr /* session */);
+  std::move(callback).Run(mojo::NullRemote() /* session */);
 }
 
 }  // namespace bluetooth
diff --git a/device/bluetooth/adapter.h b/device/bluetooth/adapter.h
index 743707e..d885cda 100644
--- a/device/bluetooth/adapter.h
+++ b/device/bluetooth/adapter.h
@@ -14,6 +14,8 @@
 #include "device/bluetooth/bluetooth_gatt_connection.h"
 #include "device/bluetooth/public/mojom/adapter.mojom.h"
 #include "device/bluetooth/public/mojom/device.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 
 namespace bluetooth {
 
@@ -32,7 +34,7 @@
                        ConnectToDeviceCallback callback) override;
   void GetDevices(GetDevicesCallback callback) override;
   void GetInfo(GetInfoCallback callback) override;
-  void SetClient(mojom::AdapterClientPtr client) override;
+  void SetClient(mojo::PendingRemote<mojom::AdapterClient> client) override;
   void StartDiscoverySession(StartDiscoverySessionCallback callback) override;
 
   // device::BluetoothAdapter::Observer overrides:
@@ -69,7 +71,7 @@
   scoped_refptr<device::BluetoothAdapter> adapter_;
 
   // The adapter client that listens to this service.
-  mojom::AdapterClientPtr client_;
+  mojo::Remote<mojom::AdapterClient> client_;
 
   base::WeakPtrFactory<Adapter> weak_ptr_factory_{this};
 
diff --git a/device/bluetooth/public/mojom/adapter.mojom b/device/bluetooth/public/mojom/adapter.mojom
index 2225cf5..3259431 100644
--- a/device/bluetooth/public/mojom/adapter.mojom
+++ b/device/bluetooth/public/mojom/adapter.mojom
@@ -66,11 +66,11 @@
   GetInfo() => (AdapterInfo info);
 
   // Sets the client that listens for the adapter's events.
-  SetClient(AdapterClient client);
+  SetClient(pending_remote<AdapterClient> client);
 
   // Requests the adapter to start a new discovery session. Returns null if
   // session not created successfully.
-  StartDiscoverySession() => (DiscoverySession? session);
+  StartDiscoverySession() => (pending_remote<DiscoverySession>? session);
 };
 
 interface AdapterClient {
diff --git a/device/bluetooth/public/mojom/test/fake_bluetooth.mojom b/device/bluetooth/public/mojom/test/fake_bluetooth.mojom
index 6874251..710be64 100644
--- a/device/bluetooth/public/mojom/test/fake_bluetooth.mojom
+++ b/device/bluetooth/public/mojom/test/fake_bluetooth.mojom
@@ -81,7 +81,8 @@
   SetLESupported(bool available) => ();
 
   // Initializes a fake Central with |state| as the initial state.
-  SimulateCentral(CentralState state) => (FakeCentral fake_central);
+  SimulateCentral(CentralState state) =>
+      (pending_remote<FakeCentral> fake_central);
 
   // Evaluates whether all responses set by this API have been consumed by this
   // central or otherwise.  This includes responses set by:
diff --git a/device/bluetooth/test/fake_bluetooth.cc b/device/bluetooth/test/fake_bluetooth.cc
index 1803233..bf92476 100644
--- a/device/bluetooth/test/fake_bluetooth.cc
+++ b/device/bluetooth/test/fake_bluetooth.cc
@@ -9,7 +9,8 @@
 #include "base/memory/ptr_util.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
 namespace bluetooth {
 
@@ -21,9 +22,10 @@
 FakeBluetooth::~FakeBluetooth() = default;
 
 // static
-void FakeBluetooth::Create(mojom::FakeBluetoothRequest request) {
-  mojo::MakeStrongBinding(std::make_unique<FakeBluetooth>(),
-                          std::move(request));
+void FakeBluetooth::Create(
+    mojo::PendingReceiver<mojom::FakeBluetooth> receiver) {
+  mojo::MakeSelfOwnedReceiver(std::make_unique<FakeBluetooth>(),
+                              std::move(receiver));
 }
 
 void FakeBluetooth::SetLESupported(bool supported,
@@ -34,11 +36,11 @@
 
 void FakeBluetooth::SimulateCentral(mojom::CentralState state,
                                     SimulateCentralCallback callback) {
-  mojom::FakeCentralPtr fake_central_ptr;
+  mojo::PendingRemote<mojom::FakeCentral> fake_central;
   fake_central_ = base::MakeRefCounted<FakeCentral>(
-      state, mojo::MakeRequest(&fake_central_ptr));
+      state, fake_central.InitWithNewPipeAndPassReceiver());
   device::BluetoothAdapterFactory::SetAdapterForTesting(fake_central_);
-  std::move(callback).Run(std::move(fake_central_ptr));
+  std::move(callback).Run(std::move(fake_central));
 }
 
 void FakeBluetooth::AllResponsesConsumed(
diff --git a/device/bluetooth/test/fake_bluetooth.h b/device/bluetooth/test/fake_bluetooth.h
index 8848db4..78f183d 100644
--- a/device/bluetooth/test/fake_bluetooth.h
+++ b/device/bluetooth/test/fake_bluetooth.h
@@ -10,6 +10,7 @@
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
 #include "device/bluetooth/test/fake_central.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 
 namespace bluetooth {
 
@@ -24,7 +25,7 @@
   FakeBluetooth();
   ~FakeBluetooth() override;
 
-  static void Create(mojom::FakeBluetoothRequest request);
+  static void Create(mojo::PendingReceiver<mojom::FakeBluetooth> receiver);
 
   void SetLESupported(bool available, SetLESupportedCallback callback) override;
   void SimulateCentral(mojom::CentralState state,
diff --git a/device/bluetooth/test/fake_central.cc b/device/bluetooth/test/fake_central.cc
index 257db5e..46bcbd0 100644
--- a/device/bluetooth/test/fake_central.cc
+++ b/device/bluetooth/test/fake_central.cc
@@ -39,8 +39,8 @@
 }  // namespace
 
 FakeCentral::FakeCentral(mojom::CentralState state,
-                         mojom::FakeCentralRequest request)
-    : state_(state), binding_(this, std::move(request)) {}
+                         mojo::PendingReceiver<mojom::FakeCentral> receiver)
+    : state_(state), receiver_(this, std::move(receiver)) {}
 
 void FakeCentral::SimulatePreconnectedPeripheral(
     const std::string& address,
diff --git a/device/bluetooth/test/fake_central.h b/device/bluetooth/test/fake_central.h
index 7c1a034..9e9b1a5b 100644
--- a/device/bluetooth/test/fake_central.h
+++ b/device/bluetooth/test/fake_central.h
@@ -11,7 +11,8 @@
 #include "base/compiler_specific.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 
 namespace bluetooth {
 
@@ -28,7 +29,8 @@
 // Not intended for direct use by clients.  See README.md.
 class FakeCentral : public mojom::FakeCentral, public device::BluetoothAdapter {
  public:
-  FakeCentral(mojom::CentralState state, mojom::FakeCentralRequest request);
+  FakeCentral(mojom::CentralState state,
+              mojo::PendingReceiver<mojom::FakeCentral> receiver);
 
   // FakeCentral overrides:
   void SimulatePreconnectedPeripheral(
@@ -211,7 +213,7 @@
       const std::string& descriptor_id) const;
 
   mojom::CentralState state_;
-  mojo::Binding<mojom::FakeCentral> binding_;
+  mojo::Receiver<mojom::FakeCentral> receiver_;
 };
 
 }  // namespace bluetooth
diff --git a/device/fido/cable/fido_cable_discovery.cc b/device/fido/cable/fido_cable_discovery.cc
index 3d6611588..56d9506f 100644
--- a/device/fido/cable/fido_cable_discovery.cc
+++ b/device/fido/cable/fido_cable_discovery.cc
@@ -304,7 +304,14 @@
     std::unique_ptr<BluetoothDiscoverySession> session) {
   SetDiscoverySession(std::move(session));
   FIDO_LOG(DEBUG) << "Discovery session started.";
-  StartAdvertisement();
+  // Advertising is delayed by 500ms to ensure that any UI has a chance to
+  // appear as we don't want to start broadcasting without the user being
+  // aware.
+  base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&FidoCableDiscovery::StartAdvertisement,
+                     weak_factory_.GetWeakPtr()),
+      base::TimeDelta::FromMilliseconds(500));
 }
 
 void FidoCableDiscovery::StartAdvertisement() {
diff --git a/device/fido/cable/fido_cable_discovery_unittest.cc b/device/fido/cable/fido_cable_discovery_unittest.cc
index c7cac3a..3c0d7b2 100644
--- a/device/fido/cable/fido_cable_discovery_unittest.cc
+++ b/device/fido/cable/fido_cable_discovery_unittest.cc
@@ -325,7 +325,8 @@
     return std::make_unique<FakeFidoCableDiscovery>(std::move(discovery_data));
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 };
 
 // Tests regular successful discovery flow for Cable device.
@@ -344,7 +345,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 // Tests successful discovery flow for Apple Cable device.
@@ -363,7 +364,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 // Tests a scenario where upon broadcasting advertisement and scanning, client
@@ -384,7 +385,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 // Windows currently does not support multiple EIDs, so the following tests are
@@ -423,7 +424,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 // Tests a scenario where only one of the two client EID's are advertised
@@ -456,7 +457,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 // Test the scenario when all advertisement for client EID's fails.
@@ -488,7 +489,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
   EXPECT_TRUE(cable_discovery->advertisements_.empty());
 }
 #endif  // !defined(OS_WIN)
@@ -509,7 +510,7 @@
 
   BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter);
   cable_discovery->Start();
-  task_environment_.RunUntilIdle();
+  task_environment_.FastForwardUntilNoTasksRemain();
 
   EXPECT_EQ(1u, cable_discovery->advertisements_.size());
   cable_discovery.reset();
@@ -548,6 +549,7 @@
   }
 
   mock_adapter->NotifyAdapterPoweredChanged(true);
+  task_environment_.FastForwardUntilNoTasksRemain();
 }
 
 }  // namespace device
diff --git a/device/gamepad/nintendo_controller.cc b/device/gamepad/nintendo_controller.cc
index d47cd32a..278e252 100644
--- a/device/gamepad/nintendo_controller.cc
+++ b/device/gamepad/nintendo_controller.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/stringprintf.h"
 #include "device/gamepad/gamepad_data_fetcher.h"
 #include "device/gamepad/gamepad_id_list.h"
@@ -720,9 +721,9 @@
   int freq = static_cast<int>(frequency);
   int amp = static_cast<int>(amplitude * kVibrationAmplitudeMax);
   // Clamp the target frequency and amplitude to a safe range.
-  freq = std::min(std::max(freq, kVibrationFrequencyHzMin),
-                  kVibrationFrequencyHzMax);
-  amp = std::min(std::max(amp, 0), kVibrationAmplitudeMax);
+  freq = base::ClampToRange(freq, kVibrationFrequencyHzMin,
+                            kVibrationFrequencyHzMax);
+  amp = base::ClampToRange(amp, 0, kVibrationAmplitudeMax);
   const auto* best_vf = &kVibrationFrequency[0];
   for (size_t i = 1; i < kVibrationFrequencySize; ++i) {
     const auto* vf = &kVibrationFrequency[i];
@@ -1608,8 +1609,7 @@
 }
 
 void NintendoController::RequestSetHomeLightIntensity(double intensity) {
-  // Clamp |intensity| to [0,1].
-  intensity = std::max(0.0, std::min(1.0, intensity));
+  intensity = base::ClampToRange(intensity, 0.0, 1.0);
   uint8_t led_intensity = std::round(intensity * 0x0f);
   // Each pair of bytes in the minicycle data describes two minicyles.
   // The first byte holds two 4-bit values encoding minicycle intensities.
diff --git a/docs/infra/cq_builders.md b/docs/infra/cq_builders.md
index 73ba49c8..46f1562 100644
--- a/docs/infra/cq_builders.md
+++ b/docs/infra/cq_builders.md
@@ -304,6 +304,10 @@
 by CQ. These are often used to test new configurations before they are added
 as required builders.
 
+* [android-pie-arm64-rel](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/android-pie-arm64-rel) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/android-pie-arm64-rel)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+android-pie-arm64-rel))
+
+  * Experimental percentage: 2
+
 * [chromeos-kevin-experimental-rel](https://ci.chromium.org/p/chromium/builders/luci.chromium.try/chromeos-kevin-experimental-rel) ([`commit-queue.cfg` entry](https://cs.chromium.org/search/?q=package:%5Echromium$+file:commit-queue.cfg+chromium/try/chromeos-kevin-experimental-rel)) ([matching builders](https://cs.chromium.org/search/?q=file:trybots.py+chromeos-kevin-experimental-rel))
 
   * Experimental percentage: 5
diff --git a/docs/security/severity-guidelines.md b/docs/security/severity-guidelines.md
index 1ce2b1e..d108a231 100644
--- a/docs/security/severity-guidelines.md
+++ b/docs/security/severity-guidelines.md
@@ -37,7 +37,7 @@
 
 Example bugs:
 
-* Memory corruption in the browser process ([564501](https://crbug.com/564501)).
+* Memory corruption in the browser process ([319125](https://crbug.com/319125#c10)).
 * Exploit chains made up of multiple bugs that can lead to code execution
   outside of the sandbox ([416449](https://crbug.com/416449)).
 * A bug that enables web content to read local files
diff --git a/docs/workflow/debugging-with-swarming.md b/docs/workflow/debugging-with-swarming.md
index b204b97..f316308 100644
--- a/docs/workflow/debugging-with-swarming.md
+++ b/docs/workflow/debugging-with-swarming.md
@@ -93,8 +93,8 @@
 e625130b712096e3908266252c8cd779d7f442f1  unit_tests
 ```
 
-Do not ctrl-c it after it does this, even if it seems to be hanging for a minute
-- just let it finish.
+Do not ctrl-c it after it does this, even if it seems to be hanging for a
+minute - just let it finish.
 
 ## Running an isolate
 
@@ -128,6 +128,10 @@
 The [swarming bot list] allows you to see all the dimensions and the values they
 can take on.
 
+If you need to pass additional arguments to the test, simply add
+`-- $extra_args` to the end of the `swarming.py trigger` command line - anything
+after the `--` will be passed directly to the test.
+
 When you invoke `swarming.py trigger`, it will emit two pieces of information: a
 URL for the task it created, and a command you can run to collect the results of
 that task. For example:
@@ -155,6 +159,22 @@
 
 See the `--help` option of `run-swarmed.py` for more details about that script.
 
+## mb.py run
+
+Similar to `tools/run_swarmed.py`, `mb.py run` bundles much of the logic into a
+single command line. Unlike `tools/run_swarmed.py`, `mb.py run` allows the user
+to specify extra arguments to pass to the test, but has a messier command line.
+
+To use it, run:
+```
+$ tools/mb/mb.py run \
+    -s --no-default-dimensions \
+    -d pool $pool \
+    $criteria \
+    $outdir $target \
+    -- $extra_args
+```
+
 ## Other notes
 
 If you are looking at a Swarming task page, be sure to check the bottom of the
diff --git a/extensions/browser/api/automation_internal/automation_event_router.h b/extensions/browser/api/automation_internal/automation_event_router.h
index 17012ad7..34c6a30 100644
--- a/extensions/browser/api/automation_internal/automation_event_router.h
+++ b/extensions/browser/api/automation_internal/automation_event_router.h
@@ -73,8 +73,9 @@
       content::BrowserContext* browser_context = nullptr) override;
 
   // Notify the source extension of the result to getTextLocation.
-  void DispatchGetTextLocationDataResult(const ui::AXActionData& data,
-                                         const base::Optional<gfx::Rect>& rect);
+  void DispatchGetTextLocationDataResult(
+      const ui::AXActionData& data,
+      const base::Optional<gfx::Rect>& rect) override;
 
  private:
   struct AutomationListener {
diff --git a/extensions/browser/api/automation_internal/automation_event_router_interface.h b/extensions/browser/api/automation_internal/automation_event_router_interface.h
index e22a737..048260a 100644
--- a/extensions/browser/api/automation_internal/automation_event_router_interface.h
+++ b/extensions/browser/api/automation_internal/automation_event_router_interface.h
@@ -51,6 +51,11 @@
       bool result,
       content::BrowserContext* browser_context = nullptr) = 0;
 
+  // Notify the source extension of the result to getTextLocation.
+  virtual void DispatchGetTextLocationDataResult(
+      const ui::AXActionData& data,
+      const base::Optional<gfx::Rect>& rect) {}
+
   AutomationEventRouterInterface() {}
   virtual ~AutomationEventRouterInterface() {}
 
diff --git a/extensions/common/image_util.cc b/extensions/common/image_util.cc
index a616f30..0b2cd46a 100644
--- a/extensions/common/image_util.cc
+++ b/extensions/common/image_util.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -160,10 +161,10 @@
   color_utils::HSL hsl;
   // Normalize the value between 0.0 and 1.0.
   hsl.h = (((static_cast<int>(hue) % 360) + 360) % 360) / 360.0;
-  hsl.s = std::max(0.0, std::min(100.0, saturation)) / 100.0;
-  hsl.l = std::max(0.0, std::min(100.0, lightness)) / 100.0;
+  hsl.s = base::ClampToRange(saturation, 0.0, 100.0) / 100.0;
+  hsl.l = base::ClampToRange(lightness, 0.0, 100.0) / 100.0;
 
-  SkAlpha sk_alpha = std::max(0.0, std::min(1.0, alpha)) * 255;
+  SkAlpha sk_alpha = base::ClampToRange(alpha, 0.0, 1.0) * 255;
 
   *result = color_utils::HSLToSkColor(hsl, sk_alpha);
   return true;
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn
index e1c1703..633bdea 100644
--- a/fuchsia/engine/BUILD.gn
+++ b/fuchsia/engine/BUILD.gn
@@ -67,6 +67,7 @@
     ":web_engine_pak",
     "//base",
     "//base:base_static",
+    "//components/cdm/renderer",
     "//components/version_info",
     "//content/public/app:both",
     "//content/public/browser",
diff --git a/fuchsia/engine/browser/cookie_manager_impl_unittest.cc b/fuchsia/engine/browser/cookie_manager_impl_unittest.cc
index 1794c0f3..c096724 100644
--- a/fuchsia/engine/browser/cookie_manager_impl_unittest.cc
+++ b/fuchsia/engine/browser/cookie_manager_impl_unittest.cc
@@ -16,6 +16,7 @@
 #include "fuchsia/base/fit_adapter.h"
 #include "fuchsia/base/result_receiver.h"
 #include "fuchsia/engine/browser/cookie_manager_impl.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/network/network_service.h"
 #include "services/network/public/mojom/cookie_manager.mojom.h"
 #include "services/network/public/mojom/network_context.mojom.h"
@@ -58,9 +59,9 @@
   network::mojom::NetworkContext* GetNetworkContext() {
     if (!network_context_.is_bound()) {
       network_service_->CreateNetworkContext(
-          mojo::MakeRequest(&network_context_),
+          network_context_.BindNewPipeAndPassReceiver(),
           network::mojom::NetworkContextParams::New());
-      network_context_.set_connection_error_handler(
+      network_context_.set_disconnect_handler(
           base::BindLambdaForTesting([&]() { network_context_.reset(); }));
     }
     return network_context_.get();
@@ -126,7 +127,7 @@
   base::test::TaskEnvironment task_environment_;
 
   std::unique_ptr<network::NetworkService> network_service_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   mojo::Remote<network::mojom::CookieManager> mojo_cookie_manager_;
 
   CookieManagerImpl cookie_manager_;
diff --git a/fuchsia/engine/renderer/DEPS b/fuchsia/engine/renderer/DEPS
index 66c74a9..3e15095f 100644
--- a/fuchsia/engine/renderer/DEPS
+++ b/fuchsia/engine/renderer/DEPS
@@ -1,6 +1,9 @@
 include_rules = [
+  "+components/cdm/renderer",
   "+content/public/renderer",
+  "+media",
   "+mojo/public/cpp/bindings",
   "+services/service_manager/public/cpp",
   "+third_party/blink/public/common/associated_interfaces",
+  "+third_party/widevine/cdm/widevine_cdm_common.h",
 ]
diff --git a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
index ebe11bf..ee766c27 100644
--- a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
+++ b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
@@ -5,10 +5,13 @@
 #include "fuchsia/engine/renderer/web_engine_content_renderer_client.h"
 
 #include "base/macros.h"
+#include "components/cdm/renderer/widevine_key_system_properties.h"
 #include "content/public/renderer/render_frame.h"
 #include "fuchsia/engine/renderer/on_load_script_injector.h"
+#include "media/base/eme_constants.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
+#include "third_party/widevine/cdm/widevine_cdm_common.h"
 
 WebEngineContentRendererClient::WebEngineContentRendererClient() = default;
 
@@ -20,3 +23,31 @@
   // The objects' lifetimes are bound to the RenderFrame's lifetime.
   new OnLoadScriptInjector(render_frame);
 }
+
+void WebEngineContentRendererClient::AddSupportedKeySystems(
+    std::vector<std::unique_ptr<media::KeySystemProperties>>* key_systems) {
+  // TODO(yucliu): Check if Widevine is enabled from command line/context
+  // feature flags.
+  // TODO(yucliu): Check supported hw video decoders.
+  media::SupportedCodecs supported_video_codecs = media::EME_CODEC_NONE;
+
+  base::flat_set<media::EncryptionMode> encryption_schemes{
+      media::EncryptionMode::kCenc, media::EncryptionMode::kCbcs};
+
+  // Fuchsia always decrypts audio into clear buffers and return them back to
+  // Chromium. Hardware secured decoders are only available for supported
+  // video codecs.
+  key_systems->emplace_back(new cdm::WidevineKeySystemProperties(
+      media::EME_CODEC_AUDIO_ALL | supported_video_codecs,  // codecs
+      encryption_schemes,      // encryption schemes
+      supported_video_codecs,  // hw secure codecs
+      encryption_schemes,      // hw secure encryption schemes
+      cdm::WidevineKeySystemProperties::Robustness::
+          HW_SECURE_CRYPTO,  // max audio robustness
+      cdm::WidevineKeySystemProperties::Robustness::
+          HW_SECURE_ALL,                            // max video robustness
+      media::EmeSessionTypeSupport::NOT_SUPPORTED,  // persistent license
+      media::EmeSessionTypeSupport::NOT_SUPPORTED,  // persistent usage record
+      media::EmeFeatureSupport::ALWAYS_ENABLED,     // persistent state
+      media::EmeFeatureSupport::ALWAYS_ENABLED));   // distinctive identifier
+}
diff --git a/fuchsia/engine/renderer/web_engine_content_renderer_client.h b/fuchsia/engine/renderer/web_engine_content_renderer_client.h
index 40bad6d..6d0bab09 100644
--- a/fuchsia/engine/renderer/web_engine_content_renderer_client.h
+++ b/fuchsia/engine/renderer/web_engine_content_renderer_client.h
@@ -15,6 +15,9 @@
 
   // content::ContentRendererClient overrides.
   void RenderFrameCreated(content::RenderFrame* render_frame) override;
+  void AddSupportedKeySystems(
+      std::vector<std::unique_ptr<media::KeySystemProperties>>* key_systems)
+      override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(WebEngineContentRendererClient);
diff --git a/fuchsia/runners/cast/main.cc b/fuchsia/runners/cast/main.cc
index ecafa69..65c55dd 100644
--- a/fuchsia/runners/cast/main.cc
+++ b/fuchsia/runners/cast/main.cc
@@ -16,7 +16,9 @@
 
   constexpr fuchsia::web::ContextFeatureFlags kCastRunnerFeatures =
       fuchsia::web::ContextFeatureFlags::NETWORK |
-      fuchsia::web::ContextFeatureFlags::AUDIO;
+      fuchsia::web::ContextFeatureFlags::AUDIO |
+      fuchsia::web::ContextFeatureFlags::VULKAN |
+      fuchsia::web::ContextFeatureFlags::HARDWARE_VIDEO_DECODER;
 
   CastRunner runner(
       base::fuchsia::ComponentContextForCurrentProcess()->outgoing().get(),
diff --git a/fuchsia/runners/web/main.cc b/fuchsia/runners/web/main.cc
index 0afb19f..ed0d1f7 100644
--- a/fuchsia/runners/web/main.cc
+++ b/fuchsia/runners/web/main.cc
@@ -16,7 +16,9 @@
 
   constexpr fuchsia::web::ContextFeatureFlags kWebRunnerFeatures =
       fuchsia::web::ContextFeatureFlags::NETWORK |
-      fuchsia::web::ContextFeatureFlags::AUDIO;
+      fuchsia::web::ContextFeatureFlags::AUDIO |
+      fuchsia::web::ContextFeatureFlags::VULKAN |
+      fuchsia::web::ContextFeatureFlags::HARDWARE_VIDEO_DECODER;
 
   WebContentRunner runner(
       base::fuchsia::ComponentContextForCurrentProcess()->outgoing().get(),
diff --git a/google_apis/drive/DEPS b/google_apis/drive/DEPS
index e704a471..41a063c 100644
--- a/google_apis/drive/DEPS
+++ b/google_apis/drive/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+components/signin/public",
+  "+mojo/public/cpp",
 ]
diff --git a/google_apis/drive/base_requests_server_unittest.cc b/google_apis/drive/base_requests_server_unittest.cc
index 01aa96d..f2c6ec3 100644
--- a/google_apis/drive/base_requests_server_unittest.cc
+++ b/google_apis/drive/base_requests_server_unittest.cc
@@ -15,6 +15,7 @@
 #include "google_apis/drive/request_sender.h"
 #include "google_apis/drive/task_util.h"
 #include "google_apis/drive/test_util.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -45,7 +46,8 @@
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_), std::move(context_params));
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
 
     network::mojom::NetworkServiceClientPtr network_service_client_ptr;
     network_service_client_ =
@@ -92,7 +94,7 @@
   std::unique_ptr<RequestSender> request_sender_;
   std::unique_ptr<network::mojom::NetworkService> network_service_;
   std::unique_ptr<network::mojom::NetworkServiceClient> network_service_client_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
   scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
       test_shared_loader_factory_;
diff --git a/google_apis/drive/base_requests_unittest.cc b/google_apis/drive/base_requests_unittest.cc
index f9a08af8..7602b4b 100644
--- a/google_apis/drive/base_requests_unittest.cc
+++ b/google_apis/drive/base_requests_unittest.cc
@@ -19,6 +19,7 @@
 #include "google_apis/drive/dummy_auth_service.h"
 #include "google_apis/drive/request_sender.h"
 #include "google_apis/drive/test_util.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -121,7 +122,8 @@
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_), std::move(context_params));
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
 
     network::mojom::NetworkServiceClientPtr network_service_client_ptr;
     network_service_client_ =
@@ -174,7 +176,7 @@
       base::test::TaskEnvironment::MainThreadType::IO};
   std::unique_ptr<network::mojom::NetworkService> network_service_;
   std::unique_ptr<network::mojom::NetworkServiceClient> network_service_client_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
   scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
       test_shared_loader_factory_;
diff --git a/google_apis/drive/drive_api_requests_unittest.cc b/google_apis/drive/drive_api_requests_unittest.cc
index 24b90d3..fa2e2a9 100644
--- a/google_apis/drive/drive_api_requests_unittest.cc
+++ b/google_apis/drive/drive_api_requests_unittest.cc
@@ -27,6 +27,7 @@
 #include "google_apis/drive/dummy_auth_service.h"
 #include "google_apis/drive/request_sender.h"
 #include "google_apis/drive/test_util.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -132,7 +133,8 @@
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_), std::move(context_params));
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
 
     network::mojom::NetworkServiceClientPtr network_service_client_ptr;
     network_service_client_ =
@@ -228,7 +230,7 @@
   std::unique_ptr<network::mojom::NetworkService> network_service_;
   std::unique_ptr<network::mojom::NetworkServiceClient> network_service_client_;
   std::unique_ptr<network::mojom::NetworkContextClient> network_context_client_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
   scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
       test_shared_loader_factory_;
diff --git a/google_apis/drive/files_list_request_runner_unittest.cc b/google_apis/drive/files_list_request_runner_unittest.cc
index 4a09612..523e9e4 100644
--- a/google_apis/drive/files_list_request_runner_unittest.cc
+++ b/google_apis/drive/files_list_request_runner_unittest.cc
@@ -17,6 +17,7 @@
 #include "google_apis/drive/base_requests.h"
 #include "google_apis/drive/dummy_auth_service.h"
 #include "google_apis/drive/request_sender.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -78,7 +79,8 @@
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_), std::move(context_params));
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
 
     network::mojom::NetworkServiceClientPtr network_service_client_ptr;
     network_service_client_ =
@@ -156,7 +158,7 @@
   std::unique_ptr<FilesListRequestRunner> runner_;
   std::unique_ptr<network::mojom::NetworkService> network_service_;
   std::unique_ptr<network::mojom::NetworkServiceClient> network_service_client_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
   scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
       test_shared_loader_factory_;
diff --git a/google_apis/gcm/base/socket_stream_unittest.cc b/google_apis/gcm/base/socket_stream_unittest.cc
index e1d4f90..f314ef56b 100644
--- a/google_apis/gcm/base/socket_stream_unittest.cc
+++ b/google_apis/gcm/base/socket_stream_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/strings/string_piece.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/ip_address.h"
 #include "net/log/net_log_source.h"
 #include "net/socket/socket_test_util.h"
@@ -93,7 +94,7 @@
   net::AddressList address_list_;
   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
   std::unique_ptr<network::NetworkService> network_service_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   net::MockClientSocketFactory socket_factory_;
   net::TestURLRequestContext url_request_context_;
   std::unique_ptr<network::NetworkContext> network_context_;
@@ -114,7 +115,8 @@
   url_request_context_.Init();
 
   network_context_ = std::make_unique<network::NetworkContext>(
-      network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+      network_service_.get(),
+      network_context_remote_.BindNewPipeAndPassReceiver(),
       &url_request_context_,
       /*cors_exempt_header_list=*/std::vector<std::string>());
 }
diff --git a/google_apis/gcm/engine/connection_factory_impl_unittest.cc b/google_apis/gcm/engine/connection_factory_impl_unittest.cc
index 6d10cfd..839f96b4 100644
--- a/google_apis/gcm/engine/connection_factory_impl_unittest.cc
+++ b/google_apis/gcm/engine/connection_factory_impl_unittest.cc
@@ -18,6 +18,7 @@
 #include "google_apis/gcm/base/mcs_util.h"
 #include "google_apis/gcm/engine/fake_connection_handler.h"
 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/backoff_entry.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_test_util.h"
@@ -308,7 +309,7 @@
   GURL connected_server_;
   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
   std::unique_ptr<network::NetworkService> network_service_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   std::unique_ptr<network::NetworkContext> network_context_;
 };
 
@@ -330,8 +331,8 @@
   // configuration.
   params->initial_proxy_config = net::ProxyConfigWithAnnotation::CreateDirect();
   network_context_ = std::make_unique<network::NetworkContext>(
-      network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
-      std::move(params));
+      network_service_.get(),
+      network_context_remote_.BindNewPipeAndPassReceiver(), std::move(params));
   factory()->SetConnectionListener(this);
   factory()->Initialize(ConnectionFactory::BuildLoginRequestCallback(),
                         ConnectionHandler::ProtoReceivedCallback(),
diff --git a/google_apis/gcm/engine/connection_handler_impl_unittest.cc b/google_apis/gcm/engine/connection_handler_impl_unittest.cc
index 9053360..2c3abf0 100644
--- a/google_apis/gcm/engine/connection_handler_impl_unittest.cc
+++ b/google_apis/gcm/engine/connection_handler_impl_unittest.cc
@@ -25,6 +25,7 @@
 #include "google_apis/gcm/base/mcs_util.h"
 #include "google_apis/gcm/base/socket_stream.h"
 #include "google_apis/gcm/protocol/mcs.pb.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/ip_address.h"
 #include "net/base/test_completion_callback.h"
 #include "net/log/net_log_source.h"
@@ -194,7 +195,7 @@
   std::unique_ptr<base::RunLoop> run_loop_;
   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
   std::unique_ptr<network::NetworkService> network_service_;
-  network::mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   net::MockClientSocketFactory socket_factory_;
   net::TestURLRequestContext url_request_context_;
   std::unique_ptr<network::NetworkContext> network_context_;
@@ -216,7 +217,8 @@
   url_request_context_.Init();
 
   network_context_ = std::make_unique<network::NetworkContext>(
-      network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+      network_service_.get(),
+      network_context_remote_.BindNewPipeAndPassReceiver(),
       &url_request_context_,
       /*cors_exempt_header_list=*/std::vector<std::string>());
 }
diff --git a/google_apis/gcm/tools/mcs_probe.cc b/google_apis/gcm/tools/mcs_probe.cc
index 0a8aebc..4220c1a 100644
--- a/google_apis/gcm/tools/mcs_probe.cc
+++ b/google_apis/gcm/tools/mcs_probe.cc
@@ -42,6 +42,7 @@
 #include "google_apis/gcm/engine/mcs_client.h"
 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h"
 #include "mojo/core/embedder/embedder.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/cert/cert_verifier.h"
 #include "net/dns/host_resolver.h"
 #include "net/http/http_auth_handler_factory.h"
@@ -225,7 +226,7 @@
   base::Thread file_thread_;
 
   std::unique_ptr<network::NetworkContext> network_context_;
-  network::mojom::NetworkContextPtr network_context_pipe_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_remote_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
 
@@ -356,7 +357,8 @@
 
   // Wrap it up with network service APIs.
   network_context_ = std::make_unique<network::NetworkContext>(
-      nullptr /* network_service */, mojo::MakeRequest(&network_context_pipe_),
+      nullptr /* network_service */,
+      network_context_remote_.BindNewPipeAndPassReceiver(),
       url_request_context_.get(),
       /*cors_exempt_header_list=*/std::vector<std::string>());
   auto url_loader_factory_params =
diff --git a/gpu/command_buffer/client/cmd_buffer_helper_test.cc b/gpu/command_buffer/client/cmd_buffer_helper_test.cc
index 3d6f74e7..fe21567 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper_test.cc
+++ b/gpu/command_buffer/client/cmd_buffer_helper_test.cc
@@ -202,7 +202,7 @@
   std::vector<std::unique_ptr<CommandBufferEntry[]>> test_command_args_;
   unsigned int test_command_next_id_;
   Sequence sequence_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 // Checks immediate_entry_count_ changes based on RingBuffer state.
diff --git a/gpu/command_buffer/client/fenced_allocator_test.cc b/gpu/command_buffer/client/fenced_allocator_test.cc
index 9628b72..ed09dd1 100644
--- a/gpu/command_buffer/client/fenced_allocator_test.cc
+++ b/gpu/command_buffer/client/fenced_allocator_test.cc
@@ -58,7 +58,7 @@
   std::unique_ptr<CommandBufferDirect> command_buffer_;
   std::unique_ptr<AsyncAPIMock> api_mock_;
   std::unique_ptr<CommandBufferHelper> helper_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 #ifndef _MSC_VER
diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc
index 5bed2bf..e6ed987c 100644
--- a/gpu/command_buffer/client/mapped_memory_unittest.cc
+++ b/gpu/command_buffer/client/mapped_memory_unittest.cc
@@ -55,7 +55,7 @@
   std::unique_ptr<CommandBufferDirectLocked> command_buffer_;
   std::unique_ptr<AsyncAPIMock> api_mock_;
   std::unique_ptr<CommandBufferHelper> helper_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 #ifndef _MSC_VER
diff --git a/gpu/command_buffer/client/program_info_manager.cc b/gpu/command_buffer/client/program_info_manager.cc
index c49efa9..5e3299e 100644
--- a/gpu/command_buffer/client/program_info_manager.cc
+++ b/gpu/command_buffer/client/program_info_manager.cc
@@ -321,32 +321,32 @@
             uniform_infos_[indices[ii]].name.length() + 1);
       }
       return true;
+  }
+  if (num_uniforms != uniforms_es3_.size()) {
+    return false;
+  }
+  switch (pname) {
     case GL_UNIFORM_BLOCK_INDEX:
-      DCHECK_EQ(num_uniforms, uniforms_es3_.size());
       for (GLsizei ii = 0; ii < count; ++ii) {
         params[ii] = uniforms_es3_[indices[ii]].block_index;
       }
       return true;
     case GL_UNIFORM_OFFSET:
-      DCHECK_EQ(num_uniforms, uniforms_es3_.size());
       for (GLsizei ii = 0; ii < count; ++ii) {
         params[ii] = uniforms_es3_[indices[ii]].offset;
       }
       return true;
     case GL_UNIFORM_ARRAY_STRIDE:
-      DCHECK_EQ(num_uniforms, uniforms_es3_.size());
       for (GLsizei ii = 0; ii < count; ++ii) {
         params[ii] = uniforms_es3_[indices[ii]].array_stride;
       }
       return true;
     case GL_UNIFORM_MATRIX_STRIDE:
-      DCHECK_EQ(num_uniforms, uniforms_es3_.size());
       for (GLsizei ii = 0; ii < count; ++ii) {
         params[ii] = uniforms_es3_[indices[ii]].matrix_stride;
       }
       return true;
     case GL_UNIFORM_IS_ROW_MAJOR:
-      DCHECK_EQ(num_uniforms, uniforms_es3_.size());
       for (GLsizei ii = 0; ii < count; ++ii) {
         params[ii] = uniforms_es3_[indices[ii]].is_row_major;
       }
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc
index e9c18cf2..1e8dbc5 100644
--- a/gpu/command_buffer/client/ring_buffer_test.cc
+++ b/gpu/command_buffer/client/ring_buffer_test.cc
@@ -85,7 +85,7 @@
 
   std::unique_ptr<int8_t[]> buffer_;
   int8_t* buffer_start_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 #ifndef _MSC_VER
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc
index 96bc3ae..01681ce 100644
--- a/gpu/command_buffer/service/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -784,7 +784,7 @@
   }
 
   auto command_buffer = command_pool_->CreatePrimaryCommandBuffer();
-  CHECK(command_buffer->Initialize());
+  CHECK(command_buffer);
   {
     ScopedSingleUseCommandBufferRecorder recorder(*command_buffer);
     GrVkImageInfo image_info;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
index 7ee8f07..5338bae0e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -804,7 +804,7 @@
   SharedImageManager shared_image_manager_;
   scoped_refptr<ContextGroup> group_;
   MockGLStates gl_states_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   MockCopyTextureResourceManager* copy_texture_manager_;     // not owned
   MockCopyTexImageResourceManager* copy_tex_image_blitter_;  // not owned
diff --git a/gpu/command_buffer/service/gpu_service_test.h b/gpu/command_buffer/service/gpu_service_test.h
index 099749c..fa4d5fa2 100644
--- a/gpu/command_buffer/service/gpu_service_test.h
+++ b/gpu/command_buffer/service/gpu_service_test.h
@@ -42,7 +42,7 @@
   bool ran_teardown_;
   scoped_refptr<gl::GLContextStub> context_;
   scoped_refptr<gl::GLSurfaceStub> surface_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 }  // namespace gles2
diff --git a/gpu/command_buffer/service/raster_decoder_unittest_base.h b/gpu/command_buffer/service/raster_decoder_unittest_base.h
index 9a8dee0..65992bc 100644
--- a/gpu/command_buffer/service/raster_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/raster_decoder_unittest_base.h
@@ -235,7 +235,7 @@
   MemoryTypeTracker memory_tracker_;
   std::vector<std::unique_ptr<SharedImageRepresentationFactoryRef>>
       shared_images_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   gles2::MockCopyTextureResourceManager* copy_texture_manager_;  // not owned
   GLuint next_fake_texture_client_id_ = 271828;
 };
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 89a13dc5..37897dc 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -149,6 +149,9 @@
     // in GetCapabilities and ensuring these are also used by the
     // PaintOpBufferSerializer.
     GrContextOptions options;
+    if (GrContextIsMetal()) {
+      options.fRuntimeProgramCacheSize = 1024;
+    }
     options.fDriverBugWorkarounds =
         GrDriverBugWorkarounds(workarounds.ToIntSet());
     options.fDisableCoverageCountingPaths = true;
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 0b7b955..d8267c86 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3332,6 +3332,19 @@
       "features": [
           "disable_vp_scaling"
       ]
+    },
+    {
+      "id": 310,
+      "description": "Context lost recovery often fails on Mali on CrOS.",
+      "cr_bugs": [992286],
+      "os": {
+        "type": "chromeos"
+      },
+      "gl_vendor": "ARM.*",
+      "gl_renderer": ".*Mali-.*",
+      "features": [
+        "exit_on_context_lost"
+      ]
     }
   ]
 }
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 089d5d7d..68832b3 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -31,7 +31,7 @@
 #if defined(OS_ANDROID)
 // Use android AImageReader when playing videos with MediaPlayer.
 const base::Feature kAImageReaderMediaPlayer{"AImageReaderMediaPlayer",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Use android SurfaceControl API for managing display compositor's buffer queue
 // and using overlays on Android.
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.cc b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
index 148cd5b..9677124 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.cc
@@ -99,7 +99,9 @@
 void GpuWatchdogThreadImplV2::OnGpuProcessTearDown() {
   DCHECK(watched_gpu_task_runner_->BelongsToCurrentThread());
 
-  Arm();
+  in_gpu_process_teardown_ = true;
+  if (!IsArmed())
+    Arm();
 }
 
 // Running on the watchdog thread.
@@ -138,13 +140,24 @@
 void GpuWatchdogThreadImplV2::WillProcessTask(
     const base::PendingTask& pending_task) {
   DCHECK(watched_gpu_task_runner_->BelongsToCurrentThread());
-  Arm();
+
+  // The watchdog is armed at the beginning of the gpu process teardown.
+  // Do not call Arm() during teardown.
+  if (in_gpu_process_teardown_)
+    DCHECK(IsArmed());
+  else
+    Arm();
 }
 
 void GpuWatchdogThreadImplV2::DidProcessTask(
     const base::PendingTask& pending_task) {
   DCHECK(watched_gpu_task_runner_->BelongsToCurrentThread());
-  Disarm();
+
+  // Keep the watchdog armed during tear down.
+  if (in_gpu_process_teardown_)
+    InProgress();
+  else
+    Disarm();
 }
 
 // Running on the watchdog thread.
@@ -219,7 +232,7 @@
   base::subtle::NoBarrier_AtomicIncrement(&arm_disarm_counter_, 1);
 
   // Arm/Disarm are always called in sequence. Now it's an odd number.
-  DCHECK(base::subtle::NoBarrier_Load(&arm_disarm_counter_) & 1);
+  DCHECK(IsArmed());
 }
 
 void GpuWatchdogThreadImplV2::Disarm() {
@@ -228,7 +241,7 @@
   base::subtle::NoBarrier_AtomicIncrement(&arm_disarm_counter_, 1);
 
   // Arm/Disarm are always called in sequence. Now it's an even number.
-  DCHECK(base::subtle::NoBarrier_Load(&arm_disarm_counter_) % 2 == 0);
+  DCHECK(!IsArmed());
 }
 
 void GpuWatchdogThreadImplV2::InProgress() {
@@ -238,7 +251,12 @@
   base::subtle::NoBarrier_AtomicIncrement(&arm_disarm_counter_, 2);
 
   // Now it's an odd number.
-  DCHECK(base::subtle::NoBarrier_Load(&arm_disarm_counter_) & 1);
+  DCHECK(IsArmed());
+}
+
+bool GpuWatchdogThreadImplV2::IsArmed() {
+  // It's an odd number.
+  return base::subtle::NoBarrier_Load(&arm_disarm_counter_) & 1;
 }
 
 // Running on the watchdog thread.
@@ -294,6 +312,7 @@
   base::debug::Alias(&backgrounded_timeticks_);
   base::debug::Alias(&foregrounded_timeticks_);
   base::debug::Alias(&in_power_suspension_);
+  base::debug::Alias(&in_gpu_process_teardown_);
   base::debug::Alias(&is_backgrounded_);
   base::debug::Alias(&is_add_power_observer_called_);
   base::debug::Alias(&is_power_observer_added_);
diff --git a/gpu/ipc/service/gpu_watchdog_thread_v2.h b/gpu/ipc/service/gpu_watchdog_thread_v2.h
index 5523196..fe5d4d9 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_v2.h
+++ b/gpu/ipc/service/gpu_watchdog_thread_v2.h
@@ -55,13 +55,13 @@
   void Arm();
   void Disarm();
   void InProgress();
+  bool IsArmed();
   void OnWatchdogTimeout();
 
   // Do not change the function name. It is used for [GPU HANG] carsh reports.
   void DeliberatelyTerminateToRecoverFromHang();
 
-  // This counter is only written on the gpu thread, and read on the watchdog
-  // thread.
+  // This counter is only written on the gpu thread, and read on both threads.
   base::subtle::Atomic32 arm_disarm_counter_ = 0;
   // The counter number read in the last OnWatchdogTimeout() on the watchdog
   // thread.
@@ -92,6 +92,9 @@
   // The system has entered the power suspension mode.
   bool in_power_suspension_ = false;
 
+  // The GPU process has started tearing down. Accessed only in the gpu process.
+  bool in_gpu_process_teardown_ = false;
+
   // OnWatchdogTimeout() is called for the first time after power resume.
   bool is_first_timeout_after_power_resume = false;
 
diff --git a/gpu/vulkan/vulkan_command_buffer.cc b/gpu/vulkan/vulkan_command_buffer.cc
index 7dfcaaf..9fdb2dd 100644
--- a/gpu/vulkan/vulkan_command_buffer.cc
+++ b/gpu/vulkan/vulkan_command_buffer.cc
@@ -114,6 +114,7 @@
       .commandBufferCount = 1,
   };
 
+  DCHECK_EQ(static_cast<VkCommandBuffer>(VK_NULL_HANDLE), command_buffer_);
   result =
       vkAllocateCommandBuffers(device, &command_buffer_info, &command_buffer_);
   if (VK_SUCCESS != result) {
diff --git a/infra/config/commit-queue.cfg b/infra/config/commit-queue.cfg
index 51a5e4f..bd0c4e5 100644
--- a/infra/config/commit-queue.cfg
+++ b/infra/config/commit-queue.cfg
@@ -356,6 +356,10 @@
       ##########################
 
       builders {
+        name: "chromium/try/android-pie-arm64-rel"
+        experiment_percentage: 2
+      }
+      builders {
         name: "chromium/try/chromeos-kevin-experimental-rel"
         experiment_percentage: 5
       }
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
index f64a3bc..0aa5252 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -19,10 +19,8 @@
 <translation id="2730884209570016437">ሌላ መተግበሪያ ካሜራዎን እየተጠቀመበት ስለሆነ Chromium ካሜራዎን መጠቀም አይችልም</translation>
 <translation id="2915596697727466327">Chromium ወደ የእርስዎ የይለፍ ቃላት መዳረሻ መፈቀዱን ለማረጋገጥ የመልክ መታወቂያን ይጠቀማል።</translation>
 <translation id="3256316712990552818">ወደ Chromium ተቀድቷል</translation>
-<translation id="3413120535237193088">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chromium ይግቡ።</translation>
 <translation id="3605252743693911722">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት እና በሁሉም የእርስዎ መሣሪያዎች ላይ ተጨማሪ ለማግኘት ወደ Chromium በመለያ ይግቡ።</translation>
 <translation id="3805899903892079518">Chromium የእርስዎ ፎቶዎች ወይም ቪዲዮዎች መዳረሻ የለውም። በiOS ቅንብሮች &gt; ግላዊነት &gt; ፎቶዎች ውስጥ መዳረሻን ያንቁ።</translation>
-<translation id="4024541897090868497">የእርስዎን ትሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chromium ይግቡ።</translation>
 <translation id="4157467675761413638">የChromium ጠቃሚ ምክር። ተጨማሪ የትር አማራጮችን ለማግኘት በመሣሪያ አሞሌው ውስጥ የትሮችን አሳይ አዝራሩን ተጭነው ይያዙ፣ ይህ በማያ ገጽዎ አናት ወይም ግርጌ ላይ ነው ያለው።</translation>
 <translation id="4241912885070669028">በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ Chromium ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቆያል።</translation>
 <translation id="4555020257205549924">ይህ ባህሪ ሲበራ Chromium በሌሎች ቋንቋዎች የተጻፉ ገጾች Google ትርጉምን በመጠቀም እንዲተረጎምልዎ ይጠይቀዎታል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index ae107cd..99c820b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">‏يتعذر على Chromium استخدام الكاميرا نظرًا لأنها قيد الاستخدام من قِبل تطبيق آخر</translation>
 <translation id="2915596697727466327">‏يستخدم Chromium تقنية "التعرُّف على الوجه" لضمان الدخول المصرَّح به إلى كلمات المرور.</translation>
 <translation id="3256316712990552818">‏تم النسخ إلى Chromium</translation>
-<translation id="3413120535237193088">‏للحصول على الإشارات المرجعية على جميع أجهزتك، سجِّل الدخول إلى Chromium.</translation>
 <translation id="3605252743693911722">‏سجّل الدخول إلى Chromium للحصول غلى الإشارات المرجعية وكلمات المرور والمزيد على جميع أجهزتك.</translation>
 <translation id="3805899903892079518">‏لا تتوفر لدى Chromium إمكانية الدخول إلى الصور أو الفيديوهات. تستطيع تفعيل الدخول في إعدادات نظام التشغيل iOS &gt; الخصوصية &gt; الصور.</translation>
-<translation id="4024541897090868497">‏للحصول على علامات التبويب على جميع أجهزتك، سجِّل الدخول إلى Chromium.</translation>
 <translation id="4157467675761413638">‏نصيحة لاستخدام Chromium: لمزيد من خيارات علامات التبويب، يمكنك الضغط مع الاستمرار على الزر "عرض علامات التبويب" في شريط الأدوات الموجود أسفل الشاشة أو أعلاها.</translation>
 <translation id="4241912885070669028">‏أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="SIGNOUT_MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chromium من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
 <translation id="4555020257205549924">‏عند تشغيل هذه الميزة، سيقترح Chromium ترجمة الصفحات المكتوبة بلغات أخرى باستخدام "ترجمة Google". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
index 96f0d7c..897f62b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium не може да използва камерата ви, защото е заета от друго приложение</translation>
 <translation id="2915596697727466327">Chromium използва Face ID, за да обезпечи упълномощен достъп до паролите ви.</translation>
 <translation id="3256316712990552818">Копирано в Chromium</translation>
-<translation id="3413120535237193088">Влезте в Chromium, за да получите отметките си на всичките си устройства.</translation>
 <translation id="3605252743693911722">Влезте в Chromium, за да получите отметките, паролите и другите си неща на всичките си устройства.</translation>
 <translation id="3805899903892079518">Chromium няма достъп до снимките или видеоклиповете ви. Активирайте го от „Settings“ &gt; „Privacy“ &gt; „Photos“ в iOS.</translation>
-<translation id="4024541897090868497">Влезте в Chromium, за да получите разделите си на всичките си устройства.</translation>
 <translation id="4157467675761413638">Съвет за Chromium. За да видите още опции за разделите, натиснете и задръжте бутона „Показване на разделите“ в лентата с инструменти в долната или горната част на екрана.</translation>
 <translation id="4241912885070669028">Излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />. Данните ви в Chromium ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
 <translation id="4555020257205549924">Когато тази функция е включена, Chromium ще предлага да преведе страниците, написани на други езици, посредством Google Преводач. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
index 0edb4afe..9666b380 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium আপনার ক্যামেরা ব্যবহার করতে পারছে না কারণ এটি অন্য একটি অ্যাপ্লিকেশান দ্বারা ব্যবহার করা হচ্ছে</translation>
 <translation id="2915596697727466327">Chromium আপনার পাসওয়ার্ডে অনুমোদিত অ্যাক্সেস নিশ্চিত করতে Face ID ব্যবহার করে।</translation>
 <translation id="3256316712990552818">Chromium-এ প্রতিলিপি করা হয়েছে</translation>
-<translation id="3413120535237193088">সব ডিভাইসে আপনার বুকমার্কগুলি পেতে, Chromium-এ সাইন-ইন করুন।</translation>
 <translation id="3605252743693911722">আপনার বুকমার্ক, পাসওয়ার্ড এবং অন্যান্য জিনিস আপনার সমস্ত ডিভাইসে পেতে Chromium-এ সাইন-ইন করুন।</translation>
 <translation id="3805899903892079518">আপনার ফটো এবং ভিডিওগুলিতে Chromium এর অ্যাক্সেস নেই৷ iOS সেটিংস &gt; গোপনীয়তা &gt; ফটোগুলিতে অ্যাক্সেস সক্ষম করুন৷</translation>
-<translation id="4024541897090868497">আপনার সব ডিভাইসে আপনার ট্যাবগুলি পেতে, Chromium-এ সাইন-ইন করুন।</translation>
 <translation id="4157467675761413638">Chromium টিপ। ট্যাবে আরও বিকল্পের জন্য, আপনার স্ক্রিনের নিচে অথবা উপরে থাকা টুলবারে দেখানো ট্যাবটি প্রেস করে ধরে থাকুন।</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> পরিচালিত একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন৷ এটি এই ডিভাইস থেকে আপনার Chromium ডেটা মুছে ফেলবে, কিন্তু আপনার Google অ্যাকাউন্টে ডেটা থেকে যাবে৷</translation>
 <translation id="4555020257205549924">যখন এই বৈশিষ্ট্যটি চালু করা হয় তখন Chromium, Google অনুবাদ ব্যবহার করে অন্যান্য ভাষায় লিখিত পৃষ্ঠাগুলি অনুবাদ করার অফার করবে৷ <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
index 2304065..bc3ddb2 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium no pot utilitzar la càmera perquè l'està utilitzant una altra aplicació</translation>
 <translation id="2915596697727466327">Chromium utilitza Face ID per garantir l'accés autoritzat a les contrasenyes.</translation>
 <translation id="3256316712990552818">Copiada a Chromium</translation>
-<translation id="3413120535237193088">Inicia la sessió a Chromium per accedir a les adreces d'interès des de tots els dispositius.</translation>
 <translation id="3605252743693911722">Inicia la sessió a Chromium per accedir a les teves adreces d'interès, les contrasenyes i altres continguts des de tots els teus dispositius.</translation>
 <translation id="3805899903892079518">Chromium no té accés als vostres vídeos o fotos. Permeteu-li l'accés a iOS, a Configuració &gt; Privadesa &gt; Fotos.</translation>
-<translation id="4024541897090868497">Per veure les teves pestanyes en tots els dispositius, inicia la sessió a Chromium.</translation>
 <translation id="4157467675761413638">Consell de Chromium. Per accedir a més opcions de pestanyes, mantén premut el botó Mostra pestanyes a la barra d'eines, que és a la part inferior o superior de la pantalla.</translation>
 <translation id="4241912885070669028">Estàs tancant la sessió d'un compte gestionat per <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se suprimiran les teves dades de Chromium d'aquest dispositiu, però continuaran al teu compte de Google.</translation>
 <translation id="4555020257205549924">Quan aquesta funció està activada, Chromium ofereix la possibilitat de traduir pàgines escrites en altres idiomes mitjançant el Traductor de Google. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
index 2a23bd9..5313d818 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
@@ -19,10 +19,8 @@
 <translation id="2730884209570016437">Chromium nemůže použít fotoaparát, protože jej právě používá jiná aplikace</translation>
 <translation id="2915596697727466327">Chromium pomocí funkce Face ID ověřuje přístup k heslům.</translation>
 <translation id="3256316712990552818">Zkopírováno do prohlížeče Chromium</translation>
-<translation id="3413120535237193088">Chcete-li záložky synchronizovat do všech zařízení, přihlaste se do prohlížeče Chromium.</translation>
 <translation id="3605252743693911722">Chcete-li mít své záložky, hesla a další obsah na všech zařízeních, přihlaste se do prohlížeče Chromium.</translation>
 <translation id="3805899903892079518">Chromium nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení &gt; Soukromí &gt; Fotky.</translation>
-<translation id="4024541897090868497">Chcete-li karty synchronizovat do všech svých zařízení, přihlaste se do prohlížeče Chromium.</translation>
 <translation id="4157467675761413638">Tip pro Chromium. Další možnosti karet zobrazíte podržením tlačítka Zobrazit karty, které najdete v dolní nebo horní části obrazovky.</translation>
 <translation id="4241912885070669028">Odhlašujete se z účtu, který je spravován doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Touto akcí svá data prohlížeče Chromium smažete z tohoto zařízení, ve vašem účtu Google však zůstanou.</translation>
 <translation id="4555020257205549924">Pokud je tato funkce zapnutá, bude Chromium nabízet překlad stránek v jiných jazycích pomocí Překladače Google.<ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
index 456fa86..f21af1f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium kan ikke bruge dit kamera, da det bruges af en anden app</translation>
 <translation id="2915596697727466327">Chromium bruger Face ID til at sikre autoriseret adgang til dine adgangskoder.</translation>
 <translation id="3256316712990552818">Kopieret til Chromium</translation>
-<translation id="3413120535237193088">Log ind på Chromium for at se dine bogmærker på alle dine enheder.</translation>
 <translation id="3605252743693911722">Log ind på Chromium for at få dine bogmærker, adgangskoder og meget mere på alle dine enheder.</translation>
 <translation id="3805899903892079518">Chromium har ikke adgang til dine billeder eller videoer. Gå til iOS Indstillinger &gt; Privatliv &gt; Billeder for at få adgang.</translation>
-<translation id="4024541897090868497">Log ind på Chromium for at se dine faner på alle dine enheder.</translation>
 <translation id="4157467675761413638">Chromium-tip. Hvis du vil se flere indstillinger for faner, skal du trykke på knappen Vis faner på værktøjslinjen nederst eller øverst på skærmen.</translation>
 <translation id="4241912885070669028">Du er ved at logge ud af en konto, der administreres af <ph name="SIGNOUT_MANAGED_DOMAIN" />. Denne handling sletter dine Chromium-data fra denne enhed, men dine data forbliver gemt på din Google-konto.</translation>
 <translation id="4555020257205549924">Når denne funktion er aktiveret, vil Chromium tilbyde at oversætte sider, der er skrevet på andre sprog, ved hjælp af Google Oversæt. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
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 a01f96b3..155ba6c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -19,10 +19,8 @@
 <translation id="2730884209570016437">Chromium kann nicht auf die Kamera zugreifen, da diese gerade von einer anderen App verwendet wird</translation>
 <translation id="2915596697727466327">Chromium verwendet Face ID, um den autorisierten Zugriff auf Ihre Passwörter zu gewährleisten.</translation>
 <translation id="3256316712990552818">In Chromium kopiert</translation>
-<translation id="3413120535237193088">Melden Sie sich in Chromium an, um Ihre Lesezeichen auf allen Ihren Geräten zu haben.</translation>
 <translation id="3605252743693911722">Melden Sie sich in Chromium an, um Daten wie Lesezeichen und Passwörter auf allen Ihren Geräten zu nutzen.</translation>
 <translation id="3805899903892079518">Chromium hat keinen Zugriff auf Ihre Fotos und Videos. Aktivieren Sie den Zugriff unter "iOS-Einstellungen &gt; Datenschutz &gt; Fotos".</translation>
-<translation id="4024541897090868497">Melden Sie sich in Chromium an, um Ihre Tabs auf sämtlichen Geräten zu haben.</translation>
 <translation id="4157467675761413638">Chromium-Tipp: Wenn Sie weitere Tab-Optionen sehen möchten, halten Sie die Schaltfläche "Tabs anzeigen" in der Symbolleiste gedrückt. Sie finden die Leiste unten oder oben auf dem Bildschirm.</translation>
 <translation id="4241912885070669028">Sie melden sich von einem Konto ab, das von <ph name="SIGNOUT_MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chromium-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="4555020257205549924">Wenn diese Funktion aktiviert ist, haben Sie in Chromium die Möglichkeit, Seiten in anderen Sprachen mithilfe von Google Übersetzer zu übersetzen. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
index eb988cb0..5336f62 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Το Chromium δεν μπορεί να χρησιμοποιήσει την κάμερά σας επειδή χρησιμοποιείται από μια άλλη εφαρμογή</translation>
 <translation id="2915596697727466327">Το Chromium χρησιμοποιεί το Face ID, για να διασφαλίσει την εξουσιοδοτημένη πρόσβαση στους κωδικούς πρόσβασής σας.</translation>
 <translation id="3256316712990552818">Αντιγράφηκε στο Chromium</translation>
-<translation id="3413120535237193088">Για να εμφανίζονται οι σελιδοδείκτες σε όλες τις συσκευές σας, συνδεθείτε στο Chromium.</translation>
 <translation id="3605252743693911722">Συνδεθείτε στο Chromium, για να έχετε τους σελιδοδείκτες, τους κωδικούς πρόσβασης κ.ά. σε όλες τις συσκευές σας.</translation>
 <translation id="3805899903892079518">Το Chromium δεν έχει πρόσβαση σε φωτογραφίες ή βίντεό σας. Ενεργ. πρόσβασης στις Ρυθμίσεις iOS &gt; Απόρρητο &gt; Φωτογραφίες.</translation>
-<translation id="4024541897090868497">Για να εμφανίζονται οι ρυθμίσεις σας σε όλες τις συσκευές σας, συνδεθείτε στο Chromium</translation>
 <translation id="4157467675761413638">Συμβουλή για το Chromium. Για περισσότερες επιλογές για τις καρτέλες, πατήστε παρατεταμένα το κουμπί "Εμφάνιση καρτελών" στη γραμμή εργαλείων, η οποία βρίσκεται στο κάτω τμήμα ή στην κορυφή της οθόνης σας.</translation>
 <translation id="4241912885070669028">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="SIGNOUT_MANAGED_DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας Chromium από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
 <translation id="4555020257205549924">Όταν αυτή η λειτουργία είναι ενεργοποιημένη, το Chromium θα προσφέρει τη μετάφραση σελίδων που είναι γραμμένες σε άλλες γλώσσες χρησιμοποιώντας τη Μετάφραση Google. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
index 56b395ed..fd670a6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium can't use your camera because it's in use by another application</translation>
 <translation id="2915596697727466327">Chromium uses Face ID to ensure authorised access to your passwords.</translation>
 <translation id="3256316712990552818">Copied to Chromium</translation>
-<translation id="3413120535237193088">To get your bookmarks on all your devices, sign in to Chromium.</translation>
 <translation id="3605252743693911722">Sign in to Chromium to get your bookmarks, passwords and more on all your devices.</translation>
 <translation id="3805899903892079518">Chromium does not have access to your photos or videos. Enable access in iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4024541897090868497">To get your tabs on all your devices, sign in to Chromium.</translation>
 <translation id="4157467675761413638">Chromium tip. For more tab options, press and hold the Show Tabs button in the toolbar, which is at the bottom or top of your screen.</translation>
 <translation id="4241912885070669028">You are signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN" />. This will delete your Chromium data from this device, but your data will remain in your Google Account.</translation>
 <translation id="4555020257205549924">When this feature is turned on, Chromium will offer to translate pages written in other languages using Google Translate. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
index e71bcaaa..86c61a4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium no puede utilizar tu cámara porque la está usando otra aplicación</translation>
 <translation id="2915596697727466327">Chromium usa Face ID para garantizar el acceso autorizado a tus contraseñas.</translation>
 <translation id="3256316712990552818">Se copió en Chromium.</translation>
-<translation id="3413120535237193088">Para obtener tus favoritos en todos tus dispositivos, accede a Chromium.</translation>
 <translation id="3605252743693911722">Accede a tu cuenta en Chromium para obtener tus favoritos, contraseñas y mucho más desde todos tus dispositivos.</translation>
 <translation id="3805899903892079518">Chromium no tiene acceso a tus fotos o videos. Habilita el acceso en Configuración de iOS &gt; Privacidad &gt; Fotos.</translation>
-<translation id="4024541897090868497">Para obtener tus pestañas en todos los dispositivos, accede a Chromium.</translation>
 <translation id="4157467675761413638">Sugerencia de Chromium: Para obtener más opciones de pestañas, mantén presionado el botón Mostrar pestañas de la barra de herramientas, que se encuentra en la parte inferior o superior de la pantalla.</translation>
 <translation id="4241912885070669028">Estás saliendo de una cuenta que administra <ph name="SIGNOUT_MANAGED_DOMAIN" />. Con esta acción, tus datos de Chromium se borrarán en este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4555020257205549924">Si activas esta función, Chromium te preguntará si deseas usar Google Traductor para traducir páginas en otros idiomas. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
index 24cfb37..5b978e0b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium no puede utilizar la cámara porque la está usando otra aplicación</translation>
 <translation id="2915596697727466327">Chromium usa Face ID para garantizar el acceso autorizado a tus contraseñas.</translation>
 <translation id="3256316712990552818">Copiada a Chromium</translation>
-<translation id="3413120535237193088">Inicia sesión en Chromium para ver tus marcadores en todos tus dispositivos.</translation>
 <translation id="3605252743693911722">Inicia sesión en Chromium para sincronizar los marcadores, las contraseñas y mucho más en todos tus dispositivos.</translation>
 <translation id="3805899903892079518">Chromium no puede acceder a tus fotos y vídeos (para permitirlo, ve a Ajustes de iOS &gt; Privacidad &gt; Fotos).</translation>
-<translation id="4024541897090868497">Inicia sesión en Chromium para ver tus pestañas en todos tus dispositivos.</translation>
 <translation id="4157467675761413638">Consejo sobre Chromium. Para ver más opciones de pestañas, mantén pulsado el botón Mostrar pestañas en la barra de herramientas, que se encuentra en la parte inferior o superior de la pantalla.</translation>
 <translation id="4241912885070669028">Estás cerrando sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tus datos de Chromium se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4555020257205549924">Si esta función está activada, Chromium ofrecerá la posibilidad de traducir páginas escritas en otros idiomas con el Traductor de Google. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
index f4d0d15..44976c40 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium ei saa kaamerat kasutada, kuna seda kasutab muu rakendus</translation>
 <translation id="2915596697727466327">Chromium kasutab paroolide volitatud juurdepääsu kontrollimiseks Face ID-d.</translation>
 <translation id="3256316712990552818">Kopeeritud Chromiumi</translation>
-<translation id="3413120535237193088">Kõikidesse seadmetesse järjehoidjate hankimiseks logige Chromiumisse sisse.</translation>
 <translation id="3605252743693911722">Logige Chromiumi sisse, et kõikides oma seadmetes kasutada järjehoidjaid, paroole ja muud.</translation>
 <translation id="3805899903892079518">Chromiumil pole juurdepääsu fotodele ega videotele. Lubage iOS-is juurdepääs valikutega Seaded &gt; Privaatsus &gt; Fotod.</translation>
-<translation id="4024541897090868497">Kõikidesse seadmetesse vahelehtede hankimiseks logige Chromiumi sisse.</translation>
 <translation id="4157467675761413638">Chromiumi nõuanne. Vahelehtede muude valikute vaatamiseks hoidke all ekraani üla- või alaosas tööriistaribal olevat nuppu Kuva vahelehed.</translation>
 <translation id="4241912885070669028">Logite välja kontolt, mida haldab <ph name="SIGNOUT_MANAGED_DOMAIN" />. Selle tulemusel kustutatakse seadmes olevad Chromiumi andmed, kuid need jäävad alles teie Google'i kontole.</translation>
 <translation id="4555020257205549924">Kui see funktsioon on sisse lülitatud, pakub Chromium võimalust tõlkida teistes keeltes kirjutatud lehti Google'i tõlke abil. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
index efe1f6a6e..f7aff9c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">‏Chromium نمی‌تواند از دوربین استفاده کند زیرا برنامه دیگری از آن استفاده می‌کند</translation>
 <translation id="2915596697727466327">‏Chromium برای اطمینان از دسترسی مجاز به گذرواژه‌هایتان، از «شناسه تشخیص چهره» استفاده می‌کند.</translation>
 <translation id="3256316712990552818">‏به Chromium کپی شد</translation>
-<translation id="3413120535237193088">‏برای اینکه نشانک‌ها را در همه دستگاه‌هایتان دریافت کنید، به سیستم Chromium وارد شوید.</translation>
 <translation id="3605252743693911722">‏برای دریافت نشانک‌ها، گذرواژه‌ها و موارد دیگر در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید.</translation>
 <translation id="3805899903892079518">‏Chromium به عکس‌ها یا ویدیوهای شما دسترسی ندارد. با رفتن به تنظیمات iOS &gt; حریم خصوصی &gt; عکس‌ها دسترسی را فعال کنید.</translation>
-<translation id="4024541897090868497">‏برای دریافت برگه‌هایتان در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید.</translation>
 <translation id="4157467675761413638">‏نکته Chromium. برای دیدن گزینه‌های بیشتر برگه، دکمه «نمایش برگه‌ها» را در نوارابزار (در پایین یا بالای صفحه است) فشار دهید و نگه دارید.</translation>
 <translation id="4241912885070669028">‏هم‌اکنون درحال خارج شدن از حسابی هستید که توسط <ph name="SIGNOUT_MANAGED_DOMAIN" /> مدیریت می‌شود. با این کار، داده‌های Chromium شما از این دستگاه حذف می‌شوند اما همچنان در حساب Google شما باقی می‌مانند.</translation>
 <translation id="4555020257205549924">‏وقتی این قابلیت روشن است، Chromium ترجمه صفحات نوشته‌شده به سایر زبان‌ها را با استفاده از مترجم Google پیشنهاد می‌دهد. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
index f1e6815..81acc66 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium ei voi käyttää kameraa, koska se on toisen sovelluksen käytössä.</translation>
 <translation id="2915596697727466327">Chromium varmistaa Face ID:llä, että sinulla on lupa käyttää salasanoja.</translation>
 <translation id="3256316712990552818">Kopioitiin Chromiumiin.</translation>
-<translation id="3413120535237193088">Kirjaudu sisään Chromiumiin, niin voit käyttää kirjanmerkkejäsi kaikilla laitteilla.</translation>
 <translation id="3605252743693911722">Kirjaudu sisään Chromiumiin, jotta voit käyttää kirjanmerkkejäsi, salasanojasi ja muita asetuksiasi kaikilla laitteillasi.</translation>
 <translation id="3805899903892079518">Chromium ei voi käyttää kuviasi tai videoitasi. Anna käyttöoikeus kohdassa iOS-asetukset &gt; Tietosuoja &gt; Kuvat.</translation>
-<translation id="4024541897090868497">Kirjaudu sisään Chromiumiin, niin voit käyttää välilehtiäsi kaikilla laitteilla.</translation>
 <translation id="4157467675761413638">Chromium-vinkki: Voit avata välilehtien lisäasetukset painamalla ylä- tai alapalkissa olevaa Näytä välilehdet ‑painiketta pitkään.</translation>
 <translation id="4241912885070669028">Olet kirjautumassa ulos verkkotunnuksen <ph name="SIGNOUT_MANAGED_DOMAIN" /> hallitsemalta tililtä. Chromium-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation>
 <translation id="4555020257205549924">Kun tämä ominaisuus on käytössä, Chromium tarjoaa vierailla kielillä kirjoitettujen sivujen käännöksiä Google Kääntäjän kautta. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
index ea3d2ef..b626082 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Hindi magamit ng Chromium ang iyong camera ngayon dahil ginagamit ito sa isa pang application</translation>
 <translation id="2915596697727466327">Gumagamit ang Chromium ng Face ID para tiyakin ang awtorisadong pag-access sa iyong mga password.</translation>
 <translation id="3256316712990552818">Kinopya sa Chromium</translation>
-<translation id="3413120535237193088">Para mailagay ang iyong mga bookmark sa lahat ng device mo, mag-sign in sa Chromium.</translation>
 <translation id="3605252743693911722">Mag-sign in sa Chromium upang makuha ang iyong mga bookmark, password, at higit pa sa lahat ng device mo.</translation>
 <translation id="3805899903892079518">Walang access ang Chromium sa mga larawan o video mo. I-enable ang access sa Mga Setting ng iOS &gt; Privacy &gt; Mga Larawan.</translation>
-<translation id="4024541897090868497">Upang makuha ang iyong mga tab sa lahat ng device mo, mag-sign in sa Chromium</translation>
 <translation id="4157467675761413638">Tip sa Chromium. Para sa higit pang opsyon sa tab, pindutin nang matagal ang button na Ipakita ang Mga Tab sa toolbar, na nasa ibaba o itaas ng iyong screen.</translation>
 <translation id="4241912885070669028">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="SIGNOUT_MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chromium sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation>
 <translation id="4555020257205549924">Kapag naka-on ang feature na ito, mag-aalok ang Chromium na magsalin ng mga page na nakasulat sa ibang mga wika gamit ang Google Translate. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></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 52e6b8cb..910407f5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium ne peut pas utiliser l'appareil photo, car celui-ci est utilisé par une autre application</translation>
 <translation id="2915596697727466327">Chromium utilise Face ID pour autoriser l'accès à vos mots de passe.</translation>
 <translation id="3256316712990552818">Copié dans Chromium</translation>
-<translation id="3413120535237193088">Connectez-vous à Chromium pour synchroniser vos favoris sur tous vos appareils.</translation>
 <translation id="3605252743693911722">Connectez-vous à Chromium pour accéder à vos favoris, mots de passe et bien plus sur tous vos appareils.</translation>
 <translation id="3805899903892079518">Chromium n'a pas accès à vos photos ni à vos vidéos. Activez l'accès dans iOS via Réglages &gt; Confidentialité &gt; Photos.</translation>
-<translation id="4024541897090868497">Connectez-vous à Chromium pour synchroniser vos onglets sur tous vos appareils.</translation>
 <translation id="4157467675761413638">Astuce Chromium. Pour afficher plus d'options de l'onglet, appuyez de manière prolongée sur le bouton "Afficher les onglets" situé dans la barre d'outils affichée dans la partie inférieure ou supérieure de l'écran.</translation>
 <translation id="4241912885070669028">Vous vous déconnectez d'un compte géré par <ph name="SIGNOUT_MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chromium de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
 <translation id="4555020257205549924">Lorsque cette fonctionnalité est activée dans Chromium, un message s'affiche pour vous proposer que les pages de ce site rédigées dans d'autres langues soient traduites à l'aide de Google Traduction. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
index d8e845c..97b70883 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium, તમારા કૅમેરાનો ઉપયોગ કરી શકતું નથી કારણ કે તે બીજી ઍપ્લિકેશન દ્વારા ઉપયોગમાં છે</translation>
 <translation id="2915596697727466327">તમારા પાસવર્ડની અધિકૃત ઍક્સેસની ખાતરી કરવા માટે, Chromium ચહેરાના IDનો ઉપયોગ કરે છે.</translation>
 <translation id="3256316712990552818">Chromium પર કૉપી કરી</translation>
-<translation id="3413120535237193088">તમારા તમામ ઉપકરણો પર તમારા બુકમાર્ક્સ મેળવવા માટે, Chromium માં સાઇન ઇન કરો.</translation>
 <translation id="3605252743693911722">તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક, પાસવર્ડ અને બીજુ ઘણું મેળવવા માટે Chromiumમાં સાઇન ઇન કરો.</translation>
 <translation id="3805899903892079518">Chromiumને તમારા ફોટા અથવા વીડિયોનો ઍક્સેસ નથી. iOS સેટિંગ &gt; પ્રાઇવસી &gt; ફોટામાં ઍક્સેસને ચાલુ કરો.</translation>
-<translation id="4024541897090868497">તમારા બધા ઉપકરણો પર તમારા ટૅબ મેળવવા માટે, Chromiumમાં સાઇન ઇન કરો.</translation>
 <translation id="4157467675761413638">Chromium ટિપ. વધુ ટૅબ વિકલ્પો માટે, તમારી સ્ક્રીનના તળિયે અથવા ટોચે આવેલા ટૂલબારમાંના 'ટૅબ બતાવો' બટનને દબાવી રાખો.</translation>
 <translation id="4241912885070669028">તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા મેનેજ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો. આ તમારા Chromium ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે, પરંતુ તમારો ડેટા તમારા Google એકાઉન્ટમાં રહેશે.</translation>
 <translation id="4555020257205549924">જ્યારે આ સુવિધા ચાલુ કરી હોય, ત્યારે Chromium, Google અનુવાદનો ઉપયોગ કરીને અન્ય ભાષાઓમાં લખેલા પૃષ્ઠોના અનુવાદની ઓફર કરશે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
index 8142774..ace8621 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -19,10 +19,8 @@
 <translation id="2730884209570016437">क्रोमियम आपके कैमरे का उपयोग नहीं कर सकता क्योंकि दूसरा ऐप्लिकेशन उसका उपयोग कर रहा है</translation>
 <translation id="2915596697727466327">आपके पासवर्ड का अधिकृत ऐक्सेस पक्का करने के लिए, क्रोमियम 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation>
 <translation id="3256316712990552818">क्रोमियम पर कॉपी किया गया</translation>
-<translation id="3413120535237193088">अपने सभी डिवाइस पर बुकमार्क पाने के लिए, क्रोमियम में साइन इन करें.</translation>
 <translation id="3605252743693911722">अपने सभी डिवाइस पर बुकमार्क, पासवर्ड और ज़्यादा चीज़ें पाने के लिए क्रोमियम में साइन इन करें.</translation>
 <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; गोपनीयता &gt; फ़ोटो में एक्सेस चालू करें.</translation>
-<translation id="4024541897090868497">अपने सभी डिवाइस पर अ टैब पाने के लिए, क्रोमियम में साइन इन करें.</translation>
 <translation id="4157467675761413638">क्रोमियम के लिए सलाह. ज़्यादा टैब विकल्पोंं के लिए, टूलबार में 'टैब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन में सबसे नीचे या सबसे ऊपर होगा.</translation>
 <translation id="4241912885070669028">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> से प्रबंधित खाते से साइन ऑउट कर रहे हैं. इससे आपका क्रोमियम डेटा इस डिवाइस से मिट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
index 319ebb09..623bc6b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium ne može upotrebljavati vaš fotoaparat jer ga upotrebljava neka druga aplikacija</translation>
 <translation id="2915596697727466327">Chromium upotrebljava Face ID radi sprječavanja neovlaštenog pristupa vašim zaporkama.</translation>
 <translation id="3256316712990552818">Kopirano na Chromium</translation>
-<translation id="3413120535237193088">Da biste imali svoje oznake na svim svojim uređajima, prijavite se na Chromium.</translation>
 <translation id="3605252743693911722">Prijavite se na Chromium kako bi ste mogli pristupati oznakama, zaporkama i ostalom na svim svojim uređajima.</translation>
 <translation id="3805899903892079518">Chromium nema pristup fotografijama ni videozapisima. Omogućite pristup u Postavkama iOS-a &gt; Privatnost &gt; Fotografije.</translation>
-<translation id="4024541897090868497">Da biste imali svoje kartice na svim svojim uređajima, prijavite se na Chromium.</translation>
 <translation id="4157467675761413638">Savjet za Chromium. Za više opcija kartice pritisnite i držite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
 <translation id="4241912885070669028">Odjavljujete se s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. Vaši podaci na Chromiumu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
 <translation id="4555020257205549924">Kada je ta značajka uključena, Chromium će ponuditi prijevod stranica napisanih na drugim jezicima pomoću Google prevoditelja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
index 69eb896..fbd0a65 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">A Chromium nem tudja használni a kamerát, mivel egy másik alkalmazás használja</translation>
 <translation id="2915596697727466327">A Chromium a Face ID segítségével ellenőrzi a jogosultságot a jelszavakhoz való hozzáféréshez.</translation>
 <translation id="3256316712990552818">A Chromiumra másolva</translation>
-<translation id="3413120535237193088">Ha az összes eszközén szeretné elérni könyvjelzőit, jelentkezzen be a Chromiumba.</translation>
 <translation id="3605252743693911722">Jelentkezzen be a Chromiumba, hogy az összes eszközén hozzáférhessen könyvjelzőihez, jelszavaihoz és más beállításaihoz.</translation>
 <translation id="3805899903892079518">A Chromium nem fér hozzá az Ön képeihez és videóihoz. Engedélyezés iOS-en: Beállítások &gt; Adatvédelem &gt; Fényképek.</translation>
-<translation id="4024541897090868497">Ha az összes eszközén szeretne hozzáférni lapjaihoz, jelentkezzen be a Chromiumba.</translation>
 <translation id="4157467675761413638">Tipp a Chromium használatához. A további lapbeállításokhoz tartsa lenyomva az eszköztárban lévő Lapok megjelenítése gombot, amely a képernyő alsó vagy felső részén található.</translation>
 <translation id="4241912885070669028">Kijelentkezik egy <ph name="SIGNOUT_MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chromium-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation>
 <translation id="4555020257205549924">Ha a funkció be van kapcsolva, a Chromium felajánlja a más nyelveken írt oldalak lefordítását a Google Fordító segítségével. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
index 2f4589d7..9f257ec 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium tidak dapat menggunakan kamera karena sedang digunakan aplikasi lain</translation>
 <translation id="2915596697727466327">Chromium menggunakan Face ID untuk memastikan akses terotorisasi ke sandi Anda.</translation>
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
-<translation id="3413120535237193088">Agar bookmark tersedia di semua perangkat Anda, masuk ke Chromium.</translation>
 <translation id="3605252743693911722">Login ke Chromium untuk mendapatkan bookmark, sandi, dan lainnya di semua perangkat Anda.</translation>
 <translation id="3805899903892079518">Chromium tidak memiliki akses ke foto atau video Anda. Izinkan akses di iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4024541897090868497">Agar tab tersedia di semua perangkat Anda, login ke Chromium.</translation>
 <translation id="4157467675761413638">Tips Chromium. Untuk opsi tab lainnya, tekan dan tahan tombol Tampilkan Tab di toolbar, yang terdapat di bagian bawah atau atas layar.</translation>
 <translation id="4241912885070669028">Anda keluar dari akun yang dikelola oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chromium dari perangkat, namun data Anda akan tetap tersedia di Akun Google.</translation>
 <translation id="4555020257205549924">Saat fitur ini diaktifkan, Chromium akan menawarkan untuk menerjemahkan halaman yang ditulis dalam bahasa lain menggunakan Google Terjemahan. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
index 52f742a..ae8121a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium non può utilizzare la videocamera perché è attualmente utilizzata da un'altra applicazione</translation>
 <translation id="2915596697727466327">Chromium utilizza Face ID per garantire accesso autorizzato alle tue password.</translation>
 <translation id="3256316712990552818">Copiata in Chromium</translation>
-<translation id="3413120535237193088">Accedi a Chromium per trovare i tuoi preferiti su tutti i dispositivi.</translation>
 <translation id="3605252743693911722">Accedi a Chromium per trovare i tuoi preferiti, le password e altre impostazioni su tutti i tuoi dispositivi.</translation>
 <translation id="3805899903892079518">Chromium non ha accesso alle tue foto o ai tuoi video. Attiva l'accesso in Impostazioni iOS &gt; Privacy &gt; Foto.</translation>
-<translation id="4024541897090868497">Accedi a Chromium per trovare le tue schede su tutti i dispositivi.</translation>
 <translation id="4157467675761413638">Suggerimento per Chromium. Per vedere più opzioni sulla scheda, tieni premuto il pulsante Mostra schede della barra degli strumenti, che si trova nella parte inferiore o superiore della schermata.</translation>
 <translation id="4241912885070669028">Stai per uscire da un account gestito da <ph name="SIGNOUT_MANAGED_DOMAIN" />. I dati di Chromium verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
 <translation id="4555020257205549924">Quando questa funzione è attiva, Chromium si offre di tradurre le pagine scritte in altre lingue utilizzando Google Traduttore. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
index 674661d5..ab64e4d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">‏Chromium לא יכול להשתמש במצלמה כי אפליקציה אחרת משתמשת בה</translation>
 <translation id="2915596697727466327">‏Chromium משתמש ב-Face ID כדי להבטיח גישה מאושרת לסיסמאות שלך.</translation>
 <translation id="3256316712990552818">‏הועתק אל Chromium</translation>
-<translation id="3413120535237193088">‏יש להיכנס ל-Chromium כדי לקבל גישה אל הסימניות שלך בכל המכשירים.</translation>
 <translation id="3605252743693911722">‏יש להיכנס אל Chromium כדי לקבל גישה אל הסימניות, הסיסמאות ונתונים נוספים בכל המכשירים שלך.</translation>
 <translation id="3805899903892079518">‏ל-Chromium אין גישה לתמונות או לסרטונים שלך. אפשר גישה ב'הגדרות iOS' &gt; 'פרטיות' &gt; 'תמונות'.</translation>
-<translation id="4024541897090868497">‏כדי לקבל גישה לכרטיסיות שלך בכל המכשירים, יש להיכנס ל-Chromium.</translation>
 <translation id="4157467675761413638">‏טיפ למשתמשי Chromium. כדי לקבל יותר אפשרויות של כרטיסיות, יש ללחוץ לחיצה ארוכה על הלחצן 'הצגת כרטיסיות' בסרגל הכלים, שנמצא בחלק התחתון או העליון של המסך.</translation>
 <translation id="4241912885070669028">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="SIGNOUT_MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chromium מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="4555020257205549924">‏כשהתכונה הזו פועלת, Chromium יציע לתרגם באמצעות Google Translate דפים שנכתבו בשפות אחרות‏. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
index d087dd9..c512c242 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">カメラは別のアプリが使用中のため、Chromium では使用できません</translation>
 <translation id="2915596697727466327">Chromium では Face ID の使用により、パスワードへの認証されたアクセスのみが許可されます。</translation>
 <translation id="3256316712990552818">Chromium にコピー済み</translation>
-<translation id="3413120535237193088">お使いのどのデバイスでも同じブックマークを使用するには、Chromium にログインします。</translation>
 <translation id="3605252743693911722">Chromium にログインすれば、ブックマーク、パスワード、その他の設定をどのデバイスからでもご利用いただけます。</translation>
 <translation id="3805899903892079518">Chromium で写真または動画にアクセスできません。iOS の [設定] &gt; [プライバシー] &gt; [写真] でアクセスを有効にしてください。</translation>
-<translation id="4024541897090868497">お使いのどのデバイスでも同じタブを使用するには、Chromium にログインします。</translation>
 <translation id="4157467675761413638">Chromium の使い方のヒント: タブのオプションをさらに表示するには、画面の下部または上部のツールバーにある [タブを表示] を押し続けます。</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトしようとしています。ログアウトすると、Chromium データはこのデバイスから削除されますが、Google アカウントには残ります。</translation>
 <translation id="4555020257205549924">この機能を有効にすると、外国語のページを開いたときに翻訳ツールが表示されます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
index cc5cd40..459c141 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬೇರೆ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಬಳಸುತ್ತಿರುವ ಕಾರಣ Chromium ಗೆ ಅದನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="2915596697727466327">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಅಧಿಕೃತ ಪ್ರವೇಶವನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು, Chromium ಮುಖದ ಐಡಿಯನ್ನು ಬಳಸುತ್ತದೆ.</translation>
 <translation id="3256316712990552818">Chromium ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation>
-<translation id="3413120535237193088">ನಿಮ್ಮ ಎಲ್ಲ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="3605252743693911722">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಡೆದುಕೊಳ್ಳಲು Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="3805899903892079518">Chromium ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೋಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. iOS ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಫೋಟೋಗಳಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
-<translation id="4024541897090868497">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="4157467675761413638">Chromium ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ, ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವಿರಿ. ಇದು ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="4555020257205549924">ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆನ್ ಮಾಡಿದಾಗ, Google ಅನುವಾದ ಬಳಸಿಕೊಂಡು ಬೇರೆ ಭಾಷೆಗಳಲ್ಲಿ ಬರೆದ ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Chromium ಅವಕಾಶ ನೀಡುತ್ತದೆ. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
index 0736ab8fe..43154fa 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">다른 애플리케이션에서 카메라를 사용하고 있으므로 Chromium에서 카메라를 사용할 수 없습니다.</translation>
 <translation id="2915596697727466327">Chromium은 얼굴 ID를 사용하여 승인된 사용자만 비밀번호에 액세스할 수 있도록 합니다.</translation>
 <translation id="3256316712990552818">Chromium에 복사됨</translation>
-<translation id="3413120535237193088">어느 기기에서나 내 북마크를 사용하려면 Chromium에 로그인하세요.</translation>
 <translation id="3605252743693911722">Chromium에 로그인하여 모든 기기에서 내 북마크, 비밀번호 등을 사용하세요.</translation>
 <translation id="3805899903892079518">Chromium에서 사진 또는 동영상에 액세스할 수 없습니다. 'iOS 설정 &gt; 개인정보 보호 &gt; 사진'에서 액세스를 허용하세요.</translation>
-<translation id="4024541897090868497">어느 기기에서나 내 탭을 사용하려면 Chromium에 로그인하세요.</translation>
 <translation id="4157467675761413638">Chromium 도움말. 더 많은 탭 옵션을 보려면 화면 하단이나 상단에 있는 툴바에서 탭 표시 버튼을 길게 누릅니다.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chromium 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="4555020257205549924">이 기능을 사용하면 Chromium에서 Google 번역을 사용하여 외국어로 작성된 페이지를 번역합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
index bbab67c7..2cc3807 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">„Chromium“ negali naudoti fotoaparato, nes jį naudoja kita programa</translation>
 <translation id="2915596697727466327">„Chromium“ naudoja „Face ID“, kad užtikrintų teisėtą prieigą prie slaptažodžių.</translation>
 <translation id="3256316712990552818">Nukopijuota į „Chromium“</translation>
-<translation id="3413120535237193088">Prisijunkite prie „Chromium“, kad pasiektumėte žymes visuose įrenginiuose.</translation>
 <translation id="3605252743693911722">Prisijunkite prie „Chromium“, kad galėtumėte naudoti žymes, slaptažodžius ir kitus nustatymus visuose įrenginiuose.</translation>
 <translation id="3805899903892079518">„Chromium“ nepasiekia nuotraukų ar vaizdo įr. Įgalinkite prieigą apsil. „iOS“ nustatymai“ &gt; „Privatumas“ &gt; „Nuotraukos“.</translation>
-<translation id="4024541897090868497">Prisijunkite prie „Chromium“, kad pasiektumėte skirtukus visuose įrenginiuose.</translation>
 <translation id="4157467675761413638">„Chromium“ patarimas. Jei reikia daugiau skirtukų parinkčių, paspauskite ir palaikykite mygtuką „Rodyti skirtukus“ įrankių juostoje, kuri yra ekrano apačioje arba viršuje.</translation>
 <translation id="4241912885070669028">Atsijungiate nuo paskyros, kurią valdo <ph name="SIGNOUT_MANAGED_DOMAIN" />. „Chromium“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation>
 <translation id="4555020257205549924">Kai ši funkcija bus įjungta, „Chromium“ siūlys versti kitomis kalbomis parašytus puslapius naudojant „Google“ vertėją. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
index bcf9408..05de74e0 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium nevar izmantot kameru, jo to izmanto cita lietojumprogramma.</translation>
 <translation id="2915596697727466327">Chromium izmanto Face ID, lai jūsu parolēm varētu piekļūt tikai pilnvarotas personas.</translation>
 <translation id="3256316712990552818">Nokopēta pārlūkā Chromium</translation>
-<translation id="3413120535237193088">Pierakstieties pārlūkā Chromium, lai grāmatzīmes būtu pieejamas visās jūsu ierīcēs.</translation>
 <translation id="3605252743693911722">Pierakstieties pārlūkā Chromium, lai iegūtu savas grāmatzīmes, paroles un citu saturu visās savās ierīcēs.</translation>
 <translation id="3805899903892079518">Chromium nevar piekļūt jūsu fotoattēliem un videoklipiem. Iespējojiet piekļuvi: iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4024541897090868497">Pierakstieties pārlūkā Chromium, lai jūsu cilnes būtu pieejamas visās jūsu ierīcēs.</translation>
 <translation id="4157467675761413638">Chromium padoms. Lai iegūtu vairāk ciļņu iespēju, rīkjoslā, kas atrodas ekrāna apakšdaļā vai augšdaļā, nospiediet un turiet pogu Rādīt cilnes.</translation>
 <translation id="4241912885070669028">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />. Izrakstoties Chromium dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
 <translation id="4555020257205549924">Ja šī funkcija ir ieslēgta, Chromium piedāvā tulkot citās valodās rakstītas lapas, izmantojot Google tulkotāju. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</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 075a342d..b537304 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">നിങ്ങളുടെ ക്യാമറ നിലവിൽ മറ്റൊരു അപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്നതിനാൽ Chromium-ത്തിന് അത് ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="2915596697727466327">നിങ്ങളുടെ പാസ്‌വേഡുകളിലേക്കുള്ള അംഗീകൃത ആക്‌സസ് ഉറപ്പാക്കാൻ Chromium, ഫേസ് ഐഡി ഉപയോഗിക്കുന്നു.</translation>
 <translation id="3256316712990552818">Chromium-ലേക്ക് പകർത്തി</translation>
-<translation id="3413120535237193088">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകൾ ലഭിക്കാൻ, Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3605252743693911722">നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകളും  ‌പാസ്‌വേഡുകളും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും ലഭ്യമാക്കുന്നതിന് Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
-<translation id="4024541897090868497">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ടാബുകൾ ലഭിക്കാൻ, Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="4157467675761413638">Chromium നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ 'ടാബ് കാണിക്കുക' ബട്ടൺ അമർത്തിപ്പിടിക്കുക.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chromium വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="4555020257205549924">ഈ ഫീച്ചർ ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chromium ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
index f134e09..ea4c973 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium तुमचा कॅमेरा वापरू शकत नाही कारण दुसरा ॲप्स तो वापरत आहे</translation>
 <translation id="2915596697727466327">तुमच्या पासवर्डच्या परवानगी दिलेल्या ॲक्सेसची खात्री करण्यासाठी Chromium फेस आयडी वापरते.</translation>
 <translation id="3256316712990552818">Chromium वर कॉपी केले</translation>
-<translation id="3413120535237193088">सर्व डिव्हाइसवर तुमचे बुकमार्क प्राप्त करण्यासाठी, Chromium मध्ये साइन इन करा.</translation>
 <translation id="3605252743693911722">तुमच्या सर्व डिव्हाइसवर तुमचे बुकमार्क, पासवर्ड आणि अधिक मिळवण्यासाठी Chromiumमध्ये साइन इन करा.</translation>
 <translation id="3805899903892079518">Chromium ला तुमच्या फोटो किंवा व्हिडिओ अॅक्सेस नाही. iOS सेटिंग्ज&gt; गोपनीयता&gt; फोटो  अॅक्सेस सक्षम करा.</translation>
-<translation id="4024541897090868497">तुमच्या सर्व डीव्हाइसवर तुमचे टॅब मिळवण्यासाठी Chromium मध्ये साइन इन करा.</translation>
 <translation id="4157467675761413638">Chromium टीप. अधिक टॅब पर्यायांसाठी, टूलबारवरील टॅब बटण दाखवा दाबा आणि धरून ठेवा, जे तुमच्या स्क्रीनच्या खाली किंवा सर्वात वर असते.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यामधून तुम्ही साइन आउट करीत आहात. हे तुमचा Chromium डेटा या डिव्हाइस वरून हटवेल परंतु तुमचा डेटा आपल्या Google खात्यामध्ये असेल.</translation>
 <translation id="4555020257205549924">हे वैशिष्ट्य चालू केल्यावर, Chromium Google भाषांतर वापरून अन्य भाषामध्ये लिहिलेल्या पृष्ठांचा भाषांतर ऑफर करेल. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
index 5422b1b2..64225f1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium tidak dapat menggunakan kamera anda kerana kamera sedang digunakan oleh aplikasi lain</translation>
 <translation id="2915596697727466327">Chromium menggunakan ID Wajah untuk memastikan akses yang dibenarkan kepada kata laluan anda.</translation>
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
-<translation id="3413120535237193088">Log masuk ke Chromium untuk mendapatkan penanda halaman pada semua peranti anda.</translation>
 <translation id="3605252743693911722">Log masuk ke Chromium untuk mendapatkan penanda halaman, kata laluan anda dan pelbagai lagi pada semua peranti anda.</translation>
 <translation id="3805899903892079518">Chromium tidak mempunyai akses kepada foto atau video anda. Dayakan akses dalam Tetapan iOS &gt; Privasi &gt; Foto.</translation>
-<translation id="4024541897090868497">Log masuk ke Chromium untuk mendapatkan tab anda pada semua peranti anda.</translation>
 <translation id="4157467675761413638">Petua Chromium. Untuk melihat lebih banyak pilihan tab, tekan dan tahan butang Tunjukkan Tab dalam bar alat, yang terletak di bahagian bawah atau atas skrin anda.</translation>
 <translation id="4241912885070669028">Anda mengelog keluar daripada akaun yang diurus oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan memadamkan data Chromium anda daripada peranti ini, tetapi data anda akan kekal dalam akaun Google anda.</translation>
 <translation id="4555020257205549924">Apabila ciri ini dihidupkan, Chromium akan menawarkan untuk menterjemah halaman yang ditulis dalam bahasa lain menggunakan Terjemahan Google. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
index fd99d3c..68a8117 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium kan je camera niet gebruiken omdat deze wordt gebruikt door een andere app</translation>
 <translation id="2915596697727466327">Chromium gebruikt Face ID om geautoriseerde toegang tot je wachtwoorden mogelijk te maken.</translation>
 <translation id="3256316712990552818">Gekopieerd naar Chromium</translation>
-<translation id="3413120535237193088">Log in bij Chromium om al je bladwijzers op al je apparaten te bekijken.</translation>
 <translation id="3605252743693911722">Log in bij Chromium om je bladwijzers, wachtwoorden en meer op al je apparaten te gebruiken.</translation>
 <translation id="3805899903892079518">Chromium heeft geen toegang tot je foto's of video's. Schakel toegang in via iOS-instellingen &gt; Privacy &gt; Foto's.</translation>
-<translation id="4024541897090868497">Log in bij Chromium om al je tabbladen op al je apparaten te bekijken</translation>
 <translation id="4157467675761413638">Chromium-tip. Voor meer tabbladopties tik je, op de werkbalk onder- of bovenaan het scherm, op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
 <translation id="4241912885070669028">Je logt uit van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hierdoor worden je Chromium-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="4555020257205549924">Als deze functie is ingeschakeld, biedt Chromium aan pagina's die zijn geschreven in andere talen te vertalen met Google Translate. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
index e38691f..15efda6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium kan ikke bruke kameraet fordi det brukes av en annen app</translation>
 <translation id="2915596697727466327">Chromium bruker Face ID til å sikre at bare godkjente personer får tilgang til passordene dine.</translation>
 <translation id="3256316712990552818">Kopiert til Chromium</translation>
-<translation id="3413120535237193088">Logg på Chromium for å få bokmerkene dine på alle enhetene du bruker.</translation>
 <translation id="3605252743693911722">Logg på Chromium for å hente blant annet bokmerkene og passordene dine på alle enhetene du bruker.</translation>
 <translation id="3805899903892079518">Chromium har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene &gt; Personvern &gt; Bilder.</translation>
-<translation id="4024541897090868497">For å få fanene dine på alle enhetene du bruker, logg på Chromium.</translation>
 <translation id="4157467675761413638">Chromium-tips. For flere fanealternativer, trykk og hold Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
 <translation id="4241912885070669028">Du logger av en konto som administreres av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Dette fører til at Chromium-dataene dine slettes fra denne enheten, men de blir værende i Google-kontoen din.</translation>
 <translation id="4555020257205549924">Når denne funksjonen er slått på, tilbyr Chromium å oversette sider som er skrevet på andre språk, ved hjelp av Google Oversetter. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
index 3125d87a..af525a5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium nie może użyć aparatu, bo używa go już inna aplikacja</translation>
 <translation id="2915596697727466327">Chromium używa Face ID do autoryzacji dostępu do Twoich haseł.</translation>
 <translation id="3256316712990552818">Skopiowana do Chromium</translation>
-<translation id="3413120535237193088">Aby korzystać ze swoich zakładek na wszystkich urządzeniach, zaloguj się w Chromium.</translation>
 <translation id="3605252743693911722">Zaloguj się w Chromium, by mieć dostęp do swoich zakładek, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation>
 <translation id="3805899903892079518">Chromium nie ma dostępu do Twoich zdjęć ani filmów. Aby włączyć dostęp w iOS, wybierz Ustawienia &gt; Prywatność &gt; Zdjęcia.</translation>
-<translation id="4024541897090868497">Aby korzystać ze swoich kart na wszystkich urządzeniach, zaloguj się w Chromium.</translation>
 <translation id="4157467675761413638">Wskazówka dla użytkowników Chromium. Aby zobaczyć więcej opcji kart, naciśnij i przytrzymaj przycisk Pokaż karty na pasku narzędzi, który znajduje się na dole lub na górze ekranu.</translation>
 <translation id="4241912885070669028">Wylogowujesz się z konta, którym zarządza <ph name="SIGNOUT_MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chromium z tego urządzenia, ale pozostaną one na koncie Google.</translation>
 <translation id="4555020257205549924">Gdy ta funkcja jest włączona, Chromium oferuje tłumaczenie stron w innych językach przy użyciu Tłumacza Google. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
index 0beaf4d..4bb4ae58 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">O Chromium não pode usar a câmera porque ela está sendo usada por outro app</translation>
 <translation id="2915596697727466327">O Chromium usa o Face ID para garantir o acesso autorizado às suas senhas.</translation>
 <translation id="3256316712990552818">Copiado no Chromium</translation>
-<translation id="3413120535237193088">Para ter seus favoritos em todos os seus dispositivos, faça login no Chromium.</translation>
 <translation id="3605252743693911722">Faça login no Chromium para ver seus favoritos, senhas e muito mais em todos os seus dispositivos.</translation>
 <translation id="3805899903892079518">O Chromium não têm acesso às suas fotos ou seus vídeos. Permita o acesso em "Configurações do iOS" &gt; "Privacidade" &gt; "Fotos".</translation>
-<translation id="4024541897090868497">Para ter suas guias em todos os seus dispositivos, faça login no Chromium.</translation>
 <translation id="4157467675761413638">Dica do Chromium. Para ver mais opções de guias, toque no botão "Exibir guias" na barra de ferramentas, na parte superior ou inferior da tela, e mantenha-o pressionado.</translation>
 <translation id="4241912885070669028">Você está saindo de uma conta gerenciada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Os dados do Chromium serão excluídos deste dispositivo, mas permanecerão na sua Conta do Google.</translation>
 <translation id="4555020257205549924">Quando este recurso está ativado, o Chromium oferece a tradução de páginas escritas em outros idiomas usando o Google Tradutor. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
index cf43e1ff..33c982d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">O Chromium não pode utilizar a câmara porque está a ser utilizada por outra aplicação</translation>
 <translation id="2915596697727466327">O Chromium utiliza o Face ID para assegurar o acesso autorizado às suas palavras-passe.</translation>
 <translation id="3256316712990552818">Copiado para o Chromium</translation>
-<translation id="3413120535237193088">Para obter os seus marcadores em todos os dispositivos, inicie sessão no Chromium.</translation>
 <translation id="3605252743693911722">Inicie sessão no Chromium para obter os seus marcadores, palavras-passe e muito mais em todos os dispositivos.</translation>
 <translation id="3805899903892079518">O Chromium não tem acesso aos seus vídeos ou fotos. Ative o acesso nas Definições do iOS &gt; Privacidade &gt; Fotos.</translation>
-<translation id="4024541897090868497">Para obter os seus separadores em todos os dispositivos, inicie sessão no Chromium.</translation>
 <translation id="4157467675761413638">Sugestão para o Chromium: para obter mais opções de separadores, prima sem soltar o botão Mostrar separadores na barra de ferramentas, que se encontra na parte superior ou inferior do ecrã.</translation>
 <translation id="4241912885070669028">Está a terminar sessão numa conta gerida por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chromium deste dispositivo, embora permaneçam na Conta Google.</translation>
 <translation id="4555020257205549924">Se esta funcionalidade estiver ativada, o Chromium oferecer-se-á para traduzir páginas escritas noutros idiomas com o Google Tradutor. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
index 8e78535..712aa1f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium nu poate folosi camera foto, deoarece este folosită de o altă aplicație</translation>
 <translation id="2915596697727466327">Chromium folosește Face ID pentru a asigura accesul autorizat la parolele tale.</translation>
 <translation id="3256316712990552818">Copiat în Chromium</translation>
-<translation id="3413120535237193088">Pentru a accesa marcajele pe toate dispozitivele, conectează-te la Chromium.</translation>
 <translation id="3605252743693911722">Conectează-te la Chromium pentru a accesa marcajele, parolele și altele pe toate dispozitivele tale.</translation>
 <translation id="3805899903892079518">Chromium nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS &gt; Confidențialitate &gt; Fotografii.</translation>
-<translation id="4024541897090868497">Pentru a accesa filele pe toate dispozitivele, conectează-te la Chromium.</translation>
 <translation id="4157467675761413638">Sfat pentru Chromium: pentru mai multe opțiuni de file, apasă lung butonul Afișează filele din bara de instrumente, care se află în partea de sus sau de jos a ecranului.</translation>
 <translation id="4241912885070669028">Te deconectezi de la un cont gestionat de <ph name="SIGNOUT_MANAGED_DOMAIN" />. Astfel, datele Chromium vor fi șterse de pe acest dispozitiv, dar vor rămâne în Contul Google.</translation>
 <translation id="4555020257205549924">Când această funcție este activată, Chromium se va oferi să traducă paginile scrise în alte limbi utilizând Google Traducere. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
index 692cd04..02e75daa 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium не может получить доступ к камере, поскольку она используется другим приложением.</translation>
 <translation id="2915596697727466327">Чтобы исключить несанкционированный доступ к паролям, Chromium использует функцию Face ID.</translation>
 <translation id="3256316712990552818">Скопировано в Chromium</translation>
-<translation id="3413120535237193088">Чтобы получить доступ к закладкам на всех ваших устройствах, войдите в Chromium.</translation>
 <translation id="3605252743693911722">Войдите в Chromium, чтобы синхронизировать закладки, пароли и другую информацию на всех ваших устройствах.</translation>
 <translation id="3805899903892079518">У Chromium нет доступа к вашим фото и видео. Чтобы предоставить его, нажмите "Настройки &gt; Конфиденциальность &gt; Фотографии".</translation>
-<translation id="4024541897090868497">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chromium.</translation>
 <translation id="4157467675761413638">Совет для Chromium. Чтобы открыть дополнительные настройки вкладок, нажмите и удерживайте кнопку "Показать вкладки" на панели инструментов в нижней или верхней части экрана.</translation>
 <translation id="4241912885070669028">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Обратите внимание, что данные Chromium будут удалены с устройства, но сохранятся в аккаунте Google.</translation>
 <translation id="4555020257205549924">Когда эта функция включена, Chrome предлагает перевести страницы с помощью Google Переводчика. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
index eb07872..630f7eb 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium nemôže použiť váš fotoaparát, pretože ho práve používa iná aplikácia</translation>
 <translation id="2915596697727466327">Chromium používa overenie Face ID na zaistenie oprávneného prístupu k heslám.</translation>
 <translation id="3256316712990552818">Skopírovaná do prehliadača Chromium</translation>
-<translation id="3413120535237193088">Ak chcete mať záložky na všetkých zariadeniach, prihláste sa do prehliadača Chromium.</translation>
 <translation id="3605252743693911722">Prihláste sa do prehliadača Chromium a získajte svoje záložky, heslá a ďalšie nastavenia na všetkých zariadeniach.</translation>
 <translation id="3805899903892079518">Chromium nemá prístup k vašim fotkám ani videám. Prístup povoľte v časti Nastavenia systému iOS &gt; Súkromie &gt; Fotky.</translation>
-<translation id="4024541897090868497">Ak chcete mať karty na všetkých zariadeniach, prihláste sa do prehliadača Chromium.</translation>
 <translation id="4157467675761413638">Tip pre Chromium: ďalšie možnosti kariet získate pridržaním tlačidla Zobraziť karty na paneli s nástrojmi, ktorý sa nachádza v dolnej alebo hornej časti obrazovky.</translation>
 <translation id="4241912885070669028">Odhlasujete sa z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Touto akciou odstránite údaje prehliadača Chromium z príslušného zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation>
 <translation id="4555020257205549924">Po zapnutí tejto funkcie bude prehliadač Chromium ponúkať preloženie stránok napísaných v inom jazyku pomocou Prekladača Google. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
index 69891882..c7fb4538 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -21,10 +21,8 @@
 <translation id="2730884209570016437">Chromium ne more uporabljati fotoaparata, ker ga uporablja druga aplikacija</translation>
 <translation id="2915596697727466327">Chromium uporablja funkcijo Face ID za zagotavljanje pooblaščenega dostopa do vaših gesel.</translation>
 <translation id="3256316712990552818">Kopirano v Chromium</translation>
-<translation id="3413120535237193088">Če želite dostopati do zaznamkov v vseh napravah, se prijavite v Chromium.</translation>
 <translation id="3605252743693911722">Prijavite se v Chromium, če želite dostopati do svojih zaznamkov, gesel in drugega v vseh napravah.</translation>
 <translation id="3805899903892079518">Chromium nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4024541897090868497">Če želite dostopati do zavihkov v vseh napravah, se prijavite v Chromium.</translation>
 <translation id="4157467675761413638">Nasvet za Chromium. Če želite več možnosti za zavihke, pridržite gumb za prikaz zavihkov v orodni vrstici na dnu ali vrhu zaslona.</translation>
 <translation id="4241912885070669028">Odjavili se boste iz računa, ki ga upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromiumu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation>
 <translation id="4555020257205549924">Kadar je vklopljena ta funkcija, bo Chromium ponudil, da z uporabo Google Prevajalnika prevede strani v drugih jezikih. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
index 43d8fc4..f8d1d27 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium не може да користи камеру зато што је већ користи друга апликација</translation>
 <translation id="2915596697727466327">Chromium користи Face ID да би лозинкама могле да приступају само овлашћене особе.</translation>
 <translation id="3256316712990552818">Копирана у Chromium</translation>
-<translation id="3413120535237193088">Да би вам обележивачи били доступни на свим уређајима, пријавите се у Chromium.</translation>
 <translation id="3605252743693911722">Пријавите се у Chromium да би вам обележивачи, лозинке и други садржај били доступни на свим уређајима.</translation>
 <translation id="3805899903892079518">Chromium не може да приступа сликама или видео снимцима. Омогућите приступ у iOS Settings (Подешавања iOS-а) &gt; Privacy (Приватност) &gt; Photos (Слике).</translation>
-<translation id="4024541897090868497">Да би вам картице биле доступне на свим уређајима, пријавите се у Chromium.</translation>
 <translation id="4157467675761413638">Савет за Chromium. Ако желите више опција за картице, притисните и задржите дугме Прикажи картице на траци с алаткама, која се налази у дну или у врху екрана.</translation>
 <translation id="4241912885070669028">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />. То ће избрисати Chromium податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
 <translation id="4555020257205549924">Када је ова функција укључена, Chromium ће нудити да преводи странице написане на другим језицима помоћу Google преводиоца. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
index b51789f0..1ea2ef8 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium kan inte använda kameran eftersom den används av en annan app</translation>
 <translation id="2915596697727466327">Chromium använder Face ID för att se till att endast behöriga har åtkomst till lösenorden.</translation>
 <translation id="3256316712990552818">Kopierat till Chromium</translation>
-<translation id="3413120535237193088">Logga in i Chromium om du vill få tillgång till samma bokmärken på alla enheter.</translation>
 <translation id="3605252743693911722">Logga in i Chromium om du vill få dina bokmärken, lösenord med mera på alla dina enheter.</translation>
 <translation id="3805899903892079518">Chromium har inte åtkomst till dina foton eller videor. Aktivera åtkomst i iOS-inställningar &gt; Sekretess &gt; Foton.</translation>
-<translation id="4024541897090868497">Logga in i Chromium om du vill få tillgång till flikarna på alla enheter.</translation>
 <translation id="4157467675761413638">Tips för Chromium. Tryck länge på Visa flikar i verktygsfältet så visas fler flikalternativ. Du hittar verktygsfältet längst ned eller högst upp på skärmen.</translation>
 <translation id="4241912885070669028">Du håller på att logga ut från ett konto som hanteras av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Åtgärden raderar din data i Chromium från den här enheten, men den finns kvar på Google-kontot.</translation>
 <translation id="4555020257205549924">När den här funktionen har aktiverats visas alternativet i Chromium att översätta sidor som är skrivna på andra språk med hjälp av Google Översätt. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
index b7f5318..131daa5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium imeshindwa kutumia kamera yako kwa sababu inatumiwa na programu nyingine</translation>
 <translation id="2915596697727466327">Chromium hutumia Kitambulisho cha Uso ili kuhakikisha ufikiaji uliodhinishwa wa manenosiri yako.</translation>
 <translation id="3256316712990552818">Imenakiliwa kwenye Chromium</translation>
-<translation id="3413120535237193088">Ingia katika Chromium ili upate alamisho zako kwenye vifaa vyako vyote.</translation>
 <translation id="3605252743693911722">Ingia katika Chromium ili upate alamisho, manenosiri yako na mengine mengi kwenye vifaa vyako vyote.</translation>
 <translation id="3805899903892079518">Chromium haina uwezo wa kufikia picha au video zako. Washa uwezo wa kufikia katika Mipangilio ya iOS &gt; Faragha &gt; Picha.</translation>
-<translation id="4024541897090868497">Ingia katika Chromium ili upate vichupo kwenye vifaa vyako vyote.</translation>
 <translation id="4157467675761413638">Kidokezo cha Chromium. Ili upate chaguo zaidi za kichupo, bonyeza na ushikilie kitufe cha Onyesha Vichupo katika upau wa vidhibiti, ambao unapatikana katika sehemu ya chini au juu ya skrini yako.</translation>
 <translation id="4241912885070669028">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chromium kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation>
 <translation id="4555020257205549924">Kipengele hiki kikiwashwa, Chromium itatafsiri kurasa zilizoandikwa kwa lugha nyingine kwa kutumia Google Tafsiri. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></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 9e28e7e..6cb52d3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">கேமராவை மற்றொரு ஆப்ஸ் உபயோகிப்பதால், Chromium அதைப் பயன்படுத்த முடியாது</translation>
 <translation id="2915596697727466327">உங்கள் கடவுச்சொற்களை அணுக அங்கீகரிக்கப்பட்டவர்களை மட்டும் அனுமதிப்பதற்காக Face IDயை Chromium பயன்படுத்துகிறது.</translation>
 <translation id="3256316712990552818">Chromium இல் நகலெடுக்கப்பட்டது</translation>
-<translation id="3413120535237193088">உங்கள் எல்லாச் சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
 <translation id="3605252743693911722">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புக்மார்க்குகள், கடவுச்சொற்கள் மற்றும் பலவற்றைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
 <translation id="3805899903892079518">Chromiumமுக்குப் படங்களையோ வீடியோக்களையோ அணுக அனுமதி இல்லை. அணுகலை 'iOS அமைப்புகள் &gt; தனியுரிமை &gt; படங்கள்' என்பதில் இயக்கவும்.</translation>
-<translation id="4024541897090868497">உங்கள் எல்லாச் சாதனங்களிலும் தாவல்களைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
 <translation id="4157467675761413638">Chromium உதவிக்குறிப்பு. மேலும் அதிக தாவல் விருப்பங்களைப் பார்க்க, கருவிப்பட்டியிலுள்ள ‘தாவல்களைக் காட்டு’ பட்டனை அழுத்திப் பிடிக்கவும். அந்த பட்டன், திரையின் அடிப்பகுதியில் அல்லது மேல்பகுதியில் இருக்கும்.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chromium தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="4555020257205549924">இந்த அம்சம் இயக்கப்பட்டிருக்கும் போது, பிற மொழிகளில் எழுதப்பட்டுள்ள பக்கங்களை Google மொழியாக்கத்தைப் பயன்படுத்தி, உங்கள் மொழியில் மொழிபெயர்த்துக்கொள்ளும் வசதியை Chromium வழங்கும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></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 e345c7be..0f6e69a3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">మీ కెమెరాను మరొక అప్లికేషన్‌ ఉపయోగిస్తున్నందున Chromium దాన్ని ఉపయోగించలేదు</translation>
 <translation id="2915596697727466327">Chromium మీ పాస్‌వర్డ్‌లను ప్రమాణీకరణ ఉన్న వారు మాత్రమే యాక్సెస్ చేస్తున్నట్లు నిర్ధారించడం కోసం ఫేస్ IDని ఉపయోగిస్తుంది.</translation>
 <translation id="3256316712990552818">Chromiumకి కాపీ చేయబడింది</translation>
-<translation id="3413120535237193088">మీ అన్ని పరికరాలలో మీ బుక్‌మార్క్‌లను పొందడానికి, Chromiumకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="3605252743693911722">మీ పరికరాలన్నింటిలో మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌లు మరియు మరిన్నింటిని పొందడానికి Chromiumకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="3805899903892079518">Chromium మీ ఫోటోలు లేదా వీడియోలకు యాక్సెస్‌ను కలిగి లేదు. iOS సెట్టింగ్‌లు &gt; గోప్యత &gt; ఫోటోల్లో యాక్సెస్‌ను ప్రారంభించండి.</translation>
-<translation id="4024541897090868497">మీ అన్ని పరికరాలలో మీ ట్యాబ్‌లను పొందడానికి, Chromiumకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="4157467675761413638">Chromium చిట్కా. మరిన్ని ట్యాబ్ ఎంపికల కోసం, మీ స్క్రీన్‌లో పైన కానీ దిగువన కానీ ఉండే సాధనాల బార్‌లో ట్యాబ్‌లను చూపు బటన్‌ను నొక్కి పట్టుకోండి.</translation>
 <translation id="4241912885070669028">మీరు <ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ అవుట్ చేస్తున్నారు. దీని వలన మీ Chromium డేటా ఈ పరికరం నుండి తొలగించబడుతుంది, కానీ మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="4555020257205549924">ఈ లక్షణం ప్రారంభించినప్పుడు, Chromium ఇతర భాషల్లో వ్రాసిన పేజీలకు Google అనువాదం ఉపయోగించి అనువాదాన్ని ఆఫర్ చేస్తుంది. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
index 60db09a..4da18b3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium ไม่สามารถใช้กล้องถ่ายรูปเนื่องจากแอปพลิเคชันอื่นใช้งานอยู่</translation>
 <translation id="2915596697727466327">Chromium ใช้ Face ID เพื่อยืนยันสิทธิ์ในการเข้าถึงรหัสผ่าน</translation>
 <translation id="3256316712990552818">คัดลอกลงใน Chromium แล้ว</translation>
-<translation id="3413120535237193088">ลงชื่อเข้าใช้ Chromium เพื่อรับบุ๊กมาร์กในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="3605252743693911722">ลงชื่อเข้าใช้ Chromium เพื่อรับบุ๊กมาร์ก รหัสผ่าน และข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="3805899903892079518">Chromium ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดใช้การเข้าถึงได้ในการตั้งค่า iOS &gt; ความเป็นส่วนตัว &gt; รูปภาพ</translation>
-<translation id="4024541897090868497">ลงชื่อเข้าใช้ Chromium เพื่อรับแท็บในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="4157467675761413638">เคล็ดลับสำหรับ Chromium ถ้าต้องการดูตัวเลือกแท็บเพิ่มเติม ให้กดปุ่ม "แสดงแท็บ" ค้างไว้ในแถบเครื่องมือ ซึ่งอยู่ที่ด้านล่างหรือด้านบนของหน้าจอ</translation>
 <translation id="4241912885070669028">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chromium ของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
 <translation id="4555020257205549924">เมื่อเปิดฟีเจอร์นี้ Chromium จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
index 4a356cf2..9c3d6ee 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Kameranız başka bir uygulama tarafından kullanıldığından Chromium, kameranızı kullanamıyor.</translation>
 <translation id="2915596697727466327">Chromium, şifrelerinize yetkili erişim sağlanması için Face ID kullanır.</translation>
 <translation id="3256316712990552818">Chromium'a kopyalandı</translation>
-<translation id="3413120535237193088">Yer işaretlerinizi tüm cihazlarınızda almak için Chromium'da oturum açın.</translation>
 <translation id="3605252743693911722">Tüm cihazlarınızda yer işaretlerinizi, şifrelerinizi almak ve daha pek çok şey yapmak için Chromium'da oturum açın.</translation>
 <translation id="3805899903892079518">Chromium, fotoğraflarınıza veya videolarınıza erişemiyor. iOS Ayarlar &gt; Gizlilik &gt; Fotoğraflar'dan erişimi etkinleştirin.</translation>
-<translation id="4024541897090868497">Sekmelerinize tüm cihazlarınızda ulaşmak için Chromium'da oturum açın.</translation>
 <translation id="4157467675761413638">Chromium için ipucu: Sekmelerle ilgili daha fazla seçenek görmek için ekranınızın altında veya üstünde görünen araç çubuğunda Sekmeleri Göster düğmesini basılı tutun.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chromium verileriniz bu cihazdan silinir, ancak Google hesabınızda kalmaya devam eder.</translation>
 <translation id="4555020257205549924">Bu özellik açık durumdayken Chromium, diğer dillerde yazılmış sayfaları Google Çeviri'yi kullanarak çevirmeyi teklif eder. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
index a0b77ad..720edaff 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium не може використовувати камеру, оскільки її використовує інший додаток</translation>
 <translation id="2915596697727466327">Chromium використовує Face ID, щоб забезпечити авторизований доступ до ваших паролів.</translation>
 <translation id="3256316712990552818">Скопійовано в Chromium</translation>
-<translation id="3413120535237193088">Щоб мати доступ до закладок на всіх своїх пристроях, увійдіть в обліковий запис Chromium.</translation>
 <translation id="3605252743693911722">Увійдіть в обліковий запис у Chromium, щоб мати доступ до своїх закладок, паролів та інших даних на всіх пристроях.</translation>
 <translation id="3805899903892079518">Chromium не має доступу до ваших фото чи відео. Надайте доступ у меню iOS "Параметри &gt; Конфіденційність &gt; Фото".</translation>
-<translation id="4024541897090868497">Щоб мати доступ до вкладок на всіх своїх пристроях, увійдіть в обліковий запис Chromium.</translation>
 <translation id="4157467675761413638">Порада щодо Chromium. Щоб відкрити більше параметрів, утримуйте кнопку "Показати вкладки" на панелі інструментів, розташованій унизу або вгорі екрана.</translation>
 <translation id="4241912885070669028">Ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="4555020257205549924">Якщо ввімкнути цю функцію, Chromium пропонуватиме перекласти сторінки, написані іншими мовами, за допомогою Перекладача Google. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
index b8dd66d..841609df 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">Chromium không thể sử dụng máy ảnh của bạn do một ứng dụng khác đang dùng máy ảnh.</translation>
 <translation id="2915596697727466327">Chromium sử dụng Face ID để đảm bảo rằng chỉ những người được ủy quyền mới có thể truy cập vào mật khẩu của bạn.</translation>
 <translation id="3256316712990552818">Đã sao chép vào Chromium</translation>
-<translation id="3413120535237193088">Để nhận dấu trang trên tất cả các thiết bị của bạn, hãy đăng nhập vào Chromium.</translation>
 <translation id="3605252743693911722">Đăng nhập vào Chromium để nhận dấu trang, mật khẩu và nhiều nội dung khác trên tất cả các thiết bị của bạn.</translation>
 <translation id="3805899903892079518">Chromium không có quyền truy cập ảnh hoặc video của bạn. Hãy cho phép truy cập Cài đặt iOS &gt; Bảo mật &gt; Ảnh.</translation>
-<translation id="4024541897090868497">Để truy cập các tab trên tất cả các thiết bị của bạn, hãy đăng nhập vào Chromium.</translation>
 <translation id="4157467675761413638">Mẹo dành cho Chromium. Để xem thêm các tùy chọn về tab, hãy nhấn và giữ nút Hiển thị tab trên thanh công cụ ở đầu hoặc cuối màn hình.</translation>
 <translation id="4241912885070669028">Bạn đang đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chromium khỏi thiết bị này nhưng dữ liệu đó sẽ vẫn còn trong tài khoản Google của bạn.</translation>
 <translation id="4555020257205549924">Khi tính năng này được bật, Chromium sẽ đề xuất sử dụng Google Dịch để dịch các trang viết bằng ngôn ngữ khác. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
index ba1d102..e242931 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">由于另一个应用正在使用您的相机,因此 Chromium 无法使用。</translation>
 <translation id="2915596697727466327">Chromium 会使用 Face ID 来确保对您密码的访问均已获授权。</translation>
 <translation id="3256316712990552818">已复制到 Chromium</translation>
-<translation id="3413120535237193088">要将您的书签同步到您所有的设备上,请登录 Chromium。</translation>
 <translation id="3605252743693911722">登录 Chromium 即可将您的书签、密码等同步到您的所有设备上。</translation>
 <translation id="3805899903892079518">Chromium 无权访问您的照片或视频。请依次点按 iOS 中的“设置”&gt;“隐私”&gt;“照片”,授予其访问权限。</translation>
-<translation id="4024541897090868497">要将您的标签页同步到您的所有设备上,请登录 Chromium。</translation>
 <translation id="4157467675761413638">Chromium 提示。要查看更多标签页选项,请按住工具栏(位于屏幕底部或顶部)中的“显示标签页”按钮。</translation>
 <translation id="4241912885070669028">您正要退出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chromium 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
 <translation id="4555020257205549924">启用此功能后,Chromium 将使用 Google 翻译对其他语言的网页进行翻译。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
index 6144d8e..b6cc7d36 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -20,10 +20,8 @@
 <translation id="2730884209570016437">另一個應用程式正在使用你的相機,因此 Chromium 無法使用</translation>
 <translation id="2915596697727466327">Chromium 會使用 Face ID 來確保只有經過授權的使用者才能存取你的密碼。</translation>
 <translation id="3256316712990552818">已複製到 Chromium</translation>
-<translation id="3413120535237193088">如要在所有裝置上存取你的書籤,請登入 Chromium。</translation>
 <translation id="3605252743693911722">無論使用任何裝置,只要登入 Chromium,即可取得你的書籤、密碼,並沿用其他設定。</translation>
 <translation id="3805899903892079518">Chromium 無法存取您的相片或影片,請前往「iOS 設定」中的 [隱私權] &gt; [相片] 啟用存取權。</translation>
-<translation id="4024541897090868497">如要在所有裝置上存取你的分頁,請登入 Chromium。</translation>
 <translation id="4157467675761413638">Chromium 提示。如需更多分頁選項,請按住工具列 (位於畫面底部或頂端) 中的 [顯示分頁] 按鈕。</translation>
 <translation id="4241912885070669028">你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶。系統會將你的 Chromium 資料從這個裝置上刪除,但繼續保留在你的 Google 帳戶中。</translation>
 <translation id="4555020257205549924">開啟這項功能後,Chromium 會使用 Google 翻譯來翻譯其他語言的網頁。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
index d6d6b59..8e833eb 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="1282031177488366470">የChrome ባህሪያት እና አፈጻጸም እንዲሻሻል ያግዙ</translation>
-<translation id="1326317727527857210">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ወደ Chrome ይግቡ።</translation>
 <translation id="1682483655351012182">የChrome ውሂብዎን ያስምሩ</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">የGoogle Chrome ግላዊነት ማስታወቂያ</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome አሁን ተሻሽሏል! አዲስ ስሪት አለ።</translation>
 <translation id="257708665678654955">Google Chrome በሚቀጥለው ጊዜ ከዚህ ጣቢያ የመጡ የ<ph name="LANGUAGE_NAME" /> ገጾች እንዲተረጎምልዎ ይፈልጋሉ?</translation>
 <translation id="3030414234702425231">እርስዎ በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ስለሆነ Chrome ውሂብዎ ከዚህ መሣሪያ ላይ ይሰረዛል። የእርስዎ ውሂብ በእርስዎ Google መለያ ውስጥ ይቆያል።</translation>
-<translation id="3148434565183091099">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chrome ይግቡ።</translation>
 <translation id="3148688391461398285">Chrome ውስጥ በአካባቢዎ ላይ የተመሠረተ የተሻለ ተሞክሮ ያግኙ።</translation>
 <translation id="3167189358072330585">መለያዎ በGoogle Chrome ላይ አይሠራም። እባክዎ የጎራዎ አስተዳዳሪውን ያነጋግሩ ወይም ለመግባት መደበኛ የሆነ የGoogle መለያ ይጠቀሙ።</translation>
 <translation id="3196546062792660320">Chrome የእርስዎን መለያዎች ወደ ድር በማምጣት ጊዜ ይቆጥብልዎለታል። ቅንብሮች ውስጥ መለያዎችን ማከል ወይም ማስወገድ ይችላሉ።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
index d13b2b2..308ccd8 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="1282031177488366470">‏المساعدة على تحسين ميزات Chrome وأدائه</translation>
-<translation id="1326317727527857210">‏للحصول على علامات التبويب من أجهزتك الأخرى، سجّل الدخول إلى Chrome.</translation>
 <translation id="1682483655351012182">‏مزامنة بيانات Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏إشعار خصوصية Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">‏لقد أصبح Chrome أفضل من ذي قبل! يتوفر إصدار جديد.</translation>
 <translation id="257708665678654955">‏هل تريد أن يعرض Google Chrome ترجمة صفحات <ph name="LANGUAGE_NAME" /> من موقع الويب هذا في المرة القادمة؟</translation>
 <translation id="3030414234702425231">‏نظرًا لتسجيل خروجك من حساب يديره <ph name="SIGNOUT_MANAGED_DOMAIN" />، ستُحذَف بيانات Chrome من هذا الجهاز، ولكن ستظل البيانات محفوظة في حسابك على Google.</translation>
-<translation id="3148434565183091099">‏للحصول على الإشارات المرجعية على جميع أجهزتك، سجِّل الدخول إلى Chrome.</translation>
 <translation id="3148688391461398285">‏احصل على تجربة أفضل في Chrome حسب موقعك.</translation>
 <translation id="3167189358072330585">‏لا يعمل حسابك على Google Chrome. يُرجى الاتصال بمشرف النطاق أو استخدام حساب Google عادي لتسجيل الدخول.</translation>
 <translation id="3196546062792660320">‏يوفر Chrome وقتك من خلال تجميع حساباتك على شبكة الإنترنت. ويمكنك إضافة أو إزالة حسابات في الإعدادات.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
index 3be691f..3c1c092 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
 <translation id="1282031177488366470">Помощ за подобряването на функциите и ефективността на Chrome</translation>
-<translation id="1326317727527857210">Влезте в Chrome, за да получите разделите си от другите си устройства.</translation>
 <translation id="1682483655351012182">Синхронизиране на данните ви в Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Съобщение за поверителност на Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome току-що се подобри! Налице е нова версия.</translation>
 <translation id="257708665678654955">Искате ли следващия път Google Chrome да предложи да преведе от <ph name="LANGUAGE_NAME" /> страниците от този сайт?</translation>
 <translation id="3030414234702425231">Тъй като излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />, данните ви в Chrome ще бъдат изтрити от това устройство, но ще останат в профила ви в Google.</translation>
-<translation id="3148434565183091099">Влезте в Chrome, за да получите отметките си на всичките си устройства.</translation>
 <translation id="3148688391461398285">Подобрете практическата си работа в Chrome въз основа на местоположението си.</translation>
 <translation id="3167189358072330585">Профилът ви не е съвместим с Google Chrome. Моля, свържете се с администратора на домейна си или влезте с обикновен профил в Google.</translation>
 <translation id="3196546062792660320">С Chrome спестявате време, като свързвате профилите си с мрежата. Можете да добавяте или премахвате профили от настройките.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
index 61ca4a4..ddedb59c 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
 <translation id="1282031177488366470">Chrome-এর ফিচার এবং পারফর্ম্যান্স উন্নত করতে সাহায্য করুন</translation>
-<translation id="1326317727527857210">আপনার অন্য ডিভাইসগুলি থেকে আপনার ট্যাবগুলি পেতে, Chrome-এ সাইন-ইন করুন।</translation>
 <translation id="1682483655351012182">আপনার Chrome ডেটা সিঙ্ক করুন</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome গোপনীয়তা বিজ্ঞপ্তি</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome আরও ভাল হয়েছে! একটি নতুন ভার্সন উপলব্ধ আছে৷</translation>
 <translation id="257708665678654955">আপনি কি এরপর থেকে এই সাইটের <ph name="LANGUAGE_NAME" /> পৃষ্ঠাগুলিকে অনুবাদ করে দেওয়ার জন্য Google Chrome থেকে প্রম্পট পেতে চান?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> দ্বারা ম্যানেজ করা একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন বলে, এই ডিভাইস থেকে আপনার Chrome ডেটা মুছে যাবে। আপনার Google অ্যাকাউন্টে এই ডেটা থেকে যাবে।</translation>
-<translation id="3148434565183091099">সব ডিভাইসে আপনার বুকমার্কগুলি পেতে Chrome-এ সাইন-ইন করুন।</translation>
 <translation id="3148688391461398285">আপনার অবস্থানের উপর ভিত্তি করে Chrome এ একটি ভাল অভিজ্ঞতা লাভ করুন৷</translation>
 <translation id="3167189358072330585">আপনার অ্যাকাউন্ট Google Chrome-এ কাজ করে না৷ সাইন-ইন করার জন্য আপনার ডোমেন অ্যাডমিনিস্ট্রেটরের সঙ্গে যোগাযোগ করুন বা কোন সাধারণ Google অ্যাকাউন্ট ব্যবহার করুন৷</translation>
 <translation id="3196546062792660320">Chrome আপনার অ্যাকাউন্টগুলিকে ওয়েবে নিয়ে এসে আপনার সময় বাঁচায়। আপনি সেটিংস থেকে অ্যাকাউন্ট জুড়তে বা সরাতে পারবেন।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
index 6a8b7cf..be56021 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
 <translation id="1282031177488366470">Ajuda a millorar les funcions i el rendiment de Chrome</translation>
-<translation id="1326317727527857210">Inicia la sessió a Chrome per accedir a les pestanyes dels altres dispositius que tinguis.</translation>
 <translation id="1682483655351012182">Sincronitza les dades de Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Avís de privadesa de Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome ara és millor. Hi ha una versió nova disponible.</translation>
 <translation id="257708665678654955">La propera vegada, voleu que Google Chrome s'ofereixi per traduir les pàgines d'aquest lloc escrites en <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Com que estàs tancant la sessió d'un compte gestionat per <ph name="SIGNOUT_MANAGED_DOMAIN" />, se suprimiran les teves dades de Chromium d'aquest dispositiu, però continuaran emmagatzemades al teu Compte de Google.</translation>
-<translation id="3148434565183091099">Inicia la sessió a Chrome per accedir a les adreces d'interès des de tots els dispositius.</translation>
 <translation id="3148688391461398285">Si compartiu la vostra ubicació, millorareu l'experiència a Chrome.</translation>
 <translation id="3167189358072330585">El vostre compte no funciona a Google Chrome. Contacteu amb l'administrador del domini o utilitzeu un compte de Google estàndard per iniciar la sessió.</translation>
 <translation id="3196546062792660320">Per ajudar-te a estalviar temps, Chrome connecta els teus comptes al web. Pots afegir o suprimir comptes a Configuració.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
index c92e85c..232d4d2 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
 <translation id="1282031177488366470">Pomozte zlepšit funkce a výkon Chromu</translation>
-<translation id="1326317727527857210">Chcete-li získat přístup ke kartám ze svých ostatních zařízení, přihlaste se do Chromu.</translation>
 <translation id="1682483655351012182">Synchronizovat data prohlížeče Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Upozornění ve věci ochrany soukromí v prohlížeči Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome je opět o něco lepší. K dispozici je nová verze.</translation>
 <translation id="257708665678654955">Chcete, aby Google Chrome příště pro stránky v jazyce <ph name="LANGUAGE_NAME" /> z tohoto webu nabízel překlad?</translation>
 <translation id="3030414234702425231">Protože se odhlašujete z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />, vaše data prohlížeče Chrome z tohoto zařízení budou smazána. V účtu Google vám zůstanou.</translation>
-<translation id="3148434565183091099">Chcete-li záložky synchronizovat do všech zařízení, přihlaste se do Chromu.</translation>
 <translation id="3148688391461398285">Získejte v Chromu lepší funkce založené na poloze.</translation>
 <translation id="3167189358072330585">Váš účet v prohlížeči Google Chrome nefunguje. Kontaktujte administrátora domény nebo se přihlaste pomocí běžného účtu Google.</translation>
 <translation id="3196546062792660320">Chrome vám šetří čas tím, že vaše účty přenáší na web. Účty můžete přidat nebo odstranit v Nastavení.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
index 1d43e70..7e04195 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
 <translation id="1282031177488366470">Hjælp med at forbedre Chromes funktioner og effektivitet</translation>
-<translation id="1326317727527857210">Log ind på Chrome for at få adgang til dine faner på dine andre enheder.</translation>
 <translation id="1682483655351012182">Synkroniser dine Chrome-data</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Erklæring om privatliv for Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome er lige blevet bedre! Der er en ny tilgængelig version.</translation>
 <translation id="257708665678654955">Skal Google Chrome tilbyde at oversætte sider på <ph name="LANGUAGE_NAME" /> fra dette website næste gang?</translation>
 <translation id="3030414234702425231">Da du er ved at logge ud af en konto, der administreres af <ph name="SIGNOUT_MANAGED_DOMAIN" />, slettes dine Chrome-data på denne enhed. Dine data forbliver på din Google-konto.</translation>
-<translation id="3148434565183091099">Log ind på Chrome for at se dine bogmærker på alle dine enheder.</translation>
 <translation id="3148688391461398285">Angiv din placering og få en bedre oplevelse, når du bruger Chrome.</translation>
 <translation id="3167189358072330585">Din konto fungerer ikke sammen med Google Chrome. Kontakt din domæneadministrator, eller brug en almindelig Google-konto til at logge ind.</translation>
 <translation id="3196546062792660320">Med Chrome sparer du tid ved at gøre alle dine konti tilgængelige online. Du kan tilføje eller fjerne konti under Indstillinger.</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 98b367f..a09e80e 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
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
 <translation id="1282031177488366470">Ich möchte dabei helfen, die Funktionen und die Leistung von Chrome zu verbessern</translation>
-<translation id="1326317727527857210">Melden Sie sich in Chrome an, um Tabs von Ihren anderen Geräten abzurufen.</translation>
 <translation id="1682483655351012182">Chrome-Daten synchronisieren</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Chrome-Datenschutzhinweise</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome ist jetzt noch besser! Es ist eine neue Version verfügbar.</translation>
 <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="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="3148434565183091099">Melden Sie sich in Chrome an, um auf all Ihren Geräten auf Ihre Lesezeichen zugreifen zu können.</translation>
 <translation id="3148688391461398285">Profitieren Sie von einer besseren Nutzererfahrung in Chrome auf Grundlage Ihres Standorts.</translation>
 <translation id="3167189358072330585">Dieses Konto funktioniert in Google Chrome nicht. Wenden Sie sich an Ihren Domainadministrator oder melden Sie sich mit einem Google-Standardkonto an.</translation>
 <translation id="3196546062792660320">Mit Chrome sparen Sie Zeit, da Sie Ihre Konten im Web verwenden können. In den Einstellungen haben Sie die Möglichkeit, Konten hinzuzufügen oder zu entfernen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
index 1c1e2b8..511fbab6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
 <translation id="1282031177488366470">Συμβάλετε στη βελτίωση των λειτουργιών και της απόδοσης του Chrome</translation>
-<translation id="1326317727527857210">Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, συνδεθείτε στο Chrome.</translation>
 <translation id="1682483655351012182">Συγχρονισμός των δεδομένων του Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Σημείωση απορρήτου του Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Το Chrome μόλις βελτιώθηκε! Μια νέα έκδοση είναι διαθέσιμη.</translation>
 <translation id="257708665678654955">Θέλετε να προσφερθεί το Google Chrome να μεταφράσει τις σελίδες αυτού του ιστότοπου που είναι γραμμένες στα <ph name="LANGUAGE_NAME" /> την επόμενη φορά;</translation>
 <translation id="3030414234702425231">Λόγω της αποσύνδεσής σας από κάποιον λογαριασμό που είναι διαχειριζόμενος από τον τομέα <ph name="SIGNOUT_MANAGED_DOMAIN" />, τα δεδομένα Chrome θα διαγραφούν από τη συσκευή. Τα δεδομένα σας θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
-<translation id="3148434565183091099">Για να εμφανίζονται οι σελιδοδείκτες σας σε όλες τις συσκευές σας, συνδεθείτε στο Chrome.</translation>
 <translation id="3148688391461398285">Απολαύστε μια καλύτερη εμπειρία στο Chrome βάσει της τοποθεσίας σας.</translation>
 <translation id="3167189358072330585">Ο λογαριασμός σας δεν λειτουργεί στο Google Chrome. Επικοινωνήστε με το διαχειριστή του λογαριασμού ή χρησιμοποιήστε έναν κανονικό Λογαριασμό Google για να συνδεθείτε.</translation>
 <translation id="3196546062792660320">Το Chrome σάς βοηθά να εξοικονομήσετε χρόνο, μεταφέροντας τους λογαριασμούς σας στον ιστό. Μπορείτε να προσθέσετε ή να καταργήσετε λογαριασμούς στις Ρυθμίσεις.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
index f49df486..84588b03 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
 <translation id="1282031177488366470">Help improve Chrome's features and performance</translation>
-<translation id="1326317727527857210">To get your tabs from your other devices, sign in to Chrome.</translation>
 <translation id="1682483655351012182">Sync your Chrome data</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome Privacy Notice</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome just got better! A new version is available.</translation>
 <translation id="257708665678654955">Would you like Google Chrome to offer to translate <ph name="LANGUAGE_NAME" /> pages from this site next time?</translation>
 <translation id="3030414234702425231">Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN" />, your Chrome data will be deleted from this device. Your data will remain in your Google Account.</translation>
-<translation id="3148434565183091099">To get your bookmarks on all your devices, sign in to Chrome.</translation>
 <translation id="3148688391461398285">Get a better experience in Chrome based on your location.</translation>
 <translation id="3167189358072330585">Your account does not work on Google Chrome. Please contact your domain administrator or use a regular Google Account to sign in.</translation>
 <translation id="3196546062792660320">Chrome saves you time by bringing your accounts to the web. You can add or remove accounts in Settings.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
index ed232672..c2a63f3a 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
 <translation id="1282031177488366470">Ayuda a mejorar las funciones y el rendimiento de Chrome</translation>
-<translation id="1326317727527857210">Accede a Chrome para obtener las pestañas de tus otros dispositivos.</translation>
 <translation id="1682483655351012182">Sincronizar tus datos de Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de privacidad de Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">¡Chrome mejoró! Hay una nueva versión disponible.</translation>
 <translation id="257708665678654955">¿Quieres que Google Chrome te ofrezca traducir las páginas de este sitio que estén en <ph name="LANGUAGE_NAME" /> la próxima vez?</translation>
 <translation id="3030414234702425231">Como estás saliendo de una cuenta que administra <ph name="SIGNOUT_MANAGED_DOMAIN" />, tus datos de Chrome se borrarán de este dispositivo, pero permanecerán en tu Cuenta de Google.</translation>
-<translation id="3148434565183091099">Para usar tus favoritos en todos los dispositivos, accede a Chrome.</translation>
 <translation id="3148688391461398285">Obtén una mejor experiencia en Chrome según tu ubicación.</translation>
 <translation id="3167189358072330585">Tu cuenta no funciona en Google Chrome. Comunícate con tu administrador de dominio o utiliza una cuenta común de Google para acceder.</translation>
 <translation id="3196546062792660320">Chrome lleva tus cuentas a la Web para ahorrarte tiempo. Puedes agregar o quitar cuentas en la configuración.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
index 8ba5dbb..81cba5a 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
 <translation id="1282031177488366470">Ayudar a mejorar las funciones y el rendimiento de Chrome</translation>
-<translation id="1326317727527857210">Inicia sesión en Chrome para ver las pestañas de tus otros dispositivos.</translation>
 <translation id="1682483655351012182">Sincronizar tus datos de Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de privacidad de Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome sigue mejorando. Hay una nueva versión disponible.</translation>
 <translation id="257708665678654955">¿Quieres que Google Chrome te ofrezca la posibilidad de traducir las páginas en <ph name="LANGUAGE_NAME" /> de este sitio web la próxima vez?</translation>
 <translation id="3030414234702425231">Al cerrar sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, se eliminan tus datos de Chrome en este dispositivo, pero permanecen en tu cuenta de Google.</translation>
-<translation id="3148434565183091099">Inicia sesión en Chrome para ver tus marcadores en todos tus dispositivos.</translation>
 <translation id="3148688391461398285">Disfruta de una mejor experiencia en Chrome basada en tu ubicación.</translation>
 <translation id="3167189358072330585">Tu cuenta no funciona en Google Chrome. Ponte en contacto con el administrador del dominio o utiliza una cuenta de Google normal para iniciar sesión.</translation>
 <translation id="3196546062792660320">Chrome te permite llevar tus cuentas a la Web para ahorrar tiempo. Puedes añadirlas o quitarlas en los ajustes.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
index 33e7ad49..e5e723718 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
 <translation id="1282031177488366470">Aidake täiustada Chrome'i funktsioone ja toimivust</translation>
-<translation id="1326317727527857210">Vahelehtede hankimiseks oma teistest seadmetest logige Chrome'i sisse.</translation>
 <translation id="1682483655351012182">Chrome'i andmete sünkroonimine</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome'i privaatsust.</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome muutus just veelgi paremaks! Saadaval on uus versioon.</translation>
 <translation id="257708665678654955">Kas soovite, et Google Chrome pakuks järgmisel korral sellel saidil <ph name="LANGUAGE_NAME" /> keeles olevate lehtede tõlkimise võimalust?</translation>
 <translation id="3030414234702425231">Kuna logite välja kontolt, mida haldab <ph name="SIGNOUT_MANAGED_DOMAIN" />, kustutatakse selles seadmes teie Chrome'i andmed. Google'i kontole jäävad teie andmed alles.</translation>
-<translation id="3148434565183091099">Järjehoidjate hankimiseks kõikidesse seadmetesse logige Chrome'i sisse.</translation>
 <translation id="3148688391461398285">Hankige Chrome’i parem kasutuskogemus teie asukoha põhjal.</translation>
 <translation id="3167189358072330585">Teie konto ei tööta Google Chrome'is. Võtke ühendust domeeni administraatoriga või kasutage sisselogimiseks tavalist Google'i kontot.</translation>
 <translation id="3196546062792660320">Chrome säästab aega, tuues teie kontod veebi. Saate kontosid lisada või eemaldada menüüs Seaded.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
index 8557b7b..693ba3b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
 <translation id="1282031177488366470">‏کمک به بهبود ویژگی‌ها و عملکرد Chrome</translation>
-<translation id="1326317727527857210">‏برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید.</translation>
 <translation id="1682483655351012182">‏همگام‌سازی داده‌های Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏اعلان حریم خصوصی Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">‏‫Chrome بهتر شده است! نسخه جدید آن در دسترس است.</translation>
 <translation id="257708665678654955">‏می‌خواهید دفعه بعد Google Chrome ترجمه صفحات <ph name="LANGUAGE_NAME" /> این سایت را به شما پیشنهاد دهد؟</translation>
 <translation id="3030414234702425231">‏ازآنجایی‌که درحال خارج شدن از حسابی هستید که <ph name="SIGNOUT_MANAGED_DOMAIN" /> آن را مدیریت می‌کند، داده‌های Chrome شما از این دستگاه حذف خواهد شد. داده‌هایتان در حساب Google شما باقی می‌ماند.</translation>
-<translation id="3148434565183091099">‏برای اینکه نشانک‌ها را در همه دستگاه‌هایتان دریافت کنید به سیستم Chrome وارد شوید.</translation>
 <translation id="3148688391461398285">‏تجربه بهتری از Chrome بر مبنای مکانتان کسب کنید.</translation>
 <translation id="3167189358072330585">‏حساب شما در Google Chrome کار نمی‌کند. لطفاً با سرپرست دامنه‌تان تماس بگیرید یا از یک حساب Google معمولی برای ثبت ورود استفاده کنید.</translation>
 <translation id="3196546062792660320">‏Chrome با آوردن حساب‌های شما به وب، در وقت شما صرفه‌جویی می‌کند. در «تنظیمات» می‌توانید حساب‌ها را اضافه یا حذف کنید.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
index 4d2e4df..ef85acb 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
 <translation id="1282031177488366470">Auta parantamaan Chromen ominaisuuksia ja suorituskykyä</translation>
-<translation id="1326317727527857210">Käytä välilehtiä muilta laitteiltasi kirjautumalla Chromeen.</translation>
 <translation id="1682483655351012182">Chrome-datan synkronointi</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chromen tietosuojailmoitus</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chromesta tuli juuri entistä parempi! Uusi versio on saatavilla.</translation>
 <translation id="257708665678654955">Haluatko Google Chromen ehdottavan sivuston kielellä <ph name="LANGUAGE_NAME" /> kirjoitettujen sivujen kääntämistä seuraavalla kerralla?</translation>
 <translation id="3030414234702425231">Koska kirjaudut ulos verkkotunnuksen <ph name="SIGNOUT_MANAGED_DOMAIN" /> ylläpitämältä tililtä, Chrome-datasi poistetaan tältä laitteelta. Se säilyy edelleen Google-tililläsi.</translation>
-<translation id="3148434565183091099">Kirjaudu sisään Chromeen, niin voit käyttää kirjanmerkkejäsi kaikilla laitteilla.</translation>
 <translation id="3148688391461398285">Parannamme Chrome-käyttökokemustasi sijaintisi perusteella.</translation>
 <translation id="3167189358072330585">Tilisi ei toimi Google Chromen kanssa. Ota yhteyttä verkkotunnuksesi järjestelmänvalvojaan tai kirjaudu sisään tavallisella Google-tilillä.</translation>
 <translation id="3196546062792660320">Chrome säästää aikaasi tuomalla tilisi verkkoon. Voit lisätä tai poistaa tilejä asetuksissa.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
index dc239a4..c9ff3e8 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1282031177488366470">Tumulong sa Pagpapahusay sa Mga Feature at Performance ng Chrome</translation>
-<translation id="1326317727527857210">Upang makuha ang iyong mga tab mula sa iba mo pang mga device, mag-sign in sa Chrome.</translation>
 <translation id="1682483655351012182">I-sync ang Iyong Data sa Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notification ng Privacy ng Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Naging mas mahusay na ang Chrome! Available na ang bagong bersyon.</translation>
 <translation id="257708665678654955">Gusto mo bang mag-alok ang Google Chrome na isalin ang mga <ph name="LANGUAGE_NAME" /> page mula sa site na ito sa susunod na pagkakataon?</translation>
 <translation id="3030414234702425231">Dahil magsa-sign out ka sa account na pinapamahalaan ng <ph name="SIGNOUT_MANAGED_DOMAIN" />, made-delete ang iyong data sa Chrome sa device na ito. Mananatili ang data mo sa iyong Google Account.</translation>
-<translation id="3148434565183091099">Para mailagay ang iyong mga bookmark sa lahat ng device mo, mag-sign in sa Chrome.</translation>
 <translation id="3148688391461398285">Magkaroon ng mas mahusay na karanasan sa Chrome batay sa iyong lokasyon.</translation>
 <translation id="3167189358072330585">Hindi gumagana ang iyong account sa Google Chrome. Mangyaring makipag-ugnayan sa iyong administrator ng domain o gumamit ng regular na Google Account upang mag-sign in.</translation>
 <translation id="3196546062792660320">Nakakatipid ka ng oras sa Chrome sa pamamagitan ng pagdadala ng iyong mga account sa web. Maaari kang magdagdag o mag-alis ng mga account sa Mga Setting.</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 acc9f15..bc7a5fa4 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
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
 <translation id="1282031177488366470">Contribuer à l'amélioration des fonctionnalités et des performances de Chrome</translation>
-<translation id="1326317727527857210">Connectez-vous à Chrome pour accéder à vos onglets sur vos autres appareils.</translation>
 <translation id="1682483655351012182">Synchroniser vos données Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Avis de confidentialité Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Google Chrome s'est amélioré ! Une nouvelle version est désormais disponible.</translation>
 <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="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="3148434565183091099">Connectez-vous à Chrome pour synchroniser vos favoris sur tous vos appareils.</translation>
 <translation id="3148688391461398285">Améliorez votre expérience dans Chrome grâce à votre position.</translation>
 <translation id="3167189358072330585">Votre compte n'est pas compatible avec Google Chrome. Veuillez contacter l'administrateur de votre domaine ou utiliser un compte Google standard pour vous connecter.</translation>
 <translation id="3196546062792660320">Chrome vous permet de gagner du temps en connectant vos comptes au Web. Vous pouvez ajouter ou supprimer des comptes dans la section "Paramètres".</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
index ecdf735..7cc1893 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
 <translation id="1282031177488366470">Chromeની સુવિધાઓ અને કાર્યપ્રદર્શનને સુધારવામાં સહાય કરો</translation>
-<translation id="1326317727527857210">તમારા અન્ય ઉપકરણો પરથી તમારા ટૅબ્સ મેળવવા માટે, Chrome માં સાઇન ઇન કરો.</translation>
 <translation id="1682483655351012182">તમારા Chrome ડેટાને સિંક કરો</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome ગોપનીયતા સૂચના</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome હમણાં જ વધુ સારું થયું છે! એક નવું વર્ઝન ઉપલબ્ધ છે.</translation>
 <translation id="257708665678654955">શું તમે Google Chrome ને આ સાઇટથી આગલી વખતે <ph name="LANGUAGE_NAME" /> પેજને અનુવાદ કરવાની ઓફર કરવા માગો છો?</translation>
 <translation id="3030414234702425231">કારણ કે તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા મેનેજ કરવામાં આવેલ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો, આ ડિવાઇસમાંથી તમારા Chrome ડેટા ડિલીટ થઈ જશે. તમારો ડેટા તમારા Google એકાઉન્ટમાં જળવાઈ રહેશે.</translation>
-<translation id="3148434565183091099">તમારા સમગ્ર ઉપકરણો પર તમારા બુકમાર્ક્સ મેળવવા માટે, Chrome માં સાઇન ઇન કરો.</translation>
 <translation id="3148688391461398285">તમારા સ્થાનના આધારે Chrome માં બહેતર અનુભવ મેળવો.</translation>
 <translation id="3167189358072330585">તમારું એકાઉન્ટ, Google Chrome પર કાર્ય કરતું નથી. કૃપા કરીને તમારા ડોમેન એડમિનનો સંપર્ક કરો અથવા સાઇન ઇન કરવા માટે નિયમિત Google એકાઉન્ટનો ઉપયોગ કરો.</translation>
 <translation id="3196546062792660320">વેબ પર તમારા એકાઉન્ટ્સ લાવીને Chrome તમારો સમય બચાવે છે. તમે સેટિંગ્સમાં એકાઉન્ટ્સ ઉમેરી અથવા દૂર કરી શકો છો.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
index 7a22290..921da44 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="1282031177488366470">Chrome की सुविधाओं और प्रदर्शन को बेहतर बनाने में मदद करें</translation>
-<translation id="1326317727527857210">अपने दूसरे डिवाइस से अपने टैब पाने के लिए, Chrome में साइन इन करें.</translation>
 <translation id="1682483655351012182">अपना Chrome डेटा सिंक करें</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome निजता सूचना</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome अब बेहतर हो गया है! एक नया वर्शन उपलब्ध है.</translation>
 <translation id="257708665678654955">क्या आप चाहते हैं कि Google Chrome अगली बार इस साइट के <ph name="LANGUAGE_NAME" /> पेजों का अनुवाद करने का ऑफ़र दे?</translation>
 <translation id="3030414234702425231">क्‍योंकि आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> की ओर से प्रबंधित खाते से साइन आउट कर रहे हैं, इसलिए आपका Chrome डेटा इस डिवाइस से मिट जाएगा. आपका डेटा आपके Google खाते में बना रहेगा.</translation>
-<translation id="3148434565183091099">अपने सभी डिवाइस पर बुकमार्क पाने के लिए, Chrome में साइन इन करें.</translation>
 <translation id="3148688391461398285">अपने स्थान के आधार पर Chrome में बेहतर अनुभव पाएं.</translation>
 <translation id="3167189358072330585">आपका खाता Google Chrome पर काम नहीं करता. कृपया साइन इन करने के लिए अपने डोमेन एडमिन से संपर्क करें या नियमित Google खाते का इस्तेमाल करें.</translation>
 <translation id="3196546062792660320">Chrome आपके खातों को वेब पर लाकर आपका समय बचाता है. आप सेटिंग में खाते जोड़ सकते हैं या उन्हें निकाल सकते हैं.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
index 23e66770..16fbdb2b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
 <translation id="1282031177488366470">Pomozite poboljšati Chromeove značajke i izvedbu</translation>
-<translation id="1326317727527857210">Da bi se prikazale kartice s vaših ostalih uređaja, prijavite se na Chrome.</translation>
 <translation id="1682483655351012182">Sinkroniziraj podatke iz Chromea</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Obavijest o privatnosti za Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome je postao još bolji! Dostupna je nova verzija.</translation>
 <translation id="257708665678654955">Želite li da Google Chrome sljedeći put ponudi prijevod stranica s te web-lokacije za <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Budući da se odjavljujete s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />, vaši podaci iz Chromea izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
-<translation id="3148434565183091099">Da biste imali svoje oznake na svim svojim uređajima, prijavite se na Chrome.</translation>
 <translation id="3148688391461398285">Chrome će vam pružiti više ako mu omogućite pristup lokaciji.</translation>
 <translation id="3167189358072330585">Vaš račun ne funkcionira na Google Chromeu. Obratite se administratoru domene ili se prijavite običnim Google računom.</translation>
 <translation id="3196546062792660320">Chrome vam štedi vrijeme sinkronizacijom vaših računa na webu. Račune možete dodavati i uklanjati u postavkama.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
index a75a540..c59dc9b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
 <translation id="1282031177488366470">Segítsen a Chrome funkcióinak és teljesítményének javításában</translation>
-<translation id="1326317727527857210">Ha a többi eszközéről is szeretné elérni a lapjait, jelentkezzen be a Chrome-ba.</translation>
 <translation id="1682483655351012182">Chrome-adatok szinkronizálása</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome – Adatvédelmi közlemény</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">A Chrome most még jobb lett! Új verzió áll rendelkezésre.</translation>
 <translation id="257708665678654955">Szeretné, hogy a Google Chrome a jövőben felajánlja e webhely <ph name="LANGUAGE_NAME" /> nyelvű oldalainak fordítását?</translation>
 <translation id="3030414234702425231">Mivel kijelentkezik a(z) <ph name="SIGNOUT_MANAGED_DOMAIN" /> által felügyelt fiókból, törli az eszközön található Chrome-adatokat. Ezek az adatok Google-fiókjában továbbra is megmaradnak.</translation>
-<translation id="3148434565183091099">Ha az összes eszközén szeretné elérni könyvjelzőit, jelentkezzen be a Chrome-ba.</translation>
 <translation id="3148688391461398285">A helyadatokkal jobb felhasználói élményben lehet része a Chrome használatakor.</translation>
 <translation id="3167189358072330585">Fiókja nem működik a Google Chrome-on. Lépjen kapcsolatba domainrendszergazdájával, vagy használjon normál Google-fiókot a bejelentkezéshez.</translation>
 <translation id="3196546062792660320">A Chrome időt takarít meg Önnek azzal, hogy a fiókjait az internetre viszi. A beállításokban tud fiókokat hozzáadni vagy eltávolítani.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
index 2b6f78f3..f0ffa55 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="1282031177488366470">Bantu Sempurnakan Fitur dan Performa Chrome</translation>
-<translation id="1326317727527857210">Untuk mengakses tab Anda dari perangkat lainnya, login ke Chrome.</translation>
 <translation id="1682483655351012182">Sinkronkan Data Chrome Anda</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Pemberitahuan Privasi Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome jadi semakin baik! Versi baru telah tersedia.</translation>
 <translation id="257708665678654955">Ingin Google Chrome menawarkan untuk menerjemahkan halaman berbahasa <ph name="LANGUAGE_NAME" /> dari situs ini saat Anda mengunjunginya lagi?</translation>
 <translation id="3030414234702425231">Karena Anda logout dari akun yang dikelola oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />, data Chrome Anda akan dihapus dari perangkat ini. Data Anda akan tetap tersedia di Akun Google Anda.</translation>
-<translation id="3148434565183091099">Untuk dapat mengakses bookmark Anda di semua perangkat, login ke Chrome.</translation>
 <translation id="3148688391461398285">Dapatkan pengalaman yang lebih baik di Chrome berdasarkan lokasi Anda.</translation>
 <translation id="3167189358072330585">Akun Anda tidak berfungsi di Google Chrome. Harap hubungi administrator domain atau gunakan Akun Google biasa untuk masuk.</translation>
 <translation id="3196546062792660320">Chrome menghemat waktu Anda dengan membawa akun ke web. Anda dapat menambahkan atau menghapus akun di Setelan.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
index 77e5073..d36785e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
 <translation id="1282031177488366470">Contribuisci a migliorare le funzionalità e le prestazioni di Chrome</translation>
-<translation id="1326317727527857210">Accedi a Chrome per trovare le tue schede degli altri dispositivi.</translation>
 <translation id="1682483655351012182">Sincronizza i tuoi dati di Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Informativa sulla privacy di Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome è stato migliorato. È disponibile una nuova versione.</translation>
 <translation id="257708665678654955">Vuoi che Google Chrome ti proponga di tradurre le pagine di questo sito in <ph name="LANGUAGE_NAME" /> al prossimo accesso?</translation>
 <translation id="3030414234702425231">Dal momento che stai per uscire da un account gestito da <ph name="SIGNOUT_MANAGED_DOMAIN" />, i dati di Chrome verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
-<translation id="3148434565183091099">Accedi a Chrome per trovare i tuoi preferiti su tutti i dispositivi.</translation>
 <translation id="3148688391461398285">Migliora la tua esperienza di Chrome tramite l'accesso alla tua posizione.</translation>
 <translation id="3167189358072330585">Il tuo account non funziona su Google Chrome. Contatta l'amministratore di dominio o utilizza un normale Account Google per accedere.</translation>
 <translation id="3196546062792660320">Chrome ti fa risparmiare tempo portando i tuoi account sul Web. Puoi aggiungere o rimuovere account nelle Impostazioni.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
index c374cd1..28f41eaa 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
 <translation id="1282031177488366470">‏עזרה בשיפור התכונות והביצועים של Chrome</translation>
-<translation id="1326317727527857210">‏כדי לקבל את הכרטיסיות מהמכשירים האחרים שלך, יש להיכנס ל-Chrome.</translation>
 <translation id="1682483655351012182">‏סנכרון נתוני Chrome שלך</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏הודעת פרטיות של Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">‏‫Chrome ממשיך להשתפר! קיימת גירסה חדשה.</translation>
 <translation id="257708665678654955">‏האם ברצונך ש-Google Chrome יציע בפעם הבאה לתרגם דפים ב-<ph name="LANGUAGE_NAME" /> מאתר זה?</translation>
 <translation id="3030414234702425231">‏יציאה מחשבון שמנוהל על ידי <ph name="SIGNOUT_MANAGED_DOMAIN" /> תגרום למחיקת נתוני Chrome שלך מהמכשיר הזה. הנתונים האלה יישארו בחשבון Google שלך.</translation>
-<translation id="3148434565183091099">‏כדי שהסימניות שלך יופיעו בכל המכשירים, היכנס ל-Chrome.</translation>
 <translation id="3148688391461398285">‏תיהנה מחוויה משופרת ב-Chrome בהתבסס על המיקום שלך.</translation>
 <translation id="3167189358072330585">‏החשבון שלך לא פועל ב-Google Chrome. פנה אל מנהל הדומיין או השתמש בחשבון Google רגיל כדי להיכנס לחשבון.</translation>
 <translation id="3196546062792660320">‏Chromium מאפשר גישה לחשבונות באינטרנט וכך חוסך לך זמן. ניתן להוסיף או להסיר חשבונות בקטע 'הגדרות'.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
index de366f6d..ae4e18d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
 <translation id="1282031177488366470">Chrome の機能と動作の改善に協力する</translation>
-<translation id="1326317727527857210">他のデバイスと同じタブを使用するには、Chrome にログインします。</translation>
 <translation id="1682483655351012182">Chrome のデータを同期する</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome のプライバシーに関するお知らせ</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome のアップデートが見つかりました。新しいバージョンが利用可能です。</translation>
 <translation id="257708665678654955">次回から Google Chrome でこのサイトの <ph name="LANGUAGE_NAME" /> ページの翻訳を表示しますか?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトするにあたり、Chrome データはこのデバイスから削除されます(ただし Google アカウントには残ります)。</translation>
-<translation id="3148434565183091099">お使いのどのデバイスでも同じブックマークを使用するには、Chrome にログインします。</translation>
 <translation id="3148688391461398285">Chromeの機能がユーザーの所在地に応じて便利に変化します。</translation>
 <translation id="3167189358072330585">このアカウントは Google Chrome では使用できません。ドメイン管理者に問い合わせるか、通常の Google アカウントでログインしてください。</translation>
 <translation id="3196546062792660320">Chrome ではアカウントがウェブで管理されるので、さまざまな手間を省くことができます。[設定] でアカウントの追加と削除を行うことができます。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
index e36e38f..522ba746 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
 <translation id="1282031177488366470">Chrome ನ ವೈಶಿಷ್ಟ್ಯಗಳು ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation>
-<translation id="1326317727527857210">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="1682483655351012182">ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome ಗೌಪ್ಯತಾ ಸೂಚನೆ</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome ಈಗ ತಾನೇ ಉತ್ತಮಗೊಂಡಿದೆ! ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ.</translation>
 <translation id="257708665678654955">ಮುಂದಿನ ಬಾರಿ ಈ ಸೈಟ್‌ನಿಂದ <ph name="LANGUAGE_NAME" /> ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Google Chrome ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸಲು ನೀವು ಬಯಸುವಿರಾ?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲ್ಪಡುವ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವ ಕಾರಣ, ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಈ ಸಾಧನದಿಂದ ಅಳಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
-<translation id="3148434565183091099">ನಿಮ್ಮ ಎಲ್ಲ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="3148688391461398285">ನಿಮ್ಮ ಸ್ಥಾನವನ್ನು ಆಧರಿಸಿ Chrome ನಲ್ಲಿ ಉತ್ತಮ ಅನುಭವವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ.</translation>
 <translation id="3167189358072330585">ನಿಮ್ಮ ಖಾತೆಯು Google Chrome ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಡೊಮೇನ್ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಯಮಿತ Google ಖಾತೆಯನ್ನು ಬಳಸಿ.</translation>
 <translation id="3196546062792660320">ವೆಬ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಖಾತೆಗಳನ್ನು ತರುವ ಮೂಲಕ Chrome ನಿಮ್ಮ ಸಮಯವನ್ನು ಉಳಿಸುತ್ತದೆ. ನೀವು ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಖಾತೆಗಳನ್ನು ಸೇರಿಸಬಹುದು ಅಥವಾ ತೆಗೆದುಹಾಕಬಹುದು.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
index 91bf5b3..ac139d3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
 <translation id="1282031177488366470">Chrome의 기능 및 성능 개선에 참여</translation>
-<translation id="1326317727527857210">다른 기기에서 탭을 가져오려면 Chrome에 로그인하세요.</translation>
 <translation id="1682483655351012182">Chrome 데이터 동기화</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Chrome 개인정보처리방침</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">한층 개선된 Chrome의 최신 버전이 출시되었습니다.</translation>
 <translation id="257708665678654955">다음에 Chrome에서 이 사이트의 <ph name="LANGUAGE_NAME" /> 페이지를 번역하시겠습니까?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃하면 Chrome 데이터가 기기에서 삭제됩니다. Google 계정에 저장된 데이터는 그대로 유지됩니다.</translation>
-<translation id="3148434565183091099">어느 기기에서나 내 북마크를 사용하려면 Chrome에 로그인하세요.</translation>
 <translation id="3148688391461398285">위치 정보를 기반으로 Chrome에서 더 나은 환경을 이용할 수 있습니다.</translation>
 <translation id="3167189358072330585">계정이 Chrome에서 작동하지 않습니다. 도메인 관리자에게 문의하거나 일반 Google 계정으로 로그인하세요.</translation>
 <translation id="3196546062792660320">Chrome에서는 계정 로그인 정보가 자동으로 채워지기 때문에 시간을 절약할 수 있습니다. 설정에서 계정을 추가하거나 삭제할 수 있습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
index b749442..39594c1d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lt">
 <translation id="1282031177488366470">Padėti tobulinti „Chrome“ funkcijas ir našumą</translation>
-<translation id="1326317727527857210">Prisijunkite prie „Chrome“, kad pasiektumėte skirtukus iš kitų įrenginių.</translation>
 <translation id="1682483655351012182">Sinchronizuoti „Chrome“ duomenis</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">„Google Chrome“ privatumo pranešimas</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">„Chrome“ patobulėjo! Galima nauja versija.</translation>
 <translation id="257708665678654955">Ar norėtumėte, kad kitą kartą „Google Chrome“ būtų siūloma išversti šios svetainės puslapius <ph name="LANGUAGE_NAME" /> k.?</translation>
 <translation id="3030414234702425231">Atsijungiate nuo paskyros, kurią valdo <ph name="SIGNOUT_MANAGED_DOMAIN" />, todėl „Chrome“ duomenys bus ištrinti iš šio įrenginio. Duomenys išliks jūsų „Google“ paskyroje.</translation>
-<translation id="3148434565183091099">Prisijunkite naršyklėje „Chrome“, kad pasiektumėte žymes visuose įrenginiuose.</translation>
 <translation id="3148688391461398285">Gaukite geresnių funkcijų naudodami pagal vietovę pritaikytą „Chrome“.</translation>
 <translation id="3167189358072330585">Paskyra neveikia sistemoje „Google Chrome“. Susisiekite su domeno administratoriumi arba prisijungdami naudokite įprastą „Google“ paskyrą.</translation>
 <translation id="3196546062792660320">„Chrome“ taupo laiką naudodama paskyras žiniatinklyje. Paskyras galite pridėti arba pašalinti nustatymuose.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
index d7f4528..7e7313f 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
 <translation id="1282031177488366470">Palīdzēt uzlabot Chrome funkcijas un veiktspēju</translation>
-<translation id="1326317727527857210">Pierakstieties pārlūkā Chrome, lai būtu pieejamas cilnes no citām jūsu ierīcēm.</translation>
 <translation id="1682483655351012182">Sinhronizēt jūsu Chrome datus</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome konfidencialitātes paziņojums</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Pārlūkprogramma Chrome ir uzlabota! Ir pieejama jauna versija.</translation>
 <translation id="257708665678654955">Vai vēlaties, lai Google Chrome nākamreiz piedāvātu tulkot šīs vietnes lapas, kuru saturs ir šādā valodā: <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />, tādēļ jūsu Chrome dati tiks dzēsti no šīs ierīces. Dati joprojām būs pieejami jūsu Google kontā.</translation>
-<translation id="3148434565183091099">Pierakstieties pārlūkā Chrome, lai grāmatzīmes būtu pieejamas visās jūsu ierīcēs.</translation>
 <translation id="3148688391461398285">Uzlabojiet savu pieredzi pārlūkā Chrome, sūtot informāciju par savu atrašanās vietu.</translation>
 <translation id="3167189358072330585">Jūsu konts nedarbojas pārlūkā Google Chrome. Sazinieties ar savu domēna administratoru vai pierakstieties, izmantojot parastu Google kontu.</translation>
 <translation id="3196546062792660320">Chrome ietaupa jūsu laiku, pievienojot jūsu kontus tīmeklim. Kontus varat pievienot vai noņemt sadaļā Iestatījumi.</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 3a08872..9ab49b2d3 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
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
 <translation id="1282031177488366470">Chrome-ൻ്റെ ഫീച്ചറുകളും പ്രകടനങ്ങളും മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation>
-<translation id="1326317727527857210">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകൾ ലഭിക്കാൻ, Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="1682483655351012182">നിങ്ങളുടെ Chrome ഡാറ്റ സമന്വയിപ്പിക്കുക</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome സ്വകാര്യതാ അറിയിപ്പ്</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome ഒന്നുകൂടി മികച്ചതായി! പുതിയ പതിപ്പ് ലഭ്യമാണ്.</translation>
 <translation id="257708665678654955">അടുത്ത തവണ ഈ സൈറ്റിൽ നിന്ന് <ph name="LANGUAGE_NAME" /> പേജുകൾ വിവർത്തനം ചെയ്യാൻ Google Chrome ഓഫർ ചെയ്യുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങള്‍ സൈൻ ഔട്ട് ചെയ്യുന്നത് കാരണം, ഈ ഉപകരണത്തില്‍ നിന്ന് Chrome ഡാറ്റ ഇല്ലാതാക്കപ്പെടും. നിങ്ങളുടെ ഡാറ്റ തുടര്‍ന്നും Google അക്കൗണ്ടില്‍ ഉണ്ടായിരിക്കും.</translation>
-<translation id="3148434565183091099">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകൾ ലഭിക്കാൻ, Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3148688391461398285">നിങ്ങളുടെ ലൊക്കേഷനെ അടിസ്ഥാനമാക്കി Chrome-ൽ മികച്ച അനുഭവം നേടുക.</translation>
 <translation id="3167189358072330585">നിങ്ങളുടെ അക്കൗണ്ട് Google Chrome-ല്‍ പ്രവര്‍ത്തിക്കുന്നില്ല. നിങ്ങളുടെ ഡൊമെയ്ന്‍ അഡ്‌മിനിസ്‌ട്രേറ്ററുമായി ബന്ധപ്പെടുക അല്ലെങ്കില്‍ സൈൻ ഇൻ ചെയ്യുന്നതിന് പതിവ് Google അക്കൗണ്ട് ഉപയോഗിക്കുക.</translation>
 <translation id="3196546062792660320">വെബിൽ അക്കൗണ്ടുകൾ കൊണ്ടുവരുന്നതിലൂടെ Chrome നിങ്ങളുടെ സമയം ലാഭിക്കുന്നു. നിങ്ങൾക്ക് ക്രമീകരണത്തിൽ അക്കൗണ്ടുകൾ ചേർക്കാനോ നീക്കംചെയ്യാനോ കഴിയും.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
index 5aedca7..019c1ec 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
 <translation id="1282031177488366470">Chrome ची वैशिष्ट्ये आणि परफॉर्मन्स सुधारण्यात मदत करा</translation>
-<translation id="1326317727527857210">आपल्या इतर डिव्हाइसेसवरील तुमचे टॅब प्राप्त करण्यासाठी, Chrome मध्ये साइन इन करा.</translation>
 <translation id="1682483655351012182">तुमचा Chrome डेटा सिंक करा</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome गोपनीयता सूचना</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome आता आणखी सर्वोत्तम झाले आहे! नवीन आवृत्ती उपलब्ध आहे.</translation>
 <translation id="257708665678654955">पुढील वेळी Google Chrome ने या साइटवरील <ph name="LANGUAGE_NAME" /> पेजचे भाषांतर करण्याची ऑफर द्यावी असे तुम्हाला वाटते?</translation>
 <translation id="3030414234702425231">तुम्ही <ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यातून साइन आउट केले आहे, तुमचा Chrom डेटा या डिव्हाइसवरून हटवला जाईल. तुमचा डेटा तुमच्या Google खाते मध्ये असेल</translation>
-<translation id="3148434565183091099">आपल्या सर्व डिव्हाइसेसवर तुमचे बुकमार्क प्राप्त करण्यासाठी, Chrome मध्ये साइन इन करा.</translation>
 <translation id="3148688391461398285">आपल्या स्थानाच्या आधारावर Chrome मध्ये उत्कृष्ट अनुभव मिळवा.</translation>
 <translation id="3167189358072330585">तुमचे खाते Google Chrome वर काम करत नाही. कृपया तुमच्या डोमेन अॅडमिनिस्ट्रेटरशी संपर्क साधा किंवा साइन इन करण्यासाठी एक नियमित Google खाते वापरा.</translation>
 <translation id="3196546062792660320">तुमची खाती वेबवर आणून Chrome तुमचा वेळ वाचविते. तुम्ही सेटिंग्जमध्ये खाती जोडू किंवा काढू शकता.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
index bc4107e..ecf3731e3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="1282031177488366470">Bantu Tingkatkan Ciri dan Prestasi Chrome</translation>
-<translation id="1326317727527857210">Log masuk ke Chrome untuk mendapatkan tab daripada peranti anda yang lain.</translation>
 <translation id="1682483655351012182">Segerakkan Data Chrome Anda</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notis Privasi Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome telah dipertingkatkan! Versi baharu kini boleh didapati.</translation>
 <translation id="257708665678654955">Adakah anda ingin Google Chrome menawarkan halaman <ph name="LANGUAGE_NAME" /> dari tapak ini diterjemahkan pada masa akan datang?</translation>
 <translation id="3030414234702425231">Oleh sebab anda log keluar daripada akaun yang diurus oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />, data Chrome anda akan dipadamkan daripada peranti ini. Data anda akan kekal dalam Akaun Google anda.</translation>
-<translation id="3148434565183091099">Log masuk ke Chrome untuk mendapatkan penanda halaman pada semua peranti anda.</translation>
 <translation id="3148688391461398285">Dapatkan pengalaman yang lebih baik di Chrome berdasarkan lokasi anda.</translation>
 <translation id="3167189358072330585">Akaun anda tidak berfungsi pada Google Chrome. Sila hubungi pentadbir domain anda atau gunakan Akaun Google biasa untuk log masuk.</translation>
 <translation id="3196546062792660320">Chrome menjimatkan masa anda dengan membawa akaun anda ke web. Anda boleh menambahkan atau mengalih keluar akaun dalam Tetapan.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
index 81995393..b86aae6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
 <translation id="1282031177488366470">Help de functies en prestaties van Chrome verbeteren</translation>
-<translation id="1326317727527857210">Log in bij Chrome om de tabbladen van je andere apparaten te bekijken.</translation>
 <translation id="1682483655351012182">Je Chrome-gegevens synchroniseren</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Privacybeleid voor Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome is nu nog beter! Er is een nieuwe versie beschikbaar.</translation>
 <translation id="257708665678654955">Wil je dat Google Chrome de volgende keer aanbiedt om pagina's in het <ph name="LANGUAGE_NAME" /> op deze site te vertalen?</translation>
 <translation id="3030414234702425231">Omdat je uitlogt van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />, worden je Chrome-gegevens van dit apparaat verwijderd. Je gegevens blijven echter wel in je Google-account staan.</translation>
-<translation id="3148434565183091099">Log in bij Chrome om al je bladwijzers op al je apparaten te bekijken.</translation>
 <translation id="3148688391461398285">Een betere ervaring in Chrome krijgen op basis van je locatie.</translation>
 <translation id="3167189358072330585">Je account werkt niet in Google Chrome. Neem contact op met je domeinbeheerder of gebruik een gewoon Google-account om je aan te melden.</translation>
 <translation id="3196546062792660320">Chrome bespaart je tijd door je accounts beschikbaar te maken op internet. Je kunt accounts toevoegen of verwijderen bij Instellingen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
index ff5641a..84cdf85 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
 <translation id="1282031177488366470">Bidra til å gjøre Chrome bedre og raskere</translation>
-<translation id="1326317727527857210">For å få fanene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="1682483655351012182">Synkroniser Chrome-dataene dine</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Merknad om personvern for Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome har blitt enda bedre. En ny versjon er nå tilgjengelig.</translation>
 <translation id="257708665678654955">Vil du at Google Chrome skal tilby å oversette sider på <ph name="LANGUAGE_NAME" /> på dette nettstedet neste gang?</translation>
 <translation id="3030414234702425231">Fordi du logger av en konto som er administrert av <ph name="SIGNOUT_MANAGED_DOMAIN" />, blir Chrome-dataene dine slettet fra denne enheten, men de blir værende i Google-kontoen din.</translation>
-<translation id="3148434565183091099">Logg på Chrome for å få bokmerkene dine på alle enhetene du bruker.</translation>
 <translation id="3148688391461398285">Optimaliser Chrome-opplevelsen i henhold til hvor du befinner deg.</translation>
 <translation id="3167189358072330585">Kontoen din fungerer ikke i Google Chrome. Kontakt domeneadministratoren din, eller logg på med en vanlig Google-konto.</translation>
 <translation id="3196546062792660320">Chrome sparer tid for deg ved å legge kontoene dine på nettet. Du kan legge til eller fjerne kontoer i Innstillinger.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
index 6d565f7..f1ab8a2 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
 <translation id="1282031177488366470">Pomóż w ulepszaniu funkcji i działania Chrome</translation>
-<translation id="1326317727527857210">Aby korzystać z kart ze swoich innych urządzeń, zaloguj się w Chrome.</translation>
 <translation id="1682483655351012182">Synchronizuj dane Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Informacje na temat ochrony prywatności w Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome jest teraz jeszcze lepszy! Dostępna jest nowa wersja.</translation>
 <translation id="257708665678654955">Czy następnym razem Google Chrome ma zaproponować Ci tłumaczenie stron tej witryny, których język to <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Wylogowujesz się z konta, którym zarządza <ph name="SIGNOUT_MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chrome z tego urządzenia, ale pozostaną one na koncie Google.</translation>
-<translation id="3148434565183091099">Aby korzystać ze swoich zakładek na wszystkich urządzeniach, zaloguj się w Chrome.</translation>
 <translation id="3148688391461398285">Dzięki dostępowi do Twojej lokalizacji Chrome będzie działać lepiej.</translation>
 <translation id="3167189358072330585">Twoje konto nie działa w Google Chrome. Skontaktuj się z administratorem domeny lub zaloguj się przy użyciu zwykłego konta Google.</translation>
 <translation id="3196546062792660320">Chrome oszczędza Twój czas, zapisując konta w internecie. Konta możesz dodawać i usuwać w Ustawieniach.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
index e6a86554..2596180e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
 <translation id="1282031177488366470">Ajudar a melhorar os recursos e o desempenho do Chrome</translation>
-<translation id="1326317727527857210">Para ver as guias dos seus outros dispositivos, faça login no Chrome.</translation>
 <translation id="1682483655351012182">Sincronizar seus dados do Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de Privacidade do Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">O Google Chrome ficou ainda melhor! Uma nova versão está disponível.</translation>
 <translation id="257708665678654955">Quer que na próxima vez o Google Chrome ofereça a tradução de páginas em <ph name="LANGUAGE_NAME" /> deste site?</translation>
 <translation id="3030414234702425231">Como você está saindo de uma conta gerenciada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, os dados do Chrome serão excluídos deste dispositivo, mas permanecerão na sua Conta do Google.</translation>
-<translation id="3148434565183091099">Para ter seus favoritos em todos os seus dispositivos, faça login no Chrome.</translation>
 <translation id="3148688391461398285">Tenha uma experiência melhor no Google Chrome com base no seu local.</translation>
 <translation id="3167189358072330585">Sua conta não funciona no Google Chrome. Entre em contato com o administrador do domínio ou use uma Conta do Google normal para fazer login.</translation>
 <translation id="3196546062792660320">O Chrome permite que você otimize seu tempo trazendo suas contas para a Web. É possível adicionar ou remover contas nas configurações.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
index ee8689e..c1368ed 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
 <translation id="1282031177488366470">Ajudar a melhorar as funcionalidades e o desempenho do Chrome</translation>
-<translation id="1326317727527857210">Para obter os separadores dos seus outros dispositivos, inicie sessão no Chrome.</translation>
 <translation id="1682483655351012182">Sincronizar os dados do Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de Privacidade do Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">O Chrome ficou ainda melhor! Está disponível uma nova versão.</translation>
 <translation id="257708665678654955">Pretende que o Google Chrome se ofereça para traduzir as páginas em <ph name="LANGUAGE_NAME" /> deste site da próxima vez?</translation>
 <translation id="3030414234702425231">Uma vez que está a terminar sessão numa conta gerida por <ph name="SIGNOUT_MANAGED_DOMAIN" />, os seus dados do Chrome serão eliminados deste dispositivo. Contudo, permanecem na sua Conta Google.</translation>
-<translation id="3148434565183091099">Para obter os seus marcadores em todos os dispositivos, inicie sessão no Chrome.</translation>
 <translation id="3148688391461398285">Obtenha uma melhor experiência no Chrome com base na sua localização.</translation>
 <translation id="3167189358072330585">A sua conta não funciona no Google Chrome. Contacte o gestor do domínio ou utilize uma Conta Google normal para iniciar sessão.</translation>
 <translation id="3196546062792660320">O Chrome poupa o seu tempo ao trazer as suas contas para a Web. Pode adicionar ou remover contas nas Definições.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
index 09fcffaf..6e45d41 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="1282031177488366470">Contribuie la îmbunătățirea funcțiilor și performanței Chrome</translation>
-<translation id="1326317727527857210">Pentru a accesa filele de pe alte dispozitive, conectează-te la Chrome.</translation>
 <translation id="1682483655351012182">Sincronizează-ți datele din Chromium</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notificare privind confidențialitatea Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome a devenit și mai bun! Este disponibilă o nouă versiune.</translation>
 <translation id="257708665678654955">Dorești ca data viitoare Google Chrome să propună traducerea paginilor în limba <ph name="LANGUAGE_NAME" /> de pe acest site?</translation>
 <translation id="3030414234702425231">Deoarece te deconectezi de la un cont gestionat de <ph name="SIGNOUT_MANAGED_DOMAIN" />, datele tale Chrome de pe acest dispozitiv vor fi șterse. Datele tale vor rămâne în Contul Google.</translation>
-<translation id="3148434565183091099">Pentru a accesa marcajele pe toate dispozitivele, conectează-te la Chrome.</translation>
 <translation id="3148688391461398285">Beneficiați de o experiență mai bună în Chrome pe baza locației dvs.</translation>
 <translation id="3167189358072330585">Contul nu funcționează pe Google Chrome. Contactează administratorul domeniului sau folosește un Cont Google obișnuit pentru a te conecta.</translation>
 <translation id="3196546062792660320">Folosind Chrome, economisești timp, deoarece te conectează la conturi și pe web. Poți să adaugi sau să elimini conturi din Setări.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
index e815043c..8dd46501 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
 <translation id="1282031177488366470">Помочь улучшить производительность и функции Chrome</translation>
-<translation id="1326317727527857210">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="1682483655351012182">Синхронизировать данные Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Примечание о конфиденциальности Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome становится лучше! Доступна новая версия.</translation>
 <translation id="257708665678654955">Хотите, чтобы Google Chrome всегда предлагал перевести этот сайт, когда обнаружит на его страницах <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Обратите внимание, что данные Chrome будут удалены с устройства, но останутся в вашем аккаунте Google.</translation>
-<translation id="3148434565183091099">Чтобы получить доступ к закладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="3148688391461398285">С геоданными в браузере Chrome будет ещё больше функций.</translation>
 <translation id="3167189358072330585">Ваш аккаунт не поддерживается в Google Chrome. Обратитесь к администратору домена или войдите с помощью обычного аккаунта Google.</translation>
 <translation id="3196546062792660320">Чтобы сэкономить ваше время, Chrome будет использовать аккаунты, сохраненные на вашем устройстве. Добавить или удалить их можно в настройках.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
index 9e63a9b6..2e6c325 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
 <translation id="1282031177488366470">Pomoc so zlepšovaním funkcií a výkonu Chromu</translation>
-<translation id="1326317727527857210">Ak chcete získať karty z ďalších svojich zariadení, prihláste sa do Chromu.</translation>
 <translation id="1682483655351012182">Synchronizácia údajov Chromu</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Upozornenie o ochrane súkromia v prehliadači Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Prehliadač Chrome bol práve vylepšený. K dispozícii je nová verzia.</translation>
 <translation id="257708665678654955">Chcete, aby prehliadač Google Chrome nabudúce ponúkol možnosť prekladu stránok tohto webu v jazyku <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Odhlasujete sa z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />, takže údaje Chromu budú z tohto zariadenia odstránené. Vaše údaje zostanú vo vašom účte Google.</translation>
-<translation id="3148434565183091099">Ak chcete mať záložky na všetkých zariadeniach, prihláste sa do Chromu.</translation>
 <translation id="3148688391461398285">Získajte lepšie prostredie v prehliadači Chrome na základe svojej polohy.</translation>
 <translation id="3167189358072330585">Váš účet nefunguje v prehliadači Google Chrome. Kontaktujte správcu domény alebo sa prihláste pomocou bežného účtu Google.</translation>
 <translation id="3196546062792660320">Vaše účty sú na webe, čím Chrome šetrí váš čas. Účty môžete pridávať alebo odstraňovať v nastaveniach.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
index c873e34..e1ac614 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
 <translation id="1282031177488366470">Pomagajte izboljšati funkcije in delovanje Chroma</translation>
-<translation id="1326317727527857210">Če želite dostopati do zavihkov v drugih napravah, se prijavite v Chrome.</translation>
 <translation id="1682483655351012182">Sinhronizacija podatkov v Chromu</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Obvestilo o zasebnosti za Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome je izboljšan! Na voljo je nova različica.</translation>
 <translation id="257708665678654955">Želite, da Google Chrome naslednjič ponudi prevod strani v jeziku <ph name="LANGUAGE_NAME" /> s tega spletnega mesta?</translation>
 <translation id="3030414234702425231">Ker se boste odjavili iz računa, ki ga upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />, boste iz te naprave izbrisali podatke v Chromu. Vaši podatki bodo še vedno na voljo v Google Računu.</translation>
-<translation id="3148434565183091099">Če želite dostopati do zaznamkov v vseh napravah, se prijavite v Chrome.</translation>
 <translation id="3148688391461398285">Zagotovite si boljšo izkušnjo uporabe Chroma na podlagi lokacije</translation>
 <translation id="3167189358072330585">Vaš račun ne deluje v Google Chromu. Obrnite se na skrbnika domene ali za prijavo uporabite običajen Google Račun.</translation>
 <translation id="3196546062792660320">Chrome poskrbi, da so vaši računi v spletu, in vam tako prihrani čas. Račune lahko dodajate ali odstranjujete v nastavitvah.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
index 1ac1bf7..f2cdcc3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
 <translation id="1282031177488366470">Помозите нам да побољшамо Chrome-ове функције и учинак</translation>
-<translation id="1326317727527857210">Да би вам картице биле доступне на другим уређајима, пријавите се у Chrome.</translation>
 <translation id="1682483655351012182">Синхронизујте Chrome податке</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Обавештење о приватности за Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome је управо постао бољи! Доступна је нова верзија.</translation>
 <translation id="257708665678654955">Желите ли да Google Chrome следећи пут понуди да преведе странице са овог сајта чији је језик <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />, што ће избрисати Chrome податке са овог уређаја. Подаци ће остати на Google налогу.</translation>
-<translation id="3148434565183091099">Да би вам обележивачи били доступни на свим уређајима, пријавите се у Chrome.</translation>
 <translation id="3148688391461398285">Chrome ће вам пружити више ако му омогућите приступ локацији.</translation>
 <translation id="3167189358072330585">Налог не функционише на Google Chrome-у. Контактирајте администратора домена или се пријавите помоћу обичног Google налога.</translation>
 <translation id="3196546062792660320">Chrome вам штеди време тако што поставља налоге на веб. Можете да додајете или уклањате налоге у подешавањима.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
index 2f72e23..c000b15d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
 <translation id="1282031177488366470">Bidra till att förbättra Chromes funktioner och prestanda</translation>
-<translation id="1326317727527857210">Logga in i Chrome om du vill ha samma flikar tillgängliga på alla enheter.</translation>
 <translation id="1682483655351012182">Synkronisera data i Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Sekretessmeddelande för Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome har blivit ännu bättre! En ny version finns tillgänglig.</translation>
 <translation id="257708665678654955">Vill du att Google Chrome ska översätta sidor skrivna på <ph name="LANGUAGE_NAME" /> på den här webbplatsen nästa gång?</translation>
 <translation id="3030414234702425231">Din data i Chrome raderas från den här enheten eftersom du loggar ut från ett konto som hanteras av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Din data finns kvar i Google-kontot.</translation>
-<translation id="3148434565183091099">Logga in i Chrome om du vill få tillgång till samma bokmärken på alla enheter.</translation>
 <translation id="3148688391461398285">Ange din plats och få en bättre upplevelse när du använder Chrome.</translation>
 <translation id="3167189358072330585">Kontot fungerar inte på Google Chrome. Kontakta domänadministratören eller logga in med ett vanligt Google-konto.</translation>
 <translation id="3196546062792660320">Med Chrome sparar du tid genom att dina konton blir tillgängliga på nätet. Du kan lägga till och ta bort konton i inställningarna.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
index 3d9c5049..a12eab5b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="1282031177488366470">Tusaidie Tuboreshe Utendaji na Vipengele vya Chrome</translation>
-<translation id="1326317727527857210">Ili upate vichupo kutoka kwenye vifaa vyako vingine, ingia katika Chrome.</translation>
 <translation id="1682483655351012182">Sawazisha Data Yako kwenye Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Ilani ya Faragha ya Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome imekuwa bora! Toleo jipya linapatikana.</translation>
 <translation id="257708665678654955">Ungependa Google Chrome ijitolee kutafsiri kurasa za <ph name="LANGUAGE_NAME" /> kutoka tovuti hii wakati ujao?</translation>
 <translation id="3030414234702425231">Kwa sababu unaondoka kwenye akaunti inayodhibitiwa na <ph name="SIGNOUT_MANAGED_DOMAIN" />, data yako ya Chrome itafutwa kwenye kifaa hiki, lakini itasalia katika Akaunti yako ya Google.</translation>
-<translation id="3148434565183091099">Ingia katika Chrome ili upate alamisho zako kwenye vifaa vyako vyote.</translation>
 <translation id="3148688391461398285">Pata hali bora ya utumiaji katika Chrome kulingana na mahali pako.</translation>
 <translation id="3167189358072330585">Akaunti yako haifanyi kazi kwenye Google Chrome. Tafadhali wasiliana na msimamizi wako wa kikoa au utumie Akaunti yako ya kawaida ya Google kuingia.</translation>
 <translation id="3196546062792660320">Chrome inakuokolea wakati kwa kuleta akaunti zako kwenye wavuti. Unaweza kuongeza au kuondoa akaunti katika Mipangilio.</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 0e681ecf..99a5c8f 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
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
 <translation id="1282031177488366470">Chromeமின் அம்சங்களையும் செயல்திறனையும் மேம்படுத்த உதவுக</translation>
-<translation id="1326317727527857210">உங்கள் பிற சாதனங்களிலிருந்து தாவல்களைப் பெற, Chrome இல் உள்நுழையவும்.</translation>
 <translation id="1682483655351012182">Chrome தரவை ஒத்திசை</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome தனியுரிமை அறிக்கை</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome தற்போதுதான் சிறப்பைப் பெற்றது! புதிய பதிப்பு உள்ளது.</translation>
 <translation id="257708665678654955">அடுத்த முறை இந்தத் தளத்தின் <ph name="LANGUAGE_NAME" /> பக்கங்களை மொழிபெயர்க்கவா என்று Google Chrome  கேட்க வேண்டுமென விரும்புகிறீர்களா?</translation>
 <translation id="3030414234702425231">நீங்கள் <ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுவதால், இந்தச் சாதனத்திலிருந்து உங்கள் Chrome தரவு நீக்கப்படும். ஆனால் உங்கள் Google கணக்கிலிருந்து உங்கள் தரவு நீக்கப்படாது.</translation>
-<translation id="3148434565183091099">உங்கள் எல்லா சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, Chrome இல் உள்நுழையவும்.</translation>
 <translation id="3148688391461398285">உங்கள் இருப்பிடத்தின் அடிப்படையில் Chrome இல் சிறந்த அனுபவத்தைப் பெறவும்.</translation>
 <translation id="3167189358072330585">Google Chromeமில் உங்கள் கணக்கு செயல்படாது. உங்கள் டொமைன் நிர்வாகியைத் தொடர்பு கொள்ளவும் அல்லது உள்நுழைவதற்கு வழக்கமான Google கணக்கைப் பயன்படுத்தவும்.</translation>
 <translation id="3196546062792660320">இணையத்தில் உங்கள் கணக்குகளில் உள்நுழைவதற்கான நேரத்தை 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 302cf66..0dc76ad 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
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
 <translation id="1282031177488366470">Chrome ఫీచర్‌లు మరియు పనితీరును మెరుగుపరచడంలో సహాయపడండి</translation>
-<translation id="1326317727527857210">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్‌లను పొందడానికి, Chromeకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="1682483655351012182">మీ Chrome డేటాను సింక్ చేయండి</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome గోప్యతా నోటీసు</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome ఇప్పుడే మెరుగుపరచబడింది! కొత్త వెర్షన్ అందుబాటులో ఉంది.</translation>
 <translation id="257708665678654955">ఈ సైట్‌లోని <ph name="LANGUAGE_NAME" /> పేజీలను మీరు తర్వాతిసారి సందర్శించినప్పుడు, వాటిని అనువదించే సదుపాయాన్ని Google Chrome అందించాలని కోరుకుంటున్నారా?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహిస్తున్న ఖాతా నుండి మీరు సైన్ అవుట్ చేస్తున్నారు కనుక మీ Chrome డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
-<translation id="3148434565183091099">మీ అన్ని పరికరాలలో మీ బుక్‌మార్క్‌లను పొందడానికి, Chromeకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="3148688391461398285">మీ స్థానం ఆధారంగా Chromeలో మెరుగైన అనుభవాన్ని పొందండి.</translation>
 <translation id="3167189358072330585">మీ ఖాతా Google Chromeలో పని చేయదు. దయచేసి మీ డొమైన్ నిర్వాహకుడిని సంప్రదించండి లేదా సైన్ ఇన్ చేయడానికి సాధారణ Google ఖాతాను ఉపయోగించండి.</translation>
 <translation id="3196546062792660320">Chrome మీ ఖాతాలను వెబ్‌లో అందించడం ద్వారా మీకు సమయాన్ని ఆదా చేస్తుంది. మీరు సెట్టింగ్‌లలో ఖాతాలను జోడించవచ్చు లేదా తీసివేయవచ్చు.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
index a6f93de..27c3c7e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
 <translation id="1282031177488366470">ช่วยปรับปรุงฟีเจอร์และประสิทธิภาพของ Chrome</translation>
-<translation id="1326317727527857210">ลงชื่อเข้าใช้ Chrome เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="1682483655351012182">ซิงค์ข้อมูล Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัวของ Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome พัฒนาใหม่! มีรุ่นใหม่ให้ใช้งานแล้ว</translation>
 <translation id="257708665678654955">คุณต้องการให้ Google Chrome เสนอการแปลหน้าภาษา<ph name="LANGUAGE_NAME" />จากเว็บไซต์นี้ในครั้งถัดไปไหม</translation>
 <translation id="3030414234702425231">เนื่องจากคุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> ข้อมูล Chrome ของคุณจะถูกลบออกจากอุปกรณ์นี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
-<translation id="3148434565183091099">ลงชื่อเข้าใช้ Chrome เพื่อรับบุ๊กมาร์กในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="3148688391461398285">รับประสบการณ์ที่ดีขึ้นใน Chrome ตามสถานที่ที่คุณอยู่</translation>
 <translation id="3167189358072330585">บัญชีของคุณใช้งานไม่ได้บน Google Chrome โปรดติดต่อผู้ดูแลระบบโดเมนหรือใช้บัญชี Google ปกติเพื่อลงชื่อเข้าใช้</translation>
 <translation id="3196546062792660320">Chrome ช่วยคุณประหยัดเวลาโดยนำบัญชีของคุณไปไว้บนเว็บ คุณสามารถเพิ่มหรือนำบัญชีออกได้ในการตั้งค่า</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
index d4c83b0..dbc94ac 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
 <translation id="1282031177488366470">Chrome'un Özelliklerini ve Performansını İyileştirmeye Yardımcı Olun</translation>
-<translation id="1326317727527857210">Diğer cihazlarınızdaki sekmelerinize ulaşmak için Chrome'da oturum açın.</translation>
 <translation id="1682483655351012182">Chrome Verilerimi Senkronize Et</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome Gizlilik Uyarısı</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome daha da iyi hale geldi! Yeni bir sürüm var.</translation>
 <translation id="257708665678654955">Google Chrome'un bir dahaki sefere bu siteden <ph name="LANGUAGE_NAME" /> dilindeki sayfaları çevirmeyi önermesini ister misiniz?</translation>
 <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapattığınız için Chrome verileriniz bu cihazdan silinecek. Ancak verileriniz Google Hesabınızda kalmaya devam edecek.</translation>
-<translation id="3148434565183091099">Yer işaretlerinizi tüm cihazlarınızda almak için Chrome'da oturum açın.</translation>
 <translation id="3148688391461398285">Konumunuza dayalı olarak Chrome'da daha iyi deneyim elde edin.</translation>
 <translation id="3167189358072330585">Hesabınız Google Chrome'da kullanılamıyor. Lütfen alan adı yöneticinizle iletişim kurun veya oturum açmak için normal bir Google Hesabı kullanın.</translation>
 <translation id="3196546062792660320">Chrome, hesaplarınızı web'e getirerek size zaman kazandırır. Hesapları Ayarlar'dan ekleyebilir veya kaldırabilirsiniz.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
index fe4b838..eda12f2 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
 <translation id="1282031177488366470">Допоможіть покращити функції й ефективність Chrome</translation>
-<translation id="1326317727527857210">Щоб мати доступ до вкладок з інших пристроїв, увійдіть в обліковий запис Chrome.</translation>
 <translation id="1682483655351012182">Синхронізувати дані Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Примітка про конфіденційність Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome став ще кращим! Доступна нова версія.</translation>
 <translation id="257708665678654955">Хочете, щоб Google Chrome наступного разу пропонував перекласти сторінки цього сайту, написані такою мовою: <ph name="LANGUAGE_NAME" />?</translation>
 <translation id="3030414234702425231">Оскільки ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />, ваші дані Chrome буде видалено з цього пристрою. Вони залишаться в обліковому записі Chrome.</translation>
-<translation id="3148434565183091099">Щоб мати доступ до закладок на всіх своїх пристроях, увійдіть в обліковий запис Chrome.</translation>
 <translation id="3148688391461398285">Знаючи ваше місцезнаходження, ми зможемо створити для вас зручніші умови роботи в Chrome.</translation>
 <translation id="3167189358072330585">Ваш обліковий запис не працює в Google Chrome. Зв’яжіться з адміністратором свого домену або ввійдіть у звичайний обліковий запис Google.</translation>
 <translation id="3196546062792660320">З Chrome ви можете заощадити час, розмістивши свої облікові записи в Інтернеті. Додати або вилучити облікові записи можна в налаштуваннях.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
index a8fec7b..bd76b93 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
 <translation id="1282031177488366470">Giúp cải thiện hiệu suất và các tính năng của Chrome</translation>
-<translation id="1326317727527857210">Để có các tab từ các thiết bị khác của bạn, hãy đăng nhập vào Chrome.</translation>
 <translation id="1682483655351012182">Đồng bộ hóa dữ liệu của bạn trên Chrome</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">T.báo b.mật của Google Chrome</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome được cải tiến hơn! Đã có phiên bản mới.</translation>
 <translation id="257708665678654955">Bạn có muốn Google Chrome đề xuất dịch các trang <ph name="LANGUAGE_NAME" /> của trang web này vào lần tiếp theo không?</translation>
 <translation id="3030414234702425231">Vì bạn đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý, nên dữ liệu Chrome của bạn sẽ bị xóa khỏi thiết bị này. Dữ liệu của bạn sẽ vẫn còn trong Tài khoản Google của bạn.</translation>
-<translation id="3148434565183091099">Để nhận dấu trang trên tất cả các thiết bị của bạn, hãy đăng nhập vào Chrome.</translation>
 <translation id="3148688391461398285">Có được trải nghiệm tốt hơn trong Chrome dựa trên vị trí của bạn.</translation>
 <translation id="3167189358072330585">Tài khoản của bạn không hoạt động trên Google Chrome. Vui lòng liên hệ với quản trị viên miền của bạn hoặc sử dụng Tài khoản Google thông thường để đăng nhập.</translation>
 <translation id="3196546062792660320">Chrome giúp bạn tiết kiệm thời gian bằng cách đưa tài khoản của bạn lên web. Bạn có thể thêm hoặc xóa tài khoản trong Cài đặt.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
index bab6d8b..813e37c 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-CN">
 <translation id="1282031177488366470">帮助我们改进 Chrome 的功能和性能</translation>
-<translation id="1326317727527857210">要访问您在其他设备上的标签页,请登录 Chrome。</translation>
 <translation id="1682483655351012182">同步 Chrome 数据</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome 隐私权声明</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome 浏览器刚刚经过了改进!新版本已推出。</translation>
 <translation id="257708665678654955">下次访问这个网站时,您希望 Google Chrome 翻译其中的<ph name="LANGUAGE_NAME" />网页吗?</translation>
 <translation id="3030414234702425231">由于您正要退出的帐号是由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理,因此系统将会从这部设备中删除您的 Chrome 数据,但这些数据仍会保留在您的 Google 帐号中。</translation>
-<translation id="3148434565183091099">要将您的书签同步到您所有的设备上,请登录 Chrome。</translation>
 <translation id="3148688391461398285">要在Chrome中获得更好的使用体验,需要用到您的位置信息。</translation>
 <translation id="3167189358072330585">无法在 Google Chrome 上登录您的帐号。请与您的网域管理员联系,或使用普通的 Google 帐号登录。</translation>
 <translation id="3196546062792660320">为节省您的时间,Chrome 已将您的 Google 帐号同步到网络上。您可在“设置”中添加或移除帐号。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
index 697bc86a..1b432c72 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
 <translation id="1282031177488366470">協助改善 Chrome 的功能與效能</translation>
-<translation id="1326317727527857210">如要存取您在其他裝置上開啟的分頁,請登入 Chrome。</translation>
 <translation id="1682483655351012182">同步處理你的 Chrome 資料</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome 隱私權聲明</translation>
@@ -15,7 +14,6 @@
 <translation id="2576431527583832481">Chrome 現在變得更進步了!歡迎你升級使用新版本。</translation>
 <translation id="257708665678654955">下次造訪這個網站時,需要 Google Chrome 為您翻譯其中的<ph name="LANGUAGE_NAME" />網頁嗎?</translation>
 <translation id="3030414234702425231">由於你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶,系統將刪除你在這個裝置上的 Chrome 資料,但這些資料仍會保留在你的 Google 帳戶中。</translation>
-<translation id="3148434565183091099">登入 Chrome 之後即可在你的所有裝置上使用自己的書籤。</translation>
 <translation id="3148688391461398285">讓應用程式根據您的位置資訊在 Chrome 中為您提供更優質的服務。</translation>
 <translation id="3167189358072330585">無法使用您的帳戶登入 Google Chrome,請洽詢您的網域管理員或使用一般 Google 帳戶登入。</translation>
 <translation id="3196546062792660320">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 f667507..27c665d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -355,7 +355,7 @@
 <translation id="605721222689873409">JJ</translation>
 <translation id="6066301408025741299">Zum Abbrechen tippen</translation>
 <translation id="6108923351542677676">Einrichtung läuft...</translation>
-<translation id="6119050551270742952">Im Inkognitomodus</translation>
+<translation id="6119050551270742952">Die aktuelle Webseite ist im Inkognitomodus</translation>
 <translation id="6122191549521593678">Online</translation>
 <translation id="6127379762771434464">Eintrag entfernt</translation>
 <translation id="6136914049981179737">Vor Sek.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 2d2cd2e2..6cc4851e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -315,6 +315,7 @@
 Handoff must also be enabled in the General section of Settings, and your devices must use the same iCloud account.</translation>
 <translation id="5551897871312988470">Offer to translate</translation>
 <translation id="5556459405103347317">Reload</translation>
+<translation id="5592679540098330836">Turn on sync for <ph name="NAME" /></translation>
 <translation id="5614553682702429503">Save password?</translation>
 <translation id="5626245204502895507">The file could not be downloaded at this time.</translation>
 <translation id="5631164295104953411">Add payment method</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index 4e81b200..f3d7e5e7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -315,6 +315,7 @@
 A "Transição" também deve ser ativada na seção "Geral" das configurações. Seus dispositivos devem usar a mesma conta do iCloud.</translation>
 <translation id="5551897871312988470">Oferecer para traduzir</translation>
 <translation id="5556459405103347317">Recarregar</translation>
+<translation id="5592679540098330836">Ativar sincronização de <ph name="NAME" /></translation>
 <translation id="5614553682702429503">Salvar senha?</translation>
 <translation id="5626245204502895507">Não foi possível fazer download do arquivo neste momento.</translation>
 <translation id="5631164295104953411">Adicionar forma de pagamento.</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index ec8b59f..c2d8130 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -487,9 +487,6 @@
      flag_descriptions::kFillOnAccountSelectHttpName,
      flag_descriptions::kFillOnAccountSelectHttpDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(password_manager::features::kFillOnAccountSelectHttp)},
-    {"enable-send-tab-to-self", flag_descriptions::kSendTabToSelfName,
-     flag_descriptions::kSendTabToSelfDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(switches::kSyncSendTabToSelf)},
     {"enable-send-tab-to-self-show-sending-ui",
      flag_descriptions::kSendTabToSelfShowSendingUIName,
      flag_descriptions::kSendTabToSelfShowSendingUIDescription,
diff --git a/ios/chrome/browser/interstitials/ios_security_interstitial_page.h b/ios/chrome/browser/interstitials/ios_security_interstitial_page.h
index 166ab5b..c3cb7dd 100644
--- a/ios/chrome/browser/interstitials/ios_security_interstitial_page.h
+++ b/ios/chrome/browser/interstitials/ios_security_interstitial_page.h
@@ -30,6 +30,9 @@
   // Creates an interstitial and shows it.
   void Show();
 
+  // web::WebInterstitialDelegate implementation.
+  std::string GetHtmlContents() const override;
+
  protected:
   // Returns true if the interstitial should create a new navigation item.
   virtual bool ShouldCreateNewNavigation() const = 0;
@@ -42,9 +45,6 @@
   // |web_interstitial_| will now have a value.
   virtual void AfterShow() = 0;
 
-  // web::WebInterstitialDelegate implementation.
-  std::string GetHtmlContents() const override;
-
   // Returns the formatted host name for the request url.
   base::string16 GetFormattedHostName() const;
 
diff --git a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_ios.mm b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_ios.mm
index 1c9beb4..65c59dc2 100644
--- a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_ios.mm
+++ b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_ios.mm
@@ -14,7 +14,6 @@
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
 #include "components/send_tab_to_self/send_tab_to_self_model.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/infobars/infobar.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
@@ -60,11 +59,6 @@
 
 void SendTabToSelfClientServiceIOS::EntriesAddedRemotely(
     const std::vector<const SendTabToSelfEntry*>& new_entries) {
-  // TODO(crbug.com/953513): Use utils file instead.
-  if (!base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
-    return;
-  }
-
   if (new_entries.empty()) {
     return;
   }
@@ -115,9 +109,6 @@
 
 void SendTabToSelfClientServiceIOS::EntriesRemovedRemotely(
     const std::vector<std::string>& guids) {
-  if (!base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
-    return;
-  }
   NOTIMPLEMENTED();
 }
 
diff --git a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util.mm b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util.mm
index cdaa2c0..9c024c7 100644
--- a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util.mm
+++ b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util.mm
@@ -9,7 +9,6 @@
 #include "components/send_tab_to_self/features.h"
 #include "components/send_tab_to_self/send_tab_to_self_model.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
 #include "components/sync_device_info/device_info.h"
@@ -36,13 +35,8 @@
 
 namespace send_tab_to_self {
 
-bool IsReceivingEnabled() {
-  return base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf);
-}
-
 bool IsSendingEnabled() {
-  return IsReceivingEnabled() &&
-         base::FeatureList::IsEnabled(kSendTabToSelfShowSendingUI);
+  return base::FeatureList::IsEnabled(kSendTabToSelfShowSendingUI);
 }
 
 bool IsUserSyncTypeActive(ios::ChromeBrowserState* browser_state) {
diff --git a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.mm b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.mm
index 19ce620..b7c3663 100644
--- a/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.mm
+++ b/ios/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.mm
@@ -9,7 +9,6 @@
 #include "components/send_tab_to_self/features.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/send_tab_to_self/test_send_tab_to_self_model.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #include "ios/chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
 #import "testing/gtest_mac.h"
@@ -83,38 +82,16 @@
 
 TEST_F(SendTabToSelfUtilTest, AreFlagsEnabled) {
   task_environment_.RunUntilIdle();
-  scoped_feature_list_.InitWithFeatures(
-      {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI}, {});
+  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI}, {});
 
   EXPECT_TRUE(IsSendingEnabled());
-  EXPECT_TRUE(IsReceivingEnabled());
 }
 
 TEST_F(SendTabToSelfUtilTest, AreFlagsDisabled) {
   task_environment_.RunUntilIdle();
-  scoped_feature_list_.InitWithFeatures(
-      {}, {switches::kSyncSendTabToSelf, kSendTabToSelfShowSendingUI});
+  scoped_feature_list_.InitWithFeatures({}, {kSendTabToSelfShowSendingUI});
 
   EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_FALSE(IsReceivingEnabled());
-}
-
-TEST_F(SendTabToSelfUtilTest, IsReceivingEnabled) {
-  task_environment_.RunUntilIdle();
-  scoped_feature_list_.InitWithFeatures({switches::kSyncSendTabToSelf},
-                                        {kSendTabToSelfShowSendingUI});
-
-  EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_TRUE(IsReceivingEnabled());
-}
-
-TEST_F(SendTabToSelfUtilTest, IsOnlySendingEnabled) {
-  task_environment_.RunUntilIdle();
-  scoped_feature_list_.InitWithFeatures({kSendTabToSelfShowSendingUI},
-                                        {switches::kSyncSendTabToSelf});
-
-  EXPECT_FALSE(IsSendingEnabled());
-  EXPECT_FALSE(IsReceivingEnabled());
 }
 
 TEST_F(SendTabToSelfUtilTest, NotHTTPOrHTTPS) {
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_handler.h b/ios/chrome/browser/ssl/ios_ssl_error_handler.h
index 517bb78..bffc9b9 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_handler.h
+++ b/ios/chrome/browser/ssl/ios_ssl_error_handler.h
@@ -10,6 +10,7 @@
 #include "base/timer/timer.h"
 #include "components/captive_portal/captive_portal_detector.h"
 #include "components/captive_portal/captive_portal_types.h"
+#include "ios/chrome/browser/interstitials/ios_security_interstitial_page.h"
 #import "ios/web/public/web_state/web_state_user_data.h"
 #include "url/gurl.h"
 
@@ -32,12 +33,15 @@
 class IOSSSLErrorHandler : public web::WebStateUserData<IOSSSLErrorHandler> {
  public:
   // Entry point for the class.
-  static void HandleSSLError(web::WebState* web_state,
-                             int cert_error,
-                             const net::SSLInfo& info,
-                             const GURL& request_url,
-                             bool overridable,
-                             base::OnceCallback<void(bool)> callback);
+  static void HandleSSLError(
+      web::WebState* web_state,
+      int cert_error,
+      const net::SSLInfo& info,
+      const GURL& request_url,
+      bool overridable,
+      int64_t navigation_id,
+      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(NSString*)> blocking_page_callback);
   ~IOSSSLErrorHandler() override;
 
  private:
@@ -45,16 +49,22 @@
 
   // Creates an error handler for the given |web_state| and |request_url|.
   // The |cert_error| and SSL |info| represent the SSL error detected which
-  // triggered the display of the SSL interstitial. If |overridable| is true,
-  // the interstitial will allow the error to be ignored in order to proceed to
+  // triggered the display of the SSL interstitial for a particular
+  // |navigation_id|, which is retrieved from
+  // NavigationContext::GetNavigationId(). If |overridable| is true, the
+  // interstitial will allow the error to be ignored in order to proceed to
   // |request_url|. |callback| will be called after the user is done interacting
-  // with this interstitial.
-  IOSSSLErrorHandler(web::WebState* web_state,
-                     int cert_error,
-                     const net::SSLInfo& info,
-                     const GURL& request_url,
-                     bool overridable,
-                     base::OnceCallback<void(bool)> callback);
+  // with this interstitial. |blocking_page_callback| will be called for
+  // committed interstitials to fetch the HTML of the interstitial page.
+  IOSSSLErrorHandler(
+      web::WebState* web_state,
+      int cert_error,
+      const net::SSLInfo& info,
+      const GURL& request_url,
+      bool overridable,
+      int64_t navigation_id,
+      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(NSString*)> blocking_page_callback);
 
   // Begins captive portal detection to determine which interstitial should be
   // displayed.
@@ -63,10 +73,14 @@
   // portal detection.
   void HandleCaptivePortalDetectionResult(
       const captive_portal::CaptivePortalDetector::Results& results);
-  // Displays an SSL error page interstitial.
+  // Displays an SSL error page interstitial, or if committed interstitials are
+  // enabled, returns HTML content for the error page by running
+  // |blocking_page_callback_|.
   void ShowSSLInterstitial();
-  // Displays a Captive Portal interstitial. The |landing_url| is the web page
-  // which allows the user to complete their connection to the network.
+  // Displays a Captive Portal interstitial, or if committed interstitials are
+  // enabled, returns the HTML content for the error page by running
+  // |blocking_page_callback_|. The |landing_url| is the web page which allows
+  // the user to complete their connection to the network.
   void ShowCaptivePortalInterstitial(const GURL& landing_url);
   // Records a metric to classify if SSL errors are due to a Captive Portal
   // state.
@@ -84,10 +98,14 @@
   // Whether or not the user can ignore this error in order to continue loading
   // |request_url_|.
   const bool overridable_ = false;
+  // The id of the navigation.
+  const int64_t navigation_id_ = 0;
   // The callback to run after the user is done interacting with this
   // interstitial. |proceed| will be true if the user wants to procced with the
   // page load of |request_url_|, false otherwise.
   base::OnceCallback<void(bool proceed)> callback_;
+  // The callback to run for showing a committed interstitial.
+  base::OnceCallback<void(NSString*)> blocking_page_callback_;
   // A timer to display the SSL interstitial if the captive portal detection
   // takes too long.
   base::OneShotTimer timer_;
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_handler.mm b/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
index e6739cc0..3a1e57c 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
+++ b/ios/chrome/browser/ssl/ios_ssl_error_handler.mm
@@ -8,6 +8,7 @@
 #include "base/callback.h"
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/strings/sys_string_conversions.h"
 #include "components/captive_portal/captive_portal_detector.h"
 #include "components/security_interstitials/core/ssl_error_ui.h"
 #include "ios/chrome/browser/ssl/captive_portal_detector_tab_helper.h"
@@ -15,6 +16,7 @@
 #include "ios/chrome/browser/ssl/captive_portal_metrics.h"
 #include "ios/chrome/browser/ssl/ios_captive_portal_blocking_page.h"
 #include "ios/chrome/browser/ssl/ios_ssl_blocking_page.h"
+#import "ios/chrome/browser/ssl/ios_ssl_error_tab_helper.h"
 #include "ios/web/public/browser_state.h"
 #import "ios/web/public/web_state.h"
 #include "net/ssl/ssl_info.h"
@@ -38,7 +40,9 @@
     const net::SSLInfo& info,
     const GURL& request_url,
     bool overridable,
-    base::OnceCallback<void(bool)> callback) {
+    int64_t navigation_id,
+    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(NSString*)> blocking_page_callback) {
   DCHECK(!web_state->IsShowingWebInterstitial());
   DCHECK(web_state);
   DCHECK(!FromWebState(web_state));
@@ -46,26 +50,32 @@
   // check if the cert is from a known captive portal.
 
   web_state->SetUserData(
-      UserDataKey(), base::WrapUnique(new IOSSSLErrorHandler(
-                         web_state, cert_error, info, request_url, overridable,
-                         std::move(callback))));
+      UserDataKey(),
+      base::WrapUnique(new IOSSSLErrorHandler(
+          web_state, cert_error, info, request_url, overridable, navigation_id,
+          std::move(callback), std::move(blocking_page_callback))));
   FromWebState(web_state)->StartHandlingError();
 }
 
 IOSSSLErrorHandler::~IOSSSLErrorHandler() = default;
 
-IOSSSLErrorHandler::IOSSSLErrorHandler(web::WebState* web_state,
-                                       int cert_error,
-                                       const net::SSLInfo& info,
-                                       const GURL& request_url,
-                                       bool overridable,
-                                       base::OnceCallback<void(bool)> callback)
+IOSSSLErrorHandler::IOSSSLErrorHandler(
+    web::WebState* web_state,
+    int cert_error,
+    const net::SSLInfo& info,
+    const GURL& request_url,
+    bool overridable,
+    int64_t navigation_id,
+    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(NSString*)> blocking_page_callback)
     : web_state_(web_state),
       cert_error_(cert_error),
       ssl_info_(info),
       request_url_(request_url),
       overridable_(overridable),
+      navigation_id_(navigation_id),
       callback_(std::move(callback)),
+      blocking_page_callback_(std::move(blocking_page_callback)),
       weak_factory_(this) {}
 
 void IOSSSLErrorHandler::StartHandlingError() {
@@ -120,11 +130,21 @@
   int options_mask =
       overridable_ ? security_interstitials::SSLErrorUI::SOFT_OVERRIDE_ENABLED
                    : security_interstitials::SSLErrorUI::STRICT_ENFORCEMENT;
-  // SSLBlockingPage deletes itself when it's dismissed.
-  IOSSSLBlockingPage* page = new IOSSSLBlockingPage(
-      web_state_, cert_error_, ssl_info_, request_url_, options_mask,
-      base::Time::NowFromSystemTime(), std::move(callback_));
-  page->Show();
+  if (!blocking_page_callback_.is_null()) {
+    auto page = std::make_unique<IOSSSLBlockingPage>(
+        web_state_, cert_error_, ssl_info_, request_url_, options_mask,
+        base::Time::NowFromSystemTime(), std::move(callback_));
+    std::string error_html = page->GetHtmlContents();
+    IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
+                                                std::move(page));
+    std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
+  } else {
+    // SSLBlockingPage deletes itself when it's dismissed.
+    IOSSSLBlockingPage* page = new IOSSSLBlockingPage(
+        web_state_, cert_error_, ssl_info_, request_url_, options_mask,
+        base::Time::NowFromSystemTime(), std::move(callback_));
+    page->Show();
+  }
   // Once an interstitial is displayed, no need to keep the handler around.
   // This is the equivalent of "delete this".
   RemoveFromWebState(web_state_);
@@ -132,10 +152,19 @@
 
 void IOSSSLErrorHandler::ShowCaptivePortalInterstitial(
     const GURL& landing_url) {
-  // IOSCaptivePortalBlockingPage deletes itself when it's dismissed.
-  IOSCaptivePortalBlockingPage* page = new IOSCaptivePortalBlockingPage(
-      web_state_, request_url_, landing_url, std::move(callback_));
-  page->Show();
+  if (!blocking_page_callback_.is_null()) {
+    auto page = std::make_unique<IOSCaptivePortalBlockingPage>(
+        web_state_, request_url_, landing_url, std::move(callback_));
+    std::string error_html = page->GetHtmlContents();
+    IOSSSLErrorTabHelper::AssociateBlockingPage(web_state_, navigation_id_,
+                                                std::move(page));
+    std::move(blocking_page_callback_).Run(base::SysUTF8ToNSString(error_html));
+  } else {
+    // IOSCaptivePortalBlockingPage deletes itself when it's dismissed.
+    IOSCaptivePortalBlockingPage* page = new IOSCaptivePortalBlockingPage(
+        web_state_, request_url_, landing_url, std::move(callback_));
+    page->Show();
+  }
   // Once an interstitial is displayed, no need to keep the handler around.
   // This is the equivalent of "delete this".
   RemoveFromWebState(web_state_);
diff --git a/ios/chrome/browser/ssl/ios_ssl_error_handler_unittest.mm b/ios/chrome/browser/ssl/ios_ssl_error_handler_unittest.mm
index cde6132..bd94a49d 100644
--- a/ios/chrome/browser/ssl/ios_ssl_error_handler_unittest.mm
+++ b/ios/chrome/browser/ssl/ios_ssl_error_handler_unittest.mm
@@ -92,12 +92,14 @@
   ssl_info.cert = cert();
   GURL url(kTestHostName);
   __block bool do_not_proceed_callback_called = false;
+  base::OnceCallback<void(NSString*)> null_callback;
   IOSSSLErrorHandler::HandleSSLError(
-      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, false,
+      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, false, 0,
       base::BindRepeating(^(bool proceed) {
         EXPECT_FALSE(proceed);
         do_not_proceed_callback_called = true;
-      }));
+      }),
+      std::move(null_callback));
 
   EXPECT_TRUE(WaitForInterstitialDisplayed());
   web::WebInterstitial* interstitial = web_state()->GetWebInterstitial();
@@ -115,12 +117,14 @@
   ssl_info.cert = cert();
   GURL url(kTestHostName);
   __block bool proceed_callback_called = false;
+  base::OnceCallback<void(NSString*)> null_callback;
   IOSSSLErrorHandler::HandleSSLError(
-      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, true,
+      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, true, 0,
       base::BindRepeating(^(bool proceed) {
         EXPECT_TRUE(proceed);
         proceed_callback_called = true;
-      }));
+      }),
+      std::move(null_callback));
 
   EXPECT_TRUE(WaitForInterstitialDisplayed());
   web::WebInterstitial* interstitial = web_state()->GetWebInterstitial();
@@ -137,12 +141,14 @@
   ssl_info.cert = cert();
   GURL url(kTestHostName);
   __block bool do_not_proceed_callback_called = false;
+  base::OnceCallback<void(NSString*)> null_callback;
   IOSSSLErrorHandler::HandleSSLError(
-      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, true,
+      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, true, 0,
       base::BindRepeating(^(bool proceed) {
         EXPECT_FALSE(proceed);
         do_not_proceed_callback_called = true;
-      }));
+      }),
+      std::move(null_callback));
 
   EXPECT_TRUE(WaitForInterstitialDisplayed());
   web::WebInterstitial* interstitial = web_state()->GetWebInterstitial();
@@ -152,3 +158,23 @@
   interstitial->DontProceed();
   EXPECT_TRUE(do_not_proceed_callback_called);
 }
+
+// Tests that error HTML is returned instead of calling the usual show
+// interstitial logic when passed a non-null |blocking_page_callback|.
+TEST_F(IOSSSLErrorHandlerTest, CommittedInterstitialErrorHtml) {
+  net::SSLInfo ssl_info;
+  ssl_info.cert = cert();
+  GURL url(kTestHostName);
+  __block bool blocking_page_callback_called = false;
+  base::OnceCallback<void(bool)> null_callback;
+  base::OnceCallback<void(NSString*)> blocking_page_callback =
+      base::BindOnce(^(NSString* blocking_page_html) {
+        EXPECT_NE(blocking_page_html, nil);
+        blocking_page_callback_called = true;
+      });
+  IOSSSLErrorHandler::HandleSSLError(
+      web_state(), net::ERR_CERT_AUTHORITY_INVALID, ssl_info, url, true, 0,
+      std::move(null_callback), std::move(blocking_page_callback));
+  EXPECT_FALSE(WaitForInterstitialDisplayed());
+  EXPECT_TRUE(blocking_page_callback_called);
+}
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 df054f0..b9adb43 100644
--- a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -74,9 +74,7 @@
     datatypes.push_back(syncer::TYPED_URLS);
     datatypes.push_back(syncer::USER_EVENTS);
     datatypes.push_back(syncer::USER_CONSENTS);
-    if (base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
-      datatypes.push_back(syncer::SEND_TAB_TO_SELF);
-    }
+    datatypes.push_back(syncer::SEND_TAB_TO_SELF);
 
     return datatypes;
   }
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
index 11b9de0..fc223de 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
@@ -13,7 +13,6 @@
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "components/send_tab_to_self/features.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/passwords/password_form_filler.h"
@@ -918,8 +917,7 @@
 TEST_F(ActivityServiceControllerTest, PresentWhenOffTheRecord) {
   base::test::ScopedFeatureList scoped_features;
   scoped_features.InitWithFeatures(
-      /*enabled_features=*/{switches::kSyncSendTabToSelf,
-                            send_tab_to_self::kSendTabToSelfShowSendingUI},
+      /*enabled_features=*/{send_tab_to_self::kSendTabToSelfShowSendingUI},
       /*disabled_features=*/{});
 
   UIViewController* parentController =
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/resources/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/resources/BUILD.gn
index c698277f..69a84f10 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/resources/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/unified_consent/resources/BUILD.gn
@@ -17,5 +17,7 @@
     "unified_consent_header.imageset/Contents.json",
     "unified_consent_header.imageset/unified_consent_header@2x.png",
     "unified_consent_header.imageset/unified_consent_header@3x.png",
+    "unified_consent_header.imageset/unified_consent_header_dark@2x.png",
+    "unified_consent_header.imageset/unified_consent_header_dark@3x.png",
   ]
 }
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/Contents.json b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/Contents.json
index 4e12188..f5fdec3 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/Contents.json
+++ b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/Contents.json
@@ -1,22 +1,40 @@
 {
-    "images": [
+  "images": [
+    {
+      "idiom": "universal",
+      "scale": "2x",
+      "filename": "unified_consent_header@2x.png"
+    },
+    {
+      "idiom": "universal",
+      "scale": "2x",
+      "filename": "unified_consent_header_dark@2x.png",
+      "appearances" : [
         {
-            "idiom": "universal",
-            "scale": "1x"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "unified_consent_header@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "unified_consent_header@3x.png"
+          "appearance" : "luminosity",
+          "value" : "dark"
         }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
+      ]
+    },
+    {
+      "idiom": "universal",
+      "scale": "3x",
+      "filename": "unified_consent_header@3x.png"
+    },
+    {
+      "idiom": "universal",
+      "scale": "3x",
+      "filename": "unified_consent_header_dark@3x.png",
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ]
     }
+  ],
+  "info": {
+      "version": 1,
+      "author": "xcode"
+  }
 }
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@2x.png b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@2x.png
new file mode 100644
index 0000000..9c55d9c
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@3x.png b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@3x.png
new file mode 100644
index 0000000..4592d7a
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/unified_consent/resources/unified_consent_header.imageset/unified_consent_header_dark@3x.png
Binary files differ
diff --git a/ios/chrome/browser/web/chrome_web_client.h b/ios/chrome/browser/web/chrome_web_client.h
index 8c690fa..032509a 100644
--- a/ios/chrome/browser/web/chrome_web_client.h
+++ b/ios/chrome/browser/web/chrome_web_client.h
@@ -48,6 +48,7 @@
       const net::SSLInfo& ssl_info,
       const GURL& request_url,
       bool overridable,
+      int64_t navigation_id,
       const base::Callback<void(bool)>& callback) override;
   void PrepareErrorPage(
       web::WebState* web_state,
diff --git a/ios/chrome/browser/web/chrome_web_client.mm b/ios/chrome/browser/web/chrome_web_client.mm
index 8d0f9ff..26482284 100644
--- a/ios/chrome/browser/web/chrome_web_client.mm
+++ b/ios/chrome/browser/web/chrome_web_client.mm
@@ -184,13 +184,16 @@
     const net::SSLInfo& info,
     const GURL& request_url,
     bool overridable,
+    int64_t navigation_id,
     const base::Callback<void(bool)>& callback) {
+  base::OnceCallback<void(NSString*)> null_callback;
   // TODO(crbug.com/760873): IOSSSLErrorHandler will present an interstitial
   // for the user to decide if it is safe to proceed.
   // Handle the case of web_state not presenting UI to users like prerender tabs
   // or web_state used to fetch offline content in Reading List.
   IOSSSLErrorHandler::HandleSSLError(web_state, cert_error, info, request_url,
-                                     overridable, callback);
+                                     overridable, navigation_id, callback,
+                                     std::move(null_callback));
 }
 
 void ChromeWebClient::PrepareErrorPage(
diff --git a/ios/web/js_messaging/resources/message.js b/ios/web/js_messaging/resources/message.js
index ed3ca50..b3176cf0 100644
--- a/ios/web/js_messaging/resources/message.js
+++ b/ios/web/js_messaging/resources/message.js
@@ -238,11 +238,17 @@
 }
 
 /**
- * Decrypts and executes the function specified in |payload|.
- * @param {!string} payload The encrypted message payload.
- * @param {!string} iv The initialization vector used to encrypt the |payload|.
+ * Decrypts and executes the function specified in |functionPayload|.
+ * @param {Object} encryptedMessageDetails JSON containing encrypted
+ * information about the message and the initialization vector to decrypt
+ * the information.
+ * @param {!Object} encryptedFunctionDetails JSON containing encrypted
+ * information about the function and its parameters and the initialization
+ * vector to decrypt the information. If null, won't execute any call, but
+ * will respond to the native call if specified in |encryptedMessageDetails|.
  */
-var executeMessage_ = function(payload, iv) {
+var executeMessage_ = function(encryptedMessageDetails,
+  encryptedFunctionDetails) {
   if (!frameSymmetricKey_) {
     // Payload cannot be decrypted without a key. This message could be spam or
     // sent by the native application by mistake.
@@ -250,43 +256,84 @@
   }
 
   // Decode the base64 payload.
-  var encryptedFunctionArray =
-      new Uint8Array(Array.from(atob(payload)).map(function(a) {
+  var encryptedMessageArray = new Uint8Array(Array.from(
+      atob(encryptedMessageDetails['payload'])).map(function(a) {
     return a.charCodeAt(0);
   }));
 
   // Decode the base64 initialization buffer.
-  var ivbuf = new Uint8Array(Array.from(atob(iv)).map(function(a) {
+  var messageIvbuf = new Uint8Array(Array.from(
+    atob(encryptedMessageDetails['iv'])).map(function(a) {
     return a.charCodeAt(0);
   }));
-
-  var algorithm = {'name': 'AES-GCM', iv: ivbuf};
+  var messageAlgorithm = {'name': 'AES-GCM', iv: messageIvbuf};
   getFrameSymmetricKey_(function(frameKey) {
-    window.crypto.subtle.decrypt(algorithm, frameKey, encryptedFunctionArray)
-        .then(function(decrypted) {
-      var callJSON = new TextDecoder().decode(new Uint8Array(decrypted));
-      var callDict = JSON.parse(callJSON);
+    window.crypto.subtle.decrypt(
+      messageAlgorithm, frameKey, encryptedMessageArray)
+      .then(function(decryptedMessagePayload) {
+      var messageJSONString = new TextDecoder().decode(
+        new Uint8Array(decryptedMessagePayload));
+      var messageDict = JSON.parse(messageJSONString);
 
       // Verify that message id is valid.
-      if (!Number.isInteger(callDict['messageId']) ||
-          callDict['messageId'] <= lastReceivedMessageId_) {
+      if (!Number.isInteger(messageDict['messageId']) ||
+          messageDict['messageId'] <= lastReceivedMessageId_) {
         return;
       }
 
-      // Check that a function name and parameters are specified.
-      if (typeof callDict['functionName'] !== 'string' ||
-          callDict['functionName'].length < 1 ||
-          !Array.isArray(callDict['parameters'])) {
+      lastReceivedMessageId_ = messageDict['messageId'];
+
+      // Return early if the function payload was dropped.
+      if (!encryptedFunctionDetails) {
+        if (typeof messageDict['replyWithResult'] === 'boolean' &&
+          messageDict['replyWithResult']) {
+          replyWithResult_(messageDict['messageId'], null);
+        }
         return;
       }
 
-      lastReceivedMessageId_ = callDict['messageId'];
-      var result =
-          callGCrWebFunction_(callDict['functionName'], callDict['parameters']);
-      if (typeof callDict['replyWithResult'] === 'boolean' &&
-          callDict['replyWithResult']) {
-        replyWithResult_(callDict['messageId'], result);
-      }
+      // Decode the base64 payload.
+      var encryptedFunctionArray = new Uint8Array(Array.from(
+        atob(encryptedFunctionDetails['payload'])).map(
+        function(a) {
+          return a.charCodeAt(0);
+      }));
+
+      // Decode the base64 initialization buffer.
+      var functionIvbuf = new Uint8Array(Array.from(
+        atob(encryptedFunctionDetails['iv'])).map(
+        function(a) {
+          return a.charCodeAt(0);
+      }));
+
+      var additionalData = new Uint8Array(Array.from(
+        messageDict['messageId'].toString()).map(
+        function(a) {
+          return a.charCodeAt(0);
+      }));
+      var functionAlgorithm = {'name': 'AES-GCM',
+       iv: functionIvbuf,
+       additionalData: additionalData};
+      window.crypto.subtle.decrypt(
+        functionAlgorithm, frameKey, encryptedFunctionArray)
+        .then(function(decryptedFunctionPayload) {
+        var functionJSONPayload = new TextDecoder().decode(
+          new Uint8Array(decryptedFunctionPayload));
+        var functionDict = JSON.parse(functionJSONPayload);
+
+        let functionName = functionDict['functionName'];
+        let parameters = functionDict['parameters'];
+
+        var result = null;
+        if (typeof functionName === 'string' && functionName.length >= 1
+         && Array.isArray(parameters)) {
+            result = callGCrWebFunction_(functionName, parameters);
+        }
+        if (typeof messageDict['replyWithResult'] === 'boolean'
+         && messageDict['replyWithResult']) {
+          replyWithResult_(messageDict['messageId'], result);
+        }
+      });
     });
   });
 };
@@ -316,19 +363,24 @@
  * Routes an encrypted message to the targeted frame. Once the target frame is
  * found, the |payload| will be decrypted and executed. This function is called
  * by the native code.
- * @param {!string} payload The encrypted message payload.
- * @param {!string} iv The initialization vector used to encrypt the |payload|.
+ * @param {!Object} encryptedMessageDetails  JSON representing a dictionary
+ * containing encrypted information about the message and the initialization
+ * vector to decrypt the information.
+ * @param {!Object} encryptedFunctionDetails JSON representing a dictionary
+ * containing encrypted information about the function to call and the
+ * parameters to pass and the initialization vector to decrypt the information.
  * @param {!string} target_frame_id The |frameId_| of the frame which should
  *                  process the |payload|.
  */
-__gCrWeb.message['routeMessage'] = function(payload, iv, target_frame_id) {
+__gCrWeb.message['routeMessage'] = function(encryptedMessageDetails,
+  encryptedFunctionDetails, target_frame_id) {
   if (!isFrameMessagingSupported_()) {
     // API is unsupported.
     return;
   }
 
   if (target_frame_id === __gCrWeb.message['getFrameId']()) {
-    executeMessage_(payload, iv);
+    executeMessage_(encryptedMessageDetails, encryptedFunctionDetails);
     return;
   }
 
@@ -337,8 +389,8 @@
     window.frames[i].postMessage(
       {
         type: 'org.chromium.encryptedMessage',
-        payload: payload,
-        iv: iv,
+        message_payload: encryptedMessageDetails,
+        function_payload: encryptedFunctionDetails,
         target_frame_id: target_frame_id
       },
       '*'
diff --git a/ios/web/js_messaging/resources/setup_frame.js b/ios/web/js_messaging/resources/setup_frame.js
index 9a562078..d22b2a3 100644
--- a/ios/web/js_messaging/resources/setup_frame.js
+++ b/ios/web/js_messaging/resources/setup_frame.js
@@ -37,12 +37,12 @@
     __gCrWeb.message['getExistingFrames']();
   } else if (payload.hasOwnProperty('type') &&
       payload.type == 'org.chromium.encryptedMessage') {
-    if (payload.hasOwnProperty('payload') &&
-        payload.hasOwnProperty('iv') &&
+    if (payload.hasOwnProperty('message_payload') &&
+        payload.hasOwnProperty('function_payload') &&
         payload.hasOwnProperty('target_frame_id')) {
       __gCrWeb.message['routeMessage'](
-        payload['payload'],
-        payload['iv'],
+        payload['message_payload'],
+        payload['function_payload'],
         payload['target_frame_id']
       );
     }
diff --git a/ios/web/js_messaging/web_frame_impl.h b/ios/web/js_messaging/web_frame_impl.h
index 1a2d510..df3ee98d 100644
--- a/ios/web/js_messaging/web_frame_impl.h
+++ b/ios/web/js_messaging/web_frame_impl.h
@@ -70,6 +70,11 @@
   void DetachFromWebState();
   // Returns the script command name to use for this WebFrame.
   const std::string GetScriptCommandPrefix();
+  // Encrypts |payload| and returns a JSON string of a dictionary containing
+  // the encrypted metadata and its initialization vector. If encryption fails,
+  // an empty string will be returned.
+  const std::string EncryptPayload(base::DictionaryValue payload,
+                                   const std::string& additiona_data);
 
   // A structure to store the callbacks associated with the
   // |CallJavaScriptFunction| requests.
diff --git a/ios/web/js_messaging/web_frame_impl.mm b/ios/web/js_messaging/web_frame_impl.mm
index 0905d13..e7bd12e 100644
--- a/ios/web/js_messaging/web_frame_impl.mm
+++ b/ios/web/js_messaging/web_frame_impl.mm
@@ -9,6 +9,7 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/json/json_writer.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
@@ -85,6 +86,36 @@
   return is_main_frame_ || frame_key_;
 }
 
+const std::string WebFrameImpl::EncryptPayload(
+    base::DictionaryValue payload,
+    const std::string& additiona_data) {
+  crypto::Aead aead(crypto::Aead::AES_256_GCM);
+  aead.Init(&frame_key_->key());
+
+  std::string payload_json;
+  base::JSONWriter::Write(payload, &payload_json);
+  std::string payload_iv;
+  crypto::RandBytes(base::WriteInto(&payload_iv, aead.NonceLength() + 1),
+                    aead.NonceLength());
+  std::string payload_ciphertext;
+  if (!aead.Seal(payload_json, payload_iv, additiona_data,
+                 &payload_ciphertext)) {
+    LOG(ERROR) << "Error sealing message payload for WebFrame.";
+    return std::string();
+  }
+  std::string encoded_payload_iv;
+  base::Base64Encode(payload_iv, &encoded_payload_iv);
+  std::string encoded_payload;
+  base::Base64Encode(payload_ciphertext, &encoded_payload);
+
+  std::string payload_string;
+  base::DictionaryValue payload_dict;
+  payload_dict.SetKey("payload", base::Value(encoded_payload));
+  payload_dict.SetKey("iv", base::Value(encoded_payload_iv));
+  base::JSONWriter::Write(payload_dict, &payload_string);
+  return payload_string;
+}
+
 bool WebFrameImpl::CallJavaScriptFunction(
     const std::string& name,
     const std::vector<base::Value>& parameters,
@@ -101,36 +132,28 @@
                                      reply_with_result);
   }
 
-  base::DictionaryValue message;
-  message.SetKey("messageId", base::Value(message_id));
-  message.SetKey("replyWithResult", base::Value(reply_with_result));
-  message.SetKey("functionName", base::Value(name));
+  base::DictionaryValue message_payload;
+  message_payload.SetKey("messageId", base::Value(message_id));
+  message_payload.SetKey("replyWithResult", base::Value(reply_with_result));
+  const std::string& encrypted_message_json =
+      EncryptPayload(std::move(message_payload), std::string());
+
+  base::DictionaryValue function_payload;
+  function_payload.SetKey("functionName", base::Value(name));
   base::ListValue parameters_value(parameters);
-  message.SetKey("parameters", std::move(parameters_value));
+  function_payload.SetKey("parameters", std::move(parameters_value));
+  const std::string& encrypted_function_json = EncryptPayload(
+      std::move(function_payload), base::NumberToString(message_id));
 
-  std::string json;
-  base::JSONWriter::Write(message, &json);
-
-  crypto::Aead aead(crypto::Aead::AES_256_GCM);
-  aead.Init(&frame_key_->key());
-
-  std::string iv;
-  crypto::RandBytes(base::WriteInto(&iv, aead.NonceLength() + 1),
-                    aead.NonceLength());
-
-  std::string ciphertext;
-  if (!aead.Seal(json, iv, /*additional_data=*/nullptr, &ciphertext)) {
-    LOG(ERROR) << "Error sealing message for WebFrame.";
+  if (encrypted_message_json.empty() || encrypted_function_json.empty()) {
+    // Sealing the payload failed.
     return false;
   }
 
-  std::string encoded_iv;
-  base::Base64Encode(iv, &encoded_iv);
-  std::string encoded_message;
-  base::Base64Encode(ciphertext, &encoded_message);
-  std::string script = base::StringPrintf(
-      "__gCrWeb.message.routeMessage('%s', '%s', '%s')",
-      encoded_message.c_str(), encoded_iv.c_str(), frame_id_.c_str());
+  std::string script =
+      base::StringPrintf("__gCrWeb.message.routeMessage(%s, %s, '%s')",
+                         encrypted_message_json.c_str(),
+                         encrypted_function_json.c_str(), frame_id_.c_str());
   GetWebState()->ExecuteJavaScript(base::UTF8ToUTF16(script));
 
   return true;
diff --git a/ios/web/js_messaging/web_frame_impl_unittest.mm b/ios/web/js_messaging/web_frame_impl_unittest.mm
index 6782d8a..2881d164 100644
--- a/ios/web/js_messaging/web_frame_impl_unittest.mm
+++ b/ios/web/js_messaging/web_frame_impl_unittest.mm
@@ -9,6 +9,7 @@
 #include "base/json/json_reader.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #import "base/strings/sys_string_conversions.h"
 #include "base/test/ios/wait_util.h"
 #include "base/values.h"
@@ -39,8 +40,10 @@
 }
 
 struct RouteMessageParameters {
-  NSString* encoded_function_json = nil;
-  NSString* encoded_iv = nil;
+  NSString* encoded_message_payload = nil;
+  NSString* encoded_message_iv = nil;
+  NSString* encoded_function_payload = nil;
+  NSString* encoded_function_iv = nil;
   NSString* frame_id = nil;
 };
 
@@ -48,25 +51,36 @@
     NSString* function_call) {
   NSRange parameters_start = [function_call rangeOfString:@"("];
   NSRange parameters_end = [function_call rangeOfString:@")"];
-  NSString* parameter_string = [function_call
+  NSMutableString* parameter_string = [[function_call
       substringWithRange:NSMakeRange(parameters_start.location + 1,
                                      parameters_end.location -
-                                         parameters_start.location - 1)];
-  NSArray* parameters = [parameter_string componentsSeparatedByString:@","];
+                                         parameters_start.location - 1)]
+      mutableCopy];
+  // Create array string and replace single quotes with double quotes in
+  // preparation for JSON serialization.
+  [parameter_string insertString:@"[" atIndex:0];
+  [parameter_string appendString:@"]"];
+  NSString* final_string =
+      [parameter_string stringByReplacingOccurrencesOfString:@"'"
+                                                  withString:@"\""];
+
+  NSData* data = [final_string dataUsingEncoding:NSUTF8StringEncoding];
+  NSError* error = nil;
+  NSArray* jsonArray =
+      [NSJSONSerialization JSONObjectWithData:data
+                                      options:NSJSONReadingMutableContainers |
+                                              NSJSONReadingMutableLeaves
+                                        error:&error];
 
   RouteMessageParameters parsed_params;
-  if (parameters.count == 3) {
-    NSMutableCharacterSet* trim_characters_set =
-        [NSMutableCharacterSet whitespaceCharacterSet];
-    [trim_characters_set addCharactersInString:@"'"];
-
-    parsed_params.encoded_function_json =
-        [parameters[0] stringByTrimmingCharactersInSet:trim_characters_set];
-    parsed_params.encoded_iv =
-        [parameters[1] stringByTrimmingCharactersInSet:trim_characters_set];
-    parsed_params.frame_id =
-        [parameters[2] stringByTrimmingCharactersInSet:trim_characters_set];
+  if (jsonArray.count == 3 && !error) {
+    parsed_params.encoded_message_iv = jsonArray[0][@"iv"];
+    parsed_params.encoded_message_payload = jsonArray[0][@"payload"];
+    parsed_params.encoded_function_iv = jsonArray[1][@"iv"];
+    parsed_params.encoded_function_payload = jsonArray[1][@"payload"];
+    parsed_params.frame_id = jsonArray[2];
   }
+
   return parsed_params;
 }
 
@@ -160,21 +174,33 @@
 
   RouteMessageParameters params = ParametersFromFunctionCallString(last_script);
 
-  // Verify that the message is a properly base64 encoded string.
-  std::string decoded_message;
+  // Verify that the message and function payload are properly base64 encoded
+  // strings.
+  std::string decoded_function_payload;
   EXPECT_TRUE(base::Base64Decode(
-      base::SysNSStringToUTF8(params.encoded_function_json), &decoded_message));
-  // Verify the message does not contain the plaintext function name or
+      base::SysNSStringToUTF8(params.encoded_function_payload),
+      &decoded_function_payload));
+  std::string decoded_message_payload;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_message_payload),
+      &decoded_message_payload));
+  // Verify the function does not contain the plaintext function name or
   // parameters.
-  EXPECT_FALSE([base::SysUTF8ToNSString(decoded_message)
+  EXPECT_FALSE([base::SysUTF8ToNSString(decoded_function_payload)
       containsString:@"functionName"]);
-  EXPECT_FALSE([base::SysUTF8ToNSString(decoded_message)
+  EXPECT_FALSE([base::SysUTF8ToNSString(decoded_function_payload)
       containsString:@"plaintextParam"]);
 
-  std::string iv_string = base::SysNSStringToUTF8(params.encoded_iv);
-  std::string decoded_iv;
-  // Verify that the initialization vector is a properly base64 encoded string.
-  EXPECT_TRUE(base::Base64Decode(iv_string, &decoded_iv));
+  // Verify that the initialization vector is a properly base64 encoded string
+  // for both payloads.
+  std::string function_iv_string =
+      base::SysNSStringToUTF8(params.encoded_function_iv);
+  std::string decoded_function_iv;
+  EXPECT_TRUE(base::Base64Decode(function_iv_string, &decoded_function_iv));
+  std::string message_iv_string =
+      base::SysNSStringToUTF8(params.encoded_message_iv);
+  std::string decoded_message_iv;
+  EXPECT_TRUE(base::Base64Decode(message_iv_string, &decoded_message_iv));
 
   // Ensure the frame ID matches.
   EXPECT_NSEQ(base::SysUTF8ToNSString(kFrameId), params.frame_id);
@@ -208,8 +234,9 @@
   RouteMessageParameters params2 =
       ParametersFromFunctionCallString(last_script2);
 
-  EXPECT_NSNE(params1.encoded_function_json, params2.encoded_function_json);
-  EXPECT_NSNE(params1.encoded_iv, params2.encoded_iv);
+  EXPECT_NSNE(params1.encoded_function_payload,
+              params2.encoded_function_payload);
+  EXPECT_NSNE(params1.encoded_function_iv, params2.encoded_function_iv);
 }
 
 // Tests that the WebFrame properly encodes and encrypts all parameters for
@@ -238,47 +265,67 @@
       base::SysUTF16ToNSString(test_web_state.GetLastExecutedJavascript());
   RouteMessageParameters params = ParametersFromFunctionCallString(last_script);
 
-  std::string decoded_ciphertext;
-  EXPECT_TRUE(
-      base::Base64Decode(base::SysNSStringToUTF8(params.encoded_function_json),
-                         &decoded_ciphertext));
+  std::string decoded_function_ciphertext;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_function_payload),
+      &decoded_function_ciphertext));
 
-  std::string decoded_iv;
-  EXPECT_TRUE(base::Base64Decode(base::SysNSStringToUTF8(params.encoded_iv),
-                                 &decoded_iv));
+  std::string decoded_function_iv;
+  EXPECT_TRUE(
+      base::Base64Decode(base::SysNSStringToUTF8(params.encoded_function_iv),
+                         &decoded_function_iv));
+
+  std::string decoded_message_ciphertext;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_message_payload),
+      &decoded_message_ciphertext));
+
+  std::string decoded_message_iv;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_message_iv), &decoded_message_iv));
 
   // Decrypt message
   crypto::Aead aead(crypto::Aead::AES_256_GCM);
   aead.Init(&key_string);
-  std::string plaintext;
-  EXPECT_TRUE(aead.Open(decoded_ciphertext, decoded_iv,
-                        /*additional_data=*/nullptr, &plaintext));
+  std::string function_plaintext;
+  EXPECT_TRUE(aead.Open(decoded_function_ciphertext, decoded_function_iv,
+                        base::NumberToString(initial_message_id),
+                        &function_plaintext));
+  std::string message_plaintext;
+  EXPECT_TRUE(aead.Open(decoded_message_ciphertext, decoded_message_iv,
+                        /*additional_data=*/nullptr, &message_plaintext));
 
-  base::Optional<base::Value> parsed_result =
-      base::JSONReader::Read(plaintext, false);
-  EXPECT_TRUE(parsed_result.has_value());
-  ASSERT_TRUE(parsed_result.value().is_dict());
+  base::Optional<base::Value> parsed_function_result =
+      base::JSONReader::Read(function_plaintext, false);
+  EXPECT_TRUE(parsed_function_result.has_value());
+  ASSERT_TRUE(parsed_function_result.value().is_dict());
+
+  const std::string* decrypted_function_name =
+      parsed_function_result.value().FindStringKey("functionName");
+  ASSERT_TRUE(decrypted_function_name);
+  EXPECT_EQ("functionName", *decrypted_function_name);
+
+  base::Value* decrypted_parameters =
+      parsed_function_result.value().FindKeyOfType("parameters",
+                                                   base::Value::Type::LIST);
+  ASSERT_TRUE(decrypted_parameters);
+  ASSERT_EQ(function_params.size(), decrypted_parameters->GetList().size());
+  EXPECT_EQ(plaintext_param, decrypted_parameters->GetList()[0].GetString());
+
+  base::Optional<base::Value> parsed_message_result =
+      base::JSONReader::Read(message_plaintext, false);
+  EXPECT_TRUE(parsed_message_result.has_value());
+  ASSERT_TRUE(parsed_message_result.value().is_dict());
 
   base::Optional<int> decrypted_message_id =
-      parsed_result.value().FindIntKey("messageId");
+      parsed_message_result.value().FindIntKey("messageId");
   ASSERT_TRUE(decrypted_message_id.has_value());
   EXPECT_EQ(decrypted_message_id.value(), initial_message_id);
 
   base::Optional<bool> decrypted_respond_with_result =
-      parsed_result.value().FindBoolKey("replyWithResult");
+      parsed_message_result.value().FindBoolKey("replyWithResult");
   ASSERT_TRUE(decrypted_respond_with_result.has_value());
   EXPECT_FALSE(decrypted_respond_with_result.value());
-
-  const std::string* decrypted_function_name =
-      parsed_result.value().FindStringKey("functionName");
-  ASSERT_TRUE(decrypted_function_name);
-  EXPECT_EQ("functionName", *decrypted_function_name);
-
-  base::Value* decrypted_parameters = parsed_result.value().FindKeyOfType(
-      "parameters", base::Value::Type::LIST);
-  ASSERT_TRUE(decrypted_parameters);
-  ASSERT_EQ(function_params.size(), decrypted_parameters->GetList().size());
-  EXPECT_EQ(plaintext_param, decrypted_parameters->GetList()[0].GetString());
 }
 
 // Tests that the WebFrame properly encodes and encrypts the respondWithResult
@@ -310,24 +357,24 @@
       base::SysUTF16ToNSString(test_web_state.GetLastExecutedJavascript());
   RouteMessageParameters params = ParametersFromFunctionCallString(last_script);
 
-  std::string decoded_ciphertext;
-  EXPECT_TRUE(
-      base::Base64Decode(base::SysNSStringToUTF8(params.encoded_function_json),
-                         &decoded_ciphertext));
+  std::string decoded_message_ciphertext;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_message_payload),
+      &decoded_message_ciphertext));
 
-  std::string decoded_iv;
-  EXPECT_TRUE(base::Base64Decode(base::SysNSStringToUTF8(params.encoded_iv),
-                                 &decoded_iv));
+  std::string decoded_message_iv;
+  EXPECT_TRUE(base::Base64Decode(
+      base::SysNSStringToUTF8(params.encoded_message_iv), &decoded_message_iv));
 
   // Decrypt message
   crypto::Aead aead(crypto::Aead::AES_256_GCM);
   aead.Init(&key_string);
-  std::string plaintext;
-  EXPECT_TRUE(aead.Open(decoded_ciphertext, decoded_iv,
-                        /*additional_data=*/nullptr, &plaintext));
+  std::string message_plaintext;
+  EXPECT_TRUE(aead.Open(decoded_message_ciphertext, decoded_message_iv,
+                        /*additional_data=*/nullptr, &message_plaintext));
 
   base::Optional<base::Value> parsed_result =
-      base::JSONReader::Read(plaintext, false);
+      base::JSONReader::Read(message_plaintext, false);
   EXPECT_TRUE(parsed_result.has_value());
   ASSERT_TRUE(parsed_result.value().is_dict());
 
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm
index 34721f9..393823c 100644
--- a/ios/web/navigation/crw_wk_navigation_handler.mm
+++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -1567,7 +1567,7 @@
   // Ask web client if this cert error should be allowed.
   web::GetWebClient()->AllowCertificateError(
       self.webStateImpl, net::MapCertStatusToNetError(info.cert_status), info,
-      net::GURLWithNSURL(requestURL), recoverable,
+      net::GURLWithNSURL(requestURL), recoverable, context->GetNavigationId(),
       base::BindRepeating(^(bool proceed) {
         if (proceed) {
           DCHECK(recoverable);
diff --git a/ios/web/public/test/fakes/test_web_client.h b/ios/web/public/test/fakes/test_web_client.h
index fcd9072..5fc000a4 100644
--- a/ios/web/public/test/fakes/test_web_client.h
+++ b/ios/web/public/test/fakes/test_web_client.h
@@ -44,6 +44,7 @@
                              const net::SSLInfo&,
                              const GURL&,
                              bool overridable,
+                             int64_t navigation_id,
                              const base::Callback<void(bool)>&) override;
   void PrepareErrorPage(WebState* web_state,
                         const GURL& url,
diff --git a/ios/web/public/test/fakes/test_web_client.mm b/ios/web/public/test/fakes/test_web_client.mm
index e0b7bc3..8bc7440 100644
--- a/ios/web/public/test/fakes/test_web_client.mm
+++ b/ios/web/public/test/fakes/test_web_client.mm
@@ -73,6 +73,7 @@
     const net::SSLInfo& ssl_info,
     const GURL& request_url,
     bool overridable,
+    int64_t navigation_id,
     const base::Callback<void(bool)>& callback) {
   last_cert_error_code_ = cert_error;
   last_cert_error_ssl_info_ = ssl_info;
diff --git a/ios/web/public/test/web_task_environment.h b/ios/web/public/test/web_task_environment.h
index 90d7389..3f55286 100644
--- a/ios/web/public/test/web_task_environment.h
+++ b/ios/web/public/test/web_task_environment.h
@@ -69,12 +69,6 @@
   DISALLOW_COPY_AND_ASSIGN(WebTaskEnvironment);
 };
 
-// TODO(crbug.com/992483): Mass migrate users and remove this.
-class TestWebThreadBundle : public WebTaskEnvironment {
- public:
-  using WebTaskEnvironment::WebTaskEnvironment;
-};
-
 }  // namespace web
 
 #endif  // IOS_WEB_PUBLIC_TEST_WEB_TASK_ENVIRONMENT_H_
diff --git a/ios/web/public/web_client.h b/ios/web/public/web_client.h
index f305e4cb..f0e082a0 100644
--- a/ios/web/public/web_client.h
+++ b/ios/web/public/web_client.h
@@ -141,15 +141,18 @@
 
   // Informs the embedder that a certificate error has occurred. |cert_error| is
   // a network error code defined in //net/base/net_error_list.h. If
-  // |overridable| is true, the user can ignore the error and continue. The
-  // embedder can call the |callback| asynchronously (an argument of true means
-  // that |cert_error| should be ignored and web// should load the page).
+  // |overridable| is true, the user can ignore the error and continue.
+  // |navigation_id| is retrieved from NavigationContext::GetNavigationId() and
+  // indicates which navigation triggered the certificate error. The embedder
+  // can call the |callback| asynchronously (an argument of true means that
+  // |cert_error| should be ignored and web// should load the page).
   virtual void AllowCertificateError(
       WebState* web_state,
       int cert_error,
       const net::SSLInfo& ssl_info,
       const GURL& request_url,
       bool overridable,
+      int64_t navigation_id,
       const base::Callback<void(bool)>& callback);
 
   // Calls the given |callback| with the contents of an error page to display
diff --git a/ios/web/shell/shell_web_client.h b/ios/web/shell/shell_web_client.h
index ba9954f..4bccb93 100644
--- a/ios/web/shell/shell_web_client.h
+++ b/ios/web/shell/shell_web_client.h
@@ -36,6 +36,7 @@
       const net::SSLInfo& ssl_info,
       const GURL& request_url,
       bool overridable,
+      int64_t navigation_id,
       const base::Callback<void(bool)>& callback) override;
 
   ShellBrowserState* browser_state() const;
diff --git a/ios/web/shell/shell_web_client.mm b/ios/web/shell/shell_web_client.mm
index 8fe5a38..184ea1e 100644
--- a/ios/web/shell/shell_web_client.mm
+++ b/ios/web/shell/shell_web_client.mm
@@ -89,6 +89,7 @@
     const net::SSLInfo&,
     const GURL&,
     bool overridable,
+    int64_t /*navigation_id*/,
     const base::Callback<void(bool)>& callback) {
   base::Callback<void(bool)> block_callback(callback);
   UIAlertController* alert = [UIAlertController
diff --git a/ios/web/web_client.mm b/ios/web/web_client.mm
index f992bde..51ee3a4 100644
--- a/ios/web/web_client.mm
+++ b/ios/web/web_client.mm
@@ -82,6 +82,7 @@
     const net::SSLInfo& ssl_info,
     const GURL& request_url,
     bool overridable,
+    int64_t navigation_id,
     const base::Callback<void(bool)>& callback) {
   callback.Run(false);
 }
diff --git a/ios/web/web_state/ui/crw_web_controller_container_view.mm b/ios/web/web_state/ui/crw_web_controller_container_view.mm
index 61cb492..b0608f1 100644
--- a/ios/web/web_state/ui/crw_web_controller_container_view.mm
+++ b/ios/web/web_state/ui/crw_web_controller_container_view.mm
@@ -155,7 +155,9 @@
       ![_delegate shouldKeepRenderProcessAliveForContainerView:self]) {
     if (self.webViewContentView.superview != self) {
       [_webViewContentView setFrame:self.bounds];
-      [self addSubview:_webViewContentView];
+      // Insert the content view on the back of the container view so any view
+      // that was presented on top of the content view can still appear.
+      [self insertSubview:_webViewContentView atIndex:0];
     }
     return;
   }
diff --git a/ios/web_view/internal/autofill/cwv_credit_card_saver_unittest.mm b/ios/web_view/internal/autofill/cwv_credit_card_saver_unittest.mm
index 93a8d65..c6f26350 100644
--- a/ios/web_view/internal/autofill/cwv_credit_card_saver_unittest.mm
+++ b/ios/web_view/internal/autofill/cwv_credit_card_saver_unittest.mm
@@ -33,7 +33,7 @@
  protected:
   CWVCreditCardSaverTest() {}
 
-  web::TestWebThreadBundle web_thread_bundle_;
+  web::WebTaskEnvironment task_environment_;
 };
 
 // Tests CWVCreditCardSaver properly initializes.
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.h b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
index 416c029..db4493c 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.h
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
@@ -18,6 +18,8 @@
 
   bool IsGenerationEnabled() const override;
 
+  bool ShouldCheckReuseOnLeakDetection() const override;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(WebViewPasswordFeatureManager);
 };
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
index 8b0cd41..c06fb53 100644
--- a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
+++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
@@ -14,4 +14,8 @@
   return false;
 }
 
+bool WebViewPasswordFeatureManager::ShouldCheckReuseOnLeakDetection() const {
+  return false;
+}
+
 }  // namespace ios_web_view
diff --git a/ios/web_view/internal/web_view_web_client.h b/ios/web_view/internal/web_view_web_client.h
index 71cada6..93ddb46 100644
--- a/ios/web_view/internal/web_view_web_client.h
+++ b/ios/web_view/internal/web_view_web_client.h
@@ -34,6 +34,7 @@
       const net::SSLInfo& ssl_info,
       const GURL& request_url,
       bool overridable,
+      int64_t navigation_id,
       const base::RepeatingCallback<void(bool)>& callback) override;
 
  private:
diff --git a/ios/web_view/internal/web_view_web_client.mm b/ios/web_view/internal/web_view_web_client.mm
index f6fc15b0..d308a05 100644
--- a/ios/web_view/internal/web_view_web_client.mm
+++ b/ios/web_view/internal/web_view_web_client.mm
@@ -102,6 +102,7 @@
     const net::SSLInfo& ssl_info,
     const GURL& request_url,
     bool overridable,
+    int64_t navigation_id,
     const base::RepeatingCallback<void(bool)>& callback) {
   CWVWebView* web_view = [CWVWebView webViewForWebState:web_state];
   base::RepeatingCallback<void(bool)> callback_copy = callback;
diff --git a/ios/web_view/test/web_view_restorable_state_inttest.mm b/ios/web_view/test/web_view_restorable_state_inttest.mm
index 116fbef..9f0434d 100644
--- a/ios/web_view/test/web_view_restorable_state_inttest.mm
+++ b/ios/web_view/test/web_view_restorable_state_inttest.mm
@@ -22,13 +22,6 @@
 // methods.
 typedef ios_web_view::WebViewInttestBase WebViewRestorableStateTest;
 TEST_F(WebViewRestorableStateTest, EncodeDecode) {
-#if !TARGET_IPHONE_SIMULATOR
-  if (@available(iOS 12.2, *)) {
-  } else {
-    // crbug.com/(1001965): Test disabled on iOS 12.1 and older devices.
-    return;
-  }
-#endif
   // Load 2 URLs to create non-default state.
   ASSERT_FALSE([web_view_ lastCommittedURL]);
   ASSERT_FALSE([web_view_ visibleURL]);
@@ -46,6 +39,13 @@
   // Create second web view and restore its state from the first web view.
   CWVWebView* restored_web_view = test::CreateWebView();
   test::CopyWebViewState(web_view_, restored_web_view);
+  // The WKWebView must be present in the view hierarchy in order to prevent
+  // WebKit optimizations which may pause internal parts of the web view
+  // without notice. Work around this by adding the view directly.
+  // TODO(crbug.com/944077): Remove this workaround once fixed in ios/web_view.
+  UIViewController* view_controller =
+      [[[UIApplication sharedApplication] keyWindow] rootViewController];
+  [view_controller.view addSubview:restored_web_view];
 
   // Wait for restore to finish.
   ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForPageLoadTimeout, ^bool {
diff --git a/ipc/ipc_channel_mojo_unittest.cc b/ipc/ipc_channel_mojo_unittest.cc
index aecb8dc..05ef81e 100644
--- a/ipc/ipc_channel_mojo_unittest.cc
+++ b/ipc/ipc_channel_mojo_unittest.cc
@@ -949,7 +949,7 @@
   IPC::ChannelProxy* proxy() { return runner_->proxy(); }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<ChannelProxyRunner> runner_;
 };
 
diff --git a/ipc/ipc_cpu_perftest.cc b/ipc/ipc_cpu_perftest.cc
index 3a5d8f80..5d34690 100644
--- a/ipc/ipc_cpu_perftest.cc
+++ b/ipc/ipc_cpu_perftest.cc
@@ -394,7 +394,7 @@
 };
 
 DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MojoSteadyPingPongTest, h) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   return RunPingPongClient(h);
 }
 
@@ -402,14 +402,14 @@
 // instead of raw IPC::Messages.
 TEST_F(MojoSteadyPingPongTest, AsyncPingPong) {
   RunTestClient("PingPongClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunPingPongServer(h, "Mojo_CPU_Async", false);
   });
 }
 
 TEST_F(MojoSteadyPingPongTest, SyncPingPong) {
   RunTestClient("PingPongClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunPingPongServer(h, "Mojo_CPU_Sync", true);
   });
 }
diff --git a/ipc/ipc_mojo_bootstrap_unittest.cc b/ipc/ipc_mojo_bootstrap_unittest.cc
index 63c0f83d..4508369 100644
--- a/ipc/ipc_mojo_bootstrap_unittest.cc
+++ b/ipc/ipc_mojo_bootstrap_unittest.cc
@@ -107,7 +107,7 @@
 };
 
 TEST_F(IPCMojoBootstrapTest, Connect) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   Connection connection(
       IPC::MojoBootstrap::Create(
           helper_.StartChild("IPCMojoBootstrapTestClient"),
@@ -132,7 +132,7 @@
 MULTIPROCESS_TEST_MAIN_WITH_SETUP(
     IPCMojoBootstrapTestClientTestChildMain,
     ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   Connection connection(
       IPC::MojoBootstrap::Create(
           std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe),
@@ -153,7 +153,7 @@
 }
 
 TEST_F(IPCMojoBootstrapTest, ReceiveEmptyMessage) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   Connection connection(
       IPC::MojoBootstrap::Create(
           helper_.StartChild("IPCMojoBootstrapTestEmptyMessage"),
@@ -180,7 +180,7 @@
 MULTIPROCESS_TEST_MAIN_WITH_SETUP(
     IPCMojoBootstrapTestEmptyMessageTestChildMain,
     ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   Connection connection(
       IPC::MojoBootstrap::Create(
           std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe),
diff --git a/ipc/ipc_mojo_perftest.cc b/ipc/ipc_mojo_perftest.cc
index 56aaf2c0..2763abe 100644
--- a/ipc/ipc_mojo_perftest.cc
+++ b/ipc/ipc_mojo_perftest.cc
@@ -536,7 +536,7 @@
 DEFINE_TEST_CLIENT_WITH_PIPE(InterfacePassingClient,
                              MojoInterfacePassingPerfTest,
                              h) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   return RunInterfacePassingClient(h);
 }
 
@@ -571,7 +571,7 @@
     InProcessPerfTest<MojoInterfacePassingPerfTest>;
 
 DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MojoInterfacePerfTest, h) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   return RunPingPongClient(h);
 }
 
@@ -579,7 +579,7 @@
 // raw IPC::Messages.
 TEST_F(MojoInterfacePerfTest, MultiprocessPingPong) {
   RunTestClient("PingPongClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunPingPongServer(h, "Multiprocess");
   });
 }
@@ -587,21 +587,21 @@
 TEST_F(MojoInterfacePerfTest, MultiprocessSyncPing) {
   sync_ = true;
   RunTestClient("PingPongClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunPingPongServer(h, "MultiprocessSync");
   });
 }
 
 TEST_F(MojoInterfacePassingPerfTest, MultiprocessInterfacePassing) {
   RunTestClient("InterfacePassingClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunInterfacePassingServer(h, "InterfacePassing", false /* associated */);
   });
 }
 
 TEST_F(MojoInterfacePassingPerfTest, MultiprocessAssociatedInterfacePassing) {
   RunTestClient("InterfacePassingClient", [&](MojoHandle h) {
-    base::test::TaskEnvironment task_environment;
+    base::test::SingleThreadTaskEnvironment task_environment;
     RunInterfacePassingServer(h, "AssociatedInterfacePassing",
                               true /* associated*/);
   });
@@ -618,7 +618,7 @@
       FROM_HERE,
       base::BindOnce(base::IgnoreResult(&RunPingPongClient), client_handle));
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   RunPingPongServer(server_handle, "SingleProcess");
 }
 
@@ -626,7 +626,7 @@
   MojoHandle server_handle, client_handle;
   CreateMessagePipe(&server_handle, &client_handle);
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   mojo::MessagePipeHandle mp_handle(client_handle);
   mojo::ScopedMessagePipeHandle scoped_mp(mp_handle);
   LockThreadAffinity thread_locker(kSharedCore);
@@ -650,7 +650,7 @@
       FROM_HERE, base::BindOnce(base::IgnoreResult(&RunInterfacePassingClient),
                                 client_handle));
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   RunInterfacePassingServer(server_handle, "SingleProcess",
                             false /* associated */);
 }
@@ -666,7 +666,7 @@
       FROM_HERE, base::BindOnce(base::IgnoreResult(&RunInterfacePassingClient),
                                 client_handle));
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   RunInterfacePassingServer(server_handle, "SingleProcess",
                             true /* associated */);
 }
@@ -675,7 +675,7 @@
   MojoHandle server_handle, client_handle;
   CreateMessagePipe(&server_handle, &client_handle);
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   mojo::MessagePipeHandle mp_handle(client_handle);
   mojo::ScopedMessagePipeHandle scoped_mp(mp_handle);
   LockThreadAffinity thread_locker(kSharedCore);
@@ -690,7 +690,7 @@
   MojoHandle server_handle, client_handle;
   CreateMessagePipe(&server_handle, &client_handle);
 
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   mojo::MessagePipeHandle mp_handle(client_handle);
   mojo::ScopedMessagePipeHandle scoped_mp(mp_handle);
   LockThreadAffinity thread_locker(kSharedCore);
@@ -836,7 +836,7 @@
 
  private:
   base::Thread client_thread_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   int message_count_;
   int count_down_;
   std::string payload_;
diff --git a/ipc/ipc_sync_channel_unittest.cc b/ipc/ipc_sync_channel_unittest.cc
index bee31c5..31a734b8 100644
--- a/ipc/ipc_sync_channel_unittest.cc
+++ b/ipc/ipc_sync_channel_unittest.cc
@@ -291,7 +291,7 @@
 
 class IPCSyncChannelTest : public testing::Test {
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 //------------------------------------------------------------------------------
diff --git a/ipc/ipc_test_base.h b/ipc/ipc_test_base.h
index 2ccc549..5727d9b 100644
--- a/ipc/ipc_test_base.h
+++ b/ipc/ipc_test_base.h
@@ -75,8 +75,8 @@
   IPC::Channel* channel() const { return channel_.get(); }
 
  private:
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::MainThreadType::IO};
+  base::test::SingleThreadTaskEnvironment task_environment_{
+      base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
   mojo::ScopedMessagePipeHandle handle_;
   std::unique_ptr<IPC::Channel> channel_;
 };
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc
index f5cf3124..f922b4a0 100644
--- a/media/audio/audio_input_controller.cc
+++ b/media/audio/audio_input_controller.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -74,7 +75,7 @@
 
   // Update accumulated average results, with clamping for sanity.
   const float average_power =
-      std::max(0.0f, std::min(1.0f, sum_power / (frames * channels)));
+      base::ClampToRange(sum_power / (frames * channels), 0.0f, 1.0f);
 
   // Convert average power level to dBFS units, and pin it down to zero if it
   // is insignificantly small.
diff --git a/media/audio/audio_power_monitor.cc b/media/audio/audio_power_monitor.cc
index f5d753d..77a848e 100644
--- a/media/audio/audio_power_monitor.cc
+++ b/media/audio/audio_power_monitor.cc
@@ -8,6 +8,7 @@
 #include <cmath>
 
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/time/time.h"
 #include "media/base/audio_bus.h"
 #include "media/base/vector_math.h"
@@ -60,7 +61,7 @@
   }
 
   // Update accumulated results, with clamping for sanity.
-  average_power_ = std::max(0.0f, std::min(1.0f, sum_power / num_channels));
+  average_power_ = base::ClampToRange(sum_power / num_channels, 0.0f, 1.0f);
 
   // Push results for reading by other threads, non-blocking.
   if (reading_lock_.Try()) {
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 849abc8..fbda386 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -148,6 +148,8 @@
     "fallback_video_decoder.h",
     "feedback_signal_accumulator.h",
     "flinging_controller.h",
+    "format_utils.cc",
+    "format_utils.h",
     "hdr_metadata.cc",
     "hdr_metadata.h",
     "key_system_names.cc",
diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc
index 85d0cf8c..c6e7846b 100644
--- a/media/base/android/media_player_bridge.cc
+++ b/media/base/android/media_player_bridge.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "media/base/android/media_common_android.h"
@@ -375,7 +376,7 @@
 }
 
 void MediaPlayerBridge::SetVolume(double volume) {
-  volume_ = std::max(0.0, std::min(volume, 1.0));
+  volume_ = base::ClampToRange(volume, 0.0, 1.0);
   UpdateVolumeInternal();
 }
 
diff --git a/media/base/android/media_player_bridge_unittest.cc b/media/base/android/media_player_bridge_unittest.cc
index e232fd1..25dac3c 100644
--- a/media/base/android/media_player_bridge_unittest.cc
+++ b/media/base/android/media_player_bridge_unittest.cc
@@ -54,7 +54,7 @@
 
   void SimulatePlaybackCompleted() { bridge_.OnPlaybackComplete(); }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   StrictMock<MockMediaPlayerBridgeClient> client_;
   MediaPlayerBridge bridge_;
 
diff --git a/media/base/android/media_service_throttler_unittest.cc b/media/base/android/media_service_throttler_unittest.cc
index 6df147e0..c116c4b0 100644
--- a/media/base/android/media_service_throttler_unittest.cc
+++ b/media/base/android/media_service_throttler_unittest.cc
@@ -60,7 +60,7 @@
   scoped_refptr<FakeSingleThreadTaskRunner> test_task_runner_;
 
   // Necessary, or else base::ThreadTaskRunnerHandle::Get() fails.
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MediaServiceThrottlerTest);
diff --git a/media/base/audio_bus_perftest.cc b/media/base/audio_bus_perftest.cc
index cf12edfc1..45d1fdc 100644
--- a/media/base/audio_bus_perftest.cc
+++ b/media/base/audio_bus_perftest.cc
@@ -10,7 +10,19 @@
 #include "media/base/audio_sample_types.h"
 #include "media/base/fake_audio_render_callback.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
+
+namespace {
+
+perf_test::PerfResultReporter SetUpReporter(const std::string& story_name) {
+  perf_test::PerfResultReporter reporter("audio_bus", story_name);
+  reporter.RegisterImportantMetric("_to_interleaved", "ms");
+  reporter.RegisterImportantMetric("_from_interleaved", "ms");
+  reporter.RegisterImportantMetric("_copy", "ms");
+  return reporter;
+}
+
+}  // namespace
 
 namespace media {
 
@@ -23,15 +35,15 @@
                         bool to_interleaved_only = false) {
   const int frame_size = bus->frames() * bus->channels();
   std::unique_ptr<T[]> interleaved(new T[frame_size]);
+  perf_test::PerfResultReporter reporter = SetUpReporter(trace_name);
 
   base::TimeTicks start = base::TimeTicks::Now();
   for (int i = 0; i < kBenchmarkIterations; ++i)
     bus->ToInterleaved<SampleTraits>(bus->frames(), interleaved.get());
   double total_time_milliseconds =
       (base::TimeTicks::Now() - start).InMillisecondsF();
-  perf_test::PrintResult("audio_bus_to_interleaved", "", trace_name,
-                         total_time_milliseconds / kBenchmarkIterations, "ms",
-                         true);
+  reporter.AddResult("_to_interleaved",
+                     total_time_milliseconds / kBenchmarkIterations);
 
   if (to_interleaved_only)
     return;
@@ -40,9 +52,8 @@
   for (int i = 0; i < kBenchmarkIterations; ++i)
     bus->FromInterleaved<SampleTraits>(interleaved.get(), bus->frames());
   total_time_milliseconds = (base::TimeTicks::Now() - start).InMillisecondsF();
-  perf_test::PrintResult("audio_bus_from_interleaved", "", trace_name,
-                         total_time_milliseconds / kBenchmarkIterations, "ms",
-                         true);
+  reporter.AddResult("_from_interleaved",
+                     total_time_milliseconds / kBenchmarkIterations);
 }
 
 // Benchmark the FromInterleaved() and ToInterleaved() methods.
@@ -68,7 +79,8 @@
       bus.get(), "to_interleave_float_no_clip", true);
 }
 
-void RunCopyBench(void (AudioBus::*f)(AudioBus*) const, const char* name) {
+void RunCopyBench(void (AudioBus::*f)(AudioBus*) const,
+                  const std::string& trace_name) {
   // Setup.
   std::unique_ptr<AudioBus> bus = AudioBus::Create(2, kSampleRate * 120);
   std::unique_ptr<AudioBus> dest = AudioBus::Create(2, kSampleRate * 120);
@@ -86,13 +98,13 @@
   auto total_time_milliseconds =
       (base::TimeTicks::Now() - start).InMillisecondsF();
 
-  perf_test::PrintResult(
-      name, "", "", total_time_milliseconds / kBenchmarkIterations, "ms", true);
+  perf_test::PerfResultReporter reporter = SetUpReporter(trace_name);
+  reporter.AddResult("_copy", total_time_milliseconds / kBenchmarkIterations);
 }
 
 TEST(AudioBusPerfTest, DISABLED_CopyBench) {
-  RunCopyBench(&AudioBus::CopyTo, "audio_bus_copy_no_clip");
-  RunCopyBench(&AudioBus::CopyAndClipTo, "audio_bus_copy_clip");
+  RunCopyBench(&AudioBus::CopyTo, "no_clip");
+  RunCopyBench(&AudioBus::CopyAndClipTo, "clip");
 }
 
 }  // namespace media
diff --git a/media/base/audio_converter_perftest.cc b/media/base/audio_converter_perftest.cc
index 7ed529a1..75f0288 100644
--- a/media/base/audio_converter_perftest.cc
+++ b/media/base/audio_converter_perftest.cc
@@ -8,7 +8,7 @@
 #include "media/base/audio_converter.h"
 #include "media/base/fake_audio_render_callback.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
 
 namespace media {
 
@@ -46,8 +46,9 @@
   }
   double runs_per_second = kBenchmarkIterations /
                            (base::TimeTicks::Now() - start).InSecondsF();
-  perf_test::PrintResult(
-      "audio_converter", "", trace_name, runs_per_second, "runs/s", true);
+  perf_test::PerfResultReporter reporter("audio_converter", trace_name);
+  reporter.RegisterImportantMetric("", "runs/s");
+  reporter.AddResult("", runs_per_second);
 }
 
 TEST(AudioConverterPerfTest, ConvertBenchmark) {
diff --git a/media/base/audio_shifter.cc b/media/base/audio_shifter.cc
index 16cf224..790175d 100644
--- a/media/base/audio_shifter.cc
+++ b/media/base/audio_shifter.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/containers/circular_deque.h"
+#include "base/numerics/ranges.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/audio_bus.h"
 
@@ -217,12 +218,12 @@
   // This is the ratio we would need to get perfect sync after
   // |adjustment_time| has passed.
   double slow_ratio = steady_ratio + time_difference / adjustment_time;
-  slow_ratio = std::max(0.9, std::min(1.1, slow_ratio));
+  slow_ratio = base::ClampToRange(slow_ratio, 0.9, 1.1);
   adjustment_time = output->frames() / static_cast<double>(rate_);
   // This is ratio we we'd need get perfect sync at the end of the
   // current output audiobus.
   double fast_ratio = steady_ratio + time_difference / adjustment_time;
-  fast_ratio = std::max(0.9, std::min(1.1, fast_ratio));
+  fast_ratio = base::ClampToRange(fast_ratio, 0.9, 1.1);
 
   // If the current ratio is somewhere between the slow and the fast
   // ratio, then keep it. This means we don't have to recalculate the
@@ -236,8 +237,7 @@
       // perfect sync in the alloted time. Clamp.
       double max_ratio = std::max(fast_ratio, slow_ratio);
       double min_ratio = std::min(fast_ratio, slow_ratio);
-      current_ratio_ = std::min(max_ratio,
-                                std::max(min_ratio, current_ratio_));
+      current_ratio_ = base::ClampToRange(current_ratio_, min_ratio, max_ratio);
     } else {
       // The "direction" has changed. (From speed up to slow down or
       // vice versa, so we just take the slow ratio.
diff --git a/media/base/bind_to_current_loop_unittest.cc b/media/base/bind_to_current_loop_unittest.cc
index 83bbf24..faddb41 100644
--- a/media/base/bind_to_current_loop_unittest.cc
+++ b/media/base/bind_to_current_loop_unittest.cc
@@ -61,7 +61,7 @@
 // on the message loop, not during the original Run.
 class BindToCurrentLoopTest : public ::testing::Test {
  protected:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
 TEST_F(BindToCurrentLoopTest, RepeatingClosure) {
diff --git a/media/base/fake_demuxer_stream_unittest.cc b/media/base/fake_demuxer_stream_unittest.cc
index 0003878..bac5741 100644
--- a/media/base/fake_demuxer_stream_unittest.cc
+++ b/media/base/fake_demuxer_stream_unittest.cc
@@ -180,7 +180,7 @@
     ReadAllBuffers(num_configs, num_buffers_in_one_config);
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<FakeDemuxerStream> stream_;
 
   DemuxerStream::Status status_;
diff --git a/media/gpu/format_utils.cc b/media/base/format_utils.cc
similarity index 86%
rename from media/gpu/format_utils.cc
rename to media/base/format_utils.cc
index bd13fe5b..27e2bd8 100644
--- a/media/gpu/format_utils.cc
+++ b/media/base/format_utils.cc
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/gpu/format_utils.h"
+#include "media/base/format_utils.h"
 #include "base/logging.h"
 #include "ui/gfx/buffer_format_util.h"
 
 namespace media {
 
-VideoPixelFormat GfxBufferFormatToVideoPixelFormat(gfx::BufferFormat format) {
+base::Optional<VideoPixelFormat> GfxBufferFormatToVideoPixelFormat(
+    gfx::BufferFormat format) {
   switch (format) {
     case gfx::BufferFormat::BGRX_8888:
       return PIXEL_FORMAT_XRGB;
@@ -31,9 +32,9 @@
       return PIXEL_FORMAT_NV12;
 
     default:
-      LOG(FATAL) << "Unsupported BufferFormat: "
-                 << gfx::BufferFormatToString(format);
-      return PIXEL_FORMAT_UNKNOWN;
+      DLOG(WARNING) << "Unsupported BufferFormat: "
+                    << gfx::BufferFormatToString(format);
+      return base::nullopt;
   }
 }
 
diff --git a/media/base/format_utils.h b/media/base/format_utils.h
new file mode 100644
index 0000000..de7980c
--- /dev/null
+++ b/media/base/format_utils.h
@@ -0,0 +1,23 @@
+// Copyright 2017 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 MEDIA_BASE_FORMAT_UTILS_H_
+#define MEDIA_BASE_FORMAT_UTILS_H_
+
+#include "base/optional.h"
+#include "media/base/media_export.h"
+#include "media/base/video_types.h"
+#include "ui/gfx/buffer_types.h"
+
+namespace media {
+
+MEDIA_EXPORT base::Optional<VideoPixelFormat> GfxBufferFormatToVideoPixelFormat(
+    gfx::BufferFormat format);
+
+MEDIA_EXPORT base::Optional<gfx::BufferFormat>
+VideoPixelFormatToGfxBufferFormat(VideoPixelFormat pixel_format);
+
+}  // namespace media
+
+#endif  // MEDIA_BASE_FORMAT_UTILS_H_
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 1b6eae6..114d65e 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -437,7 +437,7 @@
 
 // Enables the Android Image Reader path for Video decoding(for AVDA and MCVD)
 const base::Feature kAImageReaderVideoOutput{"AImageReaderVideoOutput",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Prevents using SurfaceLayer for videos. This is meant to be used by embedders
 // that cannot support SurfaceLayer at the moment.
diff --git a/media/base/media_url_demuxer_unittest.cc b/media/base/media_url_demuxer_unittest.cc
index 3329df4..2e7b87d 100644
--- a/media/base/media_url_demuxer_unittest.cc
+++ b/media/base/media_url_demuxer_unittest.cc
@@ -42,7 +42,7 @@
   std::unique_ptr<Demuxer> demuxer_;
 
   // Necessary, or else base::ThreadTaskRunnerHandle::Get() fails.
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MediaUrlDemuxerTest);
diff --git a/media/base/null_video_sink_unittest.cc b/media/base/null_video_sink_unittest.cc
index 98d9b82..85d0c09 100644
--- a/media/base/null_video_sink_unittest.cc
+++ b/media/base/null_video_sink_unittest.cc
@@ -62,7 +62,7 @@
   MOCK_METHOD1(FrameReceived, void(scoped_refptr<VideoFrame>));
 
  protected:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   base::SimpleTestTickClock tick_clock_;
 
   DISALLOW_COPY_AND_ASSIGN(NullVideoSinkTest);
diff --git a/media/base/pipeline_impl_unittest.cc b/media/base/pipeline_impl_unittest.cc
index 8b85276..53ae0aa 100644
--- a/media/base/pipeline_impl_unittest.cc
+++ b/media/base/pipeline_impl_unittest.cc
@@ -328,7 +328,7 @@
   // Fixture members.
   StrictMock<CallbackHelper> callbacks_;
   base::SimpleTestTickClock test_tick_clock_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   NullMediaLog media_log_;
   std::unique_ptr<PipelineImpl> pipeline_;
 
@@ -717,9 +717,10 @@
 
 // Invoked function OnError. This asserts that the pipeline does not enqueue
 // non-teardown related tasks while tearing down.
-static void TestNoCallsAfterError(PipelineImpl* pipeline,
-                                  base::test::TaskEnvironment* task_environment,
-                                  PipelineStatus /* status */) {
+static void TestNoCallsAfterError(
+    PipelineImpl* pipeline,
+    base::test::SingleThreadTaskEnvironment* task_environment,
+    PipelineStatus /* status */) {
   CHECK(pipeline);
   CHECK(task_environment);
 
diff --git a/media/base/serial_runner_unittest.cc b/media/base/serial_runner_unittest.cc
index ff1ed2b..70a6722 100644
--- a/media/base/serial_runner_unittest.cc
+++ b/media/base/serial_runner_unittest.cc
@@ -129,7 +129,7 @@
     runner_.reset();
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   SerialRunner::Queue bound_fns_;
   std::unique_ptr<SerialRunner> runner_;
 
diff --git a/media/base/sinc_resampler_perftest.cc b/media/base/sinc_resampler_perftest.cc
index 3c0055d..7043697 100644
--- a/media/base/sinc_resampler_perftest.cc
+++ b/media/base/sinc_resampler_perftest.cc
@@ -9,7 +9,7 @@
 #include "media/base/sinc_resampler.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
 
 namespace media {
 
@@ -38,14 +38,11 @@
                 resampler.get_kernel_for_testing(),
                 resampler.get_kernel_for_testing(), kKernelInterpolationFactor);
   }
-  double total_time_milliseconds =
-      (base::TimeTicks::Now() - start).InMillisecondsF();
-  perf_test::PrintResult("sinc_resampler_convolve",
-                         "",
-                         trace_name,
-                         kBenchmarkIterations / total_time_milliseconds,
-                         "runs/ms",
-                         true);
+  double total_time_seconds = (base::TimeTicks::Now() - start).InSecondsF();
+
+  perf_test::PerfResultReporter reporter("sinc_resampler", trace_name);
+  reporter.RegisterImportantMetric("_convolve", "runs/s");
+  reporter.AddResult("_convolve", kBenchmarkIterations / total_time_seconds);
 }
 
 // Benchmark for the various Convolve() methods.  Make sure to build with
diff --git a/media/base/text_renderer_unittest.cc b/media/base/text_renderer_unittest.cc
index f5c6b09..a9fa487 100644
--- a/media/base/text_renderer_unittest.cc
+++ b/media/base/text_renderer_unittest.cc
@@ -190,7 +190,7 @@
   MOCK_METHOD0(OnPause, void());
   MOCK_METHOD0(OnFlush, void());
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   typedef std::vector<std::unique_ptr<FakeTextTrackStream>> TextTrackStreams;
   TextTrackStreams text_track_streams_;
diff --git a/media/base/vector_math_perftest.cc b/media/base/vector_math_perftest.cc
index de5e6ee9..b8974323 100644
--- a/media/base/vector_math_perftest.cc
+++ b/media/base/vector_math_perftest.cc
@@ -11,11 +11,23 @@
 #include "media/base/vector_math.h"
 #include "media/base/vector_math_testing.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
 
 using base::TimeTicks;
 using std::fill;
 
+namespace {
+
+perf_test::PerfResultReporter SetUpReporter(const std::string& story_name) {
+  perf_test::PerfResultReporter reporter("vector_math", story_name);
+  reporter.RegisterImportantMetric("_fmac", "runs/s");
+  reporter.RegisterImportantMetric("_fmul", "runs/s");
+  reporter.RegisterImportantMetric("_ewma_and_max_power", "runs/s");
+  return reporter;
+}
+
+}  // namespace
+
 namespace media {
 
 static const int kBenchmarkIterations = 200000;
@@ -37,7 +49,7 @@
 
   void RunBenchmark(void (*fn)(const float[], float, int, float[]),
                     bool aligned,
-                    const std::string& test_name,
+                    const std::string& metric_suffix,
                     const std::string& trace_name) {
     TimeTicks start = TimeTicks::Now();
     for (int i = 0; i < kBenchmarkIterations; ++i) {
@@ -46,33 +58,25 @@
          kVectorSize - (aligned ? 0 : 1),
          output_vector_.get());
     }
-    double total_time_milliseconds =
-        (TimeTicks::Now() - start).InMillisecondsF();
-    perf_test::PrintResult(test_name,
-                           "",
-                           trace_name,
-                           kBenchmarkIterations / total_time_milliseconds,
-                           "runs/ms",
-                           true);
+    double total_time_seconds = (TimeTicks::Now() - start).InSecondsF();
+    perf_test::PerfResultReporter reporter = SetUpReporter(trace_name);
+    reporter.AddResult(metric_suffix,
+                       kBenchmarkIterations / total_time_seconds);
   }
 
   void RunBenchmark(
       std::pair<float, float> (*fn)(float, const float[], int, float),
       int len,
-      const std::string& test_name,
+      const std::string& metric_suffix,
       const std::string& trace_name) {
     TimeTicks start = TimeTicks::Now();
     for (int i = 0; i < kEWMABenchmarkIterations; ++i) {
       fn(0.5f, input_vector_.get(), len, 0.1f);
     }
-    double total_time_milliseconds =
-        (TimeTicks::Now() - start).InMillisecondsF();
-    perf_test::PrintResult(test_name,
-                           "",
-                           trace_name,
-                           kEWMABenchmarkIterations / total_time_milliseconds,
-                           "runs/ms",
-                           true);
+    double total_time_seconds = (TimeTicks::Now() - start).InSecondsF();
+    perf_test::PerfResultReporter reporter = SetUpReporter(trace_name);
+    reporter.AddResult(metric_suffix,
+                       kEWMABenchmarkIterations / total_time_seconds);
   }
 
  protected:
@@ -96,8 +100,7 @@
 // Benchmarks for each optimized vector_math::FMAC() method.
 // Benchmark FMAC_C().
 TEST_F(VectorMathPerfTest, FMAC_unoptimized) {
-  RunBenchmark(
-      vector_math::FMAC_C, true, "vector_math_fmac", "unoptimized");
+  RunBenchmark(vector_math::FMAC_C, true, "_fmac", "unoptimized");
 }
 
 #if defined(FMAC_FUNC)
@@ -105,24 +108,21 @@
 TEST_F(VectorMathPerfTest, FMAC_optimized_unaligned) {
   ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment /
                                  sizeof(float)), 0U);
-  RunBenchmark(
-      vector_math::FMAC_FUNC, false, "vector_math_fmac", "optimized_unaligned");
+  RunBenchmark(vector_math::FMAC_FUNC, false, "_fmac", "optimized_unaligned");
 }
 
 // Benchmark FMAC_FUNC() with aligned size.
 TEST_F(VectorMathPerfTest, FMAC_optimized_aligned) {
   ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
             0U);
-  RunBenchmark(
-      vector_math::FMAC_FUNC, true, "vector_math_fmac", "optimized_aligned");
+  RunBenchmark(vector_math::FMAC_FUNC, true, "_fmac", "optimized_aligned");
 }
 #endif
 
 // Benchmarks for each optimized vector_math::FMUL() method.
 // Benchmark FMUL_C().
 TEST_F(VectorMathPerfTest, FMUL_unoptimized) {
-  RunBenchmark(
-      vector_math::FMUL_C, true, "vector_math_fmul", "unoptimized");
+  RunBenchmark(vector_math::FMUL_C, true, "_fmul", "unoptimized");
 }
 
 #if defined(FMUL_FUNC)
@@ -130,26 +130,22 @@
 TEST_F(VectorMathPerfTest, FMUL_optimized_unaligned) {
   ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment /
                                  sizeof(float)), 0U);
-  RunBenchmark(
-      vector_math::FMUL_FUNC, false, "vector_math_fmul", "optimized_unaligned");
+  RunBenchmark(vector_math::FMUL_FUNC, false, "_fmul", "optimized_unaligned");
 }
 
 // Benchmark FMUL_FUNC() with aligned size.
 TEST_F(VectorMathPerfTest, FMUL_optimized_aligned) {
   ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
             0U);
-  RunBenchmark(
-      vector_math::FMUL_FUNC, true, "vector_math_fmul", "optimized_aligned");
+  RunBenchmark(vector_math::FMUL_FUNC, true, "_fmul", "optimized_aligned");
 }
 #endif
 
 // Benchmarks for each optimized vector_math::EWMAAndMaxPower() method.
 // Benchmark EWMAAndMaxPower_C().
 TEST_F(VectorMathPerfTest, EWMAAndMaxPower_unoptimized) {
-  RunBenchmark(vector_math::EWMAAndMaxPower_C,
-               kVectorSize,
-               "vector_math_ewma_and_max_power",
-               "unoptimized");
+  RunBenchmark(vector_math::EWMAAndMaxPower_C, kVectorSize,
+               "_ewma_and_max_power", "unoptimized");
 }
 
 #if defined(EWMAAndMaxPower_FUNC)
@@ -157,20 +153,16 @@
 TEST_F(VectorMathPerfTest, EWMAAndMaxPower_optimized_unaligned) {
   ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment /
                                  sizeof(float)), 0U);
-  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC,
-               kVectorSize - 1,
-               "vector_math_ewma_and_max_power",
-               "optimized_unaligned");
+  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, kVectorSize - 1,
+               "_ewma_and_max_power", "optimized_unaligned");
 }
 
 // Benchmark EWMAAndMaxPower_FUNC() with aligned size.
 TEST_F(VectorMathPerfTest, EWMAAndMaxPower_optimized_aligned) {
   ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)),
             0U);
-  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC,
-               kVectorSize,
-               "vector_math_ewma_and_max_power",
-               "optimized_aligned");
+  RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, kVectorSize,
+               "_ewma_and_max_power", "optimized_aligned");
 }
 #endif
 
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc
index cc7dd78..f3a8e3b 100644
--- a/media/blink/multibuffer_data_source.cc
+++ b/media/blink/multibuffer_data_source.cc
@@ -10,6 +10,7 @@
 #include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/numerics/ranges.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
 #include "media/base/media_log.h"
@@ -68,11 +69,6 @@
 
 namespace media {
 
-template <typename T>
-T clamp(T value, T min, T max) {
-  return std::max(std::min(value, max), min);
-}
-
 class MultibufferDataSource::ReadOperation {
  public:
   ReadOperation(int64_t position,
@@ -704,7 +700,7 @@
   buffer_size_update_counter_ = kUpdateBufferSizeFrequency;
 
   // Use a default bit rate if unknown and clamp to prevent overflow.
-  int64_t bitrate = clamp<int64_t>(bitrate_, 0, kMaxBitrate);
+  int64_t bitrate = base::ClampToRange<int64_t>(bitrate_, 0, kMaxBitrate);
   if (bitrate == 0)
     bitrate = kDefaultBitrate;
 
@@ -718,8 +714,9 @@
   int64_t bytes_per_second = (bitrate / 8.0) * playback_rate;
 
   // Preload 10 seconds of data, clamped to some min/max value.
-  int64_t preload = clamp(kTargetSecondsBufferedAhead * bytes_per_second,
-                          kMinBufferPreload, kMaxBufferPreload);
+  int64_t preload =
+      base::ClampToRange(kTargetSecondsBufferedAhead * bytes_per_second,
+                         kMinBufferPreload, kMaxBufferPreload);
 
   // Increase buffering slowly at a rate of 10% of data downloaded so
   // far, maxing out at the preload size.
@@ -733,8 +730,9 @@
   int64_t preload_high = preload + kPreloadHighExtra;
 
   // We pin a few seconds of data behind the current reading position.
-  int64_t pin_backward = clamp(kTargetSecondsBufferedBehind * bytes_per_second,
-                               kMinBufferPreload, kMaxBufferPreload);
+  int64_t pin_backward =
+      base::ClampToRange(kTargetSecondsBufferedBehind * bytes_per_second,
+                         kMinBufferPreload, kMaxBufferPreload);
 
   // We always pin at least kDefaultPinSize ahead of the read position.
   // Normally, the extra space between preload_high and kDefaultPinSize will
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 8f067cb..9c1ba64c 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -2957,15 +2957,16 @@
   // errors.
   bool has_error = IsNetworkStateError(network_state_);
 
-  // After kReadyStateHaveMetadata, Blink will call play() if the state is not
-  // paused; prior to this point |paused_| is not accurate.
-  bool have_metadata =
-      highest_ready_state_ >= WebMediaPlayer::kReadyStateHaveMetadata;
+  // Note: Even though we get play/pause signals at kReadyStateHaveMetadata, we
+  // must attempt to preroll until kReadyStateHaveFutureData so that the
+  // canplaythrough event will be fired to the page (which may be waiting).
+  bool have_future_data =
+      highest_ready_state_ >= WebMediaPlayer::kReadyStateHaveFutureData;
 
   // Background suspend is only enabled for paused players.
   // In the case of players with audio the session should be kept.
   bool background_suspended =
-      can_auto_suspend && is_backgrounded && paused_ && have_metadata;
+      can_auto_suspend && is_backgrounded && paused_ && have_future_data;
 
   // Idle suspension is allowed prior to kReadyStateHaveMetadata since there
   // exist mechanisms to exit the idle state when the player is capable of
@@ -2980,7 +2981,7 @@
   // to kReadyStateHaveMetadata, we require |is_stale| to remain suspended.
   // |is_stale| will be cleared when we receive data which may take us to
   // kReadyStateHaveMetadata.
-  bool can_stay_suspended = (is_stale || have_metadata) && is_suspended &&
+  bool can_stay_suspended = (is_stale || have_future_data) && is_suspended &&
                             paused_ && !seeking_ && !needs_first_frame_;
 
   // Combined suspend state.
@@ -2991,7 +2992,8 @@
            << ", idle_suspended=" << idle_suspended
            << ", background_suspended=" << background_suspended
            << ", can_stay_suspended=" << can_stay_suspended
-           << ", is_stale=" << is_stale << ", have_metadata=" << have_metadata
+           << ", is_stale=" << is_stale
+           << ", have_future_data=" << have_future_data
            << ", paused_=" << paused_ << ", seeking_=" << seeking_;
 
   // We do not treat |playback_rate_| == 0 as paused. For the media session,
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index f8e3b78..2d11d5c0 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -1275,6 +1275,19 @@
   EXPECT_FALSE(state.is_memory_reporting_enabled);
 }
 
+TEST_F(WebMediaPlayerImplTest, ComputePlayState_DoesNotStaySuspended) {
+  InitializeWebMediaPlayerImpl();
+  SetMetadata(true, true);
+  SetReadyState(blink::WebMediaPlayer::kReadyStateHaveMetadata);
+
+  // Should stay suspended even though not stale or backgrounded.
+  WebMediaPlayerImpl::PlayState state = ComputePlayState_Suspended();
+  EXPECT_EQ(WebMediaPlayerImpl::DelegateState::GONE, state.delegate_state);
+  EXPECT_TRUE(state.is_idle);
+  EXPECT_FALSE(state.is_suspended);
+  EXPECT_FALSE(state.is_memory_reporting_enabled);
+}
+
 TEST_F(WebMediaPlayerImplTest, ComputePlayState_StaysSuspended) {
   InitializeWebMediaPlayerImpl();
   SetMetadata(true, true);
diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc
index f8c3f37..aaa5f9c 100644
--- a/media/capture/video/fake_video_capture_device.cc
+++ b/media/capture/video/fake_video_capture_device.cc
@@ -12,6 +12,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/numerics/ranges.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_checker.h"
@@ -600,25 +601,24 @@
 
   if (settings->has_pan) {
     device_state_write_access->pan =
-        std::max(kMinPan, std::min(settings->pan, kMaxPan));
+        base::ClampToRange(settings->pan, kMinPan, kMaxPan);
   }
   if (settings->has_tilt) {
     device_state_write_access->tilt =
-        std::max(kMinTilt, std::min(settings->tilt, kMaxTilt));
+        base::ClampToRange(settings->tilt, kMinTilt, kMaxTilt);
   }
   if (settings->has_zoom) {
     device_state_write_access->zoom =
-        std::max(kMinZoom, std::min(settings->zoom, kMaxZoom));
+        base::ClampToRange(settings->zoom, kMinZoom, kMaxZoom);
   }
   if (settings->has_exposure_time) {
-    device_state_write_access->exposure_time = std::max(
-        kMinExposureTime, std::min(settings->exposure_time, kMaxExposureTime));
+    device_state_write_access->exposure_time = base::ClampToRange(
+        settings->exposure_time, kMinExposureTime, kMaxExposureTime);
   }
 
   if (settings->has_focus_distance) {
-    device_state_write_access->focus_distance =
-        std::max(kMinFocusDistance,
-                 std::min(settings->focus_distance, kMaxFocusDistance));
+    device_state_write_access->focus_distance = base::ClampToRange(
+        settings->focus_distance, kMinFocusDistance, kMaxFocusDistance);
   }
 
   std::move(callback).Run(true);
diff --git a/media/cdm/aes_decryptor_unittest.cc b/media/cdm/aes_decryptor_unittest.cc
index 304baa9..25d1b53 100644
--- a/media/cdm/aes_decryptor_unittest.cc
+++ b/media/cdm/aes_decryptor_unittest.cc
@@ -493,7 +493,7 @@
   }
 
   // Must be the first member to be initialized first and destroyed last.
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   StrictMock<MockCdmClient> cdm_client_;
   scoped_refptr<ContentDecryptionModule> cdm_;
diff --git a/media/cdm/cdm_adapter_unittest.cc b/media/cdm/cdm_adapter_unittest.cc
index 037e776..66213c7 100644
--- a/media/cdm/cdm_adapter_unittest.cc
+++ b/media/cdm/cdm_adapter_unittest.cc
@@ -185,7 +185,7 @@
   // Keep track of the loaded CDM.
   scoped_refptr<ContentDecryptionModule> cdm_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(CdmAdapterTestBase);
diff --git a/media/device_monitors/system_message_window_win_unittest.cc b/media/device_monitors/system_message_window_win_unittest.cc
index b0cd4af4..96912d96 100644
--- a/media/device_monitors/system_message_window_win_unittest.cc
+++ b/media/device_monitors/system_message_window_win_unittest.cc
@@ -29,8 +29,7 @@
   }
 
   // Run single threaded to not require explicit COM initialization
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY};
+  base::test::SingleThreadTaskEnvironment task_environment_;
   base::SystemMonitor system_monitor_;
   base::MockDevicesChangedObserver observer_;
   SystemMessageWindowWin window_;
diff --git a/media/filters/aom_video_decoder_unittest.cc b/media/filters/aom_video_decoder_unittest.cc
index e1a9292..060b063 100644
--- a/media/filters/aom_video_decoder_unittest.cc
+++ b/media/filters/aom_video_decoder_unittest.cc
@@ -164,7 +164,7 @@
 
   testing::StrictMock<MockMediaLog> media_log_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<AomVideoDecoder> decoder_;
 
   scoped_refptr<DecoderBuffer> i_frame_buffer_;
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
index 188edd4..62315337 100644
--- a/media/filters/audio_decoder_unittest.cc
+++ b/media/filters/audio_decoder_unittest.cc
@@ -393,7 +393,7 @@
   // that the decoder can be reinitialized with different parameters.
   TestParams params_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   NullMediaLog media_log_;
   scoped_refptr<DecoderBuffer> data_;
diff --git a/media/filters/dav1d_video_decoder_unittest.cc b/media/filters/dav1d_video_decoder_unittest.cc
index ef342c7e..db5d075a 100644
--- a/media/filters/dav1d_video_decoder_unittest.cc
+++ b/media/filters/dav1d_video_decoder_unittest.cc
@@ -172,7 +172,7 @@
 
   testing::StrictMock<MockMediaLog> media_log_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<Dav1dVideoDecoder> decoder_;
 
   scoped_refptr<DecoderBuffer> i_frame_buffer_;
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 010d827..cd936d3 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -244,7 +244,7 @@
 
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   NullMediaLog media_log_;
   std::unique_ptr<DecryptingAudioDecoder> decoder_;
   std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
diff --git a/media/filters/decrypting_demuxer_stream_unittest.cc b/media/filters/decrypting_demuxer_stream_unittest.cc
index 148786f..4698b8c 100644
--- a/media/filters/decrypting_demuxer_stream_unittest.cc
+++ b/media/filters/decrypting_demuxer_stream_unittest.cc
@@ -264,7 +264,7 @@
                void(DemuxerStream::Status, scoped_refptr<DecoderBuffer>));
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   StrictMock<MockMediaLog> media_log_;
   std::unique_ptr<DecryptingDemuxerStream> demuxer_stream_;
   std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index f32101a8..ba25ab5 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -221,7 +221,7 @@
 
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   NullMediaLog media_log_;
   std::unique_ptr<DecryptingVideoDecoder> decoder_;
   std::unique_ptr<StrictMock<MockCdmContext>> cdm_context_;
diff --git a/media/filters/demuxer_perftest.cc b/media/filters/demuxer_perftest.cc
index 01ca651fa..e249b5ad 100644
--- a/media/filters/demuxer_perftest.cc
+++ b/media/filters/demuxer_perftest.cc
@@ -24,7 +24,7 @@
 #include "media/filters/file_data_source.h"
 #include "media/media_buildflags.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
 
 namespace media {
 
@@ -207,9 +207,9 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  perf_test::PrintResult("demuxer_bench", "", filename,
-                         kBenchmarkIterations / total_time.InSecondsF(),
-                         "runs/s", true);
+  perf_test::PerfResultReporter reporter("demuxer_bench", filename);
+  reporter.RegisterImportantMetric("", "runs/s");
+  reporter.AddResult("", kBenchmarkIterations / total_time.InSecondsF());
 }
 
 class DemuxerPerfTest : public testing::TestWithParam<const char*> {};
diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
index df8435f..41bbb3760 100644
--- a/media/filters/fake_video_decoder_unittest.cc
+++ b/media/filters/fake_video_decoder_unittest.cc
@@ -222,7 +222,7 @@
     DCHECK(!is_reset_pending_);
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   VideoDecoderConfig current_config_;
 
   std::unique_ptr<FakeVideoDecoder> decoder_;
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index d620f41..24fe18f 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -200,7 +200,7 @@
 
   StrictMock<MockMediaLog> media_log_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<FFmpegVideoDecoder> decoder_;
 
   // Various buffers for testing.
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc
index a18078b..60a6ae86 100644
--- a/media/filters/frame_processor_unittest.cc
+++ b/media/filters/frame_processor_unittest.cc
@@ -298,7 +298,7 @@
     stream->StartReturningData();
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   StrictMock<MockMediaLog> media_log_;
   StrictMock<FrameProcessorTestCallbackHelper> callbacks_;
 
diff --git a/media/filters/pipeline_controller_unittest.cc b/media/filters/pipeline_controller_unittest.cc
index 674a1cd..a0137a8 100644
--- a/media/filters/pipeline_controller_unittest.cc
+++ b/media/filters/pipeline_controller_unittest.cc
@@ -158,7 +158,7 @@
   void OnAudioDecoderChange(const PipelineDecoderInfo& info) override {}
   void OnVideoDecoderChange(const PipelineDecoderInfo& info) override {}
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   NiceMock<MockDemuxer> demuxer_;
   StrictMock<MockPipeline>* pipeline_;
diff --git a/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc
index f250d26..42b4969c 100644
--- a/media/filters/video_decoder_stream_unittest.cc
+++ b/media/filters/video_decoder_stream_unittest.cc
@@ -463,7 +463,7 @@
     SatisfyPendingCallback(DECODER_REINIT);
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   StrictMock<MockMediaLog> media_log_;
   std::unique_ptr<VideoDecoderStream> video_decoder_stream_;
diff --git a/media/filters/vp9_parser.cc b/media/filters/vp9_parser.cc
index 2a904b6..66d3233 100644
--- a/media/filters/vp9_parser.cc
+++ b/media/filters/vp9_parser.cc
@@ -16,6 +16,7 @@
 #include "base/bind.h"
 #include "base/containers/circular_deque.h"
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/stl_util.h"
 #include "base/sys_byteorder.h"
@@ -147,8 +148,8 @@
 }
 
 int ClampLf(int lf) {
-  const int kMaxLoopFilterLevel = 63;
-  return std::min(std::max(0, lf), kMaxLoopFilterLevel);
+  constexpr int kMaxLoopFilterLevel = 63;
+  return base::ClampToRange(lf, 0, kMaxLoopFilterLevel);
 }
 
 std::string IncrementIV(const std::string& iv, uint32_t by) {
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 8e8adcb..000732d3 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -242,8 +242,6 @@
     "accelerated_video_decoder.h",
     "codec_picture.cc",
     "codec_picture.h",
-    "format_utils.cc",
-    "format_utils.h",
     "gpu_video_decode_accelerator_helpers.cc",
     "gpu_video_decode_accelerator_helpers.h",
     "gpu_video_encode_accelerator_helpers.cc",
diff --git a/media/gpu/format_utils.h b/media/gpu/format_utils.h
deleted file mode 100644
index 3e05632..0000000
--- a/media/gpu/format_utils.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 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 MEDIA_GPU_FORMAT_UTILS_H_
-#define MEDIA_GPU_FORMAT_UTILS_H_
-
-#include "base/optional.h"
-#include "media/base/video_types.h"
-#include "media/gpu/media_gpu_export.h"
-#include "ui/gfx/buffer_types.h"
-
-namespace media {
-
-MEDIA_GPU_EXPORT VideoPixelFormat
-GfxBufferFormatToVideoPixelFormat(gfx::BufferFormat format);
-
-MEDIA_GPU_EXPORT base::Optional<gfx::BufferFormat>
-VideoPixelFormatToGfxBufferFormat(VideoPixelFormat pixel_format);
-
-}  // namespace media
-
-#endif  // MEDIA_GPU_FORMAT_UTILS_H_
diff --git a/media/gpu/linux/mailbox_video_frame_converter.cc b/media/gpu/linux/mailbox_video_frame_converter.cc
index b2dde5de..1ac5c94b 100644
--- a/media/gpu/linux/mailbox_video_frame_converter.cc
+++ b/media/gpu/linux/mailbox_video_frame_converter.cc
@@ -9,7 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/task/post_task.h"
-#include "media/gpu/format_utils.h"
+#include "media/base/format_utils.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
 #include "ui/gfx/gpu_memory_buffer.h"
diff --git a/media/gpu/linux/platform_video_frame_pool.cc b/media/gpu/linux/platform_video_frame_pool.cc
index ddaacfb..55dffbf 100644
--- a/media/gpu/linux/platform_video_frame_pool.cc
+++ b/media/gpu/linux/platform_video_frame_pool.cc
@@ -9,7 +9,6 @@
 #include "base/logging.h"
 #include "base/optional.h"
 #include "base/task/post_task.h"
-#include "base/time/default_tick_clock.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
 
@@ -17,13 +16,6 @@
 
 namespace {
 
-// The lifespan for stale frames. If a frame is not used for 10 seconds, then
-// drop the frame to reduce memory usage.
-constexpr base::TimeDelta kStaleFrameLimit = base::TimeDelta::FromSeconds(10);
-
-// The default maximum number of frames.
-constexpr size_t kDefaultMaxNumFrames = 64;
-
 // The default method to create frames.
 scoped_refptr<VideoFrame> DefaultCreateFrame(VideoPixelFormat format,
                                              const gfx::Size& coded_size,
@@ -43,30 +35,11 @@
 
 }  // namespace
 
-struct PlatformVideoFramePool::FrameEntry {
-  base::TimeTicks last_use_time;
-  scoped_refptr<VideoFrame> frame;
-
-  FrameEntry(base::TimeTicks time, scoped_refptr<VideoFrame> frame)
-      : last_use_time(time), frame(std::move(frame)) {}
-  FrameEntry(const FrameEntry& other) {
-    last_use_time = other.last_use_time;
-    frame = other.frame;
-  }
-  ~FrameEntry() = default;
-};
-
 PlatformVideoFramePool::PlatformVideoFramePool()
-    : PlatformVideoFramePool(base::BindRepeating(&DefaultCreateFrame),
-                             base::DefaultTickClock::GetInstance()) {}
+    : PlatformVideoFramePool(base::BindRepeating(&DefaultCreateFrame)) {}
 
-PlatformVideoFramePool::PlatformVideoFramePool(
-    CreateFrameCB cb,
-    const base::TickClock* tick_clock)
-    : create_frame_cb_(std::move(cb)),
-      tick_clock_(tick_clock),
-      max_num_frames_(kDefaultMaxNumFrames),
-      weak_this_factory_(this) {
+PlatformVideoFramePool::PlatformVideoFramePool(CreateFrameCB cb)
+    : create_frame_cb_(std::move(cb)) {
   DVLOGF(4);
   weak_this_ = weak_this_factory_.GetWeakPtr();
 }
@@ -111,7 +84,7 @@
   }
 
   DCHECK(!free_frames_.empty());
-  scoped_refptr<VideoFrame> origin_frame = std::move(free_frames_.back().frame);
+  scoped_refptr<VideoFrame> origin_frame = std::move(free_frames_.back());
   free_frames_.pop_back();
   DCHECK_EQ(origin_frame->format(), format);
   DCHECK_EQ(origin_frame->coded_size(), coded_size);
@@ -130,34 +103,6 @@
   return wrapped_frame;
 }
 
-void PlatformVideoFramePool::set_parent_task_runner(
-    scoped_refptr<base::SequencedTaskRunner> parent_task_runner) {
-  DCHECK(!parent_task_runner_);
-
-  parent_task_runner_ = std::move(parent_task_runner);
-  parent_task_runner_->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&PlatformVideoFramePool::PurgeStaleFrames, weak_this_),
-      kStaleFrameLimit);
-}
-
-void PlatformVideoFramePool::PurgeStaleFrames() {
-  DCHECK(parent_task_runner_->RunsTasksInCurrentSequence());
-  DVLOGF(4);
-  base::AutoLock auto_lock(lock_);
-
-  const base::TimeTicks now = tick_clock_->NowTicks();
-  while (!free_frames_.empty() &&
-         now - free_frames_.front().last_use_time > kStaleFrameLimit) {
-    free_frames_.pop_front();
-  }
-
-  parent_task_runner_->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&PlatformVideoFramePool::PurgeStaleFrames, weak_this_),
-      kStaleFrameLimit);
-}
-
 void PlatformVideoFramePool::SetMaxNumFrames(size_t max_num_frames) {
   DVLOGF(4);
   base::AutoLock auto_lock(lock_);
@@ -276,7 +221,7 @@
   lock_.AssertAcquired();
 
   if (GetTotalNumFrames_Locked() < max_num_frames_)
-    free_frames_.push_back({tick_clock_->NowTicks(), std::move(frame)});
+    free_frames_.push_back(std::move(frame));
 }
 
 size_t PlatformVideoFramePool::GetTotalNumFrames_Locked() const {
diff --git a/media/gpu/linux/platform_video_frame_pool.h b/media/gpu/linux/platform_video_frame_pool.h
index 47df14dc..3b36eab 100644
--- a/media/gpu/linux/platform_video_frame_pool.h
+++ b/media/gpu/linux/platform_video_frame_pool.h
@@ -21,10 +21,6 @@
 #include "media/gpu/linux/dmabuf_video_frame_pool.h"
 #include "media/gpu/media_gpu_export.h"
 
-namespace base {
-class TickClock;
-}
-
 namespace media {
 
 // Simple VideoFrame pool used to avoid unnecessarily allocating and destroying
@@ -35,8 +31,7 @@
 // PlatformVideoFramePool object. Before calling GetFrame(), the client should
 // call NegotiateFrameFormat(). If the parameters passed to
 // NegotiateFrameFormat() are changed, then the memory used by frames with the
-// old parameter values will be purged from the pool. Frames which are not used
-// for a certain period will be purged.
+// old parameter values will be purged from the pool.
 class MEDIA_GPU_EXPORT PlatformVideoFramePool : public DmabufVideoFramePool {
  public:
   using DmabufId = const std::vector<base::ScopedFD>*;
@@ -45,8 +40,6 @@
   ~PlatformVideoFramePool() override;
 
   // VideoFramePoolBase Implementation.
-  void set_parent_task_runner(
-      scoped_refptr<base::SequencedTaskRunner> parent_task_runner) override;
   void SetMaxNumFrames(size_t max_num_frames) override;
   base::Optional<VideoFrameLayout> NegotiateFrameFormat(
       const VideoFrameLayout& layout,
@@ -67,12 +60,9 @@
       const gfx::Size& natural_size,
       base::TimeDelta timestamp)>;
 
-  // Used to store free frame and the last used time.
-  struct FrameEntry;
-
-  // Allows injection of create frame callback and base::SimpleTestClock.
-  // This is used to test the behavior of the video frame pool.
-  PlatformVideoFramePool(CreateFrameCB cb, const base::TickClock* tick_clock);
+  // Allows injection of create frame callback. This is used to test the
+  // behavior of the video frame pool.
+  PlatformVideoFramePool(CreateFrameCB cb);
 
   // Returns the number of frames in the pool for testing purposes.
   size_t GetPoolSizeForTesting();
@@ -105,9 +95,6 @@
   // The function used to allocate new frames.
   const CreateFrameCB create_frame_cb_;
 
-  // |tick_clock_| is always a DefaultTickClock outside of testing.
-  const base::TickClock* tick_clock_;
-
   // Lock to protect all data members.
   // Every public method and OnFrameReleased() should acquire this lock.
   base::Lock lock_;
@@ -121,12 +108,13 @@
 
   // The pool of free frames. The layout of all the frames in |free_frames_|
   // should be the same as |format_| and |coded_size_|.
-  base::circular_deque<FrameEntry> free_frames_ GUARDED_BY(lock_);
+  base::circular_deque<scoped_refptr<VideoFrame>> free_frames_
+      GUARDED_BY(lock_);
   // Mapping from the unique_id of the wrapped frame to the original frame.
   std::map<DmabufId, VideoFrame*> frames_in_use_ GUARDED_BY(lock_);
 
   // The maximum number of frames created by the pool.
-  size_t max_num_frames_ GUARDED_BY(lock_);
+  size_t max_num_frames_ GUARDED_BY(lock_) = 0;
 
   // Callback which is called when the pool is not exhausted.
   base::OnceClosure frame_available_cb_ GUARDED_BY(lock_);
@@ -134,7 +122,7 @@
   // The weak pointer of this, bound at |parent_task_runner_|.
   // Used at the VideoFrame destruction callback.
   base::WeakPtr<PlatformVideoFramePool> weak_this_;
-  base::WeakPtrFactory<PlatformVideoFramePool> weak_this_factory_;
+  base::WeakPtrFactory<PlatformVideoFramePool> weak_this_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(PlatformVideoFramePool);
 };
diff --git a/media/gpu/linux/platform_video_frame_pool_unittest.cc b/media/gpu/linux/platform_video_frame_pool_unittest.cc
index 6a2d529..0e84b17 100644
--- a/media/gpu/linux/platform_video_frame_pool_unittest.cc
+++ b/media/gpu/linux/platform_video_frame_pool_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_file.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "media/gpu/linux/platform_video_frame_pool.h"
@@ -56,8 +55,9 @@
   PlatformVideoFramePoolTest()
       : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
     pool_.reset(new PlatformVideoFramePool(
-        base::BindRepeating(&CreateDmabufVideoFrame), &test_clock_));
+        base::BindRepeating(&CreateDmabufVideoFrame)));
     pool_->set_parent_task_runner(base::ThreadTaskRunnerHandle::Get());
+    pool_->SetMaxNumFrames(10);
   }
 
   void SetFrameFormat(VideoPixelFormat format) {
@@ -90,7 +90,6 @@
 
  protected:
   base::test::TaskEnvironment task_environment_;
-  base::SimpleTestTickClock test_clock_;
   std::unique_ptr<PlatformVideoFramePool,
                   std::default_delete<DmabufVideoFramePool>>
       pool_;
@@ -163,28 +162,6 @@
   CheckPoolSize(0u);
 }
 
-TEST_F(PlatformVideoFramePoolTest, StaleFramesAreExpired) {
-  SetFrameFormat(PIXEL_FORMAT_I420);
-  scoped_refptr<VideoFrame> frame_1 = GetFrame(10);
-  scoped_refptr<VideoFrame> frame_2 = GetFrame(10);
-  EXPECT_NE(frame_1.get(), frame_2.get());
-  CheckPoolSize(0u);
-
-  // Drop frame and verify that resources are still available for reuse.
-  frame_1 = nullptr;
-  task_environment_.RunUntilIdle();
-  CheckPoolSize(1u);
-
-  // Advance clock far enough to hit stale timer; ensure only frame_1 has its
-  // resources released.
-  base::TimeDelta time_forward = base::TimeDelta::FromMinutes(1);
-  test_clock_.Advance(time_forward);
-  task_environment_.FastForwardBy(time_forward);
-  frame_2 = nullptr;
-  task_environment_.RunUntilIdle();
-  CheckPoolSize(1u);
-}
-
 TEST_F(PlatformVideoFramePoolTest, UnwrapVideoFrame) {
   SetFrameFormat(PIXEL_FORMAT_I420);
   scoped_refptr<VideoFrame> frame_1 = GetFrame(10);
diff --git a/media/gpu/linux/platform_video_frame_utils.cc b/media/gpu/linux/platform_video_frame_utils.cc
index e99a5ca..4f66be0 100644
--- a/media/gpu/linux/platform_video_frame_utils.cc
+++ b/media/gpu/linux/platform_video_frame_utils.cc
@@ -8,9 +8,9 @@
 #include "base/bind_helpers.h"
 #include "base/files/scoped_file.h"
 #include "build/build_config.h"
+#include "media/base/format_utils.h"
 #include "media/base/scopedfd_helper.h"
 #include "media/base/video_frame_layout.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/macros.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/linux/native_pixmap_dmabuf.h"
diff --git a/media/gpu/linux/platform_video_frame_utils_unittest.cc b/media/gpu/linux/platform_video_frame_utils_unittest.cc
index 1517c0f..ccaf0ad 100644
--- a/media/gpu/linux/platform_video_frame_utils_unittest.cc
+++ b/media/gpu/linux/platform_video_frame_utils_unittest.cc
@@ -17,10 +17,10 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/optional.h"
 #include "base/time/time.h"
+#include "media/base/format_utils.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_frame_layout.h"
 #include "media/base/video_types.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/media/gpu/test/video_decode_accelerator_unittest_helpers.cc b/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
index 380e2b0..e2b1cae 100644
--- a/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
+++ b/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
@@ -150,16 +150,33 @@
 
 std::string EncodedDataHelper::GetBytesForNextFrame() {
   // Helpful description: http://wiki.multimedia.cx/index.php?title=IVF
+  constexpr size_t kIVFHeaderSize = 32;
+  constexpr size_t kIVFFrameHeaderSize = 12;
+
   size_t pos = next_pos_to_decode_;
   std::string bytes;
-  if (pos == 0)
-    pos = 32;  // Skip IVF header.
 
+  // Only IVF video files are supported. The first 4bytes of an IVF video file's
+  // header should be "DKIF".
+  if (pos == 0) {
+    if ((data_.size() < kIVFHeaderSize) || strncmp(&data_[0], "DKIF", 4) != 0) {
+      LOG(ERROR) << "Unexpected data encountered while parsing IVF header";
+      return bytes;
+    }
+    pos = kIVFHeaderSize;  // Skip IVF header.
+  }
+
+  // Read VP8/9 frame size from IVF header.
+  if (pos + kIVFFrameHeaderSize > data_.size()) {
+    LOG(ERROR) << "Unexpected data encountered while parsing IVF frame header";
+    return bytes;
+  }
   uint32_t frame_size = *reinterpret_cast<uint32_t*>(&data_[pos]);
-  pos += 12;  // Skip frame header.
+  pos += kIVFFrameHeaderSize;  // Skip IVF frame header.
+
   // Make sure we are not reading out of bounds.
   if (pos + frame_size > data_.size()) {
-    LOG(ERROR) << "Unexpected data encountered while parsing frame";
+    LOG(ERROR) << "Unexpected data encountered while parsing IVF frame header";
     next_pos_to_decode_ = data_.size();
     return bytes;
   }
diff --git a/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc
index 4d56fdf0..e491c54 100644
--- a/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.cc
@@ -26,7 +26,6 @@
 #include "media/base/unaligned_shared_memory.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_types.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
 #include "media/gpu/video_frame_mapper.h"
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn
index 2d19903..c9b11948 100644
--- a/media/gpu/vaapi/BUILD.gn
+++ b/media/gpu/vaapi/BUILD.gn
@@ -176,6 +176,7 @@
     "//base/test:test_support",
     "//gpu:test_support",
     "//gpu/ipc/service",
+    "//media",
     "//media/gpu:common",
     "//mojo/core/embedder",
     "//testing/gmock",
diff --git a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
index 3aed916..4d5cbe6 100644
--- a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
+++ b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
@@ -8,7 +8,6 @@
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
 #include "media/gpu/vaapi/vaapi_utils.h"
diff --git a/media/gpu/vaapi/vaapi_jpeg_encoder.cc b/media/gpu/vaapi/vaapi_jpeg_encoder.cc
index ebfaa37..25297a49 100644
--- a/media/gpu/vaapi/vaapi_jpeg_encoder.cc
+++ b/media/gpu/vaapi/vaapi_jpeg_encoder.cc
@@ -11,6 +11,7 @@
 #include <string.h>
 
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/stl_util.h"
 #include "media/gpu/macros.h"
@@ -206,7 +207,7 @@
     for (size_t j = 0; j < kDctSize; ++j) {
       uint32_t scaled_quant_value =
           (quant_table.value[kZigZag8x8[j]] * quality_normalized) / 100;
-      scaled_quant_value = std::min(255u, std::max(1u, scaled_quant_value));
+      scaled_quant_value = base::ClampToRange(scaled_quant_value, 1u, 255u);
       header[idx++] = static_cast<uint8_t>(scaled_quant_value);
     }
   }
diff --git a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
index bd6381c8..d2cf295b 100644
--- a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.cc
@@ -28,11 +28,11 @@
 #include "gpu/ipc/common/gpu_memory_buffer_impl.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "media/base/bitstream_buffer.h"
+#include "media/base/format_utils.h"
 #include "media/base/unaligned_shared_memory.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_frame_layout.h"
 #include "media/base/video_types.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
 #include "media/gpu/vaapi/va_surface.h"
diff --git a/media/gpu/vaapi/vaapi_utils.cc b/media/gpu/vaapi/vaapi_utils.cc
index 03e625e..641bb01 100644
--- a/media/gpu/vaapi/vaapi_utils.cc
+++ b/media/gpu/vaapi/vaapi_utils.cc
@@ -241,9 +241,7 @@
       }
     }
 
-    // Clamp to [0..63] range.
-    lf_level = std::min(std::max(lf_level, 0), 63);
-    pic_param.loop_filter_level[i] = lf_level;
+    pic_param.loop_filter_level[i] = base::ClampToRange(lf_level, 0, 63);
   }
 
   static_assert(
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index f04b60f..9a22e8f 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -25,9 +25,9 @@
 #include "base/trace_event/trace_event.h"
 #include "gpu/ipc/service/gpu_channel.h"
 #include "media/base/bind_to_current_loop.h"
+#include "media/base/format_utils.h"
 #include "media/base/unaligned_shared_memory.h"
 #include "media/gpu/accelerated_video_decoder.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/h264_decoder.h"
 #include "media/gpu/macros.h"
 #include "media/gpu/vaapi/vaapi_common.h"
@@ -579,11 +579,13 @@
   VLOGF(2) << "Requesting " << requested_num_pics_
            << " pictures of size: " << requested_pic_size_.ToString();
 
-  const VideoPixelFormat format = GfxBufferFormatToVideoPixelFormat(
-      vaapi_picture_factory_->GetBufferFormat());
+  const base::Optional<VideoPixelFormat> format =
+      GfxBufferFormatToVideoPixelFormat(
+          vaapi_picture_factory_->GetBufferFormat());
+  CHECK(format);
   task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&Client::ProvidePictureBuffersWithVisibleRect,
-                                client_, requested_num_pics_, format, 1,
+                                client_, requested_num_pics_, *format, 1,
                                 requested_pic_size_, requested_visible_rect_,
                                 vaapi_picture_factory_->GetGLTextureTarget()));
   // |client_| may respond via AssignPictureBuffers().
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
index 06b33de17..70ec436 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "media/gpu/accelerated_video_decoder.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/vaapi/vaapi_picture.h"
 #include "media/gpu/vaapi/vaapi_picture_factory.h"
 #include "media/gpu/vaapi/vaapi_wrapper.h"
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index df02b53..54cb5a7 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -11,9 +11,9 @@
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "media/base/bind_to_current_loop.h"
+#include "media/base/format_utils.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_util.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/gpu_video_decode_accelerator_helpers.h"
 #include "media/gpu/linux/dmabuf_video_frame_pool.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
@@ -519,12 +519,12 @@
   const gfx::Rect visible_rect = decoder_->GetVisibleRect();
   gfx::Size natural_size = GetNaturalSize(visible_rect, pixel_aspect_ratio_);
   gfx::Size pic_size = decoder_->GetPicSize();
-  const VideoPixelFormat format =
+  const base::Optional<VideoPixelFormat> format =
       GfxBufferFormatToVideoPixelFormat(GetBufferFormat());
-  frame_layout_ = VideoFrameLayout::Create(format, pic_size);
+  CHECK(format);
+  frame_layout_ = VideoFrameLayout::Create(*format, pic_size);
   DCHECK(frame_layout_);
-  frame_pool_->NegotiateFrameFormat(*frame_layout_, visible_rect,
-                                    natural_size);
+  frame_pool_->NegotiateFrameFormat(*frame_layout_, visible_rect, natural_size);
   frame_pool_->SetMaxNumFrames(decoder_->GetRequiredNumOfPictures());
 
   // All pending decode operations will be completed before triggering a
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
index ed2dea05..4ba65918 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -27,9 +27,9 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "media/base/bind_to_current_loop.h"
+#include "media/base/format_utils.h"
 #include "media/base/unaligned_shared_memory.h"
 #include "media/base/video_bitrate_allocation.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/h264_dpb.h"
 #include "media/gpu/linux/platform_video_frame_utils.h"
 #include "media/gpu/macros.h"
diff --git a/media/gpu/video_decode_accelerator_unittest.cc b/media/gpu/video_decode_accelerator_unittest.cc
index 109df820..9fed756 100644
--- a/media/gpu/video_decode_accelerator_unittest.cc
+++ b/media/gpu/video_decode_accelerator_unittest.cc
@@ -62,7 +62,6 @@
 #include "media/base/test_data_util.h"
 #include "media/base/video_frame.h"
 #include "media/gpu/buildflags.h"
-#include "media/gpu/format_utils.h"
 #include "media/gpu/gpu_video_decode_accelerator_factory.h"
 #include "media/gpu/test/fake_video_decode_accelerator.h"
 #include "media/gpu/test/rendering_helper.h"
@@ -1684,10 +1683,16 @@
     OutputLogFile(g_output_log, output_string);
 }
 
+#if defined(OS_WIN)
+// See https://crbug.com/1002269.
+#define MAYBE_NoCrash DISABLED_NoCrash
+#else
+#define MAYBE_NoCrash NoCrash
+#endif
 // This test passes as long as there is no crash. If VDA notifies an error, it
 // is not considered as a failure because the input may be unsupported or
 // corrupted videos.
-TEST_F(VideoDecodeAcceleratorTest, NoCrash) {
+TEST_F(VideoDecodeAcceleratorTest, MAYBE_NoCrash) {
   notes_.push_back(
       std::make_unique<media::test::ClientStateNotification<ClientState>>());
 
diff --git a/media/learning/impl/distribution_reporter.cc b/media/learning/impl/distribution_reporter.cc
index adcc897..c7af0ef 100644
--- a/media/learning/impl/distribution_reporter.cc
+++ b/media/learning/impl/distribution_reporter.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/numerics/ranges.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 
@@ -213,8 +214,8 @@
             (task().ukm_max_input_value - task().ukm_min_input_value) +
         output_min;
     // Clip to [0, 100] and truncate to an integer.
-    return std::min(std::max(static_cast<int>(scaled_value), output_min),
-                    output_max);
+    return base::ClampToRange(static_cast<int>(scaled_value), output_min,
+                              output_max);
   }
 };
 
diff --git a/media/mojo/clients/mojo_android_overlay_unittest.cc b/media/mojo/clients/mojo_android_overlay_unittest.cc
index c56ab5d..59bc88f6 100644
--- a/media/mojo/clients/mojo_android_overlay_unittest.cc
+++ b/media/mojo/clients/mojo_android_overlay_unittest.cc
@@ -155,7 +155,7 @@
   }
 
   // Mojo stuff.
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
 
   // The mock provider that |overlay_client_| will talk to.
   // |interface_provider_| will bind it.
diff --git a/media/mojo/clients/mojo_audio_decoder_unittest.cc b/media/mojo/clients/mojo_audio_decoder_unittest.cc
index 7be1a1d..62ba66f9 100644
--- a/media/mojo/clients/mojo_audio_decoder_unittest.cc
+++ b/media/mojo/clients/mojo_audio_decoder_unittest.cc
@@ -219,7 +219,7 @@
     RunLoop();
   }
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   std::unique_ptr<base::RunLoop> run_loop_;
 
   // The MojoAudioDecoder that we are testing.
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
index aed41d7..6d8a1f18 100644
--- a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
+++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -172,7 +172,7 @@
   }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   // This member holds on to the mock implementation of the "service" side.
   mojo::StrongBindingPtr<mojom::VideoEncodeAccelerator> mojo_vea_binding_;
diff --git a/media/mojo/common/mojo_data_pipe_read_write_unittest.cc b/media/mojo/common/mojo_data_pipe_read_write_unittest.cc
index 0f5ba819a..b4978d1 100644
--- a/media/mojo/common/mojo_data_pipe_read_write_unittest.cc
+++ b/media/mojo/common/mojo_data_pipe_read_write_unittest.cc
@@ -67,7 +67,7 @@
 }  // namespace
 
 TEST(MojoDataPipeReadWriteTest, Normal) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   std::string kData = "hello, world";
   MojoDataPipeReadWrite pipe_read_write_;
   pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData.data()),
@@ -75,7 +75,7 @@
 }
 
 TEST(MojoDataPipeReadWriteTest, SequentialReading) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   std::string kData1 = "hello, world";
   std::string kData2 = "Bye!";
   MojoDataPipeReadWrite pipe_read_write_;
@@ -86,7 +86,7 @@
 }
 
 TEST(MojoDataPipeReadWriteTest, LongerThanCapacity) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   std::string kData = "hello, world, hello, world, hello, world";
   MojoDataPipeReadWrite pipe_read_write_(10);
   pipe_read_write_.WriteAndRead(reinterpret_cast<const uint8_t*>(kData.data()),
@@ -94,7 +94,7 @@
 }
 
 TEST(MojoDataPipeReadWriteTest, DiscardDataInPipe) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   std::string kData1 = "to be discarded";
   std::string kData2 = "hello, world, hello, world, hello, world";
   MojoDataPipeReadWrite pipe_read_write_(10);
diff --git a/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc b/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc
index b69da37..98f53ee4 100644
--- a/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc
+++ b/media/mojo/common/mojo_decoder_buffer_converter_unittest.cc
@@ -59,7 +59,7 @@
 }  // namespace
 
 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_Normal) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   const uint8_t kData[] = "hello, world";
   const uint8_t kSideData[] = "sideshow bob";
   const size_t kDataSize = base::size(kData);
@@ -79,7 +79,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_EOS) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   scoped_refptr<DecoderBuffer> buffer(DecoderBuffer::CreateEOSBuffer());
 
   MojoDecoderBufferConverter converter;
@@ -89,7 +89,7 @@
 // TODO(xhwang): Investigate whether we can get rid of zero-byte-buffer.
 // See http://crbug.com/663438
 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_ZeroByteBuffer) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0));
 
   MojoDecoderBufferConverter converter;
@@ -97,7 +97,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_KeyFrame) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   const uint8_t kData[] = "hello, world";
   const size_t kDataSize = base::size(kData);
 
@@ -111,7 +111,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, ConvertDecoderBuffer_EncryptedBuffer) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   const uint8_t kData[] = "hello, world";
   const size_t kDataSize = base::size(kData);
   const char kKeyId[] = "00112233445566778899aabbccddeeff";
@@ -150,7 +150,7 @@
 // This test verifies that a DecoderBuffer larger than data-pipe capacity
 // can be transmitted properly.
 TEST(MojoDecoderBufferConverterTest, Chunked) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
   const size_t kDataSize = base::size(kData);
   scoped_refptr<DecoderBuffer> buffer =
@@ -163,7 +163,7 @@
 // This test verifies that MojoDecoderBufferReader::ReadCB is called with a
 // NULL DecoderBuffer if data pipe is closed during transmission.
 TEST(MojoDecoderBufferConverterTest, WriterSidePipeError) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
   const size_t kDataSize = base::size(kData);
   scoped_refptr<DecoderBuffer> media_buffer =
@@ -191,7 +191,7 @@
 // This test verifies that MojoDecoderBuffer supports concurrent writes and
 // reads.
 TEST(MojoDecoderBufferConverterTest, ConcurrentDecoderBuffers) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   // Prevent all of the buffers from fitting at once to exercise the chunking
@@ -237,7 +237,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushWithoutRead) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   base::MockCallback<base::OnceClosure> mock_flush_cb;
@@ -250,7 +250,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushAfterRead) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
@@ -271,7 +271,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushBeforeRead) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
@@ -299,7 +299,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushBeforeChunkedRead) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
@@ -328,7 +328,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushDuringChunkedRead) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   const uint8_t kData[] = "Lorem ipsum dolor sit amet, consectetur cras amet";
@@ -357,7 +357,7 @@
 }
 
 TEST(MojoDecoderBufferConverterTest, FlushDuringConcurrentReads) {
-  base::test::TaskEnvironment task_environment;
+  base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   // Prevent all of the buffers from fitting at once to exercise the chunking
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
index 132759d..8d30947 100644
--- a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
+++ b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
@@ -120,7 +120,7 @@
   }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   mojo::StrongBindingPtr<mojom::VideoEncodeAcceleratorClient> mojo_vea_binding_;
 
diff --git a/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc
index 91bb09a..bcc5fe3 100644
--- a/media/mojo/services/watch_time_recorder_unittest.cc
+++ b/media/mojo/services/watch_time_recorder_unittest.cc
@@ -162,7 +162,7 @@
   MOCK_METHOD0(GetCurrentMediaTime, base::TimeDelta());
 
  protected:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   mojom::MediaMetricsProviderPtr provider_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
   std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_recorder_;
diff --git a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
index 11dc439f..6a877c4 100644
--- a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
+++ b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
@@ -108,7 +108,7 @@
   }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   // This member holds on to the implementation of the "service" side.
   mojo::StrongBindingPtr<mojom::VideoEncodeAccelerator> mojo_vea_binding_;
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc
index ac885382..e885ffc 100644
--- a/media/renderers/paint_canvas_video_renderer_unittest.cc
+++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -384,7 +384,7 @@
 
   SkBitmap bitmap_;
   cc::SkiaPaintCanvas target_canvas_;
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(PaintCanvasVideoRendererTest);
 };
diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc
index 9e1da06..27e074f 100644
--- a/media/renderers/renderer_impl_unittest.cc
+++ b/media/renderers/renderer_impl_unittest.cc
@@ -346,7 +346,7 @@
   }
 
   // Fixture members.
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   StrictMock<CallbackHelper> callbacks_;
   base::SimpleTestTickClock test_tick_clock_;
 
diff --git a/media/renderers/video_resource_updater_unittest.cc b/media/renderers/video_resource_updater_unittest.cc
index cdec9b5..c2c2c0d 100644
--- a/media/renderers/video_resource_updater_unittest.cc
+++ b/media/renderers/video_resource_updater_unittest.cc
@@ -245,7 +245,7 @@
 
   // VideoResourceUpdater registers as a MemoryDumpProvider, which requires
   // a TaskRunner.
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   UploadCounterGLES2Interface* gl_;
   scoped_refptr<viz::TestContextProvider> context_provider_;
   FakeSharedBitmapReporter shared_bitmap_reporter_;
diff --git a/media/test/data/player.html b/media/test/data/player.html
index 7ff5f6e..50402da 100644
--- a/media/test/data/player.html
+++ b/media/test/data/player.html
@@ -43,6 +43,10 @@
   if (video.error) {
     result.push(`error: {${video.error.code},${video.error.message}}`);
   }
+  if (window.internals) {
+    result.push(`suspended: ${internals.isMediaElementSuspended(video) ?
+      'true' : 'false'}`);
+  }
   return result.join(', ');
 }
 
diff --git a/media/test/pipeline_integration_perftest.cc b/media/test/pipeline_integration_perftest.cc
index 95c2979..79f6abd 100644
--- a/media/test/pipeline_integration_perftest.cc
+++ b/media/test/pipeline_integration_perftest.cc
@@ -5,7 +5,7 @@
 #include "media/base/test_data_util.h"
 #include "media/media_buildflags.h"
 #include "media/test/pipeline_integration_test_base.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
 
 namespace media {
 
@@ -13,7 +13,7 @@
 static const int kBenchmarkIterationsVideo = 20;
 
 static void RunPlaybackBenchmark(const std::string& filename,
-                                 const std::string& name,
+                                 const std::string& metric_suffix,
                                  int iterations,
                                  bool audio_only) {
   double time_seconds = 0.0;
@@ -38,8 +38,9 @@
     }
   }
 
-  perf_test::PrintResult(name, "", filename, iterations / time_seconds,
-                         "runs/s", true);
+  perf_test::PerfResultReporter reporter("clockless_video_playback", filename);
+  reporter.RegisterImportantMetric(metric_suffix, "runs/s");
+  reporter.AddResult(metric_suffix, iterations / time_seconds);
 }
 
 static void RunVideoPlaybackBenchmark(const std::string& filename,
@@ -74,23 +75,22 @@
     testing::ValuesIn(kAudioTestFiles));
 
 TEST(PipelineIntegrationPerfTest, VP8PlaybackBenchmark) {
-  RunVideoPlaybackBenchmark("bear_silent.webm", "clockless_video_playback_vp8");
+  RunVideoPlaybackBenchmark("bear_silent.webm", "_vp8");
 }
 
 TEST(PipelineIntegrationPerfTest, VP9PlaybackBenchmark) {
-  RunVideoPlaybackBenchmark("bear-vp9.webm", "clockless_video_playback_vp9");
+  RunVideoPlaybackBenchmark("bear-vp9.webm", "_vp9");
 }
 
 #if BUILDFLAG(ENABLE_AV1_DECODER)
 TEST(PipelineIntegrationPerfTest, AV1PlaybackBenchmark) {
-  RunVideoPlaybackBenchmark("bear-av1-640x480.webm",
-                            "clockless_video_playback_av1");
+  RunVideoPlaybackBenchmark("bear-av1-640x480.webm", "_av1");
 }
 #endif
 
 #if BUILDFLAG(USE_PROPRIETARY_CODECS) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
 TEST(PipelineIntegrationPerfTest, MP4PlaybackBenchmark) {
-  RunVideoPlaybackBenchmark("bear_silent.mp4", "clockless_video_playback_mp4");
+  RunVideoPlaybackBenchmark("bear_silent.mp4", "_mp4");
 }
 #endif
 
diff --git a/net/cert/internal/system_trust_store.cc b/net/cert/internal/system_trust_store.cc
index e8b1e31..f3737ebd1 100644
--- a/net/cert/internal/system_trust_store.cc
+++ b/net/cert/internal/system_trust_store.cc
@@ -70,6 +70,15 @@
   TrustStoreInMemory additional_trust_store_;
 };
 
+class DummySystemTrustStore : public BaseSystemTrustStore {
+ public:
+  bool UsesSystemTrustStore() const override { return false; }
+
+  bool IsKnownRoot(const ParsedCertificate* trust_anchor) const override {
+    return false;
+  }
+};
+
 }  // namespace
 
 #if defined(USE_NSS_CERTS)
@@ -242,19 +251,14 @@
 
 #else
 
-class DummySystemTrustStore : public BaseSystemTrustStore {
- public:
-  bool UsesSystemTrustStore() const override { return false; }
-
-  bool IsKnownRoot(const ParsedCertificate* trust_anchor) const override {
-    return false;
-  }
-};
-
 std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStore() {
   return std::make_unique<DummySystemTrustStore>();
 }
 
 #endif
 
+std::unique_ptr<SystemTrustStore> CreateEmptySystemTrustStore() {
+  return std::make_unique<DummySystemTrustStore>();
+}
+
 }  // namespace net
diff --git a/net/cert/internal/system_trust_store.h b/net/cert/internal/system_trust_store.h
index e13f2b8..498b23d 100644
--- a/net/cert/internal/system_trust_store.h
+++ b/net/cert/internal/system_trust_store.h
@@ -65,6 +65,12 @@
 // inspected by testing whether UsesSystemTrustStore() returns false.
 NET_EXPORT std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStore();
 
+// Creates an instance of SystemTrustStore that initially does not have any
+// trust roots. (This is the same trust store implementation that will be
+// returned by CreateSslSystemTrustStore() on platforms where system trust
+// store integration is not supported.)
+NET_EXPORT std::unique_ptr<SystemTrustStore> CreateEmptySystemTrustStore();
+
 }  // namespace net
 
 #endif  // NET_CERT_INTERNAL_SYSTEM_TRUST_STORE_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 5992995..223b8f6 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -6906,7 +6906,6 @@
     { "name": "okok-rent.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "okok.rent", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ols.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "onehourloan.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onepluscamps.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oneway.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinepollsph.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8264,7 +8263,6 @@
     { "name": "and.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andreastoneman.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrepicard.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "andrewhowden.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewthelott.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andsat.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "annarokina.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8292,7 +8290,6 @@
     { "name": "aran.me.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arlen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arnesolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "arpa.ph", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arrowgrove.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "artisanhd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "artistnetwork.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8702,7 +8699,6 @@
     { "name": "drainagebuizen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drawingcode.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dreamcreator108.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dreweryinc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drhopeson.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "driftdude.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "droidboss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9262,7 +9258,6 @@
     { "name": "kirinas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kis-toitoidixi.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kisstyle.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kita.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kitabgaul.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kittmedia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kizil.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12674,7 +12669,6 @@
     { "name": "dataswamp.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "davescomputertips.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "davidlillo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dayman.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "daytonaseaside.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "db.gy", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dbcom.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13675,7 +13669,6 @@
     { "name": "spookbook.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sporthit.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sportstraineradvisor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "spotlightsrule.ddns.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "spr.id.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "spricknet.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sproutconnections.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14793,7 +14786,6 @@
     { "name": "learnedovo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kumalog.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jonas-thelemann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lacocinadelila.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "larptreff.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "itfix.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "krony.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16484,7 +16476,6 @@
     { "name": "mundodasmensagens.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "misiondelosangeles-mailing.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "midlandgate.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "minf3-games.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "modistry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "migueldemoura.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "muspla.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19831,7 +19822,6 @@
     { "name": "closingholding.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "deanpearce.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "deprecate.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "darkfriday.ddns.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dflcares.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "denimtoday.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "darkeststar.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24758,7 +24748,6 @@
     { "name": "magwin.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mahjong.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "maiebanatulfruncea.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "maisvitaminas.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "malenyflorist.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mallach.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "malta-firma.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25869,7 +25858,6 @@
     { "name": "suchmaschinen-werkstatt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sugarcitycon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sumguy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sunsmartresorts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "supa.sexy", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "supercalorias.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "superklima.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25909,7 +25897,6 @@
     { "name": "targimieszkaniowe.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tateesq.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tatsidou.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tchoukball.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tdsb.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tdsb.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tdsb.gq", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25949,7 +25936,6 @@
     { "name": "tessai.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "testgeomed.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "teufelsystem.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "texasllcpros.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "texterseo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "teysens.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tgui.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28601,7 +28587,6 @@
     { "name": "ovnrain.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "palabr.as", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openiocdb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "openacte.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ninjaspiders.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ofo2.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pasadenasandwichcompany.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33032,7 +33017,6 @@
     { "name": "wbci.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wbx.support", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "weyland-yutani.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "widegab.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wintermeyer-consulting.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wintermeyer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wordpresspro.cl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33145,7 +33129,6 @@
     { "name": "kauplusprofesional.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "krsn.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kuzbass-pwl.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "landflair-magazin.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lavitrine-une-collection.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "logostock.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "luav.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33448,7 +33431,6 @@
     { "name": "catdecor.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "catgirl.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cavevinsdefrance.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ccgx.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "centralcountiesservices.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "certmonitor.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cfno.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33580,7 +33562,6 @@
     { "name": "dirk-scheele.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "discount24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "discountmania.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "discountplush.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "divedowntown.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "djipanov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dnfc.rocks", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34169,7 +34150,6 @@
     { "name": "motomorgen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "motoroilinfo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "motorpointarenacardiff.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "motorring.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moveltix.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "movil.uno", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "moy.cat", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34275,7 +34255,6 @@
     { "name": "orthodontiste-geneve-docteur-rioux.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "orui.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oskrba.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "otakurumi.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "outdoorimagingportal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "owlishmedia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "paazmaya.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34319,7 +34298,6 @@
     { "name": "plumber-in-sandton.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "plussizereviews.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pmessage.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "pnimmobilier.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pocketfruity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pogoswine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pointhost.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -36069,7 +36047,6 @@
     { "name": "fognini-depablo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "formaliteo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "formapi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "forum3.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fowlervwparts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "francesca-and-lucas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freddysfuncastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38863,7 +38840,6 @@
     { "name": "alpinechaletrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altaplana.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alwaysonssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alzonaprinting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amaderelectronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amalficoastchauffeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amalfitabula.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -39853,7 +39829,6 @@
     { "name": "moreal.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morepopcorn.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "motowilliams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "movienized.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mozartgroup.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrbuckykat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrknee.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40085,7 +40060,6 @@
     { "name": "richamorindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ricky.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ristrutturazioneappartamento.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rizalpalawan.gov.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rlnunez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robertnemec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roboth.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42203,7 +42177,6 @@
     { "name": "zanellidesigns.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zarabiaj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zatsepin.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zelfoverstappen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhome.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhuihoude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zielonakarta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43519,7 +43492,6 @@
     { "name": "lightbox.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "listekdo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livinglocalnashville.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lobosdomain.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lode.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logtalk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logtalk.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43861,7 +43833,6 @@
     { "name": "chat2.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrisbryant.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chundelac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cio.go.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "claus-bahr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudconsulting.net.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudconsulting.org.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46059,7 +46030,6 @@
     { "name": "iren.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isabelaflores.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ishet.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ispfontela.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "issa.org.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isthedoorlocked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivre.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46328,7 +46298,6 @@
     { "name": "shopalike.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shopalike.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shopalike.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shybynature.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sictame-tigf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silent-clean.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simonshine.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47967,7 +47936,6 @@
     { "name": "setsailanddive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shift.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shopadvies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "showpassword.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siciliapulizie.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidema.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silkebeckmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55372,7 +55340,6 @@
     { "name": "citizenslasvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "civicforum.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleaningbyrosie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "coffeetime.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cognicom-gaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "communitymanagertorrejon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conpath.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55739,7 +55706,6 @@
     { "name": "weingaertner-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wem.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wetrepublic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wette.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whattominingrigrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whitebirdclinic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whiteknightsafelockinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57013,7 +56979,6 @@
     { "name": "auenhof-agrar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "auntmia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aurnik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ausrecord.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "australianattractions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autobarn.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autokeyreplacementsanantonio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57561,7 +57526,6 @@
     { "name": "immarypoppinsyall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "immersa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impera.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "incco.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "incore.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inessoftsec.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inethost.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58569,7 +58533,6 @@
     { "name": "bijancompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blacktown.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blakezone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blendstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloody.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluebahari.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bmk-kramsach.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61339,7 +61302,6 @@
     { "name": "miamaibaum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mifibra.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mindsetatx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "misakatang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistaken.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mjpak.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modafinil.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62086,7 +62048,6 @@
     { "name": "nextcloud-miyamoto.spdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nilgirispice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nonx.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nook.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "northebridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novengi.mu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noxx.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62655,7 +62616,6 @@
     { "name": "barcelonapremiummini.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belle-lingerie.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beratungswelt.dvag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bestinsider.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bgbaby.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bintangpiaggi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackhawktreeinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65039,7 +64999,6 @@
     { "name": "bogosity.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bongbabyhouse.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bourseauxservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "braithwaites.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "breard.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brisignshop.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brouskat.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65497,7 +65456,6 @@
     { "name": "alltherooms.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alov.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphadefense.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alquds.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altea-pep18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alteiria.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alteria.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65993,7 +65951,6 @@
     { "name": "laboratoriodemarketingb3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "labsys.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laportedufutur.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lat46.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lauralinde.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lavinaec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lazisbaiturrahman.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67653,7 +67610,6 @@
     { "name": "vip380.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visitorguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivaio.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "voordeuren-opmaat.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vwh-kunden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wancai666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wancai880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68204,7 +68160,6 @@
     { "name": "honigdealer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrbrt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hsiwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hydrosnow.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hyper.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hytzongxuan.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i-hoz.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68242,7 +68197,6 @@
     { "name": "j9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaduniv.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jedayoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jieac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jimeaton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jj5197.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jj9297.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68889,7 +68843,6 @@
     { "name": "homeeducator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hostiberi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hostmywebsite.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hsts-webapp.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "htb.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iberiserver.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idysse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70043,7 +69996,6 @@
     { "name": "j6957.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "j6957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jbridal.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jcontspoord.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jdmgarage.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jj6729.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jj6729.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70225,7 +70177,6 @@
     { "name": "serrande.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serviceair.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "setesat.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sexyfotosvandep.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shelbymunsch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shibbydex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siikaflix.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70371,7 +70322,6 @@
     { "name": "yamei9911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yamei9922.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yappy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ybos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yesod.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yjst.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ym181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70718,7 +70668,6 @@
     { "name": "philia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phonefleet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phpmynewsletter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pi3kum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pigliadesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pkvitality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plugins-telechargement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70961,7 +70910,6 @@
     { "name": "contabilidadebrooklin.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contactaffix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "correctemails.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "coteetciel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creatic.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crebita.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crmenrich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73105,7 +73053,6 @@
     { "name": "josegdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kanis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "karimunsejahtera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kartikmohta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kashbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb4393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76329,8 +76276,6 @@
     { "name": "ireland.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "irob.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ironraven.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "isae-supaero.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "isae.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islamabadcourt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islamnewss.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ismadgeintrouble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77893,7 +77838,6 @@
     { "name": "y68yn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y68zj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y70101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y70102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y70103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y70104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y70105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78086,10 +78030,6 @@
     { "name": "5017502.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5017504.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5017505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5017601.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5017602.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5017603.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5017604.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52062z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5536z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5539z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79340,7 +79280,6 @@
     { "name": "plastischechirurgie-linz.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "platter.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pleger.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pmk.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poemwall.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pointzip.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pokemonargentina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80560,7 +80499,6 @@
     { "name": "p333j.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pagamentosdigitais.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pandagifts.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "panezasociados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paradordelgitano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parsuv.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "payment.ac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80581,7 +80519,6 @@
     { "name": "qgr.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "queryquinton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quhyu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r85555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ramsaver.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raphaelschmid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realgogo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80651,7 +80588,6 @@
     { "name": "taguette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taguette.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taguette.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "talsam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teamacadia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teamsuccess.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tech-professor.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81532,7 +81468,6 @@
     { "name": "pousadaestreladapraia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "precedencemedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "premiumhosting.com.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "previsora.gov.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pricena.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pro-co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "promocodius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81542,8 +81477,6 @@
     { "name": "punishment.institute", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "purple.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qcbrna.qa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r8100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r89999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readifycloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redeshoprural.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reputatiedesigners.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81623,7 +81556,6 @@
     { "name": "wildandwonderfulketo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wils.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wintzenterprise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wormpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wuyiwa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xc9988.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xerbo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81675,7 +81607,6 @@
     { "name": "akmade.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "albstaedter-kids-cup.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alibaba-test.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "anonymoushackers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antyfake.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arslonga.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aucospa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81731,7 +81662,6 @@
     { "name": "d88e.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d88g.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daunatotala.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dbettenleur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "de-kramers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deckersheaven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dermaldistinction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81840,7 +81770,6 @@
     { "name": "jshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "juezz.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "justeducationonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "karoke.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kartoffel-tobi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kazmamall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb98.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81872,7 +81801,6 @@
     { "name": "lonelypawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loverngifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lz898.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lzh.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m6pub.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "machinerysafety101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magicnethosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81943,8 +81871,6 @@
     { "name": "qlinksgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quuck.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quuck.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r8369.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r8700.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "racevinyl.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radlina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raketa.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81984,12 +81910,10 @@
     { "name": "sonderfloral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "songyang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spectrum-markets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "spikefishdesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "srfloki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "srkb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stainhaufen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiovictorialimited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stuffie.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "summusglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suniru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunnistan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82268,7 +82192,6 @@
     { "name": "julienstalder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kajakswaderki.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kapler.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "katerinaverbovskaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kevinpatel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kgt10.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khamphafood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82375,7 +82298,6 @@
     { "name": "profsaranya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pymeup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quiqurl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r8600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reachout-ghana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "recoba3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "remodelingfy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82635,11 +82557,9 @@
     { "name": "edefrutos.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educative.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elementblend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "escritamusical.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eveil-et-savoirs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "excelsiorcomics.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exploringmorocco.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "f9marketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fibercoverage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fokus.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fos-apps.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82866,8 +82786,6 @@
     { "name": "orxideya.az", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osszekotatermeszettel.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "owner.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oyungg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pajskr.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "partiono.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peawo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "photosgaia.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82954,7 +82872,6 @@
     { "name": "tierradeayala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tilde.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tinminnow.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "titrespresse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmailz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "todaslascafeteras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tokky.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83015,6 +82932,635 @@
     { "name": "zd1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zl8282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "znn.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "058kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "066kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "068kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0x15.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "111z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "112z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "113ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "113z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "116ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "116z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "117z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "118z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "119z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "122kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "131ks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "132ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "158z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "162229.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1666ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "168z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "16z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "171ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "182ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "188z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "199ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "22i.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "266z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "26z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "277z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27is.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "288z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "299ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "299ks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31du.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3369p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3389p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "355ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3666ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "366z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "388z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "399ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "508kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52062n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52062o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52062s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "566z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "572kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "575kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5agks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "615kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "61z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "621kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "625kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "688z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "699z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "69ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "712kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "713kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "767kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "76z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8028d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8029d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8065d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "806kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8128d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8129d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8202d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8208d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "856kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "866z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "869kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8802ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8828ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "882kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "885z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8861ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8862d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8869ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "886z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8871d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8872d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8876d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8879d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8882ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8891ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8895ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88djl.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9118inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "966kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96z66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99kb88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aanwp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abraxasteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "academie-musique-nice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acmi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acneintelligence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acunetix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ag98ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agencyalacarte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks06.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks138.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks68.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks89.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agks998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aini99.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airconrandburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aljaspod.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpharoofga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amdm.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andersonpowerservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antizon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anyi.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anyilin.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apothecarydouglasville.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aramyss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archambault.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "area.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asakoh.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "askme-events.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assetsman-assetsvalue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atmmantenimiento.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audiohub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audiohub.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bananacloud.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bdpestsolutionsstlouis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beatrice-raws.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bhglamour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billionairemailinglist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biobone.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biuropulawy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookingtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookingtool.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandonlin.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brasserie-twins.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brasserie-twins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "briandorey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bring-heaven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brojagraphics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bumble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabinet-life.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "campo-salado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carbonvision.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caycehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cbnainital.org.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centralhealthplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrumpieknairelaksu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chartsheets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chiavistello.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christiandiscourse.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christopherd.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clarkwifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "claudeleveille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cleveille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cliksource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clinicos.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codingblog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colonize.africa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "congresscoverage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corsomassaggi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "countrylife.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craftmachinec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crys.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crys.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crys.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crys.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d8778.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d8813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d8817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d8854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darlenejacques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dechetor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dejongonline.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dennhat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depot24.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desertbloomplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devmode.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diariocibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diepanhcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitalcronies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitiqo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dobryautoskup.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "docteurcardin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainname.forsale", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domyiadaptacje.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doradocomputer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drrhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drsheri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ea-lateleassistance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaglemoe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easypets.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecotechnologyti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electrichome.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emeraldislerealty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "employer411.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eqiware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "escandille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurotop.net.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evolvingsouls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "examopedia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exodiac.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyemedica.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "febeditora.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feilestrokestown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiduciaire-azur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fieldexpert.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firtreetechnology.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "formi9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fourmies.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "francepandi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freedomhkg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freegovernmentcellphoneguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frosoku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funfun.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemeentestein.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genomedia.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go.exchange", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenhost.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldships.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorgeconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grasscity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gridtennis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gurkenberry.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h-server.myfirewall.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heightselectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "histoiresdecontenu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "home-sud-renovation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeymaze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ictindia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iki4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "incomeproshoutr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "irequi.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itsallaboutplumbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itschromeos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iycharter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakse.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jan-gerd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japonyol.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeansdiscounter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junglevet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justin-p.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kalyanmatka.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb0404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb0505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb096.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb1313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3434.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb415.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb458.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb545.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5648.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb702.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb7474.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb840.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb881.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb882.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb8889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb88dc28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kilbi-reussbuehl.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingdominnergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingshome.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirscrb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kiwibird.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klempin.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klikweb.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knowledgebuilds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kroyclothing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krupacars.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks016.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0558.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0660.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks068.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks082.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks10.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks15.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks20.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks206.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks30.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks3737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks380.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks40.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks50.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks539.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks55.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks571.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks58.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks597.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks60.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6225.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6533.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6681.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6685.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6686.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6687.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6733.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks68.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks6998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks70.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks80.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks86.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8787.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks8860.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks89.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks90.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kstr.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ktlearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "la-bolle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labastidedesaromes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacochinacounselor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacocina.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laimut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landsbankinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lederkleren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lelac-capfrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leoservicosetc.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leruevintage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letsbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lettings101.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libertyachts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindajahn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loader.us.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lookingstores.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorenzocampagna.myqnapcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lou-castelet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ltcwaterwijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lueurexterne-audiovisuel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lueurexterne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macaos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeinolive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magniflood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mandrill.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mangabank.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mansora.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marijuanajobscannabiscareers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maroquineriepirlot.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "martindoe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masterplumber.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcs-kutc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcukhost.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediafamous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melania-voyance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mentorbuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "middletonshoppingcentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mjjlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mjs-domy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mkfilm.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mokeedev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moobl.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostbelehuzunk.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muloft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycounterstrike.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myremotelogin.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nathanbarry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natteravneneibergen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nejprivlac.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neusoft.ren", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newmall.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newshell.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicholasrhodes.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikka.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noeontheend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novotoznanie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nutrashop.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nvoip.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omangrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onceuponabow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "only-fragrances.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oortcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oosterhout.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oralb.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orgoniteindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osci.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paesi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "page-rank1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paknetworking.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parfumerie-de-grasse.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkeerbordenhuren.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paroisses-theix-surzur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "passa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcdbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfonks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piektraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pitoufi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plage-les-pirates.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planisys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "playlisten.radio.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prankstercompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proevlifecycle.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "progresivoptic.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "propertyauctionaction.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "protiksana.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pvhe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quemadoresdegrasa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quprop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiosendungen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radyodinle.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratujemyzwierzaki.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rawdamental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rcpdesign.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rebellion.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redkiwi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redray.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remetall.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remitano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "require.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rightfold.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riveroacessorios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ronbongamis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rufinodiaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safevault.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samlam.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santaijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santamariaretreats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schbebtv.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scholtensupport.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scribbler.monster", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securegovernment.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senimag.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sewfarsewgood.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sewfarsewgood.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoposal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siepomaga.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simmtronic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinakuhestani.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siulam-wingchun.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skooks.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyblockrebellion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slalix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smaltimento-rifiuti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snowsubs.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solucionupsperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srqpedals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stapvoorstapduurzaam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steliosmanousakis.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steuerberater-hopfner.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storingdesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stroifenix.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "subarulegends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "subrad.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sungari.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swimminglessons.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swrelay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "synedat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "synrestaccounting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syuez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syzdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tablemagnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tato.noip.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebridalcollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelicagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thsecurity.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "towsonpediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tualiadaenlimpieza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tycycles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ucc.edu.gh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unblocked.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unitedfitness.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "univet-veterinaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "univetnature.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upliving.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urb-budex.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vangore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ventadecolchones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veryswing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voix-bien-etre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "votre-avenir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vrikshamindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsactivity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsportage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vuelacaruru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walkingandcycling.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "warthog.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wegiel24.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wellandslim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weloveliving.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wemajin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whatismypublicip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wielrenbond.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wso01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuzigackl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "www-9118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--80ancacgircb8q.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanniclandsmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ydraulikos.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yeah-shop.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ytec.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuansecard.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukaction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukonconnector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukonlip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yukontec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ywyz.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6278.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6323.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6359.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6371.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6372.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6375.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6523.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6527.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6529.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6537.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6539.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6579.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6581.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6587.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6591.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6616.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6751.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6753.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6757.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6759.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6798.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6827.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6837.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6871.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6897.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z6925.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z8857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z8861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z8862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z8871.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "z8872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd625.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd627.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd659.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd693.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd723.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd725.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd726.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd729.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd732.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd752.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd763.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd795.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd796.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd802.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd806.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zd827.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zone-de-confiance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zorgenvoorandrea.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoubaa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/nqe/observation_buffer.cc b/net/nqe/observation_buffer.cc
index 4633ea1..2183f4f2 100644
--- a/net/nqe/observation_buffer.cc
+++ b/net/nqe/observation_buffer.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/macros.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
@@ -226,8 +227,7 @@
     }
 
     double weight = time_weight * signal_strength_weight;
-
-    weight = std::max(DBL_MIN, std::min(1.0, weight));
+    weight = base::ClampToRange(weight, DBL_MIN, 1.0);
 
     weighted_observations->push_back(
         WeightedObservation(observation.value(), weight));
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 3bb97f7..892aab1 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -191,7 +191,7 @@
                             NUM_HANDSHAKE_STATES);
 }
 
-std::string ConnectionMigrationCauseToString(ConnectionMigrationCause cause) {
+std::string MigrationCauseToString(MigrationCause cause) {
   switch (cause) {
     case UNKNOWN_CAUSE:
       return "Unknown";
@@ -205,8 +205,10 @@
       return "OnNetworkMadeDefault";
     case ON_MIGRATE_BACK_TO_DEFAULT_NETWORK:
       return "OnMigrateBackToDefaultNetwork";
-    case ON_PATH_DEGRADING:
+    case CHANGE_NETWORK_ON_PATH_DEGRADING:
       return "OnPathDegrading";
+    case CHANGE_PORT_ON_PATH_DEGRADING:
+      return "ChangePortOnPathDegrading";
     default:
       QUIC_NOTREACHED();
       break;
@@ -239,12 +241,12 @@
 }
 
 // TODO(fayang): Remove this when necessary data is collected.
-void LogProbeResultToHistogram(ConnectionMigrationCause cause, bool success) {
+void LogProbeResultToHistogram(MigrationCause cause, bool success) {
   UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.ConnectionMigrationProbeSuccess",
                         success);
   const std::string histogram_name =
       "Net.QuicSession.ConnectionMigrationProbeSuccess." +
-      ConnectionMigrationCauseToString(cause);
+      MigrationCauseToString(cause);
   STATIC_HISTOGRAM_POINTER_GROUP(
       histogram_name, cause, MIGRATION_CAUSE_MAX, AddBoolean(success),
       base::BooleanHistogram::FactoryGet(
@@ -772,7 +774,7 @@
       bytes_pushed_and_unclaimed_count_(0),
       probing_manager_(this, task_runner_),
       retry_migrate_back_count_(0),
-      current_connection_migration_cause_(UNKNOWN_CAUSE),
+      current_migration_cause_(UNKNOWN_CAUSE),
       send_packet_after_migration_(false),
       wait_for_new_network_(false),
       ignore_read_error_(false),
@@ -1555,7 +1557,7 @@
     if (migrate_session_on_network_change_v2_ &&
         default_network_ != NetworkChangeNotifier::kInvalidNetworkHandle &&
         GetDefaultSocket()->GetBoundNetwork() != default_network_) {
-      current_connection_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
+      current_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
       StartMigrateBackToDefaultNetworkTimer(
           base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs));
     }
@@ -1755,8 +1757,8 @@
 int QuicChromiumClientSession::HandleWriteError(
     int error_code,
     scoped_refptr<QuicChromiumPacketWriter::ReusableIOBuffer> packet) {
-  current_connection_migration_cause_ = ON_WRITE_ERROR;
-  LogHandshakeStatusOnConnectionMigrationSignal();
+  current_migration_cause_ = ON_WRITE_ERROR;
+  LogHandshakeStatusOnMigrationSignal();
 
   base::UmaHistogramSparse("Net.QuicSession.WriteError", -error_code);
   if (IsCryptoHandshakeConfirmed()) {
@@ -1819,7 +1821,7 @@
     return;
   }
 
-  current_connection_migration_cause_ = ON_WRITE_ERROR;
+  current_migration_cause_ = ON_WRITE_ERROR;
 
   if (migrate_idle_session_ && CheckIdleTimeExceedsIdleMigrationPeriod())
     return;
@@ -1935,7 +1937,7 @@
   if (num_sockets != sockets_.size())
     return;
 
-  LogConnectionMigrationResultToHistogram(MIGRATION_STATUS_TIMEOUT);
+  LogMigrationResultToHistogram(MIGRATION_STATUS_TIMEOUT);
   CloseSessionOnError(ERR_NETWORK_CHANGED,
                       quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK,
                       quic::ConnectionCloseBehavior::SILENT_CLOSE);
@@ -1962,7 +1964,7 @@
       network == NetworkChangeNotifier::kInvalidNetworkHandle)
     return;
 
-  LogProbeResultToHistogram(current_connection_migration_cause_, true);
+  LogProbeResultToHistogram(current_migration_cause_, true);
 
   // Remove |this| as the old packet writer's delegate. Write error on old
   // writers will be ignored.
@@ -2012,7 +2014,7 @@
            << "successful probing network: " << network << ".";
   current_migrations_to_non_default_network_on_path_degrading_++;
   if (!migrate_back_to_default_timer_.IsRunning()) {
-    current_connection_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
+    current_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
     // Session gets off the |default_network|, stay on |network| for now but
     // try to migrate back to default network after 1 second.
     StartMigrateBackToDefaultNetworkTimer(
@@ -2029,7 +2031,7 @@
                                                        /*is_success=*/false);
                     });
 
-  LogProbeResultToHistogram(current_connection_migration_cause_, false);
+  LogProbeResultToHistogram(current_migration_cause_, false);
 
   if (network != NetworkChangeNotifier::kInvalidNetworkHandle) {
     // Probing failure can be ignored.
@@ -2061,12 +2063,12 @@
     return;
 
   if (connection()->IsPathDegrading()) {
-    current_connection_migration_cause_ = ON_PATH_DEGRADING;
+    current_migration_cause_ = CHANGE_NETWORK_ON_PATH_DEGRADING;
   }
 
   if (wait_for_new_network_) {
     wait_for_new_network_ = false;
-    if (current_connection_migration_cause_ == ON_WRITE_ERROR)
+    if (current_migration_cause_ == ON_WRITE_ERROR)
       current_migrations_to_non_default_network_on_write_error_++;
     // |wait_for_new_network_| is true, there was no working network previously.
     // |network| is now the only possible candidate, migrate immediately.
@@ -2102,8 +2104,8 @@
     return;
   }
 
-  current_connection_migration_cause_ = ON_NETWORK_DISCONNECTED;
-  LogHandshakeStatusOnConnectionMigrationSignal();
+  current_migration_cause_ = ON_NETWORK_DISCONNECTED;
+  LogHandshakeStatusOnMigrationSignal();
   if (!IsCryptoHandshakeConfirmed()) {
     // Close the connection if handshake is not confirmed. Migration before
     // handshake is not allowed.
@@ -2141,7 +2143,7 @@
   DVLOG(1) << "Network: " << new_network
            << " becomes default, old default: " << default_network_;
   default_network_ = new_network;
-  current_connection_migration_cause_ = ON_NETWORK_MADE_DEFAULT;
+  current_migration_cause_ = ON_NETWORK_MADE_DEFAULT;
   current_migrations_to_non_default_network_on_write_error_ = 0;
   current_migrations_to_non_default_network_on_path_degrading_ = 0;
 
@@ -2155,7 +2157,7 @@
     return;
   }
 
-  LogHandshakeStatusOnConnectionMigrationSignal();
+  LogHandshakeStatusOnMigrationSignal();
 
   // Stay on the current network. Try to migrate back to default network
   // without any delay, which will start probing the new default network and
@@ -2279,7 +2281,13 @@
   if (!stream_factory_)
     return;
 
-  current_connection_migration_cause_ = ON_PATH_DEGRADING;
+  if (allow_port_migration_) {
+    current_migration_cause_ = CHANGE_PORT_ON_PATH_DEGRADING;
+    MaybeMigrateToDifferentPortOnPathDegrading();
+    return;
+  }
+
+  current_migration_cause_ = CHANGE_NETWORK_ON_PATH_DEGRADING;
 
   if (migrate_session_early_v2_) {
     MaybeMigrateToAlternateNetworkOnPathDegrading();
@@ -2289,9 +2297,6 @@
   HistogramAndLogMigrationFailure(
       net_log_, MIGRATION_STATUS_PATH_DEGRADING_NOT_ENABLED, connection_id(),
       "Migration on path degrading not enabled");
-
-  if (allow_port_migration_)
-    MaybeMigrateToDifferentPortOnPathDegrading();
 }
 
 bool QuicChromiumClientSession::ShouldKeepConnectionAlive() const {
@@ -2478,7 +2483,7 @@
     return;
   }
 
-  LogHandshakeStatusOnConnectionMigrationSignal();
+  LogHandshakeStatusOnMigrationSignal();
 
   if (!IsCryptoHandshakeConfirmed()) {
     HistogramAndLogMigrationFailure(
@@ -2583,8 +2588,8 @@
 
 void QuicChromiumClientSession::StartMigrateBackToDefaultNetworkTimer(
     base::TimeDelta delay) {
-  if (current_connection_migration_cause_ != ON_NETWORK_MADE_DEFAULT)
-    current_connection_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
+  if (current_migration_cause_ != ON_NETWORK_MADE_DEFAULT)
+    current_migration_cause_ = ON_MIGRATE_BACK_TO_DEFAULT_NETWORK;
 
   CancelMigrateBackToDefaultNetworkTimer();
   // Post a task to try migrate back to default network after |delay|.
@@ -2749,30 +2754,41 @@
   }
 }
 
-void QuicChromiumClientSession::LogConnectionMigrationResultToHistogram(
+void QuicChromiumClientSession::LogMigrationResultToHistogram(
     QuicConnectionMigrationStatus status) {
+  if (current_migration_cause_ == CHANGE_PORT_ON_PATH_DEGRADING) {
+    UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.PortMigration", status,
+                              MIGRATION_STATUS_MAX);
+    current_migration_cause_ = UNKNOWN_CAUSE;
+    return;
+  }
+
   UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.ConnectionMigration", status,
                             MIGRATION_STATUS_MAX);
 
   // Log the connection migraiton result to different histograms based on the
   // cause of the connection migration.
-  std::string histogram_name =
-      "Net.QuicSession.ConnectionMigration." +
-      ConnectionMigrationCauseToString(current_connection_migration_cause_);
+  std::string histogram_name = "Net.QuicSession.ConnectionMigration." +
+                               MigrationCauseToString(current_migration_cause_);
   base::UmaHistogramEnumeration(histogram_name, status, MIGRATION_STATUS_MAX);
-  current_connection_migration_cause_ = UNKNOWN_CAUSE;
+  current_migration_cause_ = UNKNOWN_CAUSE;
 }
 
-void QuicChromiumClientSession::LogHandshakeStatusOnConnectionMigrationSignal()
-    const {
+void QuicChromiumClientSession::LogHandshakeStatusOnMigrationSignal() const {
+  if (current_migration_cause_ == CHANGE_PORT_ON_PATH_DEGRADING) {
+    UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.HandshakeStatusOnPortMigration",
+                          IsCryptoHandshakeConfirmed());
+    return;
+  }
+
   UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.HandshakeStatusOnConnectionMigration",
                         IsCryptoHandshakeConfirmed());
 
   const std::string histogram_name =
       "Net.QuicSession.HandshakeStatusOnConnectionMigration." +
-      ConnectionMigrationCauseToString(current_connection_migration_cause_);
+      MigrationCauseToString(current_migration_cause_);
   STATIC_HISTOGRAM_POINTER_GROUP(
-      histogram_name, current_connection_migration_cause_, MIGRATION_CAUSE_MAX,
+      histogram_name, current_migration_cause_, MIGRATION_CAUSE_MAX,
       AddBoolean(IsCryptoHandshakeConfirmed()),
       base::BooleanHistogram::FactoryGet(
           histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag));
@@ -2783,19 +2799,19 @@
     QuicConnectionMigrationStatus status,
     quic::QuicConnectionId connection_id,
     const std::string& reason) {
-  LogConnectionMigrationResultToHistogram(status);
   net_log.AddEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_FAILURE, [&] {
     return NetLogQuicConnectionMigrationFailureParams(connection_id, reason);
   });
+  LogMigrationResultToHistogram(status);
 }
 
 void QuicChromiumClientSession::HistogramAndLogMigrationSuccess(
     const NetLogWithSource& net_log,
     quic::QuicConnectionId connection_id) {
-  LogConnectionMigrationResultToHistogram(MIGRATION_STATUS_SUCCESS);
   net_log.AddEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_SUCCESS, [&] {
     return NetLogQuicConnectionMigrationSuccessParams(connection_id);
   });
+  LogMigrationResultToHistogram(MIGRATION_STATUS_SUCCESS);
 }
 
 base::Value QuicChromiumClientSession::GetInfoAsValue(
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index b264837e..4854c7f8 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -84,15 +84,16 @@
   FULL_MIGRATION_V2
 };
 
-// Cause of connection migration.
-enum ConnectionMigrationCause {
+// Cause of a migration.
+enum MigrationCause {
   UNKNOWN_CAUSE,
   ON_NETWORK_CONNECTED,                // No probing.
   ON_NETWORK_DISCONNECTED,             // No probing.
   ON_WRITE_ERROR,                      // No probing.
   ON_NETWORK_MADE_DEFAULT,             // With probing.
   ON_MIGRATE_BACK_TO_DEFAULT_NETWORK,  // With probing.
-  ON_PATH_DEGRADING,                   // With probing.
+  CHANGE_NETWORK_ON_PATH_DEGRADING,    // With probing.
+  CHANGE_PORT_ON_PATH_DEGRADING,       // With probing.
   MIGRATION_CAUSE_MAX
 };
 
@@ -740,9 +741,8 @@
   void ResetNonMigratableStreams();
   void LogMetricsOnNetworkDisconnected();
   void LogMetricsOnNetworkMadeDefault();
-  void LogConnectionMigrationResultToHistogram(
-      QuicConnectionMigrationStatus status);
-  void LogHandshakeStatusOnConnectionMigrationSignal() const;
+  void LogMigrationResultToHistogram(QuicConnectionMigrationStatus status);
+  void LogHandshakeStatusOnMigrationSignal() const;
   void HistogramAndLogMigrationFailure(const NetLogWithSource& net_log,
                                        QuicConnectionMigrationStatus status,
                                        quic::QuicConnectionId connection_id,
@@ -835,7 +835,7 @@
   QuicConnectivityProbingManager probing_manager_;
   int retry_migrate_back_count_;
   base::OneShotTimer migrate_back_to_default_timer_;
-  ConnectionMigrationCause current_connection_migration_cause_;
+  MigrationCause current_migration_cause_;
   // True if a packet needs to be sent when packet writer is unblocked to
   // complete connection migration. The packet can be a cached packet if
   // |packet_| is set, a queued packet, or a PING packet.
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 2081dd6..f34fb2a1 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -49,10 +49,6 @@
 // Congestion window gain for QUIC BBR during PROBE_BW phase.
 QUIC_FLAG(double, FLAGS_quic_bbr_cwnd_gain, 2.0f)
 
-// Simplify QUIC\'s adaptive time loss detection to measure the necessary
-// reordering window for every spurious retransmit.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_adaptive_time_loss, false)
-
 // If true, adjust congestion window when doing bandwidth resumption in BBR.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_fix_bbr_cwnd_in_bandwidth_resumption,
@@ -126,13 +122,6 @@
 // ACK in packet conservation.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_one_mss_conservation, false)
 
-// When true, the LOSS connection option allows for 1/8 RTT of reording instead
-// of the current 1/8th threshold which has been found to be too large for fast
-// loss recovery.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_eighth_rtt_loss_detection,
-          false)
-
 // Enables the BBQ5 connection option, which forces saved aggregation values to
 // expire when the bandwidth increases more than 25% in QUIC BBR STARTUP.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slower_startup4, false)
@@ -216,19 +205,11 @@
           FLAGS_quic_reloadable_flag_quic_ignore_tlpr_if_no_pending_stream_data,
           true)
 
-// When true, QuicDispatcher will drop packets that have an initial destination
-// connection ID that is too short, instead of responding with a Version
-// Negotiation packet to reject it.
-QUIC_FLAG(
-    bool,
-    FLAGS_quic_reloadable_flag_quic_drop_invalid_small_initial_connection_id,
-    true)
-
 // When true, QUIC Version Negotiation packets will randomly include fake
 // versions.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_version_negotiation_grease,
-          true)
+          false)
 
 // If true, use predictable version negotiation versions.
 QUIC_FLAG(bool, FLAGS_quic_disable_version_negotiation_grease_randomness, false)
@@ -311,7 +292,7 @@
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_negotiate_ack_delay_time, false)
 
 // When true, QuicDispatcher will always use QuicFramer::ParsePublicHeader
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_parse_public_header, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_parse_public_header, true)
 
 // If true, QuicFramer::WriteClientVersionNegotiationProbePacket uses
 // length-prefixed connection IDs.
@@ -328,13 +309,13 @@
 QUIC_FLAG(
     bool,
     FLAGS_quic_reloadable_flag_quic_add_upper_limit_of_buffered_control_frames,
-    true)
+    false)
 
 // If true, static streams should never be closed before QuicSession
 // destruction.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_active_streams_never_negative,
-          true)
+          false)
 
 // If true and FIFO connection option is received, write_blocked_streams uses
 // FIFO(stream with smallest ID has highest priority) write scheduler.
@@ -363,33 +344,33 @@
 // closed streams whose highest byte offset is not received yet.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_aggressive_connection_aliveness,
-          true)
+          false)
 
 // If true, QuicStreamSequencer will not take in new data if the stream is
 // reset.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_no_stream_data_after_reset,
-          true)
+          false)
 
 // When true, QuicDispatcher::MaybeDispatchPacket will use
 // packet_info.use_length_prefix instead of an incorrect local computation.
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_use_length_prefix_from_packet_info,
-          false)
+          true)
 
 // If true, enable IETF style probe timeout.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_pto, true)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_pto, false)
 
 // When true, QuicFramer will use QueueUndecryptablePacket on all QUIC versions.
 QUIC_FLAG(bool,
           FLAGS_quic_restart_flag_quic_framer_uses_undecryptable_upcall,
-          false)
+          true)
 
 // When true, QuicUtils::GenerateStatelessResetToken will hash connection IDs
 // instead of XORing the bytes
 QUIC_FLAG(bool,
           FLAGS_quic_restart_flag_quic_use_hashed_stateless_reset_tokens,
-          false)
+          true)
 
 // This flag enables a temporary workaround which makes us reply to a specific
 // invalid packet that is sent by an Android UDP network conformance test.
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc
index 9008a009..ccbebdd4 100644
--- a/net/quic/quic_test_packet_maker.cc
+++ b/net/quic/quic_test_packet_maker.cc
@@ -484,12 +484,9 @@
   frames.push_back(quic::QuicFrame(&ack));
   DVLOG(1) << "Adding frame: " << frames.back();
 
-  quic::QuicConnectionCloseFrame close;
-  close.quic_error_code = quic_error;
-  close.error_details = MaybePrependErrorCode(quic_error_details, quic_error);
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
-    close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
-  }
+  quic::QuicConnectionCloseFrame close(version_.transport_version, quic_error,
+                                       quic_error_details,
+                                       /*transport_close_frame_type=*/0);
 
   frames.push_back(quic::QuicFrame(&close));
   DVLOG(1) << "Adding frame: " << frames.back();
@@ -524,13 +521,8 @@
   frames.push_back(quic::QuicFrame(&ack));
   DVLOG(1) << "Adding frame: " << frames.back();
 
-  quic::QuicConnectionCloseFrame close;
-  close.quic_error_code = quic_error;
-  close.error_details = MaybePrependErrorCode(quic_error_details, quic_error);
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
-    close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
-    close.transport_close_frame_type = frame_type;
-  }
+  quic::QuicConnectionCloseFrame close(version_.transport_version, quic_error,
+                                       quic_error_details, frame_type);
 
   frames.push_back(quic::QuicFrame(&close));
   DVLOG(1) << "Adding frame: " << frames.back();
@@ -546,12 +538,9 @@
     const std::string& quic_error_details) {
   InitializeHeader(num, include_version);
 
-  quic::QuicConnectionCloseFrame close;
-  close.quic_error_code = quic_error;
-  close.error_details = MaybePrependErrorCode(quic_error_details, quic_error);
-  if (version_.transport_version == quic::QUIC_VERSION_99) {
-    close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
-  }
+  quic::QuicConnectionCloseFrame close(version_.transport_version, quic_error,
+                                       quic_error_details,
+                                       /*transport_close_frame_type=*/0);
 
   return MakePacket(header_, quic::QuicFrame(&close));
 }
diff --git a/net/test/test_with_task_environment.h b/net/test/test_with_task_environment.h
index fe77f45..4ed7e3c5 100644
--- a/net/test/test_with_task_environment.h
+++ b/net/test/test_with_task_environment.h
@@ -73,16 +73,6 @@
   DISALLOW_COPY_AND_ASSIGN(TestWithTaskEnvironment);
 };
 
-// TODO(gab): Migrate callers off the old names and remove these.
-class WithScopedTaskEnvironment : public WithTaskEnvironment {
- protected:
-  using WithTaskEnvironment::WithTaskEnvironment;
-};
-class TestWithScopedTaskEnvironment : public TestWithTaskEnvironment {
- protected:
-  using TestWithTaskEnvironment::TestWithTaskEnvironment;
-};
-
 }  // namespace net
 
 #endif  // NET_TEST_TEST_WITH_TASK_ENVIRONMENT_H_
diff --git a/net/tools/cert_verify_tool/cert_verify_tool.cc b/net/tools/cert_verify_tool/cert_verify_tool.cc
index 7019dd7c..7f4079b 100644
--- a/net/tools/cert_verify_tool/cert_verify_tool.cc
+++ b/net/tools/cert_verify_tool/cert_verify_tool.cc
@@ -20,6 +20,7 @@
 #include "net/cert/cert_verify_proc.h"
 #include "net/cert/cert_verify_proc_builtin.h"
 #include "net/cert/crl_set.h"
+#include "net/cert/internal/system_trust_store.h"
 #include "net/cert_net/cert_net_fetcher_impl.h"
 #include "net/tools/cert_verify_tool/cert_verify_tool_util.h"
 #include "net/tools/cert_verify_tool/verify_using_cert_verify_proc.h"
@@ -146,8 +147,10 @@
 class CertVerifyImplUsingPathBuilder : public CertVerifyImpl {
  public:
   explicit CertVerifyImplUsingPathBuilder(
-      scoped_refptr<net::CertNetFetcher> cert_net_fetcher)
-      : cert_net_fetcher_(std::move(cert_net_fetcher)) {}
+      scoped_refptr<net::CertNetFetcher> cert_net_fetcher,
+      bool use_system_roots)
+      : cert_net_fetcher_(std::move(cert_net_fetcher)),
+        use_system_roots_(use_system_roots) {}
 
   std::string GetName() const override { return "CertPathBuilder"; }
 
@@ -166,20 +169,44 @@
       verify_time = base::Time::Now();
     }
 
-    return VerifyUsingPathBuilder(target_der_cert, intermediate_der_certs,
-                                  root_der_certs, verify_time, dump_prefix_path,
-                                  cert_net_fetcher_);
+    return VerifyUsingPathBuilder(
+        target_der_cert, intermediate_der_certs, root_der_certs, verify_time,
+        dump_prefix_path, cert_net_fetcher_,
+        use_system_roots_ ? net::CreateSslSystemTrustStore()
+                          : net::CreateEmptySystemTrustStore());
   }
 
  private:
   scoped_refptr<net::CertNetFetcher> cert_net_fetcher_;
+  const bool use_system_roots_;
 };
 
+class DummySystemTrustStoreProvider : public net::SystemTrustStoreProvider {
+ public:
+  std::unique_ptr<net::SystemTrustStore> CreateSystemTrustStore() override {
+    return net::CreateEmptySystemTrustStore();
+  }
+};
+
+std::unique_ptr<net::SystemTrustStoreProvider> CreateSystemTrustStoreProvider(
+    bool use_system_roots) {
+  if (use_system_roots)
+    return nullptr;
+  return std::make_unique<DummySystemTrustStoreProvider>();
+}
+
 // Creates an subclass of CertVerifyImpl based on its name, or returns nullptr.
 std::unique_ptr<CertVerifyImpl> CreateCertVerifyImplFromName(
     base::StringPiece impl_name,
-    scoped_refptr<net::CertNetFetcher> cert_net_fetcher) {
+    scoped_refptr<net::CertNetFetcher> cert_net_fetcher,
+    bool use_system_roots) {
   if (impl_name == "platform") {
+    if (!use_system_roots) {
+      std::cerr << "WARNING: platform verifier not supported with "
+                   "--no-system-roots, skipping.\n";
+      return nullptr;
+    }
+
     return std::make_unique<CertVerifyImplUsingProc>(
         "CertVerifyProc (default)",
         net::CertVerifyProc::CreateDefault(std::move(cert_net_fetcher)));
@@ -190,12 +217,13 @@
         "CertVerifyProcBuiltin",
         net::CreateCertVerifyProcBuiltin(
             std::move(cert_net_fetcher),
-            nullptr /* system_trust_store_provider */));
+            CreateSystemTrustStoreProvider(use_system_roots)));
   }
 
-  if (impl_name == "pathbuilder")
+  if (impl_name == "pathbuilder") {
     return std::make_unique<CertVerifyImplUsingPathBuilder>(
-        std::move(cert_net_fetcher));
+        std::move(cert_net_fetcher), use_system_roots);
+  }
 
   std::cerr << "WARNING: Unrecognized impl: " << impl_name << "\n";
   return nullptr;
@@ -219,6 +247,11 @@
     "      <certs path> is a file containing certificates [1] to interpret as\n"
     "      trust anchors (without any anchor constraints).\n"
     "\n"
+    " --no-system-roots\n"
+    "      Do not use system provided trust roots, only trust roots specified\n"
+    "      by --roots or --trust-last-cert will be used. Only supported by\n"
+    "      the builtin and pathbuilter impls.\n"
+    "\n"
     " --intermediates=<certs path>\n"
     "      <certs path> is a file containing certificates [1] for use when\n"
     "      path building is looking for intermediates.\n"
@@ -301,6 +334,8 @@
     }
   }
 
+  bool use_system_roots = !command_line.HasSwitch("no-system-roots");
+
   base::FilePath roots_path = command_line.GetSwitchValuePath("roots");
   base::FilePath intermediates_path =
       command_line.GetSwitchValuePath("intermediates");
@@ -382,8 +417,8 @@
       impls_str, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 
   for (const std::string& impl_name : impl_names) {
-    auto verify_impl =
-        CreateCertVerifyImplFromName(impl_name, cert_net_fetcher);
+    auto verify_impl = CreateCertVerifyImplFromName(impl_name, cert_net_fetcher,
+                                                    use_system_roots);
     if (verify_impl)
       impls.push_back(std::move(verify_impl));
   }
diff --git a/net/tools/cert_verify_tool/verify_using_path_builder.cc b/net/tools/cert_verify_tool/verify_using_path_builder.cc
index a1718fe5..abb8614 100644
--- a/net/tools/cert_verify_tool/verify_using_path_builder.cc
+++ b/net/tools/cert_verify_tool/verify_using_path_builder.cc
@@ -132,14 +132,12 @@
     const std::vector<CertInput>& root_der_certs,
     const base::Time at_time,
     const base::FilePath& dump_prefix_path,
-    scoped_refptr<net::CertNetFetcher> cert_net_fetcher) {
+    scoped_refptr<net::CertNetFetcher> cert_net_fetcher,
+    std::unique_ptr<net::SystemTrustStore> ssl_trust_store) {
   base::Time::Exploded exploded_time;
   at_time.UTCExplode(&exploded_time);
   net::der::GeneralizedTime time = ConvertExplodedTime(exploded_time);
 
-  std::unique_ptr<net::SystemTrustStore> ssl_trust_store =
-      net::CreateSslSystemTrustStore();
-
   for (const auto& der_cert : root_der_certs) {
     scoped_refptr<net::ParsedCertificate> cert = ParseCertificate(der_cert);
     if (cert) {
diff --git a/net/tools/cert_verify_tool/verify_using_path_builder.h b/net/tools/cert_verify_tool/verify_using_path_builder.h
index e10a395..9286159 100644
--- a/net/tools/cert_verify_tool/verify_using_path_builder.h
+++ b/net/tools/cert_verify_tool/verify_using_path_builder.h
@@ -17,6 +17,7 @@
 
 namespace net {
 class CertNetFetcher;
+class SystemTrustStore;
 }
 
 struct CertInput;
@@ -31,6 +32,7 @@
     const std::vector<CertInput>& root_der_certs,
     const base::Time at_time,
     const base::FilePath& dump_prefix_path,
-    scoped_refptr<net::CertNetFetcher> cert_net_fetcher);
+    scoped_refptr<net::CertNetFetcher> cert_net_fetcher,
+    std::unique_ptr<net::SystemTrustStore> ssl_trust_store);
 
 #endif  // NET_TOOLS_CERT_VERIFY_TOOL_VERIFY_USING_PATH_BUILDER_H_
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index a2c189bc..8140b0c5 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -74,6 +74,7 @@
 #if defined(OS_ANDROID)
 const int kReadBufferSize = 32 * 1024;
 #else
+// |2^n - delta| is better than 2^n on Linux. See crrev.com/c/1792208.
 const int kReadBufferSize = 131000;
 #endif
 
@@ -180,7 +181,7 @@
              static_cast<uint64_t>(remaining_size));
     const int frame_size = static_cast<int>(frame->header.payload_length);
     if (frame_size > 0) {
-      const char* const frame_data = frame->data;
+      const char* const frame_data = frame->payload;
       std::copy(frame_data, frame_data + frame_size, dest);
       MaskWebSocketFramePayload(mask, 0, dest, frame_size);
       dest += frame_size;
@@ -360,7 +361,7 @@
   }
   DCHECK(current_frame_header_) << "Unexpected header-less chunk received "
                                 << "(final_chunk = " << chunk->final_chunk
-                                << ", data size = " << chunk->data.size()
+                                << ", payload size = " << chunk->payload.size()
                                 << ") (bug in WebSocketFrameParser?)";
   const bool is_final_chunk = chunk->final_chunk;
   const WebSocketFrameHeader::OpCode opcode = current_frame_header_->opcode;
@@ -384,13 +385,13 @@
 
     if (!is_final_chunk) {
       DVLOG(2) << "Encountered a split control frame, opcode " << opcode;
-      AddToIncompleteControlFrameBody(chunk->data);
+      AddToIncompleteControlFrameBody(chunk->payload);
       return OK;
     }
 
     if (!incomplete_control_frame_body_.empty()) {
       DVLOG(2) << "Rejoining a split control frame, opcode " << opcode;
-      AddToIncompleteControlFrameBody(chunk->data);
+      AddToIncompleteControlFrameBody(chunk->payload);
       DCHECK(is_final_chunk);
       DCHECK(complete_control_frame_body_.empty());
       complete_control_frame_body_ = std::move(incomplete_control_frame_body_);
@@ -403,13 +404,13 @@
   // header. A check for exact equality can only be used when the whole frame
   // arrives in one chunk.
   DCHECK_GE(current_frame_header_->payload_length,
-            base::checked_cast<uint64_t>(chunk->data.size()));
+            base::checked_cast<uint64_t>(chunk->payload.size()));
   DCHECK(!is_first_chunk || !is_final_chunk ||
          current_frame_header_->payload_length ==
-             base::checked_cast<uint64_t>(chunk->data.size()));
+             base::checked_cast<uint64_t>(chunk->payload.size()));
 
   // Convert the chunk to a complete frame.
-  *frame = CreateFrame(is_final_chunk, chunk->data);
+  *frame = CreateFrame(is_final_chunk, chunk->payload);
   return OK;
 }
 
@@ -429,7 +430,7 @@
     result_frame->header.CopyFrom(*current_frame_header_);
     result_frame->header.final = is_final_chunk_in_message;
     result_frame->header.payload_length = data.size();
-    result_frame->data = data.data();
+    result_frame->payload = data.data();
     // Ensure that opcodes Text and Binary are only used for the first frame in
     // the message. Also clear the reserved bits.
     // TODO(ricea): If a future extension requires the reserved bits to be
diff --git a/net/websockets/websocket_basic_stream.h b/net/websockets/websocket_basic_stream.h
index ee07d79..c6cdf14 100644
--- a/net/websockets/websocket_basic_stream.h
+++ b/net/websockets/websocket_basic_stream.h
@@ -146,9 +146,7 @@
   // bounds checks.
   void AddToIncompleteControlFrameBody(base::span<const char> data);
 
-  // Storage for pending reads. All active WebSockets spend all the time with a
-  // call to ReadFrames() pending, so there is no benefit in trying to share
-  // this between sockets.
+  // Storage for pending reads.
   scoped_refptr<IOBufferWithSize> read_buffer_;
 
   // The connection, wrapped in a ClientSocketHandle so that we can prevent it
@@ -164,7 +162,7 @@
 
   // Although it should rarely happen in practice, a control frame can arrive
   // broken into chunks. This variable provides storage for a partial control
-  // frame until the rest arrives. It will be NULL the rest of the time.
+  // frame until the rest arrives. It will be empty the rest of the time.
   std::vector<char> incomplete_control_frame_body_;
   // Storage for payload of combined (see |incomplete_control_frame_body_|)
   // control frame.
diff --git a/net/websockets/websocket_basic_stream_test.cc b/net/websockets/websocket_basic_stream_test.cc
index 301b5a2..95c2c44f 100644
--- a/net/websockets/websocket_basic_stream_test.cc
+++ b/net/websockets/websocket_basic_stream_test.cc
@@ -257,7 +257,7 @@
     frame_buffers_.push_back(buffer);
     memcpy(buffer->data(), kWriteFrame + kWriteFrameSize - payload_size,
            payload_size);
-    frame->data = buffer->data();
+    frame->payload = buffer->data();
     WebSocketFrameHeader& header = frame->header;
     header.final = true;
     header.masked = true;
@@ -356,7 +356,7 @@
 
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  EXPECT_EQ(nullptr, frames_[0]->data);
+  EXPECT_EQ(nullptr, frames_[0]->payload);
   EXPECT_EQ(0U, frames_[0]->header.payload_length);
   EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames_[0]->header.opcode);
 }
@@ -372,7 +372,7 @@
   CreateStream(reads, base::span<MockWrite>());
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  EXPECT_EQ(nullptr, frames_[0]->data);
+  EXPECT_EQ(nullptr, frames_[0]->payload);
   EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames_[0]->header.opcode);
   frames_.clear();
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()),
@@ -580,7 +580,7 @@
 
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  EXPECT_EQ(nullptr, frames_[0]->data);
+  EXPECT_EQ(nullptr, frames_[0]->payload);
   EXPECT_EQ(0U, frames_[0]->header.payload_length);
 }
 
@@ -627,7 +627,7 @@
 
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  EXPECT_EQ(nullptr, frames_[0]->data);
+  EXPECT_EQ(nullptr, frames_[0]->payload);
   EXPECT_EQ(0U, frames_[0]->header.payload_length);
 }
 
@@ -658,7 +658,7 @@
 
   EXPECT_THAT(stream_->ReadFrames(&frames_, cb_.callback()), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  ASSERT_TRUE(frames_[0]->data);
+  ASSERT_TRUE(frames_[0]->payload);
   EXPECT_EQ(UINT64_C(6), frames_[0]->header.payload_length);
 }
 
@@ -673,7 +673,7 @@
               IsError(ERR_IO_PENDING));
   EXPECT_THAT(cb_.WaitForResult(), IsOk());
   ASSERT_EQ(1U, frames_.size());
-  ASSERT_TRUE(frames_[0]->data);
+  ASSERT_TRUE(frames_[0]->payload);
   EXPECT_EQ(UINT64_C(6), frames_[0]->header.payload_length);
   EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, frames_[0]->header.opcode);
 }
@@ -694,7 +694,7 @@
   ASSERT_EQ(1U, frames_.size());
   EXPECT_EQ(WebSocketFrameHeader::kOpCodeClose, frames_[0]->header.opcode);
   EXPECT_EQ(kCloseFrameSize - 2, frames_[0]->header.payload_length);
-  EXPECT_EQ(std::string(frames_[0]->data, kCloseFrameSize - 2),
+  EXPECT_EQ(std::string(frames_[0]->payload, kCloseFrameSize - 2),
             std::string(kCloseFrame + 2, kCloseFrameSize - 2));
 }
 
@@ -946,7 +946,7 @@
   const size_t payload_size = unmasked_payload.size();
   auto buffer = base::MakeRefCounted<IOBuffer>(payload_size);
   memcpy(buffer->data(), unmasked_payload.data(), payload_size);
-  frame->data = buffer->data();
+  frame->payload = buffer->data();
   WebSocketFrameHeader& header = frame->header;
   header.final = true;
   header.masked = true;
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index 3196986a..3fb8aa1 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -703,7 +703,7 @@
   // Respond to the frame appropriately to its type.
   return HandleFrameByState(
       opcode, frame->header.final,
-      base::make_span(frame->data, frame->header.payload_length));
+      base::make_span(frame->payload, frame->header.payload_length));
 }
 
 ChannelState WebSocketChannel::HandleFrameByState(
@@ -902,7 +902,7 @@
   header.final = fin;
   header.masked = true;
   header.payload_length = buffer_size;
-  frame->data = buffer->data();
+  frame->payload = buffer->data();
 
   if (data_being_sent_) {
     // Either the link to the WebSocket server is saturated, or several messages
diff --git a/net/websockets/websocket_channel.h b/net/websockets/websocket_channel.h
index 0bd102cf..b62c50a 100644
--- a/net/websockets/websocket_channel.h
+++ b/net/websockets/websocket_channel.h
@@ -156,6 +156,7 @@
 #if defined(OS_ANDROID)
   static const uint64_t kReceiveQuotaThreshold = 1 << 15;
 #else
+  // |2^n - delta| is better than 2^n on Linux. See crrev.com/c/1792208.
   static const uint64_t kReceiveQuotaThreshold = 65500;
 #endif
 
diff --git a/net/websockets/websocket_channel_test.cc b/net/websockets/websocket_channel_test.cc
index 3551eb5..e3d00767 100644
--- a/net/websockets/websocket_channel_test.cc
+++ b/net/websockets/websocket_channel_test.cc
@@ -72,9 +72,9 @@
 
 std::ostream& operator<<(std::ostream& os, const WebSocketFrame& frame) {
   os << "{" << frame.header << ", ";
-  if (frame.data) {
+  if (frame.payload) {
     return os << "\""
-              << base::StringPiece(frame.data, frame.header.payload_length)
+              << base::StringPiece(frame.payload, frame.header.payload_length)
               << "\"}";
   }
   return os << "NULL}";
@@ -362,7 +362,7 @@
       auto buffer = base::MakeRefCounted<IOBuffer>(frame_length);
       result_frame_data->push_back(buffer);
       memcpy(buffer->data(), source_frame.data, frame_length);
-      result_frame->data = buffer->data();
+      result_frame->payload = buffer->data();
     }
     result_frames.push_back(std::move(result_frame));
   }
@@ -424,7 +424,7 @@
         return false;
       }
       if (expected_length != 0 &&
-          memcmp(actual_frame.data, expected_frame.data,
+          memcmp(actual_frame.payload, expected_frame.data,
                  actual_frame.header.payload_length) != 0) {
         *listener << "the data content differs";
         return false;
@@ -595,8 +595,8 @@
     for (const auto& frame : *frames) {
       auto buffer = base::MakeRefCounted<IOBuffer>(
           static_cast<size_t>(frame->header.payload_length));
-      memcpy(buffer->data(), frame->data, frame->header.payload_length);
-      frame->data = buffer->data();
+      memcpy(buffer->data(), frame->payload, frame->header.payload_length);
+      frame->payload = buffer->data();
       buffers_.push_back(buffer);
     }
     stored_frames_.insert(stored_frames_.end(),
@@ -2349,8 +2349,8 @@
   ASSERT_EQ(1U, frames->size());
   const WebSocketFrame* out_frame = (*frames)[0].get();
   EXPECT_EQ(kBinaryBlobSize, out_frame->header.payload_length);
-  ASSERT_TRUE(out_frame->data);
-  EXPECT_EQ(0, memcmp(kBinaryBlob, out_frame->data, kBinaryBlobSize));
+  ASSERT_TRUE(out_frame->payload);
+  EXPECT_EQ(0, memcmp(kBinaryBlob, out_frame->payload, kBinaryBlobSize));
 }
 
 // Test the read path for 8-bit cleanliness as well.
@@ -2362,7 +2362,7 @@
   frame_header.payload_length = kBinaryBlobSize;
   auto buffer = base::MakeRefCounted<IOBuffer>(kBinaryBlobSize);
   memcpy(buffer->data(), kBinaryBlob, kBinaryBlobSize);
-  frame->data = buffer->data();
+  frame->payload = buffer->data();
   std::vector<std::unique_ptr<WebSocketFrame>> frames;
   frames.push_back(std::move(frame));
   auto stream = std::make_unique<ReadableFakeWebSocketStream>();
diff --git a/net/websockets/websocket_deflate_stream.cc b/net/websockets/websocket_deflate_stream.cc
index b03af24..9863396 100644
--- a/net/websockets/websocket_deflate_stream.cc
+++ b/net/websockets/websocket_deflate_stream.cc
@@ -137,9 +137,10 @@
       frames_to_write.push_back(std::move(frame));
       current_writing_opcode_ = WebSocketFrameHeader::kOpCodeContinuation;
     } else {
-      if (frame->data &&
+      if (frame->payload &&
           !deflater_.AddBytes(
-              frame->data, static_cast<size_t>(frame->header.payload_length))) {
+              frame->payload,
+              static_cast<size_t>(frame->header.payload_length))) {
         DVLOG(1) << "WebSocket protocol error. "
                  << "deflater_.AddBytes() returns an error.";
         return ERR_WS_PROTOCOL_ERROR;
@@ -221,7 +222,7 @@
   compressed->header.final = header.final;
   compressed->header.reserved1 =
       (opcode != WebSocketFrameHeader::kOpCodeContinuation);
-  compressed->data = compressed_payload->data();
+  compressed->payload = compressed_payload->data();
   compressed->header.payload_length = compressed_payload->size();
 
   current_writing_opcode_ = WebSocketFrameHeader::kOpCodeContinuation;
@@ -272,7 +273,7 @@
   compressed->header.opcode = opcode;
   compressed->header.final = true;
   compressed->header.reserved1 = true;
-  compressed->data = compressed_payload->data();
+  compressed->payload = compressed_payload->data();
   compressed->header.payload_length = compressed_payload->size();
 
   predictor_->RecordWrittenDataFrame(compressed.get());
@@ -319,9 +320,10 @@
       frames_to_output.push_back(std::move(frame));
     } else {
       DCHECK_EQ(reading_state_, READING_COMPRESSED_MESSAGE);
-      if (frame->data &&
+      if (frame->payload &&
           !inflater_.AddBytes(
-              frame->data, static_cast<size_t>(frame->header.payload_length))) {
+              frame->payload,
+              static_cast<size_t>(frame->header.payload_length))) {
         DVLOG(1) << "WebSocket protocol error. "
                  << "inflater_.AddBytes() returns an error.";
         return ERR_WS_PROTOCOL_ERROR;
@@ -354,7 +356,7 @@
         inflated->header.opcode = current_reading_opcode_;
         inflated->header.final = is_final;
         inflated->header.reserved1 = false;
-        inflated->data = data->data();
+        inflated->payload = data->data();
         inflated->header.payload_length = data->size();
         DVLOG(3) << "Inflated frame: opcode=" << inflated->header.opcode
                  << " final=" << inflated->header.final
diff --git a/net/websockets/websocket_deflate_stream_fuzzer.cc b/net/websockets/websocket_deflate_stream_fuzzer.cc
index 05065f7..3734128 100644
--- a/net/websockets/websocket_deflate_stream_fuzzer.cc
+++ b/net/websockets/websocket_deflate_stream_fuzzer.cc
@@ -88,7 +88,7 @@
     auto buffer = base::MakeRefCounted<IOBufferWithSize>(payload.size());
     memcpy(buffer->data(), payload.data(), payload.size());
     buffers_.push_back(buffer);
-    frame->data = buffer->data();
+    frame->payload = buffer->data();
     frame->header.payload_length = payload.size();
     return frame;
   }
diff --git a/net/websockets/websocket_deflate_stream_test.cc b/net/websockets/websocket_deflate_stream_test.cc
index 3d16e4c..078a96cf 100644
--- a/net/websockets/websocket_deflate_stream_test.cc
+++ b/net/websockets/websocket_deflate_stream_test.cc
@@ -63,8 +63,9 @@
 }
 
 std::string ToString(const WebSocketFrame* frame) {
-  return frame->data ? std::string(frame->data, frame->header.payload_length)
-                     : "";
+  return frame->payload
+             ? std::string(frame->payload, frame->header.payload_length)
+             : "";
 }
 
 std::string ToString(const std::unique_ptr<WebSocketFrame>& frame) {
@@ -249,7 +250,7 @@
     frame->header.reserved1 = (flag & kReserved1);
     auto buffer = std::make_unique<char[]>(data.size());
     memcpy(buffer.get(), data.c_str(), data.size());
-    frame->data = buffer.get();
+    frame->payload = buffer.get();
     data_buffers.push_back(std::move(buffer));
     frame->header.payload_length = data.size();
     frames->push_back(std::move(frame));
@@ -1202,8 +1203,9 @@
     ASSERT_THAT(deflate_stream_->WriteFrames(&frames, CompletionOnceCallback()),
                 IsOk());
     for (auto& frame : *stub.frames()) {
-      buffers.push_back(std::string(frame->data, frame->header.payload_length));
-      frame->data = (buffers.end() - 1)->data();
+      buffers.push_back(
+          std::string(frame->payload, frame->header.payload_length));
+      frame->payload = (buffers.end() - 1)->data();
     }
     total_compressed_frames.insert(
         total_compressed_frames.end(),
diff --git a/net/websockets/websocket_frame.h b/net/websockets/websocket_frame.h
index b7f2ce62..fe935601 100644
--- a/net/websockets/websocket_frame.h
+++ b/net/websockets/websocket_frame.h
@@ -99,10 +99,14 @@
   // |header| is always present.
   WebSocketFrameHeader header;
 
-  // |data| is always unmasked even if the frame is masked. The size of |data|
-  // is given by |header.payload_length|.
-  // TODO(yoichio): Rename this to "payload".
-  const char* data = nullptr;
+  // |payload| is always unmasked even if the frame is masked. The size of
+  // |payload| is given by |header.payload_length|.
+  // The lifetime of |payload| is not defined by WebSocketFrameChunk. It is the
+  // responsibility of the creator to ensure it remains valid for the lifetime
+  // of this object. This should be documented in the code that creates this
+  // object.
+  // TODO(yoicho): Find more better way to clarify the life cycle.
+  const char* payload = nullptr;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(WebSocketFrame);
@@ -136,10 +140,14 @@
   // Indicates this part is the last chunk of a frame.
   bool final_chunk;
 
-  // |data| is always unmasked even if the frame is masked. |data| might be
-  // empty in the first chunk.
-  // TODO(yoichio): Rename this to "payload".
-  base::span<const char> data;
+  // |payload| is always unmasked even if the frame is masked. |payload| might
+  // be empty in the first chunk.
+  // The lifetime of |payload| is not defined by WebSocketFrameChunk. It is the
+  // responsibility of the creator to ensure it remains valid for the lifetime
+  // of this object. This should be documented in the code that creates this
+  // object.
+  // TODO(yoicho): Find more better way to clarify the life cycle.
+  base::span<const char> payload;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(WebSocketFrameChunk);
diff --git a/net/websockets/websocket_frame_parser.cc b/net/websockets/websocket_frame_parser.cc
index 5166125..bbbd0db 100644
--- a/net/websockets/websocket_frame_parser.cc
+++ b/net/websockets/websocket_frame_parser.cc
@@ -191,7 +191,7 @@
   }
   frame_chunk->final_chunk = false;
   if (chunk_data_size > 0) {
-    frame_chunk->data = data->subspan(0, chunk_data_size);
+    frame_chunk->payload = data->subspan(0, chunk_data_size);
     *data = data->subspan(chunk_data_size);
     frame_offset_ += chunk_data_size;
   }
diff --git a/net/websockets/websocket_frame_parser_test.cc b/net/websockets/websocket_frame_parser_test.cc
index 3730c57..2ae986b3 100644
--- a/net/websockets/websocket_frame_parser_test.cc
+++ b/net/websockets/websocket_frame_parser_test.cc
@@ -70,8 +70,8 @@
   }
   EXPECT_TRUE(frame->final_chunk);
 
-  ASSERT_EQ(static_cast<size_t>(kHelloLength), frame->data.size());
-  EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->data.data()));
+  ASSERT_EQ(static_cast<size_t>(kHelloLength), frame->payload.size());
+  EXPECT_TRUE(std::equal(kHello, kHello + kHelloLength, frame->payload.data()));
 }
 
 TEST(WebSocketFrameParserTest, DecodeMaskedFrame) {
@@ -97,9 +97,9 @@
   }
   EXPECT_TRUE(frame->final_chunk);
 
-  ASSERT_EQ(static_cast<size_t>(kHelloLength), frame->data.size());
+  ASSERT_EQ(static_cast<size_t>(kHelloLength), frame->payload.size());
 
-  std::string payload(frame->data.data(), frame->data.size());
+  std::string payload(frame->payload.data(), frame->payload.size());
   MaskWebSocketFramePayload(header->masking_key, 0, &payload[0],
                             payload.size());
   EXPECT_EQ(payload, kHello);
@@ -152,11 +152,11 @@
       continue;
     EXPECT_TRUE(frame->final_chunk);
     ASSERT_EQ(kInputs[i].expected_payload_length,
-              static_cast<uint64_t>(frame->data.size()));
+              static_cast<uint64_t>(frame->payload.size()));
     EXPECT_TRUE(std::equal(
         kInputs[i].expected_payload,
         kInputs[i].expected_payload + kInputs[i].expected_payload_length,
-        frame->data.data()));
+        frame->payload.data()));
 
     const WebSocketFrameHeader* header = frame->header.get();
     EXPECT_TRUE(header != nullptr);
@@ -198,11 +198,11 @@
       continue;
     EXPECT_FALSE(frame1->final_chunk);
     if (expected1.size() == 0) {
-      EXPECT_EQ(nullptr, frame1->data.data());
+      EXPECT_EQ(nullptr, frame1->payload.data());
     } else {
-      ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->data.size()));
-      EXPECT_TRUE(
-          std::equal(expected1.begin(), expected1.end(), frame1->data.data()));
+      ASSERT_EQ(cutting_pos, static_cast<size_t>(frame1->payload.size()));
+      EXPECT_TRUE(std::equal(expected1.begin(), expected1.end(),
+                             frame1->payload.data()));
     }
     const WebSocketFrameHeader* header1 = frame1->header.get();
     EXPECT_TRUE(header1 != nullptr);
@@ -228,11 +228,12 @@
       continue;
     EXPECT_TRUE(frame2->final_chunk);
     if (expected2.size() == 0) {
-      EXPECT_EQ(nullptr, frame2->data.data());
+      EXPECT_EQ(nullptr, frame1->payload.data());
     } else {
-      ASSERT_EQ(expected2.size(), static_cast<uint64_t>(frame2->data.size()));
-      EXPECT_TRUE(
-          std::equal(expected2.begin(), expected2.end(), frame2->data.data()));
+      ASSERT_EQ(expected2.size(),
+                static_cast<uint64_t>(frame2->payload.size()));
+      EXPECT_TRUE(std::equal(expected2.begin(), expected2.end(),
+                             frame2->payload.data()));
     }
     const WebSocketFrameHeader* header2 = frame2->header.get();
     EXPECT_TRUE(header2 == nullptr);
@@ -269,11 +270,13 @@
     if (!header1)
       continue;
     if (expected1.size() == 0) {
-      EXPECT_EQ(nullptr, frame1->data.data());
+      EXPECT_EQ(nullptr, frame1->payload.data());
     } else {
-      ASSERT_EQ(expected1.size(), static_cast<uint64_t>(frame1->data.size()));
-      std::vector<char> payload1(frame1->data.data(),
-                                 frame1->data.data() + frame1->data.size());
+      ASSERT_EQ(expected1.size(),
+                static_cast<uint64_t>(frame1->payload.size()));
+      std::vector<char> payload1(
+          frame1->payload.data(),
+          frame1->payload.data() + frame1->payload.size());
       MaskWebSocketFramePayload(header1->masking_key, 0, &payload1[0],
                                 payload1.size());
       EXPECT_EQ(expected1, payload1);
@@ -298,11 +301,13 @@
       continue;
     EXPECT_TRUE(frame2->final_chunk);
     if (expected2.size() == 0) {
-      EXPECT_EQ(nullptr, frame2->data.data());
+      EXPECT_EQ(nullptr, frame2->payload.data());
     } else {
-      ASSERT_EQ(expected2.size(), static_cast<uint64_t>(frame2->data.size()));
-      std::vector<char> payload2(frame2->data.data(),
-                                 frame2->data.data() + frame2->data.size());
+      ASSERT_EQ(expected2.size(),
+                static_cast<uint64_t>(frame2->payload.size()));
+      std::vector<char> payload2(
+          frame2->payload.data(),
+          frame2->payload.data() + frame2->payload.size());
       MaskWebSocketFramePayload(header1->masking_key, cutting_pos, &payload2[0],
                                 payload2.size());
       EXPECT_EQ(expected2, payload2);
@@ -348,12 +353,12 @@
     }
     std::vector<char> expected_payload(input_payload_size, 'a');
     if (expected_payload.size() == 0) {
-      EXPECT_EQ(nullptr, frame->data.data());
+      EXPECT_EQ(nullptr, frame->payload.data());
     } else {
       ASSERT_EQ(expected_payload.size(),
-                static_cast<uint64_t>(frame->data.size()));
+                static_cast<uint64_t>(frame->payload.size()));
       EXPECT_TRUE(std::equal(expected_payload.begin(), expected_payload.end(),
-                             frame->data.data()));
+                             frame->payload.data()));
     }
     const WebSocketFrameHeader* header = frame->header.get();
     EXPECT_TRUE(header != nullptr);
@@ -409,7 +414,7 @@
     } else {
       EXPECT_FALSE(frame->final_chunk);
     }
-    EXPECT_EQ(nullptr, frame->data.data());
+    EXPECT_EQ(nullptr, frame->payload.data());
     const WebSocketFrameHeader* header = frame->header.get();
     EXPECT_TRUE(header != nullptr);
     if (!header)
@@ -507,7 +512,7 @@
     if (!frame)
       continue;
     EXPECT_TRUE(frame->final_chunk);
-    EXPECT_EQ(nullptr, frame->data.data());
+    EXPECT_EQ(nullptr, frame->payload.data());
     const WebSocketFrameHeader* header = frame->header.get();
     EXPECT_TRUE(header != nullptr);
     if (!header)
@@ -563,7 +568,7 @@
     if (!frame)
       continue;
     EXPECT_TRUE(frame->final_chunk);
-    EXPECT_EQ(nullptr, frame->data.data());
+    EXPECT_EQ(nullptr, frame->payload.data());
     const WebSocketFrameHeader* header = frame->header.get();
     EXPECT_TRUE(header != nullptr);
     if (!header)
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
index 9cc49bca..90e53f50 100644
--- a/net/websockets/websocket_stream_test.cc
+++ b/net/websockets/websocket_stream_test.cc
@@ -838,7 +838,7 @@
   ASSERT_EQ(1U, frames.size());
   ASSERT_EQ(5U, frames[0]->header.payload_length);
   EXPECT_EQ(std::string("Hello"),
-            std::string(frames[0]->data, frames[0]->header.payload_length));
+            std::string(frames[0]->payload, frames[0]->header.payload_length));
 }
 
 // Unknown extension in the response is rejected
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index 9c77f642..c6b9448 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -14,6 +14,7 @@
 
 #include "base/feature_list.h"
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -2014,11 +2015,14 @@
 
 pp::FloatPoint OutOfProcessInstance::BoundScrollOffsetToDocument(
     const pp::FloatPoint& scroll_offset) {
-  float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width();
-  float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f);
+  float max_x = std::max(
+      document_size_.width() * float{zoom_} - plugin_dip_size_.width(), 0.0f);
+  float x = base::ClampToRange(scroll_offset.x(), 0.0f, max_x);
   float min_y = -top_toolbar_height_in_viewport_coords_;
-  float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height();
-  float y = std::max(std::min(scroll_offset.y(), max_y), min_y);
+  float max_y = std::max(
+      document_size_.height() * float{zoom_} - plugin_dip_size_.height(),
+      min_y);
+  float y = base::ClampToRange(scroll_offset.y(), min_y, max_y);
   return pp::FloatPoint(x, y);
 }
 
diff --git a/pdf/pdfium/pdfium_font_linux.cc b/pdf/pdfium/pdfium_font_linux.cc
index c8d8578..8c9f1713 100644
--- a/pdf/pdfium/pdfium_font_linux.cc
+++ b/pdf/pdfium/pdfium_font_linux.cc
@@ -10,6 +10,7 @@
 #include "base/i18n/encoding_detection.h"
 #include "base/i18n/icu_string_conversions.h"
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "ppapi/cpp/instance.h"
@@ -32,7 +33,7 @@
   constexpr int kMinimumWeight = 100;
   constexpr int kMaximumWeight = 900;
   int normalized_weight =
-      std::min(std::max(weight, kMinimumWeight), kMaximumWeight);
+      base::ClampToRange(weight, kMinimumWeight, kMaximumWeight);
   normalized_weight = (normalized_weight / 100) - 1;
   return static_cast<PP_BrowserFont_Trusted_Weight>(normalized_weight);
 }
diff --git a/remoting/client/input/touch_input_scaler.cc b/remoting/client/input/touch_input_scaler.cc
index a3bbc12..c000a205 100644
--- a/remoting/client/input/touch_input_scaler.cc
+++ b/remoting/client/input/touch_input_scaler.cc
@@ -5,6 +5,7 @@
 #include "remoting/client/input/touch_input_scaler.h"
 
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "remoting/proto/event.pb.h"
 
 namespace remoting {
@@ -28,7 +29,7 @@
 // |input_max|.
 float ScaleAndClamp(float value, int output_max, int input_max) {
   value = Scale(value, output_max, input_max);
-  return std::max(0.0f, std::min(static_cast<float>(output_max), value));
+  return base::ClampToRange(value, 0.0f, float{output_max});
 }
 
 }  // namespace
diff --git a/remoting/host/desktop_resizer_x11.cc b/remoting/host/desktop_resizer_x11.cc
index 639aa1bf..6be31754 100644
--- a/remoting/host/desktop_resizer_x11.cc
+++ b/remoting/host/desktop_resizer_x11.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/numerics/ranges.h"
 #include "remoting/base/logging.h"
 #include "remoting/host/linux/x11_util.h"
 #include "ui/gfx/x/x11.h"
@@ -217,10 +218,10 @@
     XRRGetScreenSizeRange(display_, root_,
                           &min_width, &min_height,
                           &max_width, &max_height);
-    int width = std::min(std::max(preferred.dimensions().width(), min_width),
-                         max_width);
-    int height = std::min(std::max(preferred.dimensions().height(), min_height),
-                          max_height);
+    int width = base::ClampToRange(preferred.dimensions().width(), min_width,
+                                   max_width);
+    int height = base::ClampToRange(preferred.dimensions().height(), min_height,
+                                    max_height);
     // Additionally impose a minimum size of 640x480, since anything smaller
     // doesn't seem very useful.
     ScreenResolution actual(
diff --git a/remoting/host/desktop_session_win.cc b/remoting/host/desktop_session_win.cc
index 2473889..64a9fe0 100644
--- a/remoting/host/desktop_session_win.cc
+++ b/remoting/host/desktop_session_win.cc
@@ -18,6 +18,7 @@
 #include "base/guid.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -104,8 +105,8 @@
 
 webrtc::DesktopSize GetBoundedRdpDesktopSize(int width, int height) {
   return webrtc::DesktopSize(
-      std::min(kMaxRdpScreenWidth, std::max(kMinRdpScreenWidth, width)),
-      std::min(kMaxRdpScreenHeight, std::max(kMinRdpScreenHeight, height)));
+      base::ClampToRange(width, kMinRdpScreenWidth, kMaxRdpScreenWidth),
+      base::ClampToRange(height, kMinRdpScreenHeight, kMaxRdpScreenHeight));
 }
 
 // DesktopSession implementation which attaches to the host's physical console.
diff --git a/remoting/host/input_injector_win.cc b/remoting/host/input_injector_win.cc
index 9f030af..489c41a4 100644
--- a/remoting/host/input_injector_win.cc
+++ b/remoting/host/input_injector_win.cc
@@ -15,6 +15,7 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
+#include "base/numerics/ranges.h"
 #include "base/optional.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
@@ -76,8 +77,8 @@
     int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
     int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
     if (width > 1 && height > 1) {
-      int x = std::max(0, std::min(width, event.x()));
-      int y = std::max(0, std::min(height, event.y()));
+      int x = base::ClampToRange(event.x(), 0, width);
+      int y = base::ClampToRange(event.y(), 0, height);
       input.mi.dx = static_cast<int>((x * 65535) / (width - 1));
       input.mi.dy = static_cast<int>((y * 65535) / (height - 1));
       input.mi.dwFlags =
diff --git a/remoting/protocol/mouse_input_filter.cc b/remoting/protocol/mouse_input_filter.cc
index c1de6eb3..3615148 100644
--- a/remoting/protocol/mouse_input_filter.cc
+++ b/remoting/protocol/mouse_input_filter.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "remoting/proto/event.pb.h"
 
 namespace remoting {
@@ -35,13 +36,13 @@
     int x = out_event.x() * output_size_.width();
     x = (x + input_size_.width() / 2) / input_size_.width();
     out_event.set_x(output_offset_.x() +
-                    std::max(0, std::min(output_size_.width(), x)));
+                    base::ClampToRange(x, 0, output_size_.width()));
   }
   if (out_event.has_y()) {
     int y = out_event.y() * output_size_.height();
     y = (y + input_size_.height() / 2) / input_size_.height();
     out_event.set_y(output_offset_.y() +
-                    std::max(0, std::min(output_size_.height(), y)));
+                    base::ClampToRange(y, 0, output_size_.height()));
   }
 
   InputFilter::InjectMouseEvent(out_event);
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index 429344f8..918c5e28 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -58,6 +58,7 @@
 <translation id="2509394361235492552">Connected to <ph name="HOSTNAME" /></translation>
 <translation id="2512228156274966424">NOTE: To ensure that all keyboard shortcuts are available, you can configure Chrome Remote Desktop to ‘Open as window’.</translation>
 <translation id="2540992418118313681">Would you like to share this computer for another user to see and control?</translation>
+<translation id="254771646005658629">Allow remote users to control this Mac</translation>
 <translation id="2579271889603567289">Host crashed or failed to start.</translation>
 <translation id="2599300881200251572">This service enables incoming connections from Chrome Remote Desktop clients.</translation>
 <translation id="2647232381348739934">Chromoting Service</translation>
@@ -182,6 +183,11 @@
 <translation id="5419185025274123272">Could not reset the application. You can still send a bug report.</translation>
 <translation id="5419418238395129586">Last online: <ph name="DATE" /></translation>
 <translation id="544077782045763683">Host has shut down.</translation>
+<translation id="5463789431147491241">To use <ph name="PRODUCT_NAME" /> on this Mac, follow these steps:
+
+Select '<ph name="BUTTON_NAME" />' below. In your Security and Privacy preferences, tick the box next to '<ph name="SERVICE_SCRIPT_NAME" />'.
+
+If '<ph name="SERVICE_SCRIPT_NAME" />' is already ticked, untick it and then tick it again.</translation>
 <translation id="5510035215749041527">Disconnect now</translation>
 <translation id="5593560073513909978">The service is temporarily unavailable. Please try again later.</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -298,12 +304,14 @@
 <translation id="837021510621780684">From this computer</translation>
 <translation id="8383794970363966105">To use Chromoting, you'll need to add a Google Account to your device.</translation>
 <translation id="8386846956409881180">Host is configured with invalid OAuth credentials.</translation>
+<translation id="8406498562923498210">Select a session to launch within your Chrome Remote Desktop environment. (Note that some session types may not support running within Chrome Remote Desktop and on the local console simultaneously.)</translation>
 <translation id="8428213095426709021">Settings</translation>
 <translation id="8445362773033888690">View in Google Play Store</translation>
 <translation id="8509907436388546015">Desktop Integration Process</translation>
 <translation id="8513093439376855948">Native messaging host for remoting host management</translation>
 <translation id="8525306231823319788">Full screen</translation>
 <translation id="8548209692293300397">You have previously signed in as <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />). To access your computers in that account, <ph name="LINK_BEGIN" />sign in to Google Chrome<ph name="LINK_END" /> with that account and re-install Chrome Remote Desktop.</translation>
+<translation id="858006550102277544">Comment</translation>
 <translation id="8642984861538780905">Fair</translation>
 <translation id="8712909229180978490">I can't see my saved files online in Google Drive.</translation>
 <translation id="8743328882720071828">Would you like to allow <ph name="CLIENT_USERNAME" /> to see and control your computer?</translation>
@@ -321,6 +329,7 @@
 <translation id="9126115402994542723">Don't ask for a PIN again when connecting to this host from this device.</translation>
 <translation id="9149580767411232853">Keep whole remote desktop visible</translation>
 <translation id="9149992051684092333">To begin sharing your desktop, give the access code below to the person who will be assisting you.</translation>
+<translation id="916856682307586697">Launch the default XSession</translation>
 <translation id="9188433529406846933">Authorise</translation>
 <translation id="9213184081240281106">Invalid host configuration.</translation>
 <translation id="951991426597076286">Decline</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb
index 2911bcdd..e05dad00 100644
--- a/remoting/resources/remoting_strings_pt-BR.xtb
+++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -58,6 +58,7 @@
 <translation id="2509394361235492552">Conectado a <ph name="HOSTNAME" /></translation>
 <translation id="2512228156274966424">OBSERVAÇÃO: para garantir que todos os atalhos do teclado estejam disponíveis, você pode configurar a Área de trabalho remota do Google Chrome para "Abrir como janela".</translation>
 <translation id="2540992418118313681">Gostaria de compartilhar este computador para que outro usuário o veja e controle?</translation>
+<translation id="254771646005658629">Permitir que usuários remotos controlem este Mac</translation>
 <translation id="2579271889603567289">Ocorreu uma falha no host ou não foi possível iniciá-lo.</translation>
 <translation id="2599300881200251572">Este serviço permite conexões de entrada a partir de clientes da Área de trabalho remota do Google Chrome.</translation>
 <translation id="2647232381348739934">Serviço Chromoting</translation>
@@ -182,6 +183,11 @@
 <translation id="5419185025274123272">Não foi possível redefinir o aplicativo. Você ainda pode enviar um relatório de bug.</translation>
 <translation id="5419418238395129586">Última conexão: <ph name="DATE" /></translation>
 <translation id="544077782045763683">O host foi desligado.</translation>
+<translation id="5463789431147491241">Para usar o <ph name="PRODUCT_NAME" /> neste Mac, siga estas etapas:
+
+Selecione "<ph name="BUTTON_NAME" />" abaixo. Nas suas preferências de "Segurança e Privacidade", marque a caixa ao lado de "<ph name="SERVICE_SCRIPT_NAME" />".
+
+Se a caixa de "<ph name="SERVICE_SCRIPT_NAME" />" já estiver marcada, desmarque e marque novamente.</translation>
 <translation id="5510035215749041527">Desconectar agora</translation>
 <translation id="5593560073513909978">O serviço está temporariamente indisponível. Tente novamente mais tarde.</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -298,12 +304,14 @@
 <translation id="837021510621780684">Deste computador</translation>
 <translation id="8383794970363966105">Para usar o Chromoting, adicione uma Conta do Google a seu dispositivo.</translation>
 <translation id="8386846956409881180">O host está configurado com credenciais de OAuth inválidas.</translation>
+<translation id="8406498562923498210">Selecione uma sessão para ser iniciada no seu ambiente da Área de trabalho remota do Google Chrome. Alguns tipos de sessão podem não ser compatíveis com a execução simultânea na Área de trabalho remota do Google Chrome e no console local.</translation>
 <translation id="8428213095426709021">Configurações</translation>
 <translation id="8445362773033888690">Ver na Google Play Store</translation>
 <translation id="8509907436388546015">Processo de integração da área de trabalho</translation>
 <translation id="8513093439376855948">Host de mensagens nativas para gerenciamento de host remoto</translation>
 <translation id="8525306231823319788">Tela cheia</translation>
 <translation id="8548209692293300397">Você fez login anteriormente como <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />).  Para acessar seus computadores nessa conta, <ph name="LINK_BEGIN" />faça login no Google Chrome<ph name="LINK_END" /> usando essa conta e reinstale a Área de trabalho remota do Google Chrome.</translation>
+<translation id="858006550102277544">Comentário</translation>
 <translation id="8642984861538780905">Regular</translation>
 <translation id="8712909229180978490">Não consigo ver meus arquivos salvos on-line no Google Drive.</translation>
 <translation id="8743328882720071828">Quer permitir que <ph name="CLIENT_USERNAME" /> veja e controle seu computador?</translation>
@@ -321,6 +329,7 @@
 <translation id="9126115402994542723">Não pedir um PIN novamente ao se conectar a este host neste dispositivo.</translation>
 <translation id="9149580767411232853">Manter toda a área de trabalho remota visível</translation>
 <translation id="9149992051684092333">Para começar a compartilhar seu computador, forneça o código de acesso abaixo à pessoa que ajudará você.</translation>
+<translation id="916856682307586697">Abrir a XSession padrão</translation>
 <translation id="9188433529406846933">Autorizar</translation>
 <translation id="9213184081240281106">Configuração de host inválida.</translation>
 <translation id="951991426597076286">Recusar</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb
index 66cb724..a6f87a8 100644
--- a/remoting/resources/remoting_strings_sw.xtb
+++ b/remoting/resources/remoting_strings_sw.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="1002108253973310084">Toleo lisilooana la itifaki liligunduliwa. Tafadhali hakikisha kuwa umesakinisha toleo jipya la programu kwenye kompyuta zote mbili na ujaribu tena.</translation>
-<translation id="1008557486741366299">Sio Sasa</translation>
+<translation id="1008557486741366299">Si Sasa</translation>
 <translation id="1050693411695664090">Mbaya</translation>
 <translation id="1152528166145813711">Chagua...</translation>
 <translation id="1199593201721843963">Funga miunganisho ya mbali</translation>
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
index 816c0d6..4e0ad046 100644
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
@@ -845,7 +845,8 @@
 }
 #endif
 
-#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || \
+#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
+    defined(__aarch64__) ||                                         \
     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
 // These give a lot of ambient authority and bypass the setuid sandbox.
 bool SyscallSets::IsSystemVSharedMemory(int sysno) {
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.h b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
index acd92da..923533e 100644
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
@@ -75,7 +75,8 @@
     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
   static bool IsSystemVSemaphores(int sysno);
 #endif
-#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || \
+#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
+    defined(__aarch64__) ||                                         \
     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
   // These give a lot of ambient authority and bypass the setuid sandbox.
   static bool IsSystemVSharedMemory(int sysno);
diff --git a/sandbox/linux/system_headers/x86_32_linux_syscalls.h b/sandbox/linux/system_headers/x86_32_linux_syscalls.h
index a6afc62..7613c9b 100644
--- a/sandbox/linux/system_headers/x86_32_linux_syscalls.h
+++ b/sandbox/linux/system_headers/x86_32_linux_syscalls.h
@@ -1422,5 +1422,293 @@
 #define __NR_memfd_create 356
 #endif
 
+#if !defined(__NR_bpf)
+#define __NR_bpf 357
+#endif
+
+#if !defined(__NR_execveat)
+#define __NR_execveat 358
+#endif
+
+#if !defined(__NR_socket)
+#define __NR_socket 359
+#endif
+
+#if !defined(__NR_socketpair)
+#define __NR_socketpair 360
+#endif
+
+#if !defined(__NR_bind)
+#define __NR_bind 361
+#endif
+
+#if !defined(__NR_connect)
+#define __NR_connect 362
+#endif
+
+#if !defined(__NR_listen)
+#define __NR_listen 363
+#endif
+
+#if !defined(__NR_accept4)
+#define __NR_accept4 364
+#endif
+
+#if !defined(__NR_getsockopt)
+#define __NR_getsockopt 365
+#endif
+
+#if !defined(__NR_setsockopt)
+#define __NR_setsockopt 366
+#endif
+
+#if !defined(__NR_getsockname)
+#define __NR_getsockname 367
+#endif
+
+#if !defined(__NR_getpeername)
+#define __NR_getpeername 368
+#endif
+
+#if !defined(__NR_sendto)
+#define __NR_sendto 369
+#endif
+
+#if !defined(__NR_sendmsg)
+#define __NR_sendmsg 370
+#endif
+
+#if !defined(__NR_recvfrom)
+#define __NR_recvfrom 371
+#endif
+
+#if !defined(__NR_recvmsg)
+#define __NR_recvmsg 372
+#endif
+
+#if !defined(__NR_shutdown)
+#define __NR_shutdown 373
+#endif
+
+#if !defined(__NR_userfaultfd)
+#define __NR_userfaultfd 374
+#endif
+
+#if !defined(__NR_membarrier)
+#define __NR_membarrier 375
+#endif
+
+#if !defined(__NR_mlock2)
+#define __NR_mlock2 376
+#endif
+
+#if !defined(__NR_copy_file_range)
+#define __NR_copy_file_range 377
+#endif
+
+#if !defined(__NR_preadv2)
+#define __NR_preadv2 378
+#endif
+
+#if !defined(__NR_pwritev2)
+#define __NR_pwritev2 379
+#endif
+
+#if !defined(__NR_pkey_mprotect)
+#define __NR_pkey_mprotect 380
+#endif
+
+#if !defined(__NR_pkey_alloc)
+#define __NR_pkey_alloc 381
+#endif
+
+#if !defined(__NR_pkey_free)
+#define __NR_pkey_free 382
+#endif
+
+#if !defined(__NR_statx)
+#define __NR_statx 383
+#endif
+
+#if !defined(__NR_arch_prctl)
+#define __NR_arch_prctl 384
+#endif
+
+#if !defined(__NR_io_pgetevents)
+#define __NR_io_pgetevents 385
+#endif
+
+#if !defined(__NR_rseq)
+#define __NR_rseq 386
+#endif
+
+#if !defined(__NR_semget)
+#define __NR_semget 393
+#endif
+
+#if !defined(__NR_semctl)
+#define __NR_semctl 394
+#endif
+
+#if !defined(__NR_shmget)
+#define __NR_shmget 395
+#endif
+
+#if !defined(__NR_shmctl)
+#define __NR_shmctl 396
+#endif
+
+#if !defined(__NR_shmat)
+#define __NR_shmat 397
+#endif
+
+#if !defined(__NR_shmdt)
+#define __NR_shmdt 398
+#endif
+
+#if !defined(__NR_msgget)
+#define __NR_msgget 399
+#endif
+
+#if !defined(__NR_msgsnd)
+#define __NR_msgsnd 400
+#endif
+
+#if !defined(__NR_msgrcv)
+#define __NR_msgrcv 401
+#endif
+
+#if !defined(__NR_msgctl)
+#define __NR_msgctl 402
+#endif
+
+#if !defined(__NR_clock_gettime64)
+#define __NR_clock_gettime64 403
+#endif
+
+#if !defined(__NR_clock_settime64)
+#define __NR_clock_settime64 404
+#endif
+
+#if !defined(__NR_clock_adjtime64)
+#define __NR_clock_adjtime64 405
+#endif
+
+#if !defined(__NR_clock_getres_time64)
+#define __NR_clock_getres_time64 406
+#endif
+
+#if !defined(__NR_clock_nanosleep_time64)
+#define __NR_clock_nanosleep_time64 407
+#endif
+
+#if !defined(__NR_timer_gettime64)
+#define __NR_timer_gettime64 408
+#endif
+
+#if !defined(__NR_timer_settime64)
+#define __NR_timer_settime64 409
+#endif
+
+#if !defined(__NR_timerfd_gettime64)
+#define __NR_timerfd_gettime64 410
+#endif
+
+#if !defined(__NR_timerfd_settime64)
+#define __NR_timerfd_settime64 411
+#endif
+
+#if !defined(__NR_utimensat_time64)
+#define __NR_utimensat_time64 412
+#endif
+
+#if !defined(__NR_pselect6_time64)
+#define __NR_pselect6_time64 413
+#endif
+
+#if !defined(__NR_ppoll_time64)
+#define __NR_ppoll_time64 414
+#endif
+
+#if !defined(__NR_io_pgetevents_time64)
+#define __NR_io_pgetevents_time64 416
+#endif
+
+#if !defined(__NR_recvmmsg_time64)
+#define __NR_recvmmsg_time64 417
+#endif
+
+#if !defined(__NR_mq_timedsend_time64)
+#define __NR_mq_timedsend_time64 418
+#endif
+
+#if !defined(__NR_mq_timedreceive_time64)
+#define __NR_mq_timedreceive_time64 419
+#endif
+
+#if !defined(__NR_semtimedop_time64)
+#define __NR_semtimedop_time64 420
+#endif
+
+#if !defined(__NR_rt_sigtimedwait_time64)
+#define __NR_rt_sigtimedwait_time64 421
+#endif
+
+#if !defined(__NR_futex_time64)
+#define __NR_futex_time64 422
+#endif
+
+#if !defined(__NR_sched_rr_get_interval_time64)
+#define __NR_sched_rr_get_interval_time64 423
+#endif
+
+#if !defined(__NR_pidfd_send_signal)
+#define __NR_pidfd_send_signal 424
+#endif
+
+#if !defined(__NR_io_uring_setup)
+#define __NR_io_uring_setup 425
+#endif
+
+#if !defined(__NR_io_uring_enter)
+#define __NR_io_uring_enter 426
+#endif
+
+#if !defined(__NR_io_uring_register)
+#define __NR_io_uring_register 427
+#endif
+
+#if !defined(__NR_open_tree)
+#define __NR_open_tree 428
+#endif
+
+#if !defined(__NR_move_mount)
+#define __NR_move_mount 429
+#endif
+
+#if !defined(__NR_fsopen)
+#define __NR_fsopen 430
+#endif
+
+#if !defined(__NR_fsconfig)
+#define __NR_fsconfig 431
+#endif
+
+#if !defined(__NR_fsmount)
+#define __NR_fsmount 432
+#endif
+
+#if !defined(__NR_fspick)
+#define __NR_fspick 433
+#endif
+
+#if !defined(__NR_pidfd_open)
+#define __NR_pidfd_open 434
+#endif
+
+#if !defined(__NR_clone3)
+#define __NR_clone3 435
+#endif
+
 #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
 
diff --git a/services/audio/input_controller.cc b/services/audio/input_controller.cc
index 04ae7fe..ad95aa1 100644
--- a/services/audio/input_controller.cc
+++ b/services/audio/input_controller.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/ranges.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -80,7 +81,7 @@
 
   // Update accumulated average results, with clamping for sanity.
   const float average_power =
-      std::max(0.0f, std::min(1.0f, sum_power / (frames * channels)));
+      base::ClampToRange(sum_power / (frames * channels), 0.0f, 1.0f);
 
   // Convert average power level to dBFS units, and pin it down to zero if it
   // is insignificantly small.
diff --git a/services/device/bluetooth/bluetooth_system.cc b/services/device/bluetooth/bluetooth_system.cc
index 71cb184..61852c89 100644
--- a/services/device/bluetooth/bluetooth_system.cc
+++ b/services/device/bluetooth/bluetooth_system.cc
@@ -19,7 +19,7 @@
 #include "device/bluetooth/dbus/bluetooth_adapter_client.h"
 #include "device/bluetooth/dbus/bluetooth_device_client.h"
 #include "device/bluetooth/dbus/bluez_dbus_manager.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
 namespace device {
 
@@ -59,10 +59,12 @@
 
 }  // namespace
 
-void BluetoothSystem::Create(mojom::BluetoothSystemRequest request,
-                             mojom::BluetoothSystemClientPtr client) {
-  mojo::MakeStrongBinding(std::make_unique<BluetoothSystem>(std::move(client)),
-                          std::move(request));
+void BluetoothSystem::Create(
+    mojo::PendingReceiver<mojom::BluetoothSystem> receiver,
+    mojom::BluetoothSystemClientPtr client) {
+  mojo::MakeSelfOwnedReceiver(
+      std::make_unique<BluetoothSystem>(std::move(client)),
+      std::move(receiver));
 }
 
 BluetoothSystem::BluetoothSystem(mojom::BluetoothSystemClientPtr client) {
diff --git a/services/device/bluetooth/bluetooth_system.h b/services/device/bluetooth/bluetooth_system.h
index 81945980..34bf1e6 100644
--- a/services/device/bluetooth/bluetooth_system.h
+++ b/services/device/bluetooth/bluetooth_system.h
@@ -12,6 +12,7 @@
 #include "base/optional.h"
 #include "dbus/object_path.h"
 #include "device/bluetooth/dbus/bluetooth_adapter_client.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/device/public/mojom/bluetooth_system.mojom.h"
 
 namespace bluez {
@@ -24,7 +25,7 @@
 class BluetoothSystem : public mojom::BluetoothSystem,
                         public bluez::BluetoothAdapterClient::Observer {
  public:
-  static void Create(mojom::BluetoothSystemRequest request,
+  static void Create(mojo::PendingReceiver<mojom::BluetoothSystem> receiver,
                      mojom::BluetoothSystemClientPtr client);
 
   explicit BluetoothSystem(mojom::BluetoothSystemClientPtr client);
diff --git a/services/device/bluetooth/bluetooth_system_factory.cc b/services/device/bluetooth/bluetooth_system_factory.cc
index 5cfdb60f..496ca3d 100644
--- a/services/device/bluetooth/bluetooth_system_factory.cc
+++ b/services/device/bluetooth/bluetooth_system_factory.cc
@@ -23,9 +23,9 @@
 BluetoothSystemFactory::~BluetoothSystemFactory() = default;
 
 void BluetoothSystemFactory::Create(
-    mojom::BluetoothSystemRequest system_request,
+    mojo::PendingReceiver<mojom::BluetoothSystem> system_receiver,
     mojom::BluetoothSystemClientPtr system_client) {
-  BluetoothSystem::Create(std::move(system_request), std::move(system_client));
+  BluetoothSystem::Create(std::move(system_receiver), std::move(system_client));
 }
 
 }  // namespace device
diff --git a/services/device/bluetooth/bluetooth_system_factory.h b/services/device/bluetooth/bluetooth_system_factory.h
index e315e373..f6058aa 100644
--- a/services/device/bluetooth/bluetooth_system_factory.h
+++ b/services/device/bluetooth/bluetooth_system_factory.h
@@ -20,7 +20,7 @@
   ~BluetoothSystemFactory() override;
 
   // mojom::BluetoothSystemFactory
-  void Create(mojom::BluetoothSystemRequest system_request,
+  void Create(mojo::PendingReceiver<mojom::BluetoothSystem> system_receiver,
               mojom::BluetoothSystemClientPtr system_client) override;
 
  private:
diff --git a/services/device/bluetooth/bluetooth_system_unittest.cc b/services/device/bluetooth/bluetooth_system_unittest.cc
index 992e6705..d70fe2c 100644
--- a/services/device/bluetooth/bluetooth_system_unittest.cc
+++ b/services/device/bluetooth/bluetooth_system_unittest.cc
@@ -670,8 +670,8 @@
 
   // Helper methods to avoid AsyncWaiter boilerplate.
   mojom::BluetoothSystem::State GetStateAndWait(
-      const mojom::BluetoothSystemPtr& system) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+      mojom::BluetoothSystem* system) {
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     mojom::BluetoothSystem::State state;
     async_waiter.GetState(&state);
@@ -680,9 +680,9 @@
   }
 
   mojom::BluetoothSystem::SetPoweredResult SetPoweredAndWait(
-      const mojom::BluetoothSystemPtr& system,
+      mojom::BluetoothSystem* system,
       bool powered) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     mojom::BluetoothSystem::SetPoweredResult result;
     async_waiter.SetPowered(powered, &result);
@@ -691,8 +691,8 @@
   }
 
   mojom::BluetoothSystem::ScanState GetScanStateAndWait(
-      const mojom::BluetoothSystemPtr& system) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+      mojom::BluetoothSystem* system) {
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     mojom::BluetoothSystem::ScanState scan_state;
     async_waiter.GetScanState(&scan_state);
@@ -701,8 +701,8 @@
   }
 
   mojom::BluetoothSystem::StartScanResult StartScanAndWait(
-      const mojom::BluetoothSystemPtr& system) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+      mojom::BluetoothSystem* system) {
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     mojom::BluetoothSystem::StartScanResult result;
     async_waiter.StartScan(&result);
@@ -711,8 +711,8 @@
   }
 
   mojom::BluetoothSystem::StopScanResult StopScanAndWait(
-      const mojom::BluetoothSystemPtr& system) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+      mojom::BluetoothSystem* system) {
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     mojom::BluetoothSystem::StopScanResult result;
     async_waiter.StopScan(&result);
@@ -721,8 +721,8 @@
   }
 
   std::vector<mojom::BluetoothDeviceInfoPtr> GetAvailableDevicesAndWait(
-      const mojom::BluetoothSystemPtr& system) {
-    mojom::BluetoothSystemAsyncWaiter async_waiter(system.get());
+      mojom::BluetoothSystem* system) {
+    mojom::BluetoothSystemAsyncWaiter async_waiter(system);
 
     std::vector<mojom::BluetoothDeviceInfoPtr> devices;
     async_waiter.GetAvailableDevices(&devices);
@@ -740,14 +740,14 @@
   }
 
  protected:
-  mojom::BluetoothSystemPtr CreateBluetoothSystem() {
+  mojo::Remote<mojom::BluetoothSystem> CreateBluetoothSystem() {
     mojom::BluetoothSystemClientPtr client_ptr;
     system_client_binding_.Bind(mojo::MakeRequest(&client_ptr));
 
-    mojom::BluetoothSystemPtr system_ptr;
-    system_factory_->Create(mojo::MakeRequest(&system_ptr),
+    mojo::Remote<mojom::BluetoothSystem> system;
+    system_factory_->Create(system.BindNewPipeAndPassReceiver(),
                             std::move(client_ptr));
-    return system_ptr;
+    return system;
   }
 
   void ResetResults() {
@@ -776,21 +776,21 @@
 
 // Tests that the Create method for BluetoothSystemFactory works.
 TEST_F(BluetoothSystemTest, FactoryCreate) {
-  mojom::BluetoothSystemPtr system_ptr;
+  mojo::Remote<mojom::BluetoothSystem> system;
   mojo::Binding<mojom::BluetoothSystemClient> client_binding(this);
 
   mojom::BluetoothSystemClientPtr client_ptr;
   client_binding.Bind(mojo::MakeRequest(&client_ptr));
 
-  EXPECT_FALSE(system_ptr.is_bound());
+  EXPECT_FALSE(system.is_bound());
 
-  system_factory_->Create(mojo::MakeRequest(&system_ptr),
+  system_factory_->Create(system.BindNewPipeAndPassReceiver(),
                           std::move(client_ptr));
   base::RunLoop run_loop;
-  system_ptr.FlushAsyncForTesting(run_loop.QuitClosure());
+  system.FlushAsyncForTesting(run_loop.QuitClosure());
   run_loop.Run();
 
-  EXPECT_TRUE(system_ptr.is_bound());
+  EXPECT_TRUE(system.is_bound());
 }
 
 // Tests that the state is 'Unavailable' when there is no Bluetooth adapter
@@ -799,7 +799,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kUnavailable,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 }
 
@@ -811,7 +811,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 }
 
@@ -821,7 +821,8 @@
 
   auto system = CreateBluetoothSystem();
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 }
 
@@ -834,13 +835,14 @@
 
   // The adapter is initially powered off.
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Turn adapter on.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
   ResetResults();
@@ -849,7 +851,7 @@
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -862,14 +864,15 @@
   auto system = CreateBluetoothSystem();
 
     // The adapter is initially powered on.
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Remove the adapter. The state should change to Unavailable.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kUnavailable,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff,
                          mojom::BluetoothSystem::State::kUnavailable}),
             on_state_changed_states_);
@@ -879,7 +882,7 @@
   test_bluetooth_adapter_client_->SimulateAdapterAdded();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -893,7 +896,8 @@
 
   auto system = CreateBluetoothSystem();
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Remove the adapter. The state should change to Unavailable.
@@ -901,7 +905,7 @@
       kDefaultAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kUnavailable,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff,
                          mojom::BluetoothSystem::State::kUnavailable}),
             on_state_changed_states_);
@@ -912,7 +916,7 @@
       kAlternateAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -927,14 +931,16 @@
   auto system = CreateBluetoothSystem();
 
   // The default adapter is initially powered on.
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Add an alternate adapter. The state should not change.
   test_bluetooth_adapter_client_->SimulateAdapterAdded(
       kAlternateAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Remove the default adapter. We should retrieve the state from the
@@ -943,7 +949,7 @@
       kDefaultAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
   ResetResults();
@@ -952,7 +958,8 @@
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(
       true, kAlternateAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
   ResetResults();
@@ -962,7 +969,8 @@
   test_bluetooth_adapter_client_->SimulateAdapterAdded(
       kDefaultAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 }
 
@@ -975,28 +983,32 @@
   auto system = CreateBluetoothSystem();
 
   // The default adapter is initially powered on.
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Add an extra alternate adapter. The state should not change.
   test_bluetooth_adapter_client_->SimulateAdapterAdded(
       kAlternateAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Turn the alternate adapter on. The state should not change.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(
       true, kAlternateAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 
   // Turn the alternate adapter off. The state should not change.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(
       false, kAlternateAdapterObjectPathStr);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_TRUE(on_state_changed_states_.empty());
 }
 
@@ -1006,10 +1018,10 @@
 
   EXPECT_EQ(
       mojom::BluetoothSystem::SetPoweredResult::kFailedBluetoothUnavailable,
-      SetPoweredAndWait(system, false));
+      SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(
       mojom::BluetoothSystem::SetPoweredResult::kFailedBluetoothUnavailable,
-      SetPoweredAndWait(system, false));
+      SetPoweredAndWait(system.get(), false));
 }
 
 // Tests setting powered to "Off" when the adapter is "Off" already.
@@ -1022,7 +1034,7 @@
   // The adapter is initially "Off" so a call to turn it "Off" should have no
   // effect but the call should still succeed.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
 }
 
@@ -1035,7 +1047,7 @@
   // The adapter is initially "On" so a call to turn it "On" should have no
   // effect but the call should still succeed.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
 }
 
@@ -1044,16 +1056,17 @@
   test_bluetooth_adapter_client_->SimulatePoweredOnAdapter();
 
   auto system = CreateBluetoothSystem();
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
 
   // Try to power off the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_FALSE(test_bluetooth_adapter_client_->GetLastSetPoweredValue());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   ResetResults();
@@ -1062,7 +1075,7 @@
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -1077,11 +1090,11 @@
   // Try to power on the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_TRUE(test_bluetooth_adapter_client_->GetLastSetPoweredValue());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   ResetResults();
@@ -1089,7 +1102,8 @@
   // Simulate the adapter actually powering on.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
 }
@@ -1099,14 +1113,16 @@
   test_bluetooth_adapter_client_->SimulatePoweredOnAdapter();
 
   auto system = CreateBluetoothSystem();
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
 
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(false);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedUnknownReason,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_FALSE(test_bluetooth_adapter_client_->GetLastSetPoweredValue());
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning,
                          mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
@@ -1121,11 +1137,11 @@
 
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(false);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedUnknownReason,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_TRUE(test_bluetooth_adapter_client_->GetLastSetPoweredValue());
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning,
                          mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
@@ -1149,7 +1165,7 @@
                                  set_powered_run_loop.Quit();
                                }));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   ResetResults();
@@ -1158,7 +1174,7 @@
   // property of the adapter to `false` and then removes the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved();
   EXPECT_EQ(mojom::BluetoothSystem::State::kUnavailable,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff,
                          mojom::BluetoothSystem::State::kUnavailable}),
             on_state_changed_states_);
@@ -1192,7 +1208,7 @@
                            set_powered_run_loop.Quit();
                          }));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   ResetResults();
@@ -1201,7 +1217,7 @@
   // property of the adapter to `false` and then removes the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved();
   EXPECT_EQ(mojom::BluetoothSystem::State::kUnavailable,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff,
                          mojom::BluetoothSystem::State::kUnavailable}),
             on_state_changed_states_);
@@ -1222,7 +1238,8 @@
   test_bluetooth_adapter_client_->SimulatePoweredOnAdapter();
 
   auto system = CreateBluetoothSystem();
-  ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
 
   // Start powering off BT and wait for the state to change to
   // kTransitioning.
@@ -1237,7 +1254,7 @@
                          }));
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
@@ -1248,11 +1265,11 @@
 
   // Try to power off BT; should fail with kInProgress.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedInProgress,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
 
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector(), on_state_changed_states_);
 
   ResetResults();
@@ -1263,7 +1280,7 @@
   run_loop.Run();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
@@ -1276,7 +1293,7 @@
 
   auto system = CreateBluetoothSystem();
   ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
 
   // Start powering on BT and wait for the state to change to
   // kTransitioning.
@@ -1290,7 +1307,7 @@
                                }));
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
@@ -1301,11 +1318,11 @@
 
   // Try to power off BT; should fail with kInProgress.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedInProgress,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
 
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector(), on_state_changed_states_);
 
   ResetResults();
@@ -1315,7 +1332,8 @@
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
   run_loop.Run();
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
@@ -1327,7 +1345,8 @@
   test_bluetooth_adapter_client_->SimulatePoweredOnAdapter();
 
   auto system = CreateBluetoothSystem();
-  ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
 
   // Start powering off BT and wait for the state to change to
   // kTransitioning.
@@ -1342,7 +1361,7 @@
                          }));
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
@@ -1353,11 +1372,11 @@
 
   // Try to power on BT; should fail with kInProgress.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedInProgress,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
 
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector(), on_state_changed_states_);
 
   ResetResults();
@@ -1368,7 +1387,7 @@
   run_loop.Run();
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
@@ -1381,7 +1400,7 @@
 
   auto system = CreateBluetoothSystem();
   ASSERT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
 
   // Start powering on BT and wait for the state to change to
   // kTransitioning.
@@ -1395,7 +1414,7 @@
                                }));
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kTransitioning}),
             on_state_changed_states_);
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
@@ -1406,11 +1425,11 @@
 
   // Try to power on BT; should fail with kInProgress.
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kFailedInProgress,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
 
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetSetPoweredCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector(), on_state_changed_states_);
 
   ResetResults();
@@ -1420,7 +1439,8 @@
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
   run_loop.Run();
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
@@ -1432,7 +1452,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 }
 
@@ -1444,7 +1464,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 }
 
@@ -1456,7 +1476,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 }
 
@@ -1468,14 +1488,14 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // Adapter starts scanning.
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kScanning}),
             on_scan_state_changed_states_);
   ResetResults();
@@ -1484,7 +1504,7 @@
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
 }
@@ -1499,13 +1519,13 @@
 
   // The adapter is initially scanning.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
 
   // Remove the adapter. The state should change to not scanning.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
   ResetResults();
@@ -1514,14 +1534,14 @@
   test_bluetooth_adapter_client_->SimulatePoweredOnAdapter();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // The adapter starts scanning again.
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kScanning}),
             on_scan_state_changed_states_);
 }
@@ -1539,14 +1559,14 @@
 
   // The adapter is initially scanning.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
 
   // Remove the adapter. The state should change to kNotScanning.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved(
       kDefaultAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
   ResetResults();
@@ -1556,7 +1576,7 @@
       kAlternateAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // The new adapter starts scanning.
@@ -1564,7 +1584,7 @@
       true, kAlternateAdapterObjectPathStr);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kScanning}),
             on_scan_state_changed_states_);
 }
@@ -1575,7 +1595,7 @@
 
   EXPECT_EQ(
       mojom::BluetoothSystem::StartScanResult::kFailedBluetoothUnavailable,
-      StartScanAndWait(system));
+      StartScanAndWait(system.get()));
 }
 
 // Tests that StartScan fails if the adapter is "Off".
@@ -1587,7 +1607,7 @@
 
   EXPECT_EQ(
       mojom::BluetoothSystem::StartScanResult::kFailedBluetoothUnavailable,
-      StartScanAndWait(system));
+      StartScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStartDiscoveryCallCount());
 }
 
@@ -1597,23 +1617,23 @@
 
   auto system = CreateBluetoothSystem();
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
 
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::StartScanResult::kSuccess,
-            StartScanAndWait(system));
+            StartScanAndWait(system.get()));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetStartDiscoveryCallCount());
 
   // TODO(ortuno): Test for kTransitioning once implemented.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector(), on_scan_state_changed_states_);
   ResetResults();
 
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kScanning}),
             on_scan_state_changed_states_);
 }
@@ -1625,16 +1645,16 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
 
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(false);
   EXPECT_EQ(mojom::BluetoothSystem::StartScanResult::kFailedUnknownReason,
-            StartScanAndWait(system));
+            StartScanAndWait(system.get()));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetStartDiscoveryCallCount());
 
   // TODO(ortuno): Test for kTransitioning once implemented.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector(), on_scan_state_changed_states_);
 }
 
@@ -1648,24 +1668,25 @@
   // Start powering on the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   ResetResults();
 
   // Start scan should fail without sending the command to the adapter.
   EXPECT_EQ(
       mojom::BluetoothSystem::StartScanResult::kFailedBluetoothUnavailable,
-      StartScanAndWait(system));
+      StartScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStartDiscoveryCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // Finish powering on the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
 }
@@ -1679,25 +1700,25 @@
   // Start powering off the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   ResetResults();
 
   // Start scan should fail without sending the command to the adapter.
   EXPECT_EQ(
       mojom::BluetoothSystem::StartScanResult::kFailedBluetoothUnavailable,
-      StartScanAndWait(system));
+      StartScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStartDiscoveryCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // Finish powering off the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -1707,7 +1728,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kFailedBluetoothUnavailable,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
 }
 
 // Tests that StopScan fails if the adapter is "Off".
@@ -1718,7 +1739,7 @@
   auto system = CreateBluetoothSystem();
 
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kFailedBluetoothUnavailable,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStopDiscoveryCallCount());
 }
 
@@ -1730,27 +1751,27 @@
 
   // Successfully start scanning.
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
-  StartScanAndWait(system);
+  StartScanAndWait(system.get());
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   ResetResults();
 
   test_bluetooth_adapter_client_->SetNextStopDiscoveryResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kSuccess,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetStopDiscoveryCallCount());
 
   // TODO(ortuno): Test for kTransitioning once implemented.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector(), on_scan_state_changed_states_);
   ResetResults();
 
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
 }
@@ -1763,20 +1784,20 @@
 
   // Successfully start scanning.
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
-  StartScanAndWait(system);
+  StartScanAndWait(system.get());
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   ResetResults();
 
   test_bluetooth_adapter_client_->SetNextStopDiscoveryResponse(false);
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kFailedUnknownReason,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
   EXPECT_EQ(1u, test_bluetooth_adapter_client_->GetStopDiscoveryCallCount());
 
   // TODO(ortuno): Test for kTransitioning once implemented.
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector(), on_scan_state_changed_states_);
 }
 
@@ -1790,23 +1811,24 @@
   // Start powering on the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, true));
+            SetPoweredAndWait(system.get(), true));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   ResetResults();
 
   // Stop scan should fail without sending the command to the adapter.
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kFailedBluetoothUnavailable,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStopDiscoveryCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // Finish powering on the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(true);
 
-  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn, GetStateAndWait(system));
+  EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOn,
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOn}),
             on_state_changed_states_);
 }
@@ -1819,32 +1841,32 @@
   // Start scanning.
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::StartScanResult::kSuccess,
-            StartScanAndWait(system));
+            StartScanAndWait(system.get()));
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
 
   // Start powering off the adapter.
   test_bluetooth_adapter_client_->SetNextSetPoweredResponse(true);
   EXPECT_EQ(mojom::BluetoothSystem::SetPoweredResult::kSuccess,
-            SetPoweredAndWait(system, false));
+            SetPoweredAndWait(system.get(), false));
   EXPECT_EQ(mojom::BluetoothSystem::State::kTransitioning,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   ResetResults();
 
   // Stop scan should fail without sending the command to the adapter.
   EXPECT_EQ(mojom::BluetoothSystem::StopScanResult::kFailedBluetoothUnavailable,
-            StopScanAndWait(system));
+            StopScanAndWait(system.get()));
   EXPECT_EQ(0u, test_bluetooth_adapter_client_->GetStopDiscoveryCallCount());
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_TRUE(on_scan_state_changed_states_.empty());
 
   // Finish powering off the adapter.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::State::kPoweredOff,
-            GetStateAndWait(system));
+            GetStateAndWait(system.get()));
   EXPECT_EQ(StateVector({mojom::BluetoothSystem::State::kPoweredOff}),
             on_state_changed_states_);
 }
@@ -1858,17 +1880,17 @@
 
   // Start scanning.
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
-  StartScanAndWait(system);
+  StartScanAndWait(system.get());
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
   ASSERT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   ResetResults();
 
   // Remove the adapter. Scan state should change to kNotScanning.
   test_bluetooth_adapter_client_->SimulateAdapterRemoved();
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
 }
@@ -1882,17 +1904,17 @@
 
   // Start scanning.
   test_bluetooth_adapter_client_->SetNextStartDiscoveryResponse(true);
-  StartScanAndWait(system);
+  StartScanAndWait(system.get());
   test_bluetooth_adapter_client_->SimulateAdapterDiscoveringStateChanged(true);
   ASSERT_EQ(mojom::BluetoothSystem::ScanState::kScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   ResetResults();
 
   // Power off the adapter. Scan state should change to kNotScanning.
   test_bluetooth_adapter_client_->SimulateAdapterPowerStateChanged(false);
 
   EXPECT_EQ(mojom::BluetoothSystem::ScanState::kNotScanning,
-            GetScanStateAndWait(system));
+            GetScanStateAndWait(system.get()));
   EXPECT_EQ(ScanStateVector({mojom::BluetoothSystem::ScanState::kNotScanning}),
             on_scan_state_changed_states_);
 }
@@ -1922,7 +1944,7 @@
     test_bluetooth_device_client_->SimulateDeviceAdded(fake_options);
   }
 
-  auto devices = GetAvailableDevicesAndWait(system);
+  auto devices = GetAvailableDevicesAndWait(system.get());
   ASSERT_EQ(2u, devices.size());
 
   const std::array<uint8_t, 6> expected_address = {0x00, 0x11, 0x22,
@@ -1953,7 +1975,7 @@
     test_bluetooth_device_client_->SimulateDeviceAdded(fake_options);
   }
 
-  auto devices = GetAvailableDevicesAndWait(system);
+  auto devices = GetAvailableDevicesAndWait(system.get());
   ASSERT_EQ(2u, devices.size());
 
   mojom::BluetoothDeviceInfoPtr device_with_name;
@@ -1985,7 +2007,7 @@
 
   auto system = CreateBluetoothSystem();
 
-  auto devices = GetAvailableDevicesAndWait(system);
+  auto devices = GetAvailableDevicesAndWait(system.get());
   ASSERT_EQ(1u, devices.size());
 
   EXPECT_EQ(kDefaultDeviceAddressArray, devices[0]->address);
diff --git a/services/device/public/mojom/bluetooth_system.mojom b/services/device/public/mojom/bluetooth_system.mojom
index 5c8f5dd2..3f958b33 100644
--- a/services/device/public/mojom/bluetooth_system.mojom
+++ b/services/device/public/mojom/bluetooth_system.mojom
@@ -72,7 +72,8 @@
 
 // Factory to get an instance of the BluetoothSystem interface.
 interface BluetoothSystemFactory {
-  Create(BluetoothSystem& system, BluetoothSystemClient system_client);
+  Create(pending_receiver<BluetoothSystem> system,
+         BluetoothSystemClient system_client);
 };
 
 // High level interface targeted towards UI level components that:
diff --git a/services/device/serial/serial_device_enumerator_win.cc b/services/device/serial/serial_device_enumerator_win.cc
index dc80f54..ee8b9ff 100644
--- a/services/device/serial/serial_device_enumerator_win.cc
+++ b/services/device/serial/serial_device_enumerator_win.cc
@@ -17,6 +17,7 @@
 #include <utility>
 
 #include "base/metrics/histogram_functions.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -89,11 +90,6 @@
          base::HexStringToUInt(product_id_str, product_id);
 }
 
-// Returns value clamped to the range of [min, max].
-int Clamp(int value, int min, int max) {
-  return std::min(std::max(value, min), max);
-}
-
 }  // namespace
 
 // static
@@ -109,8 +105,9 @@
   std::vector<mojom::SerialPortInfoPtr> devices = GetDevicesNew();
   std::vector<mojom::SerialPortInfoPtr> old_devices = GetDevicesOld();
 
-  base::UmaHistogramSparse("Hardware.Serial.NewMinusOldDeviceListSize",
-                           Clamp(devices.size() - old_devices.size(), -10, 10));
+  base::UmaHistogramSparse(
+      "Hardware.Serial.NewMinusOldDeviceListSize",
+      base::ClampToRange<int>(devices.size() - old_devices.size(), -10, 10));
 
   // Add devices found from both the new and old methods of enumeration. If a
   // device is found using both the new and the old enumeration method, then we
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc
index 8e05ce7..e051b961 100644
--- a/services/network/cors/cors_url_loader.cc
+++ b/services/network/cors/cors_url_loader.cc
@@ -219,8 +219,9 @@
   }
 
   response_tainting_ = CalculateResponseTainting(
-      request_.url, request_.mode, request_.request_initiator, fetch_cors_flag_,
-      tainted_, origin_access_list_);
+      request_.url, request_.mode, request_.request_initiator,
+      request_.isolated_world_origin, fetch_cors_flag_, tainted_,
+      origin_access_list_);
   network_loader_->FollowRedirect(removed_headers, modified_headers, new_url);
 }
 
@@ -442,8 +443,9 @@
   }
 
   response_tainting_ = CalculateResponseTainting(
-      request_.url, request_.mode, request_.request_initiator, fetch_cors_flag_,
-      tainted_, origin_access_list_);
+      request_.url, request_.mode, request_.request_initiator,
+      request_.isolated_world_origin, fetch_cors_flag_, tainted_,
+      origin_access_list_);
 
   // Note that even when |NeedsPreflight(request_)| holds we don't make a
   // preflight request when |fetch_cors_flag_| is false (e.g., when the origin
@@ -527,15 +529,13 @@
   }
 
   // The source origin and destination URL pair may be in the allow list.
-  switch (origin_access_list_->CheckAccessState(*request_.request_initiator,
-                                                request_.url)) {
+  switch (origin_access_list_->CheckAccessState(request_)) {
     case OriginAccessList::AccessState::kAllowed:
       return;
     case OriginAccessList::AccessState::kBlocked:
       break;
     case OriginAccessList::AccessState::kNotListed:
-      if (factory_bound_origin_access_list_->CheckAccessState(
-              *request_.request_initiator, request_.url) ==
+      if (factory_bound_origin_access_list_->CheckAccessState(request_) ==
           OriginAccessList::AccessState::kAllowed) {
         return;
       }
@@ -569,6 +569,7 @@
     const GURL& url,
     mojom::RequestMode request_mode,
     const base::Optional<url::Origin>& origin,
+    const base::Optional<url::Origin>& isolated_world_origin,
     bool cors_flag,
     bool tainted_origin,
     const OriginAccessList* origin_access_list) {
@@ -586,10 +587,26 @@
     return mojom::FetchResponseType::kBasic;
   }
 
+  // OriginAccessList is in practice used to disable CORS for Chrome Extensions.
+  // The extension origin can be found in either:
+  // 1) |isolated_world_origin| (if this is a request from a content
+  //    script;  in this case there is no point looking at (2) below.
+  // 2) |origin| (if this is a request from an extension
+  //    background page or from other extension frames).
+  //
+  // Note that similar code is present in OriginAccessList::CheckAccessState.
+  //
+  // TODO(lukasza): https://crbug.com/936310 and https://crbug.com/920638:
+  // Once 1) there is no global OriginAccessList and 2) per-factory
+  // OriginAccessList is only populated for URLLoaderFactory used by allowlisted
+  // content scripts, then 3) there should no longer be a need to use origins as
+  // a key in an OriginAccessList.
+  const url::Origin& source_origin = isolated_world_origin.value_or(*origin);
+
   if (request_mode == mojom::RequestMode::kNoCors) {
     if (tainted_origin ||
         (!origin->IsSameOriginWith(url::Origin::Create(url)) &&
-         origin_access_list->CheckAccessState(*origin, url) !=
+         origin_access_list->CheckAccessState(source_origin, url) !=
              OriginAccessList::AccessState::kAllowed)) {
       return mojom::FetchResponseType::kOpaque;
     }
diff --git a/services/network/cors/cors_url_loader.h b/services/network/cors/cors_url_loader.h
index c9b784b..dd81be7 100644
--- a/services/network/cors/cors_url_loader.h
+++ b/services/network/cors/cors_url_loader.h
@@ -87,6 +87,7 @@
       const GURL& url,
       mojom::RequestMode request_mode,
       const base::Optional<url::Origin>& origin,
+      const base::Optional<url::Origin>& isolated_world_origin,
       bool cors_flag,
       bool tainted_origin,
       const OriginAccessList* origin_access_list);
diff --git a/services/network/cors/cors_url_loader_factory_unittest.cc b/services/network/cors/cors_url_loader_factory_unittest.cc
index d8e0746..3488e222 100644
--- a/services/network/cors/cors_url_loader_factory_unittest.cc
+++ b/services/network/cors/cors_url_loader_factory_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
@@ -59,7 +60,8 @@
     context_params->initial_proxy_config =
         net::ProxyConfigWithAnnotation::CreateDirect();
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
 
     auto factory_params = network::mojom::URLLoaderFactoryParams::New();
@@ -95,7 +97,7 @@
   ResourceScheduler resource_scheduler_;
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
 
   // CorsURLLoaderFactory instance under tests.
   std::unique_ptr<mojom::URLLoaderFactory> cors_url_loader_factory_;
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc
index 25f4f7c..80afcfc 100644
--- a/services/network/cors/cors_url_loader_unittest.cc
+++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -22,6 +22,7 @@
 #include "base/test/task_environment.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -163,7 +164,8 @@
         net::ProxyConfigWithAnnotation::CreateDirect();
     context_params->cors_exempt_header_list.push_back(kTestCorsExemptHeader);
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
 
     ResetFactory(base::nullopt, kRendererProcessId);
@@ -359,7 +361,7 @@
   ResourceScheduler resource_scheduler_;
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
 
   // CorsURLLoaderFactory instance under tests.
   std::unique_ptr<mojom::URLLoaderFactory> cors_url_loader_factory_;
@@ -1470,86 +1472,86 @@
   // CORS flag is false, same-origin request
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kSameOrigin, origin, false, false,
-                &origin_access_list));
+                same_origin_url, RequestMode::kSameOrigin, origin,
+                base::nullopt, false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNoCors, origin, false, false,
-                &origin_access_list));
-  EXPECT_EQ(FetchResponseType::kBasic,
-            CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kCors, origin, false, false,
-                &origin_access_list));
-  EXPECT_EQ(FetchResponseType::kBasic,
-            CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
+                same_origin_url, RequestMode::kNoCors, origin, base::nullopt,
                 false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNavigate, origin, false, false,
-                &origin_access_list));
+                same_origin_url, RequestMode::kCors, origin, base::nullopt,
+                false, false, &origin_access_list));
+  EXPECT_EQ(FetchResponseType::kBasic,
+            CorsURLLoader::CalculateResponseTainting(
+                same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
+                base::nullopt, false, false, &origin_access_list));
+  EXPECT_EQ(FetchResponseType::kBasic,
+            CorsURLLoader::CalculateResponseTainting(
+                same_origin_url, RequestMode::kNavigate, origin, base::nullopt,
+                false, false, &origin_access_list));
 
   // CORS flag is false, cross-origin request
   EXPECT_EQ(FetchResponseType::kOpaque,
             CorsURLLoader::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kNoCors, origin, false, false,
-                &origin_access_list));
+                cross_origin_url, RequestMode::kNoCors, origin, base::nullopt,
+                false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kNavigate, origin, false, false,
-                &origin_access_list));
+                cross_origin_url, RequestMode::kNavigate, origin, base::nullopt,
+                false, false, &origin_access_list));
 
   // CORS flag is true, same-origin request
   EXPECT_EQ(FetchResponseType::kCors,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kCors, origin, true, false,
-                &origin_access_list));
+                same_origin_url, RequestMode::kCors, origin, base::nullopt,
+                true, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kCors,
             CorsURLLoader::CalculateResponseTainting(
                 same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
-                true, false, &origin_access_list));
+                base::nullopt, true, false, &origin_access_list));
 
   // CORS flag is true, cross-origin request
   EXPECT_EQ(FetchResponseType::kCors,
             CorsURLLoader::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kCors, origin, true, false,
-                &origin_access_list));
+                cross_origin_url, RequestMode::kCors, origin, base::nullopt,
+                true, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kCors,
             CorsURLLoader::CalculateResponseTainting(
                 cross_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
-                true, false, &origin_access_list));
+                base::nullopt, true, false, &origin_access_list));
 
   // Origin is not provided.
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNoCors, no_origin, false, false,
-                &origin_access_list));
+                same_origin_url, RequestMode::kNoCors, no_origin, base::nullopt,
+                false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNavigate, no_origin, false,
-                false, &origin_access_list));
+                same_origin_url, RequestMode::kNavigate, no_origin,
+                base::nullopt, false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kNoCors, no_origin, false, false,
-                &origin_access_list));
+                cross_origin_url, RequestMode::kNoCors, no_origin,
+                base::nullopt, false, false, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kNavigate, no_origin, false,
-                false, &origin_access_list));
+                cross_origin_url, RequestMode::kNavigate, no_origin,
+                base::nullopt, false, false, &origin_access_list));
 
   // Tainted origin.
   EXPECT_EQ(FetchResponseType::kOpaque,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNoCors, origin, false, true,
-                &origin_access_list));
-  EXPECT_EQ(FetchResponseType::kBasic,
-            CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
+                same_origin_url, RequestMode::kNoCors, origin, base::nullopt,
                 false, true, &origin_access_list));
   EXPECT_EQ(FetchResponseType::kBasic,
             CorsURLLoader::CalculateResponseTainting(
-                same_origin_url, RequestMode::kNavigate, origin, false, true,
-                &origin_access_list));
+                same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
+                base::nullopt, false, true, &origin_access_list));
+  EXPECT_EQ(FetchResponseType::kBasic,
+            CorsURLLoader::CalculateResponseTainting(
+                same_origin_url, RequestMode::kNavigate, origin, base::nullopt,
+                false, true, &origin_access_list));
 }
 
 TEST_F(CorsURLLoaderTest, RequestWithHostHeaderFails) {
diff --git a/services/network/cors/preflight_controller_unittest.cc b/services/network/cors/preflight_controller_unittest.cc
index e878ae5..dbc192f 100644
--- a/services/network/cors/preflight_controller_unittest.cc
+++ b/services/network/cors/preflight_controller_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -229,14 +230,14 @@
         std::move(network_service_request), nullptr /* net_log */);
 
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_ptr_),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         mojom::NetworkContextParams::New());
 
     network::mojom::URLLoaderFactoryParamsPtr params =
         network::mojom::URLLoaderFactoryParams::New();
     params->process_id = mojom::kBrowserProcessId;
     params->is_corb_enabled = false;
-    network_context_ptr_->CreateURLLoaderFactory(
+    network_context_remote_->CreateURLLoaderFactory(
         mojo::MakeRequest(&url_loader_factory_ptr_), std::move(params));
   }
 
@@ -311,7 +312,7 @@
   std::unique_ptr<base::RunLoop> run_loop_;
 
   std::unique_ptr<mojom::NetworkService> network_service_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   mojom::URLLoaderFactoryPtr url_loader_factory_ptr_;
 
   net::test_server::EmbeddedTestServer test_server_;
diff --git a/services/network/http_cache_data_counter_unittest.cc b/services/network/http_cache_data_counter_unittest.cc
index dd28dc2..e5c6bf54 100644
--- a/services/network/http_cache_data_counter_unittest.cc
+++ b/services/network/http_cache_data_counter_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/cache_type.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
@@ -180,7 +181,8 @@
     context_params->http_cache_path = cache_dir_.GetPath();
 
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
   }
 
@@ -189,8 +191,9 @@
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
 
-  // Stores the NetworkContextPtr of the most recently created NetworkContext.
-  mojom::NetworkContextPtr network_context_ptr_;
+  // Stores the mojo::Remote<mojom::NetworkContext> of the most recently created
+  // NetworkContext.
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   disk_cache::Backend* backend_ = nullptr;
 };
 
@@ -221,13 +224,14 @@
   std::unique_ptr<NetworkService> network_service(
       NetworkService::CreateForTesting());
   std::unique_ptr<NetworkContext> network_context;
-  mojom::NetworkContextPtr network_context_ptr;
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
 
   mojom::NetworkContextParamsPtr context_params = CreateContextParams();
   context_params->http_cache_enabled = false;
 
   network_context = std::make_unique<NetworkContext>(
-      network_service.get(), mojo::MakeRequest(&network_context_ptr),
+      network_service.get(),
+      network_context_remote.BindNewPipeAndPassReceiver(),
       std::move(context_params));
   auto result = HttpCacheDataCounterTest::CountBetween(
       network_context.get(), base::Time(), base::Time::Max());
diff --git a/services/network/http_cache_data_remover_unittest.cc b/services/network/http_cache_data_remover_unittest.cc
index 28e82908..1952008 100644
--- a/services/network/http_cache_data_remover_unittest.cc
+++ b/services/network/http_cache_data_remover_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/cache_type.h"
 #include "net/base/features.h"
 #include "net/base/net_errors.h"
@@ -150,9 +150,10 @@
   void InitNetworkContext() {
     mojom::NetworkContextParamsPtr context_params = CreateContextParams();
     context_params->http_cache_enabled = true;
-
+    network_context_remote_.reset();
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
   }
 
@@ -160,8 +161,9 @@
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
 
-  // Stores the NetworkContextPtr of the most recently created NetworkContext.
-  mojom::NetworkContextPtr network_context_ptr_;
+  // Stores the mojo::Remote<NetworkContext> of the most recently created
+  // NetworkContext.
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   disk_cache::Backend* backend_ = nullptr;
 
  private:
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 52e0803..ac82d4c 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -18,6 +18,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
+#include "base/numerics/ranges.h"
 #include "base/task/post_task.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
@@ -533,7 +534,7 @@
   int max_limit = 99;
   int min_limit = net::ClientSocketPoolManager::max_sockets_per_group(
       net::HttpNetworkSession::NORMAL_SOCKET_POOL);
-  new_limit = std::max(std::min(new_limit, max_limit), min_limit);
+  new_limit = base::ClampToRange(new_limit, min_limit, max_limit);
 
   // Assign the global limit.
   net::ClientSocketPoolManager::set_max_sockets_per_proxy_server(
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index dfe2ef19..754acca 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -23,6 +23,7 @@
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/escape.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
@@ -109,8 +110,8 @@
 // Test shutdown in the case a NetworkContext is destroyed before the
 // NetworkService.
 TEST_F(NetworkServiceTest, CreateAndDestroyContext) {
-  mojom::NetworkContextPtr network_context;
-  service()->CreateNetworkContext(mojo::MakeRequest(&network_context),
+  mojo::Remote<mojom::NetworkContext> network_context;
+  service()->CreateNetworkContext(network_context.BindNewPipeAndPassReceiver(),
                                   CreateContextParams());
   network_context.reset();
   // Make sure the NetworkContext is destroyed.
@@ -121,11 +122,11 @@
 // NetworkService is destroyed. The service should destroy the NetworkContext
 // itself.
 TEST_F(NetworkServiceTest, DestroyingServiceDestroysContext) {
-  mojom::NetworkContextPtr network_context;
-  service()->CreateNetworkContext(mojo::MakeRequest(&network_context),
+  mojo::Remote<mojom::NetworkContext> network_context;
+  service()->CreateNetworkContext(network_context.BindNewPipeAndPassReceiver(),
                                   CreateContextParams());
   base::RunLoop run_loop;
-  network_context.set_connection_error_handler(run_loop.QuitClosure());
+  network_context.set_disconnect_handler(run_loop.QuitClosure());
   DestroyService();
 
   // Destroying the service should destroy the context, causing a connection
@@ -137,8 +138,8 @@
   mojom::NetworkContextParamsPtr params = CreateContextParams();
   params->cookie_path = base::FilePath();
   params->enable_encrypted_cookies = false;
-  mojom::NetworkContextPtr network_context;
-  service()->CreateNetworkContext(mojo::MakeRequest(&network_context),
+  mojo::Remote<mojom::NetworkContext> network_context;
+  service()->CreateNetworkContext(network_context.BindNewPipeAndPassReceiver(),
                                   std::move(params));
   network_context.reset();
   // Make sure the NetworkContext is destroyed.
@@ -160,10 +161,10 @@
 #endif  // BUILDFLAG(USE_KERBEROS)
 
 TEST_F(NetworkServiceTest, AuthDefaultParams) {
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerRegistryFactory* auth_handler_factory =
       reinterpret_cast<net::HttpAuthHandlerRegistryFactory*>(
           network_context.url_request_context()->http_auth_handler_factory());
@@ -203,10 +204,10 @@
   auth_params->supported_schemes.push_back("ntlm");
   service()->SetUpHttpAuth(std::move(auth_params));
 
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerRegistryFactory* auth_handler_factory =
       reinterpret_cast<net::HttpAuthHandlerRegistryFactory*>(
           network_context.url_request_context()->http_auth_handler_factory());
@@ -223,10 +224,10 @@
   // An empty list means to support no schemes.
   service()->SetUpHttpAuth(mojom::HttpAuthStaticParams::New());
 
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerRegistryFactory* auth_handler_factory =
       reinterpret_cast<net::HttpAuthHandlerRegistryFactory*>(
           network_context.url_request_context()->http_auth_handler_factory());
@@ -246,10 +247,10 @@
   auth_params->gssapi_library_name = kGssapiLibraryName;
   service()->SetUpHttpAuth(std::move(auth_params));
 
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   ASSERT_TRUE(GetNegotiateFactory(&network_context));
   EXPECT_EQ(kGssapiLibraryName,
             GetNegotiateFactory(&network_context)->GetLibraryNameForTesting());
@@ -264,10 +265,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the allowlist.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -314,10 +315,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the allowlist.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -352,10 +353,10 @@
 
 TEST_F(NetworkServiceTest, DelegateByKdcPolicy) {
   // Create a network context, which should use default value.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -382,10 +383,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the setting.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -418,10 +419,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the setting.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -622,10 +623,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the setting.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -661,10 +662,10 @@
   service()->ConfigureHttpAuthPrefs(std::move(auth_params));
 
   // Create a network context, which should reflect the setting.
-  mojom::NetworkContextPtr network_context_ptr;
-  NetworkContext network_context(service(),
-                                 mojo::MakeRequest(&network_context_ptr),
-                                 CreateContextParams());
+  mojo::Remote<mojom::NetworkContext> network_context_remote;
+  NetworkContext network_context(
+      service(), network_context_remote.BindNewPipeAndPassReceiver(),
+      CreateContextParams());
   net::HttpAuthHandlerFactory* auth_handler_factory =
       network_context.url_request_context()->http_auth_handler_factory();
   ASSERT_TRUE(auth_handler_factory);
@@ -736,8 +737,9 @@
   void CreateNetworkContext() {
     mojom::NetworkContextParamsPtr context_params =
         mojom::NetworkContextParams::New();
-    network_service_->CreateNetworkContext(mojo::MakeRequest(&network_context_),
-                                           std::move(context_params));
+    network_service_->CreateNetworkContext(
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
   }
 
   void LoadURL(const GURL& url, int options = mojom::kURLLoadOptionNone) {
@@ -783,7 +785,7 @@
   net::EmbeddedTestServer test_server_;
   std::unique_ptr<TestURLLoaderClient> client_;
   mojom::NetworkServicePtr network_service_;
-  mojom::NetworkContextPtr network_context_;
+  mojo::Remote<mojom::NetworkContext> network_context_;
   mojom::URLLoaderPtr loader_;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkServiceTestWithService);
@@ -1231,8 +1233,8 @@
   mojom::NetworkContextParamsPtr context_params = CreateContextParams();
   context_params->primary_network_context = true;
 
-  network_service_->CreateNetworkContext(mojo::MakeRequest(&network_context_),
-                                         std::move(context_params));
+  network_service_->CreateNetworkContext(
+      network_context_.BindNewPipeAndPassReceiver(), std::move(context_params));
 
   net::SpawnedTestServer::SSLOptions ssl_options(
       net::SpawnedTestServer::SSLOptions::CERT_AUTO_AIA_INTERMEDIATE);
@@ -1261,16 +1263,16 @@
        DestroyingPrimaryNetworkContextDestroysOtherContexts) {
   mojom::NetworkContextParamsPtr context_params = CreateContextParams();
   context_params->primary_network_context = true;
-  mojom::NetworkContextPtr cert_validating_network_context;
+  mojo::Remote<mojom::NetworkContext> cert_validating_network_context;
   network_service_->CreateNetworkContext(
-      mojo::MakeRequest(&cert_validating_network_context),
+      cert_validating_network_context.BindNewPipeAndPassReceiver(),
       std::move(context_params));
 
   base::RunLoop run_loop;
-  mojom::NetworkContextPtr network_context;
-  network_service_->CreateNetworkContext(mojo::MakeRequest(&network_context),
-                                         CreateContextParams());
-  network_context.set_connection_error_handler(run_loop.QuitClosure());
+  mojo::Remote<mojom::NetworkContext> network_context;
+  network_service_->CreateNetworkContext(
+      network_context.BindNewPipeAndPassReceiver(), CreateContextParams());
+  network_context.set_disconnect_handler(run_loop.QuitClosure());
 
   // Wait until the new NetworkContext has been created, so it's not created
   // after the primary NetworkContext is destroyed.
@@ -1280,7 +1282,7 @@
   // |network_context| as well.
   cert_validating_network_context.reset();
   run_loop.Run();
-  EXPECT_TRUE(network_context.encountered_error());
+  EXPECT_FALSE(network_context.is_connected());
 }
 
 TEST_F(NetworkServiceTestWithService, GetDnsConfigChangeManager) {
@@ -1441,8 +1443,9 @@
   void CreateNetworkContext() {
     mojom::NetworkContextParamsPtr context_params =
         mojom::NetworkContextParams::New();
-    service()->CreateNetworkContext(mojo::MakeRequest(&network_context_),
-                                    std::move(context_params));
+    service()->CreateNetworkContext(
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
   }
 
   void LoadURL(const GURL& url, int options = mojom::kURLLoadOptionNone) {
@@ -1513,7 +1516,7 @@
 
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
   std::unique_ptr<TestURLLoaderClient> client_;
-  mojom::NetworkContextPtr network_context_;
+  mojo::Remote<mojom::NetworkContext> network_context_;
   mojom::URLLoaderPtr loader_;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkServiceNetworkDelegateTest);
diff --git a/services/network/origin_policy/origin_policy_fetcher_unittest.cc b/services/network/origin_policy/origin_policy_fetcher_unittest.cc
index 16898f9..b367fca 100644
--- a/services/network/origin_policy/origin_policy_fetcher_unittest.cc
+++ b/services/network/origin_policy/origin_policy_fetcher_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/strings/strcat.h"
 #include "base/test/gtest_util.h"
 #include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/http/http_status_code.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -42,7 +43,8 @@
     context_params->initial_proxy_config =
         net::ProxyConfigWithAnnotation::CreateDirect();
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
 
     mojom::URLLoaderFactoryParamsPtr params =
@@ -131,7 +133,7 @@
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
 
   net::test_server::EmbeddedTestServer test_server_;
diff --git a/services/network/origin_policy/origin_policy_manager_unittest.cc b/services/network/origin_policy/origin_policy_manager_unittest.cc
index 05dbb4ba..3b3d9a6 100644
--- a/services/network/origin_policy/origin_policy_manager_unittest.cc
+++ b/services/network/origin_policy/origin_policy_manager_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/strings/strcat.h"
 #include "base/test/gtest_util.h"
 #include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/http/http_status_code.h"
 #include "net/http/http_util.h"
 #include "net/reporting/reporting_policy.h"
@@ -46,7 +47,8 @@
     context_params->initial_proxy_config =
         net::ProxyConfigWithAnnotation::CreateDirect();
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(context_params));
     manager_ = std::make_unique<OriginPolicyManager>(network_context_.get());
 
@@ -119,7 +121,7 @@
 
   std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkContext> network_context_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   std::unique_ptr<OriginPolicyManager> manager_;
   base::RunLoop response_run_loop;
   net::test_server::EmbeddedTestServer test_server_;
diff --git a/services/network/public/cpp/cors/origin_access_list.cc b/services/network/public/cpp/cors/origin_access_list.cc
index a60b0ae..c94b902 100644
--- a/services/network/public/cpp/cors/origin_access_list.cc
+++ b/services/network/public/cpp/cors/origin_access_list.cc
@@ -4,6 +4,7 @@
 
 #include "services/network/public/cpp/cors/origin_access_list.h"
 
+#include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/mojom/cors_origin_pattern.mojom.h"
 
 namespace network {
@@ -94,6 +95,29 @@
                                                      : AccessState::kBlocked;
 }
 
+OriginAccessList::AccessState OriginAccessList::CheckAccessState(
+    const ResourceRequest& request) const {
+  // OriginAccessList is in practice used to disable CORS for Chrome Extensions.
+  // The extension origin can be found in either:
+  // 1) |request.isolated_world_origin| (if this is a request from a content
+  //    script;  in this case there is no point looking at (2) below.
+  // 2) |request.request_initiator| (if this is a request from an extension
+  //    background page or from other extension frames).
+  //
+  // Note that similar code is also in CorsURLLoader::CalculateResponseTainting.
+  //
+  // TODO(lukasza): https://crbug.com/936310 and https://crbug.com/920638:
+  // Once 1) there is no global OriginAccessList and 2) per-factory
+  // OriginAccessList is only populated for URLLoaderFactory used by allowlisted
+  // content scripts, then 3) there should no longer be a need to use origins as
+  // a key in an OriginAccessList.
+  DCHECK(request.request_initiator.has_value());
+  const url::Origin& source_origin =
+      request.isolated_world_origin.value_or(*request.request_initiator);
+
+  return CheckAccessState(source_origin, request.url);
+}
+
 std::vector<mojo::StructPtr<mojom::CorsOriginAccessPatterns>>
 OriginAccessList::CreateCorsOriginAccessPatternsList() const {
   std::vector<mojom::CorsOriginAccessPatternsPtr> access_patterns;
diff --git a/services/network/public/cpp/cors/origin_access_list.h b/services/network/public/cpp/cors/origin_access_list.h
index 1ac8e7e..165a2de9 100644
--- a/services/network/public/cpp/cors/origin_access_list.h
+++ b/services/network/public/cpp/cors/origin_access_list.h
@@ -18,6 +18,8 @@
 
 namespace network {
 
+struct ResourceRequest;
+
 namespace mojom {
 class CorsOriginPattern;
 class CorsOriginAccessPatterns;
@@ -88,6 +90,14 @@
   AccessState CheckAccessState(const url::Origin& source_origin,
                                const GURL& destination) const;
 
+  // Returns |request.url|'s AccessState in |this| list for the origin
+  // calculated based on |request.request_initiator| and
+  // |request.isolated_world_origin|.
+  //
+  // Note: This helper might not do the right thing when processing redirects
+  // (because |request.url| might not be updated yet).
+  AccessState CheckAccessState(const ResourceRequest& request) const;
+
   // Creates mojom::CorsPriginAccessPatterns instance vector that represents
   // |this| OriginAccessList instance.
   std::vector<mojo::StructPtr<mojom::CorsOriginAccessPatterns>>
diff --git a/services/network/public/cpp/resource_request.cc b/services/network/public/cpp/resource_request.cc
index 192b44cd..a45491acd 100644
--- a/services/network/public/cpp/resource_request.cc
+++ b/services/network/public/cpp/resource_request.cc
@@ -30,6 +30,7 @@
          update_first_party_url_on_redirect ==
              request.update_first_party_url_on_redirect &&
          request_initiator == request.request_initiator &&
+         isolated_world_origin == request.isolated_world_origin &&
          referrer == request.referrer &&
          referrer_policy == request.referrer_policy &&
          headers.ToString() == request.headers.ToString() &&
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
index c5b5973..6f49f2b0 100644
--- a/services/network/public/cpp/resource_request.h
+++ b/services/network/public/cpp/resource_request.h
@@ -61,6 +61,7 @@
   bool attach_same_site_cookies = false;
   bool update_first_party_url_on_redirect = false;
   base::Optional<url::Origin> request_initiator;
+  base::Optional<url::Origin> isolated_world_origin;
   GURL referrer;
   net::URLRequest::ReferrerPolicy referrer_policy =
       net::URLRequest::NEVER_CLEAR_REFERRER;
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc
index f413aa87..9a5b9b2 100644
--- a/services/network/public/cpp/simple_url_loader_unittest.cc
+++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -581,7 +581,8 @@
     network::mojom::NetworkContextParamsPtr context_params =
         network::mojom::NetworkContextParams::New();
     network_service_ptr->CreateNetworkContext(
-        mojo::MakeRequest(&network_context_), std::move(context_params));
+        network_context_.BindNewPipeAndPassReceiver(),
+        std::move(context_params));
 
     network::mojom::NetworkServiceClientPtr network_service_client_ptr;
     network_service_client_ = std::make_unique<TestNetworkServiceClient>(
@@ -641,7 +642,7 @@
   std::unique_ptr<network::mojom::NetworkService> network_service_;
   std::unique_ptr<network::mojom::NetworkServiceClient> network_service_client_;
   std::unique_ptr<network::mojom::NetworkContextClient> network_context_client_;
-  network::mojom::NetworkContextPtr network_context_;
+  mojo::Remote<network::mojom::NetworkContext> network_context_;
   network::mojom::URLLoaderFactoryPtr url_loader_factory_;
 
   net::test_server::EmbeddedTestServer test_server_;
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc
index e999920..8b2d361 100644
--- a/services/network/public/cpp/url_request_mojom_traits.cc
+++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -170,6 +170,7 @@
       !data.ReadTopFrameOrigin(&out->top_frame_origin) ||
       !data.ReadTrustedParams(&out->trusted_params) ||
       !data.ReadRequestInitiator(&out->request_initiator) ||
+      !data.ReadIsolatedWorldOrigin(&out->isolated_world_origin) ||
       !data.ReadReferrer(&out->referrer) ||
       !data.ReadReferrerPolicy(&out->referrer_policy) ||
       !data.ReadHeaders(&out->headers) ||
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h
index d60fa8e9..578f76d 100644
--- a/services/network/public/cpp/url_request_mojom_traits.h
+++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -91,6 +91,10 @@
       const network::ResourceRequest& request) {
     return request.request_initiator;
   }
+  static const base::Optional<url::Origin>& isolated_world_origin(
+      const network::ResourceRequest& request) {
+    return request.isolated_world_origin;
+  }
   static const GURL& referrer(const network::ResourceRequest& request) {
     return request.referrer;
   }
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
index 32ce01b..2444d39 100644
--- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc
+++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -53,6 +53,8 @@
   original.attach_same_site_cookies = true;
   original.update_first_party_url_on_redirect = false;
   original.request_initiator = url::Origin::Create(original.url);
+  original.isolated_world_origin =
+      url::Origin::Create(GURL("chrome-extension://blah"));
   original.referrer = GURL("https://referrer.com/");
   original.referrer_policy =
       net::URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN;
diff --git a/services/network/public/mojom/url_loader.mojom b/services/network/public/mojom/url_loader.mojom
index d15c34f..f202d3c 100644
--- a/services/network/public/mojom/url_loader.mojom
+++ b/services/network/public/mojom/url_loader.mojom
@@ -145,6 +145,10 @@
   // for cookie checks like 'First-Party-Only'.
   url.mojom.Origin? request_initiator;
 
+  // The origin of the isolated world - set if this is a fetch/XHR initiated by
+  // an isolated world.
+  url.mojom.Origin? isolated_world_origin;
+
   // The referrer to use (may be empty).
   url.mojom.Url referrer;
 
diff --git a/services/network/ssl_config_service_mojo_unittest.cc b/services/network/ssl_config_service_mojo_unittest.cc
index af356df..d45fafc 100644
--- a/services/network/ssl_config_service_mojo_unittest.cc
+++ b/services/network/ssl_config_service_mojo_unittest.cc
@@ -11,6 +11,7 @@
 #include "build/build_config.h"
 #include "crypto/sha2.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/test_completion_callback.h"
 #include "net/cert/asn1_util.h"
 #include "net/cert/cert_verifier.h"
@@ -158,8 +159,10 @@
       mojom::NetworkContextParamsPtr network_context_params) {
     network_context_params->ssl_config_client_request =
         mojo::MakeRequest(&ssl_config_client_);
+    network_context_remote_.reset();
     network_context_ = std::make_unique<NetworkContext>(
-        network_service_.get(), mojo::MakeRequest(&network_context_ptr_),
+        network_service_.get(),
+        network_context_remote_.BindNewPipeAndPassReceiver(),
         std::move(network_context_params));
   }
 
@@ -262,7 +265,7 @@
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<NetworkService> network_service_;
   mojom::SSLConfigClientPtr ssl_config_client_;
-  mojom::NetworkContextPtr network_context_ptr_;
+  mojo::Remote<mojom::NetworkContext> network_context_remote_;
   std::unique_ptr<NetworkContext> network_context_;
 };
 
diff --git a/services/service_manager/sandbox/linux/bpf_gpu_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_gpu_policy_linux.cc
index ef7e6e48..1bf2c8c 100644
--- a/services/service_manager/sandbox/linux/bpf_gpu_policy_linux.cc
+++ b/services/service_manager/sandbox/linux/bpf_gpu_policy_linux.cc
@@ -23,11 +23,11 @@
 #include "services/service_manager/sandbox/linux/sandbox_linux.h"
 #include "services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.h"
 
+using sandbox::SyscallSets;
 using sandbox::bpf_dsl::Allow;
 using sandbox::bpf_dsl::ResultExpr;
 using sandbox::bpf_dsl::Trap;
 using sandbox::syscall_broker::BrokerProcess;
-using sandbox::SyscallSets;
 
 namespace service_manager {
 
@@ -65,6 +65,11 @@
       if (SyscallSets::IsEventFd(sysno))
         return Allow();
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_X11)
+      if (SyscallSets::IsSystemVSharedMemory(sysno))
+        return Allow();
+#endif
+
       auto* broker_process = SandboxLinux::GetInstance()->broker_process();
       if (broker_process->IsSyscallAllowed(sysno)) {
         return Trap(BrokerProcess::SIGSYS_Handler, broker_process);
diff --git a/services/shape_detection/face_detection_provider_impl.cc b/services/shape_detection/face_detection_provider_impl.cc
index 7fb8d76..e5e13464 100644
--- a/services/shape_detection/face_detection_provider_impl.cc
+++ b/services/shape_detection/face_detection_provider_impl.cc
@@ -9,7 +9,7 @@
 namespace shape_detection {
 
 void FaceDetectionProviderImpl::CreateFaceDetection(
-    shape_detection::mojom::FaceDetectionRequest request,
+    mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
     shape_detection::mojom::FaceDetectorOptionsPtr options) {
   DLOG(ERROR) << "Platform not supported for Face Detection Service.";
 }
diff --git a/services/shape_detection/face_detection_provider_impl.h b/services/shape_detection/face_detection_provider_impl.h
index be57400..195df92 100644
--- a/services/shape_detection/face_detection_provider_impl.h
+++ b/services/shape_detection/face_detection_provider_impl.h
@@ -22,7 +22,7 @@
   }
 
   void CreateFaceDetection(
-      shape_detection::mojom::FaceDetectionRequest request,
+      mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
       shape_detection::mojom::FaceDetectorOptionsPtr options) override;
 };
 
diff --git a/services/shape_detection/face_detection_provider_mac.h b/services/shape_detection/face_detection_provider_mac.h
index e84c59e..0ccfc356 100644
--- a/services/shape_detection/face_detection_provider_mac.h
+++ b/services/shape_detection/face_detection_provider_mac.h
@@ -22,7 +22,7 @@
   // mojom::FaceDetectionProvider.
   static void Create(mojom::FaceDetectionProviderRequest request);
 
-  void CreateFaceDetection(mojom::FaceDetectionRequest request,
+  void CreateFaceDetection(mojo::PendingReceiver<mojom::FaceDetection> receiver,
                            mojom::FaceDetectorOptionsPtr options) override;
 
  private:
diff --git a/services/shape_detection/face_detection_provider_mac.mm b/services/shape_detection/face_detection_provider_mac.mm
index c0ea91af..4ff39cb 100644
--- a/services/shape_detection/face_detection_provider_mac.mm
+++ b/services/shape_detection/face_detection_provider_mac.mm
@@ -7,7 +7,7 @@
 #include <memory>
 #include <utility>
 
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/shape_detection/face_detection_impl_mac.h"
 #include "services/shape_detection/face_detection_impl_mac_vision.h"
 
@@ -25,7 +25,7 @@
 }
 
 void FaceDetectionProviderMac::CreateFaceDetection(
-    mojom::FaceDetectionRequest request,
+    mojo::PendingReceiver<mojom::FaceDetection> receiver,
     mojom::FaceDetectorOptionsPtr options) {
   // Vision Framework needs at least MAC OS X 10.13.
   if (@available(macOS 10.13, *)) {
@@ -34,15 +34,16 @@
     if (!options->fast_mode) {
       auto impl = std::make_unique<FaceDetectionImplMacVision>();
       auto* impl_ptr = impl.get();
-      impl_ptr->SetBinding(
-          mojo::MakeStrongBinding(std::move(impl), std::move(request)));
+      impl_ptr->SetBinding(mojo::MakeStrongBinding(
+          std::move(impl),
+          mojo::InterfaceRequest<mojom::FaceDetection>(receiver)));
       return;
     }
   }
 
-  mojo::MakeStrongBinding(
+  mojo::MakeSelfOwnedReceiver(
       std::make_unique<FaceDetectionImplMac>(std::move(options)),
-      std::move(request));
+      std::move(receiver));
 }
 
 }  // namespace shape_detection
diff --git a/services/shape_detection/face_detection_provider_win.cc b/services/shape_detection/face_detection_provider_win.cc
index 343f5ac5..14b9dfe 100644
--- a/services/shape_detection/face_detection_provider_win.cc
+++ b/services/shape_detection/face_detection_provider_win.cc
@@ -47,7 +47,7 @@
 }  // namespace
 
 void FaceDetectionProviderWin::CreateFaceDetection(
-    shape_detection::mojom::FaceDetectionRequest request,
+    mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
     shape_detection::mojom::FaceDetectorOptionsPtr options) {
   // FaceDetector class is only available in Win 10 onwards (v10.0.10240.0).
   if (base::win::GetVersion() < base::win::Version::WIN10) {
@@ -99,7 +99,7 @@
   hr = base::win::PostAsyncResults(
       std::move(async_op),
       base::BindOnce(&FaceDetectionProviderWin::OnFaceDetectorCreated,
-                     weak_factory_.GetWeakPtr(), std::move(request),
+                     weak_factory_.GetWeakPtr(), std::move(receiver),
                      pixel_format));
   if (FAILED(hr)) {
     DLOG(ERROR) << "Begin async operation failed: "
@@ -119,7 +119,7 @@
 FaceDetectionProviderWin::~FaceDetectionProviderWin() = default;
 
 void FaceDetectionProviderWin::OnFaceDetectorCreated(
-    shape_detection::mojom::FaceDetectionRequest request,
+    mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
     BitmapPixelFormat pixel_format,
     ComPtr<IFaceDetector> face_detector) {
   binding_->ResumeIncomingMethodCallProcessing();
@@ -140,8 +140,9 @@
   auto impl = std::make_unique<FaceDetectionImplWin>(
       std::move(face_detector), std::move(bitmap_factory), pixel_format);
   auto* impl_ptr = impl.get();
-  impl_ptr->SetBinding(
-      mojo::MakeStrongBinding(std::move(impl), std::move(request)));
+  impl_ptr->SetBinding(mojo::MakeStrongBinding(
+      std::move(impl),
+      mojo::InterfaceRequest<shape_detection::mojom::FaceDetection>(receiver)));
 }
 
 }  // namespace shape_detection
diff --git a/services/shape_detection/face_detection_provider_win.h b/services/shape_detection/face_detection_provider_win.h
index 7e71990..c46ed82 100644
--- a/services/shape_detection/face_detection_provider_win.h
+++ b/services/shape_detection/face_detection_provider_win.h
@@ -34,12 +34,12 @@
   }
 
   void CreateFaceDetection(
-      shape_detection::mojom::FaceDetectionRequest request,
+      mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
       shape_detection::mojom::FaceDetectorOptionsPtr options) override;
 
  private:
   void OnFaceDetectorCreated(
-      shape_detection::mojom::FaceDetectionRequest request,
+      mojo::PendingReceiver<shape_detection::mojom::FaceDetection> receiver,
       ABI::Windows::Graphics::Imaging::BitmapPixelFormat pixel_format,
       Microsoft::WRL::ComPtr<ABI::Windows::Media::FaceAnalysis::IFaceDetector>
           face_detector);
diff --git a/services/shape_detection/public/mojom/facedetection_provider.mojom b/services/shape_detection/public/mojom/facedetection_provider.mojom
index 3c42027b..5faf260c 100644
--- a/services/shape_detection/public/mojom/facedetection_provider.mojom
+++ b/services/shape_detection/public/mojom/facedetection_provider.mojom
@@ -9,5 +9,6 @@
 import "services/shape_detection/public/mojom/facedetection.mojom";
 
 interface FaceDetectionProvider {
-  CreateFaceDetection(FaceDetection& request, FaceDetectorOptions options);
+  CreateFaceDetection(pending_receiver<FaceDetection> receiver,
+                      FaceDetectorOptions options);
 };
diff --git a/services/tracing/perfetto/consumer_host.cc b/services/tracing/perfetto/consumer_host.cc
index 07646373..a2d42151 100644
--- a/services/tracing/perfetto/consumer_host.cc
+++ b/services/tracing/perfetto/consumer_host.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/logging.h"
+#include "base/numerics/ranges.h"
 #include "base/stl_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -445,7 +446,7 @@
                            buf_stats.padding_bytes_cleared();
   double percent_full =
       bytes_in_buffer / static_cast<double>(buf_stats.buffer_size());
-  percent_full = std::min(std::max(0.0, percent_full), 1.0);
+  percent_full = base::ClampToRange(percent_full, 0.0, 1.0);
   bool data_loss = buf_stats.chunks_overwritten() > 0 ||
                    buf_stats.chunks_discarded() > 0 ||
                    buf_stats.abi_violations() > 0 ||
diff --git a/services/tracing/perfetto/perfetto_tracing_coordinator.cc b/services/tracing/perfetto/perfetto_tracing_coordinator.cc
index d9e2cf5..65635555 100644
--- a/services/tracing/perfetto/perfetto_tracing_coordinator.cc
+++ b/services/tracing/perfetto/perfetto_tracing_coordinator.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/command_line.h"
+#include "base/numerics/ranges.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_log.h"
@@ -188,7 +189,7 @@
         buf_stats.padding_bytes_cleared();
     double percent_full =
         bytes_in_buffer / static_cast<double>(buf_stats.buffer_size());
-    percent_full = std::min(std::max(0.0, percent_full), 1.0);
+    percent_full = base::ClampToRange(percent_full, 0.0, 1.0);
     // We know the size of data in the buffer, but not the number of events.
     std::move(request_buffer_usage_callback_)
         .Run(true, percent_full, 0 /*approx_event_count*/);
diff --git a/services/tracing/public/cpp/perfetto/perfetto_config.cc b/services/tracing/public/cpp/perfetto/perfetto_config.cc
index 91754811..0b1eba3 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_config.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_config.cc
@@ -71,14 +71,19 @@
   // 5 seconds of the trace (if we wrap around perfetto's central buffer).
   perfetto_config.mutable_incremental_state_config()->set_clear_period_ms(5000);
 
-  // We strip the process filter from the config string we send to Perfetto,
-  // so perfetto doesn't reject it from a future
-  // TracingService::ChangeTraceConfig call due to being an unsupported
-  // update.
-  base::trace_event::TraceConfig processfilter_stripped_config(chrome_config);
-  processfilter_stripped_config.SetProcessFilterConfig(
+  // We strip the process filter from the config string we send to Perfetto, so
+  // perfetto doesn't reject it from a future TracingService::ChangeTraceConfig
+  // call due to being an unsupported update. We also strip the trace buffer
+  // size configuration to prevent chrome from rejecting an update to it after
+  // startup tracing via TraceConfig::Merge (see trace_startup.cc). For
+  // perfetto, the buffer size is configured via perfetto's buffer config and
+  // only affects the perfetto service.
+  base::trace_event::TraceConfig stripped_config(chrome_config);
+  stripped_config.SetProcessFilterConfig(
       base::trace_event::TraceConfig::ProcessFilterConfig());
-  std::string chrome_config_string = processfilter_stripped_config.ToString();
+  stripped_config.SetTraceBufferSizeInKb(0);
+  stripped_config.SetTraceBufferSizeInEvents(0);
+  std::string chrome_config_string = stripped_config.ToString();
 
   // Capture actual trace events.
   auto* trace_event_data_source = AddDataSourceConfig(
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index 34ef71dc..8de8416 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -277,16 +277,24 @@
       &TraceEventDataSource::OnAddTraceEvent,
       &TraceEventDataSource::FlushCurrentThread,
       &TraceEventDataSource::OnUpdateDuration);
+  base::AutoLock l(lock_);
+  is_enabled_ = true;
 }
 
 void TraceEventDataSource::UnregisterFromTraceLog() {
   RegisterTracedValueProtoWriter(false);
   TraceLog::GetInstance()->SetAddTraceEventOverrides(nullptr, nullptr, nullptr);
   base::AutoLock l(lock_);
+  is_enabled_ = false;
   flushing_trace_log_ = false;
   DCHECK(!flush_complete_task_);
 }
 
+bool TraceEventDataSource::IsEnabled() {
+  base::AutoLock l(lock_);
+  return is_enabled_;
+}
+
 void TraceEventDataSource::SetupStartupTracing(bool privacy_filtering_enabled) {
   {
     base::AutoLock lock(lock_);
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.h b/services/tracing/public/cpp/perfetto/trace_event_data_source.h
index e082ce23..bad26bc3 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.h
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.h
@@ -140,6 +140,10 @@
     startup_tracing_timeout_ = timeout_us;
   }
 
+  bool privacy_filtering_enabled() const { return privacy_filtering_enabled_; }
+
+  bool IsEnabled();
+
  private:
   friend class base::NoDestructor<TraceEventDataSource>;
 
@@ -199,6 +203,7 @@
   std::unique_ptr<perfetto::StartupTraceWriterRegistry>
       startup_writer_registry_;
   base::OneShotTimer startup_tracing_timer_;
+  bool is_enabled_ = false;
   bool flushing_trace_log_ = false;
   base::OnceClosure flush_complete_task_;
   std::vector<std::string> histograms_;
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
index 2c0b8257..f19e121 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -547,19 +547,19 @@
       sampled_thread_id_, std::move(trace_writer), should_enable_filtering);
   profile_builder_ = profile_builder.get();
   // Create and start the stack sampling profiler.
-#if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \
-    defined(OFFICIAL_BUILD)
+#if defined(OS_ANDROID)
+#if BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && defined(OFFICIAL_BUILD)
   auto* module_cache = profile_builder->GetModuleCache();
   profiler_ = std::make_unique<base::StackSamplingProfiler>(
       sampled_thread_id_, params, std::move(profile_builder),
       std::make_unique<StackSamplerAndroid>(sampled_thread_id_, module_cache));
-
-#else
+  profiler_->Start();
+#endif  // BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && defined(OFFICIAL_BUILD)
+#else   // defined(OS_ANDROID)
   profiler_ = std::make_unique<base::StackSamplingProfiler>(
       sampled_thread_id_, params, std::move(profile_builder));
-#endif
-
   profiler_->Start();
+#endif  // defined(OS_ANDROID)
 }
 
 void TracingSamplerProfiler::StopTracing() {
diff --git a/services/tracing/public/cpp/trace_startup.cc b/services/tracing/public/cpp/trace_startup.cc
index 3991797..0956574 100644
--- a/services/tracing/public/cpp/trace_startup.cc
+++ b/services/tracing/public/cpp/trace_startup.cc
@@ -13,6 +13,7 @@
 #include "components/tracing/common/tracing_switches.h"
 #include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
 #include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h"
+#include "services/tracing/public/cpp/trace_event_args_whitelist.h"
 #include "services/tracing/public/cpp/tracing_features.h"
 
 namespace tracing {
@@ -43,21 +44,42 @@
   auto* startup_config = TraceStartupConfig::GetInstance();
 
   if (startup_config->IsEnabled()) {
-    const TraceConfig& trace_config = startup_config->GetTraceConfig();
+    TraceConfig trace_config = startup_config->GetTraceConfig();
+
+    // Make sure we only record whitelisted arguments even during early startup
+    // tracing if the config specifies argument filtering.
+    if (trace_config.IsArgumentFilterEnabled() &&
+        base::trace_event::TraceLog::GetInstance()
+            ->GetArgumentFilterPredicate()
+            .is_null()) {
+      base::trace_event::TraceLog::GetInstance()->SetArgumentFilterPredicate(
+          base::BindRepeating(&IsTraceEventArgsWhitelisted));
+      base::trace_event::TraceLog::GetInstance()->SetMetadataFilterPredicate(
+          base::BindRepeating(&IsMetadataWhitelisted));
+    }
+
     if (TracingUsesPerfettoBackend()) {
+      // Perfetto backend configures buffer sizes when tracing is started in the
+      // service (see perfetto_config.cc). Zero them out here to avoid DCHECKs
+      // in TraceConfig::Merge.
+      trace_config.SetTraceBufferSizeInKb(0);
+      trace_config.SetTraceBufferSizeInEvents(0);
+
       if (trace_config.IsCategoryGroupEnabled(
               TRACE_DISABLED_BY_DEFAULT("cpu_profiler"))) {
         TracingSamplerProfiler::SetupStartupTracing();
       }
       TraceEventDataSource::GetInstance()->SetupStartupTracing(
           startup_config->GetSessionOwner() ==
-          TraceStartupConfig::SessionOwner::kBackgroundTracing);
+              TraceStartupConfig::SessionOwner::kBackgroundTracing ||
+          command_line.HasSwitch(
+              switches::kTraceStartupEnablePrivacyFiltering));
     }
 
     uint8_t modes = TraceLog::RECORDING_MODE;
     if (!trace_config.event_filters().empty())
       modes |= TraceLog::FILTERING_MODE;
-    trace_log->SetEnabled(startup_config->GetTraceConfig(), modes);
+    trace_log->SetEnabled(trace_config, modes);
   } else if (command_line.HasSwitch(switches::kTraceToConsole)) {
     // TODO(eseckler): Remove ability to trace to the console, perfetto doesn't
     // support this and noone seems to use it.
@@ -91,4 +113,67 @@
   }
 }
 
+void PropagateTracingFlagsToChildProcessCmdLine(base::CommandLine* cmd_line) {
+  base::trace_event::TraceLog* trace_log =
+      base::trace_event::TraceLog::GetInstance();
+
+  if (!trace_log->IsEnabled())
+    return;
+
+  // It's possible that tracing is enabled only for atrace, in which case the
+  // TraceEventDataSource isn't registered. In that case, there's no reason to
+  // enable startup tracing in the child process (and we wouldn't know the
+  // correct value for privacy_filtering_enabled below).
+  if (TracingUsesPerfettoBackend() &&
+      !TraceEventDataSource::GetInstance()->IsEnabled()) {
+    return;
+  }
+
+  // The child process startup may race with a concurrent disabling of the
+  // tracing session by the tracing service. To avoid being stuck in startup
+  // tracing mode forever, the child process will discard the startup session
+  // after a timeout (|startup_tracing_timer_| in TraceEventDataSource).
+  //
+  // Note that we disregard the config's process filter, since it's possible
+  // that the trace consumer will update the config to include the process
+  // shortly. Otherwise, the startup tracing timeout in the child will
+  // eventually disable tracing for the process.
+
+  const auto trace_config = trace_log->GetCurrentTraceConfig();
+
+  // We can't currently propagate event filter options, memory dump configs, or
+  // trace buffer sizes via command line flags (they only support categories,
+  // trace options, record mode). If event filters are set, we bail out here to
+  // avoid recording events that we shouldn't in the child process. Even if
+  // memory dump config is set, it's OK to propagate the remaining config,
+  // because the child won't record events it shouldn't without it and will
+  // adopt the memory dump config once it connects to the tracing service.
+  // Buffer sizes only affect the legacy tracing backend's startup tracing, so
+  // we only bail out if perfetto is disabled.
+  //
+  // TODO(eseckler): Support propagating the full config via command line flags
+  // somehow (--trace-config?). This will also need some rethinking to support
+  // multiple concurrent tracing sessions in the future.
+  if (!trace_config.event_filters().empty() ||
+      ((trace_config.GetTraceBufferSizeInEvents() ||
+        trace_config.GetTraceBufferSizeInKb()) &&
+       !TracingUsesPerfettoBackend())) {
+    return;
+  }
+
+  // Make sure that the startup session uses privacy filtering mode if it's
+  // enabled for the browser's session.
+  if (TracingUsesPerfettoBackend() &&
+      TraceEventDataSource::GetInstance()->privacy_filtering_enabled()) {
+    cmd_line->AppendSwitch(switches::kTraceStartupEnablePrivacyFiltering);
+  }
+
+  cmd_line->AppendSwitchASCII(switches::kTraceStartup,
+                              trace_config.ToCategoryFilterString());
+  // The argument filtering setting is passed via trace options as part of
+  // --trace-startup-record-mode.
+  cmd_line->AppendSwitchASCII(switches::kTraceStartupRecordMode,
+                              trace_config.ToTraceOptionsString());
+}
+
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/trace_startup.h b/services/tracing/public/cpp/trace_startup.h
index 658856a..089ba9d 100644
--- a/services/tracing/public/cpp/trace_startup.h
+++ b/services/tracing/public/cpp/trace_startup.h
@@ -7,6 +7,10 @@
 
 #include "base/component_export.h"
 
+namespace base {
+class CommandLine;
+}  // namespace base
+
 namespace tracing {
 
 // Returns true if InitTracingPostThreadPoolStartAndFeatureList has been called
@@ -23,6 +27,11 @@
 void COMPONENT_EXPORT(TRACING_CPP)
     InitTracingPostThreadPoolStartAndFeatureList();
 
+// If tracing is enabled, grabs the current trace config & mode and tells the
+// child to begin tracing right away via startup tracing command line flags.
+void COMPONENT_EXPORT(TRACING_CPP)
+    PropagateTracingFlagsToChildProcessCmdLine(base::CommandLine* cmd_line);
+
 }  // namespace tracing
 
 #endif  // SERVICES_TRACING_PUBLIC_CPP_TRACE_STARTUP_H_
diff --git a/services/viz/public/cpp/gpu/gpu.cc b/services/viz/public/cpp/gpu/gpu.cc
index e72e736..8c9bb11 100644
--- a/services/viz/public/cpp/gpu/gpu.cc
+++ b/services/viz/public/cpp/gpu/gpu.cc
@@ -30,16 +30,16 @@
   GpuPtrIO() { DETACH_FROM_THREAD(thread_checker_); }
   ~GpuPtrIO() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); }
 
-  void Initialize(
-      mojom::GpuPtrInfo ptr_info,
-      mojom::GpuMemoryBufferFactoryRequest memory_buffer_factory_request) {
+  void Initialize(mojom::GpuPtrInfo ptr_info,
+                  mojo::PendingReceiver<mojom::GpuMemoryBufferFactory>
+                      memory_buffer_factory_receiver) {
     DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
     gpu_ptr_.Bind(std::move(ptr_info));
     gpu_ptr_.set_connection_error_handler(
         base::BindOnce(&GpuPtrIO::ConnectionError, base::Unretained(this)));
     gpu_ptr_->CreateGpuMemoryBufferFactory(
-        std::move(memory_buffer_factory_request));
+        std::move(memory_buffer_factory_receiver));
   }
 
   void EstablishGpuChannel(scoped_refptr<EstablishRequest> establish_request) {
diff --git a/services/viz/public/cpp/gpu/gpu_unittest.cc b/services/viz/public/cpp/gpu/gpu_unittest.cc
index 4edbfbb..128ebb1 100644
--- a/services/viz/public/cpp/gpu/gpu_unittest.cc
+++ b/services/viz/public/cpp/gpu/gpu_unittest.cc
@@ -37,7 +37,7 @@
 
   // mojom::Gpu overrides:
   void CreateGpuMemoryBufferFactory(
-      mojom::GpuMemoryBufferFactoryRequest request) override {}
+      mojo::PendingReceiver<mojom::GpuMemoryBufferFactory> receiver) override {}
 
   void EstablishGpuChannel(EstablishGpuChannelCallback callback) override {
     if (close_binding_on_request_) {
diff --git a/services/viz/public/mojom/gpu.mojom b/services/viz/public/mojom/gpu.mojom
index 33cd024d..3004a0b1 100644
--- a/services/viz/public/mojom/gpu.mojom
+++ b/services/viz/public/mojom/gpu.mojom
@@ -30,7 +30,8 @@
 interface Gpu {
   // Note: The bound-to GpuMemoryBufferFactory instance is only guaranteed to
   // stay alive for as long as the invoked Gpu instance.
-  CreateGpuMemoryBufferFactory(GpuMemoryBufferFactory& request);
+  CreateGpuMemoryBufferFactory(
+      pending_receiver<GpuMemoryBufferFactory> receiver);
 
   // Tells the GPU service to create a new channel for communication with a
   // client. The GPU service responds with client ID, IPC handle and
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 88d424225..20f546f2 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -413,9 +413,6 @@
     ]
   },
   "android-marshmallow-x86-fyi-rel": {
-    "additional_compile_targets": [
-      "monochrome_static_initializers"
-    ],
     "gtest_tests": [
       {
         "args": [
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 7455da8..2531957 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -25990,7 +25990,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
-        "experiment_percentage": 50,
+        "experiment_percentage": 100,
         "merge": {
           "args": [
             "--bucket",
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index bc378ce..ce82193 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -11992,6 +11992,37 @@
       },
       {
         "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter",
+          "--enable-features=VizDisplayCompositor,UseSkiaRenderer,UiGpuRasterization",
+          "--use-vulkan=swiftshader",
+          "--enable-oop-rasterization",
+          "--enable-gpu-rasterization",
+          "--force-gpu-rasterization",
+          "--disable-software-compositing-fallback",
+          "--disable-vulkan-fallback-to-gl-for-testing",
+          "--disable-headless-mode",
+          "--test-launcher-print-test-stdio=always"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "vulkan_swiftshader_content_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ]
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "args": [
           "--test-launcher-print-test-stdio=always"
         ],
         "merge": {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index c119355..2f961f3 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -3001,7 +3001,7 @@
     "type": "console_test_launcher",
   },
   "weblayer_shell": {
-    "label": "//weblayer/shell:weblayer_shell",
+    "label": "//weblayer/shell/android:run_weblayer_shell",
     "type": "additional_compile_target",
   },
   "wm_unittests": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 857cc6fd9..e4325697 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -302,7 +302,7 @@
       'android-marshmallow-arm64-rel': {
         # TODO(crbug.com/731759): Enable this once we're confident that it
         # passes.
-        'experiment_percentage': 50,
+        'experiment_percentage': 100,
       },
       'KitKat Phone Tester (dbg)': {
         'swarming': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index be4f461d..68507ef 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -5175,6 +5175,22 @@
       'performance_smoke_test_isolated_scripts',
     ],
 
+    # This is meant to be a superset of 'chromium_linux_and_gl_gtests'. Any
+    # changes there must be reflected here.
+    'chromium_linux_and_gl_and_vulkan_gtests': [
+      'aura_gtests',
+      'chromium_gtests',
+      'chromium_gtests_for_devices_with_graphical_output',
+      'chromium_gtests_for_linux_and_chromeos_only',
+      'chromium_gtests_for_win_and_linux_only',
+      'linux_flavor_specific_chromium_gtests',
+      'non_android_chromium_gtests',
+      'non_android_and_cast_and_chromeos_chromium_gtests',
+      'vr_platform_specific_chromium_gtests',
+      'gl_gtests',
+      'gpu_fyi_vulkan_swiftshader_gtests',
+    ],
+
     # gl_tests requires dedicated slaves with GPUs on linux, so have a separate
     # test list with gl_tests included. This is chromium_linux_gtests + gl_gtests.
     'chromium_linux_and_gl_gtests': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 6b60cf1b..e9c0f41 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -678,9 +678,6 @@
           'x86-64',
         ],
         'os_type': 'android',
-        'additional_compile_targets': [
-          'monochrome_static_initializers',
-        ],
         'test_suites': {
           'gtest_tests': 'android_lollipop_marshmallow_gtests',
           'isolated_scripts': 'marshmallow_isolated_scripts',
@@ -3758,7 +3755,7 @@
           'linux-xenial',
         ],
         'test_suites': {
-          'gtest_tests': 'chromium_linux_and_gl_gtests',
+          'gtest_tests': 'chromium_linux_and_gl_and_vulkan_gtests',
         },
         'args': [
           '--test-launcher-print-test-stdio=always',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index ace452d..90acaf951 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5257,6 +5257,21 @@
             ]
         }
     ],
+    "ServiceGroupImportance": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ServiceGroupImportance"
+                    ]
+                }
+            ]
+        }
+    ],
     "ServiceManagerForBackgroundPrefetch": [
         {
             "platforms": [
@@ -6850,6 +6865,23 @@
             ]
         }
     ],
+    "WebRTC-VP8ConferenceTemporalLayers": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "chromeos",
+                "linux",
+                "ios",
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "2_V1"
+                }
+            ]
+        }
+    ],
     "WebRTC-VideoRateControl": [
         {
             "platforms": [
diff --git a/third_party/blink/common/associated_interfaces/associated_interface_provider.cc b/third_party/blink/common/associated_interfaces/associated_interface_provider.cc
index 2a10832..60e4aa4 100644
--- a/third_party/blink/common/associated_interfaces/associated_interface_provider.cc
+++ b/third_party/blink/common/associated_interfaces/associated_interface_provider.cc
@@ -6,7 +6,7 @@
 
 #include <map>
 
-#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/associated_receiver.h"
 
 namespace blink {
 
@@ -17,10 +17,9 @@
       base::RepeatingCallback<void(mojo::ScopedInterfaceEndpointHandle)>;
 
   explicit LocalProvider(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-      : associated_interface_provider_binding_(this) {
-    associated_interface_provider_binding_.Bind(
-        mojo::MakeRequestAssociatedWithDedicatedPipe(&ptr_),
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+    associated_interface_provider_receiver_.Bind(
+        remote_.BindNewEndpointAndPassDedicatedReceiverForTesting(),
         std::move(task_runner));
   }
 
@@ -36,30 +35,32 @@
 
   void GetInterface(const std::string& name,
                     mojo::ScopedInterfaceEndpointHandle handle) {
-    return ptr_->GetAssociatedInterface(
-        name, mojom::AssociatedInterfaceAssociatedRequest(std::move(handle)));
+    return remote_->GetAssociatedInterface(
+        name, mojo::PendingAssociatedReceiver<mojom::AssociatedInterface>(
+                  std::move(handle)));
   }
 
  private:
   // mojom::AssociatedInterfaceProvider:
   void GetAssociatedInterface(
       const std::string& name,
-      mojom::AssociatedInterfaceAssociatedRequest request) override {
+      mojo::PendingAssociatedReceiver<mojom::AssociatedInterface> receiver)
+      override {
     auto it = binders_.find(name);
     if (it != binders_.end())
-      it->second.Run(request.PassHandle());
+      it->second.Run(receiver.PassHandle());
   }
 
   std::map<std::string, Binder> binders_;
-  mojo::AssociatedBinding<mojom::AssociatedInterfaceProvider>
-      associated_interface_provider_binding_;
-  mojom::AssociatedInterfaceProviderAssociatedPtr ptr_;
+  mojo::AssociatedReceiver<mojom::AssociatedInterfaceProvider>
+      associated_interface_provider_receiver_{this};
+  mojo::AssociatedRemote<mojom::AssociatedInterfaceProvider> remote_;
 
   DISALLOW_COPY_AND_ASSIGN(LocalProvider);
 };
 
 AssociatedInterfaceProvider::AssociatedInterfaceProvider(
-    mojom::AssociatedInterfaceProviderAssociatedPtr proxy,
+    mojo::PendingAssociatedRemote<mojom::AssociatedInterfaceProvider> proxy,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner)
     : proxy_(std::move(proxy)), task_runner_(std::move(task_runner)) {
   DCHECK(proxy_.is_bound());
@@ -81,7 +82,8 @@
   }
   DCHECK(proxy_);
   proxy_->GetAssociatedInterface(
-      name, mojom::AssociatedInterfaceAssociatedRequest(std::move(handle)));
+      name, mojo::PendingAssociatedReceiver<mojom::AssociatedInterface>(
+                std::move(handle)));
 }
 
 void AssociatedInterfaceProvider::OverrideBinderForTesting(
diff --git a/third_party/blink/common/loader/url_loader_factory_bundle.cc b/third_party/blink/common/loader/url_loader_factory_bundle.cc
index d75d273..9052c9116 100644
--- a/third_party/blink/common/loader/url_loader_factory_bundle.cc
+++ b/third_party/blink/common/loader/url_loader_factory_bundle.cc
@@ -81,9 +81,9 @@
   if (it != scheme_specific_factories_.end())
     return it->second.get();
 
-  if (request.request_initiator.has_value()) {
-    auto it2 =
-        initiator_specific_factories_.find(request.request_initiator.value());
+  if (request.isolated_world_origin.has_value()) {
+    auto it2 = initiator_specific_factories_.find(
+        request.isolated_world_origin.value());
     if (it2 != initiator_specific_factories_.end())
       return it2->second.get();
   }
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 1e386f68..83c483ab 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -149,6 +149,7 @@
     "platform/modules/mediastream/web_platform_media_stream_source.h",
     "platform/modules/mediastream/web_platform_media_stream_track.h",
     "platform/modules/mediastream/webrtc_uma_histograms.h",
+    "platform/modules/p2p/network_manager_uma.h",
     "platform/modules/peerconnection/audio_codec_factory.h",
     "platform/modules/peerconnection/rtc_event_log_output_sink.h",
     "platform/modules/peerconnection/rtc_event_log_output_sink_proxy_util.h",
diff --git a/third_party/blink/public/common/associated_interfaces/associated_interface_provider.h b/third_party/blink/public/common/associated_interfaces/associated_interface_provider.h
index a82a430..d93f6a4 100644
--- a/third_party/blink/public/common/associated_interfaces/associated_interface_provider.h
+++ b/third_party/blink/public/common/associated_interfaces/associated_interface_provider.h
@@ -15,6 +15,7 @@
 #include "mojo/public/cpp/bindings/associated_interface_request.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom.h"
@@ -41,7 +42,7 @@
   // |task_runner| must belong to the same thread. It will be used to dispatch
   // all callbacks and connection error notification.
   explicit AssociatedInterfaceProvider(
-      mojom::AssociatedInterfaceProviderAssociatedPtr proxy,
+      mojo::PendingAssociatedRemote<mojom::AssociatedInterfaceProvider> proxy,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner = nullptr);
 
   // Constructs a local provider with no remote interfaces. This is useful in
@@ -93,7 +94,7 @@
  private:
   class LocalProvider;
 
-  mojom::AssociatedInterfaceProviderAssociatedPtr proxy_;
+  mojo::AssociatedRemote<mojom::AssociatedInterfaceProvider> proxy_;
 
   std::unique_ptr<LocalProvider> local_provider_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 3521328f..e9b2320 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -143,6 +143,7 @@
     "worker/shared_worker_creation_context_type.mojom",
     "worker/shared_worker_host.mojom",
     "worker/shared_worker_info.mojom",
+    "worker/subresource_loader_updater.mojom",
     "worker/worker_content_settings_proxy.mojom",
     "worker/worker_main_script_load_params.mojom",
   ]
diff --git a/third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom b/third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom
index 20ce5b3..a588177 100644
--- a/third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom
+++ b/third_party/blink/public/mojom/associated_interfaces/associated_interfaces.mojom
@@ -11,5 +11,7 @@
 // Analogous to the generic InterfaceProvider interface, but for content
 // AssociatedInterfaces.
 interface AssociatedInterfaceProvider {
-  GetAssociatedInterface(string name, associated AssociatedInterface& request);
+  GetAssociatedInterface(
+      string name,
+      pending_associated_receiver<AssociatedInterface> receiver);
 };
diff --git a/third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom b/third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom
index 24ac0fc..b447fe90 100644
--- a/third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom
+++ b/third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom
@@ -25,7 +25,11 @@
   // A mapping from URL scheme to factory interface.
   map<string, network.mojom.URLLoaderFactory> scheme_specific_factories;
 
-  // A mapping from request-initiator-origin to factory interface.
+  // A mapping from isolated world's origin to factory interface.
+  //
+  // TODO(lukasza): https://crbug.com/940068: Rename to
+  // |isolated_world_factories| (here and in other places referring to
+  // "initiator-specific factories).
   map<url.mojom.Origin, network.mojom.URLLoaderFactory>
       initiator_specific_factories;
 
diff --git a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
index d9df450..f05400c 100644
--- a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
+++ b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
@@ -10,6 +10,7 @@
 import "services/network/public/mojom/url_loader_factory.mojom";
 import "third_party/blink/public/mojom/devtools/console_message.mojom";
 import "third_party/blink/public/mojom/devtools/devtools_agent.mojom";
+import "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom";
 import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
 import "third_party/blink/public/mojom/renderer_preference_watcher.mojom";
 import "third_party/blink/public/mojom/renderer_preferences.mojom";
@@ -110,11 +111,8 @@
   // loader factory can't load.
   URLLoaderFactoryBundle subresource_loader_factories;
 
-  // Another interface to talk to the service worker from the browser process
-  // to update WorkerFetchContext. See the comment of
-  // ServiceWorkerSubresourceLoaderUpdater why there are two interfaces.
-  pending_receiver<ServiceWorkerSubresourceLoaderUpdater>
-      subresource_loader_updater;
+  // Used for updating subresource loaders after NetworkService crash etc.
+  pending_receiver<SubresourceLoaderUpdater> subresource_loader_updater;
 };
 
 // Holds timing information about the start worker sequence for UMA.
diff --git a/third_party/blink/public/mojom/service_worker/service_worker.mojom b/third_party/blink/public/mojom/service_worker/service_worker.mojom
index 0e6fe9f..be2acc70 100644
--- a/third_party/blink/public/mojom/service_worker/service_worker.mojom
+++ b/third_party/blink/public/mojom/service_worker/service_worker.mojom
@@ -12,7 +12,6 @@
 import "third_party/blink/public/mojom/background_fetch/background_fetch.mojom";
 import "third_party/blink/public/mojom/devtools/console_message.mojom";
 import "third_party/blink/public/mojom/fetch/fetch_api_response.mojom";
-import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
 import "third_party/blink/public/mojom/messaging/transferable_message.mojom";
 import "third_party/blink/public/mojom/notifications/notification.mojom";
 import "third_party/blink/public/mojom/payments/payment_app.mojom";
@@ -286,20 +285,3 @@
   // Adds a message to DevTools console which is associated with this worker.
   AddMessageToConsole(ConsoleMessageLevel level, string message);
 };
-
-// This is another interface for talking to a running service worker in
-// addition to the ServiceWorker interface defined above. The reason we have two
-// interfaces is that implementations of these two interfaces live in different
-// places (one in blink and the other in content). Ideally these two interfaces
-// should be merged but we separate them to avoid cumbersome type conversions
-// between blink and content.
-interface ServiceWorkerSubresourceLoaderUpdater {
-  // Provides the worker an updated |subresource_loader_factories|.
-  //
-  // Pushes updated set of subresource URL loader factories to the worker
-  // (for example, after DevTools network interception has been enabled).
-  // Note this does not affect the script loader factory, whose
-  // implementation lives in the browser and may be updated there.
-  UpdateSubresourceLoaderFactories(
-      URLLoaderFactoryBundle subresource_loader_factories);
-};
diff --git a/third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom b/third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom
index be2a63c..379a9c4 100644
--- a/third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom
+++ b/third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom
@@ -9,6 +9,7 @@
 import "third_party/blink/public/mojom/blob/blob_url_store.mojom";
 import "third_party/blink/public/mojom/browser_interface_broker.mojom";
 import "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom";
+import "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom";
 import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
 import "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom";
 import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom";
@@ -56,6 +57,9 @@
       // chrome-extension:// URLs.
       URLLoaderFactoryBundle subresource_loader_factories,
 
+      // Used for updating subresource loaders after NetworkService crash.
+      pending_receiver<SubresourceLoaderUpdater> subresource_loader_updater,
+
       // Used to make fetches from the worker go through the controller service
       // worker. This is null when there're no controller service worker.
       ControllerServiceWorkerInfo? controller_info);
diff --git a/third_party/blink/public/mojom/worker/subresource_loader_updater.mojom b/third_party/blink/public/mojom/worker/subresource_loader_updater.mojom
new file mode 100644
index 0000000..2bd8738
--- /dev/null
+++ b/third_party/blink/public/mojom/worker/subresource_loader_updater.mojom
@@ -0,0 +1,16 @@
+// 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.
+
+module blink.mojom;
+
+import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
+
+// An interface for pushing updated subresource loader factories to workers in
+// renderers, for example, after Network Service crashes or DevTools network
+// interception is enabled/disabled.
+interface SubresourceLoaderUpdater {
+  // Pushes updated set of subresource URL loader factories to a renderer.
+  UpdateSubresourceLoaderFactories(
+      URLLoaderFactoryBundle subresource_loader_factories);
+};
diff --git a/third_party/blink/public/platform/modules/p2p/OWNERS b/third_party/blink/public/platform/modules/p2p/OWNERS
new file mode 100644
index 0000000..de19af2
--- /dev/null
+++ b/third_party/blink/public/platform/modules/p2p/OWNERS
@@ -0,0 +1 @@
+file://third_party/blink/renderer/platform/p2p/OWNERS
diff --git a/third_party/blink/public/platform/modules/p2p/network_manager_uma.h b/third_party/blink/public/platform/modules/p2p/network_manager_uma.h
new file mode 100644
index 0000000..f26a93b
--- /dev/null
+++ b/third_party/blink/public/platform/modules/p2p/network_manager_uma.h
@@ -0,0 +1,37 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_P2P_NETWORK_MANAGER_UMA_H_
+#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_P2P_NETWORK_MANAGER_UMA_H_
+
+#include "third_party/blink/public/platform/web_common.h"
+
+namespace base {
+class TimeDelta;
+}  // namespace base
+
+namespace blink {
+
+// TODO(crbug.com/787254): Move the enum and helper methods here
+// out of the Blink exposed API when all users of it have been Onion souped.
+
+// Need to be kept the same order as in histograms.xml
+enum IPPermissionStatus {
+  PERMISSION_UNKNOWN,  // Requested but have never fired SignalNetworksChanged.
+  PERMISSION_NOT_REQUESTED,             // Multiple routes is not requested.
+  PERMISSION_DENIED,                    // Requested but denied.
+  PERMISSION_GRANTED_WITH_CHECKING,     // Requested and granted after checking
+                                        // mic/camera permission.
+  PERMISSION_GRANTED_WITHOUT_CHECKING,  // Requested and granted without
+                                        // checking mic/camera permission.
+  PERMISSION_MAX,
+};
+
+BLINK_PLATFORM_EXPORT void ReportIPPermissionStatus(IPPermissionStatus status);
+BLINK_PLATFORM_EXPORT void ReportTimeToUpdateNetworkList(
+    const base::TimeDelta& ticks);
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_P2P_NETWORK_MANAGER_UMA_H_
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index 785fda8..dbe2e555 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -108,7 +108,6 @@
   BLINK_PLATFORM_EXPORT static void EnableGenericSensorExtraClasses(bool);
   BLINK_PLATFORM_EXPORT static void EnableImplicitRootScroller(bool);
   BLINK_PLATFORM_EXPORT static void EnableInputMultipleFieldsUI(bool);
-  BLINK_PLATFORM_EXPORT static void EnableJankTrackingSweepLine(bool);
   BLINK_PLATFORM_EXPORT static void EnableBuiltInModuleAll(bool);
   BLINK_PLATFORM_EXPORT static void EnableBuiltInModuleInfra(bool);
   BLINK_PLATFORM_EXPORT static void EnableBuiltInModuleKvStorage(bool);
diff --git a/third_party/blink/public/platform/web_url_request.h b/third_party/blink/public/platform/web_url_request.h
index 9d0c1ca..9fb3898 100644
--- a/third_party/blink/public/platform/web_url_request.h
+++ b/third_party/blink/public/platform/web_url_request.h
@@ -184,6 +184,10 @@
   BLINK_PLATFORM_EXPORT WebSecurityOrigin RequestorOrigin() const;
   BLINK_PLATFORM_EXPORT void SetRequestorOrigin(const WebSecurityOrigin&);
 
+  // The origin of the isolated world - set if this is a fetch/XHR initiated by
+  // an isolated world.
+  BLINK_PLATFORM_EXPORT WebSecurityOrigin IsolatedWorldOrigin() const;
+
   // Controls whether user name, password, and cookies may be sent with the
   // request.
   BLINK_PLATFORM_EXPORT bool AllowStoredCredentials() const;
diff --git a/third_party/blink/renderer/bindings/scripts/idl_validator.py b/third_party/blink/renderer/bindings/scripts/idl_validator.py
index e75099e..85de1cc 100644
--- a/third_party/blink/renderer/bindings/scripts/idl_validator.py
+++ b/third_party/blink/renderer/bindings/scripts/idl_validator.py
@@ -60,6 +60,15 @@
                 self.validate_extended_attributes_node(operation)
                 for argument in operation.arguments:
                     self.validate_extended_attributes_node(argument)
+        for dictionary in definitions.dictionaries.itervalues():
+            self.validate_extended_attributes_node(dictionary)
+            for member in dictionary.members:
+                self.validate_extended_attributes_node(member)
+        for callback_function in definitions.callback_functions.itervalues():
+            self.validate_extended_attributes_node(callback_function)
+            for argument in callback_function.arguments:
+                self.validate_extended_attributes_node(argument)
+
 
     def validate_extended_attributes_node(self, node):
         for name, values_string in node.extended_attributes.iteritems():
diff --git a/third_party/blink/renderer/core/animation/timing.cc b/third_party/blink/renderer/core/animation/timing.cc
index c28a33d..dc97d45 100644
--- a/third_party/blink/renderer/core/animation/timing.cc
+++ b/third_party/blink/renderer/core/animation/timing.cc
@@ -182,9 +182,9 @@
   const base::Optional<double> directed_progress = CalculateDirectedProgress(
       simple_iteration_progress, current_iteration, direction);
 
-  progress = CalculateTransformedProgress(
-      current_phase, directed_progress, iteration_duration,
-      current_direction_is_forwards, timing_function);
+  progress = CalculateTransformedProgress(current_phase, directed_progress,
+                                          current_direction_is_forwards,
+                                          timing_function);
 
   double time_to_next_iteration = std::numeric_limits<double>::infinity();
   // Conditionally compute the time to next iteration, which is only
diff --git a/third_party/blink/renderer/core/animation/timing_calculations.h b/third_party/blink/renderer/core/animation/timing_calculations.h
index f6cd800..1db027f 100644
--- a/third_party/blink/renderer/core/animation/timing_calculations.h
+++ b/third_party/blink/renderer/core/animation/timing_calculations.h
@@ -279,7 +279,6 @@
 static inline base::Optional<double> CalculateTransformedProgress(
     Timing::Phase phase,
     base::Optional<double> directed_progress,
-    double iteration_duration,
     bool is_current_direction_forward,
     scoped_refptr<TimingFunction> timing_function) {
   if (!directed_progress)
diff --git a/third_party/blink/renderer/core/animation/timing_calculations_test.cc b/third_party/blink/renderer/core/animation/timing_calculations_test.cc
index 6163aa0..4fe43a05 100644
--- a/third_party/blink/renderer/core/animation/timing_calculations_test.cc
+++ b/third_party/blink/renderer/core/animation/timing_calculations_test.cc
@@ -317,7 +317,7 @@
 
 TEST(AnimationTimingCalculationsTest, TransformedProgress) {
   // CalculateTransformedProgress(
-  //     phase, directed_progress, iteration_duraction,
+  //     phase, directed_progress,
   //     is_current_direction_forward, timing_function)
 
   scoped_refptr<TimingFunction> timing_function =
@@ -325,53 +325,53 @@
 
   // directed_progress is null.
   EXPECT_FALSE(CalculateTransformedProgress(Timing::kPhaseActive, base::nullopt,
-                                            1, true, timing_function));
+                                            true, timing_function));
 
   // At step boundaries.
   // Forward direction.
-  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseBefore, 0, 1, true,
+  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseBefore, 0, true,
                                             timing_function));
-  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseBefore, 0.25, 1, true,
+  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseBefore, 0.25, true,
                                             timing_function));
-  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseAfter, 0.25, 1,
-                                               true, timing_function));
-  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseBefore, 0.5, 1,
-                                               true, timing_function));
-  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseAfter, 0.5, 1, true,
-                                              timing_function));
-  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseBefore, 0.75, 1,
-                                              true, timing_function));
-  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseAfter, 0.75, 1,
-                                               true, timing_function));
-  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseBefore, 1, 1, true,
+  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseAfter, 0.25, true,
                                                timing_function));
-  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseAfter, 1, 1, true,
+  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseBefore, 0.5, true,
+                                               timing_function));
+  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseAfter, 0.5, true,
+                                              timing_function));
+  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseBefore, 0.75, true,
+                                              timing_function));
+  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseAfter, 0.75, true,
+                                               timing_function));
+  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseBefore, 1, true,
+                                               timing_function));
+  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseAfter, 1, true,
                                             timing_function));
   // Reverse direction.
-  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseBefore, 1, 1, false,
+  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseBefore, 1, false,
                                             timing_function));
-  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseAfter, 1, 1, false,
+  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseAfter, 1, false,
                                                timing_function));
-  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseBefore, 0.75, 1,
+  EXPECT_EQ(0.75, CalculateTransformedProgress(Timing::kPhaseBefore, 0.75,
                                                false, timing_function));
-  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseAfter, 0.75, 1,
-                                              false, timing_function));
-  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseBefore, 0.5, 1,
-                                              false, timing_function));
-  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseAfter, 0.5, 1,
+  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseAfter, 0.75, false,
+                                              timing_function));
+  EXPECT_EQ(0.5, CalculateTransformedProgress(Timing::kPhaseBefore, 0.5, false,
+                                              timing_function));
+  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseAfter, 0.5, false,
+                                               timing_function));
+  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseBefore, 0.25,
                                                false, timing_function));
-  EXPECT_EQ(0.25, CalculateTransformedProgress(Timing::kPhaseBefore, 0.25, 1,
-                                               false, timing_function));
-  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseAfter, 0.25, 1, false,
+  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseAfter, 0.25, false,
                                             timing_function));
 
   // Edges cases
-  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseAfter, 1 - 1e-16, 1,
+  EXPECT_EQ(1, CalculateTransformedProgress(Timing::kPhaseAfter, 1 - 1e-16,
                                             true, timing_function));
   scoped_refptr<TimingFunction> step_start_timing_function =
       StepsTimingFunction::Create(4, StepsTimingFunction::StepPosition::START);
-  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseAfter, 1e-16, 1,
-                                            false, step_start_timing_function));
+  EXPECT_EQ(0, CalculateTransformedProgress(Timing::kPhaseAfter, 1e-16, false,
+                                            step_start_timing_function));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
index a6f8e15..5cfbbd67 100644
--- a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
+++ b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
@@ -47,57 +47,6 @@
     waitable_event.Wait();
   }
 
-  void CheckCustomProperties(const PaintWorkletStylePropertyMap* map,
-                             DummyExceptionStateForTesting& exception_state) {
-    const CSSStyleValue* foo = map->get(nullptr, "--foo", exception_state);
-    ASSERT_NE(nullptr, foo);
-    ASSERT_EQ(CSSStyleValue::kUnknownType, foo->GetType());
-    EXPECT_FALSE(exception_state.HadException());
-
-    EXPECT_EQ(true, map->has(nullptr, "--foo", exception_state));
-    EXPECT_FALSE(exception_state.HadException());
-
-    CSSStyleValueVector fooAll = map->getAll(nullptr, "--foo", exception_state);
-    EXPECT_EQ(1U, fooAll.size());
-    ASSERT_NE(nullptr, fooAll[0]);
-    ASSERT_EQ(CSSStyleValue::kUnknownType, fooAll[0]->GetType());
-    EXPECT_FALSE(exception_state.HadException());
-
-    EXPECT_EQ(nullptr, map->get(nullptr, "--quix", exception_state));
-    EXPECT_FALSE(exception_state.HadException());
-
-    EXPECT_EQ(false, map->has(nullptr, "--quix", exception_state));
-    EXPECT_FALSE(exception_state.HadException());
-
-    EXPECT_EQ(CSSStyleValueVector(),
-              map->getAll(nullptr, "--quix", exception_state));
-    EXPECT_FALSE(exception_state.HadException());
-  }
-
-  void CheckNativeProperties(const PaintWorkletStylePropertyMap* map,
-                             DummyExceptionStateForTesting& exception_state) {
-    map->get(nullptr, "color", exception_state);
-    EXPECT_FALSE(exception_state.HadException());
-
-    map->has(nullptr, "color", exception_state);
-    EXPECT_FALSE(exception_state.HadException());
-
-    map->getAll(nullptr, "color", exception_state);
-    EXPECT_FALSE(exception_state.HadException());
-
-    map->get(nullptr, "align-contents", exception_state);
-    EXPECT_TRUE(exception_state.HadException());
-    exception_state.ClearException();
-
-    map->has(nullptr, "align-contents", exception_state);
-    EXPECT_TRUE(exception_state.HadException());
-    exception_state.ClearException();
-
-    map->getAll(nullptr, "align-contents", exception_state);
-    EXPECT_TRUE(exception_state.HadException());
-    exception_state.ClearException();
-  }
-
   void CheckCrossThreadData(base::WaitableEvent* waitable_event,
                             scoped_refptr<PaintWorkletInput> input) {
     DCHECK(!IsMainThread());
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc
index 21f45f6..3a7be73 100644
--- a/third_party/blink/renderer/core/fetch/fetch_manager.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -568,8 +568,16 @@
   // "- |request|'s url's scheme is 'about'"
   // Note we don't support to call this method with |CORS flag|
   // "- |request|'s mode is |navigate|".
-  if ((SecurityOrigin::Create(fetch_request_data_->Url())
-           ->IsSameSchemeHostPort(fetch_request_data_->Origin().get())) ||
+  bool is_target_same_origin_as_initiator =
+      SecurityOrigin::Create(fetch_request_data_->Url())
+          ->IsSameSchemeHostPort(fetch_request_data_->Origin().get());
+  bool is_target_same_origin_as_isolated_world =
+      fetch_request_data_->IsolatedWorldOrigin() &&
+      SecurityOrigin::Create(fetch_request_data_->Url())
+          ->IsSameSchemeHostPort(
+              fetch_request_data_->IsolatedWorldOrigin().get());
+  if (is_target_same_origin_as_initiator ||
+      is_target_same_origin_as_isolated_world ||
       (fetch_request_data_->Url().ProtocolIsData() &&
        fetch_request_data_->SameOriginDataURLFlag()) ||
       network::IsNavigationRequestMode(fetch_request_data_->Mode())) {
@@ -695,6 +703,7 @@
   // FIXME: Support body.
   ResourceRequest request(fetch_request_data_->Url());
   request.SetRequestorOrigin(fetch_request_data_->Origin());
+  request.SetIsolatedWorldOrigin(fetch_request_data_->IsolatedWorldOrigin());
   request.SetRequestContext(fetch_request_data_->Context());
   request.SetHttpMethod(fetch_request_data_->Method());
   request.SetFetchWindowId(fetch_request_data_->WindowId());
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.cc b/third_party/blink/renderer/core/fetch/fetch_request_data.cc
index 24fa093..d94c542c 100644
--- a/third_party/blink/renderer/core/fetch/fetch_request_data.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_request_data.cc
@@ -132,6 +132,7 @@
   request->method_ = method_;
   request->header_list_ = header_list_->Clone();
   request->origin_ = origin_;
+  request->isolated_world_origin_ = isolated_world_origin_;
   request->same_origin_data_url_flag_ = same_origin_data_url_flag_;
   request->context_ = context_;
   request->referrer_string_ = referrer_string_;
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.h b/third_party/blink/renderer/core/fetch/fetch_request_data.h
index 86b6f85..85cb308 100644
--- a/third_party/blink/renderer/core/fetch/fetch_request_data.h
+++ b/third_party/blink/renderer/core/fetch/fetch_request_data.h
@@ -51,10 +51,17 @@
   const KURL& Url() const { return url_; }
   mojom::RequestContextType Context() const { return context_; }
   void SetContext(mojom::RequestContextType context) { context_ = context; }
-  scoped_refptr<const SecurityOrigin> Origin() { return origin_; }
+  scoped_refptr<const SecurityOrigin> Origin() const { return origin_; }
   void SetOrigin(scoped_refptr<const SecurityOrigin> origin) {
     origin_ = std::move(origin);
   }
+  scoped_refptr<const SecurityOrigin> IsolatedWorldOrigin() const {
+    return isolated_world_origin_;
+  }
+  void SetIsolatedWorldOrigin(
+      scoped_refptr<const SecurityOrigin> isolated_world_origin) {
+    isolated_world_origin_ = std::move(isolated_world_origin);
+  }
   bool SameOriginDataURLFlag() { return same_origin_data_url_flag_; }
   void SetSameOriginDataURLFlag(bool flag) {
     same_origin_data_url_flag_ = flag;
@@ -130,6 +137,7 @@
   // FIXME: Support m_skipServiceWorkerFlag;
   mojom::RequestContextType context_;
   scoped_refptr<const SecurityOrigin> origin_;
+  scoped_refptr<const SecurityOrigin> isolated_world_origin_;
   // FIXME: Support m_forceOriginHeaderFlag;
   bool same_origin_data_url_flag_;
   AtomicString referrer_string_;
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc
index e96e23c..a51494a 100644
--- a/third_party/blink/renderer/core/fetch/request.cc
+++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -54,14 +54,12 @@
   request->SetURL(original->Url());
   request->SetMethod(original->Method());
   request->SetHeaderList(original->HeaderList()->Clone());
+  request->SetOrigin(ExecutionContext::From(script_state)->GetSecurityOrigin());
   // FIXME: Set client.
   DOMWrapperWorld& world = script_state->World();
   if (world.IsIsolatedWorld()) {
-    request->SetOrigin(world.IsolatedWorldSecurityOrigin());
+    request->SetIsolatedWorldOrigin(world.IsolatedWorldSecurityOrigin());
     request->SetShouldAlsoUseFactoryBoundOriginForCors(true);
-  } else {
-    request->SetOrigin(
-        ExecutionContext::From(script_state)->GetSecurityOrigin());
   }
   // FIXME: Set ForceOriginHeaderFlag.
   request->SetSameOriginDataURLFlag(true);
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 4cc459d..af1bda9 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2621,12 +2621,12 @@
     CollectLinkHighlightLayersForLayerListRecursively(context, child);
 }
 
-static void PaintGraphicsLayerRecursively(GraphicsLayer* layer) {
-  layer->PaintRecursively();
-
+static bool PaintGraphicsLayerRecursively(GraphicsLayer* layer) {
+  bool painted = layer->PaintRecursively();
 #if DCHECK_IS_ON()
   VerboseLogGraphicsLayerTree(layer);
 #endif
+  return painted;
 }
 
 void LocalFrameView::PaintTree() {
@@ -2689,7 +2689,13 @@
     // the host page and will be painted during painting of the host page.
     if (GraphicsLayer* root_graphics_layer =
             layout_view->Compositor()->PaintRootGraphicsLayer()) {
-      PaintGraphicsLayerRecursively(root_graphics_layer);
+      bool painted = PaintGraphicsLayerRecursively(root_graphics_layer);
+      if (painted) {
+        // If the painted result changed, the painted hit test display items may
+        // have changed which will affect the mapped hit test geometry.
+        if (GetScrollingCoordinator())
+          GetScrollingCoordinator()->NotifyGeometryChanged(this);
+      }
     }
 
     // This uses an invalidation approach based on graphics layer raster
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 209e34eb..690a168 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -71,8 +71,7 @@
                     : network::mojom::RequestContextFrameType::kNested);
 
   const KURL& url = frame_request.GetResourceRequest().Url();
-  if (frame_request.OriginDocument() &&
-      !frame_request.OriginDocument()->GetSecurityOrigin()->CanDisplay(url)) {
+  if (!frame_request.CanDisplay(url)) {
     frame_request.OriginDocument()->AddConsoleMessage(ConsoleMessage::Create(
         mojom::ConsoleMessageSource::kSecurity,
         mojom::ConsoleMessageLevel::kError,
diff --git a/third_party/blink/renderer/core/html/forms/external_date_time_chooser.cc b/third_party/blink/renderer/core/html/forms/external_date_time_chooser.cc
index ae3bf862..b8096f3 100644
--- a/third_party/blink/renderer/core/html/forms/external_date_time_chooser.cc
+++ b/third_party/blink/renderer/core/html/forms/external_date_time_chooser.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/core/html/forms/external_date_time_chooser.h"
 
 #include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/forms/date_time_chooser_client.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
@@ -117,9 +118,20 @@
 }
 
 void ExternalDateTimeChooser::DidChooseValue(double value) {
+  // Cache the owner element first, because DidChooseValue might run
+  // JavaScript code and destroy |client|.
+  Element* element = client_ ? &client_->OwnerElement() : nullptr;
   if (client_)
     client_->DidChooseValue(value);
-  // didChooseValue might run JavaScript code, and endChooser() might be
+
+  // Post an accessibility event on the owner element to indicate the
+  // value changed.
+  if (element) {
+    if (AXObjectCache* cache = element->GetDocument().ExistingAXObjectCache())
+      cache->HandleValueChanged(element);
+  }
+
+  // DidChooseValue might run JavaScript code, and endChooser() might be
   // called. However DateTimeChooserCompletionImpl still has one reference to
   // this object.
   if (client_)
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js b/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
index 8c3d925..693ad30 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
@@ -2083,7 +2083,7 @@
 function YearListCell(shortMonthLabels) {
   ListCell.call(this);
   this.element.classList.add(YearListCell.ClassNameYearListCell);
-  this.element.style.height = YearListCell.Height + 'px';
+  this.element.style.height = YearListCell.GetHeight() + 'px';
 
   /**
    * @type {!Element}
@@ -2091,8 +2091,8 @@
    */
   this.label = createElement('div', YearListCell.ClassNameLabel, '----');
   this.element.appendChild(this.label);
-  this.label.style.height = (YearListCell.Height - YearListCell.BorderBottomWidth) + 'px';
-  this.label.style.lineHeight = (YearListCell.Height - YearListCell.BorderBottomWidth) + 'px';
+  this.label.style.height = (YearListCell.GetHeight() - YearListCell.BorderBottomWidth) + 'px';
+  this.label.style.lineHeight = (YearListCell.GetHeight() - YearListCell.BorderBottomWidth) + 'px';
 
   /**
    * @type {!Array} Array of the 12 month button elements.
@@ -2129,11 +2129,25 @@
 
 YearListCell.prototype = Object.create(ListCell.prototype);
 
-YearListCell.Height = hasInaccuratePointingDevice() ? 31 : 25;
+YearListCell._Height = hasInaccuratePointingDevice() ? 31 : 25;
+YearListCell._HeightRefresh = 25;
+YearListCell.GetHeight = function() {
+  if (global.params.isFormControlsRefreshEnabled) {
+    return YearListCell._HeightRefresh;
+  }
+  return YearListCell._Height;
+}
 YearListCell.BorderBottomWidth = 1;
 YearListCell.ButtonRows = 3;
 YearListCell.ButtonColumns = 4;
-YearListCell.SelectedHeight = hasInaccuratePointingDevice() ? 127 : 121;
+YearListCell._SelectedHeight = hasInaccuratePointingDevice() ? 127 : 121;
+YearListCell._SelectedHeightRefresh = 121;
+YearListCell.GetSelectedHeight = function() {
+  if (global.params.isFormControlsRefreshEnabled) {
+    return YearListCell._SelectedHeightRefresh;
+  }
+  return YearListCell._SelectedHeight;
+}
 YearListCell.ClassNameYearListCell = 'year-list-cell';
 YearListCell.ClassNameLabel = 'label';
 YearListCell.ClassNameMonthChooser = 'month-chooser';
@@ -2207,9 +2221,9 @@
    */
   this._maximumMonth = maximumMonth;
 
-  this.scrollView.minimumContentOffset = (this._minimumMonth.year - 1) * YearListCell.Height;
+  this.scrollView.minimumContentOffset = (this._minimumMonth.year - 1) * YearListCell.GetHeight();
   this.scrollView.maximumContentOffset =
-      (this._maximumMonth.year - 1) * YearListCell.Height + YearListCell.SelectedHeight;
+      (this._maximumMonth.year - 1) * YearListCell.GetHeight() + YearListCell.GetSelectedHeight();
 
   /**
    * @type {!Object}
@@ -2244,7 +2258,15 @@
 
 YearListView.prototype = Object.create(ListView.prototype);
 
-YearListView.Height = YearListCell.SelectedHeight - 1;
+YearListView._Height = YearListCell._SelectedHeight - 1;
+YearListView._VisibleYearsRefresh = 3;
+YearListView._HeightRefresh = YearListCell._SelectedHeightRefresh - 1 + YearListView._VisibleYearsRefresh * YearListCell._HeightRefresh;
+YearListView.GetHeight = function() {
+  if (global.params.isFormControlsRefreshEnabled) {
+    return YearListView._HeightRefresh;
+  }
+  return YearListView._Height;
+}
 YearListView.EventTypeYearListViewDidHide = 'yearListViewDidHide';
 YearListView.EventTypeYearListViewDidSelectMonth = 'yearListViewDidSelectMonth';
 
@@ -2318,7 +2340,7 @@
  */
 YearListView.prototype._animateRow = function(row, direction) {
   var fromValue =
-      direction === YearListView.RowAnimationDirection.Closing ? YearListCell.SelectedHeight : YearListCell.Height;
+      direction === YearListView.RowAnimationDirection.Closing ? YearListCell.GetSelectedHeight() : YearListCell.GetHeight();
   var oldAnimator = this._runningAnimators[row];
   if (oldAnimator) {
     oldAnimator.stop();
@@ -2329,7 +2351,7 @@
   animator.step = this.onCellHeightAnimatorStep;
   animator.setFrom(fromValue);
   animator.setTo(
-      direction === YearListView.RowAnimationDirection.Opening ? YearListCell.SelectedHeight : YearListCell.Height);
+      direction === YearListView.RowAnimationDirection.Opening ? YearListCell.GetSelectedHeight() : YearListCell.GetHeight());
   animator.timingFunction = AnimationTimingFunction.EaseInOut;
   animator.duration = 300;
   animator.row = row;
@@ -2369,7 +2391,7 @@
   if (this.selectedRow !== oldSelectedRow) {
     var month = this.highlightedMonth ? this.highlightedMonth.month : 0;
     this.dispatchEvent(YearListView.EventTypeYearListViewDidSelectMonth, this, new Month(year, month));
-    this.scrollView.scrollTo(this.selectedRow * YearListCell.Height, true);
+    this.scrollView.scrollTo(this.selectedRow * YearListCell.GetHeight(), true);
   } else {
     var monthButton = enclosingNodeOrSelfWithClass(event.target, YearListCell.ClassNameMonthButton);
     if (!monthButton || monthButton.getAttribute('aria-disabled') == 'true')
@@ -2396,17 +2418,17 @@
   for (var i = 0; i < rowsWithIrregularHeight.length; ++i) {
     var row = rowsWithIrregularHeight[i];
     var animator = this._runningAnimators[row];
-    var rowHeight = animator ? animator.currentValue : YearListCell.SelectedHeight;
-    if (remainingOffset <= (row - lastAnimatingRow) * YearListCell.Height) {
-      return lastAnimatingRow + Math.floor(remainingOffset / YearListCell.Height);
+    var rowHeight = animator ? animator.currentValue : YearListCell.GetSelectedHeight();
+    if (remainingOffset <= (row - lastAnimatingRow) * YearListCell.GetHeight()) {
+      return lastAnimatingRow + Math.floor(remainingOffset / YearListCell.GetHeight());
     }
-    remainingOffset -= (row - lastAnimatingRow) * YearListCell.Height;
-    if (remainingOffset <= (rowHeight - YearListCell.Height))
+    remainingOffset -= (row - lastAnimatingRow) * YearListCell.GetHeight();
+    if (remainingOffset <= (rowHeight - YearListCell.GetHeight()))
       return row;
-    remainingOffset -= rowHeight - YearListCell.Height;
+    remainingOffset -= rowHeight - YearListCell.GetHeight();
     lastAnimatingRow = row;
   }
-  return lastAnimatingRow + Math.floor(remainingOffset / YearListCell.Height);
+  return lastAnimatingRow + Math.floor(remainingOffset / YearListCell.GetHeight());
 };
 
 /**
@@ -2415,16 +2437,16 @@
  * @override
  */
 YearListView.prototype.scrollOffsetForRow = function(row) {
-  var scrollOffset = row * YearListCell.Height;
+  var scrollOffset = row * YearListCell.GetHeight();
   for (var i = 0; i < this._animatingRows.length; ++i) {
     var animatingRow = this._animatingRows[i];
     if (animatingRow >= row)
       break;
     var animator = this._runningAnimators[animatingRow];
-    scrollOffset += animator.currentValue - YearListCell.Height;
+    scrollOffset += animator.currentValue - YearListCell.GetHeight();
   }
   if (this.selectedRow > -1 && this.selectedRow < row && !this._runningAnimators[this.selectedRow]) {
-    scrollOffset += YearListCell.SelectedHeight - YearListCell.Height;
+    scrollOffset += YearListCell.GetSelectedHeight() - YearListCell.GetHeight();
   }
   return scrollOffset;
 };
@@ -2459,9 +2481,9 @@
   if (animator)
     cell.setHeight(animator.currentValue);
   else if (row === this.selectedRow)
-    cell.setHeight(YearListCell.SelectedHeight);
+    cell.setHeight(YearListCell.GetSelectedHeight());
   else
-    cell.setHeight(YearListCell.Height);
+    cell.setHeight(YearListCell.GetHeight());
   return cell;
 };
 
@@ -2507,7 +2529,7 @@
   var selectedCell = this._cells[this.selectedRow];
   if (selectedCell) {
     selectedCell.setSelected(false);
-    selectedCell.setHeight(YearListCell.Height);
+    selectedCell.setHeight(YearListCell.GetHeight());
   }
   this.selectedRow = ListView.NoSelection;
   this.setNeedsUpdateCells(true);
@@ -2549,7 +2571,7 @@
     var selectedCell = this._cells[this.selectedRow];
     if (selectedCell) {
       selectedCell.setSelected(true);
-      selectedCell.setHeight(YearListCell.SelectedHeight);
+      selectedCell.setHeight(YearListCell.GetSelectedHeight());
     }
     var month = this.highlightedMonth ? this.highlightedMonth.month : 0;
     this.highlightMonth(new Month(this.selectedRow + 1, month));
@@ -2622,7 +2644,7 @@
   this.select(this.highlightedMonth.year - 1);
 
   this.dispatchEvent(YearListView.EventTypeYearListViewDidSelectMonth, this, month);
-  this.scrollView.scrollTo(this.selectedRow * YearListCell.Height, true);
+  this.scrollView.scrollTo(this.selectedRow * YearListCell.GetHeight(), true);
   return true;
 };
 
@@ -2653,10 +2675,10 @@
       eventHandled = true;
     }
   } else if (key == 'ArrowUp') {
-    this.scrollView.scrollBy(-YearListCell.Height, true);
+    this.scrollView.scrollBy(-YearListCell.GetHeight(), true);
     eventHandled = true;
   } else if (key == 'ArrowDown') {
-    this.scrollView.scrollBy(YearListCell.Height, true);
+    this.scrollView.scrollBy(YearListCell.GetHeight(), true);
     eventHandled = true;
   } else if (key == 'PageUp') {
     this.scrollView.scrollBy(-this.scrollView.height(), true);
@@ -2704,7 +2726,7 @@
   this.isVisible = true;
   document.body.appendChild(this.element);
   this.yearListView.setWidth(calendarTableRect.width - 2);
-  this.yearListView.setHeight(YearListView.Height);
+  this.yearListView.setHeight(YearListView.GetHeight());
   if (global.params.isLocaleRTL)
     this.yearListView.element.style.right = calendarTableRect.x + 'px';
   else
@@ -3913,7 +3935,7 @@
   var numberOfRows = global.params.isFormControlsRefreshEnabled ? CalendarPicker.VisibleRowsRefresh : rowForLastDayInMonth - rowForFirstDayInMonth + 1;
   var calendarTableViewHeight =
       CalendarTableHeaderView.GetHeight() + numberOfRows * DayCell.GetHeight() + CalendarTableView.GetBorderWidth() * 2 + CalendarTableView.GetTodayButtonHeight();
-  var height = (this.monthPopupView.isVisible ? YearListView.Height : calendarTableViewHeight) +
+  var height = (this.monthPopupView.isVisible ? YearListView.GetHeight() : calendarTableViewHeight) +
       CalendarHeaderView.Height + CalendarHeaderView.BottomMargin + CalendarPicker.Padding * 2 +
       CalendarPicker.BorderWidth * 2;
   this.setHeight(height);
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
index 270321a..b4969a72 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
+++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
@@ -115,4 +115,32 @@
   width: auto;
 }
 
+.year-list-view {
+  border: 0;
+}
 
+.scrubby-scroll-bar {
+  border: 0;
+}
+
+.scrubby-scroll-thumb {
+  width: 4px;
+}
+
+.year-list-cell {
+  border: 0;
+}
+
+.year-list-cell .label {
+  background-color: #EFEFEF;
+  border-color: #CECECE;
+}
+
+.month-button {
+  border-radius: 2px;
+  color: #101010;
+}
+
+.month-button.highlighted {
+  background-color: #F3F3F3;
+}
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
index 976bea3..c877e5c 100644
--- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
@@ -135,6 +135,7 @@
     return false;
   }
   LayoutUnit FreeSpaceForStretchAutoTracksStep() const override;
+  LayoutUnit MinContentForChild(LayoutBox&) const override;
   bool IsComputingSizeContainment() const override { return false; }
 };
 
@@ -149,10 +150,15 @@
       GridLayoutUtils::FlowAwareDirectionForChild(grid, child, kForColumns);
   if (direction == child_inline_direction) {
     return child.HasRelativeLogicalWidth() ||
-           child.StyleRef().LogicalWidth().IsIntrinsicOrAuto();
+           child.StyleRef().LogicalWidth().IsIntrinsicOrAuto() ||
+           child.StyleRef().MarginStart().IsPercentOrCalc() ||
+           child.StyleRef().MarginEnd().IsPercentOrCalc();
   }
   return child.HasRelativeLogicalHeight() ||
-         child.StyleRef().LogicalHeight().IsIntrinsicOrAuto();
+         child.StyleRef().LogicalHeight().IsIntrinsicOrAuto() ||
+         child.StyleRef().MarginBefore().IsPercentOrCalc() ||
+         child.StyleRef().MarginAfter().IsPercentOrCalc();
+  ;
 }
 
 void GridTrackSizingAlgorithmStrategy::
@@ -577,6 +583,21 @@
   return algorithm_.FreeSpace(Direction()).value();
 }
 
+DISABLE_CFI_PERF
+LayoutUnit DefiniteSizeStrategy::MinContentForChild(LayoutBox& child) const {
+  GridTrackSizingDirection child_inline_direction =
+      GridLayoutUtils::FlowAwareDirectionForChild(*GetLayoutGrid(), child,
+                                                  kForColumns);
+  if (Direction() == child_inline_direction &&
+      ShouldClearOverrideContainingBlockContentSizeForChild(
+          *GetLayoutGrid(), child, child_inline_direction)) {
+    SetOverrideContainingBlockContentSizeForChild(child, child_inline_direction,
+                                                  LayoutUnit());
+  }
+
+  return GridTrackSizingAlgorithmStrategy::MinContentForChild(child);
+}
+
 void IndefiniteSizeStrategy::LayoutGridItemForMinSizeComputation(
     LayoutBox& child,
     bool override_size_has_changed) const {
diff --git a/third_party/blink/renderer/core/layout/layout_shift_region.h b/third_party/blink/renderer/core/layout/layout_shift_region.h
index 78a774bb..461cddf 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_region.h
+++ b/third_party/blink/renderer/core/layout/layout_shift_region.h
@@ -12,8 +12,7 @@
 
 namespace blink {
 
-// Represents a per-frame layout shift region for LayoutShiftTracker. Only used
-// when the JankTrackingSweepLine feature is enabled.
+// Represents a per-frame layout shift region for LayoutShiftTracker.
 //
 // This class uses a sweep line algorithm to compute the area in O(n log n) time
 // where n is the number of rects recorded by AddRect. For complex layout shift
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
index a6e22167..56508ed 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -28,8 +28,7 @@
 
 static constexpr base::TimeDelta kTimerDelay =
     base::TimeDelta::FromMilliseconds(500);
-static const float kRegionGranularitySteps = 60.0;
-// TODO: Vary by Finch experiment parameter.
+// TODO(crbug.com/1000716): Remove granularity scaling logic.
 static const float kSweepLineRegionGranularity = 1.0;
 static const float kMovementThreshold = 3.0;  // CSS pixels.
 
@@ -53,11 +52,7 @@
 
 float LayoutShiftTracker::RegionGranularityScale(
     const IntRect& viewport) const {
-  if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled())
-    return kSweepLineRegionGranularity;
-
-  return kRegionGranularitySteps /
-         std::min(viewport.Height(), viewport.Width());
+  return kSweepLineRegionGranularity;
 }
 
 static bool EqualWithinMovementThreshold(const FloatPoint& a,
@@ -220,13 +215,9 @@
   visible_old_rect.Scale(scale);
   visible_new_rect.Scale(scale);
 
-  if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled()) {
-    region_experimental_.AddRect(visible_old_rect);
-    region_experimental_.AddRect(visible_new_rect);
-  } else {
-    region_.Unite(Region(visible_old_rect));
-    region_.Unite(Region(visible_new_rect));
-  }
+  // TODO(crbug.com/1000716): Rename region_experimental_.
+  region_experimental_.AddRect(visible_old_rect);
+  region_experimental_.AddRect(visible_new_rect);
 }
 
 void LayoutShiftTracker::NotifyObjectPrePaint(
@@ -269,7 +260,7 @@
 void LayoutShiftTracker::NotifyPrePaintFinished() {
   if (!IsActive())
     return;
-  bool use_sweep_line = RuntimeEnabledFeatures::JankTrackingSweepLineEnabled();
+  bool use_sweep_line = true;
   bool region_is_empty =
       use_sweep_line ? region_experimental_.IsEmpty() : region_.IsEmpty();
   if (region_is_empty)
@@ -459,10 +450,8 @@
   float granularity_scale = RegionGranularityScale(
       IntRect(IntPoint(),
               frame_view_->GetScrollableArea()->VisibleContentRect().Size()));
-  if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled())
-    RegionToTracedValue(region_experimental_, granularity_scale, *value);
-  else
-    RegionToTracedValue(region_, granularity_scale, *value);
+
+  RegionToTracedValue(region_experimental_, granularity_scale, *value);
 
   value->SetBoolean("is_main_frame", frame_view_->GetFrame().IsMainFrame());
   value->SetBoolean("had_recent_input", input_detected);
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
index 29d33016..4b9287b7 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker_test.cc
@@ -60,23 +60,6 @@
   EXPECT_FLOAT_EQ(60.0, GetLayoutShiftTracker().OverallMaxDistance());
 }
 
-TEST_F(LayoutShiftTrackerTest, GranularitySnapping) {
-  if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled())
-    return;
-
-  SetBodyInnerHTML(R"HTML(
-    <style>
-      #j { position: relative; width: 304px; height: 104px; }
-    </style>
-    <div id='j'></div>
-  )HTML");
-  GetDocument().getElementById("j")->setAttribute(html_names::kStyleAttr,
-                                                  AtomicString("top: 58px"));
-  UpdateAllLifecyclePhases();
-  // Rect locations and sizes should snap to multiples of 600 / 60 = 10.
-  EXPECT_FLOAT_EQ(0.1, GetLayoutShiftTracker().Score());
-}
-
 TEST_F(LayoutShiftTrackerTest, Transform) {
   SetBodyInnerHTML(R"HTML(
     <style>
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
index 78354ef..a8a47d87 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
@@ -445,7 +445,8 @@
     }
 
     if (item.Type() == NGInlineItem::kOutOfFlowPositioned) {
-      AddItem(item, line_info);
+      NGInlineItemResult* item_result = AddItem(item, line_info);
+      ComputeCanBreakAfter(item_result, auto_wrap_, break_iterator_);
       MoveToNextOf(item);
     } else if (item.Length()) {
       NOTREACHED();
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.cc b/third_party/blink/renderer/core/loader/base_fetch_context.cc
index 33d2cac..c297d32 100644
--- a/third_party/blink/renderer/core/loader/base_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.cc
@@ -139,7 +139,7 @@
   // TODO(yhirano): Figure out if it's actually fine.
   DCHECK(network::IsNavigationRequestMode(request_mode) || origin);
   if (!network::IsNavigationRequestMode(request_mode) &&
-      !origin->CanDisplay(url)) {
+      !resource_request.CanDisplay(url)) {
     if (reporting_policy == SecurityViolationReportingPolicy::kReport) {
       AddConsoleMessage(ConsoleMessage::Create(
           mojom::ConsoleMessageSource::kJavaScript,
@@ -152,7 +152,9 @@
   }
 
   if (request_mode == network::mojom::RequestMode::kSameOrigin &&
-      cors::CalculateCorsFlag(url, origin.get(), request_mode)) {
+      cors::CalculateCorsFlag(url, origin.get(),
+                              resource_request.IsolatedWorldOrigin().get(),
+                              request_mode)) {
     PrintAccessDeniedMessage(url);
     return ResourceRequestBlockedReason::kOrigin;
   }
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.cc b/third_party/blink/renderer/core/loader/frame_load_request.cc
index ee2eeb0..270ec3c 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.cc
+++ b/third_party/blink/renderer/core/loader/frame_load_request.cc
@@ -89,4 +89,15 @@
   return ClientRedirectPolicy::kClientRedirect;
 }
 
+bool FrameLoadRequest::CanDisplay(const KURL& url) const {
+  if (OriginDocument() &&
+      OriginDocument()->GetSecurityOrigin()->CanDisplay(url))
+    return true;
+
+  if (resource_request_.CanDisplay(url))
+    return true;
+
+  return false;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.h b/third_party/blink/renderer/core/loader/frame_load_request.h
index 1bafa6b..dfc7593 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.h
+++ b/third_party/blink/renderer/core/loader/frame_load_request.h
@@ -41,6 +41,7 @@
 namespace blink {
 
 class HTMLFormElement;
+class KURL;
 
 struct CORE_EXPORT FrameLoadRequest {
   STACK_ALLOCATED();
@@ -139,6 +140,10 @@
     resource_request_.ClearHTTPOrigin();
   }
 
+  // Whether either OriginDocument, RequestorOrigin or IsolatedWorldOrigin can
+  // display the |url|,
+  bool CanDisplay(const KURL&) const;
+
  private:
   Member<Document> origin_document_;
   ResourceRequest resource_request_;
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 1c862cf..b92e161 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -545,7 +545,7 @@
       return false;
   }
 
-  if (!request.OriginDocument()->GetSecurityOrigin()->CanDisplay(url)) {
+  if (!request.CanDisplay(url)) {
     request.OriginDocument()->AddConsoleMessage(ConsoleMessage::Create(
         mojom::ConsoleMessageSource::kSecurity,
         mojom::ConsoleMessageLevel::kError,
diff --git a/third_party/blink/renderer/core/loader/threadable_loader.cc b/third_party/blink/renderer/core/loader/threadable_loader.cc
index 3794fc7..9b63eb8 100644
--- a/third_party/blink/renderer/core/loader/threadable_loader.cc
+++ b/third_party/blink/renderer/core/loader/threadable_loader.cc
@@ -250,6 +250,7 @@
     SECURITY_CHECK(cors::IsNoCorsAllowedContext(request_context_));
   }
   cors_flag_ = cors::CalculateCorsFlag(request.Url(), GetSecurityOrigin(),
+                                       request.IsolatedWorldOrigin().get(),
                                        request.GetMode());
 
   // The CORS flag variable is not yet used at the step in the spec that
@@ -613,12 +614,15 @@
 
     // Allow same origin requests to continue after allowing clients to audit
     // the redirect.
-    if (!(cors_flag_ || cors::CalculateCorsFlag(new_url, GetSecurityOrigin(),
-                                                new_request.GetMode()))) {
+    if (!(cors_flag_ ||
+          cors::CalculateCorsFlag(new_url, GetSecurityOrigin(),
+                                  new_request.IsolatedWorldOrigin().get(),
+                                  new_request.GetMode()))) {
       bool follow =
           client_->WillFollowRedirect(new_url, redirect_response_to_pass);
       response_tainting_ = cors::CalculateResponseTainting(
-          new_url, new_request.GetMode(), GetSecurityOrigin(), CorsFlag::Unset);
+          new_url, new_request.GetMode(), GetSecurityOrigin(),
+          new_request.IsolatedWorldOrigin().get(), CorsFlag::Unset);
       return follow;
     }
 
@@ -1024,6 +1028,7 @@
     if (actual_request_.IsNull()) {
       response_tainting_ = cors::CalculateResponseTainting(
           request.Url(), request.GetMode(), GetSecurityOrigin(),
+          request.IsolatedWorldOrigin().get(),
           cors_flag_ ? CorsFlag::Set : CorsFlag::Unset);
       request.SetAllowStoredCredentials(cors::CalculateCredentialsFlag(
           request.GetCredentialsMode(), response_tainting_));
diff --git a/third_party/blink/renderer/core/page/chrome_client.cc b/third_party/blink/renderer/core/page/chrome_client.cc
index 9e63a30..ee6869a 100644
--- a/third_party/blink/renderer/core/page/chrome_client.cc
+++ b/third_party/blink/renderer/core/page/chrome_client.cc
@@ -107,14 +107,10 @@
     WebSandboxFlags sandbox_flags,
     const FeaturePolicy::FeatureState& opener_feature_state,
     const SessionStorageNamespaceId& session_storage_namespace_id) {
-// This feature is being disabled on trunk but an easily-merged CL is needed for
-// merging back to stable. https://crbug.com/936080
-#if 0
   if (!CanOpenUIElementIfDuringPageDismissal(
           frame->Tree().Top(), UIElementType::kPopup, g_empty_string)) {
     return nullptr;
   }
-#endif
 
   return CreateWindowDelegate(frame, r, frame_name, features, sandbox_flags,
                               opener_feature_state,
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
index d3bf6a57..098cad0 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
@@ -1685,17 +1685,19 @@
   ForceFullCompositingUpdate();
   histogram_tester.ExpectTotalCount("Blink.ScrollingCoordinator.UpdateTime", 1);
 
-  // A change to background color should not cause a scrolling update.
+  // A change to background color does not need to cause a scrolling update but,
+  // because hit test display items paint, we also cause a scrolling coordinator
+  // update when the background paints.
   auto* background = GetFrame()->GetDocument()->getElementById("bg");
   background->removeAttribute(html_names::kStyleAttr);
   ForceFullCompositingUpdate();
-  histogram_tester.ExpectTotalCount("Blink.ScrollingCoordinator.UpdateTime", 1);
+  histogram_tester.ExpectTotalCount("Blink.ScrollingCoordinator.UpdateTime", 2);
 
   // Removing a scrollable area should cause a scrolling update.
   auto* scroller = GetFrame()->GetDocument()->getElementById("scroller");
   scroller->removeAttribute(html_names::kStyleAttr);
   ForceFullCompositingUpdate();
-  histogram_tester.ExpectTotalCount("Blink.ScrollingCoordinator.UpdateTime", 2);
+  histogram_tester.ExpectTotalCount("Blink.ScrollingCoordinator.UpdateTime", 3);
 }
 
 // TODO(pdr): Replace this with ScrollingCoordinatorTest when
@@ -1808,6 +1810,55 @@
   EXPECT_EQ(region.bounds(), gfx::Rect(-7, -7, 14, 14));
 }
 
+TEST_P(ScrollingCoordinatorTest, TouchActionUpdatesOutsideInterestRect) {
+  LoadHTML(R"HTML(
+    <!DOCTYPE html>
+    <style>
+      #scroller {
+        will-change: transform;
+        width: 200px;
+        height: 200px;
+        overflow-y: scroll;
+      }
+      .spacer {
+        height: 1000px;
+      }
+      #touchaction {
+        height: 100px;
+        background: yellow;
+      }
+    </style>
+    <div id="scroller">
+      <div class="spacer"></div>
+      <div class="spacer"></div>
+      <div class="spacer"></div>
+      <div class="spacer"></div>
+      <div class="spacer"></div>
+      <div id="touchaction">This should not scroll via touch.</div>
+    </div>
+  )HTML");
+
+  ForceFullCompositingUpdate();
+
+  auto* touch_action = GetFrame()->GetDocument()->getElementById("touchaction");
+  touch_action->setAttribute(html_names::kStyleAttr, "touch-action: none;");
+
+  ForceFullCompositingUpdate();
+
+  auto* scroller = GetFrame()->GetDocument()->getElementById("scroller");
+  scroller->GetScrollableArea()->SetScrollOffset(ScrollOffset(0, 5100),
+                                                 kProgrammaticScroll);
+
+  ForceFullCompositingUpdate();
+
+  auto* scroller_box = ToLayoutBox(scroller->GetLayoutObject());
+  auto* mapping = scroller_box->Layer()->GetCompositedLayerMapping();
+  auto* cc_layer = mapping->ScrollingContentsLayer()->CcLayer();
+  cc::Region region = cc_layer->touch_action_region().GetRegionForTouchAction(
+      TouchAction::kTouchActionNone);
+  EXPECT_EQ(region.bounds(), gfx::Rect(0, 5000, 200, 100));
+}
+
 class ScrollingCoordinatorTestWithAcceleratedContext
     : public ScrollingCoordinatorTest {
  public:
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index d55b63c..5cc85f2 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -195,8 +195,8 @@
       has_end_event_conditions_(false),
       is_waiting_for_first_interval_(true),
       is_scheduled_(false),
-      interval_(SMILInterval(SMILTime::Unresolved(), SMILTime::Unresolved())),
-      previous_interval_begin_(SMILTime::Unresolved()),
+      interval_{SMILTime::Unresolved(), SMILTime::Unresolved()},
+      previous_interval_{SMILTime::Unresolved(), SMILTime::Unresolved()},
       active_state_(kInactive),
       restart_(kRestartAlways),
       fill_(kFillRemove),
@@ -275,9 +275,8 @@
 
   active_state_ = kInactive;
   is_waiting_for_first_interval_ = true;
-  interval_.begin = SMILTime::Unresolved();
-  interval_.end = SMILTime::Unresolved();
-  previous_interval_begin_ = SMILTime::Unresolved();
+  interval_ = {SMILTime::Unresolved(), SMILTime::Unresolved()};
+  previous_interval_ = {SMILTime::Unresolved(), SMILTime::Unresolved()};
   last_percent_ = 0;
   last_repeat_ = 0;
   next_progress_time_ = 0;
@@ -973,16 +972,28 @@
   return modified;
 }
 
+const SMILInterval& SVGSMILElement::GetActiveInterval(double elapsed) const {
+  // If there's no current interval, return the previous interval.
+  if (!interval_.begin.IsFinite())
+    return previous_interval_;
+  // If there's a previous interval and the current interval hasn't begun yet,
+  // return the previous interval.
+  if (previous_interval_.begin.IsFinite() && elapsed < interval_.begin)
+    return previous_interval_;
+  return interval_;
+}
+
 unsigned SVGSMILElement::CalculateAnimationRepeat(double elapsed) const {
   const SMILTime simple_duration = SimpleDuration();
   if (simple_duration.IsIndefinite() || !simple_duration)
     return 0;
   DCHECK(simple_duration.IsFinite());
-  DCHECK(interval_.begin.IsFinite());
+  const SMILInterval& active_interval = GetActiveInterval(elapsed);
+  DCHECK(active_interval.begin.IsFinite());
 
-  double active_time = std::max(elapsed - interval_.begin.Value(), 0.0);
+  double active_time = std::max(elapsed - active_interval.begin.Value(), 0.0);
   SMILTime repeating_duration = RepeatingDuration();
-  if (elapsed >= interval_.end || active_time > repeating_duration) {
+  if (elapsed >= active_interval.end || active_time > repeating_duration) {
     if (!repeating_duration.IsFinite())
       return 0;
     unsigned repeat = static_cast<unsigned>(repeating_duration.Value() /
@@ -1005,20 +1016,23 @@
     return 1.f;
   }
   DCHECK(simple_duration.IsFinite());
-  DCHECK(interval_.begin.IsFinite());
+  const SMILInterval& active_interval = GetActiveInterval(elapsed);
+  DCHECK(active_interval.begin.IsFinite());
 
   SMILTime repeating_duration = RepeatingDuration();
-  double active_time = elapsed - interval_.begin.Value();
-  if (elapsed >= interval_.end || active_time > repeating_duration) {
+  double active_time = elapsed - active_interval.begin.Value();
+  if (elapsed >= active_interval.end || active_time > repeating_duration) {
     // Use the interval to compute the interval position if we've passed the
     // interval end, otherwise use the "repeating duration". This prevents a
     // stale interval (with for instance an 'indefinite' end) from yielding an
     // invalid interval position.
     double last_active_duration;
-    if (elapsed >= interval_.end)
-      last_active_duration = interval_.end.Value() - interval_.begin.Value();
-    else
+    if (elapsed >= active_interval.end) {
+      last_active_duration =
+          active_interval.end.Value() - active_interval.begin.Value();
+    } else {
       last_active_duration = repeating_duration.Value();
+    }
     double percent = last_active_duration / simple_duration.Value();
     percent = percent - floor(percent);
     float epsilon = std::numeric_limits<float>::epsilon();
@@ -1126,9 +1140,6 @@
 }
 
 void SVGSMILElement::Progress(double elapsed) {
-  float percent = CalculateAnimationPercent(elapsed);
-  unsigned repeat = CalculateAnimationRepeat(elapsed);
-
   base::Optional<SMILInterval> new_interval =
       CheckForNewRestartInterval(elapsed);
 
@@ -1136,7 +1147,7 @@
   bool interval_restart = (new_interval && *new_interval != interval_);
 
   if (new_interval) {
-    previous_interval_begin_ = interval_.begin;
+    previous_interval_ = interval_;
     interval_ = *new_interval;
     interval_has_changed_ = true;
   }
@@ -1150,13 +1161,14 @@
       StartedActiveInterval();
     }
 
+    unsigned repeat = CalculateAnimationRepeat(elapsed);
     if (repeat && repeat != last_repeat_) {
       last_repeat_ = repeat;
       NotifyDependentsIntervalChanged(interval_);
       ScheduleRepeatEvents();
     }
 
-    last_percent_ = percent;
+    last_percent_ = CalculateAnimationPercent(elapsed);
   }
 
   if ((old_active_state == kActive && GetActiveState() != kActive) ||
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
index a93c4bb60d..d5c9bd8a 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
@@ -81,7 +81,7 @@
   SMILTime Elapsed() const;
 
   SMILTime IntervalBegin() const { return interval_.begin; }
-  SMILTime PreviousIntervalBegin() const { return previous_interval_begin_; }
+  SMILTime PreviousIntervalBegin() const { return previous_interval_.begin; }
   SMILTime SimpleDuration() const;
 
   bool NeedsToProgress(double elapsed);
@@ -189,6 +189,7 @@
   SMILTime ResolveActiveEnd(SMILTime resolved_begin,
                             SMILTime resolved_end) const;
   SMILTime RepeatingDuration() const;
+  const SMILInterval& GetActiveInterval(double elapsed) const;
 
   base::Optional<SMILInterval> CheckForNewRestartInterval(double elapsed);
   void BeginListChanged(SMILTime event_time);
@@ -278,8 +279,9 @@
 
   // This is the upcoming or current interval
   SMILInterval interval_;
-
-  SMILTime previous_interval_begin_;
+  // This is the previous interval. It should always be non-overlapping and
+  // "before" |interval_|.
+  SMILInterval previous_interval_;
 
   unsigned active_state_ : 2;
   unsigned restart_ : 2;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 30fa6de..359306f 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -627,6 +627,11 @@
   DCHECK(initialized_);
 #endif
 
+  // All nodes must have an unignored parent within their tree under
+  // kRootWebArea, so force kRootWebArea to always be unignored.
+  if (role_ == ax::mojom::Role::kRootWebArea)
+    return false;
+
   if (!layout_object_) {
     if (ignored_reasons)
       ignored_reasons->push_back(IgnoredReason(kAXNotRendered));
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 50b5318..5d3b329b 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -334,6 +334,12 @@
   // it's been initialized.
   DCHECK(initialized_);
 #endif
+
+  // All nodes must have an unignored parent within their tree under
+  // kRootWebArea, so force kRootWebArea to always be unignored.
+  if (role_ == ax::mojom::Role::kRootWebArea)
+    return false;
+
   if (GetLayoutObject()) {
     if (role_ == ax::mojom::Role::kUnknown) {
       if (ignored_reasons)
diff --git a/third_party/blink/renderer/modules/nfc/nfc_utils.cc b/third_party/blink/renderer/modules/nfc/nfc_utils.cc
index 3cccd8ea..ffcb60f 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_utils.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_utils.cc
@@ -29,14 +29,14 @@
 }
 
 bool SetNDEFMessageURL(const String& origin,
-                       device::mojom::blink::NDEFMessage& message) {
+                       device::mojom::blink::NDEFMessage* message) {
   KURL origin_url(origin);
 
-  if (!message.url.IsEmpty() && origin_url.CanSetPathname()) {
-    origin_url.SetPath(message.url);
+  if (!message->url.IsEmpty() && origin_url.CanSetPathname()) {
+    origin_url.SetPath(message->url);
   }
 
-  message.url = origin_url;
+  message->url = origin_url;
   return origin_url.IsValid();
 }
 
diff --git a/third_party/blink/renderer/modules/nfc/nfc_utils.h b/third_party/blink/renderer/modules/nfc/nfc_utils.h
index fd00fa7..5acd979 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_utils.h
+++ b/third_party/blink/renderer/modules/nfc/nfc_utils.h
@@ -19,7 +19,7 @@
 size_t GetNDEFMessageSize(const device::mojom::blink::NDEFMessage& message);
 
 bool SetNDEFMessageURL(const String& origin,
-                       device::mojom::blink::NDEFMessage& message);
+                       device::mojom::blink::NDEFMessage* message);
 
 device::mojom::blink::NDEFCompatibility StringToNDEFCompatibility(
     const WTF::String& compatibility);
diff --git a/third_party/blink/renderer/modules/nfc/nfc_writer.cc b/third_party/blink/renderer/modules/nfc/nfc_writer.cc
index def7c44e..8b974d6 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_writer.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_writer.cc
@@ -84,7 +84,7 @@
   DCHECK(message);
 
   if (!SetNDEFMessageURL(execution_context->GetSecurityOrigin()->ToString(),
-                         *message)) {
+                         message.get())) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kSyntaxError, kNfcSetIdError));
diff --git a/third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.cc b/third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.cc
index e358e93..314ed4e4 100644
--- a/third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.h"
 
+#include "base/single_thread_task_runner.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
diff --git a/third_party/blink/renderer/modules/shapedetection/face_detector.cc b/third_party/blink/renderer/modules/shapedetection/face_detector.cc
index a0a130d..dda96e7 100644
--- a/third_party/blink/renderer/modules/shapedetection/face_detector.cc
+++ b/third_party/blink/renderer/modules/shapedetection/face_detector.cc
@@ -44,10 +44,11 @@
   if (auto* interface_provider = context->GetInterfaceProvider()) {
     interface_provider->GetInterface(std::move(request));
   }
-  provider->CreateFaceDetection(mojo::MakeRequest(&face_service_, task_runner),
-                                std::move(face_detector_options));
+  provider->CreateFaceDetection(
+      face_service_.BindNewPipeAndPassReceiver(task_runner),
+      std::move(face_detector_options));
 
-  face_service_.set_connection_error_handler(WTF::Bind(
+  face_service_.set_disconnect_handler(WTF::Bind(
       &FaceDetector::OnFaceServiceConnectionError, WrapWeakPersistent(this)));
 }
 
diff --git a/third_party/blink/renderer/modules/shapedetection/face_detector.h b/third_party/blink/renderer/modules/shapedetection/face_detector.h
index 8653708..7c5bb6b 100644
--- a/third_party/blink/renderer/modules/shapedetection/face_detector.h
+++ b/third_party/blink/renderer/modules/shapedetection/face_detector.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SHAPEDETECTION_FACE_DETECTOR_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_SHAPEDETECTION_FACE_DETECTOR_H_
 
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/shape_detection/public/mojom/facedetection.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -36,7 +37,7 @@
       Vector<shape_detection::mojom::blink::FaceDetectionResultPtr>);
   void OnFaceServiceConnectionError();
 
-  shape_detection::mojom::blink::FaceDetectionPtr face_service_;
+  mojo::Remote<shape_detection::mojom::blink::FaceDetection> face_service_;
 
   HeapHashSet<Member<ScriptPromiseResolver>> face_service_requests_;
 };
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 6e50b580..e7f80cc3 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1227,6 +1227,7 @@
     "mojo/revocable_strong_binding.h",
     "mojo/string16_mojom_traits.cc",
     "mojo/string16_mojom_traits.h",
+    "p2p/network_manager_uma.cc",
     "peerconnection/audio_codec_factory.cc",
     "peerconnection/rtc_answer_options_platform.h",
     "peerconnection/rtc_dtmf_sender_handler.cc",
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
index 9b4f14f..c91cbc8 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
@@ -29,7 +29,6 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/single_thread_task_runner.h"
 #include "gin/public/gin_embedders.h"
 #include "gin/public/isolate_holder.h"
 #include "third_party/blink/renderer/platform/bindings/runtime_call_stats.h"
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index f52bb1d..fdfc98d 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -220,10 +220,6 @@
   RuntimeEnabledFeatures::SetInputMultipleFieldsUIEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableJankTrackingSweepLine(bool enable) {
-  RuntimeEnabledFeatures::SetJankTrackingSweepLineEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableBuiltInModuleAll(bool enable) {
   RuntimeEnabledFeatures::SetBuiltInModuleAllEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/exported/web_url_request.cc b/third_party/blink/renderer/platform/exported/web_url_request.cc
index 8c10073..8e67cec0 100644
--- a/third_party/blink/renderer/platform/exported/web_url_request.cc
+++ b/third_party/blink/renderer/platform/exported/web_url_request.cc
@@ -120,6 +120,10 @@
   return resource_request_->RequestorOrigin();
 }
 
+WebSecurityOrigin WebURLRequest::IsolatedWorldOrigin() const {
+  return resource_request_->IsolatedWorldOrigin();
+}
+
 void WebURLRequest::SetRequestorOrigin(
     const WebSecurityOrigin& requestor_origin) {
   resource_request_->SetRequestorOrigin(requestor_origin);
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
index 259929e..5bd74b0 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -230,7 +230,7 @@
   return previous_interest_rect_;
 }
 
-void GraphicsLayer::PaintRecursively() {
+bool GraphicsLayer::PaintRecursively() {
   Vector<GraphicsLayer*> repainted_layers;
   PaintRecursivelyInternal(repainted_layers);
 
@@ -243,6 +243,7 @@
 #endif
     layer->GetPaintController().FinishCycle();
   }
+  return !repainted_layers.IsEmpty();
 }
 
 void GraphicsLayer::PaintRecursivelyInternal(
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h
index 4e0baa25..c733fa6 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.h
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -240,7 +240,7 @@
   static void UnregisterContentsLayer(cc::Layer*);
 
   IntRect InterestRect();
-  void PaintRecursively();
+  bool PaintRecursively();
   // Returns true if this layer is repainted.
   bool Paint(GraphicsContext::DisabledMode = GraphicsContext::kNothingDisabled);
 
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
index 53229560..0bae6d34 100644
--- a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
+++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
@@ -59,8 +59,6 @@
 
   if (compositor_frame_sink_)
     compositor_frame_sink_->SetNeedsBeginFrame(is_rendering_ && ShouldSubmit());
-
-  frame_trackers_.StartSequence(cc::FrameSequenceTrackerType::kVideo);
 }
 
 void VideoFrameSubmitter::StopRendering() {
@@ -69,9 +67,6 @@
   DCHECK(video_frame_provider_);
 
   is_rendering_ = false;
-
-  frame_trackers_.StopSequence(cc::FrameSequenceTrackerType::kVideo);
-
   UpdateSubmissionState();
 }
 
@@ -174,9 +169,6 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   TRACE_EVENT0("media", "VideoFrameSubmitter::OnBeginFrame");
 
-  frame_trackers_.NotifyBeginImplFrame(args);
-  last_begin_frame_args_ = args;
-
   for (const auto& pair : timing_details) {
     if (viz::FrameTokenGT(pair.key, *next_frame_token_))
       continue;
@@ -184,11 +176,6 @@
     if (base::Contains(frame_token_to_timestamp_map_, pair.key) &&
         !(pair.value->presentation_feedback->flags &
           gfx::PresentationFeedback::kFailure)) {
-      frame_trackers_.NotifyFramePresented(
-          pair.key, gfx::PresentationFeedback(
-                        pair.value->presentation_feedback->timestamp,
-                        pair.value->presentation_feedback->interval,
-                        pair.value->presentation_feedback->flags));
       UMA_HISTOGRAM_TIMES("Media.VideoFrameSubmitter",
                           pair.value->presentation_feedback->timestamp -
                               frame_token_to_timestamp_map_[pair.key]);
@@ -205,7 +192,6 @@
   viz::BeginFrameAck current_begin_frame_ack(args, false);
   if (args.type == viz::BeginFrameArgs::MISSED || !is_rendering_) {
     compositor_frame_sink_->DidNotProduceFrame(current_begin_frame_ack);
-    frame_trackers_.NotifyImplFrameCausedNoDamage(current_begin_frame_ack);
     return;
   }
 
@@ -217,7 +203,6 @@
                                     args.frame_time + args.interval,
                                     args.frame_time + 2 * args.interval)) {
     compositor_frame_sink_->DidNotProduceFrame(current_begin_frame_ack);
-    frame_trackers_.NotifyImplFrameCausedNoDamage(current_begin_frame_ack);
     return;
   }
 
@@ -232,7 +217,6 @@
   if (waiting_for_compositor_ack_ ||
       !SubmitFrame(current_begin_frame_ack, std::move(video_frame))) {
     compositor_frame_sink_->DidNotProduceFrame(current_begin_frame_ack);
-    frame_trackers_.NotifyImplFrameCausedNoDamage(current_begin_frame_ack);
     return;
   }
 
@@ -434,9 +418,6 @@
 
   // We can pass nullptr for the HitTestData as the CompositorFram will not
   // contain any SurfaceDrawQuads.
-  frame_trackers_.NotifySubmitFrame(compositor_frame.metadata.frame_token,
-                                    false, begin_frame_ack,
-                                    last_begin_frame_args_);
   compositor_frame_sink_->SubmitCompositorFrame(
       child_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation()
           .local_surface_id(),
@@ -456,15 +437,12 @@
   if (!compositor_frame_sink_)
     return;
 
-  auto begin_frame_ack = viz::BeginFrameAck::CreateManualAckWithDamage();
-  auto compositor_frame = CreateCompositorFrame(begin_frame_ack, nullptr);
-  frame_trackers_.NotifySubmitFrame(compositor_frame.metadata.frame_token,
-                                    false, begin_frame_ack,
-                                    last_begin_frame_args_);
   compositor_frame_sink_->SubmitCompositorFrame(
       child_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation()
           .local_surface_id(),
-      std::move(compositor_frame), nullptr, 0);
+      CreateCompositorFrame(viz::BeginFrameAck::CreateManualAckWithDamage(),
+                            nullptr),
+      nullptr, 0);
   waiting_for_compositor_ack_ = true;
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter.h b/third_party/blink/renderer/platform/graphics/video_frame_submitter.h
index f928f39c..949a261 100644
--- a/third_party/blink/renderer/platform/graphics/video_frame_submitter.h
+++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter.h
@@ -12,7 +12,6 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "cc/metrics/frame_sequence_tracker.h"
 #include "components/viz/client/shared_bitmap_reporter.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/common/resources/shared_bitmap.h"
@@ -176,12 +175,6 @@
 
   base::OneShotTimer empty_frame_timer_;
 
-  cc::FrameSequenceTrackerCollection frame_trackers_;
-
-  // The BeginFrameArgs passed to the most recent call of OnBeginFrame().
-  // Required for FrameSequenceTrackerCollection::NotifySubmitFrame
-  viz::BeginFrameArgs last_begin_frame_args_;
-
   THREAD_CHECKER(thread_checker_);
 
   base::WeakPtrFactory<VideoFrameSubmitter> weak_ptr_factory_{this};
diff --git a/third_party/blink/renderer/platform/loader/cors/cors.cc b/third_party/blink/renderer/platform/loader/cors/cors.cc
index 1b15903..361b791 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors.cc
+++ b/third_party/blink/renderer/platform/loader/cors/cors.cc
@@ -287,6 +287,7 @@
     const KURL& url,
     network::mojom::RequestMode request_mode,
     const SecurityOrigin* origin,
+    const SecurityOrigin* isolated_world_origin,
     CorsFlag cors_flag) {
   if (url.ProtocolIsData())
     return network::mojom::FetchResponseType::kBasic;
@@ -302,9 +303,12 @@
     return network::mojom::FetchResponseType::kBasic;
   }
 
-  if (request_mode == network::mojom::RequestMode::kNoCors &&
-      !origin->CanRequest(url)) {
-    return network::mojom::FetchResponseType::kOpaque;
+  if (request_mode == network::mojom::RequestMode::kNoCors) {
+    bool can_request = origin->CanRequest(url);
+    if (!can_request && isolated_world_origin)
+      can_request = isolated_world_origin->CanRequest(url);
+    if (!can_request)
+      return network::mojom::FetchResponseType::kOpaque;
   }
   return network::mojom::FetchResponseType::kBasic;
 }
@@ -384,16 +388,25 @@
 }
 
 bool CalculateCorsFlag(const KURL& url,
-                       const SecurityOrigin* origin,
+                       const SecurityOrigin* initiator_origin,
+                       const SecurityOrigin* isolated_world_origin,
                        network::mojom::RequestMode request_mode) {
   if (network::IsNavigationRequestMode(request_mode) ||
       request_mode == network::mojom::RequestMode::kNoCors) {
     return false;
   }
+
   // CORS needs a proper origin (including a unique opaque origin). If the
-  // request doesn't have one, CORS should not work.
-  DCHECK(origin);
-  return !origin->CanReadContent(url);
+  // request doesn't have one, CORS will not work.
+  DCHECK(initiator_origin);
+
+  if (initiator_origin->CanReadContent(url))
+    return false;
+
+  if (isolated_world_origin && isolated_world_origin->CanReadContent(url))
+    return false;
+
+  return true;
 }
 
 WebHTTPHeaderSet ExtractCorsExposedHeaderNamesList(
diff --git a/third_party/blink/renderer/platform/loader/cors/cors.h b/third_party/blink/renderer/platform/loader/cors/cors.h
index 6544bf1..25ad5e2 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors.h
+++ b/third_party/blink/renderer/platform/loader/cors/cors.h
@@ -85,6 +85,7 @@
     const KURL& url,
     network::mojom::RequestMode request_mode,
     const SecurityOrigin* origin,
+    const SecurityOrigin* isolated_world_origin,
     CorsFlag cors_flag);
 
 PLATFORM_EXPORT bool CalculateCredentialsFlag(
@@ -119,7 +120,8 @@
 // This function will be removed when out-of-renderer CORS is enabled.
 PLATFORM_EXPORT bool CalculateCorsFlag(
     const KURL& url,
-    const SecurityOrigin* origin,
+    const SecurityOrigin* initiator_origin,
+    const SecurityOrigin* isolated_world_origin,
     network::mojom::RequestMode request_mode);
 
 PLATFORM_EXPORT WebHTTPHeaderSet
diff --git a/third_party/blink/renderer/platform/loader/cors/cors_test.cc b/third_party/blink/renderer/platform/loader/cors/cors_test.cc
index 60a7ba4..c081795 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors_test.cc
+++ b/third_party/blink/renderer/platform/loader/cors/cors_test.cc
@@ -118,68 +118,68 @@
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(same_origin_url, RequestMode::kSameOrigin,
-                                      origin, CorsFlag::Unset));
+                                      origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(same_origin_url, RequestMode::kNoCors,
-                                      origin, CorsFlag::Unset));
+                                      origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(FetchResponseType::kBasic,
             cors::CalculateResponseTainting(same_origin_url, RequestMode::kCors,
-                                            origin, CorsFlag::Unset));
+                                            origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(FetchResponseType::kBasic,
             cors::CalculateResponseTainting(
                 same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
-                CorsFlag::Unset));
+                nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(same_origin_url, RequestMode::kNavigate,
-                                      origin, CorsFlag::Unset));
+                                      origin, nullptr, CorsFlag::Unset));
 
   // CORS flag is false, cross-origin request
   EXPECT_EQ(
       FetchResponseType::kOpaque,
       cors::CalculateResponseTainting(cross_origin_url, RequestMode::kNoCors,
-                                      origin, CorsFlag::Unset));
+                                      origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(cross_origin_url, RequestMode::kNavigate,
-                                      origin, CorsFlag::Unset));
+                                      origin, nullptr, CorsFlag::Unset));
 
   // CORS flag is true, same-origin request
   EXPECT_EQ(FetchResponseType::kCors,
             cors::CalculateResponseTainting(same_origin_url, RequestMode::kCors,
-                                            origin, CorsFlag::Set));
+                                            origin, nullptr, CorsFlag::Set));
   EXPECT_EQ(FetchResponseType::kCors,
             cors::CalculateResponseTainting(
                 same_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
-                CorsFlag::Set));
+                nullptr, CorsFlag::Set));
 
   // CORS flag is true, cross-origin request
-  EXPECT_EQ(FetchResponseType::kCors,
-            cors::CalculateResponseTainting(
-                cross_origin_url, RequestMode::kCors, origin, CorsFlag::Set));
+  EXPECT_EQ(FetchResponseType::kCors, cors::CalculateResponseTainting(
+                                          cross_origin_url, RequestMode::kCors,
+                                          origin, nullptr, CorsFlag::Set));
   EXPECT_EQ(FetchResponseType::kCors,
             cors::CalculateResponseTainting(
                 cross_origin_url, RequestMode::kCorsWithForcedPreflight, origin,
-                CorsFlag::Set));
+                nullptr, CorsFlag::Set));
 
   // Origin is not provided.
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(same_origin_url, RequestMode::kNoCors,
-                                      no_origin, CorsFlag::Unset));
+                                      no_origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(same_origin_url, RequestMode::kNavigate,
-                                      no_origin, CorsFlag::Unset));
+                                      no_origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(cross_origin_url, RequestMode::kNoCors,
-                                      no_origin, CorsFlag::Unset));
+                                      no_origin, nullptr, CorsFlag::Unset));
   EXPECT_EQ(
       FetchResponseType::kBasic,
       cors::CalculateResponseTainting(cross_origin_url, RequestMode::kNavigate,
-                                      no_origin, CorsFlag::Unset));
+                                      no_origin, nullptr, CorsFlag::Unset));
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 52853966..38087a07 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -915,14 +915,17 @@
     const scoped_refptr<const SecurityOrigin> origin =
         resource_request.RequestorOrigin();
     DCHECK(!options.cors_flag);
-    params.MutableOptions().cors_flag = cors::CalculateCorsFlag(
-        params.Url(), origin.get(), resource_request.GetMode());
+    params.MutableOptions().cors_flag =
+        cors::CalculateCorsFlag(params.Url(), origin.get(),
+                                resource_request.IsolatedWorldOrigin().get(),
+                                resource_request.GetMode());
     // TODO(yhirano): Reject requests for non CORS-enabled schemes.
     // See https://crrev.com/c/1298828.
     resource_request.SetAllowStoredCredentials(cors::CalculateCredentialsFlag(
         resource_request.GetCredentialsMode(),
         cors::CalculateResponseTainting(
             params.Url(), resource_request.GetMode(), origin.get(),
+            resource_request.IsolatedWorldOrigin().get(),
             params.Options().cors_flag ? CorsFlag::Set : CorsFlag::Unset)));
   }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index fa68bec..7a82d5a0 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -474,6 +474,7 @@
     const auto origin = resource_->GetOrigin();
     response_tainting_ = cors::CalculateResponseTainting(
         request.Url(), request.GetMode(), origin.get(),
+        request.IsolatedWorldOrigin().get(),
         GetCorsFlag() ? CorsFlag::Set : CorsFlag::Unset);
   }
 
@@ -855,8 +856,9 @@
   if (ShouldCheckCorsInResourceLoader()) {
     bool new_cors_flag =
         GetCorsFlag() ||
-        cors::CalculateCorsFlag(new_request->Url(),
-                                resource_->GetOrigin().get(), request_mode);
+        cors::CalculateCorsFlag(
+            new_request->Url(), resource_->GetOrigin().get(),
+            new_request->IsolatedWorldOrigin().get(), request_mode);
     resource_->MutableOptions().cors_flag = new_cors_flag;
     // Cross-origin requests are only allowed certain registered schemes.
     if (GetCorsFlag() && !SchemeRegistry::ShouldTreatURLSchemeAsCorsEnabled(
@@ -869,6 +871,7 @@
     }
     response_tainting_ = cors::CalculateResponseTainting(
         new_request->Url(), request_mode, resource_->GetOrigin().get(),
+        new_request->IsolatedWorldOrigin().get(),
         GetCorsFlag() ? CorsFlag::Set : CorsFlag::Unset);
   }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
index 0e44638..3794d2f 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
@@ -354,6 +354,16 @@
   has_user_gesture_ |= has_user_gesture;
 }
 
+bool ResourceRequest::CanDisplay(const KURL& url) const {
+  if (RequestorOrigin()->CanDisplay(url))
+    return true;
+
+  if (IsolatedWorldOrigin() && IsolatedWorldOrigin()->CanDisplay(url))
+    return true;
+
+  return false;
+}
+
 const CacheControlHeader& ResourceRequest::GetCacheControlHeader() const {
   if (!cache_control_header_cache_.parsed) {
     cache_control_header_cache_ = ParseCacheControlDirectives(
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
index 678abdd..d4055c4 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -41,6 +41,7 @@
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/resource_request_blocked_reason.h"
 #include "third_party/blink/public/platform/web_url_request.h"
+#include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_load_priority.h"
 #include "third_party/blink/renderer/platform/network/http_header_map.h"
 #include "third_party/blink/renderer/platform/network/http_names.h"
@@ -126,6 +127,15 @@
     requestor_origin_ = std::move(origin);
   }
 
+  // The origin of the isolated world - set if this is a fetch/XHR initiated by
+  // an isolated world.
+  const scoped_refptr<const SecurityOrigin>& IsolatedWorldOrigin() const {
+    return isolated_world_origin_;
+  }
+  void SetIsolatedWorldOrigin(scoped_refptr<const SecurityOrigin> origin) {
+    isolated_world_origin_ = std::move(origin);
+  }
+
   const AtomicString& HttpMethod() const;
   void SetHttpMethod(const AtomicString&);
 
@@ -447,6 +457,10 @@
         prefetch_maybe_for_top_level_navigation;
   }
 
+  // Whether either RequestorOrigin or IsolatedWorldOrigin can display the
+  // |url|,
+  bool CanDisplay(const KURL&) const;
+
  private:
   using SharableExtraData =
       base::RefCountedData<std::unique_ptr<WebURLRequest::ExtraData>>;
@@ -466,6 +480,7 @@
   scoped_refptr<const SecurityOrigin> top_frame_origin_;
 
   scoped_refptr<const SecurityOrigin> requestor_origin_;
+  scoped_refptr<const SecurityOrigin> isolated_world_origin_;
 
   AtomicString http_method_;
   HTTPHeaderMap http_header_fields_;
diff --git a/third_party/blink/renderer/platform/p2p/OWNERS b/third_party/blink/renderer/platform/p2p/OWNERS
new file mode 100644
index 0000000..70573c4
--- /dev/null
+++ b/third_party/blink/renderer/platform/p2p/OWNERS
@@ -0,0 +1,4 @@
+sergeyu@chromium.org
+juberti@chromium.org
+
+# COMPONENT: Blink>WebRTC
diff --git a/content/renderer/p2p/network_manager_uma.cc b/third_party/blink/renderer/platform/p2p/network_manager_uma.cc
similarity index 82%
rename from content/renderer/p2p/network_manager_uma.cc
rename to third_party/blink/renderer/platform/p2p/network_manager_uma.cc
index 40f91a21..f98a9442 100644
--- a/content/renderer/p2p/network_manager_uma.cc
+++ b/third_party/blink/renderer/platform/p2p/network_manager_uma.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/p2p/network_manager_uma.h"
+#include "third_party/blink/public/platform/modules/p2p/network_manager_uma.h"
 
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 
-namespace content {
+namespace blink {
 
 void ReportTimeToUpdateNetworkList(const base::TimeDelta& ticks) {
   UMA_HISTOGRAM_TIMES("WebRTC.PeerConnection.TimeToNetworkUpdated", ticks);
@@ -18,4 +18,4 @@
                             PERMISSION_MAX);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 4d03985..e4dd811 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -834,12 +834,6 @@
       name: "IsolatedWorldCSP"
     },
     {
-      // Modifies LayoutShiftTracker to use O(n log n) sweep line algorithm for
-      // computing the area of the layout shift region.
-      name: "JankTrackingSweepLine",
-      status: "stable",
-    },
-    {
       name: "JSONModules",
     },
     {
@@ -1378,7 +1372,7 @@
     },
     {
       name: "RestrictedWebkitAppearance",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "RtcAudioJitterBufferMaxPackets",
@@ -1540,7 +1534,7 @@
     },
     {
       name: "SignedExchangeSubresourcePrefetch",
-      origin_trial_feature_name: "SignedExchangeSubresourcePrefetchM78",
+      origin_trial_feature_name: "SignedExchangeSubresourcePrefetch",
       status: "experimental",
     },
     {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 50cde9f..f516a69 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3819,17 +3819,12 @@
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Failure ]
-crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-023.html [ Failure ]
-crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-021.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-025.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-027.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-046.html [ Failure ]
-crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-049.html [ Failure ]
-crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-051.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-043.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-022.html [ Failure ]
-crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-025.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-007.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-005.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-049.html [ Failure ]
@@ -3999,7 +3994,6 @@
 crbug.com/626703 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-014.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-013.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-writing-modes/available-size-016.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-ui/text-overflow-028.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-ui/text-overflow-028.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/astral-bidi/adlam-anti-ref.html [ Failure Pass ]
@@ -4007,7 +4001,6 @@
 crbug.com/626703 external/wpt/css/css-fill-stroke/paint-order-001.tentative.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-005.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/available-size-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-writing-modes/available-size-009.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Failure ]
@@ -4410,10 +4403,6 @@
 crbug.com/888470 virtual/omt-worker-fetch/external/wpt/referrer-policy/css-integration/child-css/internal-import-stylesheet.html [ Failure ]
 crbug.com/888470 virtual/omt-worker-fetch/external/wpt/referrer-policy/css-integration/child-css/processing-instruction.html [ Failure ]
 
-# This behavior (popups during unload) is being reverted on trunk; this test is
-# expected to fail when this change is merged back to earlier branches.
-crbug.com/936080 external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/no_window_open_when_term_nesting_level_nonzero.window.html [ Failure ]
-
 crbug.com/805756 external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Pass Timeout ]
 
 crbug.com/666993 [ Debug ] external/wpt/requestidlecallback/callback-idle-periods.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 7f24447c..13b88ae4 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -113487,6 +113487,246 @@
      {}
     ]
    ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-01.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-01.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-01-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-02.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-02.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-02-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-03.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-03.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-03-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-04.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-04.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-04-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-05.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-05.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-05-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-06.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-06.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-06-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-08.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-08.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-08-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-09.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-09.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-09-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-10.html": [
+    [
+     "forced-colors-mode/backplate/forced-colors-mode-backplate-10.html",
+     [
+      [
+       "/forced-colors-mode/backplate/forced-colors-mode-backplate-10-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-01.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-01.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-01-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-02.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-02.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-02-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-05.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-05.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-05-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-06.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-06.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-06-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-07.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-07.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-07-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-08.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-08.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-08-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-14.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-14.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-14-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-17.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-17.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-17-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-18.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-18.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-18-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-19.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-19.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-19-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-23.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-23.html",
+     [
+      [
+       "/forced-colors-mode/forced-colors-mode-23-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "html/browsers/sandboxing/sandbox-parse-noscript.html": [
     [
      "html/browsers/sandboxing/sandbox-parse-noscript.html",
@@ -155614,6 +155854,75 @@
    "fonts/tcu-font.woff": [
     []
    ],
+   "forced-colors-mode/README.txt": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-01-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-02-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-03-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-04-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-05-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-06-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-08-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-09-ref.html": [
+    []
+   ],
+   "forced-colors-mode/backplate/forced-colors-mode-backplate-10-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-01-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-02-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-05-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-06-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-07-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-08-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-14-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-17-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-18-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-19-ref.html": [
+    []
+   ],
+   "forced-colors-mode/forced-colors-mode-23-ref.html": [
+    []
+   ],
+   "forced-colors-mode/resources/float-image.jpg": [
+    []
+   ],
+   "forced-colors-mode/resources/test-image.jpg": [
+    []
+   ],
    "fullscreen/META.yml": [
     []
    ],
@@ -214410,6 +214719,12 @@
      {}
     ]
    ],
+   "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash-002.html": [
+    [
+     "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash-002.html",
+     {}
+    ]
+   ],
    "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash.html": [
     [
      "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash.html",
@@ -238872,6 +239187,48 @@
      {}
     ]
    ],
+   "forced-colors-mode/forced-colors-mode-03.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-03.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-04.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-04.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-09.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-09.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-10.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-10.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-11.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-11.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-20.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-20.html",
+     {}
+    ]
+   ],
+   "forced-colors-mode/forced-colors-mode-21.html": [
+    [
+     "forced-colors-mode/forced-colors-mode-21.html",
+     {}
+    ]
+   ],
    "fullscreen/api/document-exit-fullscreen-active-document.html": [
     [
      "fullscreen/api/document-exit-fullscreen-active-document.html",
@@ -388686,6 +389043,10 @@
    "39426d0420287a730dcac47696bd69520e8a6b72",
    "testharness"
   ],
+  "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash-002.html": [
+   "085e5b6f12d6f9cf0ae1e0028be8cfeca5cc565f",
+   "testharness"
+  ],
   "css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash.html": [
    "2bea6aed780679f9eb0de3130e3acf4ffa2b9e98",
    "testharness"
@@ -430562,6 +430923,206 @@
    "c880aaab5cfbdfd11ebf885244cb7a5229c03ec5",
    "support"
   ],
+  "forced-colors-mode/README.txt": [
+   "de185c88aee4bc3711e47f13156138f56bf8a6c6",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-01-ref.html": [
+   "d7a04936d58bac36f7bca4c8c87e1f83a23fef2e",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-01.html": [
+   "0e627b98a1fcd3bf2f4bcce11a4c0ed0b3730664",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-02-ref.html": [
+   "51109a8c696ab8ba66754608d4b4d02d50301e64",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-02.html": [
+   "b8a498e0ff3225ed19487b34f9759f67cbf0cd99",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-03-ref.html": [
+   "c9894d85b533271869737499eb4585402d809937",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-03.html": [
+   "f0ec227d4de8d7d67650e4a95b7510759eacd950",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-04-ref.html": [
+   "9fefe5e41065e3e047db3dcd7ee4197e3cb80c7a",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-04.html": [
+   "82d1a79cff7207f0a8c12f5755113cb75d613993",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-05-ref.html": [
+   "82014853f5db2583984a634d7fcdf6855b214877",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-05.html": [
+   "7a7f60d1f517e50b8f9ca7fd3ccf9a3574683deb",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-06-ref.html": [
+   "98a660bcfa037494f3cddffe7cedb4a117053d24",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-06.html": [
+   "d16593b04e037c01530d424181c07df33c29a98c",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-08-ref.html": [
+   "87a750d5c3f7385eb203208e8ac2f8263ae7854e",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-08.html": [
+   "87517685114b9aac82a9f431b4406a8fc68856d7",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-09-ref.html": [
+   "fd1558e11b01879a13c97b04c1598997841d52f1",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-09.html": [
+   "f5cdf942907d9e9f35a725571a6d92120ebfc620",
+   "reftest"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-10-ref.html": [
+   "386313392b3fa3c86f2bd578020731d4937fc802",
+   "support"
+  ],
+  "forced-colors-mode/backplate/forced-colors-mode-backplate-10.html": [
+   "c6fa7928e13421f77221e1760559ef3cbc77cba0",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-01-ref.html": [
+   "5abe5867a94d2bbc311bcd7d2750c4d52ddc12d2",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-01.html": [
+   "1f4e3899a8a4d7db6fe0f484671eb69040fc1c2d",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-02-ref.html": [
+   "097f27eed8c673ac340ac5ce2f934431a9a6f74e",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-02.html": [
+   "414d3c1d4a726cf8551307ec86b2cdc132a3dba3",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-03.html": [
+   "ebe42e4e7502a327849fe2c65924480e00de4399",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-04.html": [
+   "42b4efdba71bd959b5db159c1c448a27231b977e",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-05-ref.html": [
+   "e2fffecd9c0c5e91bd1fa8fa830c1381717922c7",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-05.html": [
+   "6078d3a640291c5bdac6249af163f1ffa3f2cbce",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-06-ref.html": [
+   "9af878e25b18e62b41804be742c003c6b72b5def",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-06.html": [
+   "fc54186aac69f2af1ad03b3e1864c111714c9bdd",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-07-ref.html": [
+   "ac68e91485fe01938a78ceab0126f986b1f2f33e",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-07.html": [
+   "765868a2df4a6387531c66e828bee1a65d39cf19",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-08-ref.html": [
+   "775831ff7b75aeb733f9bda6c107a2fdef943a0f",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-08.html": [
+   "dac7989e509f5dc00fe2032ece111a7012755572",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-09.html": [
+   "16ca8a46104d06153b3e9bbd920d3187b0a7fa00",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-10.html": [
+   "765013d9134cd0d901108d14c05610229ae0441a",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-11.html": [
+   "5fa8ba4524adba8b6acde49efa3377131597bb76",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-14-ref.html": [
+   "910b19df036d7e8a477ff41cd73d0fc0f8d51951",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-14.html": [
+   "c57193e99dbe5fb27be6082788f8fcb0c5b2ac2f",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-17-ref.html": [
+   "ca9616c8a1f93755500536e739c121c68ed3e601",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-17.html": [
+   "2202e0a7f94a2156c9bef42fb37d1fcce107d236",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-18-ref.html": [
+   "34eba583caa924d5aa9a6d0271acbc29c1b25a4b",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-18.html": [
+   "cc6ac8e4e09d38884cff63ee333052d02c832d2e",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-19-ref.html": [
+   "8d25ec5009c16caf4ce1b4e376f36d7602cb60a1",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-19.html": [
+   "5c4a09e4226e8e6109a1a136abcffb058f55ad68",
+   "reftest"
+  ],
+  "forced-colors-mode/forced-colors-mode-20.html": [
+   "6e9ef2f9c1c7653c2fd52550bd2ea0997adc58bf",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-21.html": [
+   "4781ad2f7b089173a61893a1a41e8524d772689f",
+   "testharness"
+  ],
+  "forced-colors-mode/forced-colors-mode-23-ref.html": [
+   "a9501be396031f578bf0eedba4edff8de7ff8c85",
+   "support"
+  ],
+  "forced-colors-mode/forced-colors-mode-23.html": [
+   "20519ea181e82a64865b95f32f3486e52300eb06",
+   "reftest"
+  ],
+  "forced-colors-mode/resources/float-image.jpg": [
+   "ab06d5f94d16e22bb08fad79d6fef662b2a7de5a",
+   "support"
+  ],
+  "forced-colors-mode/resources/test-image.jpg": [
+   "93f6e196e58c74a515564a20e5afc944fd903847",
+   "support"
+  ],
   "fullscreen/META.yml": [
    "fbdb76390c7ad4390dac7d83004e5721fc62a37d",
    "support"
@@ -454207,7 +454768,7 @@
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-bar-001.html": [
-   "e381ffe77c391d91893789474bdd7530f3c969ac",
+   "9fc441230588216f5f5b20eab36b465c48cbb41b",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-color-001-notref.html": [
@@ -454259,7 +454820,7 @@
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-linethickness-002.html": [
-   "85c7c58701042e3fd4494f7f2e04a7b16bccebb4",
+   "6cb1b8b4351dbf1f7afcbee3986fa8c7aee71810",
    "testharness"
   ],
   "mathml/presentation-markup/fractions/frac-linethickness-003-notref.html": [
@@ -454295,59 +454856,59 @@
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-1.html": [
-   "ba47897c111b33f439fe9fde2e2ecb707c7b5585",
+   "b7efbc78ca01a3919b83edfed67c2721025d4e69",
    "testharness"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-2.html": [
-   "151265787ab3f5c8eb7b80588dc30d3e633d6e79",
+   "368fc0676d2135b6cd5381a822dd9ec92bf71512",
    "testharness"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html": [
-   "69be003195a82d28031de06156629a68457bfbcf",
+   "9c7db8a3cdcdd001909e84da770a8f1550a365a5",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-001.html": [
-   "e87b357dd2ae7c06549538f5da422ff89f49ad1c",
+   "98fd807f91d35af3bfe2994d9283db5a185b357f",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html": [
-   "9169bb999c3096a886ee804a828ade453ef7abd1",
+   "b4e9a25f00b92a53654e2891dbb95f4ce985dc55",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-002.html": [
-   "0b704dc801e85825359c34de3a5d6d081814ab5b",
+   "2bc848b415c9f69c08baff65993f515ea70ec0a7",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html": [
-   "3fe86faf9f36ef4ef4d4d2993eb8685c3fb70fa7",
+   "91b85450e3e86f5b53a8800ed3cc3ddd6b4a4c3a",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-003.html": [
-   "9bd79836cc06fe7a05c806aa8c5083c914273472",
+   "44c4cf63e35a55a627746a6ab74ad9391399724e",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html": [
-   "10d0415304e8839ca0a4da38085df6dc69ca5aa5",
+   "9578254610b7221d8afa5938c97b4d9aa7b67b72",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-004.html": [
-   "43410cba6089c23c7c960bb3c6207100cd341da2",
+   "431b0af4fff241640a53e3b70820b0e10eee4f99",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html": [
-   "9bfd7653d1d38a8e4b130eaf7bee00d0a39c9cc0",
+   "270a8ac2d9290c27953d57aa387b520dfed7f3f0",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-005.html": [
-   "da77012b96dd9ebfb000df6ad22123bafe97ff4c",
+   "3be779734043dcded8a93761ed8bdfa13238220e",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html": [
-   "2abba28f0a34e42b0b0ced64af4499bb3b33fe0e",
+   "02cd8477d5bcb3bbe22a99bd87f2b68f388433e3",
    "support"
   ],
   "mathml/presentation-markup/fractions/frac-parameters-gap-006.html": [
-   "25bf644ec61fad2a82c794cd3bf5072ad644cb15",
+   "783696ace5ffcb0e0c9316b35dccec09abf9f045",
    "reftest"
   ],
   "mathml/presentation-markup/fractions/frac-visibility-001-ref.html": [
@@ -454363,7 +454924,7 @@
    "testharness"
   ],
   "mathml/presentation-markup/mrow/inferred-mrow-stretchy.html": [
-   "ee40561a634c00eb9e29dd66d4a28f579a78af59",
+   "b6a51762dfda0b05cbcc272b9fb5cedad0c66a94",
    "testharness"
   ],
   "mathml/presentation-markup/operators/embellished-operator-001.html": [
@@ -454375,7 +454936,7 @@
    "testharness"
   ],
   "mathml/presentation-markup/operators/mo-axis-height-1.html": [
-   "63595b0278445db92e3e5bfe8b7cfb03fd9bdc6e",
+   "3b28d976f0cf999fe4fd1f684696823eaff47749",
    "testharness"
   ],
   "mathml/presentation-markup/operators/mo-form-dynamic-ref.html": [
@@ -454443,7 +455004,7 @@
    "reftest"
   ],
   "mathml/presentation-markup/radicals/root-parameters-1.html": [
-   "d09d117b8ad5b52ea3c8778dcd6c4dd56a7b9270",
+   "064336216805bf82528247d5ef888b84c97572db",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/subsup-1.html": [
@@ -454467,11 +455028,11 @@
    "testharness"
   ],
   "mathml/presentation-markup/scripts/subsup-parameters-1.html": [
-   "a5f21ec5458f0cce4b6517e39572d3e928585e20",
+   "0c6610cc18fe6f71523f6c2209b8f02328ffa634",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/subsup-parameters-2.html": [
-   "0abf01838c8c8c05f1c6cb4bf72e9fea57bca8d9",
+   "da7574ac4d0db19cd3174f42be161fbf6d7490bb",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-1.html": [
@@ -454479,19 +455040,19 @@
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-parameters-1.html": [
-   "26a1b3964cc10ced8762314390840db94efdb970",
+   "9217488a561735c75798e2c05197f5a84b233237",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-parameters-2.html": [
-   "aed22235b8c192ee69237c63face745e7e35e1bd",
+   "6f9aa4763a9b1a902224bb7e7902eceb80cada45",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-parameters-3.html": [
-   "6a1e51cdc4516ae1fdd2784c0e77682222773b2f",
+   "a09e2cbca32efc40f41de2924a382757a765a280",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-parameters-4.html": [
-   "e569c15a6993321051b2490f62c5b6ae39666b7a",
+   "8df0f4d8ef84b26618185830253cc80b8df493c6",
    "testharness"
   ],
   "mathml/presentation-markup/spaces/mspace-children-ref.html": [
@@ -454531,7 +455092,7 @@
    "testharness"
   ],
   "mathml/presentation-markup/tables/table-axis-height.html": [
-   "3eaf9c8fff483232eb6794b603f270bb86c47d3d",
+   "f9354266a7c6c42a75519e9771eb2c61536ad8e5",
    "testharness"
   ],
   "mathml/relations/css-styling/attribute-mapping-001.html": [
@@ -454607,7 +455168,7 @@
    "support"
   ],
   "mathml/relations/css-styling/displaystyle-013.html": [
-   "60bc906452b670ff2edbed125172ca589234d4c3",
+   "30be35c02471388e3b0d59a9cb22ec006ca74511",
    "reftest"
   ],
   "mathml/relations/css-styling/displaystyle-014-ref.html": [
@@ -454615,7 +455176,7 @@
    "support"
   ],
   "mathml/relations/css-styling/displaystyle-014.html": [
-   "5f30f534e5eb51efa3738a41d3221aa67aa03786",
+   "d54a8043788a343e2b415256f59d611b49c89102",
    "reftest"
   ],
   "mathml/relations/css-styling/displaystyle-015-ref.html": [
@@ -454627,11 +455188,11 @@
    "reftest"
   ],
   "mathml/relations/css-styling/displaystyle-1.html": [
-   "73e5020e74ce3c77c38b0b7224ed4a0245f5f1b0",
+   "19494a3e17a0bd822a87ffa1cd105a48c85f7e58",
    "testharness"
   ],
   "mathml/relations/css-styling/displaystyle-2.html": [
-   "fc1bd7a432db692f695e101cf07d183fff71a5a5",
+   "e544f4534dd31463e6d0c3374aff1498991a5b46",
    "testharness"
   ],
   "mathml/relations/css-styling/dynamic-dir-1-ref.html": [
@@ -454651,7 +455212,7 @@
    "reftest"
   ],
   "mathml/relations/css-styling/lengths-2.html": [
-   "22fc40156f177564beb0eb0907637a6bce6e60ca",
+   "90b0887d03137e454b9d2e871de722594155b9b1",
    "testharness"
   ],
   "mathml/relations/css-styling/mathbackground-001-notref.html": [
@@ -481623,7 +482184,7 @@
    "testharness"
   ],
   "service-workers/service-worker/clients-matchall-frozen.https.html": [
-   "ef27ac3d372e5d40fb576e2b59020026df8b66bc",
+   "479c28a60f2e4a2e32ea765a7480301360c34505",
    "testharness"
   ],
   "service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [
@@ -493435,7 +493996,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/testharnessreport-servo.js": [
-   "b672aea9a2540bf1446a23ddb288c93009bb26ba",
+   "a10b69df5504fab875147af26d925ebcce51ec00",
    "support"
   ],
   "tools/wptrunner/wptrunner/testharnessreport-servodriver.js": [
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/inline-static-position-001.html b/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/inline-static-position-001.html
new file mode 100644
index 0000000..d5695bd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/positioning/inline-static-position-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Test: Static positions and line wrapping</title>
+<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css2/visudet.html#static-position">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<style>
+.tests, .no-tests {
+  margin-bottom: 1em;
+  font-family: Ahem;
+  font-size: 10px;
+  line-height: 1;
+}
+.tests > div, .no-tests > div {
+  position: relative;
+  width: 10ch;
+  border: 1px solid blue;
+}
+.abs {
+  position: absolute;
+  color: orange;
+}
+</style>
+<body>
+  <section class="tests">
+    <div>12345<span class="abs" data-offset-x="50" data-offset-y="0">span</span>54321</div>
+    <div>123456<span class="abs" data-offset-x="60" data-offset-y="0">span</span>654321</div>
+    <div>12345<span class="abs" data-offset-x="50" data-offset-y="0">span</span> 54321</div>
+    <div>12345&nbsp;<span class="abs" data-offset-x="60" data-offset-y="0">span</span> 54321</div>
+    <div>12345&nbsp;<span class="abs" data-offset-x="60" data-offset-y="0">span</span>&nbsp;54321</div>
+  </section>
+  <section class="tests">
+    <!-- offsetTop is interoperable but offsetLeft is not due to white space collapsing. -->
+    <div>12345 <span class="abs" data-offset-y="0">span</span> 54321</div>
+  </section>
+  <section class="no-tests">
+    <!-- These tests are not interoperable. -->
+    <div>12345 <span class="abs">span</span>54321</div>
+    <div>12345 <span class="abs">span</span>&nbsp;54321</div>
+    <div>123456789012&nbsp;<span class="abs">span</span>&nbsp;54321</div>
+    <div>123456789012&nbsp;<span class="abs">span</span>&nbsp;543210987654321</div>
+  </section>
+<script>
+checkLayout('.tests .abs');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-computed.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-computed.html
new file mode 100644
index 0000000..b3f104e6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-computed.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 4: getComputedStyle().font</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-prop">
+<meta name="assert" content="font computed value round-trips.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+  #container {
+    font-weight: 800;
+    font-size: 40px;
+  }
+</style>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+'use strict';
+
+const initial_style = 'normal';
+const initial_variant = 'normal';
+const initial_weight = 'normal';
+const initial_stretch = 'normal';
+const initial_line_height = 'normal';
+
+// Firefox and Edge 18 serialize these as supplied.
+// Blink and Safari have implementation-dependent or platform-dependent serializations.
+function test_system_font(keyword) {
+  test(() => {
+    const target = document.getElementById('target');
+    const previousValue = 'italic xx-large/0px fantasy';
+    target.style.font = previousValue;
+    target.style.font = keyword;
+    const readValue = getComputedStyle(target).font;
+    assert_not_equals(readValue, '', 'font should be set');
+    assert_not_equals(readValue, previousValue, 'font should be updated');
+    target.style.font = previousValue;
+    target.style.font = readValue;
+    assert_equals(getComputedStyle(target).font, readValue, "serialization should round-trip");
+  }, keyword + ' should be a supported system font.');
+}
+
+test_system_font('caption');
+test_system_font('icon');
+test_system_font('menu');
+test_system_font('message-box');
+test_system_font('small-caption');
+test_system_font('status-bar');
+
+// a value other than normal
+const generate_style = () => 'italic';
+
+// value other than normal
+const generate_variant = () => 'small-caps';
+
+// values other than normal
+const generate_weight = (() => {
+  const alternatives = [
+    'bold',
+    'bolder',
+    'lighter',
+    '100',
+    '900'
+  ];
+  let counter = 0;
+  return () => alternatives[counter++ % alternatives.length];
+})();
+
+const compute_weight = (() => {
+  const cache = {}
+  return (weight) => {
+    if (!(weight in cache)) {
+      const weight_reference = document.createElement('div');
+      document.getElementById('container').appendChild(weight_reference);
+      weight_reference.style.fontWeight = weight;
+      cache[weight] = getComputedStyle(weight_reference).fontWeight;
+      weight_reference.remove();
+    }
+    return cache[weight];
+  }
+})();
+
+// values other than normal
+const generate_stretch = (() => {
+  const alternatives = [
+    'ultra-condensed',
+    'extra-condensed',
+    'condensed',
+    'semi-condensed',
+    'semi-expanded',
+    'expanded',
+    'extra-expanded',
+    'ultra-expanded'
+  ];
+  let counter = 0;
+  return () => alternatives[counter++ % alternatives.length];
+})();
+
+const generate_size = (() => {
+  const alternatives = [
+    // <absolute-size>
+    'xx-small',
+    'medium',
+    'xx-large',
+
+    // <relative-size>
+    'larger',
+    'smaller',
+
+    // <length-percentage>
+    '10px',
+    '20%',
+    'calc(30% - 40px)',
+  ];
+  let counter = 0;
+  return () => alternatives[counter++ % alternatives.length];
+})();
+
+const generate_line_height = (() => {
+  const alternatives = [
+    null,
+    'normal',
+    '1.2',
+    'calc(120% + 1.2em)'
+  ];
+  let counter = 0;
+  return () => alternatives[counter++ % alternatives.length];
+})();
+
+const generate_family = (() => {
+  const alternatives = [
+    'serif',
+    'sans-serif',
+    'cursive',
+    'fantasy',
+    'monospace',
+    'Menu',
+    '"Non-Generic Example Family Name"'
+  ];
+  let counter = 0;
+  return () => alternatives[counter++ % alternatives.length];
+})();
+
+function test_specific(prefix) {
+  const reference = document.createElement('div');
+  document.getElementById('container').appendChild(reference);
+
+  let parts = [];
+  let canonical = [];
+  let style = null;
+  let variant = null;
+  let weight = null;
+  let stretch = null;
+  for (let entry of prefix) {
+    if (entry === 'style') {
+      style = generate_style();
+      parts.push(style);
+    } else if (entry === 'variant') {
+      variant = generate_variant();
+      parts.push(variant);
+    } else if (entry === 'weight') {
+      weight = generate_weight();
+      parts.push(weight);
+    } else if (entry === 'stretch') {
+      stretch = generate_stretch();
+      parts.push(stretch);
+    } else {
+      // normal
+      parts.push('normal');
+    }
+  }
+
+  if (style) {
+    canonical.push(style);
+    reference.style.fontStyle = style;
+  } else {
+    canonical.push(initial_style);
+  }
+
+  if (variant) {
+    canonical.push(variant);
+    reference.style.fontVariant = style;
+  } else {
+    canonical.push(initial_variant);
+  }
+  if (weight) {
+    canonical.push(compute_weight(weight));
+    reference.style.fontWeight = style;
+  } else {
+    canonical.push(compute_weight(initial_weight));
+  }
+  if (stretch) {
+    canonical.push(stretch);
+    reference.style.fontStretch = style;
+  } else {
+    canonical.push(initial_stretch);
+  }
+
+  const size = generate_size();
+  reference.style.fontSize = size;
+  const line_height = generate_line_height();
+  if (line_height) {
+    parts.push(size + '/' + line_height);
+    reference.style.lineHeight = line_height;
+  } else {
+    parts.push(size);
+  }
+
+  const family = generate_family();
+  parts.push(family);
+  reference.style.fontFamily = family;
+
+  canonical.push(getComputedStyle(reference).fontSize + '/' + getComputedStyle(reference).lineHeight);
+  canonical.push(family);
+
+  reference.remove();
+
+  // Implementations differ on adjacent space when serializing '/'
+  // https://github.com/w3c/csswg-drafts/issues/4282
+  const expected = canonical.join(' ');
+  test_computed_value('font', parts.join(' '), [expected, expected.replace('/', ' / ')]);
+}
+
+// Font style, variant, weight and stretch may appear in any order.
+// Any or all may be omitted. Each accepts the keyword 'normal'.
+// We generate every permutation of these four properties, treating
+// the cases of a property value being omitted or being explicitly
+// 'normal' as being distinct permutations from when the property
+// has a value other than 'normal'.
+function test_various(prefix) {
+  test_specific(prefix);
+  if (prefix.length === 4) {
+    // Font style, variant, weight and stretch may not appear
+    // more than once.
+    return;
+  }
+
+  const alternatives = [
+    'normal',
+    'style',
+    'variant',
+    'weight',
+    'stretch'
+  ];
+  for (let alternative of alternatives) {
+    // Since this is called recursively, check prefix for existing
+    // alternatives, otherwise we may have two styles or two variants, etc.
+    if (alternative === 'normal' || !prefix.includes(alternative))
+      test_various(prefix.concat(alternative));
+  }
+}
+
+test_various([]);
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-003.html
new file mode 100644
index 0000000..dba467c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-003.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid items with percentage margins</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#item-margins">
+<meta name="assert" content="Checks grid items percentage margins are resolved correctly in a 'auto' sized grid area after changing the item's width and forcing a new layout.">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<link rel="stylesheet" href="support/grid.css">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.container {
+    font: 25px/1 Ahem;
+    width: 100px;
+    height: 100px;
+}
+.child {
+    margin: 50px;
+    color: red;
+}
+.ref {
+    position: absolute;
+    z-index: -1;
+    background: green;
+}
+.grid {
+    background: none;
+}
+#item {
+    margin: 50%;
+    color: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container ref"><div class="child">X</div></div>
+<div class="container grid"><div class="child" id="item">X</div></div>
+<script>
+    item.style.width = "0px";
+    item.offsetLeft;
+    item.style.width = "auto";
+    item.offsetLeft;
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-004.html
new file mode 100644
index 0000000..5a3da68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-004.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid items with percentage margins</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#item-margins">
+<meta name="assert" content="Checks grid items percentage margins are resolved correctly in a 'auto' sized grid area after changing the item's width and forcing a new layout.">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<link rel="stylesheet" href="support/grid.css">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+.container {
+    width: 100px;
+    height: 100px;
+}
+.child {
+    width: 25px;
+    height: 25px;
+    margin: 50px;
+    background: red;
+}
+.ref {
+    position: absolute;
+    z-index: -1;
+    background: green;
+}
+.grid {
+    background: none;
+}
+#item {
+    margin: 50%;
+    background: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container ref"><div class="child"></div></div>
+<div class="container grid"><div class="child" id="item"></div></div>
+<script>
+    item.style.width = "0px";
+    item.offsetLeft;
+    item.style.width = "25px";
+    item.offsetLeft;
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-bar-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-bar-001.html
index e381ffe..9fc44123 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-bar-001.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-bar-001.html
@@ -25,10 +25,8 @@
     </style>
     <script src="/common/reftest-wait.js"></script>
     <script>
-      window.addEventListener("load", () => {
-        // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-        requestAnimationFrame(() => { document.fonts.ready.then(adjustPositionOfFraction); });
-      });
+      window.addEventListener("load", () => { document.fonts.ready.then(adjustPositionOfFraction); });
+
       function adjustPositionOfFraction()
       {
         requestAnimationFrame(() => {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-linethickness-002.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-linethickness-002.html
index 85c7c58..6cb1b8b4 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-linethickness-002.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-linethickness-002.html
@@ -28,10 +28,7 @@
       }
 
       setup({ explicit_done: true });
-      window.addEventListener("load", function() {
-        // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-        requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-      });
+      window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
       function runTests() {
         var defaultRuleThickness = 100;
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-1.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-1.html
index ba47897c..b7efbc78 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-1.html
@@ -62,10 +62,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-2.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-2.html
index 1512657..368fc06 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-2.html
@@ -46,10 +46,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
 
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html
index 69be003..9c7db8a3 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html
index e87b357..98fd807 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html
index 9169bb99..b4e9a25 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html
index 0b704dc8..2bc848b 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html
index 3fe86fa..91b85450 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html
index 9bd7983..44c4cf6 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html
index 10d0415..9578254 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html
index 43410cb..431b0af4 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html
index 9bfd765..270a8ac 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html
index da77012..3be7797 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html
index 2abba28f..02cd847 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html
@@ -29,10 +29,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html
index 25bf644..783696ac 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html
@@ -47,10 +47,7 @@
     div.style.height = `${refBox.height-4}px`;
     document.documentElement.classList.remove('reftest-wait');
   }
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 </script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/inferred-mrow-stretchy.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/inferred-mrow-stretchy.html
index ee40561..b6a51762 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/inferred-mrow-stretchy.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/inferred-mrow-stretchy.html
@@ -28,10 +28,7 @@
 </style>
 <script type="text/javascript">
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
   function runTests()
   {
       ["Mrow", "Sqrt", "Style", "Error", "Phantom", "Math", "Menclose", "Mpadded"].forEach((tag) => {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/mo-axis-height-1.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/mo-axis-height-1.html
index 63595b02..3b28d97 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/mo-axis-height-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/operators/mo-axis-height-1.html
@@ -25,10 +25,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/radicals/root-parameters-1.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/radicals/root-parameters-1.html
index d09d117..0643362 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/radicals/root-parameters-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/radicals/root-parameters-1.html
@@ -50,10 +50,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-1.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-1.html
index a5f21ec5..0c6610c 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-1.html
@@ -62,10 +62,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
index 0abf0183..da7574a 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
@@ -27,10 +27,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   /*
     These two tests verify that:
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-1.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-1.html
index 26a1b39..9217488 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-1.html
@@ -38,10 +38,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-2.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-2.html
index aed22235..6f9aa476 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-2.html
@@ -38,10 +38,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-3.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-3.html
index 6a1e51c..a09e2cbc 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-3.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-3.html
@@ -41,10 +41,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => {   document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-4.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-4.html
index e569c15..8df0f4d8 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-4.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-parameters-4.html
@@ -41,10 +41,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => {   document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/tables/table-axis-height.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/tables/table-axis-height.html
index 3eaf9c8f..f9354266a 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/tables/table-axis-height.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/tables/table-axis-height.html
@@ -26,10 +26,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-013.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-013.html
index 60bc906..30be35c 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-013.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-013.html
@@ -21,10 +21,7 @@
         document.getElementById("m6").removeAttribute("displaystyle");
         document.documentElement.removeAttribute("class");
       }
-      window.addEventListener("load", function() {
-        // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-        requestAnimationFrame(() => { document.fonts.ready.then(doTest); });
-      });
+      window.addEventListener("load", () => { document.fonts.ready.then(doTest); });
     </script>
     <link rel="stylesheet" href="/fonts/ahem.css">
     <style>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-014.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-014.html
index 5f30f534e5..d54a804 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-014.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-014.html
@@ -18,10 +18,7 @@
                  setAttribute('mathbackground', 'red');
         document.documentElement.removeAttribute("class");
       }
-      window.addEventListener("load", function() {
-        // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-        requestAnimationFrame(() => { document.fonts.ready.then(doTest); });
-      });
+      window.addEventListener("load", () => { document.fonts.ready.then(doTest); });
     </script>
     <link rel="stylesheet" href="/fonts/ahem.css">
     <style>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-1.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-1.html
index 73e5020e..19494a3e 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-1.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-1.html
@@ -31,10 +31,7 @@
       assert_approx_equals(elementSize, expectedSize, epsilon, description);
   }
 
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
       for (transform in AttributeValueTransforms) {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-2.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-2.html
index fc1bd7a4..e544f453 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/displaystyle-2.html
@@ -31,10 +31,7 @@
       assert_approx_equals(elementSize, expectedSize, epsilon, description);
   }
 
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
       for (transform in AttributeValueTransforms) {
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/lengths-2.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/lengths-2.html
index 22fc401..90b0887 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/lengths-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/lengths-2.html
@@ -29,10 +29,7 @@
   }
 
   setup({ explicit_done: true });
-  window.addEventListener("load", function() {
-    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
-    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
-  });
+  window.addEventListener("load", () => { document.fonts.ready.then(runTests); });
 
   function runTests() {
     test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testharnessreport-servo.js b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testharnessreport-servo.js
index b672aea..a10b69df 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testharnessreport-servo.js
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testharnessreport-servo.js
@@ -4,7 +4,7 @@
 setup(props);
 
 add_completion_callback(function (tests, harness_status) {
-    var id = start_loc.pathname + start_loc.search + start_loc.hash;
+    var id = decodeURIComponent(start_loc.pathname) + decodeURIComponent(start_loc.search) + decodeURIComponent(start_loc.hash);
     console.log("ALERT: RESULT: " + JSON.stringify([
         id,
         harness_status.status,
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html
new file mode 100644
index 0000000..d90a4fb
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script>
+testRunner.setUseMockTheme(false);
+testRunner.waitUntilDone();
+</script>
+<script src="../../../forms/resources/common.js"></script>
+<script src="../../../forms/resources/picker-common.js"></script>
+<script src="../../../forms/calendar-picker/resources/calendar-picker-common.js"></script>
+<input type=date id=date value="10000-07-31">
+<script>
+openPicker(document.getElementById('date'), function() {
+  clickMonthPopupButton();
+  popupWindow.global.picker.monthPopupView.yearListView.element.addEventListener('webkitTransitionEnd', function() {
+    testRunner.notifyDone();
+  })
+});
+</script>
diff --git a/third_party/blink/web_tests/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html b/third_party/blink/web_tests/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html
index f9bde5ae..85fafee0 100644
--- a/third_party/blink/web_tests/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html
+++ b/third_party/blink/web_tests/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html
@@ -2,9 +2,9 @@
 <head>
 <title>Signed Exchange subresource Origin Trial</title>
 <!-- Generate token with the command:
-generate_token.py https://127.0.0.1:8443 SignedExchangeSubresourcePrefetchM78 --expire-timestamp=2000000000
+generate_token.py https://127.0.0.1:8443 SignedExchangeSubresourcePrefetch --expire-timestamp=2000000000
 -->
-<meta http-equiv="origin-trial" content="AmLErZ23mbgdUsYB72aIdYTI0TemZpt1Vy653/sAA3fDl7xMJKQVIoISbEmZtD+DwXj9NsdzdwXPFVeicBc3VAIAAABteyJvcmlnaW4iOiAiaHR0cHM6Ly8xMjcuMC4wLjE6ODQ0MyIsICJmZWF0dXJlIjogIlNpZ25lZEV4Y2hhbmdlU3VicmVzb3VyY2VQcmVmZXRjaE03OCIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==">
+<meta http-equiv="origin-trial" content="AkPuNZ6wN6pkhO5BsawPJCR9+8TDqRn4NUKsrhif+5Hs6l3dbRCdhhBpImxV13ZM8luH7wYH+rC9LYwD9xIQOAwAAABqeyJvcmlnaW4iOiAiaHR0cHM6Ly8xMjcuMC4wLjE6ODQ0MyIsICJmZWF0dXJlIjogIlNpZ25lZEV4Y2hhbmdlU3VicmVzb3VyY2VQcmVmZXRjaCIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==">
 <script src="./resources/sxg-util.js"></script>
 </head>
 <body>
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..19dec33
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/linux/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..d6e4c55
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..4b54f753
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..301be515
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..a3245a6f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..19d1d2b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..a493585
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..eee865ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..eee865ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..10fb5191
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..eee865ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5518-brdr-t-01-e-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5518-brdr-t-01-e-expected.png
index 7adf21b..37c34472 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5518-brdr-t-01-e-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5518-brdr-t-01-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5519-brdr-r-00-a-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5519-brdr-r-00-a-expected.png
index 12905ba..dbe6ce70 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5519-brdr-r-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5519-brdr-r-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5520-brdr-b-01-e-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5520-brdr-b-01-e-expected.png
index d7d8ad4..4f8452dc 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5520-brdr-b-01-e-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5520-brdr-b-01-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-00-a-expected.png
index a9c339c..5ad7d68bd 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-01-e-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-01-e-expected.png
index 9d9a573..8b185e98 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-01-e-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-brdr-l-01-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
index 002a349..73ff1d2 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-02-c-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-02-c-expected.png
index 06393dc..63a2661 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-02-c-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-02-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-03-c-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-03-c-expected.png
index bef3e63..594c3f53 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-03-c-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-03-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-04-c-expected.png
index 641143b..db95f6f 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-04-c-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-04-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-fit-01-d-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-fit-01-d-g-expected.png
index 3169f4d..ce80743 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-fit-01-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c414-flt-fit-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltblck-01-d-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltblck-01-d-expected.png
index 9c9aec7c..13d1c3d 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltblck-01-d-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltblck-01-d-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
index 29ab702..9b36866 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
index c89baf5..eba83e9 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png
index 6b8f806..a40f6b1 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-03-c-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-03-c-g-expected.png
index 7e91584..35a26e0 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-03-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwidth-03-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwrap-00-b-expected.png
index 5080d34..1eb3dd8e 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwrap-00-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5525-fltwrap-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5526-flthw-00-c-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5526-flthw-00-c-g-expected.png
index 9e0f9289..90828ba 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t0905-c5526-flthw-00-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t0905-c5526-flthw-00-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-01-b-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-01-b-expected.png
index ec18e66..fe76f2d7 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-03-b-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-03-b-g-expected.png
index e3e2f5e..960c2b6 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-03-b-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-03-b-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-ln-01-d-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-ln-01-d-g-expected.png
index c7cbfba..a3825fb 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-ln-01-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t090501-c414-flt-ln-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-l-00-b-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-l-00-b-g-expected.png
index f7e8b264..d32967f5 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-l-00-b-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-l-00-b-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-r-00-b-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-r-00-b-g-expected.png
index cdf118d..95b56d7a 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-r-00-b-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t090501-c5525-flt-r-00-b-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
index 1d627bd..c5b12dc 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t1202-counter-04-b-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t1202-counter-04-b-expected.png
index e414f17..a51f9ac 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t1202-counter-04-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t1202-counter-04-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t1202-counters-04-b-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t1202-counters-04-b-expected.png
index 257838b..6074803 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t1202-counters-04-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t1202-counters-04-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/win/css2.1/t1205-c566-list-stl-01-c-g-expected.png
index e8cedc1..7c520e2 100644
--- a/third_party/blink/web_tests/platform/win/css2.1/t1205-c566-list-stl-01-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win/css2.1/t1205-c566-list-stl-01-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css/line-height-determined-by-primary-font-expected.png b/third_party/blink/web_tests/platform/win/fast/css/line-height-determined-by-primary-font-expected.png
index 2528854..298ea51 100644
--- a/third_party/blink/web_tests/platform/win/fast/css/line-height-determined-by-primary-font-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/css/line-height-determined-by-primary-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png b/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
index 17c29624..8d1ca66 100644
--- a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/dynamic/text-combine-expected.png b/third_party/blink/web_tests/platform/win/fast/dynamic/text-combine-expected.png
index 7879011..7b7dceb 100644
--- a/third_party/blink/web_tests/platform/win/fast/dynamic/text-combine-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/dynamic/text-combine-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/encoding/invalid-UTF-8-expected.png b/third_party/blink/web_tests/platform/win/fast/encoding/invalid-UTF-8-expected.png
index fb71d70..94729585 100644
--- a/third_party/blink/web_tests/platform/win/fast/encoding/invalid-UTF-8-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/encoding/invalid-UTF-8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
index 095428c..4885bcc 100644
--- a/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/events/updateLayoutForHitTest-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..33d6918
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
index ac11d8b..ea80f85 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/placeholder-position-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/placeholder-position-expected.png
index 0e263a7e..c508d399 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/placeholder-position-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/placeholder-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png
index 3b4f724..9b36490f 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/text/text-font-height-mismatch-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/inline/justify-emphasis-inline-box-expected.png b/third_party/blink/web_tests/platform/win/fast/inline/justify-emphasis-inline-box-expected.png
index 3d88ee10..edd0612 100644
--- a/third_party/blink/web_tests/platform/win/fast/inline/justify-emphasis-inline-box-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/inline/justify-emphasis-inline-box-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/inline/vertical-align-with-fallback-fonts-expected.png b/third_party/blink/web_tests/platform/win/fast/inline/vertical-align-with-fallback-fonts-expected.png
index 61b72bd..7f95a096 100644
--- a/third_party/blink/web_tests/platform/win/fast/inline/vertical-align-with-fallback-fonts-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/inline/vertical-align-with-fallback-fonts-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/ruby/base-shorter-than-text-expected.png b/third_party/blink/web_tests/platform/win/fast/ruby/base-shorter-than-text-expected.png
index a485f1b..db2eebd 100644
--- a/third_party/blink/web_tests/platform/win/fast/ruby/base-shorter-than-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/ruby/base-shorter-than-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/ruby/nested-ruby-expected.png b/third_party/blink/web_tests/platform/win/fast/ruby/nested-ruby-expected.png
index 99d43864..9d19e17 100644
--- a/third_party/blink/web_tests/platform/win/fast/ruby/nested-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/ruby/nested-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/atsui-multiple-renderers-expected.png b/third_party/blink/web_tests/platform/win/fast/text/atsui-multiple-renderers-expected.png
index bc96de2f..d266d77 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/atsui-multiple-renderers-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/atsui-multiple-renderers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/decorations-with-text-combine-expected.png b/third_party/blink/web_tests/platform/win/fast/text/decorations-with-text-combine-expected.png
index fb2066b..a2dd6b0 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/decorations-with-text-combine-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/decorations-with-text-combine-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/emoticons-expected.png b/third_party/blink/web_tests/platform/win/fast/text/emoticons-expected.png
index a31d3f0..73c59d9 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/emoticons-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/emoticons-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/001-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/001-expected.png
index 86e3dae..2e8b1ca 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/001-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/002-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/002-expected.png
index bf41402..f9f7310 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/002-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/003-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/003-expected.png
index 7c846805..9bc877b8 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/003-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/plane2-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/plane2-expected.png
index abeaed3..918a38d0 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/plane2-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/plane2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/thai-baht-space-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/thai-baht-space-expected.png
index 74b0a25..79e932d 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/thai-baht-space-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/thai-baht-space-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/vertical-text-metrics-test-expected.txt b/third_party/blink/web_tests/platform/win/fast/text/international/vertical-text-metrics-test-expected.txt
index f3a6e9a..ccf7340 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/vertical-text-metrics-test-expected.txt
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/vertical-text-metrics-test-expected.txt
@@ -14,9 +14,9 @@
 
 
 
-width=219
-width=34
-width=34
-width=219
-width=34
-width=34
+width=172
+width=28
+width=28
+width=172
+width=28
+width=28
diff --git a/third_party/blink/web_tests/platform/win/fast/text/international/wrap-CJK-001-expected.png b/third_party/blink/web_tests/platform/win/fast/text/international/wrap-CJK-001-expected.png
index 3b26c9d..818c2bd 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/international/wrap-CJK-001-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/international/wrap-CJK-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-complex-expected.png b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-complex-expected.png
index 9879ec0..5e14f45d 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-complex-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-complex-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-leading-expansion-expected.png b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-leading-expansion-expected.png
index 106f9ed..c96411b0 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-leading-expansion-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-leading-expansion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-simple-expected.png b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-simple-expected.png
index 9879ec0..5e14f45d 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-simple-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/justify-ideograph-simple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/selection/emphasis-expected.png b/third_party/blink/web_tests/platform/win/fast/text/selection/emphasis-expected.png
index 286c44b..a4d0a058 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/selection/emphasis-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/selection/emphasis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/selection/selection-multiple-runs-expected.png b/third_party/blink/web_tests/platform/win/fast/text/selection/selection-multiple-runs-expected.png
index d5318f1..743e911835 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/selection/selection-multiple-runs-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/selection/selection-multiple-runs-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/vertical-surrogate-pair-expected.png b/third_party/blink/web_tests/platform/win/fast/text/vertical-surrogate-pair-expected.png
index 21c2115a..935ebd6 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/vertical-surrogate-pair-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/vertical-surrogate-pair-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
index 3077512..53b5d8e 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/fallback-orientation-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/fallback-orientation-expected.png
index b936777..e7d02562 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/fallback-orientation-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/fallback-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
index 58fc3471..2bc60f5 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-rl-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
index 0190774..bdc77987 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/text-combine-various-fonts-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/text-combine-various-fonts-expected.png
index 0da523b..44a00e8 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/text-combine-various-fonts-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/text-combine-various-fonts-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-align-table-baseline-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-align-table-baseline-expected.png
index 981883e..f38e6e95 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-align-table-baseline-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-align-table-baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-baseline-alignment-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-baseline-alignment-expected.png
index a212822..f0512a7 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-baseline-alignment-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-baseline-alignment-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-font-fallback-expected.png b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-font-fallback-expected.png
index 253d49d..42af1a7 100644
--- a/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-font-fallback-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/writing-mode/vertical-font-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/platform/win/images/color-profile-svg-fill-text-expected.png
index b25ef45..98730be 100644
--- a/third_party/blink/web_tests/platform/win/images/color-profile-svg-fill-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/images/color-profile-svg-fill-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/lang-fallback-expected.txt b/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/lang-fallback-expected.txt
index 267de59..65abf06 100644
--- a/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/lang-fallback-expected.txt
+++ b/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/lang-fallback-expected.txt
@@ -32,7 +32,7 @@
 
 ⲁⲂ
 #copt:
-"Segoe UI Symbol" : 2
+"Segoe UI Historic" : 2
 
 𒀀𒀌
 #akk:
@@ -60,7 +60,7 @@
 
 ႠႡ
 #ka:
-"Sylfaen" : 2
+"Segoe UI" : 2
 
 ΑΒ
 #el:
@@ -72,23 +72,23 @@
 

 #zh-CN:
-"SimSun" : 1
+"Microsoft YaHei UI" : 1
 

 #zh-HK:
-"微軟正黑體" : 1
+"Microsoft JhengHei UI" : 1
 

 #zh-Hans:
-"SimSun" : 1
+"Microsoft YaHei UI" : 1
 

 #zh-Hant:
-"微軟正黑體" : 1
+"Microsoft JhengHei UI" : 1
 

 #ja:
-"Yu Gothic" : 1
+"Yu Gothic UI" : 1
 
 ᄀᄁ
 #ko:
@@ -228,7 +228,7 @@
 
 กข
 #th:
-"Tahoma" : 2
+"Leelawadee UI" : 2
 
 ༁༂
 #bo:
diff --git a/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt b/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
index 9d897ec..c4d5c85 100644
--- a/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
+++ b/third_party/blink/web_tests/platform/win/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
@@ -1,11 +1,11 @@
 百家姓 趙錢孫李 周吳鄭王 馮陳褚衛 蔣沈韓楊 朱秦尤許 何呂施張 孔曹嚴華 金魏陶薑 戚謝鄒喻 柏水竇章 雲蘇潘葛 奚範彭郎 魯韋昌馬 苗鳳花方 俞任袁柳 酆鮑史唐 費廉岑薛 雷賀倪湯 滕殷羅畢 郝鄔安常 樂於時傅 皮卞齊康 伍餘元蔔 顧孟平黃 和穆蕭尹 姚邵堪汪 祁毛禹狄 米貝明臧 計伏成戴 談宋茅龐 熊紀舒屈 項祝董梁 杜阮藍閔 席季麻強 賈路婁危 江童顏郭 梅盛林刁 鍾徐邱駱 高夏蔡田 樊胡淩霍 虞萬支柯 昝管盧莫 經房裘繆 幹解應宗 丁宣賁鄧 鬱單杭洪 包諸左石 崔吉鈕龔 程嵇邢滑 裴陸榮翁 荀羊於惠 甄曲家封 芮羿儲靳 汲邴糜松 井段富巫 烏焦巴弓 牧隗山穀 車侯宓蓬 全郗班仰 秋仲伊宮 寧仇欒暴 甘鈄厲戎 祖武符劉 景詹束龍 葉幸司韶 郜黎薊薄 印宿白懷 蒲台從鄂 索鹹籍賴 卓藺屠蒙 池喬陰鬱 胥能蒼雙 聞莘黨翟 譚貢勞逄 姬申扶堵 冉宰酈雍 卻璩桑桂 濮牛壽通 邊扈燕冀 郟浦尚農 溫別莊晏 柴瞿閻充 慕連茹習 宦艾魚容 向古易慎 戈廖庚終 暨居衡步 都耿滿弘 匡國文寇 廣祿闕東 毆殳沃利 蔚越夔隆 師鞏厙聶 晁勾敖融 冷訾辛闞 那簡饒空 曾毋沙乜 養鞠須豐 巢關蒯相 查後荊紅 遊竺權逯 蓋益桓公 萬俟司馬 上官歐陽 夏侯諸葛 聞人東方 赫連皇甫 尉遲公羊 澹台公冶 宗政濮陽 淳於單於 太叔申屠 公孫仲孫 軒轅令狐 鐘離宇文 長孫慕容 鮮於閭丘 司徒司空 亓官司寇 仉督子車 顓孫端木 巫馬公西 漆雕樂正 壤駟公良 拓拔夾穀 宰父穀粱 晉楚閆法 汝鄢塗欽 段幹百里 東郭南門 呼延歸海 羊舌微生 嶽帥緱亢 況後有琴 梁丘左丘 東門西門 商牟佘佴 伯賞南宮 墨哈譙笪 年愛陽佟
 #hundred_chinese_surnames:
-"SimSun" : 563,
+"Microsoft YaHei UI" : 563,
 "Times New Roman" : 140
 
 いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさき ゆめみし ゑひもせす(ん)色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず(ん)
 #japanese_iroha:
-"Yu Gothic" : 92,
+"Yu Gothic UI" : 92,
 "Times New Roman" : 15
 
 키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.
@@ -45,8 +45,7 @@
 
 ⇦⇧⇨⇩←↑→↓⟀
 #text_presentation_arrows_maths:
-"MS PGothic" : 4,
-"Cambria Math" : 4,
-"Segoe UI Symbol" : 1
+"Segoe UI Symbol" : 5,
+"Yu Gothic UI" : 4
 
 
diff --git a/third_party/blink/web_tests/platform/win/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/win/media/track/track-cue-rendering-vertical-expected.png
index 457955f..eb467fd 100644
--- a/third_party/blink/web_tests/platform/win/media/track/track-cue-rendering-vertical-expected.png
+++ b/third_party/blink/web_tests/platform/win/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
index 5a2ff6e..4e808a1 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
index 3b4e9e5..3ae185c 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
index f07a9556..31ff1ed 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
@@ -19,72 +19,72 @@
       "paintInvalidations": [
         {
           "object": "NGPhysicalTextFragment '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'",
-          "rect": [307, 123, 470, 404],
+          "rect": [361, 123, 416, 404],
           "reason": "geometry"
         }
       ]
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-align-08-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-align-08-b-expected.png
index 09ab3b14..ef5d4295 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-align-08-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-align-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
index 5e43d41..ee0f65867 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
index d8d24af..d0d25c7 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-03-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
index fca5cfa6..b528d57 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-04-t-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
index 35dc3f6..3f668d0 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/batik/text/verticalText-expected.png b/third_party/blink/web_tests/platform/win/svg/batik/text/verticalText-expected.png
index fa79ddb..c30ad3cc 100644
--- a/third_party/blink/web_tests/platform/win/svg/batik/text/verticalText-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/batik/text/verticalText-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/hixie/intrinsic/003-expected.png b/third_party/blink/web_tests/platform/win/svg/hixie/intrinsic/003-expected.png
index 2710c72..d84c6c2f 100644
--- a/third_party/blink/web_tests/platform/win/svg/hixie/intrinsic/003-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/hixie/intrinsic/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/text/non-bmp-positioning-lists-expected.png b/third_party/blink/web_tests/platform/win/svg/text/non-bmp-positioning-lists-expected.png
index 67f0eb23..3e5c1b7 100644
--- a/third_party/blink/web_tests/platform/win/svg/text/non-bmp-positioning-lists-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/text/non-bmp-positioning-lists-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win/svg/text/text-selection-fonts-01-t-expected.png
index ddf2d50..d4645cff 100644
--- a/third_party/blink/web_tests/platform/win/svg/text/text-selection-fonts-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/text/text-selection-fonts-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/color-profile-svg-fill-text-expected.png
index 281b7d8..e8db9b0 100644
--- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/color-profile-svg-fill-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/color-profile-svg-fill-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
index fa90c8d..018c7924 100644
--- a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/color-profile-svg-fill-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/platform/win/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
deleted file mode 100644
index 095428c..0000000
--- a/third_party/blink/web_tests/platform/win/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-02-c-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-02-c-expected.png
new file mode 100644
index 0000000..63a2661
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-02-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-fit-01-d-g-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-fit-01-d-g-expected.png
new file mode 100644
index 0000000..3169f4d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c414-flt-fit-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
index 71d138d..ea3fa15 100644
--- a/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5526-flthw-00-c-g-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5526-flthw-00-c-g-expected.png
new file mode 100644
index 0000000..9e0f9289
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/css2.1/t0905-c5526-flthw-00-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
new file mode 100644
index 0000000..c5b12dc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/css2.1/t100304-c43-rpl-bbx-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t1202-counter-04-b-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t1202-counter-04-b-expected.png
deleted file mode 100644
index a51f9ac..0000000
--- a/third_party/blink/web_tests/platform/win7/css2.1/t1202-counter-04-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/css2.1/t1202-counters-04-b-expected.png b/third_party/blink/web_tests/platform/win7/css2.1/t1202-counters-04-b-expected.png
deleted file mode 100644
index 6074803..0000000
--- a/third_party/blink/web_tests/platform/win7/css2.1/t1202-counters-04-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/css/line-height-determined-by-primary-font-expected.png b/third_party/blink/web_tests/platform/win7/fast/css/line-height-determined-by-primary-font-expected.png
deleted file mode 100644
index d6bfc745..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/css/line-height-determined-by-primary-font-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png b/third_party/blink/web_tests/platform/win7/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
index 310e767..79a595b8 100644
--- a/third_party/blink/web_tests/platform/win7/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/dynamic/text-combine-expected.png b/third_party/blink/web_tests/platform/win7/fast/dynamic/text-combine-expected.png
index ab21af1..7f89007 100644
--- a/third_party/blink/web_tests/platform/win7/fast/dynamic/text-combine-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/dynamic/text-combine-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/encoding/invalid-UTF-8-expected.png b/third_party/blink/web_tests/platform/win7/fast/encoding/invalid-UTF-8-expected.png
new file mode 100644
index 0000000..fb71d70
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/fast/encoding/invalid-UTF-8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..58043ff1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index c1ef6b4..f307685f 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
index 9706a66..f639a13 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/inline/justify-emphasis-inline-box-expected.png b/third_party/blink/web_tests/platform/win7/fast/inline/justify-emphasis-inline-box-expected.png
index 9ed65d9..a5dbf9e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/inline/justify-emphasis-inline-box-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/inline/justify-emphasis-inline-box-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/inline/vertical-align-with-fallback-fonts-expected.png b/third_party/blink/web_tests/platform/win7/fast/inline/vertical-align-with-fallback-fonts-expected.png
index 1462ad4..3e16510 100644
--- a/third_party/blink/web_tests/platform/win7/fast/inline/vertical-align-with-fallback-fonts-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/inline/vertical-align-with-fallback-fonts-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/ruby/base-shorter-than-text-expected.png b/third_party/blink/web_tests/platform/win7/fast/ruby/base-shorter-than-text-expected.png
index f9461a7..0d944bf 100644
--- a/third_party/blink/web_tests/platform/win7/fast/ruby/base-shorter-than-text-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/ruby/base-shorter-than-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/ruby/nested-ruby-expected.png b/third_party/blink/web_tests/platform/win7/fast/ruby/nested-ruby-expected.png
index dd56802..61b30d3 100644
--- a/third_party/blink/web_tests/platform/win7/fast/ruby/nested-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/ruby/nested-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/atsui-multiple-renderers-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/atsui-multiple-renderers-expected.png
index f70a69b9..aed8979 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/atsui-multiple-renderers-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/atsui-multiple-renderers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/capitalize-boundaries-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/capitalize-boundaries-expected.png
index 8fb044b..8273332 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/capitalize-boundaries-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/capitalize-boundaries-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/decorations-with-text-combine-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/decorations-with-text-combine-expected.png
index c6041e7..1350e61 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/decorations-with-text-combine-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/decorations-with-text-combine-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/font-fallback-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/font-fallback-expected.png
index 61ee5a9..4243bd63 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/font-fallback-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/font-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/002-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/international/002-expected.png
index 9e3b8d8..7113141 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/002-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/003-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/international/003-expected.png
index a9bbf5a..7f3a327 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/003-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/plane2-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/international/plane2-expected.png
index 02ab940..0b25df7 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/plane2-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/plane2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/thai-baht-space-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/international/thai-baht-space-expected.png
index 92fee0e..bf375a32 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/thai-baht-space-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/thai-baht-space-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/vertical-text-metrics-test-expected.txt b/third_party/blink/web_tests/platform/win7/fast/text/international/vertical-text-metrics-test-expected.txt
index d253f60..ce67f2a7 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/vertical-text-metrics-test-expected.txt
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/vertical-text-metrics-test-expected.txt
@@ -14,9 +14,9 @@
 
 
 
-width=219
-width=32
-width=32
-width=219
-width=32
-width=32
+width=172
+width=27
+width=27
+width=172
+width=27
+width=27
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/international/wrap-CJK-001-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/international/wrap-CJK-001-expected.png
index a92eb47..8ae19224 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/international/wrap-CJK-001-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/international/wrap-CJK-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-complex-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-complex-expected.png
index 7004df4..43a13e8 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-complex-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-complex-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-leading-expansion-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-leading-expansion-expected.png
index efb7c004..e15ecf7 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-leading-expansion-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-leading-expansion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-simple-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-simple-expected.png
index 7004df4..43a13e8 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-simple-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/justify-ideograph-simple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/selection/emphasis-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/selection/emphasis-expected.png
index 7b321cbe..e014f71 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/selection/emphasis-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/selection/emphasis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/selection/selection-multiple-runs-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/selection/selection-multiple-runs-expected.png
index 02561a67..9d94e9a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/selection/selection-multiple-runs-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/selection/selection-multiple-runs-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/unicode-fallback-font-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/unicode-fallback-font-expected.png
index 18a84d6e..d899116 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/unicode-fallback-font-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/unicode-fallback-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/vertical-surrogate-pair-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/vertical-surrogate-pair-expected.png
index 9e09153b..6a01b24 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/vertical-surrogate-pair-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/vertical-surrogate-pair-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
index 6d686c5..1f00f434 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/fallback-orientation-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/fallback-orientation-expected.png
index a3b3cfb..ff28af01 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/fallback-orientation-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/fallback-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
index 765fae82..f9ede55 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
index ba74600..bb1b03f 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/text-combine-various-fonts-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/text-combine-various-fonts-expected.png
index ee00aea..9314104 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/text-combine-various-fonts-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/text-combine-various-fonts-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-align-table-baseline-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-align-table-baseline-expected.png
index 4a9a0fde..c49f57e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-align-table-baseline-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-align-table-baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-baseline-alignment-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-baseline-alignment-expected.png
deleted file mode 100644
index 05663ac..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-baseline-alignment-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-font-fallback-expected.png b/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-font-fallback-expected.png
deleted file mode 100644
index 82a92b8cb..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/writing-mode/vertical-font-fallback-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/lang-fallback-expected.txt b/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/lang-fallback-expected.txt
index 498be4d5..58df3f2 100644
--- a/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/lang-fallback-expected.txt
+++ b/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/lang-fallback-expected.txt
@@ -4,7 +4,7 @@
 
 ՀՁ
 #hy-am:
-"Tahoma" : 2
+"Sylfaen" : 2
 
 সম
 #bn:
@@ -28,7 +28,7 @@
 
 ᎡᎢ
 #chr:
-"Arial" : 2
+"Plantagenet Cherokee" : 2
 
 ⲁⲂ
 #copt:
@@ -48,7 +48,7 @@
 
 𐐀𐐁
 #en:
-"Arial" : 2
+"Segoe UI Symbol" : 2
 
 अआ
 #hi:
@@ -72,23 +72,23 @@
 

 #zh-CN:
-"SimSun" : 1
+"Microsoft YaHei" : 1
 

 #zh-HK:
-"PMingLiU" : 1
+"Microsoft JhengHei" : 1
 

 #zh-Hans:
-"SimSun" : 1
+"Microsoft YaHei" : 1
 

 #zh-Hant:
-"PMingLiU" : 1
+"Microsoft JhengHei" : 1
 

 #ja:
-"Meiryo" : 1
+"Meiryo UI" : 1
 
 ᄀᄁ
 #ko:
@@ -172,7 +172,7 @@
 
 𐌁𐌂
 #script_old_italic:
-"Arial" : 2
+"Segoe UI Symbol" : 2
 
 𐎡𐎢
 #peo:
@@ -228,7 +228,7 @@
 
 กข
 #th:
-"Tahoma" : 2
+"Leelawadee" : 2
 
 ༁༂
 #bo:
diff --git a/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt b/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
index d9b888df..b0e7d4d 100644
--- a/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
+++ b/third_party/blink/web_tests/platform/win7/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
@@ -1,11 +1,11 @@
 百家姓 趙錢孫李 周吳鄭王 馮陳褚衛 蔣沈韓楊 朱秦尤許 何呂施張 孔曹嚴華 金魏陶薑 戚謝鄒喻 柏水竇章 雲蘇潘葛 奚範彭郎 魯韋昌馬 苗鳳花方 俞任袁柳 酆鮑史唐 費廉岑薛 雷賀倪湯 滕殷羅畢 郝鄔安常 樂於時傅 皮卞齊康 伍餘元蔔 顧孟平黃 和穆蕭尹 姚邵堪汪 祁毛禹狄 米貝明臧 計伏成戴 談宋茅龐 熊紀舒屈 項祝董梁 杜阮藍閔 席季麻強 賈路婁危 江童顏郭 梅盛林刁 鍾徐邱駱 高夏蔡田 樊胡淩霍 虞萬支柯 昝管盧莫 經房裘繆 幹解應宗 丁宣賁鄧 鬱單杭洪 包諸左石 崔吉鈕龔 程嵇邢滑 裴陸榮翁 荀羊於惠 甄曲家封 芮羿儲靳 汲邴糜松 井段富巫 烏焦巴弓 牧隗山穀 車侯宓蓬 全郗班仰 秋仲伊宮 寧仇欒暴 甘鈄厲戎 祖武符劉 景詹束龍 葉幸司韶 郜黎薊薄 印宿白懷 蒲台從鄂 索鹹籍賴 卓藺屠蒙 池喬陰鬱 胥能蒼雙 聞莘黨翟 譚貢勞逄 姬申扶堵 冉宰酈雍 卻璩桑桂 濮牛壽通 邊扈燕冀 郟浦尚農 溫別莊晏 柴瞿閻充 慕連茹習 宦艾魚容 向古易慎 戈廖庚終 暨居衡步 都耿滿弘 匡國文寇 廣祿闕東 毆殳沃利 蔚越夔隆 師鞏厙聶 晁勾敖融 冷訾辛闞 那簡饒空 曾毋沙乜 養鞠須豐 巢關蒯相 查後荊紅 遊竺權逯 蓋益桓公 萬俟司馬 上官歐陽 夏侯諸葛 聞人東方 赫連皇甫 尉遲公羊 澹台公冶 宗政濮陽 淳於單於 太叔申屠 公孫仲孫 軒轅令狐 鐘離宇文 長孫慕容 鮮於閭丘 司徒司空 亓官司寇 仉督子車 顓孫端木 巫馬公西 漆雕樂正 壤駟公良 拓拔夾穀 宰父穀粱 晉楚閆法 汝鄢塗欽 段幹百里 東郭南門 呼延歸海 羊舌微生 嶽帥緱亢 況後有琴 梁丘左丘 東門西門 商牟佘佴 伯賞南宮 墨哈譙笪 年愛陽佟
 #hundred_chinese_surnames:
-"SimSun" : 563,
+"Microsoft YaHei" : 563,
 "Times New Roman" : 140
 
 いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさき ゆめみし ゑひもせす(ん)色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず(ん)
 #japanese_iroha:
-"Meiryo" : 92,
+"Meiryo UI" : 92,
 "Times New Roman" : 15
 
 키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.
@@ -46,8 +46,8 @@
 
 ⇦⇧⇨⇩←↑→↓⟀
 #text_presentation_arrows_maths:
-"MS PGothic" : 4,
-"Cambria Math" : 4,
+"Meiryo UI" : 4,
+"Segoe UI Symbol" : 4,
 "Arial" : 1
 
 
diff --git a/third_party/blink/web_tests/platform/win7/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/win7/media/track/track-cue-rendering-vertical-expected.png
index 12d70d3..1b7536f 100644
--- a/third_party/blink/web_tests/platform/win7/media/track/track-cue-rendering-vertical-expected.png
+++ b/third_party/blink/web_tests/platform/win7/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/platform/win7/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
deleted file mode 100644
index 51b1ae8..0000000
--- a/third_party/blink/web_tests/platform/win7/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.png b/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
index 89df879..a9b94742 100644
--- a/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
+++ b/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt b/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
index 48ed1fe..5972384a 100644
--- a/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
+++ b/third_party/blink/web_tests/platform/win7/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
@@ -19,72 +19,72 @@
       "paintInvalidations": [
         {
           "object": "NGPhysicalTextFragment '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         },
         {
           "object": "NGPhysicalTextFragment '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'",
-          "rect": [334, 123, 443, 404],
+          "rect": [413, 123, 364, 404],
           "reason": "geometry"
         }
       ]
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-align-08-b-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-align-08-b-expected.png
index d6c1c62..9411fe1 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-align-08-b-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-align-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
index 50a1ade..98bbcc80 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
index a9f0112e..f059f4c 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-03-b-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
index 4f3f400a..d57e59b 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-03-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-04-t-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
index 3007977..c20ede9 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/text-intro-04-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/batik/text/verticalText-expected.png b/third_party/blink/web_tests/platform/win7/svg/batik/text/verticalText-expected.png
index 07cce28..08b4c01f 100644
--- a/third_party/blink/web_tests/platform/win7/svg/batik/text/verticalText-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/batik/text/verticalText-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/hixie/intrinsic/003-expected.png b/third_party/blink/web_tests/platform/win7/svg/hixie/intrinsic/003-expected.png
new file mode 100644
index 0000000..2710c72
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/svg/hixie/intrinsic/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/text/non-bmp-positioning-lists-expected.png b/third_party/blink/web_tests/platform/win7/svg/text/non-bmp-positioning-lists-expected.png
new file mode 100644
index 0000000..67f0eb23
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/svg/text/non-bmp-positioning-lists-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win7/svg/text/text-selection-fonts-01-t-expected.png
index 67dd2f10..e3d039f 100644
--- a/third_party/blink/web_tests/platform/win7/svg/text/text-selection-fonts-01-t-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/text/text-selection-fonts-01-t-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/win7/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..1b7536f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/audio-service/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..ae79609
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/platform/win7/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
deleted file mode 100644
index 095428c..0000000
--- a/third_party/blink/web_tests/platform/win7/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
new file mode 100644
index 0000000..cefd647
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/leveldatabase/env_chromium_unittest.cc b/third_party/leveldatabase/env_chromium_unittest.cc
index e5cd130..43b57cb 100644
--- a/third_party/leveldatabase/env_chromium_unittest.cc
+++ b/third_party/leveldatabase/env_chromium_unittest.cc
@@ -270,8 +270,7 @@
 class ChromiumEnvDBTrackerTest : public ::testing::Test {
  protected:
   ChromiumEnvDBTrackerTest()
-      : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
+      : task_environment_(base::test::TaskEnvironment::MainThreadType::UI) {}
   void SetUp() override {
     testing::Test::SetUp();
     ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
@@ -306,7 +305,7 @@
 
  private:
   base::ScopedTempDir scoped_temp_dir_;
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
 };
 
 TEST_F(ChromiumEnvDBTrackerTest, OpenDatabase) {
diff --git a/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc b/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc
index 8bc5b64..b1232f1 100644
--- a/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc
+++ b/third_party/libaddressinput/chromium/chrome_address_validator_unittest.cc
@@ -922,7 +922,7 @@
     load_rules_success_ = success;
   }
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(FailingAddressValidatorTest);
 };
diff --git a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
index f1cfbff..b15e7219 100644
--- a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
+++ b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
@@ -64,7 +64,7 @@
     data_.reset(data);
   }
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
   network::TestURLLoaderFactory test_url_loader_factory_;
   scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
   GURL url_;
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium
index 1f2e7fc..86650253 100644
--- a/third_party/libvpx/README.chromium
+++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@
 License File: source/libvpx/LICENSE
 Security Critical: yes
 
-Date: Monday August 26 2019
+Date: Friday September 06 2019
 Branch: master
-Commit: 305a5283c5b4a3ff5321dc51d121ef21d071e980
+Commit: 5a0242ba5c8fddbf32766bfa2ffbbd25f3cd6167
 
 Description:
 Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h
index 344bda9..a1aa59e 100644
--- a/third_party/libvpx/source/config/vpx_version.h
+++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,7 +2,7 @@
 #define VERSION_MAJOR  1
 #define VERSION_MINOR  8
 #define VERSION_PATCH  1
-#define VERSION_EXTRA  "108-g305a5283c5"
+#define VERSION_EXTRA  "130-g5a0242ba5c"
 #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH))
-#define VERSION_STRING_NOSP "v1.8.1-108-g305a5283c5"
-#define VERSION_STRING      " v1.8.1-108-g305a5283c5"
+#define VERSION_STRING_NOSP "v1.8.1-130-g5a0242ba5c"
+#define VERSION_STRING      " v1.8.1-130-g5a0242ba5c"
diff --git a/third_party/widevine/cdm/BUILD.gn b/third_party/widevine/cdm/BUILD.gn
index 18177ec..ed0e2f5 100644
--- a/third_party/widevine/cdm/BUILD.gn
+++ b/third_party/widevine/cdm/BUILD.gn
@@ -106,8 +106,6 @@
     ]
   }
 } else {
-  assert(!enable_widevine_cdm_component,
-         "Widevine as a component requires a manifest.")
   group("widevine_cdm_manifest_and_license") {
     # NOP
   }
diff --git a/third_party/widevine/cdm/widevine.gni b/third_party/widevine/cdm/widevine.gni
index 1fe47e92..f7c1d6c 100644
--- a/third_party/widevine/cdm/widevine.gni
+++ b/third_party/widevine/cdm/widevine.gni
@@ -6,11 +6,11 @@
 import("//media/media_options.gni")
 
 declare_args() {
-  # Enables Widevine key system support. Enabled by default in Google Chrome and
-  # on Android.
+  # Enables Widevine key system support. Enabled by default in Google Chrome,
+  # on Android and Fuchsia platforms.
   # Can be optionally enabled in Chromium on non-Android platforms. Please see
   # //src/third_party/widevine/LICENSE file for details.
-  enable_widevine = is_chrome_branded || is_android
+  enable_widevine = is_chrome_branded || is_android || is_fuchsia
 }
 
 # Widevine CDM is available as a library CDM on the following platforms and
diff --git a/third_party/zlib/google/zip_reader_unittest.cc b/third_party/zlib/google/zip_reader_unittest.cc
index aa20185..4509b3c 100644
--- a/third_party/zlib/google/zip_reader_unittest.cc
+++ b/third_party/zlib/google/zip_reader_unittest.cc
@@ -214,7 +214,7 @@
 
   base::ScopedTempDir temp_dir_;
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  base::test::TaskEnvironment task_environment_;
 };
 
 TEST_F(ZipReaderTest, Open_ValidZipFile) {
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 25d46e9f..7502cf0 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -1130,6 +1130,7 @@
 
     'android_release_trybot_java_coverage': [
       'android', 'release_trybot', 'strip_debug_info', 'java_coverage',
+      'partial_code_coverage_instrumentation',
     ],
 
     'android_release_trybot_x86': [
@@ -1288,7 +1289,7 @@
 
     'chromeos_with_codecs_release_trybot_code_coverage': [
       'chromeos_with_codecs', 'release_trybot', 'use_vaapi', 'no_symbols',
-      'use_clang_coverage', 'partial_clang_instrumentation',
+      'use_clang_coverage', 'partial_code_coverage_instrumentation',
     ],
 
     'clang_code_coverage': [
@@ -1628,7 +1629,7 @@
 
     'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage': [
       'gpu_tests', 'release_trybot', 'no_symbols', 'use_dummy_lastchange',
-      'use_clang_coverage', 'partial_clang_instrumentation',
+      'use_clang_coverage', 'partial_code_coverage_instrumentation',
     ],
 
     'gpu_tests_release_bot_jumbo_no_symbols_use_dummy_lastchange': [
@@ -2022,7 +2023,7 @@
     },
 
     'cast': {
-      'gn_args': 'is_chromecast=true use_v4l2=true',
+      'gn_args': 'is_chromecast=true'
     },
 
     'cast_audio': {
@@ -2336,8 +2337,8 @@
     # https://cs.chromium.org/chromium/build/scripts/slave/recipe_modules/code_coverage/api.py
     # and
     # https://cs.chromium.org/chromium/src/docs/clang_code_coverage_wrapper.md
-    'partial_clang_instrumentation': {
-      'gn_args': 'coverage_instrumentation_input_file="//.clang-coverage/files_to_instrument.txt"'
+    'partial_code_coverage_instrumentation': {
+      'gn_args': 'coverage_instrumentation_input_file="//.code-coverage/files_to_instrument.txt"'
     },
 
     'pdf_xfa': {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7dde805..6729517 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -11607,6 +11607,13 @@
   <int value="3" label="Closed"/>
 </enum>
 
+<enum name="CrosSettingsOsBannerInteraction">
+  <int value="0" label="Not shown"/>
+  <int value="1" label="Shown"/>
+  <int value="2" label="Clicked"/>
+  <int value="3" label="Closed"/>
+</enum>
+
 <enum name="CrosShelfClickTarget">
   <obsolete>
     Deprecated as of 12/2013. Default pinned apps trial is finished.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index e6404c68..9356773c 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -20288,6 +20288,17 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.Settings.OsBannerInteraction"
+    enum="CrosSettingsOsBannerInteraction" expires_after="2020-03-01">
+  <owner>jamescook@chromium.org</owner>
+  <owner>cros-system-services@google.com</owner>
+  <summary>
+    Records whether the &quot;try your Chrome OS settings&quot; banner was shown
+    when the user opened a new Chrome browser settings tab and also records
+    interactions with the banner.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.SystemTray.FeaturePodCountOnOpen" units="count"
     expires_after="M80">
   <owner>tengs@chromium.org</owner>
@@ -78609,8 +78620,18 @@
     enum="BooleanConfirmed" expires_after="M80">
   <owner>zhongyi@chromium.org</owner>
   <summary>
-    The handshake status when when the session attempts to migrate the
-    connection according to different migration causes.
+    The handshake status when the session attempts to migrate the connection
+    according to different migration causes.
+  </summary>
+</histogram>
+
+<histogram name="Net.QuicSession.HandshakeStatusOnPortMigration"
+    enum="BooleanConfirmed" expires_after="2020-06-01">
+  <owner>zhongyi@chromium.org</owner>
+  <owner>rch@chromium.org</owner>
+  <summary>
+    The handshake status when the session attempts to port migration on path
+    degrading.
   </summary>
 </histogram>
 
@@ -78906,6 +78927,13 @@
   </summary>
 </histogram>
 
+<histogram name="Net.QuicSession.PortMigration"
+    enum="QuicConnectionMigrationStatus" expires_after="2020-06-01">
+  <owner>zhongyi@chromium.org</owner>
+  <owner>rch@chromium.org</owner>
+  <summary>The result of a QUIC port migration attempt.</summary>
+</histogram>
+
 <histogram name="Net.QuicSession.PreferAesGcm" enum="BooleanPreferred">
   <owner>rch@chromium.org</owner>
   <summary>
@@ -93610,6 +93638,17 @@
   </summary>
 </histogram>
 
+<histogram name="OptimizationGuide.HintsFetcher.NavigationHostCoveredByFetch"
+    enum="BooleanCovered" expires_after="M82">
+  <owner>mcrouse@chromium.org</owner>
+  <owner>dougarnett@chromium.org</owner>
+  <summary>
+    Records when hints fetching is enabled whether the HTTPS host being
+    navigated to was included in a hints fetch request and any hints returned
+    have not since expired.
+  </summary>
+</histogram>
+
 <histogram
     name="OptimizationGuide.HintsFetcher.TopHostProvider.BlacklistSize.OnInitialize"
     units="total host count" expires_after="M80">
@@ -93634,6 +93673,9 @@
 
 <histogram name="OptimizationGuide.HintsFetcher.WasHostCoveredByFetch"
     enum="Boolean" expires_after="M82">
+  <obsolete>
+    Deprecated as of 08/2019
+  </obsolete>
   <owner>mcrouse@chromium.org</owner>
   <owner>dougarnett@chromium.org</owner>
   <summary>
@@ -120612,6 +120654,10 @@
 
 <histogram name="SBClientDownload.DownloadFileHasDetachedSignatures"
     enum="Boolean" expires_after="M78">
+  <obsolete>
+    Deprecated 09/19, since the metric was not being actively used and there
+    were no near-term plans to begin using it.
+  </obsolete>
   <owner>drubery@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -121056,6 +121102,10 @@
 
 <histogram name="SBClientDownload.ZipFileFailureByType"
     enum="SBClientDownloadExtensions" expires_after="M78">
+  <obsolete>
+    Deprecated 09/19, since the metric was not being actively used and there
+    were no near-term plans to begin using it.
+  </obsolete>
   <owner>drubery@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -121105,7 +121155,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.ZipFileSuccess" enum="BooleanSuccess"
-    expires_after="M78">
+    expires_after="M80">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -121116,6 +121166,10 @@
 
 <histogram name="SBClientDownload.ZipFileSuccessByType"
     enum="SBClientDownloadExtensions" expires_after="M81">
+  <obsolete>
+    Deprecated 09/19, since the metric was not being actively used and there
+    were no near-term plans to begin using it.
+  </obsolete>
   <owner>vakh@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -173014,6 +173068,7 @@
   <suffix name="UrlBilling"/>
   <suffix name="UrlCsdDownloadWhitelist"/>
   <suffix name="UrlCsdWhitelist"/>
+  <suffix name="UrlHighConfidenceAllowlist"/>
   <suffix name="UrlMalBin"/>
   <suffix name="UrlMalware"/>
   <suffix name="UrlSoceng"/>
@@ -173229,8 +173284,12 @@
       label="Resources that were checked and classified as unsafe. Logged
              when the URL check is completed."/>
   <suffix name="UnsafePrefetchCanceled"
-      label="Pre-fetched resources that were checked and classified as
-             unsafe. Logged as the request is canceled."/>
+      label="Pre-fetched resources that were checked and classified as unsafe.
+             Logged as the request is canceled.">
+    <obsolete>
+      Removed in M79, not interesting to keep track of.
+    </obsolete>
+  </suffix>
   <affected-histogram name="SB2.ResourceTypes"/>
   <affected-histogram name="SB2.ResourceTypes2"/>
 </histogram_suffixes>
@@ -174339,7 +174398,6 @@
   <suffix name="PinchZoom" label="Pinch-to-zoom interaction"/>
   <suffix name="RAF" label="rAF callback driven animation"/>
   <suffix name="TouchScroll" label="Touchscreen driven interaction"/>
-  <suffix name="Video" label="Video playback"/>
   <suffix name="WheelScroll" label="Mousewheel driven interaction"/>
   <affected-histogram name="CompositorLatency"/>
   <affected-histogram name="CompositorLatency.MissedFrame"/>
diff --git a/tools/perf/benchmarks/rendering.py b/tools/perf/benchmarks/rendering.py
index 660c32fe..3b6e491 100644
--- a/tools/perf/benchmarks/rendering.py
+++ b/tools/perf/benchmarks/rendering.py
@@ -36,6 +36,14 @@
         'Event.Latency.ScrollUpdate.Touch.TimeToScrollUpdateSwapBegin4',
         'Event.Latency.ScrollBegin.Wheel.TimeToScrollUpdateSwapBegin4',
         'Event.Latency.ScrollUpdate.Wheel.TimeToScrollUpdateSwapBegin4',
+        'Graphics.Smoothness.Checkerboarding.CompositorAnimation',
+        'Graphics.Smoothness.Checkerboarding.MainThreadAnimation',
+        'Graphics.Smoothness.Checkerboarding.PinchZoom',
+        'Graphics.Smoothness.Checkerboarding.RAF',
+        'Graphics.Smoothness.Checkerboarding.TouchScroll',
+        'Graphics.Smoothness.Checkerboarding.Video',
+        'Graphics.Smoothness.Checkerboarding.WheelScroll',
+        'Graphics.Smoothness.Throughput.MainThread.MainThreadAnimation',
         'Graphics.Smoothness.Throughput.MainThread.PinchZoom',
         'Graphics.Smoothness.Throughput.MainThread.RAF',
         'Graphics.Smoothness.Throughput.MainThread.TouchScroll',
diff --git a/tools/perf/core/results_processor/processor.py b/tools/perf/core/results_processor/processor.py
index 9aab4c4..caf66852 100644
--- a/tools/perf/core/results_processor/processor.py
+++ b/tools/perf/core/results_processor/processor.py
@@ -19,7 +19,6 @@
 from core.results_processor import json3_output
 
 
-HTML_TRACE_NAME = 'trace.html'
 TELEMETRY_RESULTS = '_telemetry_results.jsonl'
 SUPPORTED_FORMATS = {
     'none': NotImplemented,
@@ -147,10 +146,6 @@
   intermediate_results = _LoadIntermediateResults(
       os.path.join(options.intermediate_dir, TELEMETRY_RESULTS))
 
-  _AggregateTraces(intermediate_results)
-
-  _UploadArtifacts(intermediate_results, options.upload_bucket)
-
   for output_format in options.output_formats:
     if output_format not in SUPPORTED_FORMATS:
       raise NotImplementedError(output_format)
@@ -185,40 +180,6 @@
   return results
 
 
-def _AggregateTraces(intermediate_results):
-  """Replace individual traces with an aggregate one for each test result.
-
-  For each test run with traces, generates an aggregate HTML trace. Removes
-  all entries for individual traces and adds one entry for aggregate one.
-  """
-  for result in intermediate_results['testResults']:
-    artifacts = result.get('artifacts', {})
-    traces = [name for name in artifacts if name.startswith('trace/')]
-    if len(traces) > 0:
-      # For now, the html trace is generated by Telemetry, so it should be there
-      # already. All we need to do is remove individual traces from the dict.
-      # TODO(crbug.com/981349): replace this with actual aggregation code.
-      assert HTML_TRACE_NAME in artifacts
-      for trace in traces:
-        del artifacts[trace]
-
-
-def _UploadArtifacts(intermediate_results, upload_bucket):
-  """Upload all artifacts to cloud.
-
-  For each test run, uploads all its artifacts to cloud and sets remoteUrl
-  fields in intermediate_results.
-  """
-  if upload_bucket is not None:
-    for result in intermediate_results['testResults']:
-      artifacts = result.get('artifacts', {})
-      for artifact in artifacts.values():
-        # For now, the uploading is done by Telemetry, so we just check that
-        # remoteUrls are set.
-        # TODO(crbug.com/981349): replace this with actual uploading code
-        assert 'remoteUrl' in artifact
-
-
 def _DefaultOutputDir():
   """Default output directory.
 
diff --git a/tools/perf/core/results_processor/processor_test.py b/tools/perf/core/results_processor/processor_test.py
index de0bcf0..d804e90 100644
--- a/tools/perf/core/results_processor/processor_test.py
+++ b/tools/perf/core/results_processor/processor_test.py
@@ -20,7 +20,7 @@
 from core.results_processor import testing
 
 
-class ResultsProcessorIntegrationTests(unittest.TestCase):
+class ResultProcessorIntegrationTests(unittest.TestCase):
   def setUp(self):
     self.output_dir = tempfile.mkdtemp()
     self.intermediate_dir = os.path.join(
@@ -66,33 +66,3 @@
     self.assertEqual(test_result['times'], [1.1, 1.2])
     self.assertEqual(test_result['time'], 1.1)
     self.assertEqual(test_result['shard'], 7)
-
-  def testJson3OutputWithArtifacts(self):
-    self.SerializeIntermediateResults([
-        testing.TestResult(
-            'benchmark/story',
-            artifacts={
-                'logs': testing.Artifact('/logs.txt', 'gs://logs.txt'),
-                'trace/telemetry': testing.Artifact('/telemetry.json'),
-                'trace.html':
-                    testing.Artifact('/trace.html', 'gs://trace.html'),
-            },
-    )])
-
-    processor.main([
-        '--output-format', 'json-test-results',
-        '--output-dir', self.output_dir,
-        '--intermediate-dir', self.intermediate_dir])
-
-    with open(os.path.join(
-        self.output_dir, json3_output.OUTPUT_FILENAME)) as f:
-      results = json.load(f)
-
-    self.assertIn('benchmark', results['tests'])
-    self.assertIn('story', results['tests']['benchmark'])
-    self.assertIn('artifacts', results['tests']['benchmark']['story'])
-    artifacts = results['tests']['benchmark']['story']['artifacts']
-
-    self.assertEqual(len(artifacts), 2)
-    self.assertEqual(artifacts['logs'], ['gs://logs.txt'])
-    self.assertEqual(artifacts['trace.html'], ['gs://trace.html'])
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 94644b4b..045d10a 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -331,7 +331,6 @@
 crbug.com/869118 [ linux ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ]
 crbug.com/836447 [ chromeos ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/899887 [ linux ] system_health.memory_desktop/browse:social:facebook_infinite_scroll:2018 [ Skip ]
-crbug.com/859500 [ linux ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/924330 [ linux ] system_health.memory_desktop/browse:media:pinterest:2018 [ Skip ]
 crbug.com/874803 [ win10 ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/944978 [ win7 ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py
index f2aeb4b..fa2a7e53 100755
--- a/tools/perf/process_perf_results.py
+++ b/tools/perf/process_perf_results.py
@@ -56,6 +56,7 @@
   'angle_perftests',
   'cc_perftests',
   'gpu_perftests',
+  'media_perftests',
   'xr.vr.common_perftests',
 ]
 
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.cc b/ui/accessibility/platform/test_ax_node_wrapper.cc
index 50c118d..bdf5b47 100644
--- a/ui/accessibility/platform/test_ax_node_wrapper.cc
+++ b/ui/accessibility/platform/test_ax_node_wrapper.cc
@@ -588,6 +588,9 @@
     case ax::mojom::Role::kColorWell:
       return base::ASCIIToUTF16("color picker");
 
+    case ax::mojom::Role::kContentInfo:
+      return base::ASCIIToUTF16("content information");
+
     case ax::mojom::Role::kDate:
       return base::ASCIIToUTF16("date picker");
 
diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc
index d17f4de..364504bc 100644
--- a/ui/aura/test/aura_test_helper.cc
+++ b/ui/aura/test/aura_test_helper.cc
@@ -57,10 +57,8 @@
 }
 
 AuraTestHelper::~AuraTestHelper() {
-  CHECK(setup_called_)
-      << "AuraTestHelper::SetUp() never called.";
-  CHECK(teardown_called_)
-      << "AuraTestHelper::TearDown() never called.";
+  CHECK(setup_called_) << "AuraTestHelper::SetUp() never called.";
+  CHECK(teardown_called_) << "AuraTestHelper::TearDown() never called.";
 }
 
 // static
@@ -107,6 +105,7 @@
   display::Screen* screen = display::Screen::GetScreen();
   gfx::Size host_size(screen ? screen->GetPrimaryDisplay().GetSizeInPixel()
                              : gfx::Size(800, 600));
+
   // This must be reset before creating TestScreen, which sets up the display
   // scale factor for this test iteration.
   display::Display::ResetForceDeviceScaleFactorForTesting();
diff --git a/ui/aura/window_targeter_unittest.cc b/ui/aura/window_targeter_unittest.cc
index d01378a1..9ab8a23 100644
--- a/ui/aura/window_targeter_unittest.cc
+++ b/ui/aura/window_targeter_unittest.cc
@@ -21,8 +21,7 @@
 // Always returns the same window.
 class StaticWindowTargeter : public WindowTargeter {
  public:
-  explicit StaticWindowTargeter(aura::Window* window)
-      : window_(window) {}
+  explicit StaticWindowTargeter(aura::Window* window) : window_(window) {}
   ~StaticWindowTargeter() override {}
 
  private:
@@ -86,7 +85,6 @@
   display::Display display =
       display::Screen::GetScreen()->GetDisplayNearestWindow(root_window());
   EXPECT_EQ(display.bounds(), root_window()->GetBoundsInScreen());
-  EXPECT_EQ(display.bounds(), gfx::Rect(0, 0, 800, 600));
 
   // Mouse and touch presses inside the display yield null targets.
   gfx::Point inside = display.bounds().CenterPoint();
diff --git a/ui/aura/window_tree_host_unittest.cc b/ui/aura/window_tree_host_unittest.cc
index 2016411..b5652f44 100644
--- a/ui/aura/window_tree_host_unittest.cc
+++ b/ui/aura/window_tree_host_unittest.cc
@@ -20,26 +20,50 @@
 
 namespace aura {
 
+namespace {
+
+gfx::Rect ScaleRect(const gfx::Rect& rect_in_pixels, float scale) {
+  gfx::RectF rect_in_dip(rect_in_pixels);
+  gfx::Transform transform;
+  transform.Scale(scale, scale);
+  transform.TransformRectReverse(&rect_in_dip);
+  return gfx::ToEnclosingRect(rect_in_dip);
+}
+
+gfx::Rect TransformRect(const gfx::Rect& rect_in_pixels,
+                        const gfx::Transform& transform,
+                        float device_scale_factor) {
+  gfx::RectF new_bounds =
+      gfx::ScaleRect(gfx::RectF(rect_in_pixels), 1.0f / device_scale_factor);
+  transform.TransformRect(&new_bounds);
+  return gfx::ToEnclosingRect(new_bounds);
+}
+
+}  // namespace
+
 using WindowTreeHostTest = test::AuraTestBase;
 
 TEST_F(WindowTreeHostTest, DPIWindowSize) {
-  gfx::Rect starting_bounds(0, 0, 800, 600);
+  gfx::Rect starting_bounds = host()->GetBoundsInPixels();
   EXPECT_EQ(starting_bounds.size(), host()->compositor()->size());
-  EXPECT_EQ(starting_bounds, host()->GetBoundsInPixels());
   EXPECT_EQ(starting_bounds, root_window()->bounds());
 
-  test_screen()->SetDeviceScaleFactor(1.5f);
+  float device_scale_factor = 1.5;
+  test_screen()->SetDeviceScaleFactor(device_scale_factor);
   EXPECT_EQ(starting_bounds, host()->GetBoundsInPixels());
   // Size should be rounded up after scaling.
-  EXPECT_EQ(gfx::Rect(0, 0, 534, 400), root_window()->bounds());
+  gfx::Rect rect_in_dip = ScaleRect(starting_bounds, device_scale_factor);
+  EXPECT_EQ(rect_in_dip, root_window()->bounds());
 
   gfx::Transform transform;
   transform.Translate(0, 1.1f);
   host()->SetRootTransform(transform);
-  EXPECT_EQ(gfx::Rect(0, 1, 534, 401), root_window()->bounds());
+  gfx::Rect transformed_rect =
+      TransformRect(starting_bounds, transform, device_scale_factor);
+  EXPECT_EQ(transformed_rect, root_window()->bounds());
 
   EXPECT_EQ(starting_bounds, host()->GetBoundsInPixels());
-  EXPECT_EQ(gfx::Rect(0, 1, 534, 401), root_window()->bounds());
+  EXPECT_EQ(transformed_rect, root_window()->bounds());
 }
 
 #if defined(OS_CHROMEOS)
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn
index d94dae6..5169cb7 100644
--- a/ui/base/x/BUILD.gn
+++ b/ui/base/x/BUILD.gn
@@ -27,6 +27,14 @@
     "x11_window.h",
   ]
 
+  if (use_x11) {
+    # Not supported on Ozone for now.
+    sources += [
+      "x11_shm_image_pool.cc",
+      "x11_shm_image_pool.h",
+    ]
+  }
+
   configs += [
     "//build/config/linux:x11",
     "//build/config/linux:xrandr",
diff --git a/ui/base/x/x11_shm_image_pool.cc b/ui/base/x/x11_shm_image_pool.cc
new file mode 100644
index 0000000..debc7f27
--- /dev/null
+++ b/ui/base/x/x11_shm_image_pool.cc
@@ -0,0 +1,291 @@
+// 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 "ui/base/x/x11_shm_image_pool.h"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "build/build_config.h"
+#include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/geometry/rect.h"
+
+namespace ui {
+
+namespace {
+
+constexpr int kMinImageAreaForShmem = 256;
+
+// When resizing a segment, the new segment size is calculated as
+//   new_size = target_size * kShmResizeThreshold
+// so that target_size has room to grow before another resize is necessary.  We
+// also want target_size to have room to shrink, so we avoid resizing until
+//   shrink_size = target_size / kShmResizeThreshold
+// Given these equations, shrink_size is
+//   shrink_size = new_size / kShmResizeThreshold ^ 2
+// new_size is recorded in SoftwareOutputDeviceX11::shm_size_, so we need to
+// divide by kShmResizeThreshold twice to get the shrink threshold.
+constexpr float kShmResizeThreshold = 1.5f;
+constexpr float kShmResizeShrinkThreshold =
+    1.0f / (kShmResizeThreshold * kShmResizeThreshold);
+
+}  // namespace
+
+XShmImagePool::FrameState::FrameState() = default;
+
+XShmImagePool::FrameState::~FrameState() = default;
+
+XShmImagePool::SwapClosure::SwapClosure() = default;
+
+XShmImagePool::SwapClosure::~SwapClosure() = default;
+
+XShmImagePool::XShmImagePool(base::TaskRunner* host_task_runner,
+                             base::TaskRunner* event_task_runner,
+                             XDisplay* display,
+                             XID drawable,
+                             Visual* visual,
+                             int depth,
+                             std::size_t frames_pending)
+    : host_task_runner_(host_task_runner),
+      event_task_runner_(event_task_runner),
+      display_(display),
+      drawable_(drawable),
+      visual_(visual),
+      depth_(depth),
+      frame_states_(frames_pending) {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+}
+
+bool XShmImagePool::Resize(const gfx::Size& pixel_size) {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+
+  if (pixel_size == pixel_size_)
+    return true;
+
+  auto cleanup_fn = [](XShmImagePool* x) { x->Cleanup(); };
+  std::unique_ptr<XShmImagePool, decltype(cleanup_fn)> cleanup{this,
+                                                               cleanup_fn};
+
+  if (!event_task_runner_)
+    return false;
+
+  if (!ui::QueryShmSupport())
+    return false;
+
+  if (pixel_size.width() <= 0 || pixel_size.height() <= 0 ||
+      pixel_size.GetArea() <= kMinImageAreaForShmem) {
+    return false;
+  }
+
+  std::size_t needed_frame_bytes;
+  for (std::size_t i = 0; i < frame_states_.size(); ++i) {
+    FrameState& state = frame_states_[i];
+    state.image.reset(XShmCreateImage(display_, visual_, depth_, ZPixmap,
+                                      nullptr, &shminfo_, pixel_size.width(),
+                                      pixel_size.height()));
+    if (!state.image)
+      return false;
+    std::size_t current_frame_bytes =
+        state.image->bytes_per_line * state.image->height;
+    if (i == 0)
+      needed_frame_bytes = current_frame_bytes;
+    else
+      DCHECK_EQ(current_frame_bytes, needed_frame_bytes);
+  }
+
+  if (needed_frame_bytes > frame_bytes_ ||
+      needed_frame_bytes < frame_bytes_ * kShmResizeShrinkThreshold) {
+    // Resize.
+    Cleanup();
+
+    frame_bytes_ = needed_frame_bytes * kShmResizeThreshold;
+
+    shminfo_.shmid = shmget(IPC_PRIVATE, frame_bytes_ * frame_states_.size(),
+                            IPC_CREAT | SHM_R | SHM_W);
+    if (shminfo_.shmid < 0)
+      return false;
+    shminfo_.shmaddr = reinterpret_cast<char*>(shmat(shminfo_.shmid, 0, 0));
+    if (shminfo_.shmaddr == reinterpret_cast<char*>(-1)) {
+      shmctl(shminfo_.shmid, IPC_RMID, 0);
+      return false;
+    }
+#if defined(OS_LINUX)
+    // On Linux, a shmid can still be attached after IPC_RMID if otherwise kept
+    // alive.  Detach before XShmAttach to prevent a memory leak in case the
+    // process dies.
+    shmctl(shminfo_.shmid, IPC_RMID, 0);
+#endif
+    DCHECK(!shmem_attached_to_server_);
+    if (!XShmAttach(display_, &shminfo_))
+      return false;
+    shmem_attached_to_server_ = true;
+#if !defined(OS_LINUX)
+    // The Linux-specific shmctl behavior above may not be portable, so we're
+    // forced to do IPC_RMID after the server has attached to the segment.
+    // XShmAttach is asynchronous, so we must also sync.
+    XSync(display_, x11::False);
+    shmctl(shminfo_.shmid, IPC_RMID, 0);
+#endif
+    // If this class ever needs to use XShmGetImage(), this needs to be
+    // changed to read-write.
+    shminfo_.readOnly = true;
+  }
+
+  for (std::size_t i = 0; i < frame_states_.size(); ++i) {
+    FrameState& state = frame_states_[i];
+    const std::size_t offset = i * needed_frame_bytes;
+#ifndef NDEBUG
+    state.offset = offset;
+#endif
+    state.image->data = shminfo_.shmaddr + offset;
+    SkImageInfo image_info = SkImageInfo::Make(
+        state.image->width, state.image->height,
+        state.image->byte_order == LSBFirst ? kBGRA_8888_SkColorType
+                                            : kRGBA_8888_SkColorType,
+        kPremul_SkAlphaType);
+    state.bitmap = SkBitmap();
+    if (!state.bitmap.installPixels(image_info, state.image->data,
+                                    state.image->bytes_per_line)) {
+      return false;
+    }
+  }
+
+  pixel_size_ = pixel_size;
+  cleanup.release();
+  return true;
+}
+
+bool XShmImagePool::Ready() {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+
+  return shmem_attached_to_server_;
+}
+
+SkBitmap& XShmImagePool::CurrentBitmap() {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+
+  return frame_states_[current_frame_index_].bitmap;
+}
+
+XImage* XShmImagePool::CurrentImage() {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+
+  return frame_states_[current_frame_index_].image.get();
+}
+
+void XShmImagePool::SwapBuffers(
+    base::OnceCallback<void(const gfx::Size&)> callback) {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+
+  swap_closures_.emplace();
+  SwapClosure& swap_closure = swap_closures_.back();
+  swap_closure.closure = base::BindOnce(std::move(callback), pixel_size_);
+#ifndef NDEBUG
+  swap_closure.shmseg = shminfo_.shmseg;
+  swap_closure.offset = frame_states_[current_frame_index_].offset;
+#endif
+
+  current_frame_index_ = (current_frame_index_ + 1) % frame_states_.size();
+}
+
+void XShmImagePool::Initialize() {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+  if (event_task_runner_)
+    event_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&XShmImagePool::InitializeOnGpu, this));
+}
+
+void XShmImagePool::Teardown() {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+  if (event_task_runner_)
+    event_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(&XShmImagePool::TeardownOnGpu, this));
+}
+
+XShmImagePool::~XShmImagePool() {
+  Cleanup();
+#ifndef NDEBUG
+  DCHECK(!dispatcher_registered_);
+#endif
+}
+
+void XShmImagePool::InitializeOnGpu() {
+  DCHECK(event_task_runner_->RunsTasksInCurrentSequence());
+
+  ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
+#ifndef NDEBUG
+  dispatcher_registered_ = true;
+#endif
+}
+
+void XShmImagePool::TeardownOnGpu() {
+  DCHECK(event_task_runner_->RunsTasksInCurrentSequence());
+
+  ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
+#ifndef NDEBUG
+  dispatcher_registered_ = false;
+#endif
+}
+
+void XShmImagePool::Cleanup() {
+  if (shminfo_.shmaddr)
+    shmdt(shminfo_.shmaddr);
+  if (shmem_attached_to_server_) {
+    XShmDetach(display_, &shminfo_);
+    shmem_attached_to_server_ = false;
+  }
+  shminfo_ = {};
+  frame_bytes_ = 0;
+  pixel_size_ = gfx::Size();
+  current_frame_index_ = 0;
+}
+
+void XShmImagePool::DispatchShmCompletionEvent(XShmCompletionEvent event) {
+  DCHECK(host_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(!swap_closures_.empty());
+
+  SwapClosure& swap_ack = swap_closures_.front();
+#ifndef NDEBUG
+  DCHECK_EQ(event.shmseg, swap_ack.shmseg);
+  DCHECK_EQ(event.offset, swap_ack.offset);
+#endif
+
+  std::move(swap_ack.closure).Run();
+  swap_closures_.pop();
+}
+
+bool XShmImagePool::CanDispatchEvent(const ui::PlatformEvent& event) {
+  DCHECK(event_task_runner_->RunsTasksInCurrentSequence());
+
+  XEvent* xevent = event;
+  if (xevent->type != ui::ShmEventBase() + ShmCompletion)
+    return false;
+
+  XShmCompletionEvent* shm_event =
+      reinterpret_cast<XShmCompletionEvent*>(xevent);
+  return shm_event->drawable == drawable_;
+}
+
+uint32_t XShmImagePool::DispatchEvent(const ui::PlatformEvent& event) {
+  DCHECK(event_task_runner_->RunsTasksInCurrentSequence());
+
+  XShmCompletionEvent* shm_event =
+      reinterpret_cast<XShmCompletionEvent*>(event);
+
+  host_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&XShmImagePool::DispatchShmCompletionEvent,
+                                this, *shm_event));
+
+  return ui::POST_DISPATCH_STOP_PROPAGATION;
+}
+
+}  // namespace ui
diff --git a/ui/base/x/x11_shm_image_pool.h b/ui/base/x/x11_shm_image_pool.h
new file mode 100644
index 0000000..d2843fd
--- /dev/null
+++ b/ui/base/x/x11_shm_image_pool.h
@@ -0,0 +1,122 @@
+// 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 UI_BASE_X_X11_SHM_IMAGE_POOL_H_
+#define UI_BASE_X_X11_SHM_IMAGE_POOL_H_
+
+#include <cstring>
+#include <queue>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/component_export.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/task_runner.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "ui/base/x/x11_util.h"
+#include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/x/x11.h"
+
+namespace ui {
+
+class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool
+    : public PlatformEventDispatcher,
+      public base::RefCountedThreadSafe<XShmImagePool> {
+ public:
+  XShmImagePool(base::TaskRunner* host_task_runner,
+                base::TaskRunner* event_task_runner,
+                XDisplay* display,
+                XID drawable,
+                Visual* visual,
+                int depth,
+                std::size_t max_frames_pending);
+
+  bool Resize(const gfx::Size& pixel_size);
+
+  // Is XSHM supported by the server and are the shared buffers ready for use?
+  bool Ready();
+
+  // Obtain state for the current frame.
+  SkBitmap& CurrentBitmap();
+  XImage* CurrentImage();
+
+  // Switch to the next cached frame.  CurrentBitmap() and CurrentImage() will
+  // change to reflect the new frame.
+  void SwapBuffers(base::OnceCallback<void(const gfx::Size&)> callback);
+
+  // Part of setup and teardown must be done on the event task runner.  Posting
+  // the tasks cannot be done in the constructor/destructor because because this
+  // would cause subtle problems with the reference count for this object.  So
+  // Initialize() must be called after constructing and Teardown() must be
+  // called before destructing.
+  void Initialize();
+  void Teardown();
+
+ private:
+  friend class base::RefCountedThreadSafe<XShmImagePool>;
+
+  struct FrameState {
+    FrameState();
+    ~FrameState();
+
+    XScopedImage image;
+    SkBitmap bitmap;
+#ifndef NDEBUG
+    std::size_t offset = 0;
+#endif
+  };
+
+  struct SwapClosure {
+    SwapClosure();
+    ~SwapClosure();
+
+    base::OnceClosure closure;
+#ifndef NDEBUG
+    ShmSeg shmseg;
+    std::size_t offset;
+#endif
+  };
+
+  ~XShmImagePool() override;
+
+  void InitializeOnGpu();
+  void TeardownOnGpu();
+
+  void Cleanup();
+
+  void DispatchShmCompletionEvent(XShmCompletionEvent event);
+
+  // PlatformEventDispatcher:
+  bool CanDispatchEvent(const PlatformEvent& event) override;
+  uint32_t DispatchEvent(const PlatformEvent& event) override;
+
+  base::TaskRunner* const host_task_runner_;
+  base::TaskRunner* const event_task_runner_;
+
+  XDisplay* const display_;
+  const XID drawable_;
+  Visual* const visual_;
+  const int depth_;
+
+  gfx::Size pixel_size_;
+  std::size_t frame_bytes_ = 0;
+  XShmSegmentInfo shminfo_{};
+  bool shmem_attached_to_server_ = false;
+  std::vector<FrameState> frame_states_;
+  std::size_t current_frame_index_ = 0;
+  std::queue<SwapClosure> swap_closures_;
+
+#ifndef NDEBUG
+  bool dispatcher_registered_ = false;
+#endif
+
+  DISALLOW_COPY_AND_ASSIGN(XShmImagePool);
+};
+
+}  // namespace ui
+
+#endif  // UI_BASE_X_X11_SHM_IMAGE_POOL_H_
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 4f71574..a2cdb14 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -15,7 +15,6 @@
 #include <bitset>
 #include <list>
 #include <map>
-#include <memory>
 #include <utility>
 #include <vector>
 
@@ -287,10 +286,23 @@
   // We don't care about the version of Xrender since all the features which
   // we use are included in every version.
   static bool render_supported = XRenderQueryExtension(dpy, &dummy, &dummy);
-
   return render_supported;
 }
 
+bool QueryShmSupport() {
+  int major;
+  int minor;
+  x11::Bool pixmaps;
+  static bool supported =
+      XShmQueryVersion(gfx::GetXDisplay(), &major, &minor, &pixmaps);
+  return supported;
+}
+
+int ShmEventBase() {
+  static int event_base = XShmGetEventBase(gfx::GetXDisplay());
+  return event_base;
+}
+
 ::Cursor CreateReffedCustomXCursor(XcursorImage* image) {
   return XCustomCursorCache::GetInstance()->InstallCustomCursor(image);
 }
@@ -1310,6 +1322,10 @@
   cursor_ = cursor;
 }
 
+void XImageDeleter::operator()(XImage* image) const {
+  XDestroyImage(image);
+}
+
 namespace test {
 
 const XcursorImage* GetCachedXcursorImage(::Cursor cursor) {
diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h
index 0bdd237f..628a46d9 100644
--- a/ui/base/x/x11_util.h
+++ b/ui/base/x/x11_util.h
@@ -13,6 +13,7 @@
 
 #include <stddef.h>
 
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -26,7 +27,6 @@
 #include "ui/gfx/icc_profile.h"
 #include "ui/gfx/x/x11_types.h"
 
-typedef unsigned long XSharedMemoryId;  // ShmSeg in the X headers.
 typedef unsigned long Cursor;
 
 namespace gfx {
@@ -49,6 +49,12 @@
 // Return true iff the display supports Xrender
 COMPONENT_EXPORT(UI_BASE_X) bool QueryRenderSupport(XDisplay* dpy);
 
+// Return true iff the display supports MIT-SHM.
+COMPONENT_EXPORT(UI_BASE_X) bool QueryShmSupport();
+
+// Returns the first event ID for the MIT-SHM extension, if available.
+COMPONENT_EXPORT(UI_BASE_X) int ShmEventBase();
+
 // Creates a custom X cursor from the image. This takes ownership of image. The
 // caller must not free/modify the image. The refcount of the newly created
 // cursor is set to 1.
@@ -357,6 +363,11 @@
   DISALLOW_COPY_AND_ASSIGN(XScopedCursor);
 };
 
+struct COMPONENT_EXPORT(UI_BASE_X) XImageDeleter {
+  void operator()(XImage* image) const;
+};
+using XScopedImage = std::unique_ptr<XImage, XImageDeleter>;
+
 namespace test {
 
 // Returns the cached XcursorImage for |cursor|.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
index ad59aadc..2a43fe9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">ይህን ፋይል ለመድረስ መስመር ላይ መሆን አለብዎት።</translation>
 <translation id="4212740939091998969">«<ph name="FOLDER_NAME" />» የሚባል አቃፊ አስቀድሞ አለ። እባክዎ የተለየ ስም ይምረጡ።</translation>
 <translation id="4215448920900139318">የ<ph name="FILE_COUNT" />ን ምትኬ በማስቀመጥ ላይ</translation>
-<translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
 <translation id="426015154560005552">የአረብኛ ቁልፍ ሰሌዳ</translation>
 <translation id="4261901459838235729">Google ማቅረቢያ</translation>
 <translation id="4290535918735525311">1 አቃፊ ከLinux ጋር ተጋርቷል</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">ኮሪያኛ</translation>
 <translation id="5819442873484330149">ሃንጉል 3 ስብስብ (የመጨረሻ)</translation>
 <translation id="5833610766403489739">ይህ ፋይል ወደሆነ ቦታ ሄዷል። እባክዎ የውርድ አካባቢዎን ያረጋግጡና እንደገና ይሞክሩ።</translation>
-<translation id="5838051104334203064">የ Play መደብር መተግበሪያዎች ይህን መሣሪያ ሊደርሱበት አይችሉም</translation>
 <translation id="5838451609423551646">ሁሉም ግቤቶች ከምርጫ ተወግደዋል።</translation>
 <translation id="5838825566232597749">አሜሪካ ዎርክማን አለምአቀፍ</translation>
 <translation id="5850516540536751549">ይህ የፋይል ዓይነት አይደገፍም። እባክዎ የዚህ አይነት ፋይል መክፈት የሚችል መተግበሪያ ለማግኘት <ph name="BEGIN_LINK" />Chrome የድር መደብር<ph name="END_LINK" />ን ይጎብኙ። <ph name="BEGIN_LINK_HELP" />ተጨማሪ ለመረዳት<ph name="END_LINK_HELP" /></translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index bb4b4530..1d316fbc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">يجب أن تكون متصلاً بالإنترنت للدخول إلى هذا الملف.</translation>
 <translation id="4212740939091998969">المجلَّد الذي يحمل الاسم "<ph name="FOLDER_NAME" />" موجود مسبقًا. يُرجى اختيار اسم آخر.</translation>
 <translation id="4215448920900139318">جارٍ الاحتفاظ بنسخة احتياطية من <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">فتح الإعدادات</translation>
 <translation id="426015154560005552">لوحة مفاتيح اللغة العربية</translation>
 <translation id="4261901459838235729">‏عرض تقديمي من Google</translation>
 <translation id="4290535918735525311">‏تمت مشاركة مجلد واحد مع نظام التشغيل Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">الكورية</translation>
 <translation id="5819442873484330149">المجموعة رقم 3 الهانغولية (النهائية)</translation>
 <translation id="5833610766403489739">يبدو أن هذا الملف قد اختفى في مكان. يُرجى التحقق من إعداد موقع التنزيل وإعادة المحاولة.</translation>
-<translation id="5838051104334203064">‏لا يمكن لتطبيقات "متجر Play" الوصول إلى هذا الجهاز</translation>
 <translation id="5838451609423551646">تمت إزالة جميع الإدخالات من الاختيار.</translation>
 <translation id="5838825566232597749">‏Workman الأمريكية الدولية</translation>
 <translation id="5850516540536751549">‏نوع الملف هذا غير متوافق. يُرجى الانتقال إلى <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" /> للعثور على تطبيق يمكنه فتح هذا النوع من الملفات.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
index 2bd42e07..995179f4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Трябва да сте онлайн, за да осъществите достъп до този файл.</translation>
 <translation id="4212740939091998969">Папката „<ph name="FOLDER_NAME" />“ вече съществува. Моля, изберете друго име.</translation>
 <translation id="4215448920900139318">Създаваме резервно копие на <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Отваряне на настройките</translation>
 <translation id="426015154560005552">Арабска клавиатура</translation>
 <translation id="4261901459838235729">Презентация в Google</translation>
 <translation id="4290535918735525311">1 папка е споделена с Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">корейски</translation>
 <translation id="5819442873484330149">Хангъл, 3 набора (окончателна)</translation>
 <translation id="5833610766403489739">Този файл се е скрил някъде. Моля, проверете настройката си за местоположението на изтеглянията и опитайте отново.</translation>
-<translation id="5838051104334203064">Приложенията от Google Play Магазин нямат достъп до това устройство</translation>
 <translation id="5838451609423551646">Премахнахте избора на всички елементи.</translation>
 <translation id="5838825566232597749">Американска (Уъркман) международна клавиатура</translation>
 <translation id="5850516540536751549">Този файлов тип не се поддържа. Моля, посетете <ph name="BEGIN_LINK" />уеб магазина на Chrome<ph name="END_LINK" />, за да намерите приложение, което може да го отвори.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
index 7cd444f..2da44c4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">আপনার এই ফাইলটিতে অ্যাক্সেস পেতে অনলাইন হওয়া আবশ্যক৷</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" নামের ফোল্ডার আগে থেকেই আছে। অন্য একটি নাম লিখুন।</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />টির ব্যাক আপ নেওয়া হচ্ছে</translation>
-<translation id="4242533952199664413">সেটিংস খুলুন</translation>
 <translation id="426015154560005552">আরবি কীবোর্ড</translation>
 <translation id="4261901459838235729">Google উপস্থাপনা</translation>
 <translation id="4290535918735525311">Linux ব্যবহার করে ১টি ফোল্ডার শেয়ার করা হয়েছে</translation>
@@ -422,7 +421,6 @@
 <translation id="5818003990515275822">কোরীয়</translation>
 <translation id="5819442873484330149">হাঙ্গুল ৩ সেট (সর্বশেষ)</translation>
 <translation id="5833610766403489739">এই ফাইলটির আসার পথ কোথাও বন্ধ করা আছে৷ অনুগ্রহ করে আপনার ডাউনলোড অবস্থানের সেটিংস পরীক্ষা করে আবার চেষ্টা করুন৷</translation>
-<translation id="5838051104334203064">Play স্টোর অ্যাপ্লিকেশন এই ডিভাইস অ্যাক্সেস করতে পারছে না</translation>
 <translation id="5838451609423551646">সব বেছে নেওয়া এন্ট্রি সরিয়ে দেওয়া হয়েছে।</translation>
 <translation id="5838825566232597749">মার্কিন ওয়ার্কম্যান আন্তর্জাতিক</translation>
 <translation id="5850516540536751549">এই ফাইল প্রকারটি সমর্থিত নয়৷ এই ধরণের ফাইল খুলতে পারে এমন অ্যাপ খুঁজতে অনুগ্রহ করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" /> দেখুন৷
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
index eaf0f6d..7a79375 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Heu d'estar en línia per accedir a aquest fitxer.</translation>
 <translation id="4212740939091998969">Ja hi ha una carpeta anomenada "<ph name="FOLDER_NAME" />". Tria un altre nom.</translation>
 <translation id="4215448920900139318">S'estan afegint <ph name="FILE_COUNT" /> a la còpia de seguretat</translation>
-<translation id="4242533952199664413">Obre la configuració</translation>
 <translation id="426015154560005552">Teclat àrab</translation>
 <translation id="4261901459838235729">Presentació de Google</translation>
 <translation id="4290535918735525311">S'ha compartit 1 carpeta amb Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreà</translation>
 <translation id="5819442873484330149">Configuració 3 de hangul (final)</translation>
 <translation id="5833610766403489739">Aquest fitxer s'ha extraviat en algun lloc. Comproveu el paràmetre d'ubicació de les baixades i torneu-ho a provar.</translation>
-<translation id="5838051104334203064">Les aplicacions de Play Store no poden accedir a aquest dispositiu</translation>
 <translation id="5838451609423551646">S'han suprimit totes les entrades de la selecció.</translation>
 <translation id="5838825566232597749">Workman nord-americà internacional</translation>
 <translation id="5850516540536751549">Aquest tipus de fitxer no és compatible. Visiteu <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> per trobar una aplicació que pugui obrir aquest tipus de fitxer.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
index c4071bdf..de7081b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Pro přístup k souboru musíte být online.</translation>
 <translation id="4212740939091998969">Složka s názvem „<ph name="FOLDER_NAME" />“ již existuje. Zvolte jiný název.</translation>
 <translation id="4215448920900139318">Zálohování souborů: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Otevřít Nastavení</translation>
 <translation id="426015154560005552">Arabská klávesnice</translation>
 <translation id="4261901459838235729">Prezentace Google</translation>
 <translation id="4290535918735525311">1 složka je sdílena se systémem Linux</translation>
@@ -422,7 +421,6 @@
 <translation id="5818003990515275822">korejština</translation>
 <translation id="5819442873484330149">Hangul – 3 sady (finální)</translation>
 <translation id="5833610766403489739">Soubor ve spravovaných umístěních nebyl nalezen. Zkontrolujte prosím nastavení umístění stažených souborů a zkuste to znovu.</translation>
-<translation id="5838051104334203064">Aplikace z Obchodu Play k tomuto zařízení nemají přístup</translation>
 <translation id="5838451609423551646">Z výběru byly odstraněny všechny položky.</translation>
 <translation id="5838825566232597749">Americká mezinárodní klávesnice s rozložením Workman</translation>
 <translation id="5850516540536751549">Tento typ souboru není podporován. Aplikaci, pomocí které lze tento typ souboru otevřít, naleznete v <ph name="BEGIN_LINK" />Internetovém obchodu Chrome<ph name="END_LINK" />.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index 2c1e69e5..67c6e557c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Du skal være online for at få adgang til denne fil.</translation>
 <translation id="4212740939091998969">Der findes allerede en mappe med navnet "<ph name="FOLDER_NAME" />". Vælg et andet navn.</translation>
 <translation id="4215448920900139318">Sikkerhedskopierer <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Åbn Indstillinger</translation>
 <translation id="426015154560005552">Arabisk tastatur</translation>
 <translation id="4261901459838235729">Google-præsentation</translation>
 <translation id="4290535918735525311">1 mappe er delt med Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Koreansk</translation>
 <translation id="5819442873484330149">Hangul 3-sæt (endelig)</translation>
 <translation id="5833610766403489739">Denne fil er blevet væk. Kontrollér indstillingerne for din downloadplacering, og prøv igen.</translation>
-<translation id="5838051104334203064">Apps fra Play Butik kan ikke få adgang til denne enhed</translation>
 <translation id="5838451609423551646">Markeringen af alle elementer blev fjernet.</translation>
 <translation id="5838825566232597749">Internationalt amerikansk Workman</translation>
 <translation id="5850516540536751549">Denne filtype understøttes ikke. Gå til <ph name="BEGIN_LINK" />Chrome Webshop<ph name="END_LINK" /> for at finde en app, der kan åbne denne filtype.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
index 7b0490f9..e8f97c4c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Sie müssen online sein, um auf diese Datei zugreifen zu können.</translation>
 <translation id="4212740939091998969">Es existiert bereits ein Ordner mit dem Namen "<ph name="FOLDER_NAME" />". Wählen Sie bitte einen anderen Namen aus.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> werden gesichert</translation>
-<translation id="4242533952199664413">Einstellungen öffnen</translation>
 <translation id="426015154560005552">Arabische Tastatur</translation>
 <translation id="4261901459838235729">Google-Präsentation</translation>
 <translation id="4290535918735525311">1 Ordner für Linux freigegeben</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Koreanisch</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Final)</translation>
 <translation id="5833610766403489739">Diese Datei kann nicht gefunden werden. Bitte überprüfen Sie Ihre Einstellung für den Downloadspeicherort und versuchen Sie es erneut.</translation>
-<translation id="5838051104334203064">Play Store-Apps können nicht auf dieses Gerät zugreifen</translation>
 <translation id="5838451609423551646">Auswahl aller Einträge wurde aufgehoben.</translation>
 <translation id="5838825566232597749">Internationale US-amerikanische Workman-Tastatur</translation>
 <translation id="5850516540536751549">Dieser Dateityp wird nicht unterstützt. Im <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> können Sie nach einer App suchen, mit der sich dieser Dateityp öffnen lässt.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
index 573c1d2..8a80bf5 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -275,7 +275,6 @@
 <translation id="421017592316736757">Πρέπει να είστε συνδεδεμένοι στο διαδίκτυο για να αποκτήσετε πρόσβαση σε αυτό το αρχείο.</translation>
 <translation id="4212740939091998969">Ο φάκελος με την ονομασία "<ph name="FOLDER_NAME" />" υπάρχει ήδη. Επιλέξτε διαφορετικό όνομα.</translation>
 <translation id="4215448920900139318">Δημιουργία αντιγράφου ασφαλείας για το <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation>
 <translation id="426015154560005552">Πληκτρολόγιο Αραβικών</translation>
 <translation id="4261901459838235729">Παρουσίαση Google</translation>
 <translation id="4290535918735525311">1 φάκελος που κοινοποιήθηκε με Linux</translation>
@@ -436,7 +435,6 @@
 <translation id="5818003990515275822">Κορεατικά</translation>
 <translation id="5819442873484330149">Σύνολο Χανγκίλ 3 (Τελικό)</translation>
 <translation id="5833610766403489739">Αυτό το αρχείο χάθηκε κάπου. Ελέγξτε τη ρύθμιση της τοποθεσίας λήψης σας και δοκιμάστε ξανά.</translation>
-<translation id="5838051104334203064">Οι εφαρμογές Play Store δεν μπορούν να αποκτήσουν πρόσβαση σε αυτήν τη συσκευή</translation>
 <translation id="5838451609423551646">Καταργήθηκαν όλες οι καταχωρίσεις από την επιλογή.</translation>
 <translation id="5838825566232597749">Διεθνές ΗΠΑ Workman</translation>
 <translation id="5850516540536751549">Αυτός ο τύπος αρχείου δεν υποστηρίζεται. Επισκεφτείτε το <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> για να εντοπίσετε μια εφαρμογή που μπορεί να ανοίξει αυτόν τον τύπο αρχείου.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
index b86a831..471aa6ac 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">You must be online to access this file.</translation>
 <translation id="4212740939091998969">The folder named '<ph name="FOLDER_NAME" />' already exists. Please choose a different name.</translation>
 <translation id="4215448920900139318">Backing up <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Open settings</translation>
 <translation id="426015154560005552">Arabic keyboard</translation>
 <translation id="4261901459838235729">Google Presentation</translation>
 <translation id="4290535918735525311">1 folder shared with Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korean</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Final)</translation>
 <translation id="5833610766403489739">This file has wandered off somewhere. Please check your download location setting and try again.</translation>
-<translation id="5838051104334203064">Play Store applications can't access this device</translation>
 <translation id="5838451609423551646">Removed all entries from selection.</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5850516540536751549">This file type is not supported. Please visit the <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> to find an app that can open this type of file.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
index b628d28..c8980aad 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Tienes que estar conectado para acceder a este archivo.</translation>
 <translation id="4212740939091998969">Ya existe una carpeta con el nombre "<ph name="FOLDER_NAME" />". Elige otro.</translation>
 <translation id="4215448920900139318">Guardando una copia de seguridad de <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Abrir la configuración</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Presentación de Google</translation>
 <translation id="4290535918735525311">Se compartió 1 carpeta con Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreano</translation>
 <translation id="5819442873484330149">Hangul de triple alternancia (final)</translation>
 <translation id="5833610766403489739">Este archivo se extravió. Comprueba las opciones de la ubicación de descargas y vuelve a intentarlo.</translation>
-<translation id="5838051104334203064">Las apps de Play Store no pueden acceder a este dispositivo</translation>
 <translation id="5838451609423551646">Se quitó la selección de todas las entradas.</translation>
 <translation id="5838825566232597749">Internacional Workman (EE. UU.)</translation>
 <translation id="5850516540536751549">No se admite este tipo de archivo. Visita <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> para buscar una aplicación que pueda abrir este tipo de archivo.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
index 4165fc1f..fce3394 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Tienes que conectarte a Internet para acceder a este archivo.</translation>
 <translation id="4212740939091998969">Ya existe la carpeta "<ph name="FOLDER_NAME" />". Elige otro nombre.</translation>
 <translation id="4215448920900139318">Creando copia de seguridad de <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Abrir Configuración</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Presentación de Google</translation>
 <translation id="4290535918735525311">1 carpeta compartida con Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreano</translation>
 <translation id="5819442873484330149">Hangul de triple alternancia (final)</translation>
 <translation id="5833610766403489739">Este archivo se ha perdido. Comprueba la opción de ubicación de descargas e inténtalo de nuevo.</translation>
-<translation id="5838051104334203064">Las aplicaciones de Play Store no pueden acceder a este dispositivo</translation>
 <translation id="5838451609423551646">Se ha cancelado la selección de todos los elementos.</translation>
 <translation id="5838825566232597749">Internacional estilo Workman (EE. UU.)</translation>
 <translation id="5850516540536751549">No se admite este tipo de archivo. Accede a <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> para buscar una aplicación que pueda abrir este tipo de archivo.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
index 9c6e599..ca5373a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Faili juurde pääsemiseks on vaja võrguühendust.</translation>
 <translation id="4212740939091998969">Kaust nimega „<ph name="FOLDER_NAME" />” on juba olemas. Valige muu nimi.</translation>
 <translation id="4215448920900139318">Varundamine: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Ava seaded</translation>
 <translation id="426015154560005552">Araabia klaviatuur</translation>
 <translation id="4261901459838235729">Google'i esitlus</translation>
 <translation id="4290535918735525311">1 kausta jagatakse Linuxiga</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">korea keel</translation>
 <translation id="5819442873484330149">Hanguli 3. seade (lõplik)</translation>
 <translation id="5833610766403489739">See fail on kuhugi kadunud. Kontrollige allalaadimise asukoha seadet ja proovige uuesti.</translation>
-<translation id="5838051104334203064">Play poe rakendused ei pääse sellele seadmele juurde</translation>
 <translation id="5838451609423551646">Valikust eemaldati kõik kirjed.</translation>
 <translation id="5838825566232597749">USA Workmani rahvusvaheline klaviatuur</translation>
 <translation id="5850516540536751549">Seda failitüüpi ei toetata. Külastage <ph name="BEGIN_LINK" />Chrome'i veebipoodi<ph name="END_LINK" />, et leida rakendus, mis avab seda tüüpi faili.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
index 44a6e31..682c32b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">باید آنلاین باشید تا به این فایل دسترسی داشته باشید.</translation>
 <translation id="4212740939091998969">پوشه‌ای با نام «<ph name="FOLDER_NAME" />» ازقبل وجود دارد. لطفاً نام دیگری انتخاب کنید.</translation>
 <translation id="4215448920900139318">درحال پشتیبان‌ گرفتن از <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">باز کردن تنظیمات</translation>
 <translation id="426015154560005552">صفحه‌کلید عربی</translation>
 <translation id="4261901459838235729">‏ارائه Google </translation>
 <translation id="4290535918735525311">‏۱ پوشه با Linux هم‌رسانی شد</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">کره‌ای</translation>
 <translation id="5819442873484330149">مجموعه هانگول ۳ (نهایی)</translation>
 <translation id="5833610766403489739">این فایل در جایی سرگردان شده است. لطفاً تنظیم محل دانلودتان را بررسی کنید و دوباره امتحان کنید.</translation>
-<translation id="5838051104334203064">‏برنامه‌های «فروشگاه Play» نمی‌توانند به این دستگاه دسترسی داشته باشند</translation>
 <translation id="5838451609423551646">همه ورودی‌ها از موارد انتخابی برداشته شد.</translation>
 <translation id="5838825566232597749">‏بین‌المللی US Workman</translation>
 <translation id="5850516540536751549">‏این نوع فایل پشتیبانی نمی‌شود. لطفاً از <ph name="BEGIN_LINK" />فروشگاه وب<ph name="END_LINK" /> Chrome بازدید کنید تا برنامه‌ای پیدا کنید که بتواند این نوع فایل را باز کند.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
index 9d452f0..b20a8a9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Sinun täytyy olla online-tilassa käyttääksesi tätä tiedostoa.</translation>
 <translation id="4212740939091998969">Kansio nimeltä <ph name="FOLDER_NAME" /> on jo olemassa. Valitse toinen nimi.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> varmuuskopioidaan</translation>
-<translation id="4242533952199664413">Avaa asetukset</translation>
 <translation id="426015154560005552">Arabialainen näppäimistö</translation>
 <translation id="4261901459838235729">Google-esitys</translation>
 <translation id="4290535918735525311">1 kansio jaettu Linuxin kanssa</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">korea</translation>
 <translation id="5819442873484330149">Hangul 3-set (lopullinen)</translation>
 <translation id="5833610766403489739">Tämä tiedosto on siirretty jonnekin muualle. Tarkista lataussijainnin asetukset ja yritä uudelleen.</translation>
-<translation id="5838051104334203064">Play Kaupan sovellukset eivät pääse laitteelle</translation>
 <translation id="5838451609423551646">Kaikki kohteet poistettiin valinnasta.</translation>
 <translation id="5838825566232597749">Yhdysvallat, kansainvälinen Workman</translation>
 <translation id="5850516540536751549">Tätä tiedostotyyppiä ei tueta. Etsi tämäntyyppisiä tiedostoja avaava sovellus <ph name="BEGIN_LINK" />Chrome Web Storesta<ph name="END_LINK" />.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
index 50a3a08..db59d42 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Kailangan kang mag-online upang ma-access ang file na ito.</translation>
 <translation id="4212740939091998969">Mayroon nang folder na may pangalang "<ph name="FOLDER_NAME" />." Pumili ng ibang pangalan.</translation>
 <translation id="4215448920900139318">Bina-back up ang <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Buksan ang mga setting</translation>
 <translation id="426015154560005552">Arabic keyboard</translation>
 <translation id="4261901459838235729">Presentation ng Google</translation>
 <translation id="4290535918735525311">1 folder ang naibahagi sa Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korean</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Panghuli)</translation>
 <translation id="5833610766403489739">Nawala ang file na ito. Pakitingnan ang iyong setting ng lokasyon ng pag-download at subukan ulit.</translation>
-<translation id="5838051104334203064">Hindi ma-access ng mga application sa Play Store ang device na ito</translation>
 <translation id="5838451609423551646">Inalis ang lahat ng entry sa pagpipilian.</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5850516540536751549">Hindi sinusuportahan ang uri ng file na ito. Pakibisita ang <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> upang maghanap ng app na makakapagbukas sa ganitong uri ng file.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
index eb31f7d..4520baf 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Pour accéder à ce fichier, vous devez être connecté à Internet.</translation>
 <translation id="4212740939091998969">Le nom "<ph name="FOLDER_NAME" />" est déjà attribué à un dossier. Veuillez en choisir un autre.</translation>
 <translation id="4215448920900139318">Sauvegarde de <ph name="FILE_COUNT" />…</translation>
-<translation id="4242533952199664413">Ouvrir les paramètres</translation>
 <translation id="426015154560005552">Clavier arabe</translation>
 <translation id="4261901459838235729">Présentation Google</translation>
 <translation id="4290535918735525311">1 dossier partagé avec Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coréen</translation>
 <translation id="5819442873484330149">Hangûl sebeol-sik (final)</translation>
 <translation id="5833610766403489739">Ce fichier s'est égaré. Veuillez vérifier le paramètre correspondant à votre emplacement de téléchargement, puis réessayer.</translation>
-<translation id="5838051104334203064">Les applications du Play Store n'ont pas accès à cet appareil</translation>
 <translation id="5838451609423551646">Tous les éléments sélectionnés ont été supprimés.</translation>
 <translation id="5838825566232597749">Clavier Workman international américain</translation>
 <translation id="5850516540536751549">Ce type de fichier n'est pas compatible. Veuillez accéder au <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> pour trouver une application qui permet de l'ouvrir.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
index 23a5a75..b971d43 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">આ ફાઇલ એક્સેસ કરવા તમારું ઑનલાઇન હોું જરૂરી છે.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" નામનું ફોલ્ડર પહેલાંથી અસ્તિત્વમાં છે. કૃપા કરીને કોઈ અલગ નામ પસંદ કરો.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />નો બૅકઅપ લઈ રહ્યાં છીએ</translation>
-<translation id="4242533952199664413">સેટિંગ્સ ખોલો</translation>
 <translation id="426015154560005552">અરેબિક કીબોર્ડ</translation>
 <translation id="4261901459838235729">Google પ્રસ્તુતિ</translation>
 <translation id="4290535918735525311">Linux વડે શેર કરેલું 1 ફોલ્ડર</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">કોરિયન</translation>
 <translation id="5819442873484330149">હંગુલ 3 સેટ (ફાઇનલ)</translation>
 <translation id="5833610766403489739">આ ફાઇલ આમતેમ ક્યાંક પડેલી છે. કૃપા કરીને તમારી ડાઉનલોડ સ્થાન સેટિંગ તપાસો અને ફરી પ્રયાસ કરો.</translation>
-<translation id="5838051104334203064">Play સ્ટોરની ઍપ્લિકેશનો આ ડિવાઇસને ઍક્સેસ કરી શકતી નથી</translation>
 <translation id="5838451609423551646">પસંદગીમાંથી બધી એન્ટ્રી કાઢી નાખી.</translation>
 <translation id="5838825566232597749">US Workman આંતરરાષ્ટ્રિય</translation>
 <translation id="5850516540536751549">આ ફાઇલ પ્રકાર સમર્થિત નથી. આ પ્રકારની ફાઇલ ખોલી શકે તે એપ્લિકેશનને શોધવા માટે કૃપા કરીને <ph name="BEGIN_LINK" />Chrome વેબ દુકાન<ph name="END_LINK" />ની મુલાકાત લો.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index 2a1dff5..e1f5cc5 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">इस फ़ाइल को एक्सेस करने के लिए आपका ऑनलाइन होना ज़रूरी है.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" नाम का फ़ोल्डर पहले से मौजूद है. कृपया कोई अलग नाम चुनें.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> का बैक अप लिया जा रहा है</translation>
-<translation id="4242533952199664413">सेटिंग खोलें</translation>
 <translation id="426015154560005552">अरबी कीबोर्ड</translation>
 <translation id="4261901459838235729">Google प्रस्‍तुतिकरण</translation>
 <translation id="4290535918735525311">Linux के साथ एक फ़ोल्डर शेयर किया गया</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">कोरियाई</translation>
 <translation id="5819442873484330149">हंगुल 3 सेट (अंतिम)</translation>
 <translation id="5833610766403489739">यह फ़ाइल कहीं इधर-उधर हो गई है. कृपया अपनी डाउनलोड स्थान सेटिंग जाँचें और फिर से कोशिश करें.</translation>
-<translation id="5838051104334203064">Play स्टोर ऐप्लिकेशन इस डिवाइस को ऐक्सेस नहीं कर सकता</translation>
 <translation id="5838451609423551646">सभी एंट्री से चुने हुए का निशान हटाया गया.</translation>
 <translation id="5838825566232597749">यूएस वर्कमैन अंतर्राष्‍ट्रीय</translation>
 <translation id="5850516540536751549">इस तरह की फ़ाइल नहीं खुल सकती है. इस तरह के फ़ाइल को खोल सकने वाले ऐप्लिकेशन खोजने के लिए कृपया <ph name="BEGIN_LINK" />Chrome वेब स्टोर<ph name="END_LINK" /> पर जाएं.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
index 5f154d48..9dfda128 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Morate biti na mreži da biste pristupili toj datoteci.</translation>
 <translation id="4212740939091998969">Mapa s nazivom "<ph name="FOLDER_NAME" />" već postoji. Odaberite drugi naziv.</translation>
 <translation id="4215448920900139318">Sigurnosno kopiranje datoteka (ukupno <ph name="FILE_COUNT" />)</translation>
-<translation id="4242533952199664413">Otvori postavke</translation>
 <translation id="426015154560005552">arapska tipkovnica</translation>
 <translation id="4261901459838235729">Googleova prezentacija</translation>
 <translation id="4290535918735525311">Jedna mapa podijeljena s Linuxom</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korejski</translation>
 <translation id="5819442873484330149">hangul 3 set (završni)</translation>
 <translation id="5833610766403489739">Datoteka nije pronađena. Provjerite postavku lokacije preuzimanja i pokušajte ponovo.</translation>
-<translation id="5838051104334203064">Aplikacije iz Trgovine Play ne mogu pristupiti ovom uređaju</translation>
 <translation id="5838451609423551646">Uklonjeni su svi unosi iz odabira.</translation>
 <translation id="5838825566232597749">Američka međunarodna Workman</translation>
 <translation id="5850516540536751549">Ta vrsta datoteke nije podržana. Posjetite <ph name="BEGIN_LINK" />Chrome web-trgovinu<ph name="END_LINK" /> da biste pronašli aplikaciju koja može otvoriti tu vrstu datoteke.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
index 4e6d5b0..0a6a9093 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Online kell lennie a fájl eléréséhez.</translation>
 <translation id="4212740939091998969">Már van „<ph name="FOLDER_NAME" />” nevű mappa. Válasszon másik nevet.</translation>
 <translation id="4215448920900139318">Biztonsági másolat készítése a következőkről: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Beállítások megnyitása</translation>
 <translation id="426015154560005552">Arab billentyűzet</translation>
 <translation id="4261901459838235729">Google-bemutató</translation>
 <translation id="4290535918735525311">1 mappa megosztva Linuxszal</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">koreai</translation>
 <translation id="5819442873484330149">Hangul 3 készlet (végleges)</translation>
 <translation id="5833610766403489739">Ez a fájl elkóborolt valahová. Kérjük, ellenőrizze a letöltés helyének beállítását, és próbálja újra.</translation>
-<translation id="5838051104334203064">A Play Áruház alkalmazásai nem férhetnek hozzá ehhez az eszközhöz</translation>
 <translation id="5838451609423551646">Összes bejegyzés eltávolítva a kijelöltek közül.</translation>
 <translation id="5838825566232597749">USA „Workman” nemzetközi</translation>
 <translation id="5850516540536751549">Ez a fájltípus nem támogatott. A fájltípus megnyitására képes alkalmazás megkereséséhez látogasson el a <ph name="BEGIN_LINK" />Chrome Internetes áruházba<ph name="END_LINK" />.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
index 17a8a95..8a1323f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Anda harus online untuk mengakses file ini.</translation>
 <translation id="4212740939091998969">Folder bernama "<ph name="FOLDER_NAME" />" sudah ada. Harap pilih nama lain.</translation>
 <translation id="4215448920900139318">Mencadangkan <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Buka setelan</translation>
 <translation id="426015154560005552">Keyboard Arab</translation>
 <translation id="4261901459838235729">Presentasi Google</translation>
 <translation id="4290535918735525311">1 folder dibagikan dengan Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korea</translation>
 <translation id="5819442873484330149">3 Himpunan Hangul (Akhir)</translation>
 <translation id="5833610766403489739">File ini tidak terdeteksi berada di mana. Periksa setelan lokasi download dan coba lagi.</translation>
-<translation id="5838051104334203064">Aplikasi Play Store tidak dapat mengakses perangkat ini</translation>
 <translation id="5838451609423551646">Semua entri dihapus dari pilihan.</translation>
 <translation id="5838825566232597749">Internasional Workman AS</translation>
 <translation id="5850516540536751549">Jenis file ini tidak didukung. Kunjungi <ph name="BEGIN_LINK" />Chrome Webstore<ph name="END_LINK" /> untuk menemukan aplikasi yang dapat membuka jenis file ini.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
index 9ba3e113..bd0f526 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Per poter accedere a questo file devi essere online.</translation>
 <translation id="4212740939091998969">Esiste già una cartella denominata "<ph name="FOLDER_NAME" />". Scegli un nome diverso.</translation>
 <translation id="4215448920900139318">Backup di <ph name="FILE_COUNT" /> in corso</translation>
-<translation id="4242533952199664413">Apri le impostazioni</translation>
 <translation id="426015154560005552">Tastiera Arabo</translation>
 <translation id="4261901459838235729">Presentazione Google</translation>
 <translation id="4290535918735525311">1 cartella condivisa con Linux</translation>
@@ -422,7 +421,6 @@
 <translation id="5818003990515275822">Coreano</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Final)</translation>
 <translation id="5833610766403489739">Il file deve essere altrove. Controlla l'impostazione del percorso di download e riprova.</translation>
-<translation id="5838051104334203064">Le applicazioni del Play Store non possono accedere a questo dispositivo</translation>
 <translation id="5838451609423551646">Tutti gli elementi sono stati rimossi dalla selezione.</translation>
 <translation id="5838825566232597749">Internazionale Workman USA</translation>
 <translation id="5850516540536751549">Questo tipo di file non è supportato. Visita il <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> per trovare un'app in grado di aprire questo tipo di file.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
index 4b136c44..4408176 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">עליך להיות במצב מקוון כדי לגשת לקובץ זה.</translation>
 <translation id="4212740939091998969">כבר קיימת תיקייה בשם "<ph name="FOLDER_NAME" />". יש לבחור שם אחר.</translation>
 <translation id="4215448920900139318">מגבה <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">פתח את 'הגדרות'</translation>
 <translation id="426015154560005552">מקלדת ערבית</translation>
 <translation id="4261901459838235729">‏מצגת Google</translation>
 <translation id="4290535918735525311">‏תיקייה אחת שותפה עם Linux</translation>
@@ -424,7 +423,6 @@
 <translation id="5818003990515275822">קוריאנית</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Final)‎</translation>
 <translation id="5833610766403489739">הקובץ הזה עבר למקום אחר. בדוק את הגדרות מיקום ההורדה ונסה שוב.</translation>
-<translation id="5838051104334203064">‏לאפליקציות של חנות Play אין גישה למכשיר הזה</translation>
 <translation id="5838451609423551646">הסרת את כל הפריטים מהבחירה.</translation>
 <translation id="5838825566232597749">‏US Workman בינלאומית</translation>
 <translation id="5850516540536751549">‏סוג קובץ זה אינו נתמך. בקר ב<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome‏<ph name="END_LINK" /> כדי למצוא יישום שבאמצעותו ניתן לפתוח קובץ מסוג זה.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
index 70509368..d0558ad 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">このファイルにアクセスするには、オンライン接続が必要です。</translation>
 <translation id="4212740939091998969">「<ph name="FOLDER_NAME" />」という名前のフォルダはすでに存在します。別の名前を選択してください。</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />をバックアップしています</translation>
-<translation id="4242533952199664413">設定を開く</translation>
 <translation id="426015154560005552">アラビア語キーボード</translation>
 <translation id="4261901459838235729">Google プレゼンテーション</translation>
 <translation id="4290535918735525311">1 個のフォルダを Linux と共有しました</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">韓国語</translation>
 <translation id="5819442873484330149">ハングル(3 ボル式、最終版)</translation>
 <translation id="5833610766403489739">このファイルは移動されています。ダウンロード保存先の設定を確認し、もう一度お試しください。</translation>
-<translation id="5838051104334203064">Play ストアのアプリからこのデバイスにアクセスできません</translation>
 <translation id="5838451609423551646">すべての項目を選択範囲から削除しました。</translation>
 <translation id="5838825566232597749">US Workman インターナショナル</translation>
 <translation id="5850516540536751549">このファイル形式はサポートされていません。<ph name="BEGIN_LINK" />Chrome ウェブストア<ph name="END_LINK" />にアクセスして、この形式のファイルを開くことができるアプリをお探しください。
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
index d3d7cab..751cf7e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -263,7 +263,6 @@
 <translation id="421017592316736757">ಈ ಫೈಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿರಬೇಕು.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" ಹೆಸರಿನ ಫೋಲ್ಡರ್ ಈಗಾಗಲೇ ಇದೆ. ಬೇರೊಂದು ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> ಬ್ಯಾಕಪ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
-<translation id="4242533952199664413">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆ</translation>
 <translation id="426015154560005552">ಅರೇಬಿಕ್ ಕೀಬೋರ್ಡ್</translation>
 <translation id="4261901459838235729">Google ಪ್ರಸ್ತುತಿ</translation>
 <translation id="4290535918735525311">Linux ಮೂಲಕ 1 ಫೋಲ್ಡರ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ</translation>
@@ -419,7 +418,6 @@
 <translation id="5818003990515275822">ಕೊರಿಯನ್</translation>
 <translation id="5819442873484330149">ಹಂಗುಲ್ 3 ಸೆಟ್ (ಅಂತಿಮ)</translation>
 <translation id="5833610766403489739">ಈ ಫೈಲ್ ಎಲ್ಲಿಯೋ ಹೋಗಿಬಿಟ್ಟಿದೆ. ನಿಮ್ಮ ಡೌನ್‌ಲೋಡ್ ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="5838051104334203064">Play ಸ್ಟೋರ್‌‌ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಈ ಸಾಧನಕ್ಕೆ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation>
 <translation id="5838451609423551646">ಆಯ್ಕೆಯಿಂದ ಎಲ್ಲಾ ನಮೂದುಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ.</translation>
 <translation id="5838825566232597749">US ವರ್ಕ್‌ಮ್ಯಾನ್ ಇಂಟರ್‌ನ್ಯಾಶನಲ್</translation>
 <translation id="5850516540536751549">ಈ ಫೈಲ್ ಪ್ರಕಾರವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ಈ ಪ್ರಕಾರದ ಫೈಲ್ ಅನ್ನು ತೆರೆಯಬಹುದಾದ ಅಪ್ಲಿಕೇಶನ್ ಹುಡುಕಲು <ph name="BEGIN_LINK" />Chrome ವೆಬ್ ಸ್ಟೋರ್‌‌ಗೆ<ph name="END_LINK" /> ಭೇಟಿ ನೀಡಿ.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index f8a9187..527bed4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">이 파일에 액세스하려면 온라인 상태여야 합니다.</translation>
 <translation id="4212740939091998969">이름이 '<ph name="FOLDER_NAME" />'인 폴더가 이미 존재합니다. 다른 이름을 선택하세요.</translation>
 <translation id="4215448920900139318">파일 <ph name="FILE_COUNT" />개 백업 중</translation>
-<translation id="4242533952199664413">설정 열기</translation>
 <translation id="426015154560005552">아랍어 키보드</translation>
 <translation id="4261901459838235729">Google 프레젠테이션</translation>
 <translation id="4290535918735525311">폴더 1개가 Linux와 공유됨</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">한국어</translation>
 <translation id="5819442873484330149">한글 세벌식(최종)</translation>
 <translation id="5833610766403489739">파일이 어디론가 사라졌습니다. 다운로드 위치 설정을 확인하고 다시 시도해 주세요.</translation>
-<translation id="5838051104334203064">Play 스토어 애플리케이션에서 이 기기에 액세스할 수 없음</translation>
 <translation id="5838451609423551646">모든 항목이 선택 해제되었습니다.</translation>
 <translation id="5838825566232597749">미국 워크맨(국제)</translation>
 <translation id="5850516540536751549">이 파일 형식은 지원되지 않습니다. 이 파일 형식을 열 수 있는 앱을 찾으려면 <ph name="BEGIN_LINK" />Chrome 웹 스토어<ph name="END_LINK" />를 방문하세요.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
index 6568a56..99e49e4 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Jei norite pasiekti šį failą, turite prisijungti.</translation>
 <translation id="4212740939091998969">Aplankas pavadinimu „<ph name="FOLDER_NAME" />“ jau yra. Pasirinkite kitą pavadinimą.</translation>
 <translation id="4215448920900139318">Kuriama atsarginė kopija: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Atidaryti nustatymus</translation>
 <translation id="426015154560005552">Arabiška klaviatūra</translation>
 <translation id="4261901459838235729">„Google“ pristatymas</translation>
 <translation id="4290535918735525311">1 aplankas bendrinamas su „Linux“</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korėjiečių</translation>
 <translation id="5819442873484330149">Hangul 3 rinkinys („Final“)</translation>
 <translation id="5833610766403489739">Šis failas kažkur perkeltas. Patikrinkite atsisiuntimo vietos nustatymą ir bandykite dar kartą.</translation>
-<translation id="5838051104334203064">„Play“ parduotuvės programos negali pasiekti šio įrenginio</translation>
 <translation id="5838451609423551646">Pašalinti visi įrašai pasirinkimo srityje.</translation>
 <translation id="5838825566232597749">JAV „Workman“ tarptautinė</translation>
 <translation id="5850516540536751549">Šio tipo failas nepalaikomas. Apsilankykite <ph name="BEGIN_LINK" />„Chrome“ internetinėje parduotuvėje<ph name="END_LINK" /> ir raskite programą, kuria galima atidaryti šio tipo failą.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
index 23223d7..b13e6ddd 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Lai piekļūtu šim failam, jums ir jābūt tiešsaistē.</translation>
 <translation id="4212740939091998969">Mape ar nosaukumu “<ph name="FOLDER_NAME" />” jau pastāv. Lūdzu, izvēlieties citu nosaukumu.</translation>
 <translation id="4215448920900139318">Dublēšana: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Atvērt iestatījumus</translation>
 <translation id="426015154560005552">Arābu tastatūra</translation>
 <translation id="4261901459838235729">Google prezentācija</translation>
 <translation id="4290535918735525311">1 mape kopīgota ar Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korejiešu valoda</translation>
 <translation id="5819442873484330149">Hangils (3 Set, Final)</translation>
 <translation id="5833610766403489739">Šo failu nevar atrast. Lūdzu, pārbaudiet lejupielādes vietas iestatījumu un mēģiniet vēlreiz.</translation>
-<translation id="5838051104334203064">Play veikala lietojumprogrammas nevar piekļūt šai ierīcei</translation>
 <translation id="5838451609423551646">Visi vienumi noņemti no atlases.</translation>
 <translation id="5838825566232597749">Workman (ASV starptautiskā)</translation>
 <translation id="5850516540536751549">Šis faila tips netiek atbalstīts. Lūdzu, apmeklējiet <ph name="BEGIN_LINK" />Chrome interneta veikalu<ph name="END_LINK" />, lai atrastu lietotni, ar kuru var atvērt šo failu.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
index fbf3932b..c3e55979 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">ഈ ഫയൽ ആക്‌സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ഓൺലൈനിലായിരിക്കണം.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" എന്ന് പേരുള്ള ഫോൾഡർ മുമ്പേ നിലവിലുണ്ട്. മറ്റൊരു പേര് തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> ബാക്കപ്പ് ചെയ്യുന്നു</translation>
-<translation id="4242533952199664413">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="426015154560005552">അറബിക് കീബോർഡ്</translation>
 <translation id="4261901459838235729">Google അവതരണം</translation>
 <translation id="4290535918735525311">Linux ഉപയോഗിച്ച് ഒരു ഫോൾഡർ പങ്കിട്ടു</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">കൊറിയന്‍</translation>
 <translation id="5819442873484330149">ഹംഗുൽ 3 സെറ്റ് (അന്തിമം)</translation>
 <translation id="5833610766403489739">നിങ്ങളുടെ ഫയൽ മറ്റെവിടെയോ ആണ്. നിങ്ങളുടെ ഡൗൺലോഡ് ലൊക്കേഷൻ ക്രമീകരണം പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="5838051104334203064">Play സ്‌റ്റോർ ആപ്പുകൾക്ക് ഈ ഉപകരണം ആക്‌സസ് ചെയ്യാനാവില്ല</translation>
 <translation id="5838451609423551646">തിരഞ്ഞെടുക്കലിൽ നിന്ന് എല്ലാ എൻട്രികളും നീക്കം ചെയ്‌തു.</translation>
 <translation id="5838825566232597749">യുഎസ് വർക്ക്‌മാൻ ഇന്റർനാഷണൽ</translation>
 <translation id="5850516540536751549">ഈ ഫയൽ തരം പിന്തുണയ്‌ക്കുന്നില്ല. ഈ ഫയൽ തരം തുറക്കാൻ കഴിയുന്ന ഒരു അപ്ലിക്കേഷൻ കണ്ടെത്തുന്നതിന് ഒരു <ph name="BEGIN_LINK" />Chrome വെബ് സ്റ്റോർ<ph name="END_LINK" /> സന്ദർശിക്കുക.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
index c3f6a7e..6a251ba1 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">या फाइल अॅक्सेस करण्‍यासाठी तुम्ही ऑनलाइन असणे आवश्यक आहे.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" नावाचे फोल्डर आधीच अस्तित्वात आहे. कृपया वेगळे नाव निवडा.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> चा बॅकअप घेत आहे</translation>
-<translation id="4242533952199664413">सेटिंग्ज उघडा</translation>
 <translation id="426015154560005552">अरेबिक कीबोर्ड</translation>
 <translation id="4261901459838235729">Google सादरीकरण</translation>
 <translation id="4290535918735525311">Linux सह एक फोल्डर शेअर केला</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">कोरियन</translation>
 <translation id="5819442873484330149">हँगल 3 संच (अंतिम)</translation>
 <translation id="5833610766403489739">ही फाइल कुठेतरी हरवली आहे. कृपया तुमचे डाउनलोड स्थान सेटिंग तपासा आणि पुन्हा प्रयत्न करा.</translation>
-<translation id="5838051104334203064">Play स्टोअर अ‍ॅप्लिकेशन हे डिव्हाइस अ‍ॅक्सेस करू शकत नाही</translation>
 <translation id="5838451609423551646">निवडीमधून सर्व नोंदी काढून टाकल्या आहेत.</translation>
 <translation id="5838825566232597749">यूएस कामगार आंतरराष्ट्रीय</translation>
 <translation id="5850516540536751549">हा फाइल प्रकार सपोर्टेड नाही. कृपया या प्रकारची फाइल उघडू शकणारे अ‍ॅप शोधण्यासाठी <ph name="BEGIN_LINK" />Chrome वेब स्टोअर<ph name="END_LINK" /> ला भेट द्या.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
index 0bedb6e..ec403f0 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Anda mesti berada dalam talian untuk mengakses fail ini.</translation>
 <translation id="4212740939091998969">Fail bernama "<ph name="FOLDER_NAME" />" sudah wujud. Sila pilih nama lain.</translation>
 <translation id="4215448920900139318">Menyandarkan <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Buka tetapan</translation>
 <translation id="426015154560005552">Papan kekunci bahasa Arab</translation>
 <translation id="4261901459838235729">Persembahan Google</translation>
 <translation id="4290535918735525311">1 folder dikongsi dengan Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Bahasa Korea</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Akhir)</translation>
 <translation id="5833610766403489739">Fail ini ada di tempat lain. Sila semak tetapan lokasi muat turun anda, kemudian cuba lagi.</translation>
-<translation id="5838051104334203064">Aplikasi Gedung Play tidak boleh mengakses peranti ini</translation>
 <translation id="5838451609423551646">Semua masukan dialih keluar daripada pilihan.</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5850516540536751549">Jenis fail ini tidak disokong. Sila lawati<ph name="BEGIN_LINK" />Gedung Web Chrome<ph name="END_LINK" /> untuk mendapatkan apl yang boleh membuka jenis fail ini.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
index 65a9914..93a95a6 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Je moet online zijn om dit bestand te openen.</translation>
 <translation id="4212740939091998969">Er bestaat al een map met de naam '<ph name="FOLDER_NAME" />'. Kies een andere naam.</translation>
 <translation id="4215448920900139318">Back-up van <ph name="FILE_COUNT" /> maken</translation>
-<translation id="4242533952199664413">Instellingen openen</translation>
 <translation id="426015154560005552">Arabisch toetsenbord</translation>
 <translation id="4261901459838235729">Google-presentatie</translation>
 <translation id="4290535918735525311">1 map gedeeld met Linux</translation>
@@ -424,7 +423,6 @@
 <translation id="5818003990515275822">Koreaans</translation>
 <translation id="5819442873484330149">Hangul 3 Set (Final)</translation>
 <translation id="5833610766403489739">Dit bestand staat ergens anders. Controleer je downloadlocatie-instelling en probeer het opnieuw.</translation>
-<translation id="5838051104334203064">Play Store-apps hebben geen toegang tot dit apparaat</translation>
 <translation id="5838451609423551646">Alle items uit selectie zijn verwijderd.</translation>
 <translation id="5838825566232597749">Amerikaans Workman (internationaal)</translation>
 <translation id="5850516540536751549">Dit bestandstype wordt niet ondersteund. Ga naar de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> om een app te vinden die dit type bestand kan openen.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
index 0a2e937..454e54c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Du må ha internettilkobling for å få tilgang til denne filen.</translation>
 <translation id="4212740939091998969">Det finnes allerede en mappe som heter «<ph name="FOLDER_NAME" />». Velg et annet navn.</translation>
 <translation id="4215448920900139318">Sikkerhetskopierer <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Åpne innstillingene</translation>
 <translation id="426015154560005552">Arabisk tastatur</translation>
 <translation id="4261901459838235729">Google-presentasjon</translation>
 <translation id="4290535918735525311">1 mappe er delt med Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Koreansk</translation>
 <translation id="5819442873484330149">Hangul 3-sett (endelig)</translation>
 <translation id="5833610766403489739">Denne filen har vandret av gårde. Sjekk innstillingen din for nedlastingsplassering, og prøv på nytt.</translation>
-<translation id="5838051104334203064">Play Butikk-apper har ikke tilgang til denne enheten</translation>
 <translation id="5838451609423551646">Fjernet alle oppføringene fra utvalget.</translation>
 <translation id="5838825566232597749">Internasjonalt Workman (USA)</translation>
 <translation id="5850516540536751549">Denne filtypen støttes ikke. Gå til <ph name="BEGIN_LINK" />Chrome Nettmarked<ph name="END_LINK" /> for å finne en app som kan åpne denne filtypen.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
index 396a111..4b21e408 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Musisz być w trybie online, by uzyskać dostęp do tego pliku.</translation>
 <translation id="4212740939091998969">Istnieje już folder „<ph name="FOLDER_NAME" />”. Wybierz inną nazwę.</translation>
 <translation id="4215448920900139318">Tworzę kopie zapasowe – <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Otwórz ustawienia</translation>
 <translation id="426015154560005552">Klawiatura arabska</translation>
 <translation id="4261901459838235729">Prezentacja Google</translation>
 <translation id="4290535918735525311">Folder udostępniono Linuksowi</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Koreański</translation>
 <translation id="5819442873484330149">Zestaw Hangul 3 (ostateczny)</translation>
 <translation id="5833610766403489739">Plik gdzieś się zawieruszył. Sprawdź ustawienie lokalizacji pobierania i spróbuj ponownie.</translation>
-<translation id="5838051104334203064">Aplikacje ze Sklepu Play nie mają dostępu do tego urządzenia</translation>
 <translation id="5838451609423551646">Usunięto wszystkie elementy z zaznaczenia.</translation>
 <translation id="5838825566232597749">Amerykańska klawiatura międzynarodowa Workman</translation>
 <translation id="5850516540536751549">Ten typ plików nie jest obsługiwany. W <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> znajdziesz aplikację umożliwiającą otwieranie plików tego typu.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
index 5c6b5fcf..5617905 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">É necessário estar conectado para acessar este arquivo.</translation>
 <translation id="4212740939091998969">Já existe uma pasta chamada "<ph name="FOLDER_NAME" />". Escolha outro nome.</translation>
 <translation id="4215448920900139318">Fazendo backup de <ph name="FILE_COUNT" /> arquivo(s)</translation>
-<translation id="4242533952199664413">Abrir configurações.</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Apresentação do Google</translation>
 <translation id="4290535918735525311">1 pasta compartilhada com o Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreano</translation>
 <translation id="5819442873484330149">Conjunto de letras coreanas final (Hangul 3)</translation>
 <translation id="5833610766403489739">Este arquivo está perdido em algum lugar. Verifique sua configuração de local de download e tente novamente.</translation>
-<translation id="5838051104334203064">Os aplicativos da Play Store não podem acessar esse dispositivo</translation>
 <translation id="5838451609423551646">Todas as entradas removidas da seleção.</translation>
 <translation id="5838825566232597749">Workman internacional dos EUA</translation>
 <translation id="5850516540536751549">Este tipo de arquivo não é compatível. Visite a <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> para encontrar um aplicativo que possa abri-lo.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
index 8911e74..061fcbdc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Tem de estar online para aceder a este ficheiro.</translation>
 <translation id="4212740939091998969">A pasta com o nome "<ph name="FOLDER_NAME" />" já existe. Escolha um nome diferente.</translation>
 <translation id="4215448920900139318">A fazer uma cópia de segurança de <ph name="FILE_COUNT" />...</translation>
-<translation id="4242533952199664413">Abrir definições</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Apresentação do Google</translation>
 <translation id="4290535918735525311">1 pasta partilhada com o Linux.</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreano</translation>
 <translation id="5819442873484330149">Hangul 3 Set (final)</translation>
 <translation id="5833610766403489739">Este ficheiro está perdido algures. Verifique a definição da sua localização de transferências e tente novamente.</translation>
-<translation id="5838051104334203064">As aplicações da Play Store não podem aceder a este dispositivo</translation>
 <translation id="5838451609423551646">Removeu todas as entradas da seleção.</translation>
 <translation id="5838825566232597749">Workman internacional dos EUA</translation>
 <translation id="5850516540536751549">Este tipo de ficheiro não é suportado. Visite a <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> para encontrar uma aplicação que consiga abrir este tipo de ficheiro.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index 7ee79b6..8a2f0ae7 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Trebuie să fiți online pentru a accesa acest fișier.</translation>
 <translation id="4212740939091998969">Dosarul cu numele „<ph name="FOLDER_NAME" />” există deja. Alege un alt nume.</translation>
 <translation id="4215448920900139318">Se face backup pentru <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Deschide setările</translation>
 <translation id="426015154560005552">Tastatură arabă</translation>
 <translation id="4261901459838235729">Prezentare Google</translation>
 <translation id="4290535918735525311">Un dosar cu accesul permis pentru Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Coreeană</translation>
 <translation id="5819442873484330149">Hangul setul 3 (Final)</translation>
 <translation id="5833610766403489739">Fișierul nu poate fi găsit. Verificați setarea locației de descărcare și încercați din nou.</translation>
-<translation id="5838051104334203064">Aplicațiile Play Store nu pot accesa acest dispozitiv</translation>
 <translation id="5838451609423551646">S-au eliminat toate intrările din selecție.</translation>
 <translation id="5838825566232597749">Tastatură S.U.A. Workman internațională</translation>
 <translation id="5850516540536751549">Acest tip de fișier nu este acceptat. Accesați <ph name="BEGIN_LINK" />Magazinul web Chrome<ph name="END_LINK" /> pentru a găsi o aplicație care poate deschide acest tip de fișier.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
index 0bcd2aa1..bdb4d7d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Для доступа к файлу необходимо подключение к Интернету.</translation>
 <translation id="4212740939091998969">Папка "<ph name="FOLDER_NAME" />" уже существует. Укажите другое название.</translation>
 <translation id="4215448920900139318">Сохранение файлов (<ph name="FILE_COUNT" />)…</translation>
-<translation id="4242533952199664413">Открыть настройки</translation>
 <translation id="426015154560005552">Арабская раскладка</translation>
 <translation id="4261901459838235729">Презентация Google</translation>
 <translation id="4290535918735525311">Linux предоставлен доступ к 1 папке</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Корейский</translation>
 <translation id="5819442873484330149">Корейская раскладка (Sebeolsik Final)</translation>
 <translation id="5833610766403489739">Файл не найден. Проверьте параметр места для скачивания и повторите попытку.</translation>
-<translation id="5838051104334203064">Приложениям из Play Маркета закрыт доступ к этому устройству.</translation>
 <translation id="5838451609423551646">Выбор отменен.</translation>
 <translation id="5838825566232597749">США (Workman, международная)</translation>
 <translation id="5850516540536751549">Файлы этого типа не поддерживаются. Попробуйте найти приложение, с помощью которого их можно открыть, в <ph name="BEGIN_LINK" />Интернет-магазине Chrome<ph name="END_LINK" />.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
index 3a4c3a8..498e5fd 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Ak chcete pristupovať k tomuto súboru, musíte byť online.</translation>
 <translation id="4212740939091998969">Priečinok s názvom <ph name="FOLDER_NAME" /> už existuje. Vyberte iný názov.</translation>
 <translation id="4215448920900139318">Zálohujú sa fotky (<ph name="FILE_COUNT" />)</translation>
-<translation id="4242533952199664413">Otvoriť nastavenia</translation>
 <translation id="426015154560005552">Arabská klávesnica</translation>
 <translation id="4261901459838235729">Prezentácia Google</translation>
 <translation id="4290535918735525311">So systémom Linux zdieľate 1 priečinok</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Kórejčina</translation>
 <translation id="5819442873484330149">Hangul 3 Set (konečné)</translation>
 <translation id="5833610766403489739">Umiestnenie tohto súboru sa zmenilo. Skontrolujte nastavenie umiestnenia pre sťahované súbory a skúste to znova.</translation>
-<translation id="5838051104334203064">Aplikácie z Obchodu Play nemajú prístup k tomuto zariadeniu</translation>
 <translation id="5838451609423551646">Z výberu boli odstránené všetky položky.</translation>
 <translation id="5838825566232597749">US Workman international – medzinárodná</translation>
 <translation id="5850516540536751549">Tento typ súboru nie je podporovaný. Navštívte <ph name="BEGIN_LINK" />Internetový obchod Chrome<ph name="END_LINK" />, kde nájdete aplikáciu, pomocou ktorej môžete otvoriť tento typ súboru.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
index f8a40af..20868a5a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Če želite dostopati do datoteke, mora biti vzpostavljena povezava z internetom.</translation>
 <translation id="4212740939091998969">Mapa z imenom »<ph name="FOLDER_NAME" />« že obstaja. Izberite drugo ime.</translation>
 <translation id="4215448920900139318">Varnostno kopiranje: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Odpri nastavitve</translation>
 <translation id="426015154560005552">Tipkovnica za arabščino</translation>
 <translation id="4261901459838235729">Googlova predstavitev</translation>
 <translation id="4290535918735525311">1 mapa v skupni rabi z Linuxom</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">korejščina</translation>
 <translation id="5819442873484330149">Trodelni hangulski način (dokončni)</translation>
 <translation id="5833610766403489739">Ta datoteka se je nekje izgubila. Preverite nastavitev mesta za prenos in poskusite znova.</translation>
-<translation id="5838051104334203064">Aplikacije iz Trgovine Play ne morejo dostopati do te naprave</translation>
 <translation id="5838451609423551646">Vsi vnosi so bili odstranjeni iz izbora.</translation>
 <translation id="5838825566232597749">Združene države – mednarodna (Workman)</translation>
 <translation id="5850516540536751549">Ta vrsta datoteke ni podprta. V <ph name="BEGIN_LINK" />Spletni trgovini Chrome<ph name="END_LINK" /> poiščite aplikacijo, s katero lahko odprete to vrsto datoteke.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
index 96f0fb3..9ba3176 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Морате да будете на мрежи да бисте приступили овој датотеци.</translation>
 <translation id="4212740939091998969">Директоријум „<ph name="FOLDER_NAME" />“ већ постоји. Одаберите други назив.</translation>
 <translation id="4215448920900139318">Праве се резервне копије (<ph name="FILE_COUNT" />)</translation>
-<translation id="4242533952199664413">Отвори подешавања</translation>
 <translation id="426015154560005552">Арапска тастатура</translation>
 <translation id="4261901459838235729">Google презентација</translation>
 <translation id="4290535918735525311">1 директоријум се дели са Linux-ом</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">корејски</translation>
 <translation id="5819442873484330149">Хангул, 3 реда (Final)</translation>
 <translation id="5833610766403489739">Датотека се негде изгубила. Проверите подешавање локације за преузимања и покушајте поново.</translation>
-<translation id="5838051104334203064">Апликације из Play продавнице немају приступ овом уређају</translation>
 <translation id="5838451609423551646">Уклонили сте све ставке из избора.</translation>
 <translation id="5838825566232597749">Америчка Workman интернационална</translation>
 <translation id="5850516540536751549">Овај тип датотеке није подржан. Посетите <ph name="BEGIN_LINK" />Chrome веб-продавницу<ph name="END_LINK" /> да бисте пронашли апликацију која може да отвара овај тип датотеке.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
index dd957a8..dd27d48 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Du måste vara online för att kunna öppna filen.</translation>
 <translation id="4212740939091998969">Det finns redan en mapp med namnet <ph name="FOLDER_NAME" />. Välj ett annat namn.</translation>
 <translation id="4215448920900139318">Säkerhetskopierar <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Öppna Inställningar</translation>
 <translation id="426015154560005552">Tangentbord för arabiska</translation>
 <translation id="4261901459838235729">Presentation i Google Dokument</translation>
 <translation id="4290535918735525311">1 mapp delas med Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">koreanska</translation>
 <translation id="5819442873484330149">Hangul 3 Set (final)</translation>
 <translation id="5833610766403489739">Den här filen verkar ha gått sin väg. Kontrollera inställningen för nedladdade filer och försök igen.</translation>
-<translation id="5838051104334203064">Appar på Play Butik har inte tillgång till den här enheten</translation>
 <translation id="5838451609423551646">Alla poster har avmarkerats.</translation>
 <translation id="5838825566232597749">US Workman (internationellt)</translation>
 <translation id="5850516540536751549">Filtypen stöds inte. Besök <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> om du vill hitta en app som kan öppna den här filen.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
index 8b589447..08c0f86 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Sharti uwe mtandaoni ili kufikia faili hii.</translation>
 <translation id="4212740939091998969">Folda iitwayo "<ph name="FOLDER_NAME" />" tayari ipo. Tafadhali chagua jina tofauti.</translation>
 <translation id="4215448920900139318">Inahifadhi nakala ya <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Fungua mipangilio</translation>
 <translation id="426015154560005552">Kibodi ya Kiarabu</translation>
 <translation id="4261901459838235729">Wasilisho la Google</translation>
 <translation id="4290535918735525311">Folda 1 imeshirikiwa na Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Kikorea</translation>
 <translation id="5819442873484330149">Seti ya Hangul 3 (Ya mwisho)</translation>
 <translation id="5833610766403489739">Faili hii imepotelea mahali fulani. Tafadhali angalia mipangilio yako ya mahali pa kupakulia na ujaribu tena.</translation>
-<translation id="5838051104334203064">Programu za Duka la Google Play haviwezi kufikia kifaa hiki</translation>
 <translation id="5838451609423551646">Umeondoa vipengee vyote kwenye sehemu ya vipengee ilivyochagua.</translation>
 <translation id="5838825566232597749">Kibodi ya US Workman ya kimataifa</translation>
 <translation id="5850516540536751549">Aina hii ya faili haitumiki. Tafadhali tembelea <ph name="BEGIN_LINK" />Duka la Wavuti la Chrome<ph name="END_LINK" /> ili upate programu ambayo inaweza kufungua aina hii ya faili.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index 75c55e4..6e6744a2 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">இந்தக் கோப்பை அணுக ஆன்லைனில் இருக்க வேண்டும்.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" என்ற பெயருள்ள கோப்புறை ஏற்கனவே உள்ளது. வேறொரு பெயரைத் தேர்வுசெய்யவும்.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> கோப்புகளைக் காப்புப் பிரதி எடுக்கிறது</translation>
-<translation id="4242533952199664413">அமைப்புகளைத் திற</translation>
 <translation id="426015154560005552">அரபிக் விசைப்பலகை</translation>
 <translation id="4261901459838235729">Google விளக்கக்காட்சி</translation>
 <translation id="4290535918735525311">Linuxஸுடன் 1 கோப்புறை பகிரப்பட்டது</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">கொரியன்</translation>
 <translation id="5819442873484330149">ஹாங்குல் 3 செட் (இறுதி)</translation>
 <translation id="5833610766403489739">இந்தக் கோப்பு வேறு எங்கோ சேமிக்கப்பட்டுவிட்டது. உங்கள் பதிவிறக்க இருப்பிட அமைப்பைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்.</translation>
-<translation id="5838051104334203064">இந்தச் சாதனத்தை Play ஸ்டோர் ஆப்ஸினால் பயன்படுத்த முடியாது</translation>
 <translation id="5838451609423551646">தேர்ந்தெடுக்கப்பட்டதில் உள்ள அனைத்து உள்ளீடுகளும் அகற்றப்பட்டன.</translation>
 <translation id="5838825566232597749">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல்</translation>
 <translation id="5850516540536751549">இந்தக் கோப்பு வகை ஆதரிக்கப்படவில்லை. இந்த வகையான கோப்பைத் திறக்கக்கூடிய பயன்பாட்டைக் கண்டறிய <ph name="BEGIN_LINK" />Chrome இணைய அங்காடியைப்<ph name="END_LINK" /> பார்வையிடவும்.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
index c2406ce..72097f28 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">ఈ ఫైల్‌ను యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా ఆన్‌లైన్‌లో ఉండాలి.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" పేరు గల ఫోల్డర్ ఇప్పటికే ఉంది. దయచేసి వేరే పేరును ఎంచుకోండి.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> వాటిని బ్యాకప్ చేస్తోంది</translation>
-<translation id="4242533952199664413">సెట్టింగ్‌లను తెరువు</translation>
 <translation id="426015154560005552">అరబిక్ కీబోర్డ్</translation>
 <translation id="4261901459838235729">Google ప్రెజెంటేషన్</translation>
 <translation id="4290535918735525311">Linuxతో 1 ఫోల్డర్ షేర్ చేయబడింది</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">కొరియన్</translation>
 <translation id="5819442873484330149">హాంగుల్ 3 సెట్ (తుది)</translation>
 <translation id="5833610766403489739">ఈ ఫైల్ ఉన్న స్థలం తెలియదు. దయచేసి మీ డౌన్‌లోడ్ స్థానం సెట్టింగ్‌ను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="5838051104334203064">Play స్టోర్ అప్లికేషన్‌లు ఈ పరికరాన్ని యాక్సెస్ చేయలేవు</translation>
 <translation id="5838451609423551646">అన్ని నమోదుల ఎంపిక తీసివేయబడింది.</translation>
 <translation id="5838825566232597749">US వర్క్‌మాన్ అంతర్జాతీయం</translation>
 <translation id="5850516540536751549">ఈ ఫైల్ రకానికి మద్దతు లేదు. దయచేసి ఈ రకమైన ఫైల్‌ను తెరవగల యాప్‌ను కనుగొనడానికి <ph name="BEGIN_LINK" />Chrome వెబ్ స్టోర్<ph name="END_LINK" />ను సందర్శించండి.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index 341e619..3b81f53 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">คุณจะต้องออนไลน์เพื่อเข้าถึงไฟล์นี้</translation>
 <translation id="4212740939091998969">มีโฟลเดอร์ชื่อ "<ph name="FOLDER_NAME" />" อยู่แล้ว โปรดเลือกชื่ออื่น</translation>
 <translation id="4215448920900139318">กำลังสำรอง <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">เปิดการตั้งค่า</translation>
 <translation id="426015154560005552">แป้นพิมพ์อาหรับ</translation>
 <translation id="4261901459838235729">งานนำเสนอของ Google</translation>
 <translation id="4290535918735525311">แชร์กับ Linux แล้ว 1 โฟลเดอร์</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">เกาหลี</translation>
 <translation id="5819442873484330149">ฮังกูลแบบ 3 ชุด (สุดท้าย)</translation>
 <translation id="5833610766403489739">ไฟล์นี้ไม่อยู่ในตำแหน่งที่กำหนดไว้ โปรดตรวจสอบการตั้งค่าตำแหน่งที่เก็บไฟล์ดาวน์โหลดและลองอีกครั้ง</translation>
-<translation id="5838051104334203064">แอปพลิเคชันใน Play Store จะเข้าถึงอุปกรณ์นี้ไม่ได้</translation>
 <translation id="5838451609423551646">นำรายการทั้งหมดออกจากรายการที่เลือกไว้</translation>
 <translation id="5838825566232597749">Workman สหรัฐฯ แบบสากล</translation>
 <translation id="5850516540536751549">ไม่สนับสนุนไฟล์ประเภทนี้ โปรดไปที่ <ph name="BEGIN_LINK" />Chrome เว็บสโตร์<ph name="END_LINK" />เพื่อหาแอปที่สามารถเปิดไฟล์ประเภทนี้
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
index 4b8087c4..d4afbbb 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Bu dosyaya erişebilmek için çevrimiçi olmalısınız.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" adlı klasör zaten var. Lütfen farklı bir ad seçin.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> yedekleniyor</translation>
-<translation id="4242533952199664413">Ayarları aç</translation>
 <translation id="426015154560005552">Arapça klavye</translation>
 <translation id="4261901459838235729">Google sunusu</translation>
 <translation id="4290535918735525311">Linux ile 1 klasör paylaşılıyor</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Korece</translation>
 <translation id="5819442873484330149">Hangul 3 Grubu (Son)</translation>
 <translation id="5833610766403489739">Bu dosya başka bir yere gitti. Lütfen indirilenler için konum ayarınızı kontrol edin ve tekrar deneyin.</translation>
-<translation id="5838051104334203064">Play Store uygulamaları bu cihaza erişemez</translation>
 <translation id="5838451609423551646">Tüm girişler seçimden kaldırıldı.</translation>
 <translation id="5838825566232597749">ABD Workman uluslararası</translation>
 <translation id="5850516540536751549">Bu dosya türü desteklenmiyor. Bu dosya türünü açabilecek bir uygulama bulmak için lütfen <ph name="BEGIN_LINK" />Chrome Web Mağazası<ph name="END_LINK" />'nı ziyaret edin.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
index 01d7513..7115309 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Щоб отримати доступ до цього файлу, потрібно перебувати в режимі онлайн.</translation>
 <translation id="4212740939091998969">Папка з назвою "<ph name="FOLDER_NAME" />" уже існує. Укажіть іншу назву.</translation>
 <translation id="4215448920900139318">Створюється резервна копія: <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Відкрити налаштування</translation>
 <translation id="426015154560005552">Арабська клавіатура</translation>
 <translation id="4261901459838235729">Презентація Google</translation>
 <translation id="4290535918735525311">Linux має доступ до 1 папки</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Корейська</translation>
 <translation id="5819442873484330149">Клавіатура хангул із 3 наборами клавіш (остаточна)</translation>
 <translation id="5833610766403489739">Файл загубився. Перевірте налаштування папки завантаження та повторіть спробу.</translation>
-<translation id="5838051104334203064">Додатки з Google Play не мають доступу до цього пристрою</translation>
 <translation id="5838451609423551646">З вибраного видалено всі записи.</translation>
 <translation id="5838825566232597749">US Workman, міжнародна</translation>
 <translation id="5850516540536751549">Цей тип файлу не підтримується. Відвідайте <ph name="BEGIN_LINK" />Веб-магазин Chrome<ph name="END_LINK" />, щоб знайти додаток, який може відкрити файл цього типу.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
index d8cdbc0..b54fda1 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">Bạn phải trực tuyến để truy cập tệp này.</translation>
 <translation id="4212740939091998969">Thư mục có tên "<ph name="FOLDER_NAME" />" đã tồn tại. Hãy chọn một tên khác.</translation>
 <translation id="4215448920900139318">Đang sao lưu <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">Mở phần cài đặt</translation>
 <translation id="426015154560005552">Bàn phím tiếng Ả Rập</translation>
 <translation id="4261901459838235729">Bản trình bày Google</translation>
 <translation id="4290535918735525311">Đã chia sẻ 1 thư mục với Linux</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">Tiếng Hàn</translation>
 <translation id="5819442873484330149">Hangul 3 bộ (Cuối cùng)</translation>
 <translation id="5833610766403489739">Tệp này đã thất lạc ở đâu đó. Vui lòng kiểm tra cài đặt vị trí tải xuống của bạn và thử lại.</translation>
-<translation id="5838051104334203064">Các ứng dụng trên Cửa hàng Play không thể truy cập vào thiết bị này</translation>
 <translation id="5838451609423551646">Đã xóa tất cả các mục khỏi lựa chọn.</translation>
 <translation id="5838825566232597749">Bàn phím quốc tế Workman Hoa Kỳ</translation>
 <translation id="5850516540536751549">Loại tệp này không được hỗ trợ. Vui lòng truy cập <ph name="BEGIN_LINK" />Cửa hàng Chrome trực tuyến<ph name="END_LINK" /> để tìm ứng dụng có thể mở loại tệp này.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
index 79a983c..3938267 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">您必须在线访问此文件。</translation>
 <translation id="4212740939091998969">已有名为“<ph name="FOLDER_NAME" />”的文件夹。请另选一个名称。</translation>
 <translation id="4215448920900139318">正在备份 <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">打开“设置”</translation>
 <translation id="426015154560005552">阿拉伯语键盘</translation>
 <translation id="4261901459838235729">Google 演示文稿</translation>
 <translation id="4290535918735525311">与 Linux 共享了 1 个文件夹</translation>
@@ -418,7 +417,6 @@
 <translation id="5818003990515275822">韩语</translation>
 <translation id="5819442873484330149">韩语(3 Set,终极版)</translation>
 <translation id="5833610766403489739">此文件已移至其他位置。请查看您的下载位置设置并重试。</translation>
-<translation id="5838051104334203064">Play 商店应用无法访问此设备</translation>
 <translation id="5838451609423551646">已取消选择所有条目。</translation>
 <translation id="5838825566232597749">美式 Workman 国际</translation>
 <translation id="5850516540536751549">不支持此文件类型。请在<ph name="BEGIN_LINK" />Chrome网上应用店<ph name="END_LINK" />中查找可打开此类文件的应用。
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
index d1a89d2a..f2ffb742 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -267,7 +267,6 @@
 <translation id="421017592316736757">你必須連上網路才能存取這個檔案。</translation>
 <translation id="4212740939091998969">名稱為「<ph name="FOLDER_NAME" />」的資料夾已經存在,請選擇其他名稱。</translation>
 <translation id="4215448920900139318">正在備份 <ph name="FILE_COUNT" /></translation>
-<translation id="4242533952199664413">開啟設定</translation>
 <translation id="426015154560005552">阿拉伯文鍵盤</translation>
 <translation id="4261901459838235729">Google 簡報</translation>
 <translation id="4290535918735525311">已與 Linux 共用 1 個資料夾</translation>
@@ -423,7 +422,6 @@
 <translation id="5818003990515275822">韓文</translation>
 <translation id="5819442873484330149">韓文 3 Set (Final)</translation>
 <translation id="5833610766403489739">這個檔案不見了!請檢查你的下載位置設定,然後再試一次。</translation>
-<translation id="5838051104334203064">Play 商店應用程式無法存取這個裝置</translation>
 <translation id="5838451609423551646">從所選範圍中移除所有項目。</translation>
 <translation id="5838825566232597749">美式 Workman 國際</translation>
 <translation id="5850516540536751549">系統不支援這個檔案類型。請造訪 <ph name="BEGIN_LINK" />Chrome 線上應用程式商店<ph name="END_LINK" />,尋找是否有可開啟這類檔案的應用程式。
diff --git a/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc b/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
index a644cd92..ec3a3aa 100644
--- a/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
+++ b/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
@@ -128,8 +128,8 @@
     dispatched_events_.push_back(std::move(cloned_event));
   }
 
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::MainThreadType::UI};
+  base::test::SingleThreadTaskEnvironment task_environment_{
+      base::test::SingleThreadTaskEnvironment::MainThreadType::UI};
   std::unique_ptr<ui::FakeCursorDelegateEvdev> cursor_;
   std::unique_ptr<ui::DeviceManager> device_manager_;
   std::unique_ptr<ui::EventFactoryEvdev> event_factory_;
diff --git a/ui/events/ozone/evdev/input_injector_evdev_unittest.cc b/ui/events/ozone/evdev/input_injector_evdev_unittest.cc
index 36061b4..7fc99eb 100644
--- a/ui/events/ozone/evdev/input_injector_evdev_unittest.cc
+++ b/ui/events/ozone/evdev/input_injector_evdev_unittest.cc
@@ -88,7 +88,7 @@
 
   InputInjectorEvdev injector_;
 
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   base::RunLoop run_loop_;
 
  private:
diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
index 7bc3a88..37ef774 100644
--- a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
+++ b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
@@ -304,8 +304,8 @@
   base::HistogramTester histogram_tester_;
 
  private:
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::MainThreadType::UI};
+  base::test::SingleThreadTaskEnvironment task_environment_{
+      base::test::SingleThreadTaskEnvironment::MainThreadType::UI};
   std::unique_ptr<ui::MockTouchEventConverterEvdev> device_;
   std::unique_ptr<ui::MockDeviceEventDispatcherEvdev> dispatcher_;
   std::unique_ptr<ui::test::ScopedEventTestTickClock> test_clock_;
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 79015696..5f79116 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -231,7 +231,7 @@
 }
 
 // TODO(crbug.com/965991): Use ui::Event in Aura/X11
-#if !defined(USE_X11)
+#if defined(USE_OZONE)
 void X11EventSource::RemoveXEventDispatcher(XEventDispatcher* dispatcher) {
   delegate_->RemoveXEventDispatcher(dispatcher);
 }
@@ -239,6 +239,23 @@
 void X11EventSource::AddXEventDispatcher(XEventDispatcher* dispatcher) {
   delegate_->AddXEventDispatcher(dispatcher);
 }
+
+void X11EventSource::AddXEventObserver(XEventObserver* observer) {
+  delegate_->AddXEventObserver(observer);
+}
+
+void X11EventSource::RemoveXEventObserver(XEventObserver* observer) {
+  delegate_->RemoveXEventObserver(observer);
+}
+
+std::unique_ptr<ScopedXEventDispatcher>
+X11EventSource::OverrideXEventDispatcher(XEventDispatcher* dispatcher) {
+  return delegate_->OverrideXEventDispatcher(dispatcher);
+}
+
+void X11EventSource::RestoreOverridenXEventDispatcher() {
+  delegate_->RestoreOverridenXEventDispatcher();
+}
 #endif
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -306,4 +323,18 @@
   }
 }
 
+// ScopedXEventDispatcher implementation
+ScopedXEventDispatcher::ScopedXEventDispatcher(
+    XEventDispatcher** scoped_dispatcher,
+    XEventDispatcher* new_dispatcher)
+    : original_(*scoped_dispatcher),
+      restore_(scoped_dispatcher, new_dispatcher) {}
+
+ScopedXEventDispatcher::~ScopedXEventDispatcher() {
+  DCHECK(X11EventSource::HasInstance());
+#if defined(USE_OZONE)
+  X11EventSource::GetInstance()->RestoreOverridenXEventDispatcher();
+#endif
+}
+
 }  // namespace ui
diff --git a/ui/events/platform/x11/x11_event_source.h b/ui/events/platform/x11/x11_event_source.h
index a655cc82..427cfac3 100644
--- a/ui/events/platform/x11/x11_event_source.h
+++ b/ui/events/platform/x11/x11_event_source.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <random>
 
+#include "base/auto_reset.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "ui/events/events_export.h"
@@ -29,6 +30,7 @@
 class X11HotplugEventHandler;
 class XScopedEventSelector;
 class PlatformEventDispatcher;
+class ScopedXEventDispatcher;
 
 // The XEventDispatcher interface is used in two different ways: the first is
 // when classes want to receive XEvent directly and second is to say if classes,
@@ -61,6 +63,20 @@
   virtual ~XEventDispatcher() {}
 };
 
+// XEventObserver can be installed on a X11EventSource, and it
+// receives all events that are dispatched to the dispatchers.
+class EVENTS_EXPORT XEventObserver {
+ public:
+  // Called before the dispatchers receive the event.
+  virtual void WillProcessXEvent(XEvent* event) = 0;
+
+  // Called after the event has been dispatched.
+  virtual void DidProcessXEvent(XEvent* event) = 0;
+
+ protected:
+  virtual ~XEventObserver() {}
+};
+
 // Responsible for notifying X11EventSource when new XEvents are available and
 // processing/dispatching XEvents. Implementations will likely be a
 // PlatformEventSource.
@@ -73,15 +89,40 @@
   virtual void ProcessXEvent(XEvent* xevent) = 0;
 
   // TODO(crbug.com/965991): Use ui::Event in Aura/X11
-#if !defined(USE_X11)
+#if defined(USE_OZONE)
   virtual void AddXEventDispatcher(XEventDispatcher* dispatcher) = 0;
   virtual void RemoveXEventDispatcher(XEventDispatcher* dispatcher) = 0;
+  virtual void AddXEventObserver(XEventObserver* observer) = 0;
+  virtual void RemoveXEventObserver(XEventObserver* observer) = 0;
+  virtual std::unique_ptr<ScopedXEventDispatcher> OverrideXEventDispatcher(
+      XEventDispatcher* dispatcher) = 0;
+  virtual void RestoreOverridenXEventDispatcher() = 0;
 #endif
 
  private:
   DISALLOW_COPY_AND_ASSIGN(X11EventSourceDelegate);
 };
 
+// A temporary XEventDispatcher can be installed on a X11EventSource that
+// overrides all installed event dispatchers, and always gets a chance to
+// dispatch the event first, similar to what PlatformEventSource does with
+// ScopedEventDispatcher. When this object is destroyed, it removes the
+// override-dispatcher, and restores the previous override-dispatcher.
+class EVENTS_EXPORT ScopedXEventDispatcher {
+ public:
+  ScopedXEventDispatcher(XEventDispatcher** scoped_dispatcher,
+                         XEventDispatcher* new_dispatcher);
+  ~ScopedXEventDispatcher();
+
+  operator XEventDispatcher*() const { return original_; }
+
+ private:
+  XEventDispatcher* original_;
+  base::AutoReset<XEventDispatcher*> restore_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedXEventDispatcher);
+};
+
 // Receives X11 events and sends them to X11EventSourceDelegate. Handles
 // receiving, pre-process and post-processing XEvents.
 class EVENTS_EXPORT X11EventSource {
@@ -120,7 +161,7 @@
   Time GetCurrentServerTime();
 
 // TODO(crbug.com/965991): Use ui::Event in Aura/X11
-#if !defined(USE_X11)
+#if defined(USE_OZONE)
   // Adds a XEvent dispatcher to the XEvent dispatcher list.
   // Also calls XEventDispatcher::GetPlatformEventDispatcher
   // to explicitly add this |dispatcher| to a list of PlatformEventDispatchers
@@ -136,6 +177,18 @@
   // Also explicitly removes an XEventDispatcher from a PlatformEventDispatcher
   // list if the XEventDispatcher has a PlatformEventDispatcher.
   void RemoveXEventDispatcher(XEventDispatcher* dispatcher);
+
+  void AddXEventObserver(XEventObserver* observer);
+  void RemoveXEventObserver(XEventObserver* observer);
+
+  // Installs a XEventDispatcher that receives all the events. The dispatcher
+  // can process the event, or request that the default dispatchers be invoked
+  // by returning false from its DispatchXEvent() override. The returned
+  // ScopedXEventDispatcher object is a handler for the overridden dispatcher.
+  // When this handler is destroyed, it removes the overridden dispatcher, and
+  // restores the previous override-dispatcher (or null if there wasn't any).
+  std::unique_ptr<ScopedXEventDispatcher> OverrideXEventDispatcher(
+      XEventDispatcher* dispatcher);
 #endif
 
  protected:
@@ -148,6 +201,10 @@
   void PostDispatchEvent(XEvent* xevent);
 
  private:
+  friend class ScopedXEventDispatcher;
+
+  void RestoreOverridenXEventDispatcher();
+
   static X11EventSource* instance_;
 
   X11EventSourceDelegate* delegate_;
diff --git a/ui/events/platform/x11/x11_event_source_default.cc b/ui/events/platform/x11/x11_event_source_default.cc
index 7e8aa51c..0311614 100644
--- a/ui/events/platform/x11/x11_event_source_default.cc
+++ b/ui/events/platform/x11/x11_event_source_default.cc
@@ -174,6 +174,29 @@
     RemovePlatformEventDispatcher(event_dispatcher);
 }
 
+void X11EventSourceDefault::AddXEventObserver(XEventObserver* observer) {
+  CHECK(observer);
+  observers_.AddObserver(observer);
+}
+
+void X11EventSourceDefault::RemoveXEventObserver(XEventObserver* observer) {
+  CHECK(observer);
+  observers_.RemoveObserver(observer);
+}
+
+std::unique_ptr<ScopedXEventDispatcher>
+X11EventSourceDefault::OverrideXEventDispatcher(XEventDispatcher* dispatcher) {
+  CHECK(dispatcher);
+  overridden_dispatcher_restored_ = false;
+  return std::make_unique<ScopedXEventDispatcher>(&overridden_dispatcher_,
+                                                  dispatcher);
+}
+
+void X11EventSourceDefault::RestoreOverridenXEventDispatcher() {
+  CHECK(overridden_dispatcher_);
+  overridden_dispatcher_restored_ = true;
+}
+
 void X11EventSourceDefault::ProcessXEvent(XEvent* xevent) {
   std::unique_ptr<ui::Event> translated_event = TranslateXEventToEvent(*xevent);
   if (translated_event) {
@@ -205,13 +228,12 @@
 
 void X11EventSourceDefault::DispatchPlatformEvent(const PlatformEvent& event,
                                                   XEvent* xevent) {
-  // First, tell the XEventDispatchers, which can have
-  // PlatformEventDispatcher, an ui::Event is going to be sent next.
-  // It must make a promise to handle next translated |event| sent by
-  // PlatformEventSource based on a XID in |xevent| tested in
-  // CheckCanDispatchNextPlatformEvent(). This is needed because it is not
-  // possible to access |event|'s associated NativeEvent* and check if it is the
-  // event's target window (XID).
+  // First, tell the XEventDispatchers, which can have PlatformEventDispatcher,
+  // an ui::Event is going to be sent next. It must make a promise to handle
+  // next translated |event| sent by PlatformEventSource based on a XID in
+  // |xevent| tested in CheckCanDispatchNextPlatformEvent(). This is needed
+  // because it is not possible to access |event|'s associated NativeEvent* and
+  // check if it is the event's target window (XID).
   for (XEventDispatcher& dispatcher : dispatchers_xevent_)
     dispatcher.CheckCanDispatchNextPlatformEvent(xevent);
 
@@ -223,10 +245,34 @@
 }
 
 void X11EventSourceDefault::DispatchXEventToXEventDispatchers(XEvent* xevent) {
-  for (XEventDispatcher& dispatcher : dispatchers_xevent_) {
-    if (dispatcher.DispatchXEvent(xevent))
-      break;
+  bool stop_dispatching = false;
+
+  for (auto& observer : observers_)
+    observer.WillProcessXEvent(xevent);
+
+  if (overridden_dispatcher_) {
+    stop_dispatching = overridden_dispatcher_->DispatchXEvent(xevent);
   }
+
+  if (!stop_dispatching) {
+    for (XEventDispatcher& dispatcher : dispatchers_xevent_) {
+      if (dispatcher.DispatchXEvent(xevent))
+        break;
+    }
+  }
+
+  for (auto& observer : observers_)
+    observer.DidProcessXEvent(xevent);
+
+  // If an overridden dispatcher has been destroyed, then the event source
+  // should halt dispatching the current stream of events, and wait until the
+  // next message-loop iteration for dispatching events. This lets any nested
+  // message-loop to unwind correctly and any new dispatchers to receive the
+  // correct sequence of events.
+  if (overridden_dispatcher_restored_)
+    StopCurrentEventStream();
+
+  overridden_dispatcher_restored_ = false;
 }
 
 void X11EventSourceDefault::StopCurrentEventStream() {
diff --git a/ui/events/platform/x11/x11_event_source_default.h b/ui/events/platform/x11/x11_event_source_default.h
index 58def8a..af0a7a73 100644
--- a/ui/events/platform/x11/x11_event_source_default.h
+++ b/ui/events/platform/x11/x11_event_source_default.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "base/message_loop/message_pump_for_ui.h"
+#include "base/observer_list.h"
 #include "ui/events/events_export.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/platform/x11/x11_event_source.h"
@@ -31,6 +32,11 @@
   void ProcessXEvent(XEvent* xevent) override;
   void AddXEventDispatcher(XEventDispatcher* dispatcher) override;
   void RemoveXEventDispatcher(XEventDispatcher* dispatcher) override;
+  void AddXEventObserver(XEventObserver* observer) override;
+  void RemoveXEventObserver(XEventObserver* observer) override;
+  std::unique_ptr<ScopedXEventDispatcher> OverrideXEventDispatcher(
+      XEventDispatcher* dispatcher) override;
+  void RestoreOverridenXEventDispatcher() override;
 
  private:
   // Registers event watcher with Libevent.
@@ -61,6 +67,11 @@
   base::MessagePumpForUI::FdWatchController watcher_controller_;
   bool initialized_ = false;
 
+  base::ObserverList<XEventObserver>::Unchecked observers_;
+
+  XEventDispatcher* overridden_dispatcher_ = nullptr;
+  bool overridden_dispatcher_restored_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(X11EventSourceDefault);
 };
 
diff --git a/ui/gfx/animation/multi_animation.cc b/ui/gfx/animation/multi_animation.cc
index 4ecc73c..0a146fa 100644
--- a/ui/gfx/animation/multi_animation.cc
+++ b/ui/gfx/animation/multi_animation.cc
@@ -4,40 +4,37 @@
 
 #include "ui/gfx/animation/multi_animation.h"
 
+#include <numeric>
+
 #include "base/logging.h"
 #include "ui/gfx/animation/animation_delegate.h"
 
 namespace gfx {
 
-// Default interval, in ms.
-static const int kDefaultTimerInterval = 20;
-
-static int TotalTime(const MultiAnimation::Parts& parts) {
-  int time_ms = 0;
-  for (size_t i = 0; i < parts.size(); ++i) {
-    DCHECK(parts[i].end_time_ms - parts[i].start_time_ms >= parts[i].time_ms);
-    time_ms += parts[i].time_ms;
-  }
-  return time_ms;
+static base::TimeDelta TotalTime(const MultiAnimation::Parts& parts) {
+  return std::accumulate(parts.cbegin(), parts.cend(), base::TimeDelta(),
+                         [](base::TimeDelta total, const auto& part) {
+                           return total + part.part_length;
+                         });
 }
 
+// static
+constexpr base::TimeDelta MultiAnimation::kDefaultTimerInterval;
+
 MultiAnimation::MultiAnimation(const Parts& parts,
                                base::TimeDelta timer_interval)
     : Animation(timer_interval),
       parts_(parts),
-      cycle_time_ms_(TotalTime(parts)),
+      cycle_time_(TotalTime(parts)),
       current_value_(0),
       current_part_index_(0),
       continuous_(true) {
   DCHECK(!parts_.empty());
+  for (const auto& part : parts)
+    DCHECK_GE(part.total_length - part.part_start, part.part_length);
 }
 
-MultiAnimation::~MultiAnimation() {}
-
-// static.
-base::TimeDelta MultiAnimation::GetDefaultTimerInterval() {
-  return base::TimeDelta::FromMilliseconds(kDefaultTimerInterval);
-}
+MultiAnimation::~MultiAnimation() = default;
 
 double MultiAnimation::GetCurrentValue() const {
   return current_value_;
@@ -47,18 +44,18 @@
   double last_value = current_value_;
   size_t last_index = current_part_index_;
 
-  int delta = static_cast<int>((time_now - start_time()).InMilliseconds());
-  if (delta >= cycle_time_ms_ && !continuous_) {
+  base::TimeDelta delta = time_now - start_time();
+  if (delta >= cycle_time_ && !continuous_) {
     current_part_index_ = parts_.size() - 1;
     current_value_ = Tween::CalculateValue(parts_[current_part_index_].type, 1);
     Stop();
     return;
   }
-  delta %= cycle_time_ms_;
+  delta %= cycle_time_;
   const Part& part = GetPart(&delta, &current_part_index_);
-  double percent = static_cast<double>(delta + part.start_time_ms) /
-        static_cast<double>(part.end_time_ms);
-  DCHECK(percent <= 1);
+  double percent = (delta + part.part_start).InMillisecondsF() /
+                   part.total_length.InMillisecondsF();
+  DCHECK_LE(percent, 1);
   current_value_ = Tween::CalculateValue(part.type, percent);
 
   if ((current_value_ != last_value || current_part_index_ != last_index) &&
@@ -73,21 +70,19 @@
   current_part_index_ = 0;
 }
 
-const MultiAnimation::Part& MultiAnimation::GetPart(int* time_ms,
+const MultiAnimation::Part& MultiAnimation::GetPart(base::TimeDelta* time,
                                                     size_t* part_index) {
-  DCHECK(*time_ms < cycle_time_ms_);
+  DCHECK_LT(*time, cycle_time_);
 
   for (size_t i = 0; i < parts_.size(); ++i) {
-    if (*time_ms < parts_[i].time_ms) {
+    if (*time < parts_[i].part_length) {
       *part_index = i;
       return parts_[i];
     }
 
-    *time_ms -= parts_[i].time_ms;
+    *time -= parts_[i].part_length;
   }
   NOTREACHED();
-  *time_ms = 0;
-  *part_index = 0;
   return parts_[0];
 }
 
diff --git a/ui/gfx/animation/multi_animation.h b/ui/gfx/animation/multi_animation.h
index 65e80247..8c578083 100644
--- a/ui/gfx/animation/multi_animation.h
+++ b/ui/gfx/animation/multi_animation.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/time/time.h"
 #include "ui/gfx/animation/animation.h"
 #include "ui/gfx/animation/tween.h"
 
@@ -23,38 +24,41 @@
  public:
   // Defines part of the animation. Each part consists of the following:
   //
-  // time_ms: the time of the part.
-  // start_time_ms: the amount of time to offset this part by when calculating
-  // the percented completed.
-  // end_time_ms: the end time used to calculate the percentange completed.
+  // part_length: the length of time the part runs.
+  // part_start: the amount of time to offset this part by when calculating the
+  // initial percentage.
+  // total_length: the total length used to calculate the percentange completed.
   //
-  // In most cases |start_time_ms| = 0 and |end_time_ms| = |time_ms|. But you
-  // can adjust the start/end for different effects. For example, to run a part
-  // for 200ms with a % between .25 and .75 use the following three values: 200,
-  // 100, 400.
+  // In most cases |part_start| is empty and |total_length| = |part_length|. But
+  // you can adjust the start/total for different effects. For example, to run a
+  // part for 200ms with a % between .25 and .75 use the following three values:
+  // part_length = 200, part_start = 100, total_length = 400.
   struct Part {
-    Part() : Part(0, Tween::ZERO) {}
-    Part(int time_ms, Tween::Type type) : Part(time_ms, 0, time_ms, type) {}
-    Part(int time_ms, int start_time_ms, int end_time_ms, Tween::Type type)
-        : time_ms(time_ms),
-          start_time_ms(start_time_ms),
-          end_time_ms(end_time_ms),
+    Part() : Part(base::TimeDelta(), Tween::ZERO) {}
+    Part(base::TimeDelta part_length, Tween::Type type)
+        : Part(part_length, base::TimeDelta(), part_length, type) {}
+    Part(base::TimeDelta part_length,
+         base::TimeDelta part_start,
+         base::TimeDelta total_length,
+         Tween::Type type)
+        : part_length(part_length),
+          part_start(part_start),
+          total_length(total_length),
           type(type) {}
 
-    int time_ms;
-    int start_time_ms;
-    int end_time_ms;
+    base::TimeDelta part_length;
+    base::TimeDelta part_start;
+    base::TimeDelta total_length;
     Tween::Type type;
   };
+  using Parts = std::vector<Part>;
 
-  typedef std::vector<Part> Parts;
+  static constexpr auto kDefaultTimerInterval =
+      base::TimeDelta::FromMilliseconds(20);
 
   MultiAnimation(const Parts& parts, base::TimeDelta timer_interval);
   ~MultiAnimation() override;
 
-  // Default interval.
-  static base::TimeDelta GetDefaultTimerInterval();
-
   // Sets whether the animation continues after it reaches the end. If true, the
   // animation runs until explicitly stopped. The default is true.
   void set_continuous(bool continuous) { continuous_ = continuous; }
@@ -72,16 +76,16 @@
   void SetStartTime(base::TimeTicks start_time) override;
 
  private:
-  // Returns the part containing the specified time. |time_ms| is reset to be
+  // Returns the part containing the specified time. |time| is reset to be
   // relative to the part containing the time and |part_index| the index of the
   // part.
-  const Part& GetPart(int* time_ms, size_t* part_index);
+  const Part& GetPart(base::TimeDelta* time, size_t* part_index);
 
   // The parts that make up the animation.
   const Parts parts_;
 
   // Total time of all the parts.
-  const int cycle_time_ms_;
+  const base::TimeDelta cycle_time_;
 
   // Current value for the animation.
   double current_value_;
diff --git a/ui/gfx/animation/multi_animation_unittest.cc b/ui/gfx/animation/multi_animation_unittest.cc
index f8bff9a0f..3d4e40d5 100644
--- a/ui/gfx/animation/multi_animation_unittest.cc
+++ b/ui/gfx/animation/multi_animation_unittest.cc
@@ -12,10 +12,12 @@
 TEST(MultiAnimationTest, Basic) {
   // Create a MultiAnimation with two parts.
   MultiAnimation::Parts parts;
-  parts.push_back(MultiAnimation::Part(100, Tween::LINEAR));
-  parts.push_back(MultiAnimation::Part(100, Tween::EASE_OUT));
+  parts.push_back(MultiAnimation::Part(base::TimeDelta::FromMilliseconds(100),
+                                       Tween::LINEAR));
+  parts.push_back(MultiAnimation::Part(base::TimeDelta::FromMilliseconds(100),
+                                       Tween::EASE_OUT));
 
-  MultiAnimation animation(parts, MultiAnimation::GetDefaultTimerInterval());
+  MultiAnimation animation(parts, MultiAnimation::kDefaultTimerInterval);
   AnimationContainerElement* as_element =
       static_cast<AnimationContainerElement*>(&animation);
   as_element->SetStartTime(base::TimeTicks());
@@ -40,9 +42,12 @@
 TEST(MultiAnimationTest, DifferingStartAndEnd) {
   // Create a MultiAnimation with two parts.
   MultiAnimation::Parts parts;
-  parts.push_back(MultiAnimation::Part(200, 100, 400, Tween::LINEAR));
+  parts.push_back(MultiAnimation::Part(base::TimeDelta::FromMilliseconds(200),
+                                       base::TimeDelta::FromMilliseconds(100),
+                                       base::TimeDelta::FromMilliseconds(400),
+                                       Tween::LINEAR));
 
-  MultiAnimation animation(parts, MultiAnimation::GetDefaultTimerInterval());
+  MultiAnimation animation(parts, MultiAnimation::kDefaultTimerInterval);
   AnimationContainerElement* as_element =
       static_cast<AnimationContainerElement*>(&animation);
   as_element->SetStartTime(base::TimeTicks());
@@ -60,8 +65,9 @@
 // Makes sure multi-animation stops if cycles is false.
 TEST(MultiAnimationTest, DontCycle) {
   MultiAnimation::Parts parts;
-  parts.push_back(MultiAnimation::Part(200, Tween::LINEAR));
-  MultiAnimation animation(parts, MultiAnimation::GetDefaultTimerInterval());
+  parts.push_back(MultiAnimation::Part(base::TimeDelta::FromMilliseconds(200),
+                                       Tween::LINEAR));
+  MultiAnimation animation(parts, MultiAnimation::kDefaultTimerInterval);
   AnimationContainerElement* as_element =
       static_cast<AnimationContainerElement*>(&animation);
   as_element->SetStartTime(base::TimeTicks());
@@ -76,8 +82,9 @@
 // Makes sure multi-animation cycles correctly.
 TEST(MultiAnimationTest, Cycle) {
   MultiAnimation::Parts parts;
-  parts.push_back(MultiAnimation::Part(200, Tween::LINEAR));
-  MultiAnimation animation(parts, MultiAnimation::GetDefaultTimerInterval());
+  parts.push_back(MultiAnimation::Part(base::TimeDelta::FromMilliseconds(200),
+                                       Tween::LINEAR));
+  MultiAnimation animation(parts, MultiAnimation::kDefaultTimerInterval);
   AnimationContainerElement* as_element =
       static_cast<AnimationContainerElement*>(&animation);
   as_element->SetStartTime(base::TimeTicks());
diff --git a/ui/gl/gl_fence_android_native_fence_sync.cc b/ui/gl/gl_fence_android_native_fence_sync.cc
index d0b087ff1..c59e65e 100644
--- a/ui/gl/gl_fence_android_native_fence_sync.cc
+++ b/ui/gl/gl_fence_android_native_fence_sync.cc
@@ -97,6 +97,9 @@
   }
 
   const bool signaled = info->status == 1;
+  if (!signaled)
+    return Status::kNotSignaled;
+
   struct sync_pt_info* pt_info = nullptr;
   uint64_t timestamp_ns = 0u;
   while ((pt_info = sync_pt_info(info.get(), pt_info)))
@@ -108,7 +111,7 @@
   }
 
   *time = base::TimeTicks() + base::TimeDelta::FromNanoseconds(timestamp_ns);
-  return signaled ? Status::kSignaled : Status::kNotSignaled;
+  return Status::kSignaled;
 }
 
 }  // namespace gl
diff --git a/ui/gl/gl_utils.cc b/ui/gl/gl_utils.cc
index 62589b4..697cbed 100644
--- a/ui/gl/gl_utils.cc
+++ b/ui/gl/gl_utils.cc
@@ -6,6 +6,7 @@
 
 #include "ui/gl/gl_utils.h"
 
+#include "base/debug/alias.h"
 #include "base/logging.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_features.h"
@@ -27,6 +28,24 @@
   *it_s_the_end_of_the_world_as_we_know_it = 0xdead;
 }
 
+// Used by chrome://gpuhang.
+void Hang() {
+  DVLOG(1) << "GPU: Simulating GPU hang";
+  int do_not_delete_me = 0;
+  for (;;) {
+    // Do not sleep here. The GPU watchdog timer tracks
+    // the amount of user time this thread is using and
+    // it doesn't use much while calling Sleep.
+
+    // The following are multiple mechanisms to prevent compilers from
+    // optimizing out the endless loop. Hope at least one of them works.
+    base::debug::Alias(&do_not_delete_me);
+    ++do_not_delete_me;
+
+    __asm__ volatile("");
+  }
+}
+
 #if defined(OS_ANDROID)
 base::ScopedFD MergeFDs(base::ScopedFD a, base::ScopedFD b) {
   if (!a.is_valid())
diff --git a/ui/gl/gl_utils.h b/ui/gl/gl_utils.h
index 84303c6..9363085a 100644
--- a/ui/gl/gl_utils.h
+++ b/ui/gl/gl_utils.h
@@ -17,6 +17,7 @@
 
 namespace gl {
 GL_EXPORT void Crash();
+GL_EXPORT void Hang();
 
 #if defined(OS_ANDROID)
 GL_EXPORT base::ScopedFD MergeFDs(base::ScopedFD a, base::ScopedFD b);
diff --git a/ui/native_theme/caption_style.h b/ui/native_theme/caption_style.h
index 811a6dd..557578f 100644
--- a/ui/native_theme/caption_style.h
+++ b/ui/native_theme/caption_style.h
@@ -29,6 +29,11 @@
   // Returns a CaptionStyle populated from the System's Settings.
   static base::Optional<CaptionStyle> FromSystemSettings();
 
+  // Some or all of these property strings can be empty.
+  // For example, on Win10 in Settings when a property is set to Default, the
+  // corresponding string here stays empty. This allows the author styling on
+  // the webpage to be applied. As the user hasn't specified a preferred style,
+  // we pass along an empty string from here.
   std::string text_color;
   std::string background_color;
   // Holds text size percentage as a css string.
diff --git a/ui/native_theme/caption_style_win.cc b/ui/native_theme/caption_style_win.cc
index 7a734f6..3ab3e8f 100644
--- a/ui/native_theme/caption_style_win.cc
+++ b/ui/native_theme/caption_style_win.cc
@@ -69,7 +69,9 @@
       *css_font_variant = "small-caps";
       break;
     case ClosedCaptionStyle_Default:
-      *css_font_family = "";
+      // We shouldn't override with OS Styling for Default case.
+      NOTREACHED();
+      *css_font_family = std::string();
       break;
   }
 }
@@ -93,7 +95,9 @@
     case ClosedCaptionEdgeEffect_DropShadow:
       return "3px 3px 3px 2px black";
     case ClosedCaptionEdgeEffect_Default:
-      return "";
+      // We shouldn't override with OS Styling for Default case.
+      NOTREACHED();
+      return std::string();
   }
 }
 
@@ -110,7 +114,9 @@
     case ClosedCaptionSize_TwoHundredPercent:
       return "200%";
     case ClosedCaptionSize_Default:
-      return "";
+      // We shouldn't override with OS Styling for Default case.
+      NOTREACHED();
+      return std::string();
   }
 }
 
@@ -135,7 +141,9 @@
     case ClosedCaptionColor_White:
       return "white";
     case ClosedCaptionColor_Default:
-      return "";
+      // We shouldn't override with OS Styling for Default case.
+      NOTREACHED();
+      return std::string();
   }
 }
 
@@ -216,15 +224,28 @@
   }
 
   CaptionStyle caption_style;
-  GetFontFamilyString(font_family, &(caption_style.font_family),
-                      &(caption_style.font_variant));
-  caption_style.font_family = AddCSSImportant(caption_style.font_family);
-  caption_style.font_variant = AddCSSImportant(caption_style.font_variant);
-  caption_style.text_size = AddCSSImportant(GetCaptionSizeString(font_size));
-  caption_style.text_shadow = AddCSSImportant(GetEdgeEffectString(edge_effect));
-  caption_style.text_color = AddCSSImportant(GetCssColor(font_color));
-  caption_style.background_color =
-      AddCSSImportant(GetCssColor(background_color));
+  if (font_family != ClosedCaptionStyle_Default) {
+    GetFontFamilyString(font_family, &(caption_style.font_family),
+                        &(caption_style.font_variant));
+    caption_style.font_family = AddCSSImportant(caption_style.font_family);
+    caption_style.font_variant = AddCSSImportant(caption_style.font_variant);
+  }
+
+  if (font_size != ClosedCaptionSize_Default)
+    caption_style.text_size = AddCSSImportant(GetCaptionSizeString(font_size));
+
+  if (edge_effect != ClosedCaptionEdgeEffect_Default) {
+    caption_style.text_shadow =
+        AddCSSImportant(GetEdgeEffectString(edge_effect));
+  }
+
+  if (font_color != ClosedCaptionColor_Default)
+    caption_style.text_color = AddCSSImportant(GetCssColor(font_color));
+
+  if (background_color != ClosedCaptionColor_Default) {
+    caption_style.background_color =
+        AddCSSImportant(GetCssColor(background_color));
+  }
 
   return caption_style;
 }
diff --git a/ui/native_theme/caption_style_win_unittest.cc b/ui/native_theme/caption_style_win_unittest.cc
index 07fab21..34e0b50 100644
--- a/ui/native_theme/caption_style_win_unittest.cc
+++ b/ui/native_theme/caption_style_win_unittest.cc
@@ -24,11 +24,15 @@
 
     base::Optional<ui::CaptionStyle> caption_style =
         ui::CaptionStyle::FromSystemSettings();
-    // Other caption style properties can be empty and shouldn't be checked.
+    // On Windows out of the box, all caption style properties are set to
+    // Default. In which case, each of these should be empty.
     ASSERT_TRUE(caption_style.has_value());
-    EXPECT_TRUE(!caption_style->background_color.empty());
-    EXPECT_TRUE(!caption_style->text_color.empty());
-    EXPECT_TRUE(!caption_style->font_variant.empty());
+    EXPECT_TRUE(caption_style->background_color.empty());
+    EXPECT_TRUE(caption_style->font_family.empty());
+    EXPECT_TRUE(caption_style->font_variant.empty());
+    EXPECT_TRUE(caption_style->text_color.empty());
+    EXPECT_TRUE(caption_style->text_shadow.empty());
+    EXPECT_TRUE(caption_style->text_size.empty());
   }
 }
 
diff --git a/ui/ozone/platform/drm/host/drm_window_host.cc b/ui/ozone/platform/drm/host/drm_window_host.cc
index 4c5a1b2..2abe167 100644
--- a/ui/ozone/platform/drm/host/drm_window_host.cc
+++ b/ui/ozone/platform/drm/host/drm_window_host.cc
@@ -65,14 +65,11 @@
                                            : cursor_confined_bounds_;
 }
 
-void DrmWindowHost::Show() {
-}
+void DrmWindowHost::Show(bool inactive) {}
 
-void DrmWindowHost::Hide() {
-}
+void DrmWindowHost::Hide() {}
 
-void DrmWindowHost::Close() {
-}
+void DrmWindowHost::Close() {}
 
 void DrmWindowHost::PrepareForShutdown() {}
 
@@ -86,8 +83,7 @@
   return bounds_;
 }
 
-void DrmWindowHost::SetTitle(const base::string16& title) {
-}
+void DrmWindowHost::SetTitle(const base::string16& title) {}
 
 void DrmWindowHost::SetCapture() {
   window_manager_->GrabEvents(widget_);
@@ -101,17 +97,13 @@
   return widget_ == window_manager_->event_grabber();
 }
 
-void DrmWindowHost::ToggleFullscreen() {
-}
+void DrmWindowHost::ToggleFullscreen() {}
 
-void DrmWindowHost::Maximize() {
-}
+void DrmWindowHost::Maximize() {}
 
-void DrmWindowHost::Minimize() {
-}
+void DrmWindowHost::Minimize() {}
 
-void DrmWindowHost::Restore() {
-}
+void DrmWindowHost::Restore() {}
 
 PlatformWindowState DrmWindowHost::GetPlatformWindowState() const {
   return PlatformWindowState::kUnknown;
diff --git a/ui/ozone/platform/drm/host/drm_window_host.h b/ui/ozone/platform/drm/host/drm_window_host.h
index 2524f21..7601afa0 100644
--- a/ui/ozone/platform/drm/host/drm_window_host.h
+++ b/ui/ozone/platform/drm/host/drm_window_host.h
@@ -58,7 +58,7 @@
   gfx::Rect GetCursorConfinedBounds() const;
 
   // PlatformWindow:
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
@@ -101,7 +101,7 @@
   DrmWindowHostManager* const window_manager_;    // Not owned.
   DrmDisplayHostManager* const display_manager_;  // Not owned.
   // TODO(crbug.com/936425): Remove after VizDisplayCompositor feature launches.
-  DrmOverlayManager* const overlay_manager_;      // Not owned.
+  DrmOverlayManager* const overlay_manager_;  // Not owned.
 
   gfx::Rect bounds_;
   const gfx::AcceleratedWidget widget_;
diff --git a/ui/ozone/platform/scenic/scenic_window.cc b/ui/ozone/platform/scenic/scenic_window.cc
index b89d38b..502814f 100644
--- a/ui/ozone/platform/scenic/scenic_window.cc
+++ b/ui/ozone/platform/scenic/scenic_window.cc
@@ -84,7 +84,7 @@
   NOTIMPLEMENTED();
 }
 
-void ScenicWindow::Show() {
+void ScenicWindow::Show(bool inactive) {
   view_.AddChild(node_);
 
   // Call Present() to ensure that the scenic session commands are processed,
@@ -196,7 +196,6 @@
   delegate_->OnBoundsChanged(size_rect);
 }
 
-
 void ScenicWindow::OnScenicError(zx_status_t status) {
   LOG(ERROR) << "scenic::Session failed with code " << status << ".";
   delegate_->OnClosed();
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h
index 9376a08..b48d31c 100644
--- a/ui/ozone/platform/scenic/scenic_window.h
+++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -50,7 +50,7 @@
   gfx::Rect GetBounds() override;
   void SetBounds(const gfx::Rect& bounds) override;
   void SetTitle(const base::string16& title) override;
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc
index c5bc023..ac4d3a1 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -326,7 +326,7 @@
   connection_->StartDrag(data, operation);
 }
 
-void WaylandWindow::Show() {
+void WaylandWindow::Show(bool inactive) {
   if (!is_tooltip_)  // Tooltip windows should not get keyboard focus
     set_keyboard_focus(true);
 
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h
index 0548cbc..98ffa33 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -113,7 +113,7 @@
                  base::OnceCallback<void(int)> callback) override;
 
   // PlatformWindow
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
diff --git a/ui/platform_window/BUILD.gn b/ui/platform_window/BUILD.gn
index dea6ac2..37a3b3a 100644
--- a/ui/platform_window/BUILD.gn
+++ b/ui/platform_window/BUILD.gn
@@ -6,6 +6,7 @@
 
 source_set("platform_window") {
   sources = [
+    "platform_window.cc",
     "platform_window.h",
     "platform_window_delegate.h",
     "platform_window_delegate_base.cc",
diff --git a/ui/platform_window/platform_window.cc b/ui/platform_window/platform_window.cc
new file mode 100644
index 0000000..e42f8ce
--- /dev/null
+++ b/ui/platform_window/platform_window.cc
@@ -0,0 +1,19 @@
+// 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 "ui/platform_window/platform_window.h"
+
+namespace ui {
+
+PlatformWindow::PlatformWindow() = default;
+
+PlatformWindow::~PlatformWindow() = default;
+
+void PlatformWindow::SetZOrderLevel(ZOrderLevel order) {}
+
+ZOrderLevel PlatformWindow::GetZOrderLevel() const {
+  return ZOrderLevel::kNormal;
+}
+
+}  // namespace ui
diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h
index f78f718..0a173b7b 100644
--- a/ui/platform_window/platform_window.h
+++ b/ui/platform_window/platform_window.h
@@ -10,6 +10,7 @@
 #include "base/strings/string16.h"
 #include "ui/base/class_property.h"
 #include "ui/base/cursor/cursor.h"
+#include "ui/base/ui_base_types.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace gfx {
@@ -25,9 +26,13 @@
 // underlying platform windowing system (i.e. X11/Win/OSX).
 class PlatformWindow : public PropertyHandler {
  public:
-  ~PlatformWindow() override = default;
+  PlatformWindow();
+  ~PlatformWindow() override;
 
-  virtual void Show() = 0;
+  // PlatformWindow maybe called with the |inactive| set to true in some cases.
+  // That means that the Window Manager must not activate the window when it is
+  // shown. Most of PlatformWindow may ignore this value if not supported.
+  virtual void Show(bool inactive = false) = 0;
   virtual void Hide() = 0;
   virtual void Close() = 0;
 
@@ -74,6 +79,12 @@
   // Sets and gets the restored bounds of the platform-window.
   virtual void SetRestoredBoundsInPixels(const gfx::Rect& bounds) = 0;
   virtual gfx::Rect GetRestoredBoundsInPixels() const = 0;
+
+  // Sets and gets ZOrderLevel of the PlatformWindow. Such platforms that do not
+  // support ordering, should not implement these methods as the default
+  // implementation always returns ZOrderLevel::kNormal value.
+  virtual void SetZOrderLevel(ZOrderLevel order);
+  virtual ZOrderLevel GetZOrderLevel() const;
 };
 
 }  // namespace ui
diff --git a/ui/platform_window/stub/stub_window.cc b/ui/platform_window/stub/stub_window.cc
index 82d28c8..6ac9baa 100644
--- a/ui/platform_window/stub/stub_window.cc
+++ b/ui/platform_window/stub/stub_window.cc
@@ -20,7 +20,7 @@
 
 StubWindow::~StubWindow() {}
 
-void StubWindow::Show() {}
+void StubWindow::Show(bool inactive) {}
 
 void StubWindow::Hide() {}
 
diff --git a/ui/platform_window/stub/stub_window.h b/ui/platform_window/stub/stub_window.h
index 0574b19..5d1c7f1 100644
--- a/ui/platform_window/stub/stub_window.h
+++ b/ui/platform_window/stub/stub_window.h
@@ -28,7 +28,7 @@
 
  private:
   // PlatformWindow:
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc
index 548f56a1..9c34488 100644
--- a/ui/platform_window/win/win_window.cc
+++ b/ui/platform_window/win/win_window.cc
@@ -20,7 +20,8 @@
 
 bool use_popup_as_root_window_for_test = false;
 
-gfx::Rect GetWindowBoundsForClientBounds(DWORD style, DWORD ex_style,
+gfx::Rect GetWindowBoundsForClientBounds(DWORD style,
+                                         DWORD ex_style,
                                          const gfx::Rect& bounds) {
   RECT wr;
   wr.left = bounds.x();
@@ -31,8 +32,8 @@
 
   // Make sure to keep the window onscreen, as AdjustWindowRectEx() may have
   // moved part of it offscreen.
-  gfx::Rect window_bounds(wr.left, wr.top,
-                          wr.right - wr.left, wr.bottom - wr.top);
+  gfx::Rect window_bounds(wr.left, wr.top, wr.right - wr.left,
+                          wr.bottom - wr.top);
   window_bounds.set_x(std::max(0, window_bounds.x()));
   window_bounds.set_y(std::max(0, window_bounds.y()));
   return window_bounds;
@@ -54,16 +55,15 @@
   SetWindowText(hwnd(), L"WinWindow");
 }
 
-WinWindow::~WinWindow() {
-}
+WinWindow::~WinWindow() {}
 
 void WinWindow::Destroy() {
   if (IsWindow(hwnd()))
     DestroyWindow(hwnd());
 }
 
-void WinWindow::Show() {
-  ShowWindow(hwnd(), SW_SHOWNORMAL);
+void WinWindow::Show(bool inactive) {
+  ShowWindow(hwnd(), inactive ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL);
 }
 
 void WinWindow::Hide() {
@@ -78,8 +78,7 @@
 
 void WinWindow::SetBounds(const gfx::Rect& bounds) {
   gfx::Rect window_bounds = GetWindowBoundsForClientBounds(
-      GetWindowLong(hwnd(), GWL_STYLE),
-      GetWindowLong(hwnd(), GWL_EXSTYLE),
+      GetWindowLong(hwnd(), GWL_STYLE), GetWindowLong(hwnd(), GWL_EXSTYLE),
       bounds);
   unsigned int flags = SWP_NOREPOSITION;
   if (!::IsWindowVisible(hwnd()))
@@ -142,8 +141,7 @@
   ::SetCursorPos(location.x(), location.y());
 }
 
-void WinWindow::ConfineCursorToBounds(const gfx::Rect& bounds) {
-}
+void WinWindow::ConfineCursorToBounds(const gfx::Rect& bounds) {}
 
 void WinWindow::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {}
 
@@ -151,10 +149,22 @@
   return gfx::Rect();
 }
 
+void WinWindow::SetZOrderLevel(ZOrderLevel order) {
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
+ZOrderLevel WinWindow::GetZOrderLevel() const {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return ZOrderLevel::kNormal;
+}
+
 LRESULT WinWindow::OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param) {
-  MSG msg = { hwnd(), message, w_param, l_param,
-              static_cast<DWORD>(GetMessageTime()),
-              { CR_GET_X_LPARAM(l_param), CR_GET_Y_LPARAM(l_param) } };
+  MSG msg = {hwnd(),
+             message,
+             w_param,
+             l_param,
+             static_cast<DWORD>(GetMessageTime()),
+             {CR_GET_X_LPARAM(l_param), CR_GET_Y_LPARAM(l_param)}};
   std::unique_ptr<Event> event = EventFromNative(msg);
   if (IsMouseEventFromTouch(message))
     event->set_flags(event->flags() | EF_FROM_TOUCH);
@@ -172,7 +182,7 @@
 }
 
 LRESULT WinWindow::OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param) {
-  MSG msg = { hwnd(), message, w_param, l_param };
+  MSG msg = {hwnd(), message, w_param, l_param};
   KeyEvent event(msg);
   delegate_->DispatchEvent(&event);
   SetMsgHandled(event.handled());
@@ -207,13 +217,11 @@
 }
 
 void WinWindow::OnWindowPosChanged(WINDOWPOS* window_pos) {
-  if (!(window_pos->flags & SWP_NOSIZE) ||
-      !(window_pos->flags & SWP_NOMOVE)) {
+  if (!(window_pos->flags & SWP_NOSIZE) || !(window_pos->flags & SWP_NOMOVE)) {
     RECT cr;
     GetClientRect(hwnd(), &cr);
-    delegate_->OnBoundsChanged(
-        gfx::Rect(window_pos->x, window_pos->y,
-                  cr.right - cr.left, cr.bottom - cr.top));
+    delegate_->OnBoundsChanged(gfx::Rect(
+        window_pos->x, window_pos->y, cr.right - cr.left, cr.bottom - cr.top));
   }
 }
 
diff --git a/ui/platform_window/win/win_window.h b/ui/platform_window/win/win_window.h
index f74cddb0..2329a0d 100644
--- a/ui/platform_window/win/win_window.h
+++ b/ui/platform_window/win/win_window.h
@@ -27,7 +27,7 @@
   void Destroy();
 
   // PlatformWindow:
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
@@ -50,6 +50,8 @@
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
   gfx::Rect GetRestoredBoundsInPixels() const override;
+  void SetZOrderLevel(ZOrderLevel order) override;
+  ZOrderLevel GetZOrderLevel() const override;
 
   CR_BEGIN_MSG_MAP_EX(WinWindow)
     CR_MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
diff --git a/ui/platform_window/x11/DEPS b/ui/platform_window/x11/DEPS
index dace8ae..f9f62a1 100644
--- a/ui/platform_window/x11/DEPS
+++ b/ui/platform_window/x11/DEPS
@@ -3,4 +3,5 @@
   "+ui/base",
   "+ui/events",
   "+ui/gfx",
+  "+ui/display",
 ]
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc
index c181b69..86155e49 100644
--- a/ui/platform_window/x11/x11_window.cc
+++ b/ui/platform_window/x11/x11_window.cc
@@ -5,6 +5,8 @@
 #include "ui/platform_window/x11/x11_window.h"
 
 #include "base/trace_event/trace_event.h"
+#include "ui/base/x/x11_util.h"
+#include "ui/display/screen.h"
 #include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
@@ -82,6 +84,11 @@
 void X11Window::Initialize(PlatformWindowInitProperties properties) {
   XWindow::Configuration config =
       ConvertInitPropertiesToXWindowConfig(properties);
+
+  gfx::Size adjusted_size_in_pixels =
+      AdjustSizeForDisplay(config.bounds.size());
+  config.bounds.set_size(adjusted_size_in_pixels);
+
   Init(config);
 }
 
@@ -90,9 +97,11 @@
   x_event_delegate_ = delegate;
 }
 
-void X11Window::Show() {
-  // TODO(msisov): pass inactivity to PlatformWindow::Show.
-  XWindow::Map(false /* inactive */);
+void X11Window::Show(bool inactive) {
+  if (mapped_in_client())
+    return;
+
+  XWindow::Map(inactive);
 }
 
 void X11Window::Hide() {
@@ -113,17 +122,30 @@
 }
 
 void X11Window::SetBounds(const gfx::Rect& bounds) {
+  gfx::Rect current_bounds_in_pixels = GetBounds();
+  gfx::Rect bounds_in_pixels(bounds.origin(),
+                             AdjustSizeForDisplay(bounds.size()));
+
+  bool size_changed =
+      current_bounds_in_pixels.size() != bounds_in_pixels.size();
+
+  if (size_changed) {
+    // Only cancel the delayed resize task if we're already about to call
+    // OnHostResized in this function.
+    XWindow::CancelResize();
+  }
+
   // Assume that the resize will go through as requested, which should be the
   // case if we're running without a window manager.  If there's a window
   // manager, it can modify or ignore the request, but (per ICCCM) we'll get a
   // (possibly synthetic) ConfigureNotify about the actual size and correct
   // |bounds_| later.
-  XWindow::SetBounds(bounds);
+  XWindow::SetBounds(bounds_in_pixels);
 
   // Even if the pixel bounds didn't change this call to the delegate should
   // still happen. The device scale factor may have changed which effectively
   // changes the bounds.
-  platform_window_delegate_->OnBoundsChanged(bounds);
+  platform_window_delegate_->OnBoundsChanged(bounds_in_pixels);
 }
 
 gfx::Rect X11Window::GetBounds() {
@@ -148,13 +170,79 @@
 }
 
 void X11Window::ToggleFullscreen() {
-  bool is_fullscreen = IsFullscreen();
-  SetFullscreen(!is_fullscreen);
+  // Check if we need to fullscreen the window or not.
+  bool fullscreen = state_ != PlatformWindowState::kFullScreen;
+  if (fullscreen)
+    CancelResize();
+
+  // Work around a bug where if we try to unfullscreen, metacity immediately
+  // fullscreens us again. This is a little flickery and not necessary if
+  // there's a gnome-panel, but it's not easy to detect whether there's a
+  // panel or not.
+  bool unmaximize_and_remaximize = !fullscreen && IsMaximized() &&
+                                   ui::GuessWindowManager() == ui::WM_METACITY;
+
+  if (unmaximize_and_remaximize)
+    Restore();
+
+  // Fullscreen state changes have to be handled manually and then checked
+  // against configuration events, which come from a compositor. The reason
+  // of manually changing the |state_| is that the compositor answers
+  // about state changes asynchronously, which leads to a wrong return value in
+  // DesktopWindowTreeHostPlatform::IsFullscreen, for example, and media
+  // files can never be set to fullscreen. Wayland does the same.
+  if (fullscreen)
+    state_ = PlatformWindowState::kFullScreen;
+  else
+    state_ = PlatformWindowState::kUnknown;
+  SetFullscreen(fullscreen);
+
+  if (unmaximize_and_remaximize)
+    Maximize();
+
+  // Try to guess the size we will have after the switch to/from fullscreen:
+  // - (may) avoid transient states
+  // - works around Flash content which expects to have the size updated
+  //   synchronously.
+  // See https://crbug.com/361408
+  gfx::Rect bounds_in_pixels = GetBounds();
+  if (fullscreen) {
+    display::Screen* screen = display::Screen::GetScreen();
+    const display::Display display =
+        screen->GetDisplayMatching(bounds_in_pixels);
+    SetRestoredBoundsInPixels(bounds_in_pixels);
+    bounds_in_pixels = display.bounds();
+  } else {
+    bounds_in_pixels = GetRestoredBoundsInPixels();
+  }
+  // Do not go through SetBounds as long as it adjusts bounds and sets them to X
+  // Server. Instead, we just store the bounds and notify the client that the
+  // window occupies the entire screen.
+  XWindow::set_bounds(bounds_in_pixels);
+  platform_window_delegate_->OnBoundsChanged(bounds_in_pixels);
 }
 
 void X11Window::Maximize() {
-  if (IsFullscreen())
-    SetFullscreen(false);
+  if (IsFullscreen()) {
+    // Unfullscreen the window if it is fullscreen.
+    ToggleFullscreen();
+
+    // Resize the window so that it does not have the same size as a monitor.
+    // (Otherwise, some window managers immediately put the window back in
+    // fullscreen mode).
+    gfx::Rect bounds_in_pixels = GetBounds();
+    gfx::Rect adjusted_bounds_in_pixels(
+        bounds_in_pixels.origin(),
+        AdjustSizeForDisplay(bounds_in_pixels.size()));
+    if (adjusted_bounds_in_pixels != bounds_in_pixels)
+      SetBounds(adjusted_bounds_in_pixels);
+  }
+
+  // When we are in the process of requesting to maximize a window, we can
+  // accurately keep track of our restored bounds instead of relying on the
+  // heuristics that are in the PropertyNotify and ConfigureNotify handlers.
+  SetRestoredBoundsInPixels(GetBounds());
+
   XWindow::Maximize();
 }
 
@@ -163,10 +251,11 @@
 }
 
 void X11Window::Restore() {
-  if (IsFullscreen())
+  if (XWindow::IsFullscreen())
     ToggleFullscreen();
-  if (IsMaximized())
-    Unmaximize();
+  if (XWindow::IsMaximized())
+    XWindow::Unmaximize();
+  XWindow::Unhide();
 }
 
 PlatformWindowState X11Window::GetPlatformWindowState() const {
@@ -202,14 +291,33 @@
 }
 
 void X11Window::SetRestoredBoundsInPixels(const gfx::Rect& bounds) {
-  // TODO(crbug.com/848131): Restore bounds on restart
-  NOTIMPLEMENTED_LOG_ONCE();
+  restored_bounds_in_pixels_ = bounds;
 }
 
 gfx::Rect X11Window::GetRestoredBoundsInPixels() const {
-  // TODO(crbug.com/848131): Restore bounds on restart
-  NOTIMPLEMENTED_LOG_ONCE();
-  return gfx::Rect();
+  return restored_bounds_in_pixels_;
+}
+
+void X11Window::SetZOrderLevel(ZOrderLevel order) {
+  z_order_ = order;
+
+  // Emulate the multiple window levels provided by other platforms by
+  // collapsing the z-order enum into kNormal = normal, everything else = always
+  // on top.
+  XWindow::SetAlwaysOnTop(order != ui::ZOrderLevel::kNormal);
+}
+
+ZOrderLevel X11Window::GetZOrderLevel() const {
+  bool window_always_on_top = is_always_on_top();
+  bool level_always_on_top = z_order_ != ui::ZOrderLevel::kNormal;
+
+  if (window_always_on_top == level_always_on_top)
+    return z_order_;
+
+  // If something external has forced a window to be always-on-top, map it to
+  // kFloatingWindow as a reasonable equivalent.
+  return window_always_on_top ? ui::ZOrderLevel::kFloatingWindow
+                              : ui::ZOrderLevel::kNormal;
 }
 
 void X11Window::SetPlatformEventDispatcher() {
@@ -329,4 +437,30 @@
   return platform_window_delegate_->GetMaximumSizeForWindow();
 }
 
+gfx::Size X11Window::AdjustSizeForDisplay(
+    const gfx::Size& requested_size_in_pixels) {
+#if defined(OS_CHROMEOS)
+  // We do not need to apply the workaround for the ChromeOS.
+  return requested_size_in_pixels;
+#else
+  auto* screen = display::Screen::GetScreen();
+  if (screen) {
+    std::vector<display::Display> displays = screen->GetAllDisplays();
+    // Compare against all monitor sizes. The window manager can move the window
+    // to whichever monitor it wants.
+    for (const auto& display : displays) {
+      if (requested_size_in_pixels == display.GetSizeInPixel()) {
+        return gfx::Size(requested_size_in_pixels.width() - 1,
+                         requested_size_in_pixels.height() - 1);
+      }
+    }
+  }
+
+  // Do not request a 0x0 window size. It causes an XError.
+  gfx::Size size_in_pixels = requested_size_in_pixels;
+  size_in_pixels.SetToMax(gfx::Size(1, 1));
+  return size_in_pixels;
+#endif
+}
+
 }  // namespace ui
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h
index f094d650..a3c7b95 100644
--- a/ui/platform_window/x11/x11_window.h
+++ b/ui/platform_window/x11/x11_window.h
@@ -44,7 +44,7 @@
   void SetXEventDelegate(XEventDelegate* delegate);
 
   // PlatformWindow:
-  void Show() override;
+  void Show(bool inactive) override;
   void Hide() override;
   void Close() override;
   void PrepareForShutdown() override;
@@ -67,6 +67,8 @@
   void ConfineCursorToBounds(const gfx::Rect& bounds) override;
   void SetRestoredBoundsInPixels(const gfx::Rect& bounds) override;
   gfx::Rect GetRestoredBoundsInPixels() const override;
+  void SetZOrderLevel(ZOrderLevel order) override;
+  ZOrderLevel GetZOrderLevel() const override;
 
  protected:
   PlatformWindowDelegateLinux* platform_window_delegate() const {
@@ -104,6 +106,11 @@
   // X11WindowOzone sets own event dispatcher now.
   virtual void SetPlatformEventDispatcher();
 
+  // Adjusts |requested_size_in_pixels| to avoid the WM "feature" where setting
+  // the window size to the monitor size causes the WM to set the EWMH for
+  // fullscreen.
+  gfx::Size AdjustSizeForDisplay(const gfx::Size& requested_size_in_pixels);
+
   // Stores current state of this window.
   PlatformWindowState state_ = PlatformWindowState::kUnknown;
 
@@ -114,6 +121,13 @@
   // Tells if the window got a ::Close call.
   bool is_shutting_down_ = false;
 
+  // The z-order level of the window; the window exhibits "always on top"
+  // behavior if > 0.
+  ui::ZOrderLevel z_order_ = ui::ZOrderLevel::kNormal;
+
+  // The bounds of our window before the window was maximized.
+  gfx::Rect restored_bounds_in_pixels_;
+
   DISALLOW_COPY_AND_ASSIGN(X11Window);
 };
 
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index 24b40f9..695eebe 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -8,14 +8,17 @@
 <translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation>
 <translation id="1181037720776840403">Remove</translation>
 <translation id="1243314992276662751">Upload</translation>
+<translation id="1266864766717917324">Couldn't share <ph name="CONTENT_TYPE" /></translation>
 <translation id="1269641567813814718">Win</translation>
 <translation id="1290982764014248209">Move <ph name="DRAGGED_APP" /> to folder <ph name="FOLDER_NAME" />.</translation>
+<translation id="1291104554099683393">Try sharing the text in smaller chunks.</translation>
 <translation id="1293699935367580298">Esc</translation>
 <translation id="1306549533752902673">RECOMMENDED APPS</translation>
 <translation id="1368832886055348810">Left to Right</translation>
 <translation id="1383876407941801731">Search</translation>
 <translation id="1398853756734560583">Maximise</translation>
 <translation id="1409544243779336081">App recommendation</translation>
+<translation id="1450753235335490080">Can't share <ph name="CONTENT_TYPE" /></translation>
 <translation id="1498028757988366001">You searched for this before. Deleting '<ph name="QUERY" />' from your history will permanently remove it from your account across all your devices.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minute and }other{# minutes and }}</translation>
 <translation id="1643823602425662293">Notification</translation>
@@ -35,6 +38,7 @@
 <translation id="1884435127456172652"><ph name="NUMBER" /> %</translation>
 <translation id="1901303067676059328">Select &amp;all</translation>
 <translation id="1938451708255335766">To adjust the window display density, restart the app.</translation>
+<translation id="2006524834898217237">Make sure that this device is connected to the Internet.</translation>
 <translation id="208586643495776849">Please try again</translation>
 <translation id="2141853158323869627">{DAYS,plural, =1{1d}other{#d}}</translation>
 <translation id="2148716181193084225">Today</translation>
@@ -76,6 +80,7 @@
 <translation id="3291688615589870984">{DAYS,plural, =1{1 day}other{# days}}</translation>
 <translation id="3295886253693811851">Make a call from</translation>
 <translation id="335581015389089642">Speech</translation>
+<translation id="3389286852084373014">Text is too large</translation>
 <translation id="3443810440409579745">Tab received.</translation>
 <translation id="3479552764303398839">Not now</translation>
 <translation id="348799646910989694">Shelf auto hidden</translation>
@@ -151,11 +156,13 @@
 <translation id="6404817160109697034">{SECONDS,plural, =1{1 sec ago}other{# secs ago}}</translation>
 <translation id="6430678249303439055">Block all notifications from this app</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 second ago}other{# seconds ago}}</translation>
+<translation id="6539092367496845964">Something went wrong. Try again later.</translation>
 <translation id="654149438358937226">Block all notifications</translation>
 <translation id="6567071839949112727">click ancestor</translation>
 <translation id="6578407462441924264">Unnamed</translation>
 <translation id="6612467943526193239">To exit calibration press Esc.</translation>
 <translation id="6620110761915583480">Save File</translation>
+<translation id="6656912866303152668">Make sure that <ph name="TARGET_DEVICE_NAME" /> has sync turned on in Chrome, and then try sending again.</translation>
 <translation id="6699343763173986273">Media Next Track</translation>
 <translation id="673773751041746814">Deletion</translation>
 <translation id="6779314412797872738">To send a number from here to your Android phone, <ph name="TROUBLESHOOT_LINK" /> for both devices in settings.</translation>
@@ -221,6 +228,7 @@
 <translation id="8876215549894133151">Format:</translation>
 <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
 <translation id="8926951137623668982">Shelf always hidden</translation>
+<translation id="8996630695507351249">Make sure that <ph name="TARGET_DEVICE_NAME" /> is connected to the Internet.</translation>
 <translation id="9002566407876343676">open</translation>
 <translation id="9039076430527029379">Move to Page <ph name="PAGE_NUMBER" />, row <ph name="ROW_NUMBER" />, column <ph name="COLUMN_NUMBER" />.</translation>
 <translation id="9044832324875206639">{SECONDS,plural, =1{1 sec}other{# secs}}</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb
index 25ab9339..8dd8aea 100644
--- a/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -8,14 +8,17 @@
 <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}one{# min}other{# min}}</translation>
 <translation id="1181037720776840403">Remover</translation>
 <translation id="1243314992276662751">Fazer upload</translation>
+<translation id="1266864766717917324">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
 <translation id="1269641567813814718">Win</translation>
 <translation id="1290982764014248209">Move <ph name="DRAGGED_APP" /> para a pasta <ph name="FOLDER_NAME" />.</translation>
+<translation id="1291104554099683393">Tente dividir o texto em partes menores.</translation>
 <translation id="1293699935367580298">Esc</translation>
 <translation id="1306549533752902673">APPS RECOMENDADOS</translation>
 <translation id="1368832886055348810">Da esquerda para a direita</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
 <translation id="1398853756734560583">Maximizar</translation>
 <translation id="1409544243779336081">Recomendação de apps</translation>
+<translation id="1450753235335490080">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
 <translation id="1498028757988366001">Você já pesquisou isso. Se você excluir "<ph name="QUERY" />" do seu histórico, essa consulta será permanentemente removida da sua conta em todos os seus dispositivos.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{Um minuto e }one{# minutos e }other{# minutos e }}</translation>
 <translation id="1643823602425662293">Notificação</translation>
@@ -35,6 +38,7 @@
 <translation id="1884435127456172652"><ph name="NUMBER" />%</translation>
 <translation id="1901303067676059328">Selecionar &amp;tudo</translation>
 <translation id="1938451708255335766">Para ajustar a densidade de exibição da janela, reinicie o app.</translation>
+<translation id="2006524834898217237">Verifique se o dispositivo está conectado à Internet.</translation>
 <translation id="208586643495776849">Tente novamente</translation>
 <translation id="2141853158323869627">{DAYS,plural, =1{1 d}one{# d}other{# d}}</translation>
 <translation id="2148716181193084225">Hoje</translation>
@@ -76,6 +80,7 @@
 <translation id="3291688615589870984">{DAYS,plural, =1{Um dia}one{# dias}other{# dias}}</translation>
 <translation id="3295886253693811851">Ligar usando</translation>
 <translation id="335581015389089642">Voz</translation>
+<translation id="3389286852084373014">O texto está grande demais</translation>
 <translation id="3443810440409579745">Guia recebida.</translation>
 <translation id="3479552764303398839">Não agora</translation>
 <translation id="348799646910989694">Estante automaticamente oculta</translation>
@@ -151,11 +156,13 @@
 <translation id="6404817160109697034">{SECONDS,plural, =1{Um segundo atrás}one{# segundos atrás}other{# segundos atrás}}</translation>
 <translation id="6430678249303439055">Bloquear todas as notificações emitidas por este app</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{1 segundo atrás}one{# segundo atrás}other{# segundos atrás}}</translation>
+<translation id="6539092367496845964">Algo deu errado. Tente novamente mais tarde.</translation>
 <translation id="654149438358937226">Bloquear todas as notificações</translation>
 <translation id="6567071839949112727">clicar no predecessor</translation>
 <translation id="6578407462441924264">Sem nome</translation>
 <translation id="6612467943526193239">Para sair da calibração pressione Esc.</translation>
 <translation id="6620110761915583480">Salvar arquivo</translation>
+<translation id="6656912866303152668">Verifique se a sincronização do <ph name="TARGET_DEVICE_NAME" /> está ativada no Chrome e tente novamente.</translation>
 <translation id="6699343763173986273">Próxima faixa da mídia</translation>
 <translation id="673773751041746814">Exclusão</translation>
 <translation id="6779314412797872738">Para enviar um número daqui para seu smartphone Android, <ph name="TROUBLESHOOT_LINK" /> para os dois dispositivos nas configurações.</translation>
@@ -221,6 +228,7 @@
 <translation id="8876215549894133151">Formato:</translation>
 <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
 <translation id="8926951137623668982">Estante sempre oculta</translation>
+<translation id="8996630695507351249">Verifique se o <ph name="TARGET_DEVICE_NAME" /> está conectado à Internet.</translation>
 <translation id="9002566407876343676">abrir</translation>
 <translation id="9039076430527029379">Mover para a página <ph name="PAGE_NUMBER" />, linha <ph name="ROW_NUMBER" />, coluna <ph name="COLUMN_NUMBER" />.</translation>
 <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}one{# s}other{# s}}</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb
index 6467a30..20d1d3c 100644
--- a/ui/strings/translations/ui_strings_sw.xtb
+++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -77,7 +77,7 @@
 <translation id="3295886253693811851">Piga simu ukitumia</translation>
 <translation id="335581015389089642">Usemi</translation>
 <translation id="3443810440409579745">Umepokea kichupo.</translation>
-<translation id="3479552764303398839">Sio sasa</translation>
+<translation id="3479552764303398839">Si sasa</translation>
 <translation id="348799646910989694">Rafu itajificha kiotomatiki</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{Imesalia siku 1}other{Zimesalia siku #}}</translation>
 <translation id="3600969208114796418">Faili ya <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
diff --git a/ui/views/OWNERS b/ui/views/OWNERS
index 3da3cff..0489f00 100644
--- a/ui/views/OWNERS
+++ b/ui/views/OWNERS
@@ -2,6 +2,7 @@
 
 kylixrd@chromium.org
 msw@chromium.org
+pbos@chromium.org
 pkasting@chromium.org
 robliao@chromium.org
 sky@chromium.org
diff --git a/ui/views/animation/bounds_animator_unittest.cc b/ui/views/animation/bounds_animator_unittest.cc
index edec71575..9f2eda9 100644
--- a/ui/views/animation/bounds_animator_unittest.cc
+++ b/ui/views/animation/bounds_animator_unittest.cc
@@ -77,7 +77,8 @@
 class BoundsAnimatorTest : public testing::Test {
  public:
   BoundsAnimatorTest()
-      : task_environment_(base::test::TaskEnvironment::MainThreadType::UI),
+      : task_environment_(
+            base::test::SingleThreadTaskEnvironment::MainThreadType::UI),
         child_(new TestView()),
         animator_(&parent_) {
     parent_.AddChildView(child_);
@@ -89,7 +90,7 @@
   BoundsAnimator* animator() { return &animator_; }
 
  private:
-  base::test::TaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_;
   TestView parent_;
   TestView* child_;  // Owned by |parent_|.
   BoundsAnimator animator_;
diff --git a/ui/views/controls/menu/menu_item_view.cc b/ui/views/controls/menu/menu_item_view.cc
index ba30758..cafd216 100644
--- a/ui/views/controls/menu/menu_item_view.cc
+++ b/ui/views/controls/menu/menu_item_view.cc
@@ -1132,26 +1132,20 @@
 }
 
 SkColor MenuItemView::GetTextColor(bool minor, bool render_selection) const {
-  style::TextContext context = style::CONTEXT_MENU;
-  style::TextStyle text_style =
-      minor ? text_style = style::STYLE_SECONDARY : style::STYLE_PRIMARY;
+  style::TextContext context =
+      GetMenuController() && GetMenuController()->use_touchable_layout()
+          ? style::CONTEXT_TOUCH_MENU
+          : style::CONTEXT_MENU;
 
-  if (GetEnabled()) {
-    if (render_selection)
-      text_style = style::STYLE_SELECTED;
-  } else {
-    text_style = style::STYLE_DISABLED;
-  }
-
-  if (GetMenuController() && GetMenuController()->use_touchable_layout()) {
-    context = style::CONTEXT_TOUCH_MENU;
-    text_style = style::STYLE_PRIMARY;
-  }
-
-  if (type_ == HIGHLIGHTED) {
-    context = style::CONTEXT_MENU;
+  style::TextStyle text_style = style::STYLE_PRIMARY;
+  if (type_ == HIGHLIGHTED)
     text_style = style::STYLE_HIGHLIGHTED;
-  }
+  else if (!GetEnabled())
+    text_style = style::STYLE_DISABLED;
+  else if (render_selection)
+    text_style = style::STYLE_SELECTED;
+  else if (minor)
+    text_style = style::STYLE_SECONDARY;
 
   return style::GetColor(*this, context, text_style);
 }
diff --git a/ui/views/style/typography_provider.cc b/ui/views/style/typography_provider.cc
index 587c3d95..1fea445a 100644
--- a/ui/views/style/typography_provider.cc
+++ b/ui/views/style/typography_provider.cc
@@ -120,7 +120,10 @@
         break;
     }
   } else if (context == style::CONTEXT_TOUCH_MENU) {
-    color_id = ui::NativeTheme::kColorId_TouchableMenuItemLabelColor;
+    color_id =
+        style == views::style::STYLE_HIGHLIGHTED
+            ? ui::NativeTheme::kColorId_HighlightedMenuItemForegroundColor
+            : ui::NativeTheme::kColorId_TouchableMenuItemLabelColor;
   } else if (style == style::STYLE_DISABLED) {
     color_id = ui::NativeTheme::kColorId_LabelDisabledColor;
   }
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
index 1709b54..37f967b 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
@@ -30,7 +30,7 @@
   ~FakePlatformWindow() override = default;
 
   // ui::PlatformWindow
-  void Show() override {}
+  void Show(bool inactive) override {}
   void Hide() override {}
   void Close() override {}
   void PrepareForShutdown() override {}
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index f6e7d07d..c605eeb 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -21,25 +21,6 @@
 
 DesktopWindowTreeHostLinux::~DesktopWindowTreeHostLinux() = default;
 
-gfx::Size DesktopWindowTreeHostLinux::AdjustSizeForDisplay(
-    const gfx::Size& requested_size_in_pixels) {
-  std::vector<display::Display> displays =
-      display::Screen::GetScreen()->GetAllDisplays();
-  // Compare against all monitor sizes. The window manager can move the window
-  // to whichever monitor it wants.
-  for (const auto& display : displays) {
-    if (requested_size_in_pixels == display.GetSizeInPixel()) {
-      return gfx::Size(requested_size_in_pixels.width() - 1,
-                       requested_size_in_pixels.height() - 1);
-    }
-  }
-
-  // Do not request a 0x0 window size. It causes an XError.
-  gfx::Size size_in_pixels = requested_size_in_pixels;
-  size_in_pixels.SetToMax(gfx::Size(1, 1));
-  return size_in_pixels;
-}
-
 void DesktopWindowTreeHostLinux::OnDisplayMetricsChanged(
     const display::Display& display,
     uint32_t changed_metrics) {
@@ -60,12 +41,6 @@
 void DesktopWindowTreeHostLinux::AddAdditionalInitProperties(
     const Widget::InitParams& params,
     ui::PlatformWindowInitProperties* properties) {
-  // Calculate initial bounds
-  gfx::Rect bounds_in_pixels = ToPixelRect(properties->bounds);
-  gfx::Size adjusted_size = AdjustSizeForDisplay(bounds_in_pixels.size());
-  bounds_in_pixels.set_size(adjusted_size);
-  properties->bounds = bounds_in_pixels;
-
   // Set the background color on startup to make the initial flickering
   // happening between the XWindow is mapped and the first expose event
   // is completely handled less annoying. If possible, we use the content
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
index a7b2426..f76fbcc 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -20,16 +20,6 @@
       DesktopNativeWidgetAura* desktop_native_widget_aura);
   ~DesktopWindowTreeHostLinux() override;
 
- protected:
-  // Adjusts |requested_size| to avoid the WM "feature" where setting the
-  // window size to the monitor size causes the WM to set the EWMH for
-  // fullscreen.
-  //
-  // TODO(https://crbug.com/990756)): this method is mainly for X11
-  // impl (Wayland does not need this workaround). Move this to X11Window
-  // instead. We can't do it now as there are some methods that depend on this.
-  gfx::Size AdjustSizeForDisplay(const gfx::Size& requested_size_in_pixels);
-
  private:
   // Overridden from display::DisplayObserver via aura::WindowTreeHost:
   void OnDisplayMetricsChanged(const display::Display& display,
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index d124eda..76f3e86 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -30,6 +30,19 @@
 
 namespace {
 
+bool DetermineInactivity(ui::WindowShowState show_state) {
+  if (show_state != ui::SHOW_STATE_DEFAULT &&
+      show_state != ui::SHOW_STATE_NORMAL &&
+      show_state != ui::SHOW_STATE_INACTIVE &&
+      show_state != ui::SHOW_STATE_MAXIMIZED) {
+    // It will behave like SHOW_STATE_NORMAL.
+    NOTIMPLEMENTED_LOG_ONCE();
+  }
+
+  // See comment in PlatformWindow::Show().
+  return show_state == ui::SHOW_STATE_INACTIVE;
+}
+
 ui::PlatformWindowInitProperties ConvertWidgetInitParamsToInitProperties(
     const Widget::InitParams& params) {
   ui::PlatformWindowInitProperties properties;
@@ -60,7 +73,6 @@
       break;
   }
 
-  properties.bounds = params.bounds;
   properties.activatable =
       params.activatable == Widget::InitParams::ACTIVATABLE_YES;
   properties.force_show_in_taskbar = params.force_show_in_taskbar;
@@ -123,6 +135,9 @@
       ConvertWidgetInitParamsToInitProperties(params);
   AddAdditionalInitProperties(params, &properties);
 
+  // Calculate initial bounds.
+  properties.bounds = ToPixelRect(params.bounds);
+
   CreateAndSetPlatformWindow(std::move(properties));
   // Disable compositing on tooltips as a workaround for
   // https://crbug.com/442111.
@@ -251,25 +266,26 @@
 
 void DesktopWindowTreeHostPlatform::Show(ui::WindowShowState show_state,
                                          const gfx::Rect& restore_bounds) {
-  if (show_state == ui::SHOW_STATE_MAXIMIZED && !restore_bounds.IsEmpty())
-    platform_window()->SetRestoredBoundsInPixels(ToPixelRect(restore_bounds));
+  if (compositor())
+    SetVisible(true);
 
-  if (compositor()) {
-    platform_window()->Show();
-    compositor()->SetVisible(true);
-  }
+  platform_window()->Show(DetermineInactivity(show_state));
 
   switch (show_state) {
     case ui::SHOW_STATE_MAXIMIZED:
       platform_window()->Maximize();
+      if (!restore_bounds.IsEmpty()) {
+        // Enforce |restored_bounds_in_pixels_| since calling Maximize() could
+        // have reset it.
+        platform_window()->SetRestoredBoundsInPixels(
+            ToPixelRect(restore_bounds));
+      }
       break;
     case ui::SHOW_STATE_MINIMIZED:
       platform_window()->Minimize();
       break;
     case ui::SHOW_STATE_FULLSCREEN:
-      // TODO(sky): this isn't necessarily the same as explicitly setting
-      // fullscreen.
-      platform_window()->ToggleFullscreen();
+      SetFullscreen(true);
       break;
     default:
       break;
@@ -300,10 +316,10 @@
 }
 
 void DesktopWindowTreeHostPlatform::SetSize(const gfx::Size& size) {
-  gfx::Rect screen_bounds =
-      gfx::ConvertRectToDIP(device_scale_factor(), GetBoundsInPixels());
-  screen_bounds.set_size(size);
-  SetBoundsInDIP(screen_bounds);
+  gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(size)).size();
+  auto bounds_in_pixels = GetBoundsInPixels();
+  bounds_in_pixels.set_size(size_in_pixels);
+  WindowTreeHostPlatform::SetBoundsInPixels(bounds_in_pixels);
 }
 
 void DesktopWindowTreeHostPlatform::StackAbove(aura::Window* window) {
@@ -345,9 +361,18 @@
 void DesktopWindowTreeHostPlatform::GetWindowPlacement(
     gfx::Rect* bounds,
     ui::WindowShowState* show_state) const {
-  NOTIMPLEMENTED_LOG_ONCE();
-  *bounds = gfx::Rect(0, 0, 640, 840);
-  *show_state = ui::SHOW_STATE_NORMAL;
+  *bounds = GetRestoredBounds();
+
+  if (IsFullscreen())
+    *show_state = ui::SHOW_STATE_FULLSCREEN;
+  else if (IsMinimized())
+    *show_state = ui::SHOW_STATE_MINIMIZED;
+  else if (IsMaximized())
+    *show_state = ui::SHOW_STATE_MAXIMIZED;
+  else if (!IsActive())
+    *show_state = ui::SHOW_STATE_INACTIVE;
+  else
+    *show_state = ui::SHOW_STATE_NORMAL;
 }
 
 gfx::Rect DesktopWindowTreeHostPlatform::GetWindowBoundsInScreen() const {
@@ -362,12 +387,18 @@
 }
 
 gfx::Rect DesktopWindowTreeHostPlatform::GetRestoredBounds() const {
+  // We can't reliably track the restored bounds of a window, but we can get
+  // the 90% case down. When *chrome* is the process that requests maximizing
+  // or restoring bounds, we can record the current bounds before we request
+  // maximization, and clear it when we detect a state change.
   gfx::Rect restored_bounds = platform_window()->GetRestoredBoundsInPixels();
+
   // When window is resized, |restored bounds| is not set and empty.
   // If |restored bounds| is empty, it returns the current window size.
-  gfx::Rect bounds =
-      !restored_bounds.IsEmpty() ? restored_bounds : GetBoundsInPixels();
-  return ToDIPRect(bounds);
+  if (!restored_bounds.IsEmpty())
+    return ToDIPRect(restored_bounds);
+
+  return GetWindowBoundsInScreen();
 }
 
 std::string DesktopWindowTreeHostPlatform::GetWorkspace() const {
@@ -401,14 +432,18 @@
 
 void DesktopWindowTreeHostPlatform::Maximize() {
   platform_window()->Maximize();
+  if (IsMinimized())
+    Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
 }
 
 void DesktopWindowTreeHostPlatform::Minimize() {
+  ReleaseCapture();
   platform_window()->Minimize();
 }
 
 void DesktopWindowTreeHostPlatform::Restore() {
   platform_window()->Restore();
+  Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
 }
 
 bool DesktopWindowTreeHostPlatform::IsMaximized() const {
@@ -426,13 +461,11 @@
 }
 
 void DesktopWindowTreeHostPlatform::SetZOrderLevel(ui::ZOrderLevel order) {
-  // TODO: needs PlatformWindow support.
-  NOTIMPLEMENTED_LOG_ONCE();
+  platform_window()->SetZOrderLevel(order);
 }
 
 ui::ZOrderLevel DesktopWindowTreeHostPlatform::GetZOrderLevel() const {
-  // TODO: needs PlatformWindow support.
-  return ui::ZOrderLevel::kNormal;
+  return platform_window()->GetZOrderLevel();
 }
 
 void DesktopWindowTreeHostPlatform::SetVisibleOnAllWorkspaces(
@@ -517,8 +550,19 @@
 }
 
 void DesktopWindowTreeHostPlatform::SetFullscreen(bool fullscreen) {
-  if (IsFullscreen() != fullscreen)
-    platform_window()->ToggleFullscreen();
+  if (IsFullscreen() == fullscreen)
+    return;
+
+  platform_window()->ToggleFullscreen();
+
+  // The state must change synchronously to let media react on fullscreen
+  // changes.
+  DCHECK_EQ(fullscreen, IsFullscreen());
+
+  if (IsFullscreen() == fullscreen)
+    Relayout();
+  // Else: the widget will be relaid out either when the window bounds change
+  // or when |platform_window|'s fullscreen state changes.
 }
 
 bool DesktopWindowTreeHostPlatform::IsFullscreen() const {
@@ -599,6 +643,10 @@
   return transform;
 }
 
+void DesktopWindowTreeHostPlatform::ShowImpl() {
+  Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
+}
+
 void DesktopWindowTreeHostPlatform::DispatchEvent(ui::Event* event) {
 #if defined(USE_OZONE)
   // Make sure the |event| is marked as a non-client if it's a non-client
@@ -634,18 +682,28 @@
 
 void DesktopWindowTreeHostPlatform::OnWindowStateChanged(
     ui::PlatformWindowState new_state) {
+  bool was_minimized = old_state_ == ui::PlatformWindowState::kMinimized;
+  bool is_minimized = new_state == ui::PlatformWindowState::kMinimized;
+
   // Propagate minimization/restore to compositor to avoid drawing 'blank'
   // frames that could be treated as previews, which show content even if a
   // window is minimized.
-  bool visible = new_state != ui::PlatformWindowState::kMinimized;
-  if (visible != compositor()->IsVisible()) {
-    compositor()->SetVisible(visible);
-    native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible);
+  if (is_minimized != was_minimized) {
+    if (is_minimized) {
+      SetVisible(false);
+      content_window()->Hide();
+    } else {
+      content_window()->Show();
+      SetVisible(true);
+    }
   }
 
-  // It might require relayouting when state property has been changed.
-  if (visible)
-    Relayout();
+  old_state_ = new_state;
+
+  // Now that we have different window properties, we may need to relayout the
+  // window. (The windows code doesn't need this because their window change is
+  // synchronous.)
+  Relayout();
 }
 
 void DesktopWindowTreeHostPlatform::OnCloseRequest() {
@@ -716,6 +774,17 @@
   return native_widget_delegate_->AsWidget();
 }
 
+void DesktopWindowTreeHostPlatform::SetVisible(bool visible) {
+  if (is_compositor_set_visible_ == visible)
+    return;
+
+  is_compositor_set_visible_ = visible;
+  if (compositor())
+    compositor()->SetVisible(visible);
+
+  native_widget_delegate()->OnNativeWidgetVisibilityChanged(visible);
+}
+
 void DesktopWindowTreeHostPlatform::AddAdditionalInitProperties(
     const Widget::InitParams& params,
     ui::PlatformWindowInitProperties* properties) {}
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
index 7e426b4..c5082d9 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -5,6 +5,8 @@
 #ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_WINDOW_TREE_HOST_PLATFORM_H_
 #define UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_WINDOW_TREE_HOST_PLATFORM_H_
 
+#include <vector>
+
 #include "base/memory/weak_ptr.h"
 #include "build/build_config.h"
 #include "ui/aura/window_tree_host_platform.h"
@@ -92,6 +94,7 @@
 
   // WindowTreeHost:
   gfx::Transform GetRootTransform() const override;
+  void ShowImpl() override;
 
   // PlatformWindowDelegateBase:
   void DispatchEvent(ui::Event* event) override;
@@ -129,6 +132,9 @@
   Widget* GetWidget();
   const Widget* GetWidget() const;
 
+  // Set visibility and fire OnNativeWidgetVisibilityChanged() if it changed.
+  void SetVisible(bool visible);
+
   // There are platform specific properties that Linux may want to add.
   virtual void AddAdditionalInitProperties(
       const Widget::InitParams& params,
@@ -151,6 +157,14 @@
   std::unique_ptr<WindowEventFilter> non_client_window_event_filter_;
 #endif
 
+  // Keep track of PlatformWindow state so that we would react correctly and set
+  // visibility only if the window was minimized or was unminimized from the
+  // normal state.
+  ui::PlatformWindowState old_state_ = ui::PlatformWindowState::kUnknown;
+
+  // Cached value for SetVisible.  Not the same as the IsVisible public API.
+  bool is_compositor_set_visible_ = false;
+
   base::WeakPtrFactory<DesktopWindowTreeHostPlatform> close_widget_factory_{
       this};
   base::WeakPtrFactory<DesktopWindowTreeHostPlatform> weak_factory_{this};
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 3c78898..376c76de 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -289,56 +289,10 @@
   return base::WrapUnique(drag_drop_client_);
 }
 
-void DesktopWindowTreeHostX11::Show(ui::WindowShowState show_state,
-                                    const gfx::Rect& restore_bounds) {
-  if (compositor())
-    SetVisible(true);
-
-  if (!GetXWindow()->mapped_in_client() || IsMinimized())
-    MapWindow(show_state);
-
-  switch (show_state) {
-    case ui::SHOW_STATE_MAXIMIZED:
-      Maximize();
-      if (!restore_bounds.IsEmpty()) {
-        // Enforce |restored_bounds_in_pixels_| since calling Maximize() could
-        // have reset it.
-        restored_bounds_in_pixels_ = ToPixelRect(restore_bounds);
-      }
-      break;
-    case ui::SHOW_STATE_MINIMIZED:
-      Minimize();
-      break;
-    case ui::SHOW_STATE_FULLSCREEN:
-      SetFullscreen(true);
-      break;
-    default:
-      break;
-  }
-
-  native_widget_delegate()->AsWidget()->SetInitialFocus(show_state);
-
-  content_window()->Show();
-}
-
 bool DesktopWindowTreeHostX11::IsVisible() const {
   return platform_window() ? GetXWindow()->IsVisible() : false;
 }
 
-void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) {
-  gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(requested_size)).size();
-  size_in_pixels = AdjustSizeForDisplay(size_in_pixels);
-
-  bool size_changed = GetBoundsInPixels().size() != size_in_pixels;
-
-  GetXWindow()->SetSize(size_in_pixels);
-
-  if (size_changed) {
-    OnHostResizedInPixels(size_in_pixels);
-    ResetWindowRegion();
-  }
-}
-
 void DesktopWindowTreeHostX11::StackAbove(aura::Window* window) {
   XDisplay* display = GetXWindow()->display();
   ::Window xwindow = GetXWindow()->window();
@@ -377,35 +331,6 @@
   GetXWindow()->StackAtTop();
 }
 
-void DesktopWindowTreeHostX11::GetWindowPlacement(
-    gfx::Rect* bounds,
-    ui::WindowShowState* show_state) const {
-  *bounds = GetRestoredBounds();
-
-  if (IsFullscreen()) {
-    *show_state = ui::SHOW_STATE_FULLSCREEN;
-  } else if (IsMinimized()) {
-    *show_state = ui::SHOW_STATE_MINIMIZED;
-  } else if (IsMaximized()) {
-    *show_state = ui::SHOW_STATE_MAXIMIZED;
-  } else if (!IsActive()) {
-    *show_state = ui::SHOW_STATE_INACTIVE;
-  } else {
-    *show_state = ui::SHOW_STATE_NORMAL;
-  }
-}
-
-gfx::Rect DesktopWindowTreeHostX11::GetRestoredBounds() const {
-  // We can't reliably track the restored bounds of a window, but we can get
-  // the 90% case down. When *chrome* is the process that requests maximizing
-  // or restoring bounds, we can record the current bounds before we request
-  // maximization, and clear it when we detect a state change.
-  if (!restored_bounds_in_pixels_.IsEmpty())
-    return ToDIPRect(restored_bounds_in_pixels_);
-
-  return GetWindowBoundsInScreen();
-}
-
 std::string DesktopWindowTreeHostX11::GetWorkspace() const {
   base::Optional<int> workspace = GetXWindow()->workspace();
   return workspace ? base::NumberToString(workspace.value()) : std::string();
@@ -440,90 +365,10 @@
   return GetXWindow()->IsActive();
 }
 
-void DesktopWindowTreeHostX11::Maximize() {
-  // TODO(nickdiego): Move into XWindow. For now, it is kept outside
-  // it due to |AdjustSizeForDisplay|, which depends on display::Display, which
-  // is not accessible at Ozone layer.
-  if (GetXWindow()->IsFullscreen()) {
-    // Unfullscreen the window if it is fullscreen.
-    GetXWindow()->SetFullscreen(false);
-
-    // Resize the window so that it does not have the same size as a monitor.
-    // (Otherwise, some window managers immediately put the window back in
-    // fullscreen mode).
-    gfx::Rect bounds = GetBoundsInPixels();
-    gfx::Rect adjusted_bounds_in_pixels(bounds.origin(),
-                                        AdjustSizeForDisplay(bounds.size()));
-    if (adjusted_bounds_in_pixels != bounds)
-      SetBoundsInPixels(adjusted_bounds_in_pixels);
-  }
-
-  // When we are in the process of requesting to maximize a window, we can
-  // accurately keep track of our restored bounds instead of relying on the
-  // heuristics that are in the PropertyNotify and ConfigureNotify handlers.
-  restored_bounds_in_pixels_ = GetBoundsInPixels();
-
-  GetXWindow()->Maximize();
-  if (IsMinimized())
-    Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
-}
-
-void DesktopWindowTreeHostX11::Minimize() {
-  ReleaseCapture();
-  GetXWindow()->Minimize();
-}
-
-void DesktopWindowTreeHostX11::Restore() {
-  GetXWindow()->Unmaximize();
-  Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
-  GetXWindow()->Unhide();
-}
-
-bool DesktopWindowTreeHostX11::IsMaximized() const {
-  return GetXWindow()->IsMaximized();
-}
-
-bool DesktopWindowTreeHostX11::IsMinimized() const {
-  return GetXWindow()->IsMinimized();
-}
-
 bool DesktopWindowTreeHostX11::HasCapture() const {
   return g_current_capture == this;
 }
 
-void DesktopWindowTreeHostX11::SetZOrderLevel(ui::ZOrderLevel order) {
-  z_order_ = order;
-
-  // Emulate the multiple window levels provided by other platforms by
-  // collapsing the z-order enum into kNormal = normal, everything else = always
-  // on top.
-  GetXWindow()->SetAlwaysOnTop(order != ui::ZOrderLevel::kNormal);
-}
-
-ui::ZOrderLevel DesktopWindowTreeHostX11::GetZOrderLevel() const {
-  bool window_always_on_top = GetXWindow()->is_always_on_top();
-  bool level_always_on_top = z_order_ != ui::ZOrderLevel::kNormal;
-
-  if (window_always_on_top == level_always_on_top)
-    return z_order_;
-
-  // If something external has forced a window to be always-on-top, map it to
-  // kFloatingWindow as a reasonable equivalent.
-  return window_always_on_top ? ui::ZOrderLevel::kFloatingWindow
-                              : ui::ZOrderLevel::kNormal;
-}
-
-void DesktopWindowTreeHostX11::SetVisible(bool visible) {
-  if (is_compositor_set_visible_ == visible)
-    return;
-
-  is_compositor_set_visible_ = visible;
-  if (compositor())
-    compositor()->SetVisible(visible);
-
-  native_widget_delegate()->OnNativeWidgetVisibilityChanged(visible);
-}
-
 void DesktopWindowTreeHostX11::SetVisibleOnAllWorkspaces(bool always_visible) {
   GetXWindow()->SetVisibleOnAllWorkspaces(always_visible);
 }
@@ -583,60 +428,6 @@
                      weak_factory_.GetWeakPtr(), new_type));
 }
 
-void DesktopWindowTreeHostX11::SetFullscreen(bool fullscreen) {
-  if (is_fullscreen_ == fullscreen)
-    return;
-
-  is_fullscreen_ = fullscreen;
-  if (is_fullscreen_)
-    GetXWindow()->CancelResize();
-
-  // Work around a bug where if we try to unfullscreen, metacity immediately
-  // fullscreens us again. This is a little flickery and not necessary if
-  // there's a gnome-panel, but it's not easy to detect whether there's a
-  // panel or not.
-  bool unmaximize_and_remaximize = !fullscreen && IsMaximized() &&
-                                   ui::GuessWindowManager() == ui::WM_METACITY;
-
-  if (unmaximize_and_remaximize)
-    Restore();
-
-  GetXWindow()->SetFullscreen(fullscreen);
-
-  if (unmaximize_and_remaximize)
-    Maximize();
-
-  // Try to guess the size we will have after the switch to/from fullscreen:
-  // - (may) avoid transient states
-  // - works around Flash content which expects to have the size updated
-  //   synchronously.
-  // See https://crbug.com/361408
-  gfx::Rect bounds = GetXWindow()->bounds();
-  if (fullscreen) {
-    display::Screen* screen = display::Screen::GetScreen();
-    const display::Display display = screen->GetDisplayNearestWindow(window());
-    restored_bounds_in_pixels_ = bounds;
-    bounds = ToPixelRect(display.bounds());
-  } else {
-    bounds = restored_bounds_in_pixels_;
-  }
-  GetXWindow()->set_bounds(bounds);
-
-  OnHostMovedInPixels(bounds.origin());
-  OnHostResizedInPixels(bounds.size());
-
-  if (GetXWindow()->IsFullscreen() == fullscreen) {
-    Relayout();
-    ResetWindowRegion();
-  }
-  // Else: the widget will be relaid out either when the window bounds change or
-  // when |xwindow_|'s fullscreen state changes.
-}
-
-bool DesktopWindowTreeHostX11::IsFullscreen() const {
-  return is_fullscreen_;
-}
-
 void DesktopWindowTreeHostX11::SetOpacity(float opacity) {
   GetXWindow()->SetOpacity(opacity);
 }
@@ -696,33 +487,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostX11, aura::WindowTreeHost implementatio
 
-void DesktopWindowTreeHostX11::ShowImpl() {
-  Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
-}
-
-void DesktopWindowTreeHostX11::HideImpl() {
-  if (GetXWindow()->Hide())
-    SetVisible(false);
-}
-
-void DesktopWindowTreeHostX11::SetBoundsInPixels(
-    const gfx::Rect& requested_bounds_in_pixel) {
-  gfx::Rect bounds = GetXWindow()->bounds();
-  gfx::Rect bounds_in_pixels(
-      requested_bounds_in_pixel.origin(),
-      AdjustSizeForDisplay(requested_bounds_in_pixel.size()));
-
-  bool size_changed = bounds.size() != bounds_in_pixels.size();
-
-  if (size_changed) {
-    // Only cancel the delayed resize task if we're already about to call
-    // OnHostResized in this function.
-    GetXWindow()->CancelResize();
-  }
-
-  platform_window()->SetBounds(bounds_in_pixels);
-}
-
 void DesktopWindowTreeHostX11::SetCapture() {
   if (HasCapture())
     return;
@@ -861,23 +625,6 @@
   return *open_windows_;
 }
 
-void DesktopWindowTreeHostX11::MapWindow(ui::WindowShowState show_state) {
-  if (show_state != ui::SHOW_STATE_DEFAULT &&
-      show_state != ui::SHOW_STATE_NORMAL &&
-      show_state != ui::SHOW_STATE_INACTIVE &&
-      show_state != ui::SHOW_STATE_MAXIMIZED) {
-    // It will behave like SHOW_STATE_NORMAL.
-    NOTIMPLEMENTED_LOG_ONCE();
-  }
-
-  // If SHOW_STATE_INACTIVE, tell the window manager not to focus the window
-  // when mapping. This is done by setting the _NET_WM_USER_TIME to 0. See e.g.
-  // http://standards.freedesktop.org/wm-spec/latest/ar01s05.html
-  bool inactive = show_state == ui::SHOW_STATE_INACTIVE;
-
-  GetXWindow()->Map(inactive);
-}
-
 void DesktopWindowTreeHostX11::SetWindowTransparency() {
   bool has_alpha = GetXWindow()->has_alpha();
   compositor()->SetBackgroundColor(has_alpha ? SK_ColorTRANSPARENT
@@ -886,16 +633,6 @@
   content_window()->SetTransparent(has_alpha);
 }
 
-void DesktopWindowTreeHostX11::Relayout() {
-  Widget* widget = native_widget_delegate()->AsWidget();
-  NonClientView* non_client_view = widget->non_client_view();
-  // non_client_view may be NULL, especially during creation.
-  if (non_client_view) {
-    non_client_view->client_view()->InvalidateLayout();
-    non_client_view->InvalidateLayout();
-  }
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostX11 implementation:
 
@@ -971,50 +708,7 @@
 
 void DesktopWindowTreeHostX11::OnWindowStateChanged(
     ui::PlatformWindowState new_state) {
-  bool was_minimized = GetXWindow()->was_minimized();
-  bool is_minimized = IsMinimized();
-
-  // Propagate the window minimization information to the content window, so
-  // the render side can update its visibility properly. OnWMStateUpdated() is
-  // called by PropertyNofify event from DispatchEvent() when the browser is
-  // minimized or shown from minimized state. On Windows, this is realized by
-  // calling OnHostResizedInPixels() with an empty size. In particular,
-  // HWNDMessageHandler::GetClientAreaBounds() returns an empty size when the
-  // window is minimized. On Linux, returning empty size in GetBounds() or
-  // SetBoundsInPixels() does not work.
-  // We also propagate the minimization to the compositor, to makes sure that we
-  // don't draw any 'blank' frames that could be noticed in applications such as
-  // window manager previews, which show content even when a window is
-  // minimized.
-  if (is_minimized != was_minimized) {
-    if (is_minimized) {
-      SetVisible(false);
-      content_window()->Hide();
-    } else {
-      content_window()->Show();
-      SetVisible(true);
-    }
-  }
-
-  if (restored_bounds_in_pixels_.IsEmpty()) {
-    if (IsMaximized()) {
-      // The request that we become maximized originated from a different
-      // process. |bounds_in_pixels_| already contains our maximized bounds. Do
-      // a best effort attempt to get restored bounds by setting it to our
-      // previously set bounds (and if we get this wrong, we aren't any worse
-      // off since we'd otherwise be returning our maximized bounds).
-      restored_bounds_in_pixels_ = GetXWindow()->previous_bounds();
-    }
-  } else if (!IsMaximized() && !IsFullscreen()) {
-    // If we have restored bounds, but WM_STATE no longer claims to be
-    // maximized or fullscreen, we should clear our restored bounds.
-    restored_bounds_in_pixels_ = gfx::Rect();
-  }
-
-  // Now that we have different window properties, we may need to relayout the
-  // window. (The windows code doesn't need this because their window change is
-  // synchronous.)
-  Relayout();
+  DesktopWindowTreeHostPlatform::OnWindowStateChanged(new_state);
   ResetWindowRegion();
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
index 38185e13..de86f948 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -104,26 +104,13 @@
   void OnNativeWidgetCreated(const Widget::InitParams& params) override;
   std::unique_ptr<aura::client::DragDropClient> CreateDragDropClient(
       DesktopNativeCursorManager* cursor_manager) override;
-  void Show(ui::WindowShowState show_state,
-            const gfx::Rect& restore_bounds) override;
   bool IsVisible() const override;
-  void SetSize(const gfx::Size& requested_size) override;
   void StackAbove(aura::Window* window) override;
   void StackAtTop() override;
-  void GetWindowPlacement(gfx::Rect* bounds,
-                          ui::WindowShowState* show_state) const override;
-  gfx::Rect GetRestoredBounds() const override;
   std::string GetWorkspace() const override;
   void SetShape(std::unique_ptr<Widget::ShapeRects> native_shape) override;
   bool IsActive() const override;
-  void Maximize() override;
-  void Minimize() override;
-  void Restore() override;
-  bool IsMaximized() const override;
-  bool IsMinimized() const override;
   bool HasCapture() const override;
-  void SetZOrderLevel(ui::ZOrderLevel order) override;
-  ui::ZOrderLevel GetZOrderLevel() const override;
   void SetVisibleOnAllWorkspaces(bool always_visible) override;
   bool IsVisibleOnAllWorkspaces() const override;
   Widget::MoveLoopResult RunMoveLoop(
@@ -135,8 +122,6 @@
   bool ShouldUseNativeFrame() const override;
   bool ShouldWindowContentsBeTransparent() const override;
   void FrameTypeChanged() override;
-  void SetFullscreen(bool fullscreen) override;
-  bool IsFullscreen() const override;
   void SetOpacity(float opacity) override;
   void SetAspectRatio(const gfx::SizeF& aspect_ratio) override;
   void SetWindowIcons(const gfx::ImageSkia& window_icon,
@@ -151,19 +136,12 @@
   bool ShouldCreateVisibilityController() const override;
 
   // Overridden from aura::WindowTreeHost:
-  void ShowImpl() override;
-  void HideImpl() override;
-  void SetBoundsInPixels(const gfx::Rect& requested_bounds_in_pixels) override;
   void SetCapture() override;
   void ReleaseCapture() override;
 
  private:
   friend class DesktopWindowTreeHostX11HighDPITest;
 
-  // Initializes our X11 surface to draw on. This method performs all
-  // initialization related to talking to the X11 server.
-  void InitX11Window(const Widget::InitParams& params);
-
   // Overridden from WmMoveResizeHandler
   void DispatchHostWindowDragMovement(
       int hittest,
@@ -191,22 +169,13 @@
   // See comment for variable open_windows_.
   static std::list<XID>& open_windows();
 
-  // Map the window (shows it) taking into account the given |show_state|.
-  void MapWindow(ui::WindowShowState show_state);
-
   void SetWindowTransparency();
 
-  // Relayout the widget's client and non-client views.
-  void Relayout();
-
   void DelayedChangeFrameType(Widget::FrameType new_type);
 
   // Enables event listening after closing |dialog|.
   void EnableEventListening();
 
-  // Set visibility and fire OnNativeWidgetVisibilityChanged() if it changed.
-  void SetVisible(bool visible);
-
   // Callback for a swapbuffer after resize.
   void OnCompleteSwapWithNewSize(const gfx::Size& size);
 
@@ -239,16 +208,6 @@
   ui::XWindow* GetXWindow();
   const ui::XWindow* GetXWindow() const;
 
-  // The bounds of our window before we were maximized.
-  gfx::Rect restored_bounds_in_pixels_;
-
-  // Whether |xwindow_| was requested to be fullscreen via SetFullscreen().
-  bool is_fullscreen_ = false;
-
-  // The z-order level of the window; the window exhibits "always on top"
-  // behavior if > 0.
-  ui::ZOrderLevel z_order_ = ui::ZOrderLevel::kNormal;
-
   DesktopDragDropClientAuraX11* drag_drop_client_ = nullptr;
 
   std::unique_ptr<WindowEventFilter> non_client_event_filter_;
@@ -265,9 +224,6 @@
   // destroyed.
   static std::list<gfx::AcceleratedWidget>* open_windows_;
 
-  // Cached value for SetVisible.  Not the same as the IsVisible public API.
-  bool is_compositor_set_visible_ = false;
-
   std::unique_ptr<aura::ScopedWindowTargeter> targeter_for_modal_;
 
   uint32_t modal_dialog_counter_ = 0;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
index 1ea1d04e..543ff68 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
@@ -101,7 +101,17 @@
   void UpdateWindowTitle() override {}
   void SizeConstraintsChanged() override {}
 
+  bool GetAndResetLayoutRequest() {
+    bool layout_requested = layout_requested_;
+    layout_requested_ = false;
+    return layout_requested;
+  }
+
  private:
+  void Layout() override { layout_requested_ = true; }
+
+  bool layout_requested_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(ShapedNonClientFrameView);
 };
 
@@ -258,12 +268,10 @@
 
     shape_rects = GetShapeRects(xid1);
     ASSERT_FALSE(shape_rects.empty());
-    EXPECT_TRUE(ShapeRectContainsPoint(shape_rects,
-                                       maximized_bounds.width() - 1,
-                                       5));
-    EXPECT_TRUE(ShapeRectContainsPoint(shape_rects,
-                                       maximized_bounds.width() - 1,
-                                       15));
+    EXPECT_TRUE(
+        ShapeRectContainsPoint(shape_rects, maximized_bounds.width() - 1, 5));
+    EXPECT_TRUE(
+        ShapeRectContainsPoint(shape_rects, maximized_bounds.width() - 1, 15));
   }
 
   // 2) Test setting the window shape via Widget::SetShape().
@@ -306,13 +314,16 @@
   EXPECT_FALSE(ShapeRectContainsPoint(shape_rects, 500, 500));
 }
 
-// Test that the widget ignores changes in fullscreen state initiated by the
+// Test that the widget reacts on changes in fullscreen state initiated by the
 // window manager (e.g. via a window manager accelerator key).
 TEST_F(DesktopWindowTreeHostX11Test, WindowManagerTogglesFullscreen) {
   if (!ui::WmSupportsHint(gfx::GetAtom("_NET_WM_STATE_FULLSCREEN")))
     return;
 
   std::unique_ptr<Widget> widget = CreateWidget(new ShapedWidgetDelegate());
+  auto* non_client_view = static_cast<ShapedNonClientFrameView*>(
+      widget->non_client_view()->frame_view());
+  ASSERT_TRUE(non_client_view);
   XID xid = widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
   widget->Show();
   ui::X11EventSource::GetInstance()->DispatchXEvents();
@@ -325,8 +336,14 @@
   }
   EXPECT_TRUE(widget->IsFullscreen());
 
+  // After the fullscreen state has been set, there must be a relayout request
+  EXPECT_TRUE(non_client_view->GetAndResetLayoutRequest());
+
+  // Ensure there is not request before we proceed.
+  EXPECT_FALSE(non_client_view->GetAndResetLayoutRequest());
+
   // Emulate the window manager exiting fullscreen via a window manager
-  // accelerator key. It should not affect the widget's fullscreen state.
+  // accelerator key. It should affect the widget's fullscreen state.
   {
     Display* display = gfx::GetXDisplay();
 
@@ -347,14 +364,13 @@
     WMStateWaiter waiter(xid, "_NET_WM_STATE_FULLSCREEN", false);
     waiter.Wait();
   }
-  EXPECT_TRUE(widget->IsFullscreen());
-
-  // Calling Widget::SetFullscreen(false) should clear the widget's fullscreen
-  // state and clean things up.
-  widget->SetFullscreen(false);
   EXPECT_FALSE(widget->IsFullscreen());
   EXPECT_EQ(initial_bounds.ToString(),
             widget->GetWindowBoundsInScreen().ToString());
+
+  // Even though the unfullscreen request came from the window manager, we must
+  // still react and relayout.
+  EXPECT_TRUE(non_client_view->GetAndResetLayoutRequest());
 }
 
 // Tests that the minimization information is propagated to the content window.
@@ -371,7 +387,7 @@
 
   // Minimize by sending _NET_WM_STATE_HIDDEN
   {
-    std::vector< ::Atom> atom_list;
+    std::vector<::Atom> atom_list;
     atom_list.push_back(gfx::GetAtom("_NET_WM_STATE_HIDDEN"));
     ui::SetAtomArrayProperty(xid, "_NET_WM_STATE", "ATOM", atom_list);
 
@@ -394,7 +410,7 @@
 
   // Show from minimized by sending _NET_WM_STATE_FOCUSED
   {
-    std::vector< ::Atom> atom_list;
+    std::vector<::Atom> atom_list;
     atom_list.push_back(gfx::GetAtom("_NET_WM_STATE_FOCUSED"));
     ui::SetAtomArrayProperty(xid, "_NET_WM_STATE", "ATOM", atom_list);
 
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index ad2cd7a..e5be3e3 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -1138,14 +1138,7 @@
   EXPECT_EQ(minimum_size, widget->GetClientAreaBoundsInScreen().size());
 
   widget->SetSize(smaller_size);
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-  // TODO(tapted): Desktop Linux ignores size constraints for SetSize. Fix it.
-  const bool use_small_size = true;
-#else
-  const bool use_small_size = false;
-#endif
-  EXPECT_EQ(use_small_size ? smaller_size : minimum_size,
-            widget->GetClientAreaBoundsInScreen().size());
+  EXPECT_EQ(minimum_size, widget->GetClientAreaBoundsInScreen().size());
 }
 
 // Tests that SetBounds() and GetWindowBoundsInScreen() is symmetric when the
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index 30d203e..eb830f8e 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -36,6 +36,7 @@
     "cr_checkbox:closure_compile_module",
     "cr_dialog:closure_compile_module",
     "cr_drawer:closure_compile_module",
+    "cr_expand_button:closure_compile_module",
     "cr_icon_button:closure_compile_module",
     "cr_input:closure_compile_module",
     "cr_radio_button:closure_compile_module",
@@ -45,6 +46,7 @@
     "cr_toast:closure_compile_module",
     "cr_toggle:closure_compile_module",
     "cr_view_manager:closure_compile_module",
+    "policy:closure_compile_module",
   ]
 
   if (is_chromeos) {
@@ -133,6 +135,7 @@
     "cr_checkbox:cr_checkbox_module",
     "cr_dialog:cr_dialog_module",
     "cr_drawer:cr_drawer_module",
+    "cr_expand_button:cr_expand_button_module",
     "cr_icon_button:cr_icon_button_module",
     "cr_input:cr_input_module",
     "cr_input:cr_input_style_css_module",
@@ -146,6 +149,7 @@
     "cr_toast:cr_toast_module",
     "cr_toggle:cr_toggle_module",
     "cr_view_manager:cr_view_manager_module",
+    "policy:cr_tooltip_icon_module",
   ]
 }
 
diff --git a/ui/webui/resources/cr_elements/chromeos/network/cr_network_list_item.js b/ui/webui/resources/cr_elements/chromeos/network/cr_network_list_item.js
index a329cfe..ab22698a 100644
--- a/ui/webui/resources/cr_elements/chromeos/network/cr_network_list_item.js
+++ b/ui/webui/resources/cr_elements/chromeos/network/cr_network_list_item.js
@@ -139,11 +139,13 @@
       return '';
     }
     const connectionState = this.networkState.connectionState;
-    if (this.networkState.type == mojom.NetworkType.kCellular &&
-        this.networkState.cellular.scanning) {
-      // TODO(khorimoto): Add and sim locked and possibly initializing states to
-      // CellularStateProperties.
-      return CrOncStrings.networkListItemScanning;
+    if (this.networkState.type == mojom.NetworkType.kCellular) {
+      if (this.networkState.cellular.scanning) {
+        return CrOncStrings.networkListItemScanning;
+      }
+      if (this.networkState.cellular.simLocked) {
+        return CrOncStrings.networkListItemSimCardLocked;
+      }
     }
     if (OncMojo.connectionStateIsConnected(connectionState)) {
       // TODO(khorimoto): Consider differentiating between Portal, Connected,
diff --git a/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js b/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js
index 20c3221..d9cf9a4 100644
--- a/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js
+++ b/ui/webui/resources/cr_elements/chromeos/network/cr_onc_types.js
@@ -30,6 +30,7 @@
  *   networkListItemConnectingTo: string,
  *   networkListItemInitializing: string,
  *   networkListItemScanning: string,
+ *   networkListItemSimCardLocked: string,
  *   networkListItemNotConnected: string,
  *   networkListItemNoNetwork: string,
  *   vpnNameTemplate: string,
diff --git a/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn b/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn
index 254bd79..96a0f362 100644
--- a/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
 
 js_type_check("closure_compile") {
   deps = [
@@ -15,3 +16,30 @@
     "//ui/webui/resources/js/cr/ui:focus_without_ink",
   ]
 }
+
+polymer_modulizer("cr_expand_button") {
+  js_file = "cr_expand_button.js"
+  html_file = "cr_expand_button.html"
+  html_type = "dom-module"
+  namespace_rewrites = [ "cr.ui.focusWithoutInk|focusWithoutInk" ]
+  auto_imports =
+      [ "ui/webui/resources/html/cr/ui/focus_without_ink.html|focusWithoutInk" ]
+}
+
+js_type_check("closure_compile_module") {
+  is_polymer3 = true
+  deps = [
+    ":cr_expand_button.m",
+  ]
+}
+
+js_library("cr_expand_button.m") {
+  sources = [
+    "$root_gen_dir/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.js",
+  ]
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
+  ]
+  extra_deps = [ ":cr_expand_button_module" ]
+}
diff --git a/ui/webui/resources/cr_elements/cr_slider/cr_slider.html b/ui/webui/resources/cr_elements/cr_slider/cr_slider.html
index 0773dd27..256a0af 100644
--- a/ui/webui/resources/cr_elements/cr_slider/cr_slider.html
+++ b/ui/webui/resources/cr_elements/cr_slider/cr_slider.html
@@ -150,6 +150,9 @@
         font-size: 12px;
         line-height: 1.5em;
         opacity: 0;
+        /* TODO(crbug.com/980856): Remove workaround after rendering bug is
+         * fixed. */
+        outline: 1px transparent solid;
         padding: 0 .67em;
         position: absolute;
         transform: translateX(-50%);
diff --git a/ui/webui/resources/cr_elements/cr_slider/cr_slider.js b/ui/webui/resources/cr_elements/cr_slider/cr_slider.js
index 909620c..36e7cd8 100644
--- a/ui/webui/resources/cr_elements/cr_slider/cr_slider.js
+++ b/ui/webui/resources/cr_elements/cr_slider/cr_slider.js
@@ -6,9 +6,6 @@
  * @fileoverview 'cr-slider' is a slider component used to select a number from
  * a continuous or discrete range of numbers.
  */
-
-
-
 cr.define('cr_slider', function() {
   /**
    * The |value| is the corresponding value that the current slider tick is
@@ -190,7 +187,6 @@
     /** @private {Map<string, number>} */
     deltaKeyMap_: null,
 
-
     /** @private {EventTracker} */
     draggingEventTracker_: null,
 
diff --git a/ui/webui/resources/cr_elements/policy/BUILD.gn b/ui/webui/resources/cr_elements/policy/BUILD.gn
index cd421a6a..46bae04c 100644
--- a/ui/webui/resources/cr_elements/policy/BUILD.gn
+++ b/ui/webui/resources/cr_elements/policy/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
 
 js_type_check("closure_compile") {
   deps = [
@@ -87,3 +88,26 @@
 
 js_library("cr_tooltip_icon") {
 }
+
+polymer_modulizer("cr_tooltip_icon") {
+  js_file = "cr_tooltip_icon.js"
+  html_file = "cr_tooltip_icon.html"
+  html_type = "dom-module"
+}
+
+js_type_check("closure_compile_module") {
+  is_polymer3 = true
+  deps = [
+    ":cr_tooltip_icon.m",
+  ]
+}
+
+js_library("cr_tooltip_icon.m") {
+  sources = [
+    "$root_gen_dir/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.m.js",
+  ]
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+  ]
+  extra_deps = [ ":cr_tooltip_icon_module" ]
+}
diff --git a/ui/webui/resources/cr_elements_resources_v3.grdp b/ui/webui/resources/cr_elements_resources_v3.grdp
index 62690a6..04a536e5 100644
--- a/ui/webui/resources/cr_elements_resources_v3.grdp
+++ b/ui/webui/resources/cr_elements_resources_v3.grdp
@@ -26,6 +26,11 @@
          use_base_dir="false"
          type="BINDATA"
          compress="gzip" />
+  <include name="IDR_CR_ELEMENTS_CR_EXPAND_BUTTON_M_JS"
+         file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.js"
+         use_base_dir="false"
+         type="BINDATA"
+         compress="gzip" />
   <include name="IDR_CR_ELEMENTS_CR_ICON_BUTTON_M_JS"
          file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.js"
          use_base_dir="false"
@@ -101,6 +106,11 @@
          use_base_dir="false"
          type="BINDATA"
          compress="gzip" />
+  <include name="IDR_CR_ELEMENTS_CR_TOOLTIP_ICON_M_JS"
+         file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.m.js"
+         use_base_dir="false"
+         type="BINDATA"
+         compress="gzip" />
   <include name="IDR_CR_ELEMENTS_CR_VIEW_MANAGER_M_JS"
          file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.m.js"
          use_base_dir="false"
diff --git a/ui/webui/resources/js/chromeos/onc_mojo.js b/ui/webui/resources/js/chromeos/onc_mojo.js
index 2fb069e..affb7a0 100644
--- a/ui/webui/resources/js/chromeos/onc_mojo.js
+++ b/ui/webui/resources/js/chromeos/onc_mojo.js
@@ -529,6 +529,7 @@
           networkTechnology: '',
           roaming: false,
           signalStrength: 0,
+          simLocked: false,
         };
         break;
       case mojom.NetworkType.kEthernet:
diff --git a/ui/webui/resources/js/cr/ui/BUILD.gn b/ui/webui/resources/js/cr/ui/BUILD.gn
index 38935cf..c72b12a 100644
--- a/ui/webui/resources/js/cr/ui/BUILD.gn
+++ b/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -8,6 +8,7 @@
 group("closure_compile") {
   deps = [
     ":ui_resources",
+    ":ui_resources_modules",
     "page_manager:closure_compile",
   ]
 }
@@ -266,7 +267,17 @@
 }
 
 js_modulizer("modulize") {
-  input_files = [ "focus_outline_manager.js" ]
+  input_files = [
+    "focus_outline_manager.js",
+    "focus_without_ink.js",
+  ]
+}
+
+js_type_check("ui_resources_modules") {
+  deps = [
+    ":focus_outline_manager.m",
+    ":focus_without_ink.m",
+  ]
 }
 
 js_library("focus_outline_manager.m") {
@@ -275,3 +286,14 @@
   ]
   extra_deps = [ ":modulize" ]
 }
+
+js_library("focus_without_ink.m") {
+  deps = [
+    "../..:assert.m",
+    "../..:cr.m",
+  ]
+  sources = [
+    "$root_gen_dir/ui/webui/resources/js/cr/ui/focus_without_ink.m.js",
+  ]
+  extra_deps = [ ":modulize" ]
+}
diff --git a/ui/webui/resources/js/cr/ui/focus_without_ink.js b/ui/webui/resources/js/cr/ui/focus_without_ink.js
index d2ee22f..bb43929 100644
--- a/ui/webui/resources/js/cr/ui/focus_without_ink.js
+++ b/ui/webui/resources/js/cr/ui/focus_without_ink.js
@@ -2,10 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {assert} from 'chrome://resources/js/assert.m.js'
+// #import {isIOS} from 'chrome://resources/js/cr.m.js'
+// clang-format on
+
 cr.define('cr.ui', function() {
-  if (cr.ui.focusWithoutInk) {
-    return;
-  }
+  /* #ignore */ if (cr.ui.focusWithoutInk) {
+    /* #ignore */ return;
+  /* #ignore */ }
 
   let hideInk = false;
 
@@ -26,7 +31,7 @@
    * helpful to show focus ripples in that case. This is Polymer-specific.
    * @param {!Element} toFocus
    */
-  const focusWithoutInk = function(toFocus) {
+  /* #export */ const focusWithoutInk = function(toFocus) {
     // |toFocus| does not have a 'noink' property, so it's unclear whether the
     // element has "ink" and/or whether it can be suppressed. Just focus().
     if (!('noink' in toFocus) || !hideInk) {
@@ -42,5 +47,6 @@
     toFocus.noink = noink;
   };
 
+  // #cr_define_end
   return {focusWithoutInk: focusWithoutInk};
 });
diff --git a/ui/webui/resources/tools/js_modulizer.py b/ui/webui/resources/tools/js_modulizer.py
index 300b5e6..227f8a5 100644
--- a/ui/webui/resources/tools/js_modulizer.py
+++ b/ui/webui/resources/tools/js_modulizer.py
@@ -42,6 +42,7 @@
 
 IMPORT_LINE_REGEX = '// #import'
 EXPORT_LINE_REGEX = '/* #export */'
+IGNORE_LINE_REGEX = '\s+/\* #ignore \*/(\S|\s)*'
 
 # Ignore lines that contain <include> tags, (for example see util.js).
 INCLUDE_LINE_REGEX = '^// <include '
@@ -81,6 +82,10 @@
         indices_to_remove.append(i)
         continue
 
+      if re.match(IGNORE_LINE_REGEX, line):
+        indices_to_remove.append(i)
+        continue
+
       if re.match(CR_DEFINE_START_REGEX, line):
         assert cr_define_start_index == -1, (
             'Multiple cr.define() calls not supported.')
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index c368d5d6..03a5424e 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -89,6 +89,9 @@
       <include name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER_M_JS"
                file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_outline_manager.m.js"
                use_base_dir="false" type="BINDATA" compress="gzip" />
+      <include name="IDR_WEBUI_JS_CR_UI_FOCUS_WITHOUT_INK_M_JS"
+               file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_without_ink.m.js"
+               use_base_dir="false" type="BINDATA" compress="gzip" />
       <include name="IDR_WEBUI_JS_EVENT_TRACKER_M_JS"
                file="${root_gen_dir}/ui/webui/resources/js/event_tracker.m.js"
                use_base_dir="false" type="BINDATA" compress="gzip" />
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn
index b42f6d8..e5ca83f2 100644
--- a/weblayer/BUILD.gn
+++ b/weblayer/BUILD.gn
@@ -130,7 +130,6 @@
 
   if (is_android) {
     deps += [
-      "//components/embedder_support/android:view",
       "//ui/android",
       "//weblayer/browser/java:jni",
     ]
@@ -139,6 +138,10 @@
       "app/jni_onload.h",
       "browser/browser_observer_proxy.cc",
       "browser/browser_observer_proxy.h",
+      "browser/content_view_render_view.cc",
+      "browser/content_view_render_view.h",
+      "browser/top_controls_container_view.cc",
+      "browser/top_controls_container_view.h",
     ]
   }
 
diff --git a/weblayer/browser/browser_controller_impl.cc b/weblayer/browser/browser_controller_impl.cc
index 730704c8..66deda24 100644
--- a/weblayer/browser/browser_controller_impl.cc
+++ b/weblayer/browser/browser_controller_impl.cc
@@ -5,7 +5,9 @@
 #include "weblayer/browser/browser_controller_impl.h"
 
 #include "base/logging.h"
+#include "content/public/browser/interstitial_page.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/browser_controls_state.h"
 #include "weblayer/browser/navigation_controller_impl.h"
 #include "weblayer/browser/profile_impl.h"
 #include "weblayer/public/browser_observer.h"
@@ -17,6 +19,7 @@
 #if defined(OS_ANDROID)
 #include "base/android/jni_string.h"
 #include "weblayer/browser/java/jni/BrowserControllerImpl_jni.h"
+#include "weblayer/browser/top_controls_container_view.h"
 #endif
 
 namespace weblayer {
@@ -80,6 +83,15 @@
     const base::android::JavaParamRef<jobject>& obj) {
   return web_contents_->GetJavaWebContents();
 }
+
+void BrowserControllerImpl::SetTopControlsContainerView(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    jlong native_top_controls_container_view) {
+  top_controls_container_view_ = reinterpret_cast<TopControlsContainerView*>(
+      native_top_controls_container_view);
+}
+
 #endif
 
 void BrowserControllerImpl::LoadingStateChanged(content::WebContents* source,
@@ -95,11 +107,36 @@
     observer.DisplayedURLChanged(web_contents->GetVisibleURL());
 }
 
+int BrowserControllerImpl::GetTopControlsHeight() {
+#if defined(OS_ANDROID)
+  return top_controls_container_view_->GetTopControlsHeight();
+#else
+  return 0;
+#endif
+}
+
 void BrowserControllerImpl::DidFirstVisuallyNonEmptyPaint() {
   for (auto& observer : observers_)
     observer.FirstContentfulPaint();
 }
 
+void BrowserControllerImpl::DidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+#if defined(OS_ANDROID)
+  web_contents_->GetMainFrame()->UpdateBrowserControlsState(
+      content::BROWSER_CONTROLS_STATE_BOTH,
+      content::BROWSER_CONTROLS_STATE_SHOWN, false);
+
+  if (web_contents_->ShowingInterstitialPage()) {
+    web_contents_->GetInterstitialPage()
+        ->GetMainFrame()
+        ->UpdateBrowserControlsState(content::BROWSER_CONTROLS_STATE_SHOWN,
+                                     content::BROWSER_CONTROLS_STATE_SHOWN,
+                                     false);
+  }
+#endif
+}
+
 std::unique_ptr<BrowserController> BrowserController::Create(
     Profile* profile,
     const gfx::Size& initial_size) {
diff --git a/weblayer/browser/browser_controller_impl.h b/weblayer/browser/browser_controller_impl.h
index b456137..8d260d5 100644
--- a/weblayer/browser/browser_controller_impl.h
+++ b/weblayer/browser/browser_controller_impl.h
@@ -24,6 +24,10 @@
 class NavigationControllerImpl;
 class ProfileImpl;
 
+#if defined(OS_ANDROID)
+class TopControlsContainerView;
+#endif
+
 class BrowserControllerImpl : public BrowserController,
                               public content::WebContentsDelegate,
                               public content::WebContentsObserver {
@@ -37,6 +41,10 @@
   base::android::ScopedJavaLocalRef<jobject> GetWebContents(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj);
+  void SetTopControlsContainerView(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& caller,
+      jlong native_top_controls_container_view);
 #endif
 
  private:
@@ -53,15 +61,20 @@
                            bool to_different_document) override;
   void DidNavigateMainFramePostCommit(
       content::WebContents* web_contents) override;
+  int GetTopControlsHeight() override;
 
   // content::WebContentsObserver implementation:
   void DidFirstVisuallyNonEmptyPaint() override;
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
 
- private:
   ProfileImpl* profile_;
   std::unique_ptr<content::WebContents> web_contents_;
   std::unique_ptr<NavigationControllerImpl> navigation_controller_;
   base::ObserverList<BrowserObserver>::Unchecked observers_;
+#if defined(OS_ANDROID)
+  TopControlsContainerView* top_controls_container_view_ = nullptr;
+#endif
 
   DISALLOW_COPY_AND_ASSIGN(BrowserControllerImpl);
 };
diff --git a/weblayer/browser/content_view_render_view.cc b/weblayer/browser/content_view_render_view.cc
new file mode 100644
index 0000000..c0122fe
--- /dev/null
+++ b/weblayer/browser/content_view_render_view.cc
@@ -0,0 +1,153 @@
+// 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 "weblayer/browser/content_view_render_view.h"
+
+#include <android/bitmap.h>
+#include <android/native_window_jni.h>
+
+#include <memory>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/bind.h"
+#include "base/lazy_instance.h"
+#include "cc/layers/layer.h"
+#include "cc/layers/picture_layer.h"
+#include "content/public/browser/android/compositor.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/android/resources/resource_manager.h"
+#include "ui/android/view_android.h"
+#include "ui/android/window_android.h"
+#include "ui/gfx/android/java_bitmap.h"
+#include "ui/gfx/geometry/size.h"
+#include "weblayer/browser/java/jni/ContentViewRenderView_jni.h"
+
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+
+namespace weblayer {
+
+ContentViewRenderView::ContentViewRenderView(JNIEnv* env,
+                                             jobject obj,
+                                             gfx::NativeWindow root_window)
+    : root_window_(root_window), current_surface_format_(0) {
+  java_obj_.Reset(env, obj);
+}
+
+ContentViewRenderView::~ContentViewRenderView() {}
+
+// static
+static jlong JNI_ContentViewRenderView_Init(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    const JavaParamRef<jobject>& jroot_window_android) {
+  gfx::NativeWindow root_window =
+      ui::WindowAndroid::FromJavaWindowAndroid(jroot_window_android);
+  ContentViewRenderView* content_view_render_view =
+      new ContentViewRenderView(env, obj, root_window);
+  return reinterpret_cast<intptr_t>(content_view_render_view);
+}
+
+void ContentViewRenderView::Destroy(JNIEnv* env,
+                                    const JavaParamRef<jobject>& obj) {
+  delete this;
+}
+
+void ContentViewRenderView::SetCurrentWebContents(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    const JavaParamRef<jobject>& jweb_contents) {
+  InitCompositor();
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(jweb_contents);
+  if (web_contents_layer_)
+    web_contents_layer_->RemoveFromParent();
+  web_contents_layer_ = web_contents ? web_contents->GetNativeView()->GetLayer()
+                                     : scoped_refptr<cc::Layer>();
+
+  if (web_contents_layer_)
+    root_container_layer_->AddChild(web_contents_layer_);
+}
+
+void ContentViewRenderView::OnPhysicalBackingSizeChanged(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    const JavaParamRef<jobject>& jweb_contents,
+    jint width,
+    jint height) {
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(jweb_contents);
+  gfx::Size size(width, height);
+  web_contents->GetNativeView()->OnPhysicalBackingSizeChanged(size);
+}
+
+void ContentViewRenderView::SurfaceCreated(JNIEnv* env,
+                                           const JavaParamRef<jobject>& obj) {
+  current_surface_format_ = 0;
+  InitCompositor();
+}
+
+void ContentViewRenderView::SurfaceDestroyed(JNIEnv* env,
+                                             const JavaParamRef<jobject>& obj) {
+  compositor_->SetSurface(nullptr, false);
+  current_surface_format_ = 0;
+}
+
+void ContentViewRenderView::SurfaceChanged(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    jint format,
+    jint width,
+    jint height,
+    const JavaParamRef<jobject>& surface) {
+  if (current_surface_format_ != format) {
+    current_surface_format_ = format;
+    compositor_->SetSurface(surface, false /* backed_by_surface_texture */);
+  }
+  compositor_->SetWindowBounds(gfx::Size(width, height));
+}
+
+void ContentViewRenderView::SetOverlayVideoMode(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    bool enabled) {
+  compositor_->SetRequiresAlphaChannel(enabled);
+  compositor_->SetBackgroundColor(enabled ? SK_ColorTRANSPARENT
+                                          : SK_ColorWHITE);
+  compositor_->SetNeedsComposite();
+}
+
+base::android::ScopedJavaLocalRef<jobject>
+ContentViewRenderView::GetResourceManager(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jobj) {
+  return compositor_->GetResourceManager().GetJavaObject();
+}
+
+void ContentViewRenderView::UpdateLayerTreeHost() {
+  // TODO(wkorman): Rename Layout to UpdateLayerTreeHost in all Android
+  // Compositor related classes.
+}
+
+void ContentViewRenderView::DidSwapFrame(int pending_frames) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_ContentViewRenderView_didSwapFrame(env, java_obj_);
+}
+
+void ContentViewRenderView::InitCompositor() {
+  if (compositor_)
+    return;
+
+  compositor_.reset(content::Compositor::Create(this, root_window_));
+  root_container_layer_ = cc::Layer::Create();
+  root_container_layer_->SetHitTestable(false);
+  root_container_layer_->SetElementId(
+      cc::ElementId(root_container_layer_->id()));
+  root_container_layer_->SetIsDrawable(false);
+  compositor_->SetRootLayer(root_container_layer_);
+}
+
+}  // namespace weblayer
diff --git a/weblayer/browser/content_view_render_view.h b/weblayer/browser/content_view_render_view.h
new file mode 100644
index 0000000..c6158d7
--- /dev/null
+++ b/weblayer/browser/content_view_render_view.h
@@ -0,0 +1,93 @@
+// 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_EMBEDDER_SUPPORT_ANDROID_VIEW_CONTENT_VIEW_RENDER_VIEW_H_
+#define COMPONENTS_EMBEDDER_SUPPORT_ANDROID_VIEW_CONTENT_VIEW_RENDER_VIEW_H_
+
+#include <memory>
+
+#include "base/android/jni_weak_ref.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/android/compositor_client.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace cc {
+class Layer;
+}
+
+namespace content {
+class Compositor;
+}  // namespace content
+
+namespace weblayer {
+
+class ContentViewRenderView : public content::CompositorClient {
+ public:
+  ContentViewRenderView(JNIEnv* env,
+                        jobject obj,
+                        gfx::NativeWindow root_window);
+
+  content::Compositor* compositor() { return compositor_.get(); }
+
+  scoped_refptr<cc::Layer> root_container_layer() {
+    return root_container_layer_;
+  }
+
+  // Methods called from Java via JNI -----------------------------------------
+  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void SetCurrentWebContents(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::JavaParamRef<jobject>& jweb_contents);
+  void OnPhysicalBackingSizeChanged(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::JavaParamRef<jobject>& jweb_contents,
+      jint width,
+      jint height);
+  void SurfaceCreated(JNIEnv* env,
+                      const base::android::JavaParamRef<jobject>& obj);
+  void SurfaceDestroyed(JNIEnv* env,
+                        const base::android::JavaParamRef<jobject>& obj);
+  void SurfaceChanged(JNIEnv* env,
+                      const base::android::JavaParamRef<jobject>& obj,
+                      jint format,
+                      jint width,
+                      jint height,
+                      const base::android::JavaParamRef<jobject>& surface);
+  void SetOverlayVideoMode(JNIEnv* env,
+                           const base::android::JavaParamRef<jobject>& obj,
+                           bool enabled);
+  base::android::ScopedJavaLocalRef<jobject> GetResourceManager(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jobj);
+
+  // CompositorClient implementation
+  void UpdateLayerTreeHost() override;
+  void DidSwapFrame(int pending_frames) override;
+
+ private:
+  ~ContentViewRenderView() override;
+
+  void InitCompositor();
+
+  base::android::ScopedJavaGlobalRef<jobject> java_obj_;
+
+  std::unique_ptr<content::Compositor> compositor_;
+
+  gfx::NativeWindow root_window_;
+  int current_surface_format_;
+
+  // Set as the root-layer of the compositor. Contains |web_contents_layer_|.
+  scoped_refptr<cc::Layer> root_container_layer_;
+  scoped_refptr<cc::Layer> web_contents_layer_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentViewRenderView);
+};
+
+}  // namespace weblayer
+
+#endif  // COMPONENTS_EMBEDDER_SUPPORT_ANDROID_VIEW_CONTENT_VIEW_RENDER_VIEW_H_
diff --git a/weblayer/browser/java/BUILD.gn b/weblayer/browser/java/BUILD.gn
index 24403c5..b429a540 100644
--- a/weblayer/browser/java/BUILD.gn
+++ b/weblayer/browser/java/BUILD.gn
@@ -9,9 +9,11 @@
   java_files = [
     "org/chromium/weblayer_private/BrowserControllerImpl.java",
     "org/chromium/weblayer_private/BrowserObserverProxy.java",
+    "org/chromium/weblayer_private/ContentViewRenderView.java",
     "org/chromium/weblayer_private/NavigationControllerImpl.java",
     "org/chromium/weblayer_private/NavigationImpl.java",
     "org/chromium/weblayer_private/ProfileImpl.java",
+    "org/chromium/weblayer_private/TopControlsContainerView.java",
     "org/chromium/weblayer_private/WebLayerImpl.java",
   ]
 
@@ -19,7 +21,6 @@
     ":client_java",
     "//base:base_java",
     "//components/embedder_support/android:content_view_java",
-    "//components/embedder_support/android:view_java",
     "//content/public/android:content_java",
     "//ui/android:ui_java",
   ]
@@ -29,9 +30,11 @@
   sources = [
     "org/chromium/weblayer_private/BrowserControllerImpl.java",
     "org/chromium/weblayer_private/BrowserObserverProxy.java",
+    "org/chromium/weblayer_private/ContentViewRenderView.java",
     "org/chromium/weblayer_private/NavigationControllerImpl.java",
     "org/chromium/weblayer_private/NavigationImpl.java",
     "org/chromium/weblayer_private/ProfileImpl.java",
+    "org/chromium/weblayer_private/TopControlsContainerView.java",
   ]
 }
 
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
index cd9ee22..358f11e8 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControllerImpl.java
@@ -5,15 +5,15 @@
 package org.chromium.weblayer_private;
 
 import android.content.Context;
+import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
-import android.widget.LinearLayout;
+import android.widget.FrameLayout;
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.components.embedder_support.view.ContentView;
-import org.chromium.components.embedder_support.view.ContentViewRenderView;
 import org.chromium.content_public.browser.ViewEventSink;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.ActivityWindowAndroid;
@@ -29,17 +29,16 @@
     private long mNativeBrowserController;
 
     private ActivityWindowAndroid mWindowAndroid;
-    // This is set as the content view of the activity. It contains mContentViewRenderView.
-    private LinearLayout mLinearLayout;
-    // This is parented to mLinearLayout.
+    // This view is the main view (returned from OnCreateView()).
     private ContentViewRenderView mContentViewRenderView;
     // One of these is needed per WebContents.
     private ContentView mContentView;
+    // Child of mContentViewRenderView, holds top-view from client.
+    private TopControlsContainerView mTopControlsContainerView;
     private ProfileImpl mProfile;
     private WebContents mWebContents;
     private BrowserObserverProxy mBrowserObserverProxy;
     private NavigationControllerImpl mNavigationController;
-    private View mTopView;
 
     private static class InternalAccessDelegateImpl
             implements ViewEventSink.InternalAccessDelegate {
@@ -65,9 +64,6 @@
     public BrowserControllerImpl(Context context, ProfileImpl profile) {
         mProfile = profile;
 
-        mLinearLayout = new LinearLayout(context);
-        mLinearLayout.setOrientation(LinearLayout.VERTICAL);
-
         mWindowAndroid = new ActivityWindowAndroid(context);
         mContentViewRenderView = new ContentViewRenderView(context);
         mWindowAndroid.setAnimationPlaceholderView(mContentViewRenderView.getSurfaceView());
@@ -76,21 +72,33 @@
 
         mNativeBrowserController = nativeCreateBrowserController(profile.getNativeProfile());
         mWebContents = nativeGetWebContents(mNativeBrowserController);
-        mWebContents.initialize("", ViewAndroidDelegate.createBasicDelegate(mContentViewRenderView),
-                new InternalAccessDelegateImpl(), mWindowAndroid,
-                WebContents.createDefaultInternalsHolder());
+        mContentView = ContentView.createContentView(context, mWebContents);
+        ViewAndroidDelegate viewAndroidDelegate = new ViewAndroidDelegate(mContentViewRenderView) {
+            @Override
+            public void onTopControlsChanged(int topControlsOffsetY, int topContentOffsetY) {
+                mTopControlsContainerView.onTopControlsChanged(
+                        topControlsOffsetY, topContentOffsetY);
+            }
+        };
+        mWebContents.initialize("", viewAndroidDelegate, new InternalAccessDelegateImpl(),
+                mWindowAndroid, WebContents.createDefaultInternalsHolder());
 
         mContentViewRenderView.setCurrentWebContents(mWebContents);
-        mLinearLayout.addView(mContentViewRenderView,
-                new LinearLayout.LayoutParams(
-                        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f));
 
-        mContentView = ContentView.createContentView(context, mWebContents);
         mContentViewRenderView.addView(mContentView,
-                new LinearLayout.LayoutParams(
-                        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1f));
+                new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
+                        FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY));
+
+        mTopControlsContainerView =
+                new TopControlsContainerView(context, mWebContents, mContentViewRenderView);
+        nativeSetTopControlsContainerView(
+                mNativeBrowserController, mTopControlsContainerView.getNativeHandle());
+        mContentView.addView(mTopControlsContainerView,
+                new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
+                        Gravity.FILL_HORIZONTAL | Gravity.TOP));
 
         mWebContents.onShow();
+        mContentView.requestFocus();
     }
 
     long getNativeBrowserController() {
@@ -112,6 +120,9 @@
 
     @Override
     public void destroy() {
+        nativeSetTopControlsContainerView(mNativeBrowserController, 0);
+        mContentViewRenderView.destroy();
+        mTopControlsContainerView.destroy();
         if (mBrowserObserverProxy != null) mBrowserObserverProxy.destroy();
         mBrowserObserverProxy = null;
         mNavigationController = null;
@@ -122,22 +133,17 @@
     @Override
     public void setTopView(IObjectWrapper viewWrapper) {
         View view = ObjectWrapper.unwrap(viewWrapper, View.class);
-        if (mTopView == view) return;
-        if (mTopView != null) mLinearLayout.removeView(mTopView);
-        mTopView = view;
-        if (mTopView != null) {
-            mLinearLayout.addView(mTopView, 0,
-                    new LinearLayout.LayoutParams(
-                            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0f));
-        }
+        mTopControlsContainerView.setView(view);
     }
 
     @Override
     public IObjectWrapper onCreateView() {
-        return ObjectWrapper.wrap(mLinearLayout);
+        return ObjectWrapper.wrap(mContentViewRenderView);
     }
 
     private static native long nativeCreateBrowserController(long profile);
+    private native void nativeSetTopControlsContainerView(
+            long nativeBrowserControllerImpl, long nativeTopControlsContainerView);
     private static native void nativeDeleteBrowserController(long browserController);
     private native WebContents nativeGetWebContents(long nativeBrowserControllerImpl);
 }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
new file mode 100644
index 0000000..156deff
--- /dev/null
+++ b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
@@ -0,0 +1,241 @@
+// Copyright 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.
+
+package org.chromium.weblayer_private;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.resources.ResourceManager;
+
+/***
+ * This view is used by a ContentView to render its content.
+ * Call {@link #setCurrentWebContents(WebContents)} with the webContents that should be
+ * managing the content.
+ * Note that only one WebContents can be shown at a time.
+ */
+@JNINamespace("weblayer")
+public class ContentViewRenderView extends FrameLayout {
+    // The native side of this object.
+    private long mNativeContentViewRenderView;
+    private SurfaceHolder.Callback mSurfaceCallback;
+    private WindowAndroid mWindowAndroid;
+
+    private final SurfaceView mSurfaceView;
+    protected WebContents mWebContents;
+
+    private int mWidth;
+    private int mHeight;
+
+    /**
+     * Constructs a new ContentViewRenderView.
+     * This should be called and the {@link ContentViewRenderView} should be added to the view
+     * hierarchy before the first draw to avoid a black flash that is seen every time a
+     * {@link SurfaceView} is added.
+     * @param context The context used to create this.
+     */
+    public ContentViewRenderView(Context context) {
+        super(context);
+
+        mSurfaceView = createSurfaceView(getContext());
+        mSurfaceView.setZOrderMediaOverlay(true);
+
+        setSurfaceViewBackgroundColor(Color.WHITE);
+        addView(mSurfaceView,
+                new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
+                        FrameLayout.LayoutParams.MATCH_PARENT));
+        mSurfaceView.setVisibility(GONE);
+    }
+
+    /**
+     * Initialization that requires native libraries should be done here.
+     * Native code should add/remove the layers to be rendered through the ContentViewLayerRenderer.
+     * @param rootWindow The {@link WindowAndroid} this render view should be linked to.
+     */
+    public void onNativeLibraryLoaded(WindowAndroid rootWindow) {
+        assert !mSurfaceView.getHolder().getSurface().isValid()
+            : "Surface created before native library loaded.";
+        assert rootWindow != null;
+        mNativeContentViewRenderView = nativeInit(rootWindow);
+        assert mNativeContentViewRenderView != 0;
+        mWindowAndroid = rootWindow;
+        mSurfaceCallback = new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+                assert mNativeContentViewRenderView != 0;
+                nativeSurfaceChanged(
+                        mNativeContentViewRenderView, format, width, height, holder.getSurface());
+                if (mWebContents != null) {
+                    nativeOnPhysicalBackingSizeChanged(
+                            mNativeContentViewRenderView, mWebContents, width, height);
+                }
+            }
+
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {
+                assert mNativeContentViewRenderView != 0;
+                nativeSurfaceCreated(mNativeContentViewRenderView);
+
+                // On pre-M Android, layers start in the hidden state until a relayout happens.
+                // There is a bug that manifests itself when entering overlay mode on pre-M devices,
+                // where a relayout never happens. This bug is out of Chromium's control, but can be
+                // worked around by forcibly re-setting the visibility of the surface view.
+                // Otherwise, the screen stays black, and some tests fail.
+                mSurfaceView.setVisibility(mSurfaceView.getVisibility());
+
+                onReadyToRender();
+            }
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {
+                assert mNativeContentViewRenderView != 0;
+                nativeSurfaceDestroyed(mNativeContentViewRenderView);
+            }
+        };
+        mSurfaceView.getHolder().addCallback(mSurfaceCallback);
+        mSurfaceView.setVisibility(VISIBLE);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        mWidth = w;
+        mHeight = h;
+        if (mWebContents != null) mWebContents.setSize(w, h);
+    }
+
+    /**
+     * View's method override to notify WindowAndroid about changes in its visibility.
+     */
+    @Override
+    protected void onWindowVisibilityChanged(int visibility) {
+        super.onWindowVisibilityChanged(visibility);
+
+        if (mWindowAndroid == null) return;
+
+        if (visibility == View.GONE) {
+            mWindowAndroid.onVisibilityChanged(false);
+        } else if (visibility == View.VISIBLE) {
+            mWindowAndroid.onVisibilityChanged(true);
+        }
+    }
+
+    /**
+     * Sets the background color of the surface view.  This method is necessary because the
+     * background color of ContentViewRenderView itself is covered by the background of
+     * SurfaceView.
+     * @param color The color of the background.
+     */
+    public void setSurfaceViewBackgroundColor(int color) {
+        if (mSurfaceView != null) {
+            mSurfaceView.setBackgroundColor(color);
+        }
+    }
+
+    /**
+     * Gets the SurfaceView for this ContentViewRenderView
+     */
+    public SurfaceView getSurfaceView() {
+        return mSurfaceView;
+    }
+
+    /**
+     * Should be called when the ContentViewRenderView is not needed anymore so its associated
+     * native resource can be freed.
+     */
+    public void destroy() {
+        mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
+        mWindowAndroid = null;
+        nativeDestroy(mNativeContentViewRenderView);
+        mNativeContentViewRenderView = 0;
+    }
+
+    public void setCurrentWebContents(WebContents webContents) {
+        assert mNativeContentViewRenderView != 0;
+        mWebContents = webContents;
+
+        if (webContents != null) {
+            webContents.setSize(mWidth, mHeight);
+            nativeOnPhysicalBackingSizeChanged(
+                    mNativeContentViewRenderView, webContents, mWidth, mHeight);
+        }
+        nativeSetCurrentWebContents(mNativeContentViewRenderView, webContents);
+    }
+
+    /**
+     * This method should be subclassed to provide actions to be performed once the view is ready to
+     * render.
+     */
+    protected void onReadyToRender() {}
+
+    /**
+     * This method could be subclassed optionally to provide a custom SurfaceView object to
+     * this ContentViewRenderView.
+     * @param context The context used to create the SurfaceView object.
+     * @return The created SurfaceView object.
+     */
+    protected SurfaceView createSurfaceView(Context context) {
+        return new SurfaceView(context);
+    }
+
+    /**
+     * @return whether the surface view is initialized and ready to render.
+     */
+    public boolean isInitialized() {
+        return mSurfaceView.getHolder().getSurface() != null;
+    }
+
+    /**
+     * Enter or leave overlay video mode.
+     * @param enabled Whether overlay mode is enabled.
+     */
+    public void setOverlayVideoMode(boolean enabled) {
+        int format = enabled ? PixelFormat.TRANSLUCENT : PixelFormat.OPAQUE;
+        mSurfaceView.getHolder().setFormat(format);
+        nativeSetOverlayVideoMode(mNativeContentViewRenderView, enabled);
+    }
+
+    public ResourceManager getResourceManager() {
+        return nativeGetResourceManager(mNativeContentViewRenderView);
+    }
+
+    @CalledByNative
+    private void didSwapFrame() {
+        if (mSurfaceView.getBackground() != null) {
+            post(new Runnable() {
+                @Override
+                public void run() {
+                    mSurfaceView.setBackgroundResource(0);
+                }
+            });
+        }
+    }
+
+    public long getNativeHandle() {
+        return mNativeContentViewRenderView;
+    }
+
+    private native long nativeInit(WindowAndroid rootWindow);
+    private native void nativeDestroy(long nativeContentViewRenderView);
+    private native void nativeSetCurrentWebContents(
+            long nativeContentViewRenderView, WebContents webContents);
+    private native void nativeOnPhysicalBackingSizeChanged(
+            long nativeContentViewRenderView, WebContents webContents, int width, int height);
+    private native void nativeSurfaceCreated(long nativeContentViewRenderView);
+    private native void nativeSurfaceDestroyed(long nativeContentViewRenderView);
+    private native void nativeSurfaceChanged(
+            long nativeContentViewRenderView, int format, int width, int height, Surface surface);
+    private native void nativeSetOverlayVideoMode(
+            long nativeContentViewRenderView, boolean enabled);
+    private native ResourceManager nativeGetResourceManager(long nativeContentViewRenderView);
+}
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/TopControlsContainerView.java b/weblayer/browser/java/org/chromium/weblayer_private/TopControlsContainerView.java
new file mode 100644
index 0000000..d71e1f6
--- /dev/null
+++ b/weblayer/browser/java/org/chromium/weblayer_private/TopControlsContainerView.java
@@ -0,0 +1,202 @@
+// 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.weblayer_private;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewParent;
+import android.widget.FrameLayout;
+
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.resources.dynamics.ViewResourceAdapter;
+
+/**
+ * TopControlsContainerView is responsible for holding the top-view from the client. Further, it
+ * has a ViewResourceAdapter that is kept in sync with the contents of the top-view.
+ * ViewResourceAdapter is used to keep a bitmap in sync with the contents of the top-view. The
+ * bitmap is placed in a cc::Layer and the layer is shown while scrolling the top-view.
+ * ViewResourceAdapter is always kept in sync, as to do otherwise results in a noticeable delay
+ * between when the scroll starts the content is available.
+ */
+@JNINamespace("weblayer")
+class TopControlsContainerView extends FrameLayout {
+    // ID used with ViewResourceAdapter.
+    private static final int TOP_CONTROLS_ID = 1001;
+
+    private long mNativeTopControlsContainerView;
+
+    private ViewResourceAdapter mViewResourceAdapter;
+
+    // Last width/height of mView as sent to the native side.
+    private int mLastWidth;
+    private int mLastHeight;
+
+    // view from the client.
+    private View mView;
+
+    private ContentViewRenderView mContentViewRenderView;
+
+    // True if scrolling.
+    private boolean mInTopControlsScroll;
+
+    // Used to  delay updating the image for the layer.
+    private final Runnable mRefreshResourceIdRunnable = () -> {
+        nativeUpdateTopControlsResource(mNativeTopControlsContainerView);
+    };
+
+    TopControlsContainerView(
+            Context context, WebContents webContents, ContentViewRenderView contentViewRenderView) {
+        super(context);
+        mContentViewRenderView = contentViewRenderView;
+        mNativeTopControlsContainerView = nativeCreateTopControlsContainerView(
+                webContents, contentViewRenderView.getNativeHandle());
+    }
+
+    public void destroy() {
+        setView(null);
+        nativeDeleteTopControlsContainerView(mNativeTopControlsContainerView);
+    }
+
+    public long getNativeHandle() {
+        return mNativeTopControlsContainerView;
+    }
+
+    /**
+     * Sets the view from the client.
+     */
+    public void setView(View view) {
+        if (mView == view) return;
+        if (mView != null) {
+            if (mView.getParent() == this) removeView(mView);
+            // TODO: need some sort of destroy to drop reference.
+            mViewResourceAdapter = null;
+            nativeDeleteTopControlsLayer(mNativeTopControlsContainerView);
+            mContentViewRenderView.getResourceManager()
+                    .getDynamicResourceLoader()
+                    .unregisterResource(TOP_CONTROLS_ID);
+        }
+        mView = view;
+        if (mView == null) return;
+        addView(view,
+                new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
+                        FrameLayout.LayoutParams.UNSPECIFIED_GRAVITY));
+        if (getWidth() > 0 && getHeight() > 0) {
+            view.layout(0, 0, getWidth(), getHeight());
+            createAdapterAndLayer();
+        }
+    }
+
+    public View getView() {
+        return mView;
+    }
+
+    /**
+     * Called from ViewAndroidDelegate, see it for details.
+     */
+    public void onTopControlsChanged(int topControlsOffsetY, int topContentOffsetY) {
+        if (topContentOffsetY == getHeight()) {
+            finishTopControlsScroll(topContentOffsetY);
+            return;
+        }
+        if (!mInTopControlsScroll) prepareForTopControlsScroll();
+        nativeSetTopControlsOffset(
+                mNativeTopControlsContainerView, topControlsOffsetY, topContentOffsetY);
+    }
+
+    @SuppressLint("NewApi") // Used on O+, invalidateChildInParent used for previous versions.
+    @Override
+    public void onDescendantInvalidated(View child, View target) {
+        super.onDescendantInvalidated(child, target);
+        invalidateViewResourceAdapter();
+    }
+
+    @Override
+    public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
+        invalidateViewResourceAdapter();
+        return super.invalidateChildInParent(location, dirty);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+        if (mView == null) return;
+        int width = right - left;
+        int height = bottom - top;
+        if (height != mLastHeight || width != mLastWidth) {
+            mLastWidth = width;
+            mLastHeight = height;
+            if (mLastWidth > 0 && mLastHeight > 0) {
+                if (mViewResourceAdapter == null) {
+                    createAdapterAndLayer();
+                } else {
+                    nativeSetTopControlsSize(
+                            mNativeTopControlsContainerView, mLastWidth, mLastHeight);
+                }
+            }
+        }
+    }
+
+    /**
+     * Triggers copying the contents of mView to the offscreen buffer.
+     */
+    private void invalidateViewResourceAdapter() {
+        if (mViewResourceAdapter == null || mView.getVisibility() != View.VISIBLE) return;
+        mViewResourceAdapter.invalidate(null);
+        removeCallbacks(mRefreshResourceIdRunnable);
+        postOnAnimation(mRefreshResourceIdRunnable);
+    }
+
+    /**
+     * Creates mViewResourceAdapter and the layer showing a copy of mView.
+     */
+    private void createAdapterAndLayer() {
+        assert mViewResourceAdapter == null;
+        assert mView != null;
+        mViewResourceAdapter = new ViewResourceAdapter(mView);
+        mContentViewRenderView.getResourceManager().getDynamicResourceLoader().registerResource(
+                TOP_CONTROLS_ID, mViewResourceAdapter);
+        // It's important that the layer is created immediately and always kept in sync with the
+        // View. Creating the layer only when needed results in a noticeable delay between when
+        // the layer is created and actually shown. Chrome for Android does the same thing.
+        nativeCreateTopControlsLayer(mNativeTopControlsContainerView, TOP_CONTROLS_ID);
+        mLastWidth = getWidth();
+        mLastHeight = getHeight();
+        nativeSetTopControlsSize(mNativeTopControlsContainerView, mLastWidth, mLastHeight);
+    }
+
+    private void finishTopControlsScroll(int topContentOffsetY) {
+        mInTopControlsScroll = false;
+        nativeSetTopControlsOffset(mNativeTopControlsContainerView, 0, topContentOffsetY);
+        mContentViewRenderView.postOnAnimation(() -> showTopControls());
+    }
+
+    private void prepareForTopControlsScroll() {
+        mInTopControlsScroll = true;
+        mContentViewRenderView.postOnAnimation(() -> hideTopControls());
+    }
+
+    private void hideTopControls() {
+        if (mView != null) mView.setVisibility(View.INVISIBLE);
+    }
+
+    private void showTopControls() {
+        if (mView != null) mView.setVisibility(View.VISIBLE);
+    }
+
+    private static native long nativeCreateTopControlsContainerView(
+            WebContents webContents, long nativeContentViewRenderView);
+    private native void nativeDeleteTopControlsContainerView(long nativeTopControlsContainerView);
+    private native void nativeCreateTopControlsLayer(long nativeTopControlsContainerView, int id);
+    private native void nativeDeleteTopControlsLayer(long nativeTopControlsContainerView);
+    private native void nativeSetTopControlsOffset(
+            long nativeTopControlsContainerView, int topControlsOffsetY, int topContentOffsetY);
+    private native void nativeSetTopControlsSize(
+            long nativeTopControlsContainerView, int width, int height);
+    private native void nativeUpdateTopControlsResource(long nativeTopControlsContainerView);
+}
diff --git a/weblayer/browser/top_controls_container_view.cc b/weblayer/browser/top_controls_container_view.cc
new file mode 100644
index 0000000..ede809d
--- /dev/null
+++ b/weblayer/browser/top_controls_container_view.cc
@@ -0,0 +1,109 @@
+// 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 "weblayer/browser/top_controls_container_view.h"
+
+#include "base/android/jni_string.h"
+#include "cc/layers/ui_resource_layer.h"
+#include "content/public/browser/android/compositor.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/browser_controls_state.h"
+#include "ui/android/resources/resource.h"
+#include "ui/android/resources/resource_manager.h"
+#include "ui/android/view_android.h"
+#include "weblayer/browser/content_view_render_view.h"
+#include "weblayer/browser/java/jni/TopControlsContainerView_jni.h"
+
+using base::android::AttachCurrentThread;
+
+namespace weblayer {
+
+TopControlsContainerView::TopControlsContainerView(
+    content::WebContents* web_contents,
+    ContentViewRenderView* content_view_render_view)
+    : content_view_render_view_(content_view_render_view),
+      web_contents_(web_contents) {
+  DCHECK(content_view_render_view_);
+  DCHECK(web_contents_);
+}
+
+TopControlsContainerView::~TopControlsContainerView() = default;
+
+int TopControlsContainerView::GetTopControlsHeight() {
+  return top_controls_layer_ ? top_controls_layer_->bounds().height() : 0;
+}
+
+void TopControlsContainerView::CreateTopControlsLayer(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    int id) {
+  top_controls_resource_id_ = id;
+  top_controls_layer_ = cc::UIResourceLayer::Create();
+  // Real size is sent in SetTopControlsSize().
+  top_controls_layer_->SetBounds(gfx::Size(1, 1));
+  top_controls_layer_->SetPosition(gfx::PointF(0, 0));
+  top_controls_layer_->SetElementId(cc::ElementId(top_controls_layer_->id()));
+  top_controls_layer_->SetHitTestable(false);
+  top_controls_layer_->SetIsDrawable(true);
+  content_view_render_view_->root_container_layer()->AddChild(
+      top_controls_layer_);
+  UpdateTopControlsResource(env, caller);
+}
+
+void TopControlsContainerView::DeleteTopControlsContainerView(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller) {
+  delete this;
+}
+
+void TopControlsContainerView::DeleteTopControlsLayer(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller) {
+  top_controls_layer_.reset();
+}
+
+void TopControlsContainerView::SetTopControlsOffset(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    int top_controls_offset_y,
+    int top_content_offset_y) {
+  DCHECK(top_controls_layer_);
+  top_controls_layer_->SetPosition(gfx::PointF(0, top_controls_offset_y));
+  web_contents_->GetNativeView()->GetLayer()->SetPosition(
+      gfx::PointF(0, top_content_offset_y));
+}
+
+void TopControlsContainerView::SetTopControlsSize(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    int width,
+    int height) {
+  DCHECK(top_controls_layer_);
+  top_controls_layer_->SetBounds(gfx::Size(width, height));
+}
+
+void TopControlsContainerView::UpdateTopControlsResource(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller) {
+  DCHECK(top_controls_layer_);
+  ui::ResourceManager& resource_manager =
+      content_view_render_view_->compositor()->GetResourceManager();
+  ui::Resource* top_controls_resource = resource_manager.GetResource(
+      ui::ANDROID_RESOURCE_TYPE_DYNAMIC, top_controls_resource_id_);
+  DCHECK(top_controls_resource);
+  top_controls_layer_->SetUIResourceId(
+      top_controls_resource->ui_resource()->id());
+}
+
+static jlong JNI_TopControlsContainerView_CreateTopControlsContainerView(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& web_contents,
+    jlong native_content_view_render_view) {
+  return reinterpret_cast<jlong>(new TopControlsContainerView(
+      content::WebContents::FromJavaWebContents(web_contents),
+      reinterpret_cast<ContentViewRenderView*>(
+          native_content_view_render_view)));
+}
+
+}  // namespace weblayer
diff --git a/weblayer/browser/top_controls_container_view.h b/weblayer/browser/top_controls_container_view.h
new file mode 100644
index 0000000..b39e2b3
--- /dev/null
+++ b/weblayer/browser/top_controls_container_view.h
@@ -0,0 +1,85 @@
+// 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 WEBLAYER_BROWSER_TOP_CONTROLS_CONTAINER_VIEW_H_
+#define WEBLAYER_BROWSER_TOP_CONTROLS_CONTAINER_VIEW_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "build/build_config.h"
+
+namespace cc {
+class UIResourceLayer;
+}  // namespace cc
+
+namespace content {
+class WebContents;
+}
+
+namespace weblayer {
+
+class ContentViewRenderView;
+
+// Native side of TopControlsContainerView. Responsible for creating and
+// positioning the cc::Layer that contains an image of the contents of the
+// top-control.
+class TopControlsContainerView {
+ public:
+  TopControlsContainerView(content::WebContents* web_contents,
+                           ContentViewRenderView* content_view_render_view);
+  ~TopControlsContainerView();
+
+  // Height needed to display the top-control.
+  int GetTopControlsHeight();
+
+  // Creates |top_controls_layer_|.
+  void CreateTopControlsLayer(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& caller,
+      int id);
+
+  // Deletes |this|.
+  void DeleteTopControlsContainerView(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& caller);
+
+  // Deletes |top_controls_layer_|.
+  void DeleteTopControlsLayer(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& caller);
+
+  // Sets the offsets of the top-controls and content. See ViewAndroidDelegate
+  // for details on this.
+  void SetTopControlsOffset(JNIEnv* env,
+                            const base::android::JavaParamRef<jobject>& caller,
+                            int top_controls_offset_y,
+                            int top_content_offset_y);
+
+  // Sets the size of |top_controls_layer_|.
+  void SetTopControlsSize(JNIEnv* env,
+                          const base::android::JavaParamRef<jobject>& caller,
+                          int width,
+                          int height);
+
+  // Triggers updating the resource (bitmap) shown in |top_controls_layer_|.
+  void UpdateTopControlsResource(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& caller);
+
+ private:
+  ContentViewRenderView* content_view_render_view_;
+  content::WebContents* web_contents_;
+  int top_controls_resource_id_ = -1;
+
+  // Layer containing showing the image for the top-controls. This is a sibling
+  // of the WebContents layer.
+  scoped_refptr<cc::UIResourceLayer> top_controls_layer_;
+
+  DISALLOW_COPY_AND_ASSIGN(TopControlsContainerView);
+};
+
+}  // namespace weblayer
+
+#endif  // WEBLAYER_BROWSER_TOP_CONTROLS_CONTAINER_VIEW_H_
diff --git a/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java b/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
index ade4fbe..89866600 100644
--- a/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
+++ b/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
@@ -36,6 +36,7 @@
     private Profile mProfile;
     private BrowserController mBrowserController;
     private EditText mUrlView;
+    private View mMainView;
 
     public static class ShellFragment extends Fragment {
         private BrowserController mBrowserController;
@@ -61,12 +62,16 @@
         LinearLayout mainView = new LinearLayout(this);
         int viewId = View.generateViewId();
         mainView.setId(viewId);
+        mMainView = mainView;
         setContentView(mainView);
 
         mUrlView = new EditText(this);
         mUrlView.setSelectAllOnFocus(true);
         mUrlView.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
         mUrlView.setImeOptions(EditorInfo.IME_ACTION_GO);
+        // The background of the top-view must be opaque, otherwise it bleeds through to the
+        // cc::Layer that mirrors the contents of the top-view.
+        mUrlView.setBackgroundColor(0xFFa9a9a9);
         mUrlView.setOnEditorActionListener(new OnEditorActionListener() {
             @Override
             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
@@ -111,6 +116,7 @@
 
     private void loadUrl(String url) {
         mBrowserController.getNavigationController().navigate(Uri.parse(sanitizeUrl(url)));
+        mUrlView.clearFocus();
     }
 
     /**