diff --git a/DEPS b/DEPS
index 24b2bd27..fba6e8ee 100644
--- a/DEPS
+++ b/DEPS
@@ -138,11 +138,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': 'c19999801df0ca538e8576b353177e76b6892512',
+  'skia_revision': 'e63b01b364a0e86668ff4c4508b725b2e6752c00',
   # 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': 'a839a8787787b39289c5d496e15d3514a1ac5e43',
+  'v8_revision': '6ba8b68b85689114be67b049e98820cad056c75d',
   # 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.
@@ -154,11 +154,11 @@
   # 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': 'a453ba42f72d0e513ada6bb29409bcde5d298612',
+  'swiftshader_revision': 'f4d2a446cc125cc147c7fc5f1a4bcbc8845b1a24',
   # 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': '2f0485479008ac708c0bc08708b123dad25dcbd0',
+  'pdfium_revision': '176c657a6d073a53cdafa17c64f626da482424ea',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -185,7 +185,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': 'ca374f5112fca6b36fc5d73e117a60b82f394993',
+  'nacl_revision': '4744a43b6fc4aaa5230541efad113b3cd86ea0f8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -273,7 +273,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '2a7b631482d8cb167d5651be130b08549b4dedc8',
+  'dawn_revision': 'c0c7e2f85bce063edf595ac014c040f0c7d04280',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -807,7 +807,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '4a0f5098c4db35c9b4be1fbbf356c37e8e4c296f',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'b5e56574cb70bb41c5f9a38062ac59dc9f5b1cfa',
       'condition': 'checkout_linux',
   },
 
@@ -832,7 +832,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'aca5b6aca87dd7872c457ae6589902876556c854',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c7e440c0091d166e956476b21b51b630ff750d1b',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1159,7 +1159,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'b1d095ba4f8f3ec1efd90dbd5cb0a37e5b4b21f7',
+    Var('chromium_git') + '/openscreen' + '@' + '216afe4f4bb26f2b7a08bc351a2ec52a78e0dc0b',
 
   'src/third_party/ow2_asm': {
       'packages': [
@@ -1182,7 +1182,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '1ef91c971fde3aa0ee292c425e8e8324a9f29228',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '6925d000325a4f996ead4f2282de44a746056298',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1350,7 +1350,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9c91887c3f47b037a412f045bee1fbf0302dd4ae',
+    Var('webrtc_git') + '/src.git' + '@' + '4f08faae82ccb0a252e83aec2baa9598c9f1716a',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1391,7 +1391,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@56355ce2d52f4caabe893932ee3970ef0fb03ffe',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@8908a37777ec27312e227ec935c80eddd2100af2',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc
index fc543a0..b2f1535 100644
--- a/android_webview/renderer/aw_render_frame_ext.cc
+++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -256,20 +256,18 @@
                                                    has_images));
 }
 
-void AwRenderFrameExt::FocusedNodeChanged(const blink::WebNode& node) {
-  if (node.IsNull() || !node.IsElementNode() || !render_frame() ||
-      !render_frame()->GetRenderView())
+void AwRenderFrameExt::FocusedElementChanged(const blink::WebElement& element) {
+  if (element.IsNull() || !render_frame() || !render_frame()->GetRenderView())
     return;
 
-  const blink::WebElement element = node.ToConst<blink::WebElement>();
   AwHitTestData data;
 
   data.href = GetHref(element);
   data.anchor_text = element.TextContent().Utf16();
 
   GURL absolute_link_url;
-  if (node.IsLink())
-    absolute_link_url = GetAbsoluteUrl(node, data.href);
+  if (element.IsLink())
+    absolute_link_url = GetAbsoluteUrl(element, data.href);
 
   GURL absolute_image_url = GetChildImageUrlFromElement(element);
 
diff --git a/android_webview/renderer/aw_render_frame_ext.h b/android_webview/renderer/aw_render_frame_ext.h
index 23f95e61..389a6bf 100644
--- a/android_webview/renderer/aw_render_frame_ext.h
+++ b/android_webview/renderer/aw_render_frame_ext.h
@@ -44,7 +44,7 @@
                                 ui::PageTransition transition) override;
 
   bool OnMessageReceived(const IPC::Message& message) override;
-  void FocusedNodeChanged(const blink::WebNode& node) override;
+  void FocusedElementChanged(const blink::WebElement& element) override;
   void OnDestruct() override;
 
   void OnDocumentHasImagesRequest(uint32_t id);
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 639f17b..a684fcb 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -46,7 +46,6 @@
     # TODO: move MultiUserWindowManager (and delegate) to sources:
     # https://crbug.com/756085
     "multi_user/multi_user_window_manager_impl.h",
-    "new_window_controller.h",
     "public/cpp/arc_custom_tab.h",
     "public/cpp/ash_prefs.h",
     "public/cpp/docked_magnifier_controller.h",
@@ -493,7 +492,6 @@
     "multi_user/user_switch_animator.h",
     "network_connect_delegate_mus.cc",
     "network_connect_delegate_mus.h",
-    "new_window_controller.cc",
     "note_taking_controller.cc",
     "note_taking_controller.h",
     "policy/policy_recommendation_restorer.cc",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 90a6450d..be990f8d 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -31,8 +31,8 @@
 #include "ash/media/media_controller.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/multi_profile_uma.h"
-#include "ash/new_window_controller.h"
 #include "ash/public/cpp/ash_features.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/interfaces/accessibility_controller.mojom.h"
 #include "ash/resources/vector_icons/vector_icons.h"
@@ -306,18 +306,18 @@
 
 void HandleNewIncognitoWindow() {
   base::RecordAction(UserMetricsAction("Accel_New_Incognito_Window"));
-  Shell::Get()->new_window_controller()->NewWindow(true /* is_incognito */);
+  NewWindowDelegate::GetInstance()->NewWindow(true /* is_incognito */);
 }
 
 void HandleNewTab(const ui::Accelerator& accelerator) {
   if (accelerator.key_code() == ui::VKEY_T)
     base::RecordAction(UserMetricsAction("Accel_NewTab_T"));
-  Shell::Get()->new_window_controller()->NewTab();
+  NewWindowDelegate::GetInstance()->NewTab();
 }
 
 void HandleNewWindow() {
   base::RecordAction(UserMetricsAction("Accel_New_Window"));
-  Shell::Get()->new_window_controller()->NewWindow(false /* is_incognito */);
+  NewWindowDelegate::GetInstance()->NewWindow(false /* is_incognito */);
 }
 
 bool CanCycleInputMethod() {
@@ -342,7 +342,7 @@
 
 void HandleOpenFeedbackPage() {
   base::RecordAction(UserMetricsAction("Accel_Open_Feedback_Page"));
-  Shell::Get()->new_window_controller()->OpenFeedbackPage();
+  NewWindowDelegate::GetInstance()->OpenFeedbackPage();
 }
 
 void HandleSwitchToLastUsedIme(const ui::Accelerator& accelerator) {
@@ -407,7 +407,7 @@
 
 void HandleRestoreTab() {
   base::RecordAction(UserMetricsAction("Accel_Restore_Tab"));
-  Shell::Get()->new_window_controller()->RestoreTab();
+  NewWindowDelegate::GetInstance()->RestoreTab();
 }
 
 // Rotate the active window.
@@ -428,7 +428,7 @@
 }
 
 void HandleShowKeyboardShortcutViewer() {
-  Shell::Get()->new_window_controller()->ShowKeyboardShortcutViewer();
+  NewWindowDelegate::GetInstance()->ShowKeyboardShortcutViewer();
 }
 
 void HandleTakeWindowScreenshot() {
@@ -472,7 +472,7 @@
 
 void HandleShowTaskManager() {
   base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager"));
-  Shell::Get()->new_window_controller()->ShowTaskManager();
+  NewWindowDelegate::GetInstance()->ShowTaskManager();
 }
 
 void HandleSwapPrimaryDisplay() {
@@ -608,7 +608,7 @@
 void HandleCrosh() {
   base::RecordAction(UserMetricsAction("Accel_Open_Crosh"));
 
-  Shell::Get()->new_window_controller()->OpenCrosh();
+  NewWindowDelegate::GetInstance()->OpenCrosh();
 }
 
 bool CanHandleDisableCapsLock(const ui::Accelerator& previous_accelerator) {
@@ -632,11 +632,11 @@
 void HandleFileManager() {
   base::RecordAction(UserMetricsAction("Accel_Open_File_Manager"));
 
-  Shell::Get()->new_window_controller()->OpenFileManager();
+  NewWindowDelegate::GetInstance()->OpenFileManager();
 }
 
 void HandleGetHelp() {
-  Shell::Get()->new_window_controller()->OpenGetHelp();
+  NewWindowDelegate::GetInstance()->OpenGetHelp();
 }
 
 bool CanHandleLock() {
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc
index b90b964..d7acb0a 100644
--- a/ash/assistant/assistant_controller.cc
+++ b/ash/assistant/assistant_controller.cc
@@ -9,8 +9,8 @@
 
 #include "ash/accessibility/accessibility_controller.h"
 #include "ash/assistant/util/deep_link_util.h"
-#include "ash/new_window_controller.h"
 #include "ash/public/cpp/ash_pref_names.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "ash/utility/screenshot_controller.h"
@@ -177,7 +177,7 @@
       break;
     }
     case DeepLinkType::kFeedback:
-      Shell::Get()->new_window_controller()->OpenFeedbackPage(
+      NewWindowDelegate::GetInstance()->OpenFeedbackPage(
           /*from_assistant=*/true);
       break;
     case DeepLinkType::kScreenshot:
@@ -188,7 +188,7 @@
       break;
     case DeepLinkType::kTaskManager:
       // Open task manager window.
-      Shell::Get()->new_window_controller()->ShowTaskManager();
+      NewWindowDelegate::GetInstance()->ShowTaskManager();
       break;
     case DeepLinkType::kUnsupported:
     case DeepLinkType::kAlarmTimer:
@@ -257,7 +257,7 @@
 
   // The new tab should be opened with a user activation since the user
   // interacted with the Assistant to open the url.
-  Shell::Get()->new_window_controller()->NewTabWithUrl(
+  NewWindowDelegate::GetInstance()->NewTabWithUrl(
       url, /*from_user_interaction=*/true);
   NotifyUrlOpened(url, from_server);
 }
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc
index bc2fea8..19dcc7a 100644
--- a/ash/assistant/assistant_notification_controller.cc
+++ b/ash/assistant/assistant_notification_controller.cc
@@ -9,7 +9,6 @@
 
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/util/deep_link_util.h"
-#include "ash/new_window_controller.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "ash/public/interfaces/voice_interaction_controller.mojom.h"
diff --git a/ash/dbus/url_handler_service_provider.cc b/ash/dbus/url_handler_service_provider.cc
index bcfd57aa..f0870ee 100644
--- a/ash/dbus/url_handler_service_provider.cc
+++ b/ash/dbus/url_handler_service_provider.cc
@@ -6,8 +6,7 @@
 
 #include <utility>
 
-#include "ash/new_window_controller.h"
-#include "ash/shell.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "base/bind.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
@@ -74,7 +73,7 @@
     return;
   }
 
-  ash::Shell::Get()->new_window_controller()->NewTabWithUrl(
+  NewWindowDelegate::GetInstance()->NewTabWithUrl(
       gurl, false /* from_user_interaction */);
   response_sender.Run(dbus::Response::FromMethodCall(method_call));
 }
diff --git a/ash/display/display_util.cc b/ash/display/display_util.cc
index cbece91d..c7038acd 100644
--- a/ash/display/display_util.cc
+++ b/ash/display/display_util.cc
@@ -12,7 +12,7 @@
 #include "ash/display/null_mouse_warp_controller.h"
 #include "ash/display/unified_mouse_warp_controller.h"
 #include "ash/host/ash_window_tree_host.h"
-#include "ash/new_window_controller.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
@@ -167,7 +167,7 @@
           base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
               base::BindRepeating([](base::Optional<int> button_index) {
                 if (button_index)
-                  Shell::Get()->new_window_controller()->OpenFeedbackPage();
+                  NewWindowDelegate::GetInstance()->OpenFeedbackPage();
               })),
           kNotificationMonitorWarningIcon,
           message_center::SystemNotificationWarningLevel::WARNING);
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index 96c690b3..9140616 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -638,10 +638,14 @@
   fingerprint_view_ = new FingerprintView();
 
   // TODO(jdufault): Implement real UI.
-  external_binary_auth_button_ = views::MdTextButton::Create(
-      this, base::ASCIIToUTF16("Authenticate with external binary"));
-  external_binary_enrollment_button_ = views::MdTextButton::Create(
-      this, base::ASCIIToUTF16("Enroll with external binary"));
+  external_binary_auth_button_ =
+      views::MdTextButton::Create(
+          this, base::ASCIIToUTF16("Authenticate with external binary"))
+          .release();
+  external_binary_enrollment_button_ =
+      views::MdTextButton::Create(
+          this, base::ASCIIToUTF16("Enroll with external binary"))
+          .release();
 
   SetPaintToLayer(ui::LayerType::LAYER_NOT_DRAWN);
 
diff --git a/ash/mojo_interface_factory.cc b/ash/mojo_interface_factory.cc
index adbf95f..11059f5 100644
--- a/ash/mojo_interface_factory.cc
+++ b/ash/mojo_interface_factory.cc
@@ -25,7 +25,6 @@
 #include "ash/kiosk_next/kiosk_next_shell_controller.h"
 #include "ash/login/login_screen_controller.h"
 #include "ash/media/media_controller.h"
-#include "ash/new_window_controller.h"
 #include "ash/note_taking_controller.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
@@ -154,11 +153,6 @@
   Shell::Get()->media_controller()->BindRequest(std::move(request));
 }
 
-void BindNewWindowControllerRequestOnMainThread(
-    mojom::NewWindowControllerRequest request) {
-  Shell::Get()->new_window_controller()->BindRequest(std::move(request));
-}
-
 void BindNightLightControllerRequestOnMainThread(
     mojom::NightLightControllerRequest request) {
   Shell::Get()->night_light_controller()->BindRequest(std::move(request));
@@ -277,11 +271,8 @@
       base::BindRepeating(&BindMediaControllerRequestOnMainThread),
       main_thread_task_runner);
   registry->AddInterface(
-      base::BindRepeating(&BindNewWindowControllerRequestOnMainThread),
+      base::BindRepeating(&BindNightLightControllerRequestOnMainThread),
       main_thread_task_runner);
-    registry->AddInterface(
-        base::BindRepeating(&BindNightLightControllerRequestOnMainThread),
-        main_thread_task_runner);
   registry->AddInterface(
       base::BindRepeating(&BindNoteTakingControllerRequestOnMainThread),
       main_thread_task_runner);
diff --git a/ash/new_window_controller.cc b/ash/new_window_controller.cc
deleted file mode 100644
index abb85d3e..0000000
--- a/ash/new_window_controller.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/new_window_controller.h"
-
-#include <utility>
-
-namespace ash {
-
-NewWindowController::NewWindowController() = default;
-
-NewWindowController::~NewWindowController() = default;
-
-void NewWindowController::BindRequest(
-    mojom::NewWindowControllerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void NewWindowController::SetClient(
-    mojom::NewWindowClientAssociatedPtrInfo client) {
-  client_.Bind(std::move(client));
-}
-
-void NewWindowController::NewTabWithUrl(const GURL& url,
-                                        bool from_user_interaction) {
-  if (client_)
-    client_->NewTabWithUrl(url, from_user_interaction);
-}
-
-void NewWindowController::NewTab() {
-  if (client_)
-    client_->NewTab();
-}
-
-void NewWindowController::NewWindow(bool incognito) {
-  if (client_)
-    client_->NewWindow(incognito);
-}
-
-void NewWindowController::OpenFileManager() {
-  if (client_)
-    client_->OpenFileManager();
-}
-
-void NewWindowController::OpenCrosh() {
-  if (client_)
-    client_->OpenCrosh();
-}
-
-void NewWindowController::OpenGetHelp() {
-  if (client_)
-    client_->OpenGetHelp();
-}
-
-void NewWindowController::RestoreTab() {
-  if (client_)
-    client_->RestoreTab();
-}
-
-void NewWindowController::ShowKeyboardShortcutViewer() {
-  if (client_)
-    client_->ShowKeyboardShortcutViewer();
-}
-
-void NewWindowController::ShowTaskManager() {
-  if (client_)
-    client_->ShowTaskManager();
-}
-
-void NewWindowController::OpenFeedbackPage(bool from_assistant) {
-  if (client_)
-    client_->OpenFeedbackPage(from_assistant);
-}
-
-}  // namespace ash
diff --git a/ash/new_window_controller.h b/ash/new_window_controller.h
deleted file mode 100644
index 5dd0215..0000000
--- a/ash/new_window_controller.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_NEW_WINDOW_CONTROLLER_H_
-#define ASH_NEW_WINDOW_CONTROLLER_H_
-
-#include "ash/ash_export.h"
-#include "ash/public/interfaces/new_window.mojom.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-// Provides the NewWindowController interface to the outside world. This lets a
-// consumer of ash provide a NewWindowClient, which we will dispatch to if one
-// has been provided to us.
-class ASH_EXPORT NewWindowController : public mojom::NewWindowController {
- public:
-  NewWindowController();
-  ~NewWindowController() override;
-
-  void BindRequest(mojom::NewWindowControllerRequest request);
-
-  // NewWindowController:
-  void SetClient(mojom::NewWindowClientAssociatedPtrInfo client) override;
-
-  // Pass throughs for methods of the same name on |client_|.
-  void NewTabWithUrl(const GURL& url, bool from_user_interaction);
-  void NewTab();
-  void NewWindow(bool incognito);
-  void OpenFileManager();
-  void OpenCrosh();
-  void OpenGetHelp();
-  void RestoreTab();
-  void ShowKeyboardShortcutViewer();
-  void ShowTaskManager();
-  void OpenFeedbackPage(bool from_assistant = false);
-
- private:
-  // More than one part of chrome may connect to call the mojo methods, so use
-  // BindingSet instead of Binding. http://crbug.com/794581
-  mojo::BindingSet<mojom::NewWindowController> bindings_;
-
-  mojom::NewWindowClientAssociatedPtr client_;
-
-  DISALLOW_COPY_AND_ASSIGN(NewWindowController);
-};
-
-}  // namespace ash
-
-#endif  // ASH_NEW_WINDOW_CONTROLLER_H_
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index b35b9af..e0a791b 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -91,6 +91,8 @@
     "login_constants.h",
     "network_icon_image_source.cc",
     "network_icon_image_source.h",
+    "new_window_delegate.cc",
+    "new_window_delegate.h",
     "notification_utils.cc",
     "notification_utils.h",
     "pagination/pagination_controller.cc",
@@ -246,6 +248,8 @@
     "immersive/immersive_fullscreen_controller_test_api.h",
     "test/test_keyboard_controller_observer.cc",
     "test/test_keyboard_controller_observer.h",
+    "test/test_new_window_delegate.cc",
+    "test/test_new_window_delegate.h",
   ]
 
   deps = [
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index d830c8f..2484c71 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -20,7 +20,6 @@
 #include "ash/public/interfaces/locale.mojom.h"
 #include "ash/public/interfaces/login_screen.mojom.h"
 #include "ash/public/interfaces/media.mojom.h"
-#include "ash/public/interfaces/new_window.mojom.h"
 #include "ash/public/interfaces/night_light_controller.mojom.h"
 #include "ash/public/interfaces/note_taking_controller.mojom.h"
 #include "ash/public/interfaces/shelf_integration_test_api.mojom.h"
@@ -78,11 +77,11 @@
                   mojom::ImeController, ime::mojom::ImeEngineFactoryRegistry,
                   mojom::KeyboardController, mojom::LocaleUpdateController,
                   mojom::LoginScreen, mojom::MediaController,
-                  mojom::NewWindowController, mojom::NightLightController,
-                  mojom::NoteTakingController, mojom::ShutdownController,
-                  mojom::SystemTray, mojom::TabletModeController,
-                  mojom::TrayAction, mojom::VoiceInteractionController,
-                  mojom::VpnList, mojom::WallpaperController>())
+                  mojom::NightLightController, mojom::NoteTakingController,
+                  mojom::ShutdownController, mojom::SystemTray,
+                  mojom::TabletModeController, mojom::TrayAction,
+                  mojom::VoiceInteractionController, mojom::VpnList,
+                  mojom::WallpaperController>())
           .ExposeCapability("test", service_manager::Manifest::InterfaceList<
                                         mojom::ShelfIntegrationTestApi>())
           .RequireCapability("*", "accessibility")
diff --git a/ash/public/cpp/new_window_delegate.cc b/ash/public/cpp/new_window_delegate.cc
new file mode 100644
index 0000000..4a042f7
--- /dev/null
+++ b/ash/public/cpp/new_window_delegate.cc
@@ -0,0 +1,29 @@
+// 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 "ash/public/cpp/new_window_delegate.h"
+
+#include "base/logging.h"
+
+namespace ash {
+namespace {
+NewWindowDelegate* g_new_window_delegate = nullptr;
+}
+
+// static
+NewWindowDelegate* NewWindowDelegate::GetInstance() {
+  return g_new_window_delegate;
+}
+
+NewWindowDelegate::NewWindowDelegate() {
+  DCHECK(!g_new_window_delegate);
+  g_new_window_delegate = this;
+}
+
+NewWindowDelegate::~NewWindowDelegate() {
+  DCHECK_EQ(g_new_window_delegate, this);
+  g_new_window_delegate = nullptr;
+}
+
+}  // namespace ash
diff --git a/ash/public/cpp/new_window_delegate.h b/ash/public/cpp/new_window_delegate.h
new file mode 100644
index 0000000..ae4bf4e5
--- /dev/null
+++ b/ash/public/cpp/new_window_delegate.h
@@ -0,0 +1,64 @@
+// 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 ASH_PUBLIC_CPP_NEW_WINDOW_DELEGATE_H_
+#define ASH_PUBLIC_CPP_NEW_WINDOW_DELEGATE_H_
+
+#include "ash/public/cpp/ash_public_export.h"
+#include "base/macros.h"
+
+class GURL;
+
+namespace ash {
+
+// A delegate interface that an ash user sends to ash to handle certain window
+// management responsibilities.
+class ASH_PUBLIC_EXPORT NewWindowDelegate {
+ public:
+  static NewWindowDelegate* GetInstance();
+
+  // Invoked when the user uses Ctrl+T to open a new tab.
+  virtual void NewTab() = 0;
+
+  // Opens a new tab with the specified URL. If the |from_user_interaction|
+  // is true then the page will load with a user activation. This means the
+  // page will be able to autoplay media without restriction.
+  virtual void NewTabWithUrl(const GURL& url, bool from_user_interaction) = 0;
+
+  // Invoked when the user uses Ctrl-N or Ctrl-Shift-N to open a new window.
+  virtual void NewWindow(bool incognito) = 0;
+
+  // Invoked when an accelerator is used to open the file manager.
+  virtual void OpenFileManager() = 0;
+
+  // Invoked when the user opens Crosh.
+  virtual void OpenCrosh() = 0;
+
+  // Invoked when an accelerator is used to open help center.
+  virtual void OpenGetHelp() = 0;
+
+  // Invoked when the user uses Shift+Ctrl+T to restore the closed tab.
+  virtual void RestoreTab() = 0;
+
+  // Show the keyboard shortcut viewer.
+  virtual void ShowKeyboardShortcutViewer() = 0;
+
+  // Shows the task manager window.
+  virtual void ShowTaskManager() = 0;
+
+  // Opens the feedback page for "Report Issue". If |from_assistant| is
+  // true then the page is triggered from Assistant.
+  virtual void OpenFeedbackPage(bool from_assistant = false) = 0;
+
+ protected:
+  NewWindowDelegate();
+  virtual ~NewWindowDelegate();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NewWindowDelegate);
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_NEW_WINDOW_DELEGATE_H_
diff --git a/ash/public/cpp/test/test_new_window_delegate.cc b/ash/public/cpp/test/test_new_window_delegate.cc
new file mode 100644
index 0000000..8704e19e
--- /dev/null
+++ b/ash/public/cpp/test/test_new_window_delegate.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 "ash/public/cpp/test/test_new_window_delegate.h"
+
+namespace ash {
+
+TestNewWindowDelegate::TestNewWindowDelegate() = default;
+TestNewWindowDelegate::~TestNewWindowDelegate() = default;
+
+void TestNewWindowDelegate::NewTab() {}
+void TestNewWindowDelegate::NewTabWithUrl(const GURL& url,
+                                          bool from_user_interaction) {}
+void TestNewWindowDelegate::NewWindow(bool incognito) {}
+void TestNewWindowDelegate::OpenFileManager() {}
+void TestNewWindowDelegate::OpenCrosh() {}
+void TestNewWindowDelegate::OpenGetHelp() {}
+void TestNewWindowDelegate::RestoreTab() {}
+void TestNewWindowDelegate::ShowKeyboardShortcutViewer() {}
+void TestNewWindowDelegate::ShowTaskManager() {}
+void TestNewWindowDelegate::OpenFeedbackPage(bool from_assistant) {}
+
+}  // namespace ash
diff --git a/ash/public/cpp/test/test_new_window_delegate.h b/ash/public/cpp/test/test_new_window_delegate.h
new file mode 100644
index 0000000..96d6365
--- /dev/null
+++ b/ash/public/cpp/test/test_new_window_delegate.h
@@ -0,0 +1,37 @@
+// 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 ASH_PUBLIC_CPP_TEST_TEST_NEW_WINDOW_DELEGATE_H_
+#define ASH_PUBLIC_CPP_TEST_TEST_NEW_WINDOW_DELEGATE_H_
+
+#include "ash/public/cpp/new_window_delegate.h"
+#include "base/macros.h"
+
+namespace ash {
+
+// NewWindowDelegate implementation which does nothing.
+class ASH_PUBLIC_EXPORT TestNewWindowDelegate : public NewWindowDelegate {
+ public:
+  TestNewWindowDelegate();
+  ~TestNewWindowDelegate() override;
+
+ private:
+  // NewWindowDelegate:
+  void NewTab() override;
+  void NewTabWithUrl(const GURL& url, bool from_user_interaction) override;
+  void NewWindow(bool incognito) override;
+  void OpenFileManager() override;
+  void OpenCrosh() override;
+  void OpenGetHelp() override;
+  void RestoreTab() override;
+  void ShowKeyboardShortcutViewer() override;
+  void ShowTaskManager() override;
+  void OpenFeedbackPage(bool from_assistant) override;
+
+  DISALLOW_COPY_AND_ASSIGN(TestNewWindowDelegate);
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_TEST_TEST_NEW_WINDOW_DELEGATE_H_
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn
index b8f99bf..4aba5ef2 100644
--- a/ash/public/interfaces/BUILD.gn
+++ b/ash/public/interfaces/BUILD.gn
@@ -39,7 +39,6 @@
     "login_screen.mojom",
     "login_user_info.mojom",
     "media.mojom",
-    "new_window.mojom",
     "night_light_controller.mojom",
     "note_taking_controller.mojom",
     "shelf_integration_test_api.mojom",
diff --git a/ash/public/interfaces/new_window.mojom b/ash/public/interfaces/new_window.mojom
deleted file mode 100644
index a82a07ca..0000000
--- a/ash/public/interfaces/new_window.mojom
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module ash.mojom;
-
-// For GURL.
-import "url/mojom/url.mojom";
-
-// An exported object in ash which lets an ash consumer set a client interface.
-interface NewWindowController {
-  SetClient(associated NewWindowClient client);
-};
-
-// A delegate interface that an ash user sends to ash to handle certain window
-// management responsibilities.
-interface NewWindowClient {
-  // Invoked when the user uses Ctrl+T to open a new tab.
-  NewTab();
-
-  // Opens a new tab with the specified URL. If the |from_user_interaction|
-  // is true then the page will load with a user activation. This means the
-  // page will be able to autoplay media without restriction.
-  NewTabWithUrl(url.mojom.Url url, bool from_user_interaction);
-
-  // Invoked when the user uses Ctrl-N or Ctrl-Shift-N to open a new window.
-  NewWindow(bool incognito);
-
-  // Invoked when an accelerator is used to open the file manager.
-  OpenFileManager();
-
-  // Invoked when the user opens Crosh.
-  OpenCrosh();
-
-  // Invoked when an accelerator is used to open help center.
-  OpenGetHelp();
-
-  // Invoked when the user uses Shift+Ctrl+T to restore the closed tab.
-  RestoreTab();
-
-  // Show the keyboard shortcut viewer.
-  ShowKeyboardShortcutViewer();
-
-  // Shows the task manager window.
-  ShowTaskManager();
-
-  // Opens the feedback page for "Report Issue". If |from_assistant| is
-  // true then the page is triggered from Assistant.
-  OpenFeedbackPage(bool from_assistant);
-};
diff --git a/ash/shell.cc b/ash/shell.cc
index 98bf6a06..009c6e2c 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -66,7 +66,6 @@
 #include "ash/media/media_controller.h"
 #include "ash/media/media_notification_controller_impl.h"
 #include "ash/multi_device_setup/multi_device_notification_presenter.h"
-#include "ash/new_window_controller.h"
 #include "ash/note_taking_controller.h"
 #include "ash/policy/policy_recommendation_restorer.h"
 #include "ash/public/cpp/ash_constants.h"
@@ -559,7 +558,6 @@
           std::make_unique<KeyboardBrightnessController>()),
       locale_update_controller_(std::make_unique<LocaleUpdateController>()),
       media_controller_(std::make_unique<MediaController>(connector)),
-      new_window_controller_(std::make_unique<NewWindowController>()),
       session_controller_(std::make_unique<SessionControllerImpl>()),
       note_taking_controller_(std::make_unique<NoteTakingController>()),
       shell_delegate_(std::move(shell_delegate)),
diff --git a/ash/shell.h b/ash/shell.h
index 6ecc61a..59ede42 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -143,7 +143,6 @@
 class MouseCursorEventFilter;
 class MruWindowTracker;
 class MultiDeviceNotificationPresenter;
-class NewWindowController;
 class NightLightController;
 class NoteTakingController;
 class OverlayEventFilter;
@@ -419,9 +418,6 @@
     return mouse_cursor_filter_.get();
   }
   MruWindowTracker* mru_window_tracker() { return mru_window_tracker_.get(); }
-  NewWindowController* new_window_controller() {
-    return new_window_controller_.get();
-  }
   NightLightController* night_light_controller();
   NoteTakingController* note_taking_controller() {
     return note_taking_controller_.get();
@@ -688,7 +684,6 @@
   std::unique_ptr<MruWindowTracker> mru_window_tracker_;
   std::unique_ptr<MultiDeviceNotificationPresenter>
       multidevice_notification_presenter_;
-  std::unique_ptr<NewWindowController> new_window_controller_;
   std::unique_ptr<ResizeShadowController> resize_shadow_controller_;
   std::unique_ptr<SessionControllerImpl> session_controller_;
   std::unique_ptr<NightLightController> night_light_controller_;
diff --git a/ash/shell/lock_view.cc b/ash/shell/lock_view.cc
index 7bb10fa8..8acda50 100644
--- a/ash/shell/lock_view.cc
+++ b/ash/shell/lock_view.cc
@@ -26,13 +26,11 @@
 class LockView : public views::WidgetDelegateView,
                  public views::ButtonListener {
  public:
-  LockView()
-      : text_(new views::Label(base::ASCIIToUTF16("LOCKED!"))),
-        unlock_button_(
-            views::MdTextButton::Create(this, base::ASCIIToUTF16("Unlock"))) {
+  LockView() : text_(new views::Label(base::ASCIIToUTF16("LOCKED!"))) {
     text_->SetEnabledColor(SK_ColorRED);
     AddChildView(text_);
-    AddChildView(unlock_button_);
+    unlock_button_ = AddChildView(
+        views::MdTextButton::Create(this, base::ASCIIToUTF16("Unlock")));
   }
   ~LockView() override = default;
 
diff --git a/ash/shell/widgets.cc b/ash/shell/widgets.cc
index 593c943..9e75a50 100644
--- a/ash/shell/widgets.cc
+++ b/ash/shell/widgets.cc
@@ -52,12 +52,7 @@
 };
 
 WidgetsWindow::WidgetsWindow()
-    : button_(
-          views::MdTextButton::Create(nullptr, base::ASCIIToUTF16("Button"))),
-      disabled_button_(
-          views::MdTextButton::Create(nullptr,
-                                      base::ASCIIToUTF16("Disabled button"))),
-      checkbox_(new views::Checkbox(base::ASCIIToUTF16("Checkbox"))),
+    : checkbox_(new views::Checkbox(base::ASCIIToUTF16("Checkbox"))),
       checkbox_disabled_(
           new views::Checkbox(base::ASCIIToUTF16("Checkbox disabled"))),
       checkbox_checked_(
@@ -75,9 +70,11 @@
       radio_button_selected_disabled_(new views::RadioButton(
           base::ASCIIToUTF16("Radio button selected disabled"),
           1)) {
-  AddChildView(button_);
+  button_ = AddChildView(
+      views::MdTextButton::Create(nullptr, base::ASCIIToUTF16("Button")));
+  disabled_button_ = AddChildView(views::MdTextButton::Create(
+      nullptr, base::ASCIIToUTF16("Disabled button")));
   disabled_button_->SetEnabled(false);
-  AddChildView(disabled_button_);
   AddChildView(checkbox_);
   checkbox_disabled_->SetEnabled(false);
   AddChildView(checkbox_disabled_);
diff --git a/ash/shell/window_type_launcher.cc b/ash/shell/window_type_launcher.cc
index 2380417f..70f543e 100644
--- a/ash/shell/window_type_launcher.cc
+++ b/ash/shell/window_type_launcher.cc
@@ -48,11 +48,10 @@
                     public views::ButtonListener {
  public:
   explicit ModalWindow(ui::ModalType modal_type)
-      : modal_type_(modal_type),
-        color_(kColors[g_color_index]),
-        open_button_(MdTextButton::Create(this, base::ASCIIToUTF16("Moar!"))) {
+      : modal_type_(modal_type), color_(kColors[g_color_index]) {
     ++g_color_index %= base::size(kColors);
-    AddChildView(open_button_);
+    open_button_ =
+        AddChildView(MdTextButton::Create(this, base::ASCIIToUTF16("Moar!")));
   }
   ~ModalWindow() override = default;
 
@@ -155,10 +154,13 @@
 // static
 views::Widget* NonModalTransient::non_modal_transient_ = nullptr;
 
-void AddViewToLayout(views::GridLayout* layout, views::View* view) {
+template <class T>
+T* AddViewToLayout(views::GridLayout* layout, std::unique_ptr<T> view) {
+  T* result = view.get();
   layout->StartRow(0, 0);
-  layout->AddView(view);
+  layout->AddView(view.release());
   layout->AddPaddingRow(0, 5);
+  return result;
 }
 
 }  // namespace
@@ -178,42 +180,7 @@
 WindowTypeLauncher::WindowTypeLauncher(
     base::RepeatingClosure show_views_examples_callback,
     base::RepeatingClosure create_embedded_browser_callback)
-    : create_button_(
-          MdTextButton::Create(this, base::ASCIIToUTF16("Create Window"))),
-      create_nonresizable_button_(MdTextButton::Create(
-          this,
-          base::ASCIIToUTF16("Create Non-Resizable Window"))),
-      bubble_button_(
-          MdTextButton::Create(this,
-                               base::ASCIIToUTF16("Create Pointy Bubble"))),
-      lock_button_(
-          MdTextButton::Create(this, base::ASCIIToUTF16("Lock Screen"))),
-      widgets_button_(
-          MdTextButton::Create(this,
-                               base::ASCIIToUTF16("Show Example Widgets"))),
-      system_modal_button_(
-          MdTextButton::Create(this,
-                               base::ASCIIToUTF16("Open System Modal Window"))),
-      window_modal_button_(
-          MdTextButton::Create(this,
-                               base::ASCIIToUTF16("Open Window Modal Window"))),
-      child_modal_button_(
-          MdTextButton::Create(this,
-                               base::ASCIIToUTF16("Open Child Modal Window"))),
-      transient_button_(MdTextButton::Create(
-          this,
-          base::ASCIIToUTF16("Open Non-Modal Transient Window"))),
-      examples_button_(MdTextButton::Create(
-          this,
-          base::ASCIIToUTF16("Open Views Examples Window"))),
-      show_hide_window_button_(
-          MdTextButton::Create(this, base::ASCIIToUTF16("Show/Hide a Window"))),
-      show_web_notification_(MdTextButton::Create(
-          this,
-          base::ASCIIToUTF16("Show a web/app notification"))),
-      embedded_browser_button_(
-          MdTextButton::Create(this, base::ASCIIToUTF16("Embedded Browser"))),
-      show_views_examples_callback_(std::move(show_views_examples_callback)),
+    : show_views_examples_callback_(std::move(show_views_examples_callback)),
       create_embedded_browser_callback_(
           std::move(create_embedded_browser_callback)) {
   views::GridLayout* layout =
@@ -222,19 +189,43 @@
   views::ColumnSet* column_set = layout->AddColumnSet(0);
   column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
                         0, views::GridLayout::USE_PREF, 0, 0);
-  AddViewToLayout(layout, create_button_);
-  AddViewToLayout(layout, create_nonresizable_button_);
-  AddViewToLayout(layout, bubble_button_);
-  AddViewToLayout(layout, lock_button_);
-  AddViewToLayout(layout, widgets_button_);
-  AddViewToLayout(layout, system_modal_button_);
-  AddViewToLayout(layout, window_modal_button_);
-  AddViewToLayout(layout, child_modal_button_);
-  AddViewToLayout(layout, transient_button_);
-  AddViewToLayout(layout, examples_button_);
-  AddViewToLayout(layout, show_hide_window_button_);
-  AddViewToLayout(layout, show_web_notification_);
-  AddViewToLayout(layout, embedded_browser_button_);
+  create_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(this, base::ASCIIToUTF16("Create Window")));
+  create_nonresizable_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Create Non-Resizable Window")));
+  bubble_button_ = AddViewToLayout(
+      layout,
+      MdTextButton::Create(this, base::ASCIIToUTF16("Create Pointy Bubble")));
+  lock_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(this, base::ASCIIToUTF16("Lock Screen")));
+  widgets_button_ = AddViewToLayout(
+      layout,
+      MdTextButton::Create(this, base::ASCIIToUTF16("Show Example Widgets")));
+  system_modal_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Open System Modal Window")));
+  window_modal_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Open Window Modal Window")));
+  child_modal_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Open Child Modal Window")));
+  transient_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Open Non-Modal Transient Window")));
+  examples_button_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Open Views Examples Window")));
+  show_hide_window_button_ = AddViewToLayout(
+      layout,
+      MdTextButton::Create(this, base::ASCIIToUTF16("Show/Hide a Window")));
+  show_web_notification_ = AddViewToLayout(
+      layout, MdTextButton::Create(
+                  this, base::ASCIIToUTF16("Show a web/app notification")));
+  embedded_browser_button_ = AddViewToLayout(
+      layout,
+      MdTextButton::Create(this, base::ASCIIToUTF16("Embedded Browser")));
   set_context_menu_controller(this);
 }
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index fa1306a..d7b9921 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">የምሽት ብርሃን</translation>
 <translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation>
 <translation id="2761704814324807722">የሁኔታ መሣቢያ፣ ሰዓት <ph name="TIME" />፣ <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">ከ<ph name="NAME" /> ጋር ዳግም በማገናኘት ላይ</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">ለመክፈት የይለፍ ቃልዎን ያስገቡ</translation>
 <translation id="2819276065543622893">አሁን ዘግተው እንዲወጡ ይደረጋሉ።</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">ቀጣይ ትራክ</translation>
 <translation id="4479639480957787382">ኢተርኔት</translation>
 <translation id="4481530544597605423">ያልተጣመሩ መሣሪያዎች</translation>
-<translation id="4508225577814909926"><ph name="NAME" />፦ በመገናኘት ላይ...</translation>
 <translation id="4513946894732546136">ግብረ መልስ</translation>
 <translation id="4527045527269911712">የብሉቱዝ መሣሪያ «<ph name="DEVICE_NAME" />» ለመጣመር ፍቃድ ይፈልጋል።</translation>
 <translation id="453661520163887813"><ph name="TIME" /> ሙሉ እስከሚሆን ድረስ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 11df8d5d..e4e3405 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -84,7 +84,7 @@
 <translation id="225680501294068881">جارٍ البحث عن أجهزة...</translation>
 <translation id="2268130516524549846">تم إيقاف البلوتوث</translation>
 <translation id="2268813581635650749">خروج من كل الحسابات</translation>
-<translation id="2277103315734023688">الانتقال للأمام</translation>
+<translation id="2277103315734023688">الانتقال إلى الأمام</translation>
 <translation id="2292698582925480719">مقياس العرض</translation>
 <translation id="2302092602801625023">‏تتم إدارة هذا الحساب من خلال Family Link</translation>
 <translation id="2303600792989757991">نظرة عامة لنافذة التبديل</translation>
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">الإضاءة الليلية</translation>
 <translation id="2727977024730340865">تمّ توصيل شاحن منخفض الطاقة. لذا قد لا تكون عملية شحن البطارية جديرة بالثقة.</translation>
 <translation id="2761704814324807722">علبة الحالة، والوقت <ph name="TIME" />، و<ph name="BATTERY" /></translation>
-<translation id="277257480934873581">إعادة الاتصال بـ <ph name="NAME" /></translation>
 <translation id="2792498699870441125">‏Alt+مفتاح البحث</translation>
 <translation id="2803734122639935495">لفتح القفل، أدخِل كلمة مرورك</translation>
 <translation id="2819276065543622893">سيتم تسجيل خروجك الآن.</translation>
@@ -206,7 +205,7 @@
 <translation id="4042660782729322247">أنت تشارك الشاشة</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{الإشعارات متوقفة لتطبيق واحد}zero{الإشعارات متوقفة لـ # تطبيق}two{الإشعارات متوقفة لتطبيقَين (#)}few{الإشعارات متوقفة لـ # تطبيقات}many{الإشعارات متوقفة لـ # تطبيقًا}other{الإشعارات متوقفة لـ # تطبيق}}</translation>
 <translation id="4072264167173457037">إشارة متوسطة</translation>
-<translation id="4112140312785995938">التمرير للخلف</translation>
+<translation id="4112140312785995938">الانتقال إلى الخلف</translation>
 <translation id="4129129681837227511">للاطِّلاع على الإشعارات على شاشة التأمين، يمكنك فتح القفل لتغيير الإعداد</translation>
 <translation id="4146833061457621061">تشغيل الموسيقى</translation>
 <translation id="4181841719683918333">اللغات</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">المقطع الصوتي التالي</translation>
 <translation id="4479639480957787382">إيثرنت</translation>
 <translation id="4481530544597605423">الأجهزة التي تم إلغاء إقرانها</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: جارٍ الاتصال...</translation>
 <translation id="4513946894732546136">تعليقات</translation>
 <translation id="4527045527269911712">يريد جهاز بلوتوث "<ph name="DEVICE_NAME" />" الحصول على إذن للإقران.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> حتى اكتمال الشحن</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 9f691ef3..3121f1f 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Нощно осветление</translation>
 <translation id="2727977024730340865">Използва се зарядно устройство с малка мощност. Зареждането на батерията може да не е надеждно.</translation>
 <translation id="2761704814324807722">Област за състоянието, часът е <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Установява се повторна връзка с мрежата „<ph name="NAME" />“</translation>
 <translation id="2792498699870441125">Alt + търсене</translation>
 <translation id="2803734122639935495">За да отключите, въведете паролата си</translation>
 <translation id="2819276065543622893">Ще излезете сега.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Следващ запис</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Несдвоени устройства</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Установява се връзка...</translation>
 <translation id="4513946894732546136">Отзиви</translation>
 <translation id="4527045527269911712">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ иска разрешение за сдвояване.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> до пълно зареждане</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 2b65b91..7f5170c 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">নাইট লাইট</translation>
 <translation id="2727977024730340865">একটি নিম্ন শক্তির চার্জার প্লাগইন করা হয়েছে৷ বিশ্বস্ত ব্যাটারি চার্জ নাও হতে পারে৷</translation>
 <translation id="2761704814324807722">স্থিতি ট্রে, সময় <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> এ পুনরায় সংযোগ করছে</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">আনলক করতে আপনার পাসওয়ার্ড লিখুন</translation>
 <translation id="2819276065543622893">আপনি এখনই প্রস্থান করুন হবেন৷</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">পরের ট্র্যাক চালান</translation>
 <translation id="4479639480957787382">ইথারনেট</translation>
 <translation id="4481530544597605423">বিযুক্ত করা ডিভাইসগুলি</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: সংযুক্ত হচ্ছে...</translation>
 <translation id="4513946894732546136">প্রতিক্রিয়া</translation>
 <translation id="4527045527269911712">ব্লুটুথ ডিভাইস "<ph name="DEVICE_NAME" />" যুক্ত করার অনুমতি চাইছে।</translation>
 <translation id="453661520163887813">সম্পূর্ণ হতে <ph name="TIME" /> বাকি</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 6bc1458a..f060b46 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Llum nocturna</translation>
 <translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation>
 <translation id="2761704814324807722">Safata d'estat. Hora: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">S'està tornant a connectar a la xarxa <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Cerca</translation>
 <translation id="2803734122639935495">Per desbloquejar el dispositiu, introdueix la contrasenya</translation>
 <translation id="2819276065543622893">Ara se us tancarà la sessió.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Pista següent</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositius desvinculats</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: s'està connectant...</translation>
 <translation id="4513946894732546136">Comentaris</translation>
 <translation id="4527045527269911712">El dispositiu Bluetooth "<ph name="DEVICE_NAME" />" sol·licita permís per emparellar-se.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> per completar la càrrega</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 91b53ef4..69bddb0 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Noční režim</translation>
 <translation id="2727977024730340865">Byla připojena nabíječka s nízkým výkonem. Nabíjení baterie nemusí probíhat spolehlivě.</translation>
 <translation id="2761704814324807722">Systémový panel, čas <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Obnovování připojení k síti <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Vyhledávání</translation>
 <translation id="2803734122639935495">Chcete-li zařízení odemknout, zadejte heslo</translation>
 <translation id="2819276065543622893">Nyní budete odhlášeni.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Další skladba</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Nespárovaná zařízení</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Připojování...</translation>
 <translation id="4513946894732546136">Zpětná vazba</translation>
 <translation id="4527045527269911712">Zařízení Bluetooth „<ph name="DEVICE_NAME" />“ žádá o povolení ke spárování.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> do úplného nabití</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 1dec4ac5..a9394547 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nattelys</translation>
 <translation id="2727977024730340865">Tilsluttet en oplader med lav kraft. Batteriopladningen er muligvis ikke pålidelig.</translation>
 <translation id="2761704814324807722">Statusbakke, tid <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Genopretter forbindelsen til <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Søg</translation>
 <translation id="2803734122639935495">Angiv din adgangskode for at låse enheden op</translation>
 <translation id="2819276065543622893">Du bliver logget ud nu.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Næste nummer</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Ikke-parrede enheder</translation>
-<translation id="4508225577814909926"><ph name="NAME" /> : Opretter forbindelse...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Bluetooth-enheden "<ph name="DEVICE_NAME" />" vil gerne have parringstilladelse.</translation>
 <translation id="453661520163887813">Fuldt opladet om <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index e8106ef..c5d84d64 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nachtlicht</translation>
 <translation id="2727977024730340865">Das Gerät ist an ein Schwachstrom-Ladegerät angeschlossen. Möglicherweise kann der Akku nicht zuverlässig aufgeladen werden.</translation>
 <translation id="2761704814324807722">Statusleiste, Uhrzeit <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Verbindung zu <ph name="NAME" /> wird wiederhergestellt</translation>
 <translation id="2792498699870441125">Alt+Suchtaste</translation>
 <translation id="2803734122639935495">Zum Entsperren Passwort eingeben</translation>
 <translation id="2819276065543622893">Sie werden jetzt abgemeldet.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Nächster Titel</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Entkoppelte Geräte</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Verbindung wird hergestellt...</translation>
 <translation id="4513946894732546136">Google Feedback</translation>
 <translation id="4527045527269911712">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung.</translation>
 <translation id="453661520163887813">Vollständig geladen in <ph name="TIME" /> h</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index dca7d91c..a052f44 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Νυχτερινός φωτισμός</translation>
 <translation id="2727977024730340865">Σύνδεση με φορτιστή χαμηλής ισχύος. Η φόρτιση της μπαταρίας ενδέχεται να μη γίνεται με αξιόπιστο τρόπο.</translation>
 <translation id="2761704814324807722">Δίσκος κατάστασης, ώρα <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Επανασύνδεση στο δίκτυο <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">Για να ξεκλειδώσετε, πληκτρολογήστε τον κωδικό πρόσβασης</translation>
 <translation id="2819276065543622893">Θα αποσυνδεθείτε τώρα.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Επόμενο κομμάτι</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Συσκευές στις οποίες διακόπηκε η σύζευξη</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Σύνδεση…</translation>
 <translation id="4513946894732546136">Σχόλια</translation>
 <translation id="4527045527269911712">Η συσκευή Bluetooth "<ph name="DEVICE_NAME" />" ζητά δικαιώματα σύζευξης.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> για να ολοκληρωθεί η φόρτιση</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 93290c12..59d53c8 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Night Light</translation>
 <translation id="2727977024730340865">Plugged in to a low-power charger. Battery charging may not be reliable.</translation>
 <translation id="2761704814324807722">Status tray, time <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Reconnecting to <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">To unlock, enter your password</translation>
 <translation id="2819276065543622893">You will be signed out now.</translation>
@@ -159,6 +158,7 @@
 <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> can still sign in later.</translation>
 <translation id="3321628682574733415">Incorrect parent code</translation>
 <translation id="332587331255250389">Please replace the battery</translation>
+<translation id="3335825575923019462">Are you sure that you want to disable automatic clicks?</translation>
 <translation id="3351879221545518001">You are currently casting the screen.</translation>
 <translation id="3364721542077212959">Stylus tools</translation>
 <translation id="3368922792935385530">Connected</translation>
@@ -235,7 +235,6 @@
 <translation id="4477350412780666475">Next track</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Unpaired devices</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Connecting...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Bluetooth device "<ph name="DEVICE_NAME" />" would like permission to pair.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> until full</translation>
@@ -401,6 +400,7 @@
 <translation id="7348093485538360975">On-Screen Keyboard</translation>
 <translation id="735745346212279324">VPN disconnected</translation>
 <translation id="7377169924702866686">Caps Lock is on.</translation>
+<translation id="7378594059915113390">Media controls</translation>
 <translation id="7384299914270925461"><ph name="SIGN" /><ph name="MINUTES_REMAINING" />:<ph name="SECONDS_REMAINING" />s</translation>
 <translation id="7398254312354928459">Switched network connection</translation>
 <translation id="7405710164030118432">To unlock the device, enter your Family Link parent access code</translation>
@@ -486,6 +486,7 @@
 <translation id="8649101189709089199">Select to Speak</translation>
 <translation id="8652175077544655965">Close settings</translation>
 <translation id="8653151467777939995">Show notification settings. Notifications are on</translation>
+<translation id="8664483332071009680">Disable automatic clicks?</translation>
 <translation id="8664753092453405566">Show network list. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Low-power charger connected</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index a02c136..46afe050 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Luz nocturna</translation>
 <translation id="2727977024730340865">Conexión a un cargador de baja potencia. Es posible que la carga de la batería no sea confiable.</translation>
 <translation id="2761704814324807722">Bandeja de estado, hora <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Restableciendo conexión con <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+tecla de búsqueda</translation>
 <translation id="2803734122639935495">Para desbloquear el dispositivo, vuelve a escribir la contraseña</translation>
 <translation id="2819276065543622893">Saldrás de la sesión ahora.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Siguiente pista</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositivos no sincronizados</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Conectando...</translation>
 <translation id="4513946894732546136">Comentario</translation>
 <translation id="4527045527269911712">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para sincronizarse.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> para completar carga</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index a1ee629..0628807 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Luz nocturna</translation>
 <translation id="2727977024730340865">Conectado a un cargador de baja potencia. Es posible que la carga de la batería no sea fiable.</translation>
 <translation id="2761704814324807722">Bandeja de estado, hora <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Volviendo a conectar con <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+tecla de búsqueda</translation>
 <translation id="2803734122639935495">Para desbloquearlo, introduce la contraseña</translation>
 <translation id="2819276065543622893">Tu sesión se cerrará ahora.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Pista siguiente</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositivos desvinculados</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: conectando...</translation>
 <translation id="4513946894732546136">Comentarios</translation>
 <translation id="4527045527269911712">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para vincularse.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> para completar la carga</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 028a7d6..bf1e628 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Öövalgus</translation>
 <translation id="2727977024730340865">Ühendatud väikese energiakuluga laadijaga. Aku laadimine võib olla ebastabiilne.</translation>
 <translation id="2761704814324807722">Olekusalv, kellaaeg <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Võrguga <ph name="NAME" /> uuesti ühendamine</translation>
 <translation id="2792498699870441125">Alt + otsinguklahv</translation>
 <translation id="2803734122639935495">Avamiseks sisestage parool</translation>
 <translation id="2819276065543622893">Teid logitakse nüüd välja.</translation>
@@ -159,6 +158,7 @@
 <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> saab siiski hiljem sisse logida.</translation>
 <translation id="3321628682574733415">Vanema kood on vale</translation>
 <translation id="332587331255250389">Vahetage akut</translation>
+<translation id="3335825575923019462">Kas soovite kindlasti automaatsed klikid keelata?</translation>
 <translation id="3351879221545518001">Kannate praegu oma ekraani üle.</translation>
 <translation id="3364721542077212959">Elektronpliiatsi tööriistad</translation>
 <translation id="3368922792935385530">Ühendatud</translation>
@@ -236,7 +236,6 @@
 <translation id="4477350412780666475">Järgmine lugu</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Sidumata seadmed</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: ühendamine ...</translation>
 <translation id="4513946894732546136">Tagasiside</translation>
 <translation id="4527045527269911712">Bluetoothi seade „<ph name="DEVICE_NAME" />” küsib luba sidumiseks.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> täislaadimiseni</translation>
@@ -402,6 +401,7 @@
 <translation id="7348093485538360975">Ekraanil kuvatav klaviatuur</translation>
 <translation id="735745346212279324">VPN-i ühendus on katkestatud</translation>
 <translation id="7377169924702866686">Suurtähelukk on sisse lülitatud.</translation>
+<translation id="7378594059915113390">Meedia juhtnupud</translation>
 <translation id="7384299914270925461"><ph name="SIGN" /><ph name="MINUTES_REMAINING" />:<ph name="SECONDS_REMAINING" />s</translation>
 <translation id="7398254312354928459">Võrguühendust vahetati</translation>
 <translation id="7405710164030118432">Seadme lukustuse avamiseks sisestage oma Family Linki vanema pääsukood</translation>
@@ -487,6 +487,7 @@
 <translation id="8649101189709089199">Vali ja kuula</translation>
 <translation id="8652175077544655965">Sulgege seaded</translation>
 <translation id="8653151467777939995">Kuvab märguandeseaded. Märguanded on sisse lülitatud</translation>
+<translation id="8664483332071009680">Kas keelata automaatsed klikid?</translation>
 <translation id="8664753092453405566">Kuvab võrkude loendi. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Väikese energiakuluga laadija on ühendatud</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 6d56fed1..7fc01125 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">نور شب</translation>
 <translation id="2727977024730340865">باتری به شارژر برق ضعیف متصل است. شارژ باتری ممکن است قابل اطمینان نباشد.</translation>
 <translation id="2761704814324807722">سینی وضعیت، زمان <ph name="TIME" />، ‏<ph name="BATTERY" /></translation>
-<translation id="277257480934873581">اتصال مجدد به <ph name="NAME" /></translation>
 <translation id="2792498699870441125">‏Alt+جستجو</translation>
 <translation id="2803734122639935495">برای باز کردن قفل، گذرواژه‌تان را وارد کنید</translation>
 <translation id="2819276065543622893">هم‌اکنون از سیستم خارج خواهید شد.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">آهنگ بعدی</translation>
 <translation id="4479639480957787382">اترنت</translation>
 <translation id="4481530544597605423">دستگاه‌های لغو ارتباط‌شده</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: در حال اتصال...</translation>
 <translation id="4513946894732546136">بازخورد</translation>
 <translation id="4527045527269911712">دستگاه بلوتوث «<ph name="DEVICE_NAME" />» برای مرتبط‌سازی به مجوز نیاز دارد.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> مانده تا کامل شود</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 732a303..ca740475 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Yövalo</translation>
 <translation id="2727977024730340865">Pienitehoinen laturi kytketty. Akku ei ehkä lataudu luotettavasti.</translation>
 <translation id="2761704814324807722">Tila-alue, aika <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Yhdistetään uudelleen verkkoon <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + haku</translation>
 <translation id="2803734122639935495">Avaa lukitus antamalla salasana</translation>
 <translation id="2819276065543622893">Sinut kirjataan ulos nyt.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Seuraava kappale</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Laitteet ilman paria</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Yhdistetään…</translation>
 <translation id="4513946894732546136">Palaute</translation>
 <translation id="4527045527269911712">Bluetooth-laite <ph name="DEVICE_NAME" /> pyytää lupaa laiteparin muodostamiseen.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> jäljellä, kunnes akku on täynnä</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index b8c2b45..94ca3d8 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Night Light</translation>
 <translation id="2727977024730340865">Naka-saksak sa isang low-power charger. Maaaring hindi maging tiyak ang pag-charge ng baterya.</translation>
 <translation id="2761704814324807722">Status tray, oras <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Muling kumokonekta sa <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">Para i-unlock, ilagay ang iyong password</translation>
 <translation id="2819276065543622893">Masa-sign out ka ngayon.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Susunod na Track</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Mga hindi nakapares na device</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Kumokonekta...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Gusto ng bluetooth device na "<ph name="DEVICE_NAME" />" na magpares.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> na lang bago mapuno</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 0883936e..009826f 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Éclairage nocturne</translation>
 <translation id="2727977024730340865">L'appareil est branché à un chargeur de faible puissance. Il se peut que la charge ne soit pas fiable.</translation>
 <translation id="2761704814324807722">Barre d'état – Heure : <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Reconnexion à <ph name="NAME" />…</translation>
 <translation id="2792498699870441125">Alt + Recherche</translation>
 <translation id="2803734122639935495">Pour déverrouiller l'appareil, saisissez votre mot de passe</translation>
 <translation id="2819276065543622893">Vous allez être déconnecté maintenant.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Titre suivant</translation>
 <translation id="4479639480957787382">Ethernet </translation>
 <translation id="4481530544597605423">Appareils dissociés</translation>
-<translation id="4508225577814909926"><ph name="NAME" /> : Connexion en cours…</translation>
 <translation id="4513946894732546136">Commentaires</translation>
 <translation id="4527045527269911712">L'appareil Bluetooth "<ph name="DEVICE_NAME" />" demande l'autorisation de s'associer.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> avant charge complète</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 9b5dba2..a9969f6b 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">રાત્રિ પ્રકાશ</translation>
 <translation id="2727977024730340865">નિમ્ન-પાવર ચાર્જરમાં પ્લગ કરેલું છે. બૅટરી ચાર્જિંગ વિશ્વસનીય હશે નહીં.</translation>
 <translation id="2761704814324807722">સ્થિતિ ટ્રે, સમય <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> થી ફરીથી કનેક્ટ કરી રહ્યાં છે</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">અનલૉક કરવા માટે, તમારો પાસવર્ડ દાખલ કરો</translation>
 <translation id="2819276065543622893">તમે હવે સાઇન આઉટ થશો.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">આગલો ટ્રૅક</translation>
 <translation id="4479639480957787382">ઇથરનેટ</translation>
 <translation id="4481530544597605423">જોડીથી અલગ કરેલા ઉપકરણો</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: કનેક્ટ કરી રહ્યું છે...</translation>
 <translation id="4513946894732546136">પ્રતિસાદ</translation>
 <translation id="4527045527269911712">Bluetooth ડિવાઇસ "<ph name="DEVICE_NAME" />" ને જોડી બનાવવા માટે પરવાનગી જોઈએ છે.</translation>
 <translation id="453661520163887813">પૂર્ણપણે ચાર્જ થવામાં <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 2cf59881f..51b26aa 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">नाइट लाइट</translation>
 <translation id="2727977024730340865">कम-शक्ति वाले चार्जर में प्लग इन करें. बैटरी चार्ज करना संभवत: विश्वसनीय नहीं होगा.</translation>
 <translation id="2761704814324807722">स्थिति ट्रे, समय <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> से पुनः कनेक्ट कर रहा है</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">अनलॉक करने के लिए, अपना पासवर्ड डालें</translation>
 <translation id="2819276065543622893">अब आप प्रस्थान कर जाएंगे.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">अगला ट्रैक</translation>
 <translation id="4479639480957787382">इथरनेट</translation>
 <translation id="4481530544597605423">अयुग्मित किए गए डिवाइस</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: कनेक्ट हो रहा है...</translation>
 <translation id="4513946894732546136">सुझाव</translation>
 <translation id="4527045527269911712">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" युग्मित करने की अनुमति चाहता है.</translation>
 <translation id="453661520163887813">पूरी तरह चार्ज होने में <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 225b412..a577f2a 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Noćno svjetlo</translation>
 <translation id="2727977024730340865">Uređaj je priključen na punjač male snage. Punjenje baterije možda nije pouzdano.</translation>
 <translation id="2761704814324807722">Traka statusa, vrijeme <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Ponovno povezivanje s mrežom <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Pretraživanje</translation>
 <translation id="2803734122639935495">Za otključavanje unesite zaporku</translation>
 <translation id="2819276065543622893">Odjavit ćete se sada.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Sljedeća pjesma</translation>
 <translation id="4479639480957787382">Eternet</translation>
 <translation id="4481530544597605423">Neupareni uređaji</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: povezivanje...</translation>
 <translation id="4513946894732546136">Povratne informacije</translation>
 <translation id="4527045527269911712">Bluetooth uređaj "<ph name="DEVICE_NAME" />" traži dopuštenje za uparivanje.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> do potpune napunjenosti</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index a6c99abd..588516f8 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Éjszakai fény</translation>
 <translation id="2727977024730340865">Kis teljesítményű töltőt csatlakoztatott. Az akkumulátor töltése nem megbízható.</translation>
 <translation id="2761704814324807722">Állapotterület, idő: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Újracsatlakozás a következőhöz: <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Keresés</translation>
 <translation id="2803734122639935495">A feloldáshoz adja meg a jelszót</translation>
 <translation id="2819276065543622893">A rendszer most kijelentkezteti Önt.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Következő szám</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Párosítatlan eszközök</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: csatlakozás...</translation>
 <translation id="4513946894732546136">Visszajelzés</translation>
 <translation id="4527045527269911712">A(z) „<ph name="DEVICE_NAME" />” Bluetooth-eszköz engedélyt kér a párosításra.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> a teljes feltöltésig</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 85681b9..61f43d8 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Cahaya Malam</translation>
 <translation id="2727977024730340865">Dipasang ke pengisi daya rendah. Pengisian daya baterai mungkin tidak dapat diandalkan.</translation>
 <translation id="2761704814324807722">Baki status, waktu <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Menyambungkan lagi ke <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Telusuri</translation>
 <translation id="2803734122639935495">Untuk membuka kunci, masukkan sandi Anda</translation>
 <translation id="2819276065543622893">Anda akan dikeluarkan sekarang.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Lagu Berikutnya</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Perangkat tidak tersambung</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Menyambung...</translation>
 <translation id="4513946894732546136">Masukan</translation>
 <translation id="4527045527269911712">Perangkat Bluetooth "<ph name="DEVICE_NAME" />" meminta izin untuk bersanding.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> sampai penuh</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index 297628b..f210bd0 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Luminosità notturna</translation>
 <translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation>
 <translation id="2761704814324807722">Barra di stato, ora: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Riconnessione a <ph name="NAME" /> in corso</translation>
 <translation id="2792498699870441125">Alt+tasto per la ricerca</translation>
 <translation id="2803734122639935495">Per sbloccare inserisci la password</translation>
 <translation id="2819276065543622893">Verrai disconnesso ora.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Traccia successiva</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositivi disaccoppiati</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: connessione...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Il dispositivo Bluetooth "<ph name="DEVICE_NAME" />" chiede l'autorizzazione per essere accoppiato.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> alla ricarica completa</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 40802cd..420c587 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">תאורת לילה</translation>
 <translation id="2727977024730340865">מחובר למטען בעל מתח נמוך. ייתכן שטעינת הסוללה לא תהיה אמינה.</translation>
 <translation id="2761704814324807722">מגש מערכת, שעה <ph name="TIME" />‏, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">מתחבר מחדש אל <ph name="NAME" /></translation>
 <translation id="2792498699870441125">‏Alt + חיפוש</translation>
 <translation id="2803734122639935495">כדי לבטל את הנעילה, צריך להזין את הסיסמה שלך</translation>
 <translation id="2819276065543622893">תצא עכשיו מהחשבון.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">הטראק הבא</translation>
 <translation id="4479639480957787382">אתרנט</translation>
 <translation id="4481530544597605423">מכשירים לא מותאמים</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: מתחבר...</translation>
 <translation id="4513946894732546136">משוב</translation>
 <translation id="4527045527269911712">‏מכשיר ה-Bluetooth ‏"<ph name="DEVICE_NAME" />" מבקש הרשאה לבצע התאמה.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> עד למילוי</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 83b7315..5374325 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">夜間モード</translation>
 <translation id="2727977024730340865">低電力の充電器に接続しています。バッテリーが充電されない可能性があります。</translation>
 <translation id="2761704814324807722">ステータス トレイ、時刻 <ph name="TIME" />、<ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> に再接続しています</translation>
 <translation id="2792498699870441125">Alt+ 検索</translation>
 <translation id="2803734122639935495">ロックを解除するにはパスワードを入力してください</translation>
 <translation id="2819276065543622893">ログアウトします。</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">次の曲</translation>
 <translation id="4479639480957787382">イーサネット</translation>
 <translation id="4481530544597605423">ペア設定されていないデバイス</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: 接続しています...</translation>
 <translation id="4513946894732546136">フィードバック</translation>
 <translation id="4527045527269911712">Bluetooth デバイス「<ph name="DEVICE_NAME" />」がペア設定の権限をリクエストしています。</translation>
 <translation id="453661520163887813">あと <ph name="TIME" /> で充電完了</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index c11b76d..c055b4e 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">ನೈಟ್ ಲೈಟ್</translation>
 <translation id="2727977024730340865">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್‌ಗೆ ಪ್ಲಗ್ ಮಾಡಲಾಗಿದೆ. ಬ್ಯಾಟರಿ ಚಾರ್ಜಿಂಗ್ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲದಿರಬಹುದು.</translation>
 <translation id="2761704814324807722">ಸ್ಥಿತಿ ಟ್ರೇ, ಸಮಯ <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> ಗೆ ಮರುಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="2792498699870441125">Alt+ಹುಡುಕಾಟ</translation>
 <translation id="2803734122639935495">ಅನ್‌ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="2819276065543622893">ಈಗ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
 <translation id="4479639480957787382">ಈಥರ್ನೆಟ್</translation>
 <translation id="4481530544597605423">ಜೋಡಿಯಾಗಿರದ ಸಾಧನಗಳು</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="4513946894732546136">ಪ್ರತಿಕ್ರಿಯೆ</translation>
 <translation id="4527045527269911712">ಬ್ಲೂಟೂತ್‌‌ ಸಾಧನವು "<ph name="DEVICE_NAME" />" ಜೋಡಣೆಗಾಗಿ ಅನುಮತಿಯನ್ನು ಬಯಸುತ್ತದೆ.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index d58fac2..4631a5f 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">야간 조명</translation>
 <translation id="2727977024730340865">저출력 충전기에 연결되었습니다. 배터리 충전 상태가 불안정합니다.</translation>
 <translation id="2761704814324807722">상태 표시줄, 시간 <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" />에 다시 연결</translation>
 <translation id="2792498699870441125">Alt+검색 키</translation>
 <translation id="2803734122639935495">잠금 해제하려면 비밀번호를 입력하세요.</translation>
 <translation id="2819276065543622893">지금 로그아웃됩니다.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">다음 트랙</translation>
 <translation id="4479639480957787382">이더넷</translation>
 <translation id="4481530544597605423">페어링 해제된 기기</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: 연결하는 중...</translation>
 <translation id="4513946894732546136">문제 신고</translation>
 <translation id="4527045527269911712">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> 후 충전 완료</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 83e9018..e31e214 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nakties šviesa</translation>
 <translation id="2727977024730340865">Prijungtas mažos galios įkroviklis. Akumuliatoriaus įkrovimas gali būti nepatikimas.</translation>
 <translation id="2761704814324807722">Būsenos dėklas, laikas <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Iš naujo prisijungiama prie „<ph name="NAME" />“</translation>
 <translation id="2792498699870441125">„Alt“ + paieškos klavišas</translation>
 <translation id="2803734122639935495">Kad atrakintumėte, įveskite slaptažodį</translation>
 <translation id="2819276065543622893">Būsite atjungti.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Kitas takelis</translation>
 <translation id="4479639480957787382">Eternetas</translation>
 <translation id="4481530544597605423">Atsieti įrenginiai</translation>
-<translation id="4508225577814909926">„<ph name="NAME" />“: jungiamasi...</translation>
 <translation id="4513946894732546136">Atsiliepimai</translation>
 <translation id="4527045527269911712">„Bluetooth“ įrenginys „<ph name="DEVICE_NAME" />“ prašo leidimo susieti.</translation>
 <translation id="453661520163887813">Liko <ph name="TIME" />, kol bus visiškai įkrautas</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 3de3503..9e6c4155 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nakts režīms</translation>
 <translation id="2727977024730340865">Pievienots lādētājs ar mazu strāvas padevi. Akumulatora uzlāde var nebūt uzticama.</translation>
 <translation id="2761704814324807722">Statusa josla, laiks: <ph name="TIME" />. <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Notiek atkārtota savienojuma izveide ar <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Meklēt</translation>
 <translation id="2803734122639935495">Lai atbloķētu, ievadiet paroli</translation>
 <translation id="2819276065543622893">Jūs tagad tiksiet izrakstīts.</translation>
@@ -159,6 +158,7 @@
 <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> joprojām varēs pierakstīties vēlāk.</translation>
 <translation id="3321628682574733415">Nepareizs vecāku kods</translation>
 <translation id="332587331255250389">Lūdzu, nomainiet bateriju.</translation>
+<translation id="3335825575923019462">Vai tiešām vēlaties atspējot automātiskos klikšķus?</translation>
 <translation id="3351879221545518001">Jūsu ekrānā šobrīd tiek veikta apraide.</translation>
 <translation id="3364721542077212959">Skārienekrāna pildspalvas rīki</translation>
 <translation id="3368922792935385530">pievienots</translation>
@@ -235,7 +235,6 @@
 <translation id="4477350412780666475">Nākamais ieraksts</translation>
 <translation id="4479639480957787382">tīkls Ethernet</translation>
 <translation id="4481530544597605423">Pārī nesavienotās ierīces</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: notiek savienojuma izveide...</translation>
 <translation id="4513946894732546136">Atsauksmes</translation>
 <translation id="4527045527269911712">Bluetooth ierīce “<ph name="DEVICE_NAME" />” vēlas saņemt atļauju, lai izveidotu savienojumu pārī.</translation>
 <translation id="453661520163887813">Līdz pilnai uzlādei: <ph name="TIME" /></translation>
@@ -401,6 +400,7 @@
 <translation id="7348093485538360975">Ekrāntastatūra</translation>
 <translation id="735745346212279324">VPN ir atvienots</translation>
 <translation id="7377169924702866686">Funkcija Caps Lock ir ieslēgta.</translation>
+<translation id="7378594059915113390">Multivides vadīklas</translation>
 <translation id="7384299914270925461"><ph name="SIGN" /><ph name="MINUTES_REMAINING" />:<ph name="SECONDS_REMAINING" /> s</translation>
 <translation id="7398254312354928459">Ieslēgts tīkla savienojums</translation>
 <translation id="7405710164030118432">Lai atbloķētu šo ierīci, ievadiet Family Link vecāku piekļuves kodu.</translation>
@@ -486,6 +486,7 @@
 <translation id="8649101189709089199">Atlasīt, lai izrunātu</translation>
 <translation id="8652175077544655965">Aizvērt iestatījumus</translation>
 <translation id="8653151467777939995">Rādīt paziņojumu iestatījumus. Paziņojumi ir ieslēgti</translation>
+<translation id="8664483332071009680">Vai atspējot automātiskos klikšķus?</translation>
 <translation id="8664753092453405566">Rādīt tīklu sarakstu. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Pievienots lādētājs ar mazu strāvas padevi</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index ec91c57..e02fcd7 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">നൈറ്റ് ലൈറ്റ്</translation>
 <translation id="2727977024730340865">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജ്ജറിലേക്ക് പ്ലഗ് ചെയ്‌തിരിക്കുന്നു. ബാറ്ററി ചാർജുചെയ്യൽ വിശ്വസനീയമാകണമെന്നില്ല.</translation>
 <translation id="2761704814324807722">സ്‌റ്റാറ്റസ് ട്രേ, സമയം, <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> നെറ്റ്‌വർക്കിലേക്ക് വീണ്ടും കണക്‌റ്റുചെയ്യുന്നു</translation>
 <translation id="2792498699870441125">Alt+തിരയൽ</translation>
 <translation id="2803734122639935495">അൺലോക്ക് ചെയ്യാൻ, നിങ്ങളുടെ പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="2819276065543622893">നിങ്ങൾ ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്യും.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">അടുത്ത ട്രാക്ക്</translation>
 <translation id="4479639480957787382">എതെര്‍‌നെറ്റ്</translation>
 <translation id="4481530544597605423">ജോടി മാറ്റിയ ഉപകരണങ്ങൾ</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: കണക്റ്റുചെയ്യുന്നു...</translation>
 <translation id="4513946894732546136">ഫീഡ്ബാക്ക്</translation>
 <translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു.</translation>
 <translation id="453661520163887813">പൂർത്തിയാകാൻ ശേഷിക്കുന്ന സമയം <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index db8f804..81dd6aa 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">रात्रीचा प्रकाश</translation>
 <translation id="2727977024730340865">एका निम्न-उर्जेच्या चार्जरवर प्लग इन केले. बॅटरी चार्जिंग विश्वसनीय असू शकत नाही.</translation>
 <translation id="2761704814324807722">स्थिती ट्रे, वेळ <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> शी पुन्हा कनेक्ट करीत आहे</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">अनलॉक करण्यासाठी, तुमचा पासवर्ड एंटर करा</translation>
 <translation id="2819276065543622893">आता तुम्हाला साइन आउट केले जाईल.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">पुढील ट्रॅक</translation>
 <translation id="4479639480957787382">इथरनेट</translation>
 <translation id="4481530544597605423">जोडणी वेगळी केलेली डिव्हाइस</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: कनेक्ट करत आहे...</translation>
 <translation id="4513946894732546136">अभिप्राय</translation>
 <translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते.</translation>
 <translation id="453661520163887813">पूर्ण होण्यात <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index e45f62d6..a80c7e99 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Cahaya Malam</translation>
 <translation id="2727977024730340865">Dipalamkan pada pengecas berkuasa rendah. Pengecasan bateri mungkin tidak boleh diharapkan.</translation>
 <translation id="2761704814324807722">Dulang status, masa <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Menyambung semula ke <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">Masukkan kata laluan anda untuk membuka kunci</translation>
 <translation id="2819276065543622893">Anda akan dilog keluar sekarang.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Lagu Seterusnya</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Peranti dinyahganding</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Menyambung...</translation>
 <translation id="4513946894732546136">Maklum balas</translation>
 <translation id="4527045527269911712">Peranti Bluetooth "<ph name="DEVICE_NAME" />" ingin kebenaran untuk berpasangan.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> sehingga penuh</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 9af4bb75..81430a7 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nachtverlichting</translation>
 <translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation>
 <translation id="2761704814324807722">Statusvak, tijd <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Opnieuw verbinding maken met <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Zoeken</translation>
 <translation id="2803734122639935495">Geef je wachtwoord om te ontgrendelen</translation>
 <translation id="2819276065543622893">Je wordt nu uitgelogd.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Volgend nummer</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Ontkoppelde apparaten</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: verbinden...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Bluetooth-apparaat '<ph name="DEVICE_NAME" />' wil toestemming om te koppelen.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> tot volledig opgeladen</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 5500bbd1..289847d 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nattlys</translation>
 <translation id="2727977024730340865">Tilkoblet laveffektslader. Batteriladingen kan være upålitelig.</translation>
 <translation id="2761704814324807722">Statusfelt, klokken <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Kobler til <ph name="NAME" /> på nytt</translation>
 <translation id="2792498699870441125">Alt + Søk</translation>
 <translation id="2803734122639935495">Skriv inn passordet ditt for å låse opp</translation>
 <translation id="2819276065543622893">Du blir nå logget av.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Neste spor</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Frakoblede enheter</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: kobler til ...</translation>
 <translation id="4513946894732546136">Google Feedback</translation>
 <translation id="4527045527269911712">Bluetooth-enheten «<ph name="DEVICE_NAME" />» ber om tillatelse til å koble til.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> til batteriet er fulladet</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 227b0737..e17bad8 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Podświetlenie nocne</translation>
 <translation id="2727977024730340865">Podłączono ładowarkę o małej mocy. Ładowanie baterii może być nieprawidłowe.</translation>
 <translation id="2761704814324807722">Pasek stanu, godzina <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Ponownie łączę z: <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Szukaj</translation>
 <translation id="2803734122639935495">Aby odblokować, wprowadź swoje hasło</translation>
 <translation id="2819276065543622893">Zostaniesz teraz wylogowany.</translation>
@@ -159,6 +158,7 @@
 <translation id="3308453408813785101"><ph name="USER_EMAIL_ADDRESS" /> nadal może się później zalogować.</translation>
 <translation id="3321628682574733415">Nieprawidłowy kod rodzica</translation>
 <translation id="332587331255250389">Wymień baterię</translation>
+<translation id="3335825575923019462">Czy na pewno chcesz wyłączyć automatyczne kliknięcia?</translation>
 <translation id="3351879221545518001">Obecnie przesyłasz ekran.</translation>
 <translation id="3364721542077212959">Narzędzia rysika</translation>
 <translation id="3368922792935385530">Połączone</translation>
@@ -236,7 +236,6 @@
 <translation id="4477350412780666475">Następny utwór</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Niesparowane urządzenia</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: łączę...</translation>
 <translation id="4513946894732546136">Twoja opinia</translation>
 <translation id="4527045527269911712">Urządzenie Bluetooth „<ph name="DEVICE_NAME" />” chce się sparować.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> do pełnego naładowania</translation>
@@ -402,6 +401,7 @@
 <translation id="7348093485538360975">Klawiatura ekranowa</translation>
 <translation id="735745346212279324">VPN odłączona</translation>
 <translation id="7377169924702866686">Caps Lock jest włączony.</translation>
+<translation id="7378594059915113390">Sterowanie multimediami</translation>
 <translation id="7384299914270925461"><ph name="SIGN" /><ph name="MINUTES_REMAINING" />:<ph name="SECONDS_REMAINING" /> s</translation>
 <translation id="7398254312354928459">Przełączono połączenie sieciowe</translation>
 <translation id="7405710164030118432">Aby odblokować urządzenie, wpisz kod dostępu Family Link rodzica</translation>
@@ -487,6 +487,7 @@
 <translation id="8649101189709089199">Przeczytaj na głos</translation>
 <translation id="8652175077544655965">Zamknij ustawienia</translation>
 <translation id="8653151467777939995">Pokaż ustawienia powiadomień. Powiadomienia są włączone</translation>
+<translation id="8664483332071009680">Wyłączyć automatyczne kliknięcia?</translation>
 <translation id="8664753092453405566">Pokaż listę sieci. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Podłączono ładowarkę o małej mocy</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 9e398f9..934e8cd 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Modo noturno</translation>
 <translation id="2727977024730340865">Conectado a um carregador de baixa potência. O carregamento da bateria pode não ser confiável.</translation>
 <translation id="2761704814324807722">Bandeja de status, tempo <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Reconectando-se a <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Pesquisar</translation>
 <translation id="2803734122639935495">Para desbloquear, digite sua senha</translation>
 <translation id="2819276065543622893">Você sairá agora.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Próxima faixa</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositvos não pareados</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: conectando...</translation>
 <translation id="4513946894732546136">Comentários</translation>
 <translation id="4527045527269911712">O dispositivo Bluetooth "<ph name="DEVICE_NAME" />" deseja permissão para realizar o pareamento.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> até completar</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 479ee07b..4712081 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Luz noturna</translation>
 <translation id="2727977024730340865">Ligado a um carregador de baixo consumo. O carregamento da bateria pode não ser fiável.</translation>
 <translation id="2761704814324807722">Tabuleiro do estado, hora <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">A restabelecer ligação a <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Pesquisar</translation>
 <translation id="2803734122639935495">Para desbloquear, introduza a palavra-passe.</translation>
 <translation id="2819276065543622893">A sessão será terminada agora.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Faixa seguinte</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositivos dessincronizados</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: A ligar...</translation>
 <translation id="4513946894732546136">Comentários</translation>
 <translation id="4527045527269911712">O dispositivo Bluetooth "<ph name="DEVICE_NAME" />" necessita de autorização para sincronizar.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> até estar totalmente carregada</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index b483d5b..48f8c96 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Lumină de noapte</translation>
 <translation id="2727977024730340865">V-ați conectat la un încărcător de putere joasă. Încărcarea bateriei poate fi nesigură.</translation>
 <translation id="2761704814324807722">Bară de stare, durată <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Se reconectează la <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Căutare</translation>
 <translation id="2803734122639935495">Ca să deblochezi, introdu parola</translation>
 <translation id="2819276065543622893">Veți fi deconectat(ă) acum.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Melodia următoare</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispozitive neasociate</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: se conectează...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Dispozitivul Bluetooth „<ph name="DEVICE_NAME" />” solicită permisiunea de a se conecta.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> până la încărcare completă</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 27f5d1c..7007156 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Ночной режим</translation>
 <translation id="2727977024730340865">Подключено маломощное зарядное устройство. Возможны проблемы при зарядке.</translation>
 <translation id="2761704814324807722">Строка состояния, время <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Повторное подключение к сети <ph name="NAME" />…</translation>
 <translation id="2792498699870441125">Alt + Search</translation>
 <translation id="2803734122639935495">Чтобы разблокировать устройство, введите пароль</translation>
 <translation id="2819276065543622893">Сеанс завершен.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Следующий трек</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Отключенные устройства</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: соединение...</translation>
 <translation id="4513946894732546136">Отзыв</translation>
 <translation id="4527045527269911712">Устройству <ph name="DEVICE_NAME" /> требуется разрешение на подключение через Bluetooth.</translation>
 <translation id="453661520163887813">До полной зарядки <ph name="TIME" /></translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 7262b56..a08f64f 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nočný režim</translation>
 <translation id="2727977024730340865">Batéria je zapojená do nabíjačky s nízkym výkonom. Nabíjanie batérie nemusí byť spoľahlivé.</translation>
 <translation id="2761704814324807722">Stavový panel, čas <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Prebieha opätovné pripájanie k sieti <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Hľadať</translation>
 <translation id="2803734122639935495">Odomknite zadaním hesla</translation>
 <translation id="2819276065543622893">Teraz prebehne odhlásenie.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Ďalšia stopa</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Nespárované zariadenia</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: pripája sa...</translation>
 <translation id="4513946894732546136">Spätná väzba</translation>
 <translation id="4527045527269911712">Zariadenie Bluetooth s názvom <ph name="DEVICE_NAME" /> žiada o povolenie párovania.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> do úplného nabitia</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 9ace52e..a21a5f00 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nočna svetloba</translation>
 <translation id="2727977024730340865">Priključen je nizkoenergijski polnilnik. Polnjenje akumulatorja morda ne bo zanesljivo.</translation>
 <translation id="2761704814324807722">Vrstica stanja, čas: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Vnovično vzpostavljanje povezave z omrežjem <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + iskanje</translation>
 <translation id="2803734122639935495">Če želite odkleniti, vnesite geslo</translation>
 <translation id="2819276065543622893">Zdaj boste odjavljeni.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Naslednja skladba</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Naprave, za katere je bila preklicana seznanitev</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: vzpostavljanje povezave ...</translation>
 <translation id="4513946894732546136">Povratne informacije</translation>
 <translation id="4527045527269911712">Naprava Bluetooth »<ph name="DEVICE_NAME" />« želi dovoljenje za seznanjanje.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> do napolnjenosti</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index b01569a..92e40d0f 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Ноћно светло</translation>
 <translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation>
 <translation id="2761704814324807722">Статусна трака, време <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Поново се повезујете са мрежом <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + тастер за претрагу</translation>
 <translation id="2803734122639935495">Да бисте откључали, унесите лозинку</translation>
 <translation id="2819276065543622893">Бићете одмах одјављени.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Следећа песма</translation>
 <translation id="4479639480957787382">Етернет</translation>
 <translation id="4481530544597605423">Уређаји чије је упаривање опозвано</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Повезује се...</translation>
 <translation id="4513946894732546136">Повратне информације</translation>
 <translation id="4527045527269911712">Bluetooth уређај „<ph name="DEVICE_NAME" />“ жели дозволу за упаривање.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> до краја пуњења</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 99cb9863..ea4ec3a0 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Nattljus</translation>
 <translation id="2727977024730340865">Ansluten till en laddare med låg effekt. Batteriet kanske inte laddas ordentligt.</translation>
 <translation id="2761704814324807722">Statusfältet, tid <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Återansluter till <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Sök</translation>
 <translation id="2803734122639935495">Lås upp med lösenordet</translation>
 <translation id="2819276065543622893">Du loggas nu ut.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Nästa spår</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Frånkopplade enheter</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: ansluter ...</translation>
 <translation id="4513946894732546136">Feedback</translation>
 <translation id="4527045527269911712">Bluetooth-enheten <ph name="DEVICE_NAME" /> har begärt tillstånd för koppling.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> tills batteriet är fullt</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 17b37ef0..953c3168 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Mwanga wa Usiku</translation>
 <translation id="2727977024730340865">Imechomekwa katika chaja ya kawi ya chini. Huenda kuchaji kwa betri hakutakuwa kuzuri.</translation>
 <translation id="2761704814324807722">Treya ya hali, saa <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Inaunganisha upya kwenye <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + Utafutaji</translation>
 <translation id="2803734122639935495">Weka nenosiri lako ili ufungue</translation>
 <translation id="2819276065543622893">Utaondolewa kwenye akaunti sasa hivi.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Wimbo Unaofuata</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Vifaa visivyooanishwa</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Inaunganisha...</translation>
 <translation id="4513946894732546136">Mwitiko</translation>
 <translation id="4527045527269911712">Kifaa cha Bluetooth cha "<ph name="DEVICE_NAME" />" kinaomba idhini ya kuoanisha.</translation>
 <translation id="453661520163887813">Zimesalia <ph name="TIME" /> ili ijae</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 39181719..c4b7ee6 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -116,7 +116,6 @@
 <translation id="2718395828230677721">நைட் லைட்</translation>
 <translation id="2727977024730340865">குறைந்த சக்தியிலான சார்ஜர் செருகப்பட்டுள்ளது. பேட்டரி சார்ஜிங் நம்பகமானதாக இல்லாமல் இருக்கலாம்.</translation>
 <translation id="2761704814324807722">நிலைத் தட்டு, நேரம் <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> உடன் மீண்டும் இணைக்கிறது</translation>
 <translation id="2792498699870441125">Alt+தேடல்</translation>
 <translation id="2803734122639935495">திறக்க, உங்கள் கடவுச்சொல்லை உள்ளிடவும்</translation>
 <translation id="2819276065543622893">இப்போது வெளியேற்றப்படுவீர்கள்.</translation>
@@ -234,7 +233,6 @@
 <translation id="4477350412780666475">அடுத்த ட்ராக்</translation>
 <translation id="4479639480957787382">ஈத்தர்நெட்</translation>
 <translation id="4481530544597605423">இணைக்காத சாதனங்கள்</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: இணைக்கிறது...</translation>
 <translation id="4513946894732546136">கருத்து</translation>
 <translation id="4527045527269911712">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />", இணைப்பதற்கான அனுமதியை விரும்புகிறது.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> ஆகும் 100% சார்ஜாக</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index a3f84026..e4080c1 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -82,7 +82,7 @@
 <translation id="2208323208084708176">ఏకీకృత డెస్క్‌టాప్ మోడ్</translation>
 <translation id="2220572644011485463">PIN లేదా పాస్‌వర్డ్</translation>
 <translation id="225680501294068881">పరికరాల కోసం స్కాన్ చేస్తోంది...</translation>
-<translation id="2268130516524549846">Bluetooth నిలిపివేయబడింది</translation>
+<translation id="2268130516524549846">బ్లూటూత్‌ నిలిపివేయబడింది</translation>
 <translation id="2268813581635650749">అందరినీ సైన్ అవుట్ చేయి</translation>
 <translation id="2277103315734023688">ముందుకు జరుపు</translation>
 <translation id="2292698582925480719">ప్రదర్శన ప్రమాణం</translation>
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">రాత్రి కాంతి</translation>
 <translation id="2727977024730340865">తక్కువ-పవర్ గల ఛార్జర్‌కు ప్లగిన్ చేయబడింది. బ్యాటరీ ఛార్జింగ్ విశ్వసనీయంగా ఉండకపోవచ్చు.</translation>
 <translation id="2761704814324807722">స్థితి ట్రే, సమయం <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" />కి మళ్లీ కనెక్ట్ చేస్తోంది</translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">అన్‌లాక్ చేయడానికి, మీ పాస్‌వర్డ్‌ని నమోదు చేయండి</translation>
 <translation id="2819276065543622893">మీరు ఇప్పుడు సైన్ అవుట్ చేయబడతారు.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">తర్వాతి ట్రాక్</translation>
 <translation id="4479639480957787382">ఈథర్నెట్</translation>
 <translation id="4481530544597605423">జతను తీసివేసిన పరికరాలు</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: కనెక్ట్ అవుతోంది...</translation>
 <translation id="4513946894732546136">అభిప్రాయం</translation>
 <translation id="4527045527269911712">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత కావడానికి అనుమతి కోరుతోంది.</translation>
 <translation id="453661520163887813">పూర్తి కావడానికి <ph name="TIME" /> పడుతుంది</translation>
@@ -290,7 +288,7 @@
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" ఎక్స్‌టెన్షన్ ఈ నెట్‌వర్క్‌కు కనెక్ట్ చేయడంలో సహాయపడగలదు.</translation>
 <translation id="554893713779400387">డిక్టేషన్‌ను టోగుల్ చేయి</translation>
-<translation id="5571066253365925590">Bluetooth ప్రారంభించబడింది</translation>
+<translation id="5571066253365925590">బ్లూటూత్‌ ప్రారంభించబడింది</translation>
 <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation>
 <translation id="5600837773213129531">ప్రసంగ రూప అభిప్రాయాన్ని నిలిపివేయడానికి Ctrl + Alt + Z నొక్కండి.</translation>
 <translation id="5625955975703555628">LTE+</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 7a24b1e..f613f651 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">แสงตอนกลางคืน</translation>
 <translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation>
 <translation id="2761704814324807722">ถาดสถานะ เวลา <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">กำลังเชื่อมต่อ <ph name="NAME" /> อีกครั้ง</translation>
 <translation id="2792498699870441125">Alt+ค้นหา</translation>
 <translation id="2803734122639935495">ป้อนรหัสผ่านเพื่อปลดล็อก</translation>
 <translation id="2819276065543622893">คุณจะออกจากระบบในตอนนี้</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">แทร็กถัดไป</translation>
 <translation id="4479639480957787382">อีเทอร์เน็ต</translation>
 <translation id="4481530544597605423">อุปกรณ์ที่ไม่ได้จับคู่</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: กำลังเชื่อมต่อ...</translation>
 <translation id="4513946894732546136">ข้อเสนอแนะ</translation>
 <translation id="4527045527269911712">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ต้องการสิทธิ์ในการจับคู่</translation>
 <translation id="453661520163887813">อีก <ph name="TIME" /> จะเต็ม</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index a47d53cd..1723c881 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Gece Işığı</translation>
 <translation id="2727977024730340865">Düşük güçlü bir şarj cihazına takıldı. Şarj durumu güvenilir olmayabilir.</translation>
 <translation id="2761704814324807722">Durum tepsisi, saat: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581"><ph name="NAME" /> ile yeniden bağlantı kuruluyor</translation>
 <translation id="2792498699870441125">Alt+Arama</translation>
 <translation id="2803734122639935495">Kilidi açmak için şifrenizi girin</translation>
 <translation id="2819276065543622893">Şimdi çıkış yapacaksınız.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Sonraki Parça</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Eşlemesi kaldırılmış cihazlar</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Bağlanıyor...</translation>
 <translation id="4513946894732546136">Geri Bildirim</translation>
 <translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşleme izni istiyor.</translation>
 <translation id="453661520163887813">Dolmasına <ph name="TIME" /> var</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 19bd8c50..cc2c44fe 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Нічний режим</translation>
 <translation id="2727977024730340865">Підключено до зарядного пристрою низької потужності. Акумулятор може заряджатися неналежним чином.</translation>
 <translation id="2761704814324807722">Панель статусу, час: <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Під’єднання до мережі <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+клавіша пошуку</translation>
 <translation id="2803734122639935495">Щоб розблокувати, введіть пароль</translation>
 <translation id="2819276065543622893">Зараз ви вийдете.</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">Наступна композиція</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Відключені пристрої</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Під’єднання…</translation>
 <translation id="4513946894732546136">Відгуки</translation>
 <translation id="4527045527269911712">Пристрою Bluetooth "<ph name="DEVICE_NAME" />" потрібен дозвіл на підключення.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> до повного заряду</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 5d47909..df342c7 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">Ánh sáng đêm</translation>
 <translation id="2727977024730340865">Được cắm vào bộ sạc công suất thấp. Việc sạc pin có thể không được đảm bảo.</translation>
 <translation id="2761704814324807722">Khay trạng thái, thời gian <ph name="TIME" />, <ph name="BATTERY" /></translation>
-<translation id="277257480934873581">Đang kết nối lại với <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt+Search</translation>
 <translation id="2803734122639935495">Nhập mật khẩu để mở khóa</translation>
 <translation id="2819276065543622893">Bạn sẽ bị đăng xuất bây giờ.</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">Bản nhạc tiếp theo</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Thiết bị được hủy ghép nối</translation>
-<translation id="4508225577814909926"><ph name="NAME" />: Đang kết nối...</translation>
 <translation id="4513946894732546136">Phản hồi</translation>
 <translation id="4527045527269911712">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />"muốn được phép ghép nối.</translation>
 <translation id="453661520163887813"><ph name="TIME" /> cho đến khi đầy</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index ed90b8c..529b6aa 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">夜间模式</translation>
 <translation id="2727977024730340865">已插入低功率充电器;可能无法保证充电成功。</translation>
 <translation id="2761704814324807722">状态栏,时间为<ph name="TIME" />,<ph name="BATTERY" /></translation>
-<translation id="277257480934873581">正在重新连接到 <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + 搜索键</translation>
 <translation id="2803734122639935495">要解锁此设备,请输入您的密码</translation>
 <translation id="2819276065543622893">您将立即退出。</translation>
@@ -236,7 +235,6 @@
 <translation id="4477350412780666475">下一曲</translation>
 <translation id="4479639480957787382">以太网</translation>
 <translation id="4481530544597605423">未配对的设备</translation>
-<translation id="4508225577814909926"><ph name="NAME" />:正在连接...</translation>
 <translation id="4513946894732546136">反馈</translation>
 <translation id="4527045527269911712">蓝牙设备“<ph name="DEVICE_NAME" />”需要配对许可。</translation>
 <translation id="453661520163887813"><ph name="TIME" /> 后充满</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index a48ceb8..8ba0a904 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -117,7 +117,6 @@
 <translation id="2718395828230677721">夜燈</translation>
 <translation id="2727977024730340865">使用低功率充電器,可能導致充電狀態不穩定。</translation>
 <translation id="2761704814324807722">狀態匣:時間 <ph name="TIME" />,<ph name="BATTERY" /></translation>
-<translation id="277257480934873581">正在重新連線至 <ph name="NAME" /></translation>
 <translation id="2792498699870441125">Alt + 搜尋鍵</translation>
 <translation id="2803734122639935495">如要解鎖,請輸入你的密碼</translation>
 <translation id="2819276065543622893">現在即將登出。</translation>
@@ -235,7 +234,6 @@
 <translation id="4477350412780666475">下一首曲目</translation>
 <translation id="4479639480957787382">乙太網路</translation>
 <translation id="4481530544597605423">解除配對的裝置</translation>
-<translation id="4508225577814909926"><ph name="NAME" />:正在連線...</translation>
 <translation id="4513946894732546136">意見回饋</translation>
 <translation id="4527045527269911712">藍牙裝置「<ph name="DEVICE_NAME" />」要求配對權限。</translation>
 <translation id="453661520163887813"><ph name="TIME" /> 後充飽</translation>
diff --git a/ash/system/cast/cast_feature_pod_controller.cc b/ash/system/cast/cast_feature_pod_controller.cc
index 4eee642..33f8f5f37 100644
--- a/ash/system/cast/cast_feature_pod_controller.cc
+++ b/ash/system/cast/cast_feature_pod_controller.cc
@@ -39,6 +39,7 @@
     CastConfigController::Get()->RequestDeviceRefresh();
   }
 
+  Update();
   return button_;
 }
 
diff --git a/ash/system/power/power_button_menu_view.cc b/ash/system/power/power_button_menu_view.cc
index 683ef05..758b818 100644
--- a/ash/system/power/power_button_menu_view.cc
+++ b/ash/system/power/power_button_menu_view.cc
@@ -5,7 +5,7 @@
 #include "ash/system/power/power_button_menu_view.h"
 
 #include "ash/display/screen_orientation_controller.h"
-#include "ash/new_window_controller.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
@@ -266,7 +266,7 @@
     shell->session_controller()->LockScreen();
   } else if (sender == feedback_item_) {
     RecordMenuActionHistogram(PowerButtonMenuActionType::kFeedback);
-    shell->new_window_controller()->OpenFeedbackPage();
+    NewWindowDelegate::GetInstance()->OpenFeedbackPage();
   } else {
     NOTREACHED() << "Invalid sender";
   }
diff --git a/ash/system/session/logout_button_tray.cc b/ash/system/session/logout_button_tray.cc
index 25faeea3..b32d72e 100644
--- a/ash/system/session/logout_button_tray.cc
+++ b/ash/system/session/logout_button_tray.cc
@@ -31,22 +31,18 @@
 
 namespace ash {
 
-LogoutButtonTray::LogoutButtonTray(Shelf* shelf)
-    : shelf_(shelf),
-      container_(new TrayContainer(shelf)),
-      button_(views::MdTextButton::Create(this,
-                                          base::string16(),
-                                          CONTEXT_LAUNCHER_BUTTON)),
-      show_logout_button_in_tray_(false) {
+LogoutButtonTray::LogoutButtonTray(Shelf* shelf) : shelf_(shelf) {
   DCHECK(shelf);
   Shell::Get()->session_controller()->AddObserver(this);
   SetLayoutManager(std::make_unique<views::FillLayout>());
-  AddChildView(container_);
+  container_ = AddChildView(std::make_unique<TrayContainer>(shelf));
 
-  button_->SetProminent(true);
-  button_->SetBgColorOverride(gfx::kGoogleRed700);
+  auto button = views::MdTextButton::Create(this, base::string16(),
+                                            CONTEXT_LAUNCHER_BUTTON);
+  button->SetProminent(true);
+  button->SetBgColorOverride(gfx::kGoogleRed700);
 
-  container_->AddChildView(button_);
+  button_ = container_->AddChildView(std::move(button));
   SetVisible(false);
 }
 
diff --git a/ash/system/session/logout_button_tray.h b/ash/system/session/logout_button_tray.h
index be52a416..bda7c71 100644
--- a/ash/system/session/logout_button_tray.h
+++ b/ash/system/session/logout_button_tray.h
@@ -58,9 +58,9 @@
   void UpdateButtonTextAndImage();
 
   Shelf* const shelf_;
-  TrayContainer* const container_;
-  views::MdTextButton* const button_;
-  bool show_logout_button_in_tray_;
+  TrayContainer* container_;
+  views::MdTextButton* button_;
+  bool show_logout_button_in_tray_ = false;
   base::TimeDelta dialog_duration_;
 
   // Observes user profile prefs.
diff --git a/ash/system/tray/tray_popup_utils.cc b/ash/system/tray/tray_popup_utils.cc
index ad148b66..472ec797 100644
--- a/ash/system/tray/tray_popup_utils.cc
+++ b/ash/system/tray/tray_popup_utils.cc
@@ -244,9 +244,9 @@
 views::LabelButton* TrayPopupUtils::CreateTrayPopupButton(
     views::ButtonListener* listener,
     const base::string16& text) {
-  auto* button = views::MdTextButton::Create(listener, text);
+  auto button = views::MdTextButton::Create(listener, text);
   button->SetProminent(true);
-  return button;
+  return button.release();
 }
 
 views::Separator* TrayPopupUtils::CreateVerticalSeparator() {
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 61dd8ce..1f42194 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -18,6 +18,7 @@
 #include "ash/public/cpp/ash_prefs.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/test/test_keyboard_controller_observer.h"
+#include "ash/public/cpp/test/test_new_window_delegate.h"
 #include "ash/session/test_pref_service_provider.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shell.h"
@@ -171,6 +172,8 @@
       std::make_unique<TestKeyboardControllerObserver>(
           shell->ash_keyboard_controller());
 
+  new_window_delegate_ = std::make_unique<TestNewWindowDelegate>();
+
   // Remove the app dragging animations delay for testing purposes.
   shell->overview_controller()->set_delayed_animation_task_delay_for_test(
       base::TimeDelta());
@@ -184,6 +187,7 @@
   app_list_test_helper_.reset();
 
   Shell::DeleteInstance();
+  new_window_delegate_.reset();
 
   // Suspend the tear down until all resources are returned via
   // CompositorFrameSinkClient::ReclaimResources()
diff --git a/ash/test/ash_test_helper.h b/ash/test/ash_test_helper.h
index 094b6d84d..be17ffa 100644
--- a/ash/test/ash_test_helper.h
+++ b/ash/test/ash_test_helper.h
@@ -44,6 +44,7 @@
 class AppListTestHelper;
 class AshTestViewsDelegate;
 class TestKeyboardControllerObserver;
+class TestNewWindowDelegate;
 class TestPrefServiceProvider;
 class TestShellDelegate;
 
@@ -125,6 +126,8 @@
 
   std::unique_ptr<AppListTestHelper> app_list_test_helper_;
 
+  std::unique_ptr<TestNewWindowDelegate> new_window_delegate_;
+
   std::unique_ptr<TestKeyboardControllerObserver>
       test_keyboard_controller_observer_;
 
diff --git a/ash/wm/drag_window_controller.cc b/ash/wm/drag_window_controller.cc
index d8c83ac..490f3a1 100644
--- a/ash/wm/drag_window_controller.cc
+++ b/ash/wm/drag_window_controller.cc
@@ -32,6 +32,13 @@
 
 namespace ash {
 
+namespace {
+
+// The maximum opacity of the drag phantom window.
+constexpr float kDragPhantomMaxOpacity = 0.8f;
+
+}  // namespace
+
 // This keeps track of the drag window's state. It creates/destroys/updates
 // bounds and opacity based on the current bounds.
 class DragWindowController::DragWindowDetails : public aura::WindowDelegate {
@@ -46,10 +53,10 @@
   }
 
   void Update(aura::Window* original_window,
-              const gfx::Rect& bounds_in_screen,
               const gfx::Point& drag_location_in_screen) {
-    gfx::Rect root_bounds_in_screen = root_window_->GetBoundsInScreen();
-    if (!root_bounds_in_screen.Intersects(bounds_in_screen)) {
+    const float opacity = GetDragWindowOpacity(root_window_, original_window,
+                                               drag_location_in_screen);
+    if (opacity == 0.f) {
       delete drag_window_;
       // Make sure drag_window_ is reset so that new drag window will be created
       // when it becomes necessary again.
@@ -58,32 +65,26 @@
       return;
     }
     if (!drag_window_)
-      CreateDragWindow(original_window, bounds_in_screen);
+      CreateDragWindow(original_window);
 
-    gfx::Rect bounds_in_root = bounds_in_screen;
-    ::wm::ConvertRectFromScreen(drag_window_->parent(), &bounds_in_root);
-    drag_window_->SetBounds(bounds_in_root);
-    if (root_bounds_in_screen.Contains(drag_location_in_screen)) {
-      SetOpacity(original_window, 1.f);
-    } else {
-      drag_window_->SetBounds(bounds_in_root);
-      gfx::Rect visible_bounds = root_bounds_in_screen;
-      visible_bounds.Intersect(bounds_in_screen);
-      SetOpacity(original_window,
-                 GetDragWindowOpacity(bounds_in_screen, visible_bounds));
-    }
+    gfx::Rect bounds = original_window->bounds();
+    aura::Window::ConvertRectToTarget(original_window->parent(),
+                                      drag_window_->parent(), &bounds);
+    drag_window_->SetBounds(bounds);
+    SetOpacity(original_window, opacity);
   }
 
  private:
   friend class DragWindowController;
 
-  void CreateDragWindow(aura::Window* original_window,
-                        const gfx::Rect& bounds_in_screen) {
+  void CreateDragWindow(aura::Window* original_window) {
     DCHECK(!drag_window_);
     original_window_ = original_window;
     drag_window_ = window_factory::NewWindow(this).release();
     int parent_id = original_window->parent()->id();
     aura::Window* container = root_window_->GetChildById(parent_id);
+    gfx::Rect bounds = original_window->bounds();
+    ::wm::ConvertRectToScreen(original_window->parent(), &bounds);
 
     drag_window_->SetType(aura::client::WINDOW_TYPE_POPUP);
     drag_window_->SetTransparent(true);
@@ -92,7 +93,7 @@
     drag_window_->set_id(kShellWindowId_PhantomWindow);
     drag_window_->SetProperty(aura::client::kAnimationsDisabledKey, true);
     container->AddChild(drag_window_);
-    drag_window_->SetBounds(bounds_in_screen);
+    drag_window_->SetBounds(bounds);
     ::wm::SetShadowElevation(drag_window_, ::wm::kShadowElevationActiveWindow);
 
     RecreateWindowLayers(original_window);
@@ -171,13 +172,19 @@
 
 // static
 float DragWindowController::GetDragWindowOpacity(
-    const gfx::Rect& window_bounds,
-    const gfx::Rect& visible_bounds) {
-  // The maximum opacity of the drag phantom window.
-  static const float kMaxOpacity = 0.8f;
+    aura::Window* root_window,
+    aura::Window* dragged_window,
+    const gfx::Point& drag_location_in_screen) {
+  const gfx::Rect root_bounds = root_window->GetBoundsInScreen();
+  if (root_bounds.Contains(drag_location_in_screen))
+    return 1.f;
 
-  return kMaxOpacity * visible_bounds.size().GetArea() /
-         window_bounds.size().GetArea();
+  gfx::Rect dragged_window_bounds = dragged_window->bounds();
+  ::wm::ConvertRectToScreen(dragged_window->parent(), &dragged_window_bounds);
+  gfx::Rect visible_bounds = root_bounds;
+  visible_bounds.Intersect(dragged_window_bounds);
+  return kDragPhantomMaxOpacity * visible_bounds.size().GetArea() /
+         dragged_window_bounds.size().GetArea();
 }
 
 DragWindowController::DragWindowController(aura::Window* window)
@@ -196,10 +203,9 @@
 
 DragWindowController::~DragWindowController() = default;
 
-void DragWindowController::Update(const gfx::Rect& bounds_in_screen,
-                                  const gfx::Point& drag_location_in_screen) {
+void DragWindowController::Update(const gfx::Point& drag_location_in_screen) {
   for (std::unique_ptr<DragWindowDetails>& details : drag_windows_)
-    details->Update(window_, bounds_in_screen, drag_location_in_screen);
+    details->Update(window_, drag_location_in_screen);
 }
 
 int DragWindowController::GetDragWindowsCountForTest() const {
diff --git a/ash/wm/drag_window_controller.h b/ash/wm/drag_window_controller.h
index 373cb0c..f91f332 100644
--- a/ash/wm/drag_window_controller.h
+++ b/ash/wm/drag_window_controller.h
@@ -27,10 +27,12 @@
 // while dragging a window across displays.
 class ASH_EXPORT DragWindowController {
  public:
-  // Computes the opacity for drag window based on how much of the area
-  // of the window is visible.
-  static float GetDragWindowOpacity(const gfx::Rect& window_bounds,
-                                    const gfx::Rect& visible_bounds);
+  // Returns 1 if |drag_location_in_screen| is contained in |root_window|.
+  // Otherwise, returns an opacity value based on what fraction of
+  // |dragged_window| is contained in |root_window|.
+  static float GetDragWindowOpacity(aura::Window* root_window,
+                                    aura::Window* dragged_window,
+                                    const gfx::Point& drag_location_in_screen);
 
   explicit DragWindowController(aura::Window* window);
   virtual ~DragWindowController();
@@ -38,8 +40,7 @@
   // This is used to update the bounds and opacity for the drag window
   // immediately.
   // This also creates/destorys the drag window when necessary.
-  void Update(const gfx::Rect& bounds_in_screen,
-              const gfx::Point& drag_location_in_screen);
+  void Update(const gfx::Point& drag_location_in_screen);
 
  private:
   class DragWindowDetails;
diff --git a/ash/wm/drag_window_resizer.cc b/ash/wm/drag_window_resizer.cc
index 90a8b43..3b27c35 100644
--- a/ash/wm/drag_window_resizer.cc
+++ b/ash/wm/drag_window_resizer.cc
@@ -62,7 +62,7 @@
   if (display::Screen::GetScreen()->GetNumDisplays() > 1) {
     gfx::Point location_in_screen = location;
     ::wm::ConvertPointToScreen(GetTarget()->parent(), &location_in_screen);
-    UpdateDragWindow(GetTarget()->bounds(), location_in_screen);
+    UpdateDragWindow(location_in_screen);
   } else {
     drag_window_controller_.reset();
   }
@@ -105,7 +105,6 @@
 }
 
 void DragWindowResizer::UpdateDragWindow(
-    const gfx::Rect& bounds_in_parent,
     const gfx::Point& drag_location_in_screen) {
   if (details().window_component != HTCAPTION || !ShouldAllowMouseWarp())
     return;
@@ -113,20 +112,9 @@
   if (!drag_window_controller_)
     drag_window_controller_.reset(new DragWindowController(GetTarget()));
 
-  gfx::Rect bounds_in_screen = bounds_in_parent;
-  ::wm::ConvertRectToScreen(GetTarget()->parent(), &bounds_in_screen);
-
-  gfx::Rect root_bounds_in_screen =
-      GetTarget()->GetRootWindow()->GetBoundsInScreen();
-  float opacity = 1.0f;
-  if (!root_bounds_in_screen.Contains(drag_location_in_screen)) {
-    gfx::Rect visible_bounds = root_bounds_in_screen;
-    visible_bounds.Intersect(bounds_in_screen);
-    opacity = DragWindowController::GetDragWindowOpacity(bounds_in_screen,
-                                                         visible_bounds);
-  }
-  GetTarget()->layer()->SetOpacity(opacity);
-  drag_window_controller_->Update(bounds_in_screen, drag_location_in_screen);
+  GetTarget()->layer()->SetOpacity(DragWindowController::GetDragWindowOpacity(
+      GetTarget()->GetRootWindow(), GetTarget(), drag_location_in_screen));
+  drag_window_controller_->Update(drag_location_in_screen);
 }
 
 bool DragWindowResizer::ShouldAllowMouseWarp() {
diff --git a/ash/wm/drag_window_resizer.h b/ash/wm/drag_window_resizer.h
index 58ecfeb..f379937 100644
--- a/ash/wm/drag_window_resizer.h
+++ b/ash/wm/drag_window_resizer.h
@@ -45,8 +45,7 @@
                            DragWindowControllerAcrossThreeDisplays);
 
   // Updates the bounds of the drag window for window dragging.
-  void UpdateDragWindow(const gfx::Rect& bounds_in_parent,
-                        const gfx::Point& drag_location_in_screen);
+  void UpdateDragWindow(const gfx::Point& drag_location_in_screen);
 
   // Returns true if we should allow the mouse pointer to warp.
   bool ShouldAllowMouseWarp();
diff --git a/ash/wm/test_child_modal_parent.cc b/ash/wm/test_child_modal_parent.cc
index e8280731..e147be7a7 100644
--- a/ash/wm/test_child_modal_parent.cc
+++ b/ash/wm/test_child_modal_parent.cc
@@ -89,9 +89,6 @@
 
 TestChildModalParent::TestChildModalParent(aura::Window* context)
     : modal_parent_(std::make_unique<Widget>()),
-      button_(views::MdTextButton::Create(
-          this,
-          base::ASCIIToUTF16("Show/Hide Child Modal Window"))),
       textfield_(new views::Textfield),
       host_(new views::NativeViewHost) {
   textfield_->set_placeholder_text(base::ASCIIToUTF16("top level window"));
@@ -108,7 +105,9 @@
   modal_parent_textfield->set_placeholder_text(
       base::ASCIIToUTF16("modal parent window"));
   modal_parent_->GetNativeView()->SetName("ModalParent");
-  AddChildView(button_);
+  auto button = views::MdTextButton::Create(
+      this, base::ASCIIToUTF16("Show/Hide Child Modal Window"));
+  button_ = AddChildView(std::move(button));
   AddChildView(textfield_);
   AddChildView(host_);
 }
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index 880f2c9d..2c961732 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -970,6 +970,7 @@
       help='Path to R.txt file for the base resources whitelist.')
   parser.add_option(
       '--is-base-module',
+      action='store_true',
       help='Specifies that this module is a base module for some app bundle.')
 
   parser.add_option('--generate-markdown-format-doc', action='store_true',
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 746d2a6..0ecc0da0 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8912850310186308320
\ No newline at end of file
+8912821929161653744
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 9c395087..0ac78c1 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8912853447266381072
\ No newline at end of file
+8912823474476883600
\ No newline at end of file
diff --git a/build/linux/unbundle/re2.gn b/build/linux/unbundle/re2.gn
index 94013e5..83e1e70 100644
--- a/build/linux/unbundle/re2.gn
+++ b/build/linux/unbundle/re2.gn
@@ -2,8 +2,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/c++/c++.gni")
 import("//build/shim_headers.gni")
 
+assert(!use_custom_libcxx,
+       "Usage of the system libre2.so is not supported with " +
+           "use_custom_libcxx=true because the library's interface relies on " +
+           "libstdc++'s std::string and std::vector.")
+
 shim_headers("re2_shim") {
   root_path = "src"
   headers = [
diff --git a/cc/input/scrollbar.h b/cc/input/scrollbar.h
index bd785ff..ec23fef 100644
--- a/cc/input/scrollbar.h
+++ b/cc/input/scrollbar.h
@@ -11,6 +11,7 @@
 #include "ui/gfx/geometry/rect.h"
 
 static const int kPixelsPerLineStep = 40;
+static const float kMinFractionToStepWhenPaging = 0.875f;
 
 namespace cc {
 
@@ -23,7 +24,9 @@
   TICKMARKS,
   BACK_BUTTON,
   FORWARD_BUTTON,
-  NO_PART
+  BACK_TRACK,
+  FORWARD_TRACK,
+  NO_PART,
 };
 
 class Scrollbar {
diff --git a/cc/input/scrollbar_controller.cc b/cc/input/scrollbar_controller.cc
index e2067a38..410f2fc8 100644
--- a/cc/input/scrollbar_controller.cc
+++ b/cc/input/scrollbar_controller.cc
@@ -114,8 +114,7 @@
       currently_captured_scrollbar_->scroll_layer_length();
   float scrollbar_track_length = currently_captured_scrollbar_->TrackLength();
   gfx::Rect thumb_rect(currently_captured_scrollbar_->ComputeThumbQuadRect());
-  float scrollbar_thumb_length = currently_captured_scrollbar_->orientation() ==
-                                         ScrollbarOrientation::VERTICAL
+  float scrollbar_thumb_length = orientation == ScrollbarOrientation::VERTICAL
                                      ? thumb_rect.height()
                                      : thumb_rect.width();
 
@@ -163,6 +162,36 @@
   return layer_impl;
 }
 
+int ScrollbarController::GetScrollDeltaForScrollbarPart(
+    ScrollbarPart scrollbar_part) {
+  int scroll_delta = 0;
+  int viewport_length = 0;
+  LayerImpl* owner_scroll_layer = nullptr;
+
+  switch (scrollbar_part) {
+    case ScrollbarPart::BACK_BUTTON:
+    case ScrollbarPart::FORWARD_BUTTON:
+      scroll_delta = kPixelsPerLineStep;
+      break;
+    case ScrollbarPart::BACK_TRACK:
+    case ScrollbarPart::FORWARD_TRACK:
+      owner_scroll_layer =
+          layer_tree_host_impl_->active_tree()->ScrollableLayerByElementId(
+              currently_captured_scrollbar_->scroll_element_id());
+      viewport_length =
+          currently_captured_scrollbar_->orientation() ==
+                  ScrollbarOrientation::VERTICAL
+              ? owner_scroll_layer->scroll_container_bounds().height()
+              : (owner_scroll_layer->scroll_container_bounds().width());
+      scroll_delta = viewport_length * kMinFractionToStepWhenPaging;
+      break;
+    default:
+      scroll_delta = 0;
+  }
+  return scroll_delta *
+         layer_tree_host_impl_->active_tree()->device_scale_factor();
+}
+
 // Determines the scroll offsets based on hit test results.
 gfx::ScrollOffset ScrollbarController::GetScrollDeltaFromPointerDown(
     const gfx::PointF position_in_widget) {
@@ -188,9 +217,7 @@
   scrollbar_part = currently_captured_scrollbar_->IdentifyScrollbarPart(
       scroller_relative_position);
 
-  float scroll_delta =
-      layer_tree_host_impl_->active_tree()->device_scale_factor() *
-      kPixelsPerLineStep;
+  float scroll_delta = GetScrollDeltaForScrollbarPart(scrollbar_part);
 
   // See CreateScrollStateForGesture for more information on how these values
   // will be interpreted.
@@ -205,6 +232,14 @@
   } else if (scrollbar_part == ScrollbarPart::THUMB) {
     // Offsets are calculated in HandleMouseMove.
     thumb_drag_in_progress_ = true;
+  } else if (scrollbar_part == ScrollbarPart::BACK_TRACK) {
+    return orientation == ScrollbarOrientation::VERTICAL
+               ? gfx::ScrollOffset(0, -scroll_delta)   // Track click up
+               : gfx::ScrollOffset(-scroll_delta, 0);  // Track click left
+  } else if (scrollbar_part == ScrollbarPart::FORWARD_TRACK) {
+    return orientation == ScrollbarOrientation::VERTICAL
+               ? gfx::ScrollOffset(0, scroll_delta)   // Track click down
+               : gfx::ScrollOffset(scroll_delta, 0);  // Track click right
   }
 
   return gfx::ScrollOffset(0, 0);
diff --git a/cc/input/scrollbar_controller.h b/cc/input/scrollbar_controller.h
index 909e6bd..3ce46246 100644
--- a/cc/input/scrollbar_controller.h
+++ b/cc/input/scrollbar_controller.h
@@ -32,6 +32,8 @@
   gfx::ScrollOffset GetScrollDeltaFromPointerDown(
       const gfx::PointF position_in_widget);
   LayerImpl* GetLayerHitByPoint(const gfx::PointF position_in_widget);
+  int GetScrollDeltaForScrollbarPart(ScrollbarPart scrollbar_part);
+
   LayerTreeHostImpl* layer_tree_host_impl_;
 
   // Used to safeguard against firing GSE without firing GSB and GSU. For
diff --git a/cc/layers/painted_scrollbar_layer_impl.cc b/cc/layers/painted_scrollbar_layer_impl.cc
index 66275d9..0788e66 100644
--- a/cc/layers/painted_scrollbar_layer_impl.cc
+++ b/cc/layers/painted_scrollbar_layer_impl.cc
@@ -217,6 +217,36 @@
   return forward_button_rect_;
 }
 
+gfx::Rect PaintedScrollbarLayerImpl::BackTrackRect() const {
+  gfx::Rect thumb_rect = ComputeThumbQuadRect();
+  if (orientation() == HORIZONTAL) {
+    int rect_x = back_button_rect_.x() + back_button_rect_.width();
+    int rect_y = back_button_rect_.y();
+    return gfx::Rect(rect_x, rect_y, thumb_rect.x() - rect_x,
+                     back_button_rect_.height());
+  } else {
+    int rect_x = back_button_rect_.x();
+    int rect_y = back_button_rect_.y() + back_button_rect_.height();
+    return gfx::Rect(rect_x, rect_y, back_button_rect_.width(),
+                     thumb_rect.y() - rect_y);
+  }
+}
+
+gfx::Rect PaintedScrollbarLayerImpl::ForwardTrackRect() const {
+  gfx::Rect thumb_rect = ComputeThumbQuadRect();
+  if (orientation() == HORIZONTAL) {
+    int rect_x = thumb_rect.x() + thumb_rect.width();
+    int rect_y = thumb_rect.y();
+    return gfx::Rect(rect_x, rect_y, forward_button_rect_.x() - rect_x,
+                     forward_button_rect_.height());
+  } else {
+    int rect_x = thumb_rect.x();
+    int rect_y = thumb_rect.y() + thumb_rect.height();
+    return gfx::Rect(rect_x, rect_y, forward_button_rect_.width(),
+                     forward_button_rect_.y() - rect_y);
+  }
+}
+
 void PaintedScrollbarLayerImpl::SetTrackLength(int track_length) {
   if (track_length_ == track_length)
     return;
diff --git a/cc/layers/painted_scrollbar_layer_impl.h b/cc/layers/painted_scrollbar_layer_impl.h
index 13a9b4f..37be215c 100644
--- a/cc/layers/painted_scrollbar_layer_impl.h
+++ b/cc/layers/painted_scrollbar_layer_impl.h
@@ -62,6 +62,8 @@
 
   gfx::Rect BackButtonRect() const override;
   gfx::Rect ForwardButtonRect() const override;
+  gfx::Rect BackTrackRect() const override;
+  gfx::Rect ForwardTrackRect() const override;
   int ThumbThickness() const override;
 
   LayerTreeSettings::ScrollbarAnimator GetScrollbarAnimator() const override;
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc
index 418d3ae1..419b051 100644
--- a/cc/layers/scrollbar_layer_impl_base.cc
+++ b/cc/layers/scrollbar_layer_impl_base.cc
@@ -290,6 +290,14 @@
   return gfx::Rect(0, 0);
 }
 
+gfx::Rect ScrollbarLayerImplBase::BackTrackRect() const {
+  return gfx::Rect(0, 0);
+}
+
+gfx::Rect ScrollbarLayerImplBase::ForwardTrackRect() const {
+  return gfx::Rect(0, 0);
+}
+
 // This manages identifying which part of a composited scrollbar got hit based
 // on the position_in_widget.
 ScrollbarPart ScrollbarLayerImplBase::IdentifyScrollbarPart(
@@ -298,11 +306,19 @@
                                     position_in_widget.y());
   if (BackButtonRect().Contains(pointer_location))
     return ScrollbarPart::BACK_BUTTON;
+
   if (ForwardButtonRect().Contains(pointer_location))
     return ScrollbarPart::FORWARD_BUTTON;
+
   if (ComputeThumbQuadRect().Contains(pointer_location))
     return ScrollbarPart::THUMB;
 
+  if (BackTrackRect().Contains(pointer_location))
+    return ScrollbarPart::BACK_TRACK;
+
+  if (ForwardTrackRect().Contains(pointer_location))
+    return ScrollbarPart::FORWARD_TRACK;
+
   // TODO(arakeri): Once crbug.com/952314 is fixed, add a DCHECK to verify that
   // the point that is passed in is within the TrackRect. Also, please note that
   // hit testing other scrollbar parts is not yet implemented.
diff --git a/cc/layers/scrollbar_layer_impl_base.h b/cc/layers/scrollbar_layer_impl_base.h
index 3749f55..b1c2252 100644
--- a/cc/layers/scrollbar_layer_impl_base.h
+++ b/cc/layers/scrollbar_layer_impl_base.h
@@ -70,6 +70,8 @@
   virtual int ThumbLength() const = 0;
   virtual gfx::Rect BackButtonRect() const;
   virtual gfx::Rect ForwardButtonRect() const;
+  virtual gfx::Rect BackTrackRect() const;
+  virtual gfx::Rect ForwardTrackRect() const;
   virtual ScrollbarPart IdentifyScrollbarPart(
       const gfx::PointF position_in_widget) const;
   // Only PaintedOverlayScrollbar(Aura Overlay Scrollbar) need to know
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc
index dc8464c..1a88aad 100644
--- a/cc/trees/effect_node.cc
+++ b/cc/trees/effect_node.cc
@@ -142,6 +142,10 @@
   value->SetDouble("opacity", opacity);
   value->SetDouble("backdrop_filter_quality", backdrop_filter_quality);
   value->SetBoolean("is_fast_rounded_corner", is_fast_rounded_corner);
+  if (!rounded_corner_bounds.IsEmpty()) {
+    MathUtil::AddToTracedValue("rounded_corner_bounds", rounded_corner_bounds,
+                               value);
+  }
   value->SetString("blend_mode", SkBlendMode_Name(blend_mode));
   value->SetBoolean("cache_render_surface", cache_render_surface);
   value->SetBoolean("has_copy_request", has_copy_request);
@@ -156,7 +160,6 @@
   value->SetBoolean("is_masked", is_masked);
   value->SetBoolean("effect_changed", effect_changed);
   value->SetBoolean("subtree_has_copy_request", subtree_has_copy_request);
-  value->SetBoolean("is_fast_rounded_corner", is_fast_rounded_corner);
   value->SetString("render_surface_reason",
                    RenderSurfaceReasonToString(render_surface_reason));
   value->SetInteger("transform_id", transform_id);
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc
index 6826aac..04dde04 100644
--- a/cc/trees/layer_tree_host_pixeltest_filters.cc
+++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -306,6 +306,34 @@
       base::FilePath(FILE_PATH_LITERAL("backdrop_filter_blur_off_axis.png")));
 }
 
+TEST_P(LayerTreeHostFiltersPixelTest, BackdropFilterBoundsWithChildren) {
+  scoped_refptr<SolidColorLayer> background =
+      CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorWHITE);
+  scoped_refptr<SolidColorLayer> green =
+      CreateSolidColorLayer(gfx::Rect(50, 50, 100, 100), kCSSGreen);
+  scoped_refptr<SolidColorLayer> invert =
+      CreateSolidColorLayer(gfx::Rect(30, 30, 140, 40), SK_ColorTRANSPARENT);
+  scoped_refptr<SolidColorLayer> invert_child1 =
+      CreateSolidColorLayer(gfx::Rect(50, -20, 40, 20), kCSSOrange);
+  scoped_refptr<SolidColorLayer> invert_child2 =
+      CreateSolidColorLayer(gfx::Rect(50, 40, 40, 20), kCSSOrange);
+  background->AddChild(green);
+  background->AddChild(invert);
+  invert->AddChild(invert_child1);
+  invert->AddChild(invert_child2);
+
+  FilterOperations filters;
+  filters.Append(FilterOperation::CreateInvertFilter(1.f));
+  invert->SetBackdropFilters(filters);
+  gfx::RRectF backdrop_filter_bounds(gfx::RectF(gfx::SizeF(invert->bounds())),
+                                     0);
+  invert->SetBackdropFilterBounds(backdrop_filter_bounds);
+
+  RunPixelTest(renderer_type(), background,
+               base::FilePath(FILE_PATH_LITERAL(
+                   "backdrop_filter_bounds_with_children.png")));
+}
+
 class LayerTreeHostFiltersScaledPixelTest
     : public LayerTreeHostFiltersPixelTest {
   void SetupTree() override {
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 60c1bf5..9a49bb9 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1488,7 +1488,10 @@
   "java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java",
   "java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java",
   "java/src/org/chromium/chrome/browser/tab/TrustedCdn.java",
+  "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java",
   "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java",
+  "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java",
+  "java/src/org/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator.java",
   "java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java",
   "java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java",
   "java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java",
@@ -1615,9 +1618,7 @@
   "java/src/org/chromium/chrome/browser/usage_stats/WebsiteEvent.java",
   "java/src/org/chromium/chrome/browser/ui/ImmersiveModeManager.java",
   "java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java",
-  "java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java",
   "java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java",
-  "java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java",
   "java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java",
   "java/src/org/chromium/chrome/browser/util/ChromeContextUtil.java",
   "java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 87e52a9..ce6ed7e 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -445,6 +445,7 @@
   "javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java",
   "javatests/src/org/chromium/chrome/browser/tab/TabUmaTest.java",
   "javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java",
+  "javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/AsyncTabCreationParamsManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/ContextMenuLoadUrlParamsTest.java",
@@ -471,7 +472,6 @@
   "javatests/src/org/chromium/chrome/browser/toolbar/top/BrandColorTest.java",
   "javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java",
   "javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java",
-  "javatests/src/org/chromium/chrome/browser/ui/system/NavigationBarColorControllerTest.java",
   "javatests/src/org/chromium/chrome/browser/usage_stats/TabSuspensionTest.java",
   "javatests/src/org/chromium/chrome/browser/util/ChromeFileProviderTest.java",
   "javatests/src/org/chromium/chrome/browser/util/FeatureUtilitiesTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
index cbaed7b..9a84e01 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
@@ -5,7 +5,7 @@
 <translation id="1625889395409731085">هل تريد فتح الرابط الخارجي؟</translation>
 <translation id="1699570257714336246">معلومات غير متوفرة</translation>
 <translation id="3604604794717279723">أوافق</translation>
-<translation id="4437727785356380473">‏تم غلق "مساعد Google" في Chrome.</translation>
+<translation id="4437727785356380473">‏تم إغلاق "مساعد Google" في Chrome.</translation>
 <translation id="4850886885716139402">عرض</translation>
 <translation id="5014174725590676422">‏يتم عرض شاشة التشغيل الأولى "لمساعد Google" على Chrome</translation>
 <translation id="5188078772080029703">‏سيرسل Chrome عنوان URL للموقع الإلكتروني ومحتواه، بالإضافة إلى عنوان بريدك الإلكتروني ونوع بطاقة الائتمان التي تم حفظها في Chrome إلى Google. يمكنك إيقاف هذا الإعداد من خلال "إعدادات Chrome". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb
index 95fa86f..e3212647 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_en-GB.xtb
@@ -5,7 +5,9 @@
 <translation id="2803478378562657435">Showing saved passwords and password options</translation>
 <translation id="2903493209154104877">Addresses</translation>
 <translation id="4660011489602794167">Show keyboard</translation>
+<translation id="5088366526685584589">Showing saved addresses</translation>
 <translation id="6393156038355142111">Suggest strong password</translation>
+<translation id="7299100402441711551">Show addresses</translation>
 <translation id="7494879913343971937">Show passwords</translation>
 <translation id="8507520749471379845">Passwords available</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb
index c4dc5fa..49b59104 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_et.xtb
@@ -5,7 +5,9 @@
 <translation id="2803478378562657435">Kuvatud on salvestatud paroolid ja paroolivalikud</translation>
 <translation id="2903493209154104877">Aadressid</translation>
 <translation id="4660011489602794167">Kuva klaviatuur</translation>
+<translation id="5088366526685584589">Kuvatud on salvestatud aadressid</translation>
 <translation id="6393156038355142111">Soovita tugevat parooli</translation>
+<translation id="7299100402441711551">Kuva aadressid</translation>
 <translation id="7494879913343971937">Kuva paroolid</translation>
 <translation id="8507520749471379845">Paroolid on saadaval</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb
index 263f3ddf..f3a8f97 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_lv.xtb
@@ -5,7 +5,9 @@
 <translation id="2803478378562657435">Tiek rādītas saglabātās paroles un paroļu iespējas</translation>
 <translation id="2903493209154104877">Adreses</translation>
 <translation id="4660011489602794167">Rādīt tastatūru</translation>
+<translation id="5088366526685584589">Tiek rādītas saglabātās adreses</translation>
 <translation id="6393156038355142111">Ieteikt drošu paroli</translation>
+<translation id="7299100402441711551">Rādīt adreses</translation>
 <translation id="7494879913343971937">Rādīt paroles</translation>
 <translation id="8507520749471379845">Ir pieejamas paroles</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb
index 4bbb078..7273093 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb
+++ b/chrome/android/features/keyboard_accessory/internal/java/strings/translations/android_keyboard_accessory_strings_pl.xtb
@@ -5,7 +5,9 @@
 <translation id="2803478378562657435">Wyświetlam zapisane hasła i opcje haseł</translation>
 <translation id="2903493209154104877">Adresy</translation>
 <translation id="4660011489602794167">Pokaż klawiaturę</translation>
+<translation id="5088366526685584589">Pokazuję zapisane adresy</translation>
 <translation id="6393156038355142111">Zaproponuj silne hasło</translation>
+<translation id="7299100402441711551">Pokaż adresy</translation>
 <translation id="7494879913343971937">Pokazuj hasła</translation>
 <translation id="8507520749471379845">Dostępne są hasła</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index a0aebff2..faeb753 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -369,12 +369,7 @@
 
         super.performPreInflationStartup();
 
-        // TODO(https://crbug.com/931496): Remove dependency on ChromeActivity in favor of passing
-        // in direct dependencies on needed classes. While migrating code from Chrome*Activity
-        // to the RootUiCoordinator, passing the activity is an easy way to get access to a
-        // number of objects that will ultimately be owned by the RootUiCoordinator. This is not
-        // a recommended pattern.
-        mRootUiCoordinator = new RootUiCoordinator(this);
+        mRootUiCoordinator = createRootUiCoordinator();
 
         // See comments on #getTouchlessUiCoordinator for why we're doing this here.
         getTouchlessUiCoordinator();
@@ -400,6 +395,15 @@
         getWindow().setBackgroundDrawable(getBackgroundDrawable());
     }
 
+    protected RootUiCoordinator createRootUiCoordinator() {
+        // TODO(https://crbug.com/931496): Remove dependency on ChromeActivity in favor of passing
+        // in direct dependencies on needed classes. While migrating code from Chrome*Activity
+        // to the RootUiCoordinator, passing the activity is an easy way to get access to a
+        // number of objects that will ultimately be owned by the RootUiCoordinator. This is not
+        // a recommended pattern.
+        return new RootUiCoordinator(this);
+    }
+
     private C createComponent() {
         ChromeActivityCommonsModule.Factory overridenCommonsFactory =
                 ModuleFactoryOverrides.getOverrideFor(ChromeActivityCommonsModule.Factory.class);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 9cb0df4d..a5f49d82 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -124,6 +124,7 @@
 import org.chromium.chrome.browser.tab.TabRedirectHandler;
 import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.tabbed_mode.TabbedAppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.tabbed_mode.TabbedRootUiCoordinator;
 import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
 import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
@@ -145,6 +146,7 @@
 import org.chromium.chrome.browser.toolbar.ToolbarButtonInProductHelpController;
 import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer;
 import org.chromium.chrome.browser.touchless.TouchlessDelegate;
+import org.chromium.chrome.browser.ui.RootUiCoordinator;
 import org.chromium.chrome.browser.usage_stats.UsageStatsService;
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.browser.util.FeatureUtilities;
@@ -1561,6 +1563,11 @@
     }
 
     @Override
+    protected RootUiCoordinator createRootUiCoordinator() {
+        return new TabbedRootUiCoordinator(this);
+    }
+
+    @Override
     protected int getControlContainerLayoutId() {
         return R.layout.control_container;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java
index 03d8eeb..c38c9229 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimator.java
@@ -220,7 +220,7 @@
      * @return The animated fraction after being passed through the time interpolator, if set.
      */
     @VisibleForTesting
-    public float getAnimatedFraction() {
+    float getAnimatedFraction() {
         return mAnimatedFraction;
     }
 
@@ -245,8 +245,7 @@
      * @param start The value to begin the animation with.
      * @param end The value to end the animation at.
      */
-    @VisibleForTesting
-    public void setValues(float start, float end) {
+    void setValues(float start, float end) {
         mStartValue = start;
         mEndValue = end;
     }
@@ -254,7 +253,6 @@
     /**
      * @return The current value between the floats set by {@link #setValues(float, float)}.
      */
-    @VisibleForTesting
     public float getAnimatedValue() {
         return mStartValue + (getAnimatedFraction() * (mEndValue - mStartValue));
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java
index 7ce78a6..7f283e4e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarBannerControl.java
@@ -250,22 +250,23 @@
      * Animates the Bar Banner appearance.
      */
     public void animateAppearance() {
-        CompositorAnimator appearance =
+        CompositorAnimator rippleWidth = CompositorAnimator.ofFloat(
+                mOverlayPanel.getAnimationHandler(), mRippleMinimumWidthPx, mRippleMaximumWidthPx,
+                OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS,
+                animator -> { mRippleWidthPx = animator.getAnimatedValue(); });
+        CompositorAnimator rippleOpacity =
                 CompositorAnimator.ofFloat(mOverlayPanel.getAnimationHandler(), 0.f, 1.f,
-                        OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS, null);
-        appearance.addUpdateListener(animator -> {
-            float percentage = animator.getAnimatedFraction();
-            mRippleWidthPx = Math.round(MathUtils.interpolate(
-                    mRippleMinimumWidthPx, mRippleMaximumWidthPx, percentage));
+                        OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS,
+                        animator -> { mRippleOpacity = animator.getAnimatedValue(); });
+        CompositorAnimator textOpacity =
+                CompositorAnimator.ofFloat(mOverlayPanel.getAnimationHandler(), 0.f, 1.f,
+                        OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS / 2,
+                        animator -> { mTextOpacity = animator.getAnimatedValue(); });
+        textOpacity.setStartDelay(OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS / 2);
 
-            mRippleOpacity = MathUtils.interpolate(0.f, 1.f, percentage);
-
-            float textOpacityDelay = 0.5f;
-            float textOpacityPercentage =
-                    Math.max(0.f, percentage - textOpacityDelay) / (1.f - textOpacityDelay);
-            mTextOpacity = MathUtils.interpolate(0.f, 1.f, textOpacityPercentage);
-        });
-        appearance.start();
+        rippleWidth.start();
+        rippleOpacity.start();
+        textOpacity.start();
     }
 
     /**
@@ -274,12 +275,11 @@
     private void animateDisappearance() {
         mIsHiding = true;
         CompositorAnimator disappearance =
-                CompositorAnimator.ofFloat(mOverlayPanel.getAnimationHandler(), 1.f, 0.f,
-                        OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS, null);
+                CompositorAnimator.ofFloat(mOverlayPanel.getAnimationHandler(), getPaddedHeightPx(),
+                        0.f, OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS, null);
         disappearance.addUpdateListener(animator -> {
             if (isVisible()) {
-                float percentage = animator.getAnimatedFraction();
-                mHeightPx = MathUtils.interpolate(getPaddedHeightPx(), 0.f, percentage);
+                mHeightPx = animator.getAnimatedValue();
             }
         });
         disappearance.addListener(new AnimatorListenerAdapter() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchImageControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchImageControl.java
index ea1d91e..ca728c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchImageControl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchImageControl.java
@@ -209,14 +209,13 @@
 
         if (mImageVisibilityAnimator != null) mImageVisibilityAnimator.cancel();
 
-        mImageVisibilityAnimator = new CompositorAnimator(mPanel.getAnimationHandler());
-        mImageVisibilityAnimator.setDuration(OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS);
+        mImageVisibilityAnimator = CompositorAnimator.ofFloat(mPanel.getAnimationHandler(),
+                mCustomImageVisibilityPercentage, visible ? 1.f : 0.f,
+                OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS, animator -> {
+                    if (mExpandedPercentage > 0.f) return;
+                    mCustomImageVisibilityPercentage = animator.getAnimatedValue();
+                });
         mImageVisibilityAnimator.setInterpolator(mCustomImageVisibilityInterpolator);
-        mImageVisibilityAnimator.setValues(mCustomImageVisibilityPercentage, visible ? 1.f : 0.f);
-        mImageVisibilityAnimator.addUpdateListener(animator -> {
-            if (mExpandedPercentage > 0.f) return;
-            mCustomImageVisibilityPercentage = animator.getAnimatedValue();
-        });
         mImageVisibilityAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
index 59b33d4..37b149f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -353,7 +353,7 @@
      * @return       Whether or not the {@link LayoutManager} needs more updates.
      */
     @VisibleForTesting
-    public boolean onUpdate(long timeMs, long dtMs) {
+    boolean onUpdate(long timeMs, long dtMs) {
         if (!mUpdateRequested) return false;
         mUpdateRequested = false;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
index 4d09f6e..02772c7e7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
@@ -95,7 +95,8 @@
     public static boolean isEnabled(@ExploreSitesVariation int variation) {
         return variation == ExploreSitesVariation.ENABLED
                 || variation == ExploreSitesVariation.PERSONALIZED
-                || variation == ExploreSitesVariation.CONDENSED;
+                || variation == ExploreSitesVariation.CONDENSED
+                || variation == ExploreSitesVariation.MOST_LIKELY;
     }
 
     public static boolean isExperimental(@ExploreSitesVariation int variation) {
@@ -106,6 +107,10 @@
         return variation == ExploreSitesVariation.CONDENSED;
     }
 
+    public static boolean isIntegratedWithMostLikely(@ExploreSitesVariation int variation) {
+        return variation == ExploreSitesVariation.MOST_LIKELY;
+    }
+
     /**
      * Increments the ntp_shown_count for a particular category.
      * @param categoryId the row id of the category to increment show count for.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
index 2c5acdf..25f0a8f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -187,7 +187,8 @@
         insertSiteSectionView();
 
         int variation = ExploreSitesBridge.getVariation();
-        if (ExploreSitesBridge.isEnabled(variation)) {
+        if (ExploreSitesBridge.isEnabled(variation)
+                && !ExploreSitesBridge.isIntegratedWithMostLikely(variation)) {
             mExploreSectionView = ((ViewStub) findViewById(R.id.explore_sites_stub)).inflate();
         } else if (ExploreSitesBridge.isExperimental(variation)) {
             ViewStub exploreStub = findViewById(R.id.explore_sites_stub);
@@ -232,7 +233,8 @@
         mSiteSectionViewHolder.bindDataSource(mTileGroup, tileRenderer);
 
         int variation = ExploreSitesBridge.getVariation();
-        if (ExploreSitesBridge.isEnabled(variation)) {
+        if (ExploreSitesBridge.isEnabled(variation)
+                && !ExploreSitesBridge.isIntegratedWithMostLikely(variation)) {
             mExploreSection = new ExploreSitesSection(mExploreSectionView, profile,
                     mManager.getNavigationDelegate(), SuggestionsConfig.getTileStyle(mUiConfig));
         } else if (ExploreSitesBridge.isExperimental(variation)) {
@@ -440,8 +442,10 @@
         mSiteSectionView = SiteSection.inflateSiteSection(this);
         ViewGroup.LayoutParams layoutParams = mSiteSectionView.getLayoutParams();
         layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
-        // If the explore sites section exists, then space it more closely.
-        if (ExploreSitesBridge.isEnabled(ExploreSitesBridge.getVariation())) {
+        // If the explore sites section exists as its own section, then space it more closely.
+        int variation = ExploreSitesBridge.getVariation();
+        if (ExploreSitesBridge.isEnabled(variation)
+                && !ExploreSitesBridge.isIntegratedWithMostLikely(variation)) {
             ((MarginLayoutParams) layoutParams).bottomMargin =
                     getResources().getDimensionPixelOffset(
                             R.dimen.tile_grid_layout_vertical_spacing);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SiteSection.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SiteSection.java
index 554fafd..bc5b66e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SiteSection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SiteSection.java
@@ -11,6 +11,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.cards.ItemViewType;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder;
@@ -107,7 +108,9 @@
     }
 
     private static int getMaxTileRows() {
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.EXPLORE_SITES)) {
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.EXPLORE_SITES)
+                && !ExploreSitesBridge.isIntegratedWithMostLikely(
+                        ExploreSitesBridge.getVariation())) {
             return 1;
         }
         return 2;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
index c7399b9..942c6a8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
@@ -75,8 +75,6 @@
         mTab = tab;
         mHandler = new Handler();
         mCloseContentsRunnable = () -> {
-            // TODO(jinsukkim): Move |closeTab| to TabModelSelector by making it observe its tabs.
-            TabModelSelector.from(mTab).closeTab(mTab);
             RewindableIterator<TabObserver> observers = mTab.getTabObservers();
             while (observers.hasNext()) observers.next().onCloseContents(mTab);
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java
rename to chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java
index 439a5bef..c8fc9cc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.ui.system;
+package org.chromium.chrome.browser.tabbed_mode;
 
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
@@ -37,7 +37,7 @@
  * Controls the bottom system navigation bar color for the provided {@link Window}.
  */
 @TargetApi(Build.VERSION_CODES.O_MR1)
-class NavigationBarColorController implements VrModeObserver {
+class TabbedNavigationBarColorController implements VrModeObserver {
     private final Window mWindow;
     private final ViewGroup mRootView;
     private final Resources mResources;
@@ -54,7 +54,7 @@
     private boolean mOverviewModeHiding;
 
     /**
-     * Creates a new {@link NavigationBarColorController} instance.
+     * Creates a new {@link TabbedNavigationBarColorController} instance.
      * @param window The {@link Window} this controller should operate on.
      * @param tabModelSelector The {@link TabModelSelector} used to determine which tab model is
      *                         selected.
@@ -62,7 +62,7 @@
      * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
      *         {@link OverviewModeBehavior} associated with the containing activity.
      */
-    NavigationBarColorController(Window window, TabModelSelector tabModelSelector,
+    TabbedNavigationBarColorController(Window window, TabModelSelector tabModelSelector,
             @Nullable ImmersiveModeManager immersiveModeManager,
             ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1;
@@ -119,7 +119,7 @@
     }
 
     /**
-     * Destroy this {@link NavigationBarColorController} instance.
+     * Destroy this {@link TabbedNavigationBarColorController} instance.
      */
     public void destroy() {
         if (mTabModelSelector != null) mTabModelSelector.removeObserver(mTabModelSelectorObserver);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
new file mode 100644
index 0000000..03b8ac17
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -0,0 +1,67 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tabbed_mode;
+
+import android.support.annotation.Nullable;
+
+import org.chromium.chrome.browser.AppHooks;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.appmenu.AppMenuHandler;
+import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
+import org.chromium.chrome.browser.ui.ImmersiveModeManager;
+import org.chromium.chrome.browser.ui.RootUiCoordinator;
+import org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewWrapper;
+import org.chromium.ui.base.DeviceFormFactor;
+
+/**
+ * A {@link RootUiCoordinator} variant that controls tabbed-mode specific UI.
+ */
+public class TabbedRootUiCoordinator extends RootUiCoordinator implements NativeInitObserver {
+    private @Nullable ImmersiveModeManager mImmersiveModeManager;
+    private TabbedSystemUiCoordinator mSystemUiCoordinator;
+    private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
+
+    public TabbedRootUiCoordinator(ChromeActivity activity) {
+        super(activity);
+    }
+
+    @Override
+    public void destroy() {
+        if (mImmersiveModeManager != null) mImmersiveModeManager.destroy();
+        if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
+        if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
+
+        super.destroy();
+    }
+
+    @Override
+    public void onPostInflationStartup() {
+        super.onPostInflationStartup();
+
+        mImmersiveModeManager = AppHooks.get().createImmersiveModeManager(
+                mActivity.getWindow().getDecorView().findViewById(android.R.id.content));
+        mSystemUiCoordinator = new TabbedSystemUiCoordinator(mActivity.getWindow(),
+                mActivity.getTabModelSelector(), mImmersiveModeManager,
+                mActivity.getOverviewModeBehaviorSupplier());
+
+        if (mImmersiveModeManager != null) {
+            mActivity.getToolbarManager().setImmersiveModeManager(mImmersiveModeManager);
+        }
+    }
+
+    @Override
+    public void onFinishNativeInitialization() {
+        // TODO(twellington): Supply TabModelSelector as well and move initialization earlier.
+        if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
+            AppMenuHandler appMenuHandler =
+                    mAppMenuCoordinator == null ? null : mAppMenuCoordinator.getAppMenuHandler();
+            mEmptyBackgroundViewWrapper = new EmptyBackgroundViewWrapper(
+                    mActivity.getTabModelSelector(), mActivity.getTabCreator(false), mActivity,
+                    appMenuHandler, mActivity.getSnackbarManager(),
+                    mActivity.getOverviewModeBehaviorSupplier());
+            mEmptyBackgroundViewWrapper.initialize();
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator.java
similarity index 60%
rename from chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java
rename to chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator.java
index 4677bf9..94aa2ce2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedSystemUiCoordinator.java
@@ -2,47 +2,42 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.ui.system;
+package org.chromium.chrome.browser.tabbed_mode;
 
 import android.os.Build;
 import android.support.annotation.Nullable;
 import android.view.Window;
 
-import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.ui.ImmersiveModeManager;
 import org.chromium.chrome.browser.util.ObservableSupplier;
 
 /**
- * A UI coordinator that manages the system status bar and bottom navigation bar.
+ * A UI coordinator that manages the system status bar and bottom navigation bar for
+ * ChromeTabbedActivity.
  *
- * TODO(https://crbug.com/943371): Move status bar code from Chrome*Activity into a new
- * StatusBarCoordinator.
+ * TODO(https://crbug.com/943371): Create a base SystemUiCoordinator to own the
+ *     StatusBarColorController, and have this class extend that one.
  */
-public class SystemUiCoordinator {
-    private @Nullable NavigationBarColorController mNavigationBarColorController;
+public class TabbedSystemUiCoordinator {
+    private @Nullable TabbedNavigationBarColorController mNavigationBarColorController;
 
     /**
-     * Construct a new {@link SystemUiCoordinator}.
+     * Construct a new {@link TabbedSystemUiCoordinator}.
      *
      * @param window The {@link Window} associated with the containing activity.
      * @param tabModelSelector The {@link TabModelSelector} for the containing activity.
      * @param immersiveModeManager The {@link ImmersiveModeManager} for the containing activity.
-     * @param activityType The {@link org.chromium.chrome.browser.ChromeActivity.ActivityType} of
-     *         the containing activity.
      * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
      *         {@link OverviewModeBehavior} associated with the containing activity.
      */
-    public SystemUiCoordinator(Window window, TabModelSelector tabModelSelector,
+    public TabbedSystemUiCoordinator(Window window, TabModelSelector tabModelSelector,
             @Nullable ImmersiveModeManager immersiveModeManager,
-            @ChromeActivity.ActivityType int activityType,
             @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
-        // TODO(https://crbug.com/931496): Move to a TabbedSystemUiCoordinator or delegate?
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
-                && activityType == ChromeActivity.ActivityType.TABBED) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
             assert overviewModeBehaviorSupplier != null;
-            mNavigationBarColorController = new NavigationBarColorController(
+            mNavigationBarColorController = new TabbedNavigationBarColorController(
                     window, tabModelSelector, immersiveModeManager, overviewModeBehaviorSupplier);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
index 3435a2a0..c64e944f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -198,6 +198,11 @@
             public void onActivityAttachmentChanged(Tab tab, boolean attached) {
                 if (!attached) getModel(tab.isIncognito()).removeTab(tab);
             }
+
+            @Override
+            public void onCloseContents(Tab tab) {
+                closeTab(tab);
+            }
         };
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
index a5f61f4..050bda7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -8,16 +8,10 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.appmenu.AppMenuCoordinator;
-import org.chromium.chrome.browser.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.lifecycle.InflationObserver;
-import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
-import org.chromium.chrome.browser.ui.system.SystemUiCoordinator;
-import org.chromium.chrome.browser.widget.emptybackground.EmptyBackgroundViewWrapper;
-import org.chromium.ui.base.DeviceFormFactor;
 
 /**
  * The root UI coordinator. This class will eventually be responsible for inflating and managing
@@ -26,13 +20,10 @@
  * The specific things this component will manage and how it will hook into Chrome*Activity are
  * still being discussed See https://crbug.com/931496.
  */
-public class RootUiCoordinator implements Destroyable, NativeInitObserver, InflationObserver,
-                                          ChromeActivity.MenuOrKeyboardActionHandler {
-    private ChromeActivity mActivity;
-    private @Nullable AppMenuCoordinator mAppMenuCoordinator;
-    private @Nullable ImmersiveModeManager mImmersiveModeManager;
-    private SystemUiCoordinator mSystemUiCoordinator;
-    private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
+public class RootUiCoordinator
+        implements Destroyable, InflationObserver, ChromeActivity.MenuOrKeyboardActionHandler {
+    protected ChromeActivity mActivity;
+    protected @Nullable AppMenuCoordinator mAppMenuCoordinator;
 
     /**
      * Create a new {@link RootUiCoordinator} for the given activity.
@@ -49,10 +40,7 @@
     public void destroy() {
         mActivity.unregisterMenuOrKeyboardActionHandler(this);
         mActivity = null;
-        if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
-        if (mImmersiveModeManager != null) mImmersiveModeManager.destroy();
         if (mAppMenuCoordinator != null) mAppMenuCoordinator.destroy();
-        if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
     }
 
     @Override
@@ -73,32 +61,6 @@
         } else if (mActivity.getToolbarManager() != null) {
             mActivity.getToolbarManager().getToolbar().disableMenuButton();
         }
-
-        mImmersiveModeManager = AppHooks.get().createImmersiveModeManager(
-                mActivity.getWindow().getDecorView().findViewById(android.R.id.content));
-        mSystemUiCoordinator = new SystemUiCoordinator(mActivity.getWindow(),
-                mActivity.getTabModelSelector(), mImmersiveModeManager, mActivity.getActivityType(),
-                mActivity.getOverviewModeBehaviorSupplier());
-
-        if (mImmersiveModeManager != null && mActivity.getToolbarManager() != null) {
-            mActivity.getToolbarManager().setImmersiveModeManager(mImmersiveModeManager);
-        }
-    }
-
-    @Override
-    public void onFinishNativeInitialization() {
-        // TODO(https://crbug.com/931496): Move to a TabbedRootUiCoordinator or delegate?
-        // TODO(twellington): Supply TabModelSelector as well and move initialization earlier.
-        if (mActivity.getActivityType() == ChromeActivity.ActivityType.TABBED
-                && DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
-            AppMenuHandler appMenuHandler =
-                    mAppMenuCoordinator == null ? null : mAppMenuCoordinator.getAppMenuHandler();
-            mEmptyBackgroundViewWrapper = new EmptyBackgroundViewWrapper(
-                    mActivity.getTabModelSelector(), mActivity.getTabCreator(false), mActivity,
-                    appMenuHandler, mActivity.getSnackbarManager(),
-                    mActivity.getOverviewModeBehaviorSupplier());
-            mEmptyBackgroundViewWrapper.initialize();
-        }
     }
 
     @Override
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 0d59c78..65c4c7d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">ሙሉ የMIDI መሣሪያዎች መቆጣጠርን ያስችላል</translation>
 <translation id="1449080968331948513">ውሂብ ቆጣቢ አሁን በቀላል ሁነታ ላይ ነው ያለው</translation>
 <translation id="145097072038377568">በAndroid ቅንብሮች ውስጥ ጠፍቷል።</translation>
-<translation id="146329143005354472">ወደ የእኔ መተግበሪያዎች አክል</translation>
 <translation id="1477626028522505441">በአገልጋይ ችግሮች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ተጨማሪ)}one{ (+ # ተጨማሪ)}other{ (+ # ተጨማሪ)}}</translation>
 <translation id="1501480321619201731">ቡድን ሰርዝ</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">የእኔን ውሂብ ለብቻው አቆይ</translation>
 <translation id="8068648041423924542">የዕውቅና ማረጋገጫን መምረጥ አልተቻለም።</translation>
 <translation id="8073388330009372546">ምስሉን በአዲስ ትር ውስጥ ክፈት</translation>
+<translation id="8076492880354921740">ትሮች</translation>
 <translation id="8084114998886531721">የተቀመጠ ይለፍ ቃል</translation>
 <translation id="8087000398470557479">ይህ ይዘት ከ<ph name="DOMAIN_NAME" /> የመጣ ነው፣ የተላከው በGoogle ነው።</translation>
 <translation id="8103578431304235997">ማንነት የማያሳውቅ ትር</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 90bc20a..56e861e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">‏السماح بالتحكم الكامل لأجهزة MIDI</translation>
 <translation id="1449080968331948513">يُشار إلى ميزة "توفير البيانات" الآن باسم "الوضع البسيط"</translation>
 <translation id="145097072038377568">‏تم إيقافه في إعدادات Android.</translation>
-<translation id="146329143005354472">إضافة إلى "تطبيقاتي"</translation>
 <translation id="1477626028522505441">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب مشاكل بالخادم.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (أكثر من عنصر واحد آخر)}zero{ (أكثر من # عناصر أخرى)}two{ (أكثر من عنصرين (#) آخرين)}few{ (أكثر من # عناصر أخرى)}many{ (أكثر من # عنصرًا آخر)}other{ (أكثر من # عنصر آخر)}}</translation>
 <translation id="1501480321619201731">حذف مجموعة</translation>
@@ -96,7 +95,7 @@
 <translation id="1671236975893690980">التنزيل معلّق...</translation>
 <translation id="1672586136351118594">عدم العرض مرة أخرى</translation>
 <translation id="1692118695553449118">المزامنة ممكنة</translation>
-<translation id="169515064810179024">يمكنك حظر مواقع الويب من الوصول إلى مستشعرات الحركة.</translation>
+<translation id="169515064810179024">حظر مواقع الويب من الوصول إلى مستشعرات الحركة</translation>
 <translation id="1717218214683051432">مستشعرات الحركة</translation>
 <translation id="1718835860248848330">آخر ساعة</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - تم تحديثه منذ <ph name="TIME_SINCE_UPDATE" /> دقائق</translation>
@@ -174,7 +173,7 @@
 <translation id="2154484045852737596">تعديل البطاقة</translation>
 <translation id="2154710561487035718">‏نسخ عنوان URL</translation>
 <translation id="2156074688469523661">المواقع المتبقية (<ph name="NUMBER_OF_SITES" />)</translation>
-<translation id="218608176142494674">مشاركة</translation>
+<translation id="218608176142494674">المشاركة</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />، تطبيق ويب. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">المتابعة باسم <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">‏خدمات Google والمزامنة</translation>
@@ -195,7 +194,7 @@
 <translation id="2359808026110333948">متابعة</translation>
 <translation id="2369533728426058518">علامات التبويب المفتوحة</translation>
 <translation id="2387895666653383613">تغيير حجم النص</translation>
-<translation id="2394602618534698961">تظهر الملفات التي تنزلها هنا</translation>
+<translation id="2394602618534698961">تظهر الملفات التي نزَّلتها هنا.</translation>
 <translation id="2402980924095424747"><ph name="MEGABYTES" /> ميغابايت</translation>
 <translation id="2410754283952462441">اختيار حساب</translation>
 <translation id="2414886740292270097">داكن</translation>
@@ -207,7 +206,7 @@
 <translation id="2450083983707403292">هل ترغب في بدء تنزيل <ph name="FILE_NAME" /> مرة أخرى؟</translation>
 <translation id="2476578072172137802">إعدادات الموقع</translation>
 <translation id="2482878487686419369">الإشعارات</translation>
-<translation id="2490684707762498678">تتم إدارتها بواسطة <ph name="APP_NAME" /></translation>
+<translation id="2490684707762498678">تتم إدارتها من خلال <ph name="APP_NAME" /></translation>
 <translation id="2494974097748878569">‏"مساعد Google" على Chrome</translation>
 <translation id="2496180316473517155">سجلّ التصفّح</translation>
 <translation id="2498359688066513246">المساعدة والتعليقات</translation>
@@ -248,7 +247,7 @@
 <translation id="2777555524387840389">عدد الثواني المتبقية: <ph name="SECONDS" /></translation>
 <translation id="2779651927720337254">تعذَّر التنزيل</translation>
 <translation id="2781151931089541271">يتبقى ثانية واحدة</translation>
-<translation id="2801022321632964776">‏يمكنك التحديث للحصول على لغتك في أحدث إصدار من Chrome.</translation>
+<translation id="2801022321632964776">‏يمكنك إجراء التحديث للحصول على لغتك في أحدث إصدار من Chrome.</translation>
 <translation id="2810645512293415242">صفحة مبسَّطة لحفظ البيانات والاستمتاع بتحميل أسرع.</translation>
 <translation id="281504910091592009">‏بإمكانك عرض كلمات المرور المحفوظة وإدارتها في <ph name="BEGIN_LINK" />حسابك على Google<ph name="END_LINK" />.</translation>
 <translation id="2818669890320396765">للحصول على الإشارات المرجعية على جميع أجهزتك، يُرجى تسجيل الدخول وتفعيل المزامنة.</translation>
@@ -621,7 +620,7 @@
 <translation id="5581519193887989363">يمكنك دائمًا اختيار ما تريد مزامنته في <ph name="BEGIN_LINK1" />الإعدادات<ph name="END_LINK1" />.</translation>
 <translation id="5595485650161345191">تعديل العنوان</translation>
 <translation id="5596627076506792578">خيارات إضافية</translation>
-<translation id="5599455543593328020">وضع التصفُّح المتخفي</translation>
+<translation id="5599455543593328020">وضع "التصفّح المتخفي"</translation>
 <translation id="5620928963363755975">العثور على الملفات والصفحات في التنزيلات من الزر "مزيد من الخيارات"</translation>
 <translation id="5626134646977739690">الاسم:</translation>
 <translation id="5639724618331995626">السماح بجميع المواقع</translation>
@@ -846,7 +845,7 @@
 <translation id="7189598951263744875">مشاركة...</translation>
 <translation id="7191430249889272776">تم فتح علامة التبويب في الخلفية.</translation>
 <translation id="723171743924126238">تحديد الصور</translation>
-<translation id="7233236755231902816">‏للاطِّلاع على الويب بلغتك، يمكنك الحصول على أحدث إصدار من Chrome.</translation>
+<translation id="7233236755231902816">‏للاطّلاع على الويب بلغتك، يمكنك الحصول على أحدث إصدار من Chrome.</translation>
 <translation id="7243308994586599757">الخيارات المتاحة بالقرب من الجزء السفلي من الشاشة</translation>
 <translation id="7250468141469952378">تم اختيار <ph name="ITEM_COUNT" /> عنصراً</translation>
 <translation id="7253272406652746122">‏أضف حساب Google من صفحة "الحسابات" في تطبيق إعدادات جهازك.</translation>
@@ -901,7 +900,7 @@
 <translation id="756809126120519699">‏بيانات Chrome التي تم محوها</translation>
 <translation id="757524316907819857">منع مواقع الويب من تشغيل المحتوى المحمي</translation>
 <translation id="757855969265046257">{FILES,plural, =1{تم تنزيل ملف <ph name="FILES_DOWNLOADED_ONE" />}zero{تم تنزيل <ph name="FILES_DOWNLOADED_MANY" /> ملفات}two{تم تنزيل ملفين (<ph name="FILES_DOWNLOADED_MANY" />)}few{تم تنزيل <ph name="FILES_DOWNLOADED_MANY" /> ملفات}many{تم تنزيل <ph name="FILES_DOWNLOADED_MANY" /> ملفًا}other{تم تنزيل <ph name="FILES_DOWNLOADED_MANY" /> ملف}}</translation>
-<translation id="7588219262685291874">تفعيل المظهر الداكن عند تفعيل توفير شحن البطارية للجهاز</translation>
+<translation id="7588219262685291874">تفعيل "المظهر الداكن" عند تفعيل ميزة "توفير شحن البطارية" للجهاز</translation>
 <translation id="7589445247086920869">حظر محرّك البحث الحالي</translation>
 <translation id="7593557518625677601">‏فتح إعدادات Android وإعادة تفعيل مزامنة نظام Android لبدء مزامنة Chrome</translation>
 <translation id="7596558890252710462">نظام التشغيل</translation>
@@ -917,7 +916,7 @@
 <translation id="7649070708921625228">مساعدة</translation>
 <translation id="7658239707568436148">إلغاء</translation>
 <translation id="7665369617277396874">إضافة حساب</translation>
-<translation id="766587987807204883">تظهر هنا المقالات التي يمكنك الاطِّلاع عليها حتى عندما تكون بلا اتصال بالإنترنت</translation>
+<translation id="766587987807204883">تظهر المقالات هنا، ويمكنك الاطّلاع عليها حتى عندما لا يكون الجهاز متّصلًا بالإنترنت.</translation>
 <translation id="7682724950699840886">يمكنك تجربة النصائح التالية: تأكد من توفر مساحة كافية على جهازك وحاول التصدير مرة أخرى.</translation>
 <translation id="7698359219371678927">إنشاء بريد إلكتروني في <ph name="APP_NAME" /></translation>
 <translation id="7704317875155739195">‏الإكمال التلقائي لعناوين URL وعمليات البحث</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">الحفاظ على البيانات التابعة لي منفصلة</translation>
 <translation id="8068648041423924542">يتعذر تحديد الشهادة.</translation>
 <translation id="8073388330009372546">فتح الصورة بعلامة تبويب جديدة</translation>
+<translation id="8076492880354921740">علامات التبويب</translation>
 <translation id="8084114998886531721">كلمة مرور محفوظة</translation>
 <translation id="8087000398470557479">‏هذا المحتوى من <ph name="DOMAIN_NAME" />، وتم عرضه من قبل Google.</translation>
 <translation id="8103578431304235997">علامة تبويب للتصفح المتخفي</translation>
@@ -1003,7 +1003,7 @@
 <translation id="8310344678080805313">علامات التبويب القياسية</translation>
 <translation id="8313455859591948645">تعديل صفحة بدء التشغيل</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> ومواقع أخرى</translation>
-<translation id="8327155640814342956">‏للحصول على أفضل تجربة للتصفُّح، يُرجى الفتح لتحديث Chrome.</translation>
+<translation id="8327155640814342956">‏للحصول على أفضل تجربة للتصفّح، يُرجى الفتح لتحديث Chrome.</translation>
 <translation id="8339163506404995330">لن تتم ترجمة الصفحات باللغة <ph name="LANGUAGE" /></translation>
 <translation id="8349013245300336738">الترتيب حسب مقدار البيانات المُستخدَمة</translation>
 <translation id="8372893542064058268">السماح لموقع ويب معيّن بتشغيل "المزامنة في الخلفية"</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 3c7a740..d41a03a0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Разр. на пълния контрол над MIDI</translation>
 <translation id="1449080968331948513">„Икономия на данни“ вече е „олекотен режим“</translation>
 <translation id="145097072038377568">Изключено от настройките на Android</translation>
-<translation id="146329143005354472">Добавяне към „Моите приложения“</translation>
 <translation id="1477626028522505441">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради проблеми в сървъра.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ още 1)}other{ (+ още #)}}</translation>
 <translation id="1501480321619201731">Изтриване на групата</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Оставяне на данните отделно</translation>
 <translation id="8068648041423924542">Сертификатът не може да бъде избран.</translation>
 <translation id="8073388330009372546">Отваряне в нов раздел</translation>
+<translation id="8076492880354921740">Раздели</translation>
 <translation id="8084114998886531721">Запазена парола</translation>
 <translation id="8087000398470557479">Това съдържание се показва от Google, а източникът му е <ph name="DOMAIN_NAME" />.</translation>
 <translation id="8103578431304235997">Раздел в режим „инкогнито“</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
index b892011..0de8e388 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI ডিভাইসগুলির পূর্ণ নিয়ন্ত্রণের অনুমতি দিন</translation>
 <translation id="1449080968331948513">ডেটা সেভার এখন লাইট মোড হয়ে গেছে</translation>
 <translation id="145097072038377568">Android সেটিংসে বন্ধ করা অাছে</translation>
-<translation id="146329143005354472">আমার অ্যাপে যোগ করুন</translation>
 <translation id="1477626028522505441">সার্ভার সমস্যার কারণে <ph name="FILE_NAME" /> ডাউনলোড করা যায়নি।</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ আরও ১টি)}one{ (+ আরও #টি)}other{ (+ আরও #টি)}}</translation>
 <translation id="1501480321619201731">আইটেমের গ্রুপ মুছুন</translation>
@@ -975,6 +974,7 @@
 <translation id="806745655614357130">আমার ডেটা আলাদা রাখুন</translation>
 <translation id="8068648041423924542">সার্টিফিকেট বেছে নিতে পারেনি।</translation>
 <translation id="8073388330009372546">নতুন ট্যাবে ইমেজ খুলুন</translation>
+<translation id="8076492880354921740">ট্যাবগুলি</translation>
 <translation id="8084114998886531721">সংরক্ষিত পাসওয়ার্ড</translation>
 <translation id="8087000398470557479">এই কন্টেন্ট Google দ্বারা বিতরণ করা <ph name="DOMAIN_NAME" /> থেকে এসেছে।</translation>
 <translation id="8103578431304235997">ছদ্মবেশী ট্যাব</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 2f98bef..b168caf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Permet control total disp. MIDI</translation>
 <translation id="1449080968331948513">Ara l'extensió Economitzador de dades funciona en mode bàsic</translation>
 <translation id="145097072038377568">Aquest permís està desactivat a la configuració d'Android</translation>
-<translation id="146329143005354472">Afegeix a Les meves aplicacions</translation>
 <translation id="1477626028522505441">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa de problemes amb el servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (i 1 més)}other{ (i # més)}}</translation>
 <translation id="1501480321619201731">Suprimeix el grup</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Mantén les meves dades separades</translation>
 <translation id="8068648041423924542">No es pot seleccionar el certificat.</translation>
 <translation id="8073388330009372546">Obre en una pestanya nova</translation>
+<translation id="8076492880354921740">Pestanyes</translation>
 <translation id="8084114998886531721">Contrasenya desada</translation>
 <translation id="8087000398470557479">Aquest contingut és del domini <ph name="DOMAIN_NAME" />, oferit per Google.</translation>
 <translation id="8103578431304235997">Pestanya d'incògnit</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 43dcb41..28ca8d1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Povolit úplné ovládání zařízení MIDI</translation>
 <translation id="1449080968331948513">Spořič dat je teď ve zjednodušeném režimu</translation>
 <translation id="145097072038377568">Vypnuto v Nastavení pro Android</translation>
-<translation id="146329143005354472">Přidat do seznamu Moje aplikace</translation>
 <translation id="1477626028522505441">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu problémů se serverem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 další)}few{ (+ # další)}many{ (+ # dalších)}other{ (+ # dalších)}}</translation>
 <translation id="1501480321619201731">Smazat skupinu</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Uchovat má data samostatně.</translation>
 <translation id="8068648041423924542">Certifikát nelze vybrat.</translation>
 <translation id="8073388330009372546">Otevřít na nové kartě</translation>
+<translation id="8076492880354921740">Karty</translation>
 <translation id="8084114998886531721">Uložené heslo</translation>
 <translation id="8087000398470557479">Tento obsah pochází z domény <ph name="DOMAIN_NAME" />. Poskytováno společností Google.</translation>
 <translation id="8103578431304235997">Anonymní karta</translation>
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 953dfdc..69a75ab 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Tillad fuld kontrol over MIDI-enheder</translation>
 <translation id="1449080968331948513">Datasparefunktionen er nu i Lite-tilstand</translation>
 <translation id="145097072038377568">Deaktiveret i indstillingerne for Android</translation>
-<translation id="146329143005354472">Føj til Mine apps</translation>
 <translation id="1477626028522505441">Download af <ph name="FILE_NAME" /> mislykkedes på grund af serverproblemer.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 anden)}one{ (+ # anden)}other{ (+ # andre)}}</translation>
 <translation id="1501480321619201731">Slet gruppe</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Hold mine data adskilt</translation>
 <translation id="8068648041423924542">Certifikatet kunne ikke vælges.</translation>
 <translation id="8073388330009372546">Åbn billede på ny fane</translation>
+<translation id="8076492880354921740">Faner</translation>
 <translation id="8084114998886531721">Gemt adgangskode</translation>
 <translation id="8087000398470557479">Dette indhold er fra <ph name="DOMAIN_NAME" />, som leveres af Google.</translation>
 <translation id="8103578431304235997">Inkognitofane</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index 31f6ff8..34321034 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Volle Kontr. über MIDI-Ger. erl.</translation>
 <translation id="1449080968331948513">Der Datensparmodus ist jetzt im Lite-Modus</translation>
 <translation id="145097072038377568">In den Android-Einstellungen deaktiviert</translation>
-<translation id="146329143005354472">Zu "Meine Apps" hinzufügen</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> konnte aufgrund von Serverproblemen nicht heruntergeladen werden.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 weitere)}other{ (+ # weitere)}}</translation>
 <translation id="1501480321619201731">Gruppe löschen</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Daten getrennt halten</translation>
 <translation id="8068648041423924542">Zertifikat kann nicht ausgewählt werden.</translation>
 <translation id="8073388330009372546">Bild in neuem Tab öffnen</translation>
+<translation id="8076492880354921740">Tabs</translation>
 <translation id="8084114998886531721">Gespeichertes Passwort</translation>
 <translation id="8087000398470557479">Dieser Inhalt ist von <ph name="DOMAIN_NAME" /> und wurde von Google bereitgestellt.</translation>
 <translation id="8103578431304235997">Inkognito-Tab</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 060cfd55..ed31378 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Να επιτρέπεται πλήρης έλεγχος σε MIDI</translation>
 <translation id="1449080968331948513">Η Εξοικονόμηση δεδομένων βρίσκεται πλέον σε λειτουργία Lite</translation>
 <translation id="145097072038377568">Έχει απενεργοποιηθεί στις Ρυθμίσεις Android</translation>
-<translation id="146329143005354472">Προσθήκη στη λίστα Οι εφαρμογές μου</translation>
 <translation id="1477626028522505441">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω προβλημάτων στον διακομιστή.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ακόμη)}other{ (+ # ακόμη)}}</translation>
 <translation id="1501480321619201731">Διαγραφή ομάδας</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Διατήρηση των δεδομένων μου ξεχωριστά</translation>
 <translation id="8068648041423924542">Δεν είναι δυνατή η επιλογή του πιστοποιητικού.</translation>
 <translation id="8073388330009372546">Άνοιγμα εικόνας σε νέα καρτέλα</translation>
+<translation id="8076492880354921740">Καρτέλες</translation>
 <translation id="8084114998886531721">Αποθηκευμένος κωδικός πρόσβασης</translation>
 <translation id="8087000398470557479">Αυτό το περιεχόμενο προέρχεται από το <ph name="DOMAIN_NAME" /> και παρέχεται από την Google.</translation>
 <translation id="8103578431304235997">Καρτέλα ανώνυμης περιήγησης</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 a361c82f..bcc1e96 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
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Allow full control of MIDI devices</translation>
 <translation id="1449080968331948513">Data Saver is now Lite mode</translation>
 <translation id="145097072038377568">Turned off in Android Settings</translation>
-<translation id="146329143005354472">Add to My apps</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> download failed due to server issues.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 more)}other{ (+ # more)}}</translation>
 <translation id="1501480321619201731">Delete group</translation>
@@ -831,6 +830,7 @@
 <translation id="7062545763355031412">Accept and switch accounts</translation>
 <translation id="7063006564040364415">Could not connect to the sync server.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 selected}other{# selected}}</translation>
+<translation id="7071521146534760487">Manage account</translation>
 <translation id="7077143737582773186">SD Card</translation>
 <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> selected. Options available near top of the screen</translation>
 <translation id="7121362699166175603">Clears history and auto-completions in the address bar. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -973,6 +973,7 @@
 <translation id="806745655614357130">Keep my data separate</translation>
 <translation id="8068648041423924542">Unable to select certificate.</translation>
 <translation id="8073388330009372546">Open image in new tab</translation>
+<translation id="8076492880354921740">Tabs</translation>
 <translation id="8084114998886531721">Saved password</translation>
 <translation id="8087000398470557479">This content is from <ph name="DOMAIN_NAME" />, delivered by Google.</translation>
 <translation id="8103578431304235997">Incognito Tab</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 4d30434..7573c8f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Control de dispositivos MIDI</translation>
 <translation id="1449080968331948513">El "Ahorro de datos" está en modo lite</translation>
 <translation id="145097072038377568">Desactivado en la configuración de Android</translation>
-<translation id="146329143005354472">Agregar a Mis apps</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> no se pudo descargar debido a problemas del servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (1 más)}other{ (# más)}}</translation>
 <translation id="1501480321619201731">Borrar grupo</translation>
@@ -861,8 +860,8 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Comparte 1 elemento seleccionado}other{Comparte # elementos seleccionados}}</translation>
 <translation id="7359002509206457351">Acceder a formas de pago</translation>
 <translation id="7365126855094612066">Durante esta sesión, el sitio podrá hacer lo siguiente:
-• Crear un mapa 3D de tu entorno.
-• Hacer un seguimiento del movimiento de la cámara.
+• Crear un mapa 3D de tu entorno
+• Hacer un seguimiento del movimiento de la cámara
 
 El sitio NO podrá acceder a la cámara. Solo tú podrás ver las imágenes de la cámara.</translation>
 <translation id="7375125077091615385">Tipo:</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Mantener mis datos separados</translation>
 <translation id="8068648041423924542">No es posible seleccionar un certificado</translation>
 <translation id="8073388330009372546">Abrir imagen en pestaña nueva</translation>
+<translation id="8076492880354921740">Pestañas</translation>
 <translation id="8084114998886531721">Se guardó la contraseña</translation>
 <translation id="8087000398470557479">Este contenido es de <ph name="DOMAIN_NAME" />, publicado por Google.</translation>
 <translation id="8103578431304235997">Pestaña de incógnito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 5d5ccae..b3459cbf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Control total dispositivos MIDI</translation>
 <translation id="1449080968331948513">Ahorro de Datos ahora se llama modo básico</translation>
 <translation id="145097072038377568">Ajustes de Android desactivados</translation>
-<translation id="146329143005354472">Añadir a Mis aplicaciones</translation>
 <translation id="1477626028522505441">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas con el servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (y 1 más)}other{ (y # más)}}</translation>
 <translation id="1501480321619201731">Eliminar grupo</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Mantener mis datos separados</translation>
 <translation id="8068648041423924542">No se puede seleccionar el certificado.</translation>
 <translation id="8073388330009372546">Abrir en pestaña nueva</translation>
+<translation id="8076492880354921740">Pestañas</translation>
 <translation id="8084114998886531721">Contraseña guardada</translation>
 <translation id="8087000398470557479">Este contenido procede de <ph name="DOMAIN_NAME" />, publicado por Google.</translation>
 <translation id="8103578431304235997">Pestaña de incógnito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
index e5c1faca..b0030f0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI-seadm. täieliku juht. lub.</translation>
 <translation id="1449080968331948513">Andmemahu säästja uus nimetus on lihtsustatud režiim</translation>
 <translation id="145097072038377568">Android-seadetes välja lülitatud</translation>
-<translation id="146329143005354472">Lisa jaotisesse Minu rakendused</translation>
 <translation id="1477626028522505441">Faili <ph name="FILE_NAME" /> allalaadimine ebaõnnestus serveriprobleemide tõttu.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(ja veel 1)}other{(ja veel #)}}</translation>
 <translation id="1501480321619201731">Kustuta grupp</translation>
@@ -831,6 +830,7 @@
 <translation id="7062545763355031412">Nõustu ja vaheta kontosid</translation>
 <translation id="7063006564040364415">Sünkroonimisserveriga ei saanud ühendust.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 on valitud}other{# on valitud}}</translation>
+<translation id="7071521146534760487">Konto haldamine</translation>
 <translation id="7077143737582773186">SD-kaart</translation>
 <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> on valitud.  Valikud on saadaval ekraanikuva ülaosas</translation>
 <translation id="7121362699166175603">Kustutab aadressiribalt ajaloo ja automaatse täitmise andmed. Aadressil <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> võib teie Google'i kontol olla muus vormis sirvimisajalugu.</translation>
@@ -973,6 +973,7 @@
 <translation id="806745655614357130">Hoia minu andmed eraldi</translation>
 <translation id="8068648041423924542">Sertifikaati ei saa valida.</translation>
 <translation id="8073388330009372546">Ava pilt uuel vahelehel</translation>
+<translation id="8076492880354921740">Vahelehed</translation>
 <translation id="8084114998886531721">Salvestatud parool</translation>
 <translation id="8087000398470557479">See sisu pärineb domeenilt <ph name="DOMAIN_NAME" /> ja seda pakub Google.</translation>
 <translation id="8103578431304235997">Inkognito vaheleht</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index c843512..c9ec2797 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">‏اجازه کنترل کامل دستگاه‌های MIDI</translation>
 <translation id="1449080968331948513">اکنون نام «صرفه‌جویی داده» به «حالت ساده» تغییر کرده است</translation>
 <translation id="145097072038377568">‏در تنظیمات Android مسدود شد</translation>
-<translation id="146329143005354472">افزودن به برنامه‌های من</translation>
 <translation id="1477626028522505441">به‌دلیل مشکلاتی در سرور، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ۱ مورد دیگر)}one{ (+ # مورد دیگر)}other{ (+ # مورد دیگر)}}</translation>
 <translation id="1501480321619201731">حذف گروه</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">داده‌های من مجزا باشد</translation>
 <translation id="8068648041423924542">انتخاب گواهی ممکن نیست.</translation>
 <translation id="8073388330009372546">باز کردن تصویر در برگه جدید</translation>
+<translation id="8076492880354921740">برگه‌ها</translation>
 <translation id="8084114998886531721">گذرواژه ذخیره‌شده</translation>
 <translation id="8087000398470557479">‏این محتوا از <ph name="DOMAIN_NAME" /> است و توسط Google ارائه می‌شود.</translation>
 <translation id="8103578431304235997">برگه ناشناس</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index a44a489..1566498 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Salli MIDI-laitteiden täysi käyttöoik.</translation>
 <translation id="1449080968331948513">Data Saver on nyt Yksinkertaistettu tila</translation>
 <translation id="145097072038377568">Poistettu käytöstä Android-asetuksissa</translation>
-<translation id="146329143005354472">Lisää Omiin sovelluksiin</translation>
 <translation id="1477626028522505441">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui palvelinongelman vuoksi.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 muu)}other{ (+ # muuta)}}</translation>
 <translation id="1501480321619201731">Poista ryhmä</translation>
@@ -342,7 +341,7 @@
 <translation id="3527085408025491307">Kansio</translation>
 <translation id="3542235761944717775"><ph name="KILOBYTES" /> kt käytettävissä</translation>
 <translation id="3549657413697417275">Haku omasta historiasta</translation>
-<translation id="3552151358455404883">Hallinnoi Chromen synkronointia ja räätälöintiä <ph name="BEGIN_LINK1" />asetuksissa<ph name="END_LINK1" />.</translation>
+<translation id="3552151358455404883">Hallinnoi Chromen synkronointia ja personointia <ph name="BEGIN_LINK1" />asetuksissa<ph name="END_LINK1" />.</translation>
 <translation id="3557336313807607643">Lisää yhteystietoihin</translation>
 <translation id="3566923219790363270">Chrome valmistelee edelleen VR-selainta. Käynnistä Chrome myöhemmin uudelleen.</translation>
 <translation id="3568688522516854065">Kirjaudu sisään ja ota synkronointi käyttöön, niin voit käyttää välilehtiä muilta laitteiltasi</translation>
@@ -612,7 +611,7 @@
 <translation id="5527111080432883924">Pyydä lupaa, kun sivustot yrittävät lukea tekstiä ja kuvia leikepöydältä (suositus)</translation>
 <translation id="5530766185686772672">Sulje incognito-välilehdet</translation>
 <translation id="5534640966246046842">Sivusto kopioitu</translation>
-<translation id="5537099431952529648">Sinä ja vanhempasi voitte hallinnoida Chromen synkronointia ja räätälöintiä <ph name="BEGIN_LINK1" />asetuksissa<ph name="END_LINK1" />.</translation>
+<translation id="5537099431952529648">Sinä ja vanhempasi voitte hallinnoida Chromen synkronointia ja personointia <ph name="BEGIN_LINK1" />asetuksissa<ph name="END_LINK1" />.</translation>
 <translation id="5556459405103347317">Lataa uudelleen</translation>
 <translation id="5561549206367097665">Odotetaan verkkoyhteyttä…</translation>
 <translation id="557283862590186398">Chrome tarvitsee oikeuden käyttää mikrofoniasi tällä sivustolla.</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Pidä tiedot erillään</translation>
 <translation id="8068648041423924542">Varmenteen valinta epäonnistui</translation>
 <translation id="8073388330009372546">Avaa kuva uudessa välilehdessä</translation>
+<translation id="8076492880354921740">Välilehdet</translation>
 <translation id="8084114998886531721">Salasana tallennettu</translation>
 <translation id="8087000398470557479">Google on toimittanut tämän sisällön osoitteesta <ph name="DOMAIN_NAME" />.</translation>
 <translation id="8103578431304235997">Incognito-välilehti</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 0161d80..92b34a3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Payagan ganap na kontrol sa MIDI device</translation>
 <translation id="1449080968331948513">Ang Data Saver ay tinatawag na ngayong Lite mode</translation>
 <translation id="145097072038377568">Naka-off sa Mga Setting ng Android</translation>
-<translation id="146329143005354472">Idagdag sa Aking mga app</translation>
 <translation id="1477626028522505441">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa mga isyu sa server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 pa)}one{ (+ # pa)}other{ (+ # pa)}}</translation>
 <translation id="1501480321619201731">I-delete ang pangkat</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Panatilihing hiwalay ang aking data</translation>
 <translation id="8068648041423924542">Hindi makapili ng certificate.</translation>
 <translation id="8073388330009372546">Buksan ang larawan sa bagong tab</translation>
+<translation id="8076492880354921740">Mga Tab</translation>
 <translation id="8084114998886531721">Naka-save na password</translation>
 <translation id="8087000398470557479">Ang content na ito ay mula sa <ph name="DOMAIN_NAME" />, na ipinadala ng Google.</translation>
 <translation id="8103578431304235997">Tab na Incognito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index 3b9e1338..3709abc6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Autoriser le contrôle complet des appareils MIDI</translation>
 <translation id="1449080968331948513">L'économiseur de données est passé en mode simplifié</translation>
 <translation id="145097072038377568">Désactivée dans les paramètres Android</translation>
-<translation id="146329143005354472">Ajouter à mes applications</translation>
 <translation id="1477626028522505441">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison de problèmes liés au serveur.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 autre)}one{ (+ # autre)}other{ (+ # autres)}}</translation>
 <translation id="1501480321619201731">Supprimer le groupe</translation>
@@ -543,7 +542,7 @@
 <translation id="5016205925109358554">Serif</translation>
 <translation id="5039804452771397117">Autoriser</translation>
 <translation id="5040262127954254034">Confidentialité</translation>
-<translation id="5048398596102334565">Autoriser les sites à accéder à vos capteurs (recommandé)</translation>
+<translation id="5048398596102334565">Autoriser les sites à accéder à vos capteurs de mouvement (recommandé)</translation>
 <translation id="5063480226653192405">Utilisation</translation>
 <translation id="5073204694187207510">Masquer la grille en plein écran</translation>
 <translation id="5082793167783849073">Comparez rapidement des pages en créant un groupe. Commencez par appuyer de manière prolongée sur un lien.</translation>
@@ -648,7 +647,7 @@
 <translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation>
 <translation id="5804241973901381774">Autorisations</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}</translation>
-<translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. All rights reserved.</translation>
+<translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation>
 <translation id="5817918615728894473">Associer</translation>
 <translation id="583281660410589416">Inconnu</translation>
 <translation id="5833984609253377421">Partager le lien</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Conserver mes données à part</translation>
 <translation id="8068648041423924542">Impossible de sélectionner le certificat</translation>
 <translation id="8073388330009372546">Ouvrir image dans autre onglet</translation>
+<translation id="8076492880354921740">Onglets</translation>
 <translation id="8084114998886531721">Mot de passe enregistré</translation>
 <translation id="8087000398470557479">Ce contenu est issu de <ph name="DOMAIN_NAME" />. Il est diffusé par Google.</translation>
 <translation id="8103578431304235997">Onglet de navigation privée</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
index 6978250d..f48d672 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI ઉપકરણોના પૂર્ણ નિયંત્રણની મંજૂરી આપો</translation>
 <translation id="1449080968331948513">ડેટા સેવર હવે લાઇટ મોડ છે</translation>
 <translation id="145097072038377568">Android સેટિંગ્સમાં બંધ કરી</translation>
-<translation id="146329143005354472">મારી ઍપમાં ઉમેરો</translation>
 <translation id="1477626028522505441">સર્વર સમસ્યાઓને કારણે <ph name="FILE_NAME" /> ડાઉનલોડ નિષ્ફળ થયું.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 વધુ)}one{ (+ # વધુ)}other{ (+ # વધુ)}}</translation>
 <translation id="1501480321619201731">જૂથ ડિલીટ કરો</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">મારા ડેટાને અલગ રાખો</translation>
 <translation id="8068648041423924542">પ્રમાણપત્ર પસંદ કરવામાં અસમર્થ.</translation>
 <translation id="8073388330009372546">નવા ટેબમાં છબી ખોલો</translation>
+<translation id="8076492880354921740">ટૅબ્સ</translation>
 <translation id="8084114998886531721">સાચવેલ પાસવર્ડ</translation>
 <translation id="8087000398470557479">આ કન્ટેન્ટ <ph name="DOMAIN_NAME" /> માંથી, Google દ્વારા વિતરિત કરેલ છે.</translation>
 <translation id="8103578431304235997">છૂપું ટૅબ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index c641250..9d8a9aa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI डिवाइस के पूरे नियंत्रण की अनुमति दें</translation>
 <translation id="1449080968331948513">डेटा बचाने का टूल अब लाइट मोड है</translation>
 <translation id="145097072038377568">Android सेटिंग में बंद कर दिया गया है</translation>
-<translation id="146329143005354472">मेरे ऐप्लिकेशन में जोड़ें</translation>
 <translation id="1477626028522505441">सर्वर संबधी समस्‍याओं के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 और)}one{ (+ # और)}other{ (+ # और)}}</translation>
 <translation id="1501480321619201731">समूह मिटाएं</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">मेरा डेटा अलग रखें</translation>
 <translation id="8068648041423924542">प्रमाणपत्र चुनने में असमर्थ.</translation>
 <translation id="8073388330009372546">इमेज 'नए टैब' में खोलें</translation>
+<translation id="8076492880354921740">टैब</translation>
 <translation id="8084114998886531721">सहेजा गया पासवर्ड</translation>
 <translation id="8087000398470557479">यह सामग्री <ph name="DOMAIN_NAME" /> की है जिसे Google के द्वारा वितरित किया गया है.</translation>
 <translation id="8103578431304235997">गुप्त टैब</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index c0f8e078..fb4ae9d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Omogući potpuni nadzor za MIDI</translation>
 <translation id="1449080968331948513">Ušteda podataka sada je u Jednostavnom načinu</translation>
 <translation id="145097072038377568">Isključeno u postavkama Androida</translation>
-<translation id="146329143005354472">Dodaj u Moje aplikacije</translation>
 <translation id="1477626028522505441">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog poteškoća s poslužiteljem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ još 1)}one{ (+ još #)}few{ (+ još #)}other{ (+ još #)}}</translation>
 <translation id="1501480321619201731">Izbriši grupu</translation>
@@ -974,6 +973,7 @@
 <translation id="806745655614357130">Moje podatke čuvaj zasebno</translation>
 <translation id="8068648041423924542">Ne može se odabrati certifikat.</translation>
 <translation id="8073388330009372546">Otvori sliku u novoj kartici</translation>
+<translation id="8076492880354921740">Kartice</translation>
 <translation id="8084114998886531721">Spremljena zaporka</translation>
 <translation id="8087000398470557479">Sadržaj potječe s domene <ph name="DOMAIN_NAME" />, a omogućuje ga Google.</translation>
 <translation id="8103578431304235997">Anonimna kartica</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 370d4d9c..5c8bd7ad 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI-eszközök teljes vezérlése</translation>
 <translation id="1449080968331948513">Az Adatforgalom-csökkentő neve mostantól Egyszerűsített mód</translation>
 <translation id="145097072038377568">Kikapcsolva az Android beállításaiban</translation>
-<translation id="146329143005354472">Hozzáadás a saját alkalmazásokhoz</translation>
 <translation id="1477626028522505441">A következő fájl letöltése szerverproblémák miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 további)}other{ (+ # további)}}</translation>
 <translation id="1501480321619201731">Csoport törlése</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Maradjanak elkülönítve az adataim</translation>
 <translation id="8068648041423924542">A tanúsítvány kiválasztása nem sikerült.</translation>
 <translation id="8073388330009372546">Kép megnyitása új lapon</translation>
+<translation id="8076492880354921740">Lapok</translation>
 <translation id="8084114998886531721">Mentett jelszó</translation>
 <translation id="8087000398470557479">Ez a Google által megjelenített tartalom a(z) <ph name="DOMAIN_NAME" /> domainről származik.</translation>
 <translation id="8103578431304235997">Inkognitólap</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 0a48355..3e8ed0ef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Izinkan kontrol penuh perangkat MIDI</translation>
 <translation id="1449080968331948513">Penghemat Data sekarang menjadi Mode ringan</translation>
 <translation id="145097072038377568">Dinonaktifkan di Setelan Android</translation>
-<translation id="146329143005354472">Tambahkan ke Aplikasi saya</translation>
 <translation id="1477626028522505441">Download <ph name="FILE_NAME" /> gagal karena masalah server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 lainnya)}other{ (+ # lainnya)}}</translation>
 <translation id="1501480321619201731">Hapus grup</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Tetap pisahkan data saya</translation>
 <translation id="8068648041423924542">Tidak dapat memilih sertifikat.</translation>
 <translation id="8073388330009372546">Buka gambar di tab baru</translation>
+<translation id="8076492880354921740">Tab</translation>
 <translation id="8084114998886531721">Sandi tersimpan</translation>
 <translation id="8087000398470557479">Konten ini dari <ph name="DOMAIN_NAME" />, dikirimkan oleh Google.</translation>
 <translation id="8103578431304235997">Tab Penyamaran</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index b3eb2457..893aa47 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Controllo completo dispos. MIDI</translation>
 <translation id="1449080968331948513">La funzionalità Risparmio dati si chiama ora modalità Lite</translation>
 <translation id="145097072038377568">Disattivata in Impostazioni Android</translation>
-<translation id="146329143005354472">Aggiungi a Le mie app</translation>
 <translation id="1477626028522505441">Download di <ph name="FILE_NAME" /> non riuscito a causa di problemi del server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 altro)}other{ (+ altri #)}}</translation>
 <translation id="1501480321619201731">Elimina gruppo</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Mantieni separati i miei dati</translation>
 <translation id="8068648041423924542">Impossibile selezionare il certificato.</translation>
 <translation id="8073388330009372546">Immagine in nuova scheda</translation>
+<translation id="8076492880354921740">Schede</translation>
 <translation id="8084114998886531721">Password salvata</translation>
 <translation id="8087000398470557479">Questi contenuti derivano da <ph name="DOMAIN_NAME" /> e sono offerti da Google.</translation>
 <translation id="8103578431304235997">Scheda di navigazione in incognito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index d3a9058d..a93dd6e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">‏התר שליטה מלאה על מכשירי MIDI</translation>
 <translation id="1449080968331948513">‏Data Saver נקרא עכשיו 'מצב טעינה מהירה'</translation>
 <translation id="145097072038377568">‏כבוי בהגדרות Android</translation>
-<translation id="146329143005354472">הוספה לאפליקציות שלי</translation>
 <translation id="1477626028522505441">הורדת <ph name="FILE_NAME" /> נכשלה עקב בעיות בשרת.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (ועוד 1)}two{ (ועוד #)}many{ (ועוד #)}other{ (ועוד #)}}</translation>
 <translation id="1501480321619201731">מחיקת קבוצה</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">שמור בנפרד את הנתונים שלי</translation>
 <translation id="8068648041423924542">אין אפשרות לבחור אישור.</translation>
 <translation id="8073388330009372546">פתיחת התמונה בכרטיסייה חדשה</translation>
+<translation id="8076492880354921740">כרטיסיות</translation>
 <translation id="8084114998886531721">סיסמה שמורה</translation>
 <translation id="8087000398470557479">‏התוכן הזה הוא מ-<ph name="DOMAIN_NAME" />, ומוגש על-ידי Google.</translation>
 <translation id="8103578431304235997">כרטיסיית גלישה בסתר</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 1fc0d169..088befbe 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI機器のフルコントロールを許可</translation>
 <translation id="1449080968331948513">データセーバーは現在ライトモードです</translation>
 <translation id="145097072038377568">Android の設定で無効</translation>
-<translation id="146329143005354472">マイアプリに追加</translation>
 <translation id="1477626028522505441">サーバーで問題が発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(他 1 件)}other{(他 # 件)}}</translation>
 <translation id="1501480321619201731">グループを削除</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">データを別に保持する</translation>
 <translation id="8068648041423924542">証明書を選択できません</translation>
 <translation id="8073388330009372546">新しいタブで画像を開く</translation>
+<translation id="8076492880354921740">タブ</translation>
 <translation id="8084114998886531721">保存したパスワード</translation>
 <translation id="8087000398470557479"><ph name="DOMAIN_NAME" /> のコンテンツを Google から配信しています。</translation>
 <translation id="8103578431304235997">シークレット タブ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
index bd31e11..0d35f28e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI ಸಾಧನಗಳ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಅನುಮತಿಸಿ</translation>
 <translation id="1449080968331948513">ಡೇಟಾ ಸೇವರ್ ಈಗ ಲೈಟ್ ಮೋಡ್‌ನಲ್ಲಿದೆ</translation>
 <translation id="145097072038377568">Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="146329143005354472">ನನ್ನ ಆ್ಯಪ್‌ಗಳಿಗೆ ಸೇರಿಸಿ</translation>
 <translation id="1477626028522505441">ಸರ್ವರ್ ಸಮಸ್ಯೆಗಳ ಕಾರಣದಿಂದಾಗಿ <ph name="FILE_NAME" /> ಡೌನ್‌ಲೋಡ್ ವಿಫಲವಾಗಿದೆ.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ಹೆಚ್ಚು)}one{ (+ # ಹೆಚ್ಚು)}other{ (+ # ಹೆಚ್ಚು)}}</translation>
 <translation id="1501480321619201731">ಗುಂಪನ್ನು ಅಳಿಸಿ</translation>
@@ -974,6 +973,7 @@
 <translation id="806745655614357130">ನನ್ನ ಡೇಟಾ ಪ್ರತ್ಯೇಕವಾಗಿ ಇರಿಸಿಕೊಳ್ಳಿ</translation>
 <translation id="8068648041423924542">ಪ್ರಮಾಣಪತ್ರವನ್ನು ಆಯ್ಕೆಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
 <translation id="8073388330009372546">ಚಿತ್ರವನ್ನು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ  ತೆರೆಯಿರಿ</translation>
+<translation id="8076492880354921740">ಟ್ಯಾಬ್‌ಗಳು</translation>
 <translation id="8084114998886531721">ಉಳಿಸಿರುವ ಪಾಸ್‌ವರ್ಡ್</translation>
 <translation id="8087000398470557479"><ph name="DOMAIN_NAME" /> ಡೊಮೇನ್‌‌ನ ಈ ವಿಷಯವನ್ನು Google ನಿಂದ ವಿತರಿಸಲಾಗಿದೆ.</translation>
 <translation id="8103578431304235997">ಅದೃಶ್ಯ ಟ್ಯಾಬ್‌</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index 2ea53a3..6c72805d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI 기기의 전체 제어 허용</translation>
 <translation id="1449080968331948513">데이터 절약 모드가 이제 라이트 모드로 변경되었습니다.</translation>
 <translation id="145097072038377568">Android 설정에서 사용이 중지됨</translation>
-<translation id="146329143005354472">내 앱에 추가</translation>
 <translation id="1477626028522505441">서버 문제로 인해 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (1개 더보기)}other{ (#개 더보기)}}</translation>
 <translation id="1501480321619201731">그룹 삭제</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">내 데이터 별도로 유지</translation>
 <translation id="8068648041423924542">인증서를 선택할 수 없습니다.</translation>
 <translation id="8073388330009372546">새 탭에서 이미지 열기</translation>
+<translation id="8076492880354921740">탭</translation>
 <translation id="8084114998886531721">저장된 비밀번호</translation>
 <translation id="8087000398470557479">이 콘텐츠의 출처는 Google에서 제공하는 <ph name="DOMAIN_NAME" />입니다.</translation>
 <translation id="8103578431304235997">시크릿 탭</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index ff26122f..05d012c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Leisti visiškai valdyti MIDI įr.</translation>
 <translation id="1449080968331948513">Duomenų taupymo priemonė dabar veikia supaprastintu režimu</translation>
 <translation id="145097072038377568">Išjungta „Android“ nustatymuose</translation>
-<translation id="146329143005354472">Pridėti prie skilties „Mano programos“</translation>
 <translation id="1477626028522505441">Nepavyko atsisiųsti „<ph name="FILE_NAME" />“ dėl serverio problemų.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (ir dar 1)}one{ (ir dar #)}few{ (ir dar #)}many{ (ir dar #)}other{ (ir dar #)}}</translation>
 <translation id="1501480321619201731">Ištrinti grupę</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Duomenis laikyti atskirai</translation>
 <translation id="8068648041423924542">Nepavyko pasirinkti sertifikato.</translation>
 <translation id="8073388330009372546">Atid. vaizdą nauj. skirt. lap.</translation>
+<translation id="8076492880354921740">Skirtukai</translation>
 <translation id="8084114998886531721">Išsaugotas slaptažodis</translation>
 <translation id="8087000398470557479">Šis turinys yra iš domeno <ph name="DOMAIN_NAME" />, kurį teikia „Google“.</translation>
 <translation id="8103578431304235997">Inkognito skirtukas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 54da100..3a555e9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Pilnīga MIDI ierīču pārvaldība</translation>
 <translation id="1449080968331948513">Datu lietojuma samazinātājs tagad tiek saukts par vienkāršoto režīmu</translation>
 <translation id="145097072038377568">Izslēgts Android iestatījumos</translation>
-<translation id="146329143005354472">Pievienot sadaļai Manas lietotnes</translation>
 <translation id="1477626028522505441">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās servera problēmas.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (un vēl 1)}zero{ (un vēl #)}one{ (un vēl #)}other{ (un vēl #)}}</translation>
 <translation id="1501480321619201731">Dzēst grupu</translation>
@@ -831,6 +830,7 @@
 <translation id="7062545763355031412">Piekrist un pārslēgt kontus</translation>
 <translation id="7063006564040364415">Nevarēja izveidot savienojumu ar sinhronizācijas serveri.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Atlasīts 1 vienums}zero{Atlasīti # vienumi}one{Atlasīts # vienums}other{Atlasīti # vienumi}}</translation>
+<translation id="7071521146534760487">Pārvaldīt kontu</translation>
 <translation id="7077143737582773186">SD karte</translation>
 <translation id="7087918508125750058">Atlasīti vienumi: <ph name="ITEM_COUNT" />. Opcijas ir pieejamas ekrāna augšdaļā.</translation>
 <translation id="7121362699166175603">Notīra vēsturi un automātiskās pabeigšanas datus adreses joslā. Jūsu Google kontam var būt cita veida pārlūkošanas vēstures dati vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -973,6 +973,7 @@
 <translation id="806745655614357130">Glabāt datus atsevišķi</translation>
 <translation id="8068648041423924542">Nevar atlasīt sertifikātu.</translation>
 <translation id="8073388330009372546">Atvērt attēlu jaunā cilnē</translation>
+<translation id="8076492880354921740">Cilnes</translation>
 <translation id="8084114998886531721">Saglabātā parole</translation>
 <translation id="8087000398470557479">Šis saturs ir no vietnes <ph name="DOMAIN_NAME" />, ko nodrošina Google.</translation>
 <translation id="8103578431304235997">Inkognito cilne</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
index d8c05017..d91f4e9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണം അനുവദിക്കുക</translation>
 <translation id="1449080968331948513">ഡാറ്റ സേവർ ഇപ്പോൾ ലൈറ്റ് മോഡ് ആണ്</translation>
 <translation id="145097072038377568">Android ക്രമീകരണത്തിൽ ഓഫാക്കിയിരിക്കുന്നു</translation>
-<translation id="146329143005354472">എൻ്റെ ആപ്പുകളിലേക്ക് ചേർക്കുക</translation>
 <translation id="1477626028522505441">സെർവർ പ്രശ്‌നങ്ങൾ കാരണം <ph name="FILE_NAME" /> ഡൗൺലോഡ് ചെയ്യാനായില്ല.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ഒരെണ്ണം കൂടി)}other{ (+ # എണ്ണം കൂടി)}}</translation>
 <translation id="1501480321619201731">ഗ്രൂപ്പ് ഇല്ലാതാക്കൂ</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">എന്റെ വിവരങ്ങൾ പ്രത്യേകം വേർതിരിച്ച് സൂക്ഷിക്കുക</translation>
 <translation id="8068648041423924542">സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കാനാവുന്നില്ല.</translation>
 <translation id="8073388330009372546">ചിത്രം പുതിയ ടാബിൽ തുറക്കുക</translation>
+<translation id="8076492880354921740">ടാബുകള്‍‌</translation>
 <translation id="8084114998886531721">സംരക്ഷിച്ച പാസ്‌വേഡ്</translation>
 <translation id="8087000398470557479">ഈ ഉള്ളടക്കം Google-ൽ നിന്നുള്ള <ph name="DOMAIN_NAME" /> ഡൊമെയ്‌നിൽ നിന്നുള്ളതാണ്.</translation>
 <translation id="8103578431304235997">അദൃശ്യ ടാബ്</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
index 02529f9b7..366ee91 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI डिव्हाइसेसच्या पूर्ण नियंत्रणास अनुमती द्या</translation>
 <translation id="1449080968331948513">डेटा सेव्हर आता लाइट मोडमध्ये आहे</translation>
 <translation id="145097072038377568">Android सेटिंग्ज मध्‍ये बंद करा</translation>
-<translation id="146329143005354472">माझी अ‍ॅप्स मध्ये जोडा</translation>
 <translation id="1477626028522505441">सर्व्हर समस्यांमुळे <ph name="FILE_NAME" /> डाउनलोड अयशस्वी झाले.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ आणखी १)}other{ (+ आणखी #)}}</translation>
 <translation id="1501480321619201731">गट हटवा</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">माझा डेटा स्वतंत्र ठेवा</translation>
 <translation id="8068648041423924542">सर्टिफिकेट निवडण्यास अक्षम.</translation>
 <translation id="8073388330009372546">नवीन टॅबमध्ये इमेज उघडा</translation>
+<translation id="8076492880354921740">टॅब</translation>
 <translation id="8084114998886531721">सेव्ह केलेले पासवर्ड</translation>
 <translation id="8087000398470557479">Google ने वितरित केलेली ही आशय, <ph name="DOMAIN_NAME" /> मधील आहे.</translation>
 <translation id="8103578431304235997">गुप्त टॅब</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
index ab25782..beafe8c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Benarkan kawalan penuh peranti MIDI</translation>
 <translation id="1449080968331948513">Penjimat Data kini tersedia dalam Mod Ringkas</translation>
 <translation id="145097072038377568">Dimatikan dalam Tetapan Android</translation>
-<translation id="146329143005354472">Tambahkan pada Apl saya</translation>
 <translation id="1477626028522505441">Muat turun <ph name="FILE_NAME" /> gagal disebabkan oleh masalah pelayan.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(+1 lagi)}other{(+ # lagi)}}</translation>
 <translation id="1501480321619201731">Padamkan kumpulan</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Biarkan data saya diasingkan</translation>
 <translation id="8068648041423924542">Tidak dapat memilih sijil.</translation>
 <translation id="8073388330009372546">Buka imej dalam tab baharu</translation>
+<translation id="8076492880354921740">Tab</translation>
 <translation id="8084114998886531721">Kata laluan disimpan</translation>
 <translation id="8087000398470557479">Kandungan ini adalah daripada <ph name="DOMAIN_NAME" />, disampaikan oleh Google.</translation>
 <translation id="8103578431304235997">Tab Inkognito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 5197402..e72d49b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Volledig beheer van MIDI-apparaten toestaan</translation>
 <translation id="1449080968331948513">De Lite-versie van Databesparing is ingeschakeld</translation>
 <translation id="145097072038377568">Uitgeschakeld in Android-instellingen</translation>
-<translation id="146329143005354472">Toevoegen aan 'Mijn apps'</translation>
 <translation id="1477626028522505441">Downloaden van <ph name="FILE_NAME" /> is mislukt door serverproblemen.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (en nog 1)}other{ (en nog #)}}</translation>
 <translation id="1501480321619201731">Groep verwijderen</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Mijn gegevens gescheiden houden</translation>
 <translation id="8068648041423924542">Kan certificaat niet selecteren.</translation>
 <translation id="8073388330009372546">Openen op nieuw tabblad</translation>
+<translation id="8076492880354921740">Tabbladen</translation>
 <translation id="8084114998886531721">Opgeslagen wachtwoord</translation>
 <translation id="8087000398470557479">Deze content is afkomstig van <ph name="DOMAIN_NAME" />, geleverd door Google.</translation>
 <translation id="8103578431304235997">Incognitotabblad</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 49cefe5..5f536221 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Full kontroll over MIDI-enheter</translation>
 <translation id="1449080968331948513">Datasparing heter nå «forenklet modus»</translation>
 <translation id="145097072038377568">Slått av i Android-innstillingene</translation>
-<translation id="146329143005354472">Legg til i Mine apper</translation>
 <translation id="1477626028522505441">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av tjenerproblemer.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 til)}other{ (+ # til)}}</translation>
 <translation id="1501480321619201731">Slett gruppen</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Hold dataene mine adskilt</translation>
 <translation id="8068648041423924542">Kan ikke velge sertifikat.</translation>
 <translation id="8073388330009372546">Åpne bildet i en ny fane</translation>
+<translation id="8076492880354921740">Faner</translation>
 <translation id="8084114998886531721">Lagret passord</translation>
 <translation id="8087000398470557479">Dette innholdet er fra <ph name="DOMAIN_NAME" /> og er levert av Google.</translation>
 <translation id="8103578431304235997">Inkognitofane</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 005429b1..80e5972 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Pełne sterowanie urządzeniami MIDI</translation>
 <translation id="1449080968331948513">Oszczędzanie danych to teraz wersja uproszczona</translation>
 <translation id="145097072038377568">Wyłączone w ustawieniach Androida</translation>
-<translation id="146329143005354472">Dodaj do Moich aplikacji</translation>
 <translation id="1477626028522505441">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu problemów z serwerem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (i jeszcze 1)}few{ (i jeszcze #)}many{ (i jeszcze #)}other{ (i jeszcze #)}}</translation>
 <translation id="1501480321619201731">Usuń grupę</translation>
@@ -831,6 +830,7 @@
 <translation id="7062545763355031412">Zaakceptuj i przełącz konta</translation>
 <translation id="7063006564040364415">Nie udało się nawiązać połączenia z serwerem synchronizacji.</translation>
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{Wybrano 1}few{Wybrano #}many{Wybrano #}other{Wybrano #}}</translation>
+<translation id="7071521146534760487">Zarządzaj kontem</translation>
 <translation id="7077143737582773186">Karta SD</translation>
 <translation id="7087918508125750058">Wybrano <ph name="ITEM_COUNT" />. Opcje dostępne na górze ekranu</translation>
 <translation id="7121362699166175603">Usuwa historię i pamięć autouzupełniania na pasku adresu. Inne rodzaje historii przeglądania mogą być nadal dostępne na Twoim koncie Google na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -973,6 +973,7 @@
 <translation id="806745655614357130">Przechowuj dane oddzielnie</translation>
 <translation id="8068648041423924542">Nie można wybrać certyfikatu.</translation>
 <translation id="8073388330009372546">Otwórz grafikę w nowej karcie</translation>
+<translation id="8076492880354921740">Karty</translation>
 <translation id="8084114998886531721">Zapisane hasło</translation>
 <translation id="8087000398470557479">Treść z <ph name="DOMAIN_NAME" /> dostarczana przez Google.</translation>
 <translation id="8103578431304235997">Karta incognito</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 e5ee088..69ff6713 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
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Permitir controle total de dispositivos MIDI</translation>
 <translation id="1449080968331948513">A Economia de dados está no Modo Lite agora</translation>
 <translation id="145097072038377568">Desativada nas configurações do Android</translation>
-<translation id="146329143005354472">Adicionar a "Meus apps"</translation>
 <translation id="1477626028522505441">Falha no download do arquivo <ph name="FILE_NAME" /> devido a problemas de servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (e mais 1)}one{ (e mais #)}other{ (e mais #)}}</translation>
 <translation id="1501480321619201731">Excluir grupo</translation>
@@ -974,6 +973,7 @@
 <translation id="806745655614357130">Manter meus dados separados</translation>
 <translation id="8068648041423924542">Não foi possível selecionar certificado.</translation>
 <translation id="8073388330009372546">Abrir imagem em nova guia</translation>
+<translation id="8076492880354921740">Guias</translation>
 <translation id="8084114998886531721">Senha salva</translation>
 <translation id="8087000398470557479">Este conteúdo é de <ph name="DOMAIN_NAME" />, veiculado pelo Google.</translation>
 <translation id="8103578431304235997">Guia anônima</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index c959e88..10f0df4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Perm. controlo total dispo. MIDI</translation>
 <translation id="1449080968331948513">A Poupança de dados é agora o Modo Lite</translation>
 <translation id="145097072038377568">Desativada nas Definições do Android</translation>
-<translation id="146329143005354472">Adicionar a As minhas aplicações</translation>
 <translation id="1477626028522505441">A transferência de <ph name="FILE_NAME" /> falhou devido a problemas do servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (e mais 1)}other{ (e mais #)}}</translation>
 <translation id="1501480321619201731">Eliminar grupo</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Manter os meus dados separados</translation>
 <translation id="8068648041423924542">Não é possível selecionar o certificado.</translation>
 <translation id="8073388330009372546">Abrir imagem num novo separad.</translation>
+<translation id="8076492880354921740">Separadores</translation>
 <translation id="8084114998886531721">Palavra-passe guardada</translation>
 <translation id="8087000398470557479">Este conteúdo é proveniente de <ph name="DOMAIN_NAME" />, fornecido pela Google.</translation>
 <translation id="8103578431304235997">Separador de navegação anónima</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index f2014eb..e6310fc 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Control complet dispozitive MIDI</translation>
 <translation id="1449080968331948513">Economizorul de date este acum Modul Lite</translation>
 <translation id="145097072038377568">Dezactivată din Setări Android</translation>
-<translation id="146329143005354472">Adaugă în Aplicațiile mele</translation>
 <translation id="1477626028522505441">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit din cauza unor probleme de server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (și încă unul)}few{ (și încă #)}other{ (și încă #)}}</translation>
 <translation id="1501480321619201731">Șterge grupul</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Păstrează datele separat</translation>
 <translation id="8068648041423924542">Certificatul nu poate fi selectat.</translation>
 <translation id="8073388330009372546">Vezi imaginea în filă nouă</translation>
+<translation id="8076492880354921740">File</translation>
 <translation id="8084114998886531721">Parola a fost salvată</translation>
 <translation id="8087000398470557479">Acest conținut provine de pe <ph name="DOMAIN_NAME" />, oferit de Google.</translation>
 <translation id="8103578431304235997">Filă incognito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index eb946f67..6eca04c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Полный доступ к управлению MIDI-устройствами</translation>
 <translation id="1449080968331948513">Функция "Экономия трафика" теперь называется "Упрощенный режим".</translation>
 <translation id="145097072038377568">Отключено в настройках Android</translation>
-<translation id="146329143005354472">Добавить в "Мои приложения"</translation>
 <translation id="1477626028522505441">Не удалось скачать файл <ph name="FILE_NAME" /> из-за неполадок на сервере.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (и ещё 1)}one{ (и ещё #)}few{ (и ещё #)}many{ (и ещё #)}other{ (и ещё #)}}</translation>
 <translation id="1501480321619201731">Удалить группу</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Не объединять данные</translation>
 <translation id="8068648041423924542">Невозможно выбрать сертификат.</translation>
 <translation id="8073388330009372546">Открыть в новой вкладке</translation>
+<translation id="8076492880354921740">Вкладки</translation>
 <translation id="8084114998886531721">Сохраненный пароль</translation>
 <translation id="8087000398470557479">Контент с сайта <ph name="DOMAIN_NAME" />. Получен с помощью Google.</translation>
 <translation id="8103578431304235997">Вкладка инкогнито</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 8261fe6..f407b0b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Povoliť úplné ovlád. zar. MIDI</translation>
 <translation id="1449080968331948513">Šetrič dát je teraz zjednodušený režim</translation>
 <translation id="145097072038377568">Vypnuté v nastaveniach Androidu</translation>
-<translation id="146329143005354472">Pridať do Mojich aplikácií</translation>
 <translation id="1477626028522505441">Súbor <ph name="FILE_NAME" /> sa nepodarilo stiahnuť z dôvodu problémov so serverom.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ďalšia)}few{ (+ # ďalšie)}many{ (+ # more)}other{ (+ # ďalších)}}</translation>
 <translation id="1501480321619201731">Odstrániť skupinu</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Ponechať moje dáta oddelené</translation>
 <translation id="8068648041423924542">Nedá sa vybrať certifikát</translation>
 <translation id="8073388330009372546">Otvoriť obrázok na novej karte</translation>
+<translation id="8076492880354921740">Karty</translation>
 <translation id="8084114998886531721">Uložené heslo</translation>
 <translation id="8087000398470557479">Tento obsah pochádza z domény <ph name="DOMAIN_NAME" /> a bol doručený Googlom.</translation>
 <translation id="8103578431304235997">Karta inkognito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index d35baf8..10ee380 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Dovolitev popolnega nadzora nad napravami MIDI</translation>
 <translation id="1449080968331948513">Funkcija »Varčevanje s podatki« se zdaj imenuje »Lahki način«.</translation>
 <translation id="145097072038377568">Izklopljeno v nastavitvah za Android</translation>
-<translation id="146329143005354472">Dodaj v Moje aplikacije</translation>
 <translation id="1477626028522505441">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi težav s strežnikom.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (in še 1)}one{ (in še #)}two{ (in še #)}few{ (in še #)}other{ (in še #)}}</translation>
 <translation id="1501480321619201731">Izbriši skupino</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Podatki naj bodo ločeni</translation>
 <translation id="8068648041423924542">Izbira potrdila ni mogoča</translation>
 <translation id="8073388330009372546">Odpri sliko na novem zavihku</translation>
+<translation id="8076492880354921740">Zavihki</translation>
 <translation id="8084114998886531721">Shranjeno geslo</translation>
 <translation id="8087000398470557479">Ta vsebina je iz domene <ph name="DOMAIN_NAME" /> in jo prikazuje Google.</translation>
 <translation id="8103578431304235997">Zavihek brez beleženja zgodovine</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index 0015598d..0c617bf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Пуна контрола над MIDI уређајима</translation>
 <translation id="1449080968331948513">Уштеда података је сада Lite режим</translation>
 <translation id="145097072038377568">Искључено је у Android подешавањима</translation>
-<translation id="146329143005354472">Додај у Моје апликације</translation>
 <translation id="1477626028522505441">Преузимање датотеке <ph name="FILE_NAME" /> није успело због проблема на серверу.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (и још 1)}one{ (и још #)}few{ (и још #)}other{ (и још #)}}</translation>
 <translation id="1501480321619201731">Избриши групу</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Не обједињуј моје податке</translation>
 <translation id="8068648041423924542">Није могуће изабрати сертификат.</translation>
 <translation id="8073388330009372546">Отвори слику на новој картици</translation>
+<translation id="8076492880354921740">Картице</translation>
 <translation id="8084114998886531721">Сачувана лозинка</translation>
 <translation id="8087000398470557479">Овај садржај је са <ph name="DOMAIN_NAME" />, приказује Google.</translation>
 <translation id="8103578431304235997">Картице без архивирања</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 1a75a85..09315694 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Tillåt fullst. kontroll av MIDI</translation>
 <translation id="1449080968331948513">Databesparing heter nu Begränsat läge</translation>
 <translation id="145097072038377568">Inaktiverad i Android-inställningarna</translation>
-<translation id="146329143005354472">Lägg till i Mina appar</translation>
 <translation id="1477626028522505441">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av serverfel.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 till)}other{ (+ # till)}}</translation>
 <translation id="1501480321619201731">Ta bort grupp</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Håll min data separat</translation>
 <translation id="8068648041423924542">Det går inte att välja certifikat.</translation>
 <translation id="8073388330009372546">Öppna bild i ny flik</translation>
+<translation id="8076492880354921740">Flikar</translation>
 <translation id="8084114998886531721">Sparat lösenord</translation>
 <translation id="8087000398470557479">Innehållet kommer från <ph name="DOMAIN_NAME" /> via Google.</translation>
 <translation id="8103578431304235997">Inkognitoflik</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 04ae0c7..59940ae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Ruhusu udhibiti kamili wa vifaa vya MIDI</translation>
 <translation id="1449080968331948513">Sasa hali ya 'Kiokoa Data' inaitwa 'Hali Nyepesi'</translation>
 <translation id="145097072038377568">Imezimwa katika Mipangilio ya Android</translation>
-<translation id="146329143005354472">Ongeza kwenye 'Programu zangu'</translation>
 <translation id="1477626028522505441">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya matatizo ya seva.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 zaidi)}other{ (+ # zaidi)}}</translation>
 <translation id="1501480321619201731">Futa kikundi</translation>
@@ -972,6 +971,7 @@
 <translation id="806745655614357130">Weka data yangu katika sehemu tofauti</translation>
 <translation id="8068648041423924542">Imeshindwa kuchagua cheti.</translation>
 <translation id="8073388330009372546">Fungua picha katika kichupo kipya</translation>
+<translation id="8076492880354921740">Vichupo</translation>
 <translation id="8084114998886531721">Nenosiri lililohifadhiwa</translation>
 <translation id="8087000398470557479">Maudhui haya yanatoka <ph name="DOMAIN_NAME" />, yamewasilishwa na Google.</translation>
 <translation id="8103578431304235997">Kichupo Fiche</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index 027d6888..95b95be 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -70,7 +70,6 @@
 <translation id="1446450296470737166">MIDI சாதனங்களுக்கு முழுக் கட்டுப்பாட்டை அனுமதி</translation>
 <translation id="1449080968331948513">‘தரவு சேமிப்பான்’ இப்போது ’லைட் பயன்முறை’ எனப் பெயர்மாற்றப்பட்டுள்ளது</translation>
 <translation id="145097072038377568">Android அமைப்புகளில் முடக்கப்பட்டுள்ளது.</translation>
-<translation id="146329143005354472">எனது ஆப்ஸில் சேர்</translation>
 <translation id="1477626028522505441">சேவையகச் சிக்கல்களால் <ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ மேலும் 1)}other{ (+ மேலும் #)}}</translation>
 <translation id="1501480321619201731">குழுவை நீக்கு</translation>
@@ -960,6 +959,7 @@
 <translation id="806745655614357130">எனது தரவைத் தனியாக வை</translation>
 <translation id="8068648041423924542">சான்றிதழைத் தேர்ந்தெடுக்க முடியவில்லை.</translation>
 <translation id="8073388330009372546">படத்தை புதிய தாவலில் திற</translation>
+<translation id="8076492880354921740">தாவல்கள்</translation>
 <translation id="8084114998886531721">சேமித்த கடவுச்சொல்</translation>
 <translation id="8087000398470557479">இந்த உள்ளடக்கம் <ph name="DOMAIN_NAME" /> (Google ஆல் வழங்கப்படுவது) இலிருந்து கிடைக்கிறது.</translation>
 <translation id="8103578431304235997">மறைநிலைத் தாவல்</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index 108ca13a..85385ff1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI పరికరాల పూర్తి నియం. అనుమ.</translation>
 <translation id="1449080968331948513">డేటా సేవర్ ఇప్పుడు లైట్ మోడ్‌లో ఉంది</translation>
 <translation id="145097072038377568">Android సెట్టింగ్‌ల్లో ఆఫ్ చేయబడింది</translation>
-<translation id="146329143005354472">నా యాప్‌లకు జోడించు</translation>
 <translation id="1477626028522505441">సర్వర్ సమస్యల కారణంగా <ph name="FILE_NAME" /> డౌన్‌లోడ్ విఫలమైంది.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ మరో 1)}other{ (+ మరో #)}}</translation>
 <translation id="1501480321619201731">సమూహాన్ని తొలగించు</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">నా డేటాను విడిగా ఉంచండి</translation>
 <translation id="8068648041423924542">ప్రమాణపత్రం ఎంపిక చేయడం సాధ్యపడలేదు.</translation>
 <translation id="8073388330009372546">కొత్త ట్యాబ్‌లో చిత్రం తెరువు</translation>
+<translation id="8076492880354921740">ట్యాబ్‌లు</translation>
 <translation id="8084114998886531721">సేవ్ చేసిన పాస్‌వర్డ్</translation>
 <translation id="8087000398470557479">ఈ కంటెంట్ Google ద్వారా డెలివర్ చేయబడిన <ph name="DOMAIN_NAME" />లోనిది.</translation>
 <translation id="8103578431304235997">అజ్ఞాత ట్యాబ్</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 9de1a3b..f07933d0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">ควบคุมอุปกรณ์ MIDI ได้สมบูรณ์</translation>
 <translation id="1449080968331948513">โปรแกรมประหยัดอินเทอร์เน็ตเปลี่ยนชื่อเป็นโหมด Lite แล้ว</translation>
 <translation id="145097072038377568">ปิดในการตั้งค่า Android</translation>
-<translation id="146329143005354472">เพิ่มลงในแอปของฉัน</translation>
 <translation id="1477626028522505441">การดาวน์โหลด <ph name="FILE_NAME" /> ล้มเหลวเพราะเซิร์ฟเวอร์มีปัญหา</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (และอีก 1 รายการ)}other{ (และอีก # รายการ)}}</translation>
 <translation id="1501480321619201731">ลบกลุ่ม</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">เก็บข้อมูลของฉันแยกต่างหาก</translation>
 <translation id="8068648041423924542">เลือกใบรับรองไม่ได้</translation>
 <translation id="8073388330009372546">เปิดภาพในแท็บใหม่</translation>
+<translation id="8076492880354921740">แท็บ</translation>
 <translation id="8084114998886531721">รหัสผ่านที่บันทึกไว้</translation>
 <translation id="8087000398470557479">เนื้อหานี้มาจาก <ph name="DOMAIN_NAME" /> และนำส่งโดย Google</translation>
 <translation id="8103578431304235997">แท็บที่ไม่ระบุตัวตน</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 2f8c9c7..ec8c3e5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">MIDI cihazlarının tam denetimine izin verme</translation>
 <translation id="1449080968331948513">Veri Tasarrufu'nun yeni adı Basit mod'dur</translation>
 <translation id="145097072038377568">Android Ayarları'ndan kapatıldı</translation>
-<translation id="146329143005354472">Uygulamalarım'a ekle</translation>
 <translation id="1477626028522505441">Sunucu sorunları nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 daha)}other{ (+ # daha)}}</translation>
 <translation id="1501480321619201731">Grubu sil</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Verilerimi ayrı tut</translation>
 <translation id="8068648041423924542">Sertifika seçilemiyor.</translation>
 <translation id="8073388330009372546">Resmi yeni sekmede aç</translation>
+<translation id="8076492880354921740">Sekmeler</translation>
 <translation id="8084114998886531721">Kayıtlı şifre</translation>
 <translation id="8087000398470557479">Bu içerik Google tarafından <ph name="DOMAIN_NAME" /> adresinden sağlanmaktadır.</translation>
 <translation id="8103578431304235997">Gizli Sekme</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index 73a65fc..9cc9f90 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Повний контроль пристроїв MIDI</translation>
 <translation id="1449080968331948513">Заощадження трафіку зараз працює в спрощеному режимі</translation>
 <translation id="145097072038377568">Вимкнено в налаштуваннях Android</translation>
-<translation id="146329143005354472">Внести в список "Мої додатки"</translation>
 <translation id="1477626028522505441">Файл <ph name="FILE_NAME" /> не завантажено через проблеми із сервером.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ще 1)}one{ (+ і ще #)}few{ (+ і ще #)}many{ (+ і ще #)}other{ (+ і ще #)}}</translation>
 <translation id="1501480321619201731">Видалити групу</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Зберігати мої дані окремо</translation>
 <translation id="8068648041423924542">Не вдалося вибрати сертифікат.</translation>
 <translation id="8073388330009372546">Відкрити в новій вкладці</translation>
+<translation id="8076492880354921740">Вкладки</translation>
 <translation id="8084114998886531721">Збережений пароль</translation>
 <translation id="8087000398470557479">Це вміст із сайту <ph name="DOMAIN_NAME" />, який доставляє Google.</translation>
 <translation id="8103578431304235997">Анонімна вкладка</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 01b0082..c3e0e80 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">Cho phép kiểm soát hoàn toàn thiết bị MIDI</translation>
 <translation id="1449080968331948513">Trình tiết kiệm dữ liệu hiện có tên mới là Chế độ thu gọn</translation>
 <translation id="145097072038377568">Tắt trong Cài đặt Android</translation>
-<translation id="146329143005354472">Thêm vào Ứng dụng của tôi</translation>
 <translation id="1477626028522505441">Tải xuống <ph name="FILE_NAME" /> không thành công do sự cố máy chủ.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 mục khác)}other{ (+ # mục khác)}}</translation>
 <translation id="1501480321619201731">Xóa nhóm</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">Giữ dữ liệu của tôi riêng biệt</translation>
 <translation id="8068648041423924542">Không thể chọn chứng chỉ.</translation>
 <translation id="8073388330009372546">Mở ảnh trong tab mới</translation>
+<translation id="8076492880354921740">Tab</translation>
 <translation id="8084114998886531721">Mật khẩu đã lưu</translation>
 <translation id="8087000398470557479">Nội dung này đến từ <ph name="DOMAIN_NAME" />, do Google phân phối.</translation>
 <translation id="8103578431304235997">Tab ẩn danh</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index f2a2c1e..2da140fb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">允许全面控制 MIDI 设备</translation>
 <translation id="1449080968331948513">流量节省程序现处于精简模式</translation>
 <translation id="145097072038377568">已在 Android 设置中停用</translation>
-<translation id="146329143005354472">添加到“我的应用”</translation>
 <translation id="1477626028522505441">未能成功下载 <ph name="FILE_NAME" />,因为服务器出现了问题。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(以及另外 1 项)}other{(以及另外 # 项)}}</translation>
 <translation id="1501480321619201731">删除群组</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">单独保存我的数据</translation>
 <translation id="8068648041423924542">无法选择证书。</translation>
 <translation id="8073388330009372546">在新标签页中打开图片</translation>
+<translation id="8076492880354921740">标签页</translation>
 <translation id="8084114998886531721">保存的密码</translation>
 <translation id="8087000398470557479">此内容来自 <ph name="DOMAIN_NAME" />(由 Google 提供)。</translation>
 <translation id="8103578431304235997">隐身标签页</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index b85adc3..5e706003 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -71,7 +71,6 @@
 <translation id="1446450296470737166">允許完整控制 MIDI 裝置</translation>
 <translation id="1449080968331948513">數據節省模式現在稱為精簡模式</translation>
 <translation id="145097072038377568">已在 Android 設定中關閉</translation>
-<translation id="146329143005354472">新增至我的應用程式</translation>
 <translation id="1477626028522505441">伺服器發生問題,因此無法下載 <ph name="FILE_NAME" />。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(還有 1 個)}other{(還有 # 個)}}</translation>
 <translation id="1501480321619201731">刪除群組</translation>
@@ -973,6 +972,7 @@
 <translation id="806745655614357130">分開保留我的資料</translation>
 <translation id="8068648041423924542">無法選取憑證。</translation>
 <translation id="8073388330009372546">在新分頁中開啟圖片</translation>
+<translation id="8076492880354921740">分頁</translation>
 <translation id="8084114998886531721">已儲存的密碼</translation>
 <translation id="8087000398470557479">這個內容來自 <ph name="DOMAIN_NAME" />,由 Google 所提供。</translation>
 <translation id="8103578431304235997">無痕式分頁</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java
index a055744..eebdaa9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java
@@ -292,7 +292,7 @@
         // If the CONTENT_SETTINGS_NUM_TYPES value changes *and* a new value has been exposed on
         // Android, then please update this code block to include a test for your new type.
         // Otherwise, just update count in the assert.
-        Assert.assertEquals(47, ContentSettingsType.CONTENT_SETTINGS_NUM_TYPES);
+        Assert.assertEquals(49, ContentSettingsType.CONTENT_SETTINGS_NUM_TYPES);
         websitePreferenceBridge.addContentSettingException(
                 new ContentSettingException(ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES,
                         googleOrigin, ContentSettingValues.DEFAULT, preferenceSource));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/NavigationBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
similarity index 95%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/NavigationBarColorControllerTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
index d1315ff..67905f2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/NavigationBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.ui.system;
+package org.chromium.chrome.browser.tabbed_mode;
 
 import static org.junit.Assert.assertEquals;
 
@@ -29,13 +29,13 @@
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
-/** Tests for the NavigationBarColorController.  */
+/** Tests for the TabbedNavigationBarColorController.  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @MinAndroidSdkLevel(Build.VERSION_CODES.O_MR1)
 @TargetApi(Build.VERSION_CODES.O_MR1)
 @SuppressLint("NewApi")
-public class NavigationBarColorControllerTest {
+public class TabbedNavigationBarColorControllerTest {
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb
index bd5c335a..b515cee 100644
--- a/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb
+++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ar.xtb
@@ -1,10 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
-<translation id="146329143005354472">إضافة إلى "تطبيقاتي"</translation>
+<translation id="146329143005354472">إضافة هذا الموقع إلى "تطبيقاتي"</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="2169830938017475061">الآن</translation>
-<translation id="3669009212293447190">المزيد من المقالات</translation>
+<translation id="3669009212293447190">مقالات أخرى</translation>
 <translation id="5901398892005759450">كل التطبيقات</translation>
 <translation id="7626032353295482388">‏مرحبًا بك في Chrome‏</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 9be53a6..133c61a 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3947,4 +3947,11 @@
   <message name="IDS_ADD_SUPERVISION_PAGE_TITLE" desc="Title for the Chrome OS Add Supervision screen.">
     Add Supervision
   </message>
+    <!-- Strings for gnubby U2FD authentication UI -->
+  <message name="IDS_GNUBBY_NOTIFICATION_TITLE" desc="Title for notification informing user to press power button for gnubby U2FD.">
+    A security key is being requested
+  </message>
+  <message name="IDS_GNUBBY_NOTIFICATION_MESSAGE" desc="Text for notifications informing user that Chrome is requestor for U2FD.">
+    Please tap your power button
+  </message>
 </grit-part>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index b7cce57..48b1665 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6356,6 +6356,15 @@
       <message name="IDS_OMNIBOX_TOOLTIP_SEND_TAB_TO_SELF" desc="The label of item for share this tab to other devices in different context menus.">
         Send this page
       </message>
+      <message name="IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_TODAY_SEND_TAB_TO_SELF" desc="The label of valid device button inside omnibox bubble, which shows the last activated time of a valid device.">
+        Active today
+      </message>
+      <message name="IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAY_SEND_TAB_TO_SELF" desc="The label of valid device button inside omnibox bubble, which shows the last activated time of a valid device.">
+        Active <ph name="DEVICE_LAST_ACTIVATED_TIME">$1<ex>- 1 day ago</ex></ph> day ago
+      </message>
+      <message name="IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAYS_SEND_TAB_TO_SELF" desc="The label of valid device button inside omnibox bubble, which shows the last activated time of a valid device.">
+        Active <ph name="DEVICE_LAST_ACTIVATED_TIME">$1<ex>- 3 days ago</ex></ph> days ago
+      </message>
       <if expr="not use_titlecase">
         <message name="IDS_CONTEXT_MENU_SEND_TAB_TO_SELF" desc="The label of item for share this tab to other devices in different context menus.">
           Send to your devices
@@ -9213,6 +9222,22 @@
       </message>
     </if>
 
+    <!-- HID (Human Interface Device) chooser -->
+    <if expr="not is_android">
+      <message name="IDS_HID_CHOOSER_PROMPT_ORIGIN" desc="The label that is used to introduce the Human Interface Device (HID) chooser details to the user in a popup when it is from a website.">
+        <ph name="Origin">$1<ex>www.google.com</ex></ph> wants to connect to a HID device
+      </message>
+      <message name="IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME" desc="The label that is used to introduce Human Interface Device (HID) chooser details to the user in a popup when it is from a Chrome extension.">
+        "<ph name="CHROME_EXTENSION_NAME">$1<ex>Chrome Extension Name</ex></ph>" wants to connect to a HID device
+      </message>
+      <message name="IDS_HID_CHOOSER_ITEM_WITHOUT_NAME" desc="User option displaying the vendor ID and product ID for a Human Interface Device (HID) without a device name.">
+        Unknown Device (Vendor: <ph name="VENDOR_ID">$1<ex>0x1234</ex></ph>, Product: <ph name="PRODUCT_ID">$2<ex>0xabcd</ex></ph>)
+      </message>
+      <message name="IDS_HID_CHOOSER_ITEM_WITH_NAME" desc="User option displaying the device name, vendor ID, and product ID for a Human Interface Device (HID).">
+        <ph name="DEVICE_NAME">$1<ex>Wireless Controller</ex></ph> (Vendor: <ph name="VENDOR_ID">$2<ex>0x1234</ex></ph>, Product: <ph name="PRODUCT_ID">$3<ex>0xabcd</ex></ph>)
+      </message>
+    </if>
+
     <!-- Chrome IME API activated bubble. -->
     <message name="IDS_IME_API_ACTIVATED_WARNING" desc="The Warning info when an IME extension is trying to activate.">
       <ph name="EXTENSION_NAME">$1<ex>Gmail Checker</ex></ph> extension may collect all the text you type, including personal data like passwords and credit card numbers. Do you want to use this extension?
diff --git a/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITHOUT_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITHOUT_NAME.png.sha1
new file mode 100644
index 0000000..2e693e2
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITHOUT_NAME.png.sha1
@@ -0,0 +1 @@
+3f1d85bcbed727fbff071393294aa7cab13ac5e5
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITH_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITH_NAME.png.sha1
new file mode 100644
index 0000000..da0ce94
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_ITEM_WITH_NAME.png.sha1
@@ -0,0 +1 @@
+a1096c2b894b7515b5a762a32a345a93fcd1556f
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME.png.sha1
new file mode 100644
index 0000000..90a6bb6b
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_EXTENSION_NAME.png.sha1
@@ -0,0 +1 @@
+071dbff1f196a88a6bd8c193de1291d1dbdb77dd
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_ORIGIN.png.sha1 b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_ORIGIN.png.sha1
new file mode 100644
index 0000000..11171eb
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HID_CHOOSER_PROMPT_ORIGIN.png.sha1
@@ -0,0 +1 @@
+cf0bf447b102e4e9d94e39601f07783e6a2d1141
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAYS_SEND_TAB_TO_SELF.png.sha1 b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAYS_SEND_TAB_TO_SELF.png.sha1
new file mode 100644
index 0000000..fb6a8ce
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAYS_SEND_TAB_TO_SELF.png.sha1
@@ -0,0 +1 @@
+6cf9e10761ae86bcfa3a75b0111349c38718353d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAY_SEND_TAB_TO_SELF.png.sha1 b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAY_SEND_TAB_TO_SELF.png.sha1
new file mode 100644
index 0000000..3dd9a7bd
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAY_SEND_TAB_TO_SELF.png.sha1
@@ -0,0 +1 @@
+6cd4d389650c5e448202d7c7047164371ffb17cd
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_TODAY_SEND_TAB_TO_SELF.png.sha1 b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_TODAY_SEND_TAB_TO_SELF.png.sha1
new file mode 100644
index 0000000..4053264e
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_TODAY_SEND_TAB_TO_SELF.png.sha1
@@ -0,0 +1 @@
+961fa72780587f68b152d69e04556a3e977018d4
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index a697301..6d467e94 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -51,7 +51,7 @@
 <translation id="2718390899429598676">‏لمزيد من الأمان، سيشفر Chromium بياناتك</translation>
 <translation id="2770231113462710648">تغيير المتصفح التلقائي إلى:</translation>
 <translation id="2799223571221894425">إعادة تشغيل</translation>
-<translation id="2838154144102149890">‏للتحديث، على Chromium التوقف عن العمل على جهاز الكمبيوتر هذا. قد يتسبب هذا في فقد التغييرات التي لم يحفظها المستخدمون الآخرون الذين سجَّلوا الدخول إلى جهاز الكمبيوتر هذا.</translation>
+<translation id="2838154144102149890">‏يجب إيقاف تشغيل Chromium على جهاز الكمبيوتر هذا لإجراء التحديث. وجرّاء ذلك، إنّ المستخدمين الآخرين الذين سجَّلوا الدخول إلى جهاز الكمبيوتر هذا قد يفقدون التغييرات غير المحفوظة.</translation>
 <translation id="2847479871509788944">‏إزالة من Chromium</translation>
 <translation id="2886012850691518054">‏اختياري: ساعد في تحسين Chromium عن طريق إرسال إحصائيات الاستخدام وتقارير الأعطال إلى Google تلقائيًا.</translation>
 <translation id="2898082584336937987">‏بادِر بتثبيت Chromium على هاتفك. سنرسل رسالة قصيرة SMS إلى هاتفك: <ph name="PHONE_NUMBER" /></translation>
@@ -186,7 +186,7 @@
 <translation id="6810143991807788455">‏ساعد في تحسين Chromium بالإبلاغ عن الإعدادات الحالية</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">‏Google Pay (تم النسخ إلى Chromium)</translation>
-<translation id="6868056391275687737">‏هناك نُسخ أخرى من Chromium قيد التشغيل. يُرجى إغلاقها للتحديث.</translation>
+<translation id="6868056391275687737">‏هناك نُسخ أخرى من Chromium قيد التشغيل. يُرجى إغلاقها لإجراء التحديث.</translation>
 <translation id="6893813176749746474">‏تم تحديث متصفح Chromium، ولكنك لم تستخدمه منذ أكثر من 30 يومًا.</translation>
 <translation id="6964305034639999644">‏فتح الرابط في نافذة تصفح متخفٍ في Chromium</translation>
 <translation id="6970811910055250180">جارٍ تحديث الجهاز...</translation>
@@ -256,7 +256,7 @@
 <translation id="8667808506758191620">جهاز <ph name="DEVICE_TYPE" /> مُحدّث.</translation>
 <translation id="8697124171261953979">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chromium أو إجراء بحث من المربع متعدد الاستخدامات.</translation>
 <translation id="8704119203788522458">‏هذا هو Chromium الخاص بك</translation>
-<translation id="8748383401829947534">‏الخروج من جميع نُسخ Chromium.</translation>
+<translation id="8748383401829947534">‏الخروج من جميع نُسخ Chromium</translation>
 <translation id="8796602469536043152">‏يحتاج Chromium إلى إذن للوصول إلى الكاميرا والميكروفون من أجل موقع الويب هذا.</translation>
 <translation id="8803635938069941624">‏بنود نظام تشغيل Chromium</translation>
 <translation id="8821041990367117597">‏تعذر على Chromium مزامنة البيانات نظرًا لأن تفاصيل تسجيل الدخول إلى حسابك قديمة.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index ff1ba8b..dd4e557 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">ተንቀሳቃሽ ማግበሪያ</translation>
 <translation id="1407489512183974736">እስከ መሃከል የተከረከመ</translation>
 <translation id="1408504635543854729">የመሣሪያውን ይዘት በፋይሎች መተግበሪያው ውስጥ ያስሱት። ይዘቱ በአስተዳዳሪ የተገደበ ነው እና ሊሻሻል አይችልም።</translation>
-<translation id="1408789165795197664">የላቁ...</translation>
 <translation id="1409390508152595145">ክትትል የሚደረግበት ተጠቃሚ ፍጠር</translation>
 <translation id="1410197035576869800">የመተግበሪያ አዶ</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> የካሜራዎ መዳረሻ መስጠቱን ይቀጥሉ</translation>
@@ -2655,7 +2654,6 @@
 <translation id="5184063094292164363">&amp;ጃቫስክሪፕት ኮንሶል</translation>
 <translation id="5184662919967270437">መሣሪያዎን በማዘመን ላይ</translation>
 <translation id="5185386675596372454">አዲሱ የ«<ph name="EXTENSION_NAME" />» መተግበሪያ ስሪት ተጨማሪ ፍቃዶችን ስለሚፈልግ ተሰናክሏል።</translation>
-<translation id="5187295959347858724">አሁን ወደ <ph name="SHORT_PRODUCT_NAME" /> ገብተዋል። ዕልባቶችዎ፣ ታሪክዎ እና ሌሎች ቅንብሮችዎ ከGoogle መለያዎ ጋር እየተመሳሰሉ ናቸው።</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> በርካታ ፋይሎችን ለማውረድ ይፈልጋል</translation>
 <translation id="5204673965307125349">እባክዎ መሣሪያን ፓወርዋሽ ያድርጉትና እንደገና ይሞክሩ።</translation>
@@ -4131,7 +4129,6 @@
 <translation id="7481312909269577407">ወደ ፊት</translation>
 <translation id="748138892655239008">የሰርቲፊኬት መሰረታዊ እገዳዎች</translation>
 <translation id="7487067081878637334">ቴክኖሎጂ</translation>
-<translation id="7487099628810939106">ከጠቅታ በፊት የሚዘገየው፦</translation>
 <translation id="7487141338393529395">የበለጸገ የፊደል አራሚን ያብሩ</translation>
 <translation id="7487969577036436319">ምንም አካላት አልተጫኑም</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;ሁሉንም ክፈት}=1{&amp;ዕልባት ክፈት}one{&amp;ሁሉንም ክፈት (#)}other{&amp;ሁሉንም ክፈት (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 3923cb9..ed254b8f 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -150,7 +150,7 @@
 <translation id="1211364473545090084">استخدِم الويب دون حفظ سجلّ التصفُّح باستخدام نافذة تصفُّح متخفٍ</translation>
 <translation id="1213037489357051291">تم إعداد <ph name="NUM_FINGERPRINTS" /> من بصمات الإصبع</translation>
 <translation id="1215411991991485844">تمت إضافة تطبيق جديد في الخلفية</translation>
-<translation id="1217483152325416304">سيتم قريبًا حذف البيانات المحلية</translation>
+<translation id="1217483152325416304">سيتم قريبًا حذف البيانات المحلية.</translation>
 <translation id="1217668622537098248">إعادة ميزة النقر بزر الماوس الأيسر بعد اتخاذ إجراء</translation>
 <translation id="121783623783282548">كلمتا المرور غير متطابقتين.</translation>
 <translation id="1218839827383191197">‏<ph name="BEGIN_PARAGRAPH1" />تستخدم خدمة الموقع الجغرافي من Google مصادر، مثل شبكات Wi‑Fi وشبكات الجوّال وأجهزة الاستشعار للمساعدة في تقدير الموقع الجغرافي لهذا الجهاز.<ph name="END_PARAGRAPH1" />
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">تفعيل شبكة الجوّال</translation>
 <translation id="1407489512183974736">اقتصاص الوسط</translation>
 <translation id="1408504635543854729">يمكنك استكشاف محتوى الجهاز في تطبيق الملفات. ويعد هذا المحتوى مقيدًا من قبل المشرف، ولا يمكن تعديله.</translation>
-<translation id="1408789165795197664">متقدم...</translation>
 <translation id="1409390508152595145">إنشاء مستخدم يخضع للإدارة</translation>
 <translation id="1410197035576869800">رمز التطبيق</translation>
 <translation id="1410616244180625362">مواصلة السماح لـ <ph name="HOST" /> بالدخول إلى الكاميرا</translation>
@@ -312,7 +311,7 @@
 <translation id="1478340334823509079">التفاصيل: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">التثبيت غير مُفعَّل</translation>
 <translation id="1483493594462132177">إرسال</translation>
-<translation id="1484979925941077974">يستخدم الموقع الإلكتروني البلوتوث</translation>
+<translation id="1484979925941077974">يستخدم الموقع الإلكتروني البلوتوث.</translation>
 <translation id="1485015260175968628">يمكنه الآن:</translation>
 <translation id="1485141095922496924">الإصدار <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">بحث عن كلمات المرور</translation>
@@ -463,7 +462,7 @@
 <translation id="1708338024780164500">(غير نشطة)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (رقم التعريف: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981">‏<ph name="WIDTH" /> x <ph name="HEIGHT" /> (الأصلي)</translation>
-<translation id="1711401317189798723">الاحتفاظ بنسخة احتياطية حاليًا قيد التقدم لـ <ph name="CONTAINER_ID" /></translation>
+<translation id="1711401317189798723">يجري الاحتفاظ حاليًا بنسخة احتياطية لـ <ph name="CONTAINER_ID" />.</translation>
 <translation id="1712349894969001173">‏الحصول على كلمة المرور هذه على جهاز iPhone</translation>
 <translation id="1712552549805331520">يريد <ph name="URL" /> تخزين بيانات على جهاز الكمبيوتر المحلي بشكل دائم.</translation>
 <translation id="1717218214683051432">مستشعرات الحركة</translation>
@@ -615,7 +614,7 @@
 <translation id="1932026958134051332">خيارات الوصول عبر مفتاح التحويل</translation>
 <translation id="1932098463447129402">أول يوم لتفعيل الصلاحية</translation>
 <translation id="1933809209549026293">‏يُرجى توصيل الماوس أو لوحة المفاتيح. إذا كنت تستخدم جهاز Bluetooth، فتأكد من أنه جاهز للإقران.</translation>
-<translation id="1937774647013465102">يتعذّر استيراد نوع بنية الحاوية <ph name="ARCHITECTURE_CONTAINER" /> من خلال هذا الجهاز الذي يمثل <ph name="ARCHITECTURE_DEVICE" />.يمكنك محاولة استعادة هذه الحاوية في جهاز مختلف، أو يمكنك الوصول إلى الملفات داخل صورة الحاوية هذه عن طريق فتح تطبيق "الملفات".</translation>
+<translation id="1937774647013465102">يتعذّر استيراد نوع بنية الحاوية <ph name="ARCHITECTURE_CONTAINER" /> باستخدام هذا الجهاز الذي يمثل <ph name="ARCHITECTURE_DEVICE" />.يمكنك محاولة استعادة هذه الحاوية على جهاز مختلف، أو يمكنك الوصول إلى الملفات داخل صورة الحاوية هذه عن طريق فتح تطبيق "الملفات".</translation>
 <translation id="1938351510777341717">‏مفتاح Command الخارجي</translation>
 <translation id="1940546824932169984">الأجهزة المتصلة</translation>
 <translation id="1944921356641260203">تم العثور على التحديث</translation>
@@ -904,11 +903,11 @@
 <translation id="2392369802118427583">تفعيل</translation>
 <translation id="2394566832561516196">سيتم محو الإعدادات عند إعادة التحميل في المرة التالية.</translation>
 <translation id="2395616325548404795">لقد تم تسجيل جهاز <ph name="DEVICE_TYPE" /> بنجاح لإدارة المؤسسة، لكن تعذّر إرسال بيانات الأصل والموقع. يُرجى إدخال هذه البيانات يدويًا من وحدة تحكُّم المشرف لهذا الجهاز.</translation>
-<translation id="2396783860772170191">أدخِل رقم التعريف الشخصي المكوَّن من 4 أرقام (0000-9999)</translation>
+<translation id="2396783860772170191">أدخِل رقم التعريف الشخصي المكوَّن من 4 أرقام (0000-9999).</translation>
 <translation id="2408955596600435184">إدخال رقم التعريف الشخصي</translation>
 <translation id="241082044617551207">مكوّن إضافي غير محدّد</translation>
 <translation id="2413749388954403953">تغيير واجهة المستخدم للإشارات المرجعية</translation>
-<translation id="241639282915300771">الاستعادة حاليًا قيد التقدم من أجل <ph name="CONTAINER_ID" /></translation>
+<translation id="241639282915300771">تجري حاليًا استعادة <ph name="CONTAINER_ID" />.</translation>
 <translation id="241727068219398187">‏تم تشفير البيانات باستخدام كلمة مرور Google اعتبارًا من
           <ph name="TIME" />. لا يتضمّن ذلك طرق الدفع والعناوين من Google Pay.</translation>
 <translation id="2419706071571366386">لأغراض الأمان، سجّل الخروج عندما لا يتم استخدام الكمبيوتر.</translation>
@@ -1090,7 +1089,7 @@
 <translation id="2677748264148917807">الخروج</translation>
 <translation id="2678063897982469759">إعادة تفعيل</translation>
 <translation id="268053382412112343">ال&amp;سجل</translation>
-<translation id="2682498795777673382">تحديث من أحد الوالدين</translation>
+<translation id="2682498795777673382">تحديث من أحد والديك</translation>
 <translation id="2683638487103917598">تم تصنيف المجلد</translation>
 <translation id="2684004000387153598">للمتابعة، انقر على "موافقة" ثم انقر على "إضافة شخص" لإنشاء ملف شخصي جديد لعنوان بريدك الإلكتروني.</translation>
 <translation id="2688196195245426394">حدث خطأ عند تسجيل الجهاز مع الخادم: <ph name="CLIENT_ERROR" />.</translation>
@@ -1125,7 +1124,7 @@
 <translation id="2731392572903530958">إعادة ف&amp;تح النافذة المغلقة</translation>
 <translation id="2731700343119398978">يرجى الانتظار...</translation>
 <translation id="2731710757838467317">يُمكنك إنشاء مستخدم يخضع للإدارة. قد يستغرق هذا الأمر بعض الوقت.</translation>
-<translation id="2731971182069536520">في المرة القادمة التي يتم فيها إعادة تشغيل الجهاز، سيجري مشرفك تحديثًا لمرة واحدة سيؤدي إلى حذف البيانات المحلية.</translation>
+<translation id="2731971182069536520">في المرة القادمة التي يتم فيها إعادة تشغيل الجهاز، سيُجري مشرفك تحديثًا لمرة واحدة، ما سيؤدي إلى حذف البيانات المحلية.</translation>
 <translation id="2734760316755174687">سيتم أيضًا إعادة ضبط المواقع الإلكترونية ضمن <ph name="SITE_GROUP_NAME" />.</translation>
 <translation id="2735438478659026460">النقر تلقائيًا عند توقف مؤشر الماوس</translation>
 <translation id="2735712963799620190">الجدول الزمني</translation>
@@ -1351,7 +1350,7 @@
 <translation id="3084771660770137092">‏ربما نفدت الذاكرة لدى Chrome أو تم إنهاء العملية لصفحة الويب لسبب آخر. للمتابعة، أعد التحميل أو انتقل إلى صفحة أخرى.</translation>
 <translation id="3085412380278336437">يمكن لموقع الويب استخدام الكاميرا.</translation>
 <translation id="3085752524577180175">‏مضيف SOCKS</translation>
-<translation id="3088052000289932193">‏يستخدم الموقع الإلكتروني جهاز MIDI</translation>
+<translation id="3088052000289932193">‏يستخدم الموقع الإلكتروني جهاز MIDI.</translation>
 <translation id="3088325635286126843">إ&amp;عادة تسمية...</translation>
 <translation id="3089137131053189723">تم محو البحث</translation>
 <translation id="3090193911106258841">جارٍ الوصول إلى إدخال الصوت والفيديو</translation>
@@ -1492,7 +1491,7 @@
 <translation id="3317459757438853210">طباعة على الجانبين</translation>
 <translation id="3317678681329786349">تم حظر استخدام الكاميرا والميكروفون</translation>
 <translation id="3319048459796106952">نافذة &amp; جديدة للتصفح المتخفي</translation>
-<translation id="3323521181261657960">مكافأة. المزيد من وقت النظر إلى الشاشة</translation>
+<translation id="3323521181261657960">إليك مكافأة. ستحظى بالمزيد من وقت النظر إلى الشاشة.</translation>
 <translation id="3325910708063135066">‏تم إيقاف الكاميرا والميكروفون في إعدادات نظام Mac المفضلة</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">معلومات التطبيق</translation>
@@ -1712,7 +1711,7 @@
 <translation id="3664511988987167893">رمز الإضافة</translation>
 <translation id="3665589677786828986">‏اكتشف Chrome أن بعض إعداداتك تم إتلافها من قبل برنامج آخر وإعادة تعيينها للحالة التلقائية الأصلية.</translation>
 <translation id="3668570675727296296">إعدادات اللغة</translation>
-<translation id="366867565525278777">تعذَّر التثبيت لعدم توفر مساحة تخزين. يجب توفر <ph name="INSTALL_SIZE" /> على الأقل من المساحة الخالية. لتفريغ مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation>
+<translation id="366867565525278777">تعذَّر التثبيت لعدم توفر مساحة تخزين. يتطلب التثبيت <ph name="INSTALL_SIZE" /> على الأقل من المساحة الخالية. لتوفير مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation>
 <translation id="3668801437375206837">‏لتشخيص مشاكل البلوتوث بشكل أفضل، يمكن لمستخدمي Google تضمين سجلّات بلوتوث إضافية مع تقارير التعليقات. وعند تحديد هذا الخيار، سيتضمَّن تقريرك للجلسة الحالية ملفات بتنسيقات btsnoop وسجلّات وحدة تحكُّم المُضيف (HCI) مُصحَّحة لإزالة أكبر قدر ممكن من معلومات تحديد الهوية الشخصية. وسيقتصر الوصول إلى هذه السجلّات على مديري مجموعة منتجات نظام التشغيل Chrome في Listnr. وستُزال السجلّات نهائيًا بعد 90 يومًا.</translation>
 <translation id="3668823961463113931">المعالجات</translation>
 <translation id="3670113805793654926">أجهزة من أي مورّد</translation>
@@ -1789,7 +1788,7 @@
 <translation id="3765246971671567135">تعذَّرت قراءة سياسة الوضع التجريبي بلا إنترنت.</translation>
 <translation id="3766223500670287046">تشغيل الشاشة عن بُعد</translation>
 <translation id="3768037234834996183">جارٍ مزامنة تفضيلاتك...</translation>
-<translation id="377050016711188788">آيس كريم</translation>
+<translation id="377050016711188788">المثلجات</translation>
 <translation id="3771294271822695279">ملفات فيديو</translation>
 <translation id="3775432569830822555">‏شهادة خادم بروتوكول SSL (طبقة المقابس الآمنة)</translation>
 <translation id="3775705724665058594">إرسال إلى أجهزتك</translation>
@@ -1867,7 +1866,7 @@
 <translation id="3869917919960562512">فهرس خاطئ.</translation>
 <translation id="3870931306085184145">ليست هناك أي كلمات مرور محفوظة لاسم النطاق <ph name="DOMAIN" /></translation>
 <translation id="3871092408932389764">الأقل</translation>
-<translation id="3871350334636688135">بعد 24 ساعة، سيجري مشرفك تحديثًا لمرة واحدة سيؤدي إلى حذف بياناتك المحلية عند إعادة تشغيل جهازك. يمكنك حفظ أي بيانات محلية تحتاج إليها للتخزين في السحابة الإلكترونية خلال 24 ساعة.</translation>
+<translation id="3871350334636688135">بعد 24 ساعة، سيجري مشرفك تحديثًا لمرة واحدة سيؤدي إلى حذف بياناتك المحلية عند إعادة تشغيل جهازك. يمكنك حفظ أي بيانات محلية تحتاج إليها وتخزينها في السحابة الإلكترونية خلال 24 ساعة.</translation>
 <translation id="3872220884670338524">المزيد من الإجراءات؛ تم حفظ الحساب الذي يحمل اسم المستخدم <ph name="USERNAME" /> على النطاق <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">احرص على تفريغ مساحة على القرص أو سيصبح الجهاز غير مستجيب.</translation>
 <translation id="3873315167136380065">لتفعيل هذا الإعداد، يمكنك <ph name="BEGIN_LINK" />إعادة ضبط المزامنة<ph name="END_LINK" /> لإزالة عبارة مرور المزامنة.</translation>
@@ -2176,7 +2175,7 @@
 <translation id="438503109373656455">ساراتوجا</translation>
 <translation id="4387004326333427325">تم رفض شهادة المصادقة عن بُعد</translation>
 <translation id="4389091756366370506">المستخدم <ph name="VALUE" /></translation>
-<translation id="4390000551125140321">{0,plural, =1{نافذة واحدة للتصفُّح المتخفي}zero{# نافذة مفتوحة للتصفُّح المتخفي}two{نافذتان مفتوحان للتصفُّح المتخفي (#)}few{# نوافذ مفتوحة للتصفُّح المتخفي}many{# نافذةً مفتوحةً للتصفُّح المتخفي}other{# نافذة مفتوحة للتصفُّح المتخفي}}</translation>
+<translation id="4390000551125140321">{0,plural, =1{نافذة واحدة للتصفّح المتخفي}zero{ما من نوافذ مفتوحة للتصفّح المتخفي}two{نافذتان مفتوحان للتصفّح المتخفي}few{# نوافذ مفتوحة للتصفّح المتخفي}many{# نافذةً مفتوحةً للتصفّح المتخفي}other{# نافذة مفتوحة للتصفّح المتخفي}}</translation>
 <translation id="439266289085815679">يتم التحكّم في تهيئة البلوتوث من قِبل <ph name="USER_EMAIL" />.</translation>
 <translation id="4394049700291259645">إيقاف</translation>
 <translation id="4400367121200150367">ستظهر هنا مواقع الويب التي لا يتم حفظ كلمات المرور لها مطلقًا</translation>
@@ -2479,7 +2478,7 @@
 <translation id="488785315393301722">عرض التفاصيل</translation>
 <translation id="4890773143211625964">عرض خيارات الطابعة المتقدمة</translation>
 <translation id="4891089016822695758">منتدى الإصدار التجريبي</translation>
-<translation id="4892229439761351791">يمكن لموقع الويب استخدام البلوتوث</translation>
+<translation id="4892229439761351791">يمكن لموقع الويب استخدام البلوتوث.</translation>
 <translation id="4893336867552636863">سيؤدي هذا إلى حذف بيانات التصفح من هذا الجهاز نهائيًا.</translation>
 <translation id="4893522937062257019">على شاشة التأمين</translation>
 <translation id="489454699928748701">السماح لمواقع الويب باستخدام مستشعرات الحركة</translation>
@@ -2653,7 +2652,6 @@
 <translation id="5184063094292164363">و&amp;حدة تحكم جافا سكريبت</translation>
 <translation id="5184662919967270437">تحديث جهازك</translation>
 <translation id="5185386675596372454">تم إيقاف أحدث إصدار من "<ph name="EXTENSION_NAME" />" لأنه يتطلب المزيد من الأذونات.</translation>
-<translation id="5187295959347858724">‏لقد سجّلت الدخول إلى <ph name="SHORT_PRODUCT_NAME" />. تتم الآن مزامنة الإشارات المرجعية والسجلّ والإعدادات الأخرى مع حسابك على Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">يريد <ph name="ORIGIN" /> تنزيل ملفات متعددة.</translation>
 <translation id="5204673965307125349">‏يُرجى إجراء powerwash للجهاز وإعادة المحاولة.</translation>
@@ -2944,7 +2942,7 @@
 <translation id="5620568081365989559">‏تطلب DevTools الدخول الكامل إلى <ph name="FOLDER_PATH" />. احرص على عدم كشف أي معلومات حساسة.</translation>
 <translation id="5620612546311710611">إحصاءات الاستخدام</translation>
 <translation id="5620655347161642930">جارٍ تصدير كلمات المرور...</translation>
-<translation id="5623282979409330487">يحاول موقع الويب هذا الوصول إلى مستشعرات الحركة.</translation>
+<translation id="5623282979409330487">يستخدم موقع الويب هذا مستشعرات الحركة.</translation>
 <translation id="5623842676595125836">السجل</translation>
 <translation id="5624120631404540903">إدارة كلمات المرور</translation>
 <translation id="5626134646977739690">الاسم:</translation>
@@ -3542,7 +3540,7 @@
 <translation id="6547354035488017500">احرص على تفريغ مساحة قدرها 512 ميغابايت على الأقل أو سيصبح جهازك غير مستجيب. لتفريغ مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation>
 <translation id="6550675742724504774">خيارات</translation>
 <translation id="6551508934388063976">‏الأمر غير متوفر. اضغط على control-N لفتح نافذة جديدة.</translation>
-<translation id="6551612971599078809">‏يستخدم الموقع الإلكتروني جهاز USB</translation>
+<translation id="6551612971599078809">‏يستخدم الموقع الإلكتروني جهاز USB.</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> من المستخدمين</translation>
 <translation id="655483977608336153">إعادة المحاولة</translation>
 <translation id="6555432686520421228">إزالة جميع حسابات المستخدمين وإعادة تعيين جهاز <ph name="IDS_SHORT_PRODUCT_NAME" /> كما لو كان جديدًا.</translation>
@@ -3766,7 +3764,7 @@
 <translation id="692114467174262153">تعذَّر فتح <ph name="ALTERNATIVE_BROWSER_NAME" />.</translation>
 <translation id="6921709132208495314">إيقاف استخدام البيانات في هذه الصفحة</translation>
 <translation id="6922128026973287222">‏حفظ البيانات والاستمتاع بتصفح أسرع باستخدام ميزة توفير البيانات في Google. يمكن النقر للتعرف على المزيد من المعلومات.</translation>
-<translation id="6922745772873733498">إدخال رقم التعريف الشخصي للطباعة</translation>
+<translation id="6922745772873733498">يُرجى إدخال رقم التعريف الشخصي للطباعة.</translation>
 <translation id="6923132443355966645">التمرير / النقر على</translation>
 <translation id="6923633482430812883">‏حدث خطأ أثناء تحميل المشاركة. لذا يُرجى التحقّق من أن خادم الملفات الذي تتصل به يدعم بروتوكول SMB الإصدار 2 أو الإصدارات الأحدث.</translation>
 <translation id="6930036377490597025">مفتاح الأمان الخارجي أو جهاز الاستشعار المدمج</translation>
@@ -3821,7 +3819,7 @@
 <translation id="7003339318920871147">قواعد بيانات الويب</translation>
 <translation id="7003723821785740825">إعداد طريقة أسرع لإلغاء قفل جهازك</translation>
 <translation id="7003844668372540529">المنتج غير معروف <ph name="PRODUCT_ID" /> من <ph name="VENDOR_NAME" /></translation>
-<translation id="7004402701596653846">‏يمكن للموقع الإلكتروني استخدام جهاز MIDI</translation>
+<translation id="7004402701596653846">‏يمكن للموقع الإلكتروني استخدام جهاز MIDI.</translation>
 <translation id="7004499039102548441">علامات التبويب الأخيرة</translation>
 <translation id="7005848115657603926">نطاق صفحة غير صالح، استخدم <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">الهامش السفلي</translation>
@@ -4014,7 +4012,7 @@
 <translation id="7289225569524511578">فتح تطبيق الخلفية</translation>
 <translation id="7290242001003353852">تحاول خدمة تسجيل الدخول هذه، المُستضافة من قبل <ph name="SAML_DOMAIN" />، الدخول إلى الكاميرا.</translation>
 <translation id="7290594223351252791">تأكيد التسجيل</translation>
-<translation id="7295614427631867477">‏تجدر الإشارة إلى أن Android وPlay والتطبيقات المرتبطة بها محكومة بسياسات الاستخدام وجمع البيانات.</translation>
+<translation id="7295614427631867477">‏تجدر الإشارة إلى أن Android وPlay والتطبيقات المرتبطة بهما محكومة بسياسات الاستخدام وجمع البيانات.الخاصة بها.</translation>
 <translation id="729583233778673644">‏السماح بتشفير AES وRC4: يؤدي استخدام هذا الخيار إلى زيادة المخاطر، لأن رموز RC4 غير آمنة.</translation>
 <translation id="7296774163727375165">بنود <ph name="DOMAIN" /></translation>
 <translation id="7297443947353982503">‏اسم المستخدم/كلمة المرور غير صحيحة أو تعذّرت مصادقة EAP</translation>
@@ -4130,7 +4128,6 @@
 <translation id="7481312909269577407">إلى الأمام</translation>
 <translation id="748138892655239008">القيود الأساسية على الشهادة</translation>
 <translation id="7487067081878637334">التقنية</translation>
-<translation id="7487099628810939106">التأخير قبل النقر:</translation>
 <translation id="7487141338393529395">تفعيل التدقيق الإملائي المُحسَّن</translation>
 <translation id="7487969577036436319">لم يتم تثبيت أي مكونات</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;فتح الكل}=1{&amp;فتح الإشارة المرجعية}two{&amp;فتح كلا العنوانين (#)}few{&amp;فتح كل الـ (#) عناوين}many{&amp;فتح كل الـ (#) عنوانًا}other{&amp;فتح كل الـ (#) عنوان}}</translation>
@@ -4400,7 +4397,7 @@
 <translation id="7877451762676714207">خطأ غير معروف في الخادم. يُرجى إعادة المحاولة أو الاتصال بمشرف الخادم.</translation>
 <translation id="7877680364634660272">جولة</translation>
 <translation id="7878562273885520351">من المحتمل أنه تم اختراق كلمة مرورك</translation>
-<translation id="7880823633812189969">سيتم حذف البيانات المحلية عند إعادة التشغيل</translation>
+<translation id="7880823633812189969">سيتم حذف البيانات المحلية عند إعادة التشغيل.</translation>
 <translation id="7881483672146086348">عرض حساب</translation>
 <translation id="7882358943899516840">نوع مقدم الخدمة</translation>
 <translation id="7885253890047913815">أحدث الوجهات</translation>
@@ -4981,7 +4978,7 @@
 <translation id="8780123805589053431">‏الحصول على أوصاف الصور من Google</translation>
 <translation id="8780443667474968681">تم إيقاف ميزة البحث الصوتي.</translation>
 <translation id="878069093594050299">تم التحقق من هذه الشهادة للاستخدامات التالية:</translation>
-<translation id="8781470833671194250">تثبيت موضع النقر</translation>
+<translation id="8781470833671194250">النقر على تثبيت الموضع</translation>
 <translation id="8781980678064919987">إيقاف التشغيل عند إغلاق الغطاء</translation>
 <translation id="8782565991310229362">‏تم إلغاء تشغيل تطبيق Kiosk.</translation>
 <translation id="8783093612333542422">‏يرغب &lt;strong&gt;<ph name="SENDER" />&lt;/strong&gt; بمشاركة طابعة &lt;strong&gt;<ph name="PRINTER_NAME" />&lt;/strong&gt; معك.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 1478da7..f7c55e6 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Активиране на мобилна мрежа</translation>
 <translation id="1407489512183974736">Центриране с подрязване</translation>
 <translation id="1408504635543854729">Разгледайте съдържанието на устройството в приложението Файлове. Съдържанието е ограничено от администратор и не може да се променя.</translation>
-<translation id="1408789165795197664">Разширени...</translation>
 <translation id="1409390508152595145">Създаване на контролиран потребител</translation>
 <translation id="1410197035576869800">Икона на приложението</translation>
 <translation id="1410616244180625362">Достъпът на <ph name="HOST" /> до камерата ви да продължава да е разрешен</translation>
@@ -2657,7 +2656,6 @@
 <translation id="5184063094292164363">&amp;Конзола на JavaScript</translation>
 <translation id="5184662919967270437">Устройството ви се актуализира</translation>
 <translation id="5185386675596372454">Най-новата версия на „<ph name="EXTENSION_NAME" />“ бе деактивирана, тъй като изисква повече разрешения.</translation>
-<translation id="5187295959347858724">Вече влязохте в <ph name="SHORT_PRODUCT_NAME" />. Вашите отметки, история и други настройки се синхронизират с профила ви в Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> иска да изтегли няколко файла</translation>
 <translation id="5204673965307125349">Моля, извършете Powerwash на устройството и опитайте отново.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Препращане</translation>
 <translation id="748138892655239008">Основни ограничения на сертификата</translation>
 <translation id="7487067081878637334">Технологии</translation>
-<translation id="7487099628810939106">Забавяне преди кликване:</translation>
 <translation id="7487141338393529395">Включване на подобрената проверка на правописа</translation>
 <translation id="7487969577036436319">Няма инсталирани компоненти</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Отваряне на всички}=1{&amp;Отваряне на отметката}other{&amp;Отваряне на всички (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 929dd3f..b21755a 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">সেলুলার চালু করা</translation>
 <translation id="1407489512183974736">মাঝ খান থেকে ক্রপ করা</translation>
 <translation id="1408504635543854729">ফাইল অ্যাপে ডিভাইসের কন্টেন্ট খুঁজে দেখুন। একজন অ্যাডমিনিস্ট্রেটর কন্টেন্টটি সীমাবদ্ধ করে আছে এবং মডিফাই করা যাবে না।</translation>
-<translation id="1408789165795197664">উন্নত...</translation>
 <translation id="1409390508152595145">তত্ত্বাবধানে থাকা ব্যবহারকারী তৈরি করুন</translation>
 <translation id="1410197035576869800">অ্যাপ আইকন</translation>
 <translation id="1410616244180625362">আপনার ক্যামেরা অ্যাক্সেস করতে <ph name="HOST" /> এর মঞ্জুরি অবিরত রাখুন</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">&amp;JavaScript কনসোল</translation>
 <translation id="5184662919967270437">আপনার ডিভাইস আপডেট করা হচ্ছে</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />"-এর নতুনতম ভার্সনটি বন্ধ হয়েছে কারণ এটির আরও বেশি অনুমতির প্রয়োজন৷</translation>
-<translation id="5187295959347858724">আপনি এখন <ph name="SHORT_PRODUCT_NAME" />এ সাইন-ইন করেছেন৷ আপনার বুকমার্ক, ইতিহাস এবং অন্য সেটিংস আপনার Google অ্যাকাউন্টে সিঙ্ক করা হচ্ছে৷</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> একাধিক ফাইল ডাউনলোড করতে চায়</translation>
 <translation id="5204673965307125349">ডিভাইস পাওয়ারওয়াশ করে আবার চেষ্টা করুন।</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">ফরওয়ার্ড</translation>
 <translation id="748138892655239008">সার্টিফিকেট প্রাথমিক বাধ্যবাধকতা</translation>
 <translation id="7487067081878637334">প্রযুক্তি</translation>
-<translation id="7487099628810939106">ক্লিক করার আগে দেরি:</translation>
 <translation id="7487141338393529395">উন্নত বানান পরীক্ষা চালু করুন</translation>
 <translation id="7487969577036436319">কোন উপাদান ইনস্টল ইনস্টল নেই</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{সবগুলি &amp;খুলুন}=1{বুকমার্ক &amp;খুলুন}one{সবগুলি (#টি) &amp;খুলুন}other{সবগুলি (#টি) &amp;খুলুন}}</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 63c99f7..ff19f9f9 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Activació d'una xarxa mòbil</translation>
 <translation id="1407489512183974736">Retallat al centre</translation>
 <translation id="1408504635543854729">Explora el contingut del dispositiu a l'aplicació Fitxers. L'administrador ha restringit el contingut i no es pot modificar.</translation>
-<translation id="1408789165795197664">Configuració avançada...</translation>
 <translation id="1409390508152595145">Crea un usuari supervisat</translation>
 <translation id="1410197035576869800">Icona de l'aplicació</translation>
 <translation id="1410616244180625362">Continua permetent que <ph name="HOST" /> accedeixi a la càmera</translation>
@@ -2653,7 +2652,6 @@
 <translation id="5184063094292164363">Consola de &amp;JavaScript</translation>
 <translation id="5184662919967270437">S'està actualitzant el dispositiu</translation>
 <translation id="5185386675596372454">La darrera versió de "<ph name="EXTENSION_NAME" />" s'ha desactivat perquè necessita més permisos.</translation>
-<translation id="5187295959347858724">Ara teniu la sessió iniciada a <ph name="SHORT_PRODUCT_NAME" />. Les vostres adreces d'interès, l'historial i altres opcions de configuració s'estan sincronitzant amb el vostre compte de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vol baixar diversos fitxers</translation>
 <translation id="5204673965307125349">Fes un Powerwash del dispositiu i torna-ho a provar.</translation>
@@ -4131,7 +4129,6 @@
 <translation id="7481312909269577407">Endavant</translation>
 <translation id="748138892655239008">Restriccions bàsiques de certificats</translation>
 <translation id="7487067081878637334">Tecnologia</translation>
-<translation id="7487099628810939106">Retard abans de fer clic:</translation>
 <translation id="7487141338393529395">Activa el corrector ortogràfic millorat</translation>
 <translation id="7487969577036436319">No hi ha cap component instal·lat</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Obre-les totes}=1{&amp;Obre una adreça d'interès}other{&amp;Obre-les totes (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 56d2782..6641196 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivace mobilní sítě</translation>
 <translation id="1407489512183974736">Ořezat na střed</translation>
 <translation id="1408504635543854729">Prozkoumejte obsah zařízení v aplikaci Soubory. Přístup k obsahu je administrátorem omezen a nelze jej upravovat.</translation>
-<translation id="1408789165795197664">Rozšířená nastavení...</translation>
 <translation id="1409390508152595145">Vytvořit dozorovaného uživatele</translation>
 <translation id="1410197035576869800">Ikona aplikace</translation>
 <translation id="1410616244180625362">Povolit webu <ph name="HOST" /> přístup ke kameře i nadále</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">Konzole &amp;JavaScriptu</translation>
 <translation id="5184662919967270437">Aktualizace zařízení</translation>
 <translation id="5185386675596372454">Nejnovější verze rozšíření <ph name="EXTENSION_NAME" /> byla zakázána, protože vyžaduje další oprávnění.</translation>
-<translation id="5187295959347858724">Nyní jste přihlášeni do prohlížeče <ph name="SHORT_PRODUCT_NAME" />. Vaše záložky, historie a další nastavení se synchronizují s účtem Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> se pokouší stáhnout několik souborů</translation>
 <translation id="5204673965307125349">Vymažte zařízení pomocí funkce Powerwash a zkuste to znovu.</translation>
@@ -4130,7 +4128,6 @@
 <translation id="7481312909269577407">Vpřed</translation>
 <translation id="748138892655239008">Základní omezení certifikátu</translation>
 <translation id="7487067081878637334">Technologie</translation>
-<translation id="7487099628810939106">Zpoždění před kliknutím:</translation>
 <translation id="7487141338393529395">Zapnout vylepšenou kontrolu pravopisu</translation>
 <translation id="7487969577036436319">Nejsou nainstalovány žádné komponenty</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Otevřít vše}=1{&amp;Otevřít záložku}few{&amp;Otevřít vše (#)}many{&amp;Otevřít vše (#)}other{&amp;Otevřít vše (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 118c7b55..7ccfa55 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivering af mobildata</translation>
 <translation id="1407489512183974736">Centrér, beskær</translation>
 <translation id="1408504635543854729">Udforsk enhedens indhold i appen Filer. Indholdet er begrænset af en administrator og kan ikke redigeres.</translation>
-<translation id="1408789165795197664">Avanceret...</translation>
 <translation id="1409390508152595145">Opret administreret bruger</translation>
 <translation id="1410197035576869800">Appikon</translation>
 <translation id="1410616244180625362">Tillad fortsat, at <ph name="HOST" /> har adgang til dit kamera</translation>
@@ -786,7 +785,7 @@
 <translation id="2220529011494928058">Rapportér et problem</translation>
 <translation id="2220572644011485463">Pin- eller adgangskode</translation>
 <translation id="2224444042887712269">Denne indstilling tilhører <ph name="OWNER_EMAIL" />.</translation>
-<translation id="2224471211857467033">Handlinger foretaget i hjælpetilstand</translation>
+<translation id="2224471211857467033">Hjælpefunktioner</translation>
 <translation id="2224551243087462610">Rediger mappenavn</translation>
 <translation id="2226449515541314767">Dette website er blevet blokeret fra at have fuld kontrol over MIDI-enheder.</translation>
 <translation id="2226720438730111184">Fortæl os, hvad der sker</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-konsol</translation>
 <translation id="5184662919967270437">Opdaterer din enhed</translation>
 <translation id="5185386675596372454">Den nyeste version af "<ph name="EXTENSION_NAME" />" er blevet deaktiveret, fordi den kræver flere tilladelser.</translation>
-<translation id="5187295959347858724">Du er nu logget ind på <ph name="SHORT_PRODUCT_NAME" />. Dine bogmærker, din historik og dine andre indstillinger synkroniseres med din Google-konto.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vil downloade flere filer</translation>
 <translation id="5204673965307125349">Udfør en powerwash på enheden, og prøv igen.</translation>
@@ -4133,7 +4131,6 @@
 <translation id="7481312909269577407">Frem</translation>
 <translation id="748138892655239008">Grundlæggende begrænsninger for certifikat</translation>
 <translation id="7487067081878637334">Teknologi</translation>
-<translation id="7487099628810939106">Forsinkelse før klik:</translation>
 <translation id="7487141338393529395">Aktivér forbedret stavekontrol</translation>
 <translation id="7487969577036436319">Der er ikke installeret nogen komponenter</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Åbn alle}=1{&amp;Åbn bogmærke}one{&amp;Åbn (#)}other{&amp;Åbn alle (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index d247e15..93a169e 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -227,7 +227,7 @@
 <translation id="1340527397989195812">Sichern Sie Medien von diesem Gerät mit der App "Dateien".</translation>
 <translation id="1341988552785875222">Der aktuelle Hintergrund wurde von <ph name="APP_NAME" /> festgelegt. Sie müssen <ph name="APP_NAME" /> möglicherweise deinstallieren, bevor Sie einen anderen Hintergrund auswählen.</translation>
 <translation id="1343865611738742294">Linux-Apps erlauben, auf USB-Geräte zuzugreifen. Linux speichert keine USB-Geräte, nachdem diese entfernt wurden.</translation>
-<translation id="1347256498747320987">Updates und Apps installieren: Wenn Sie fortfahren, stimmen Sie zu, dass dieses Gerät automatisch Updates und Apps von Google, Ihrem Mobilfunkanbieter und dem Hersteller Ihres Geräts herunterladen und installieren darf, möglicherweise über eine mobile Datenverbindung. Einige dieser Apps bieten eventuell In-App-Käufe an. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
+<translation id="1347256498747320987">Updates und Apps installieren: Wenn du fortfährst, stimmst du zu, dass dieses Gerät automatisch Updates und Apps von Google, deinem Mobilfunkanbieter und dem Hersteller deines Geräts herunterladen und installieren darf, möglicherweise über eine mobile Datenverbindung. Einige dieser Apps bieten eventuell In-App-Käufe an. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
 <translation id="1347975661240122359">Das Update wird ausgeführt, sobald der Akkustand <ph name="BATTERY_LEVEL" /> % erreicht.</translation>
 <translation id="1353686479385938207"><ph name="PROVIDER_NAME" />: <ph name="NETWORK_NAME" /></translation>
 <translation id="1353980523955420967">PPD kann nicht gefunden werden. Vergewissern Sie sich, dass Ihr Chromebook online ist und versuchen Sie es noch einmal.</translation>
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Mobilfunkaktivierung</translation>
 <translation id="1407489512183974736">Zugeschnitten zentrieren</translation>
 <translation id="1408504635543854729">Sie können sich Geräteinhalte in der App "Dateien" ansehen. Die Inhalte wurden von einem Administrator schreibgeschützt und können nicht bearbeitet werden.</translation>
-<translation id="1408789165795197664">Erweitert...</translation>
 <translation id="1409390508152595145">Betreuten Nutzer erstellen</translation>
 <translation id="1410197035576869800">App-Symbol</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> weiterhin Zugriff auf Ihre Kamera gestatten</translation>
@@ -484,7 +483,7 @@
 <translation id="1744060673522309905">Das Gerät konnte der Domain nicht beitreten. Sie dürfen nicht mehr als die erlaubte Anzahl von Geräten hinzufügen.</translation>
 <translation id="1744108098763830590">Hintergrundseite</translation>
 <translation id="1745520510852184940">Immer so verfahren</translation>
-<translation id="1746402432151920942">ID für geschützte Medien</translation>
+<translation id="1746402432151920942">Kennzeichnung für geschützte Medien</translation>
 <translation id="175196451752279553">Geschlossenen Tab wieder öffn&amp;en</translation>
 <translation id="1753905327828125965">Meistbesucht</translation>
 <translation id="1756681705074952506">Eingabemethode</translation>
@@ -2653,7 +2652,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-Konsole</translation>
 <translation id="5184662919967270437">Ihr Gerät wird aktualisiert</translation>
 <translation id="5185386675596372454">Die aktuelle Version von "<ph name="EXTENSION_NAME" />" wurde deaktiviert, weil sie weitere Berechtigungen erfordert.</translation>
-<translation id="5187295959347858724">Sie sind jetzt in <ph name="SHORT_PRODUCT_NAME" /> angemeldet. Ihre Lesezeichen, der Verlauf sowie andere Einstellungen werden mit Ihrem Google-Konto synchronisiert.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> möchte mehrere Dateien herunterladen</translation>
 <translation id="5204673965307125349">Bitte führen einen Powerwash auf dem Gerät durch und versuchen Sie es noch einmal.</translation>
@@ -4129,7 +4127,6 @@
 <translation id="7481312909269577407">Vorwärts</translation>
 <translation id="748138892655239008">Basiseinschränkungen eines Zertifikats</translation>
 <translation id="7487067081878637334">Technik</translation>
-<translation id="7487099628810939106">Klickverzögerung:</translation>
 <translation id="7487141338393529395">Erweiterte Rechtschreibprüfung aktivieren</translation>
 <translation id="7487969577036436319">Es sind keine Komponenten installiert.</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Alle &amp;öffnen}=1{Lesezeichen &amp;öffnen}other{Alle (#) &amp;öffnen}}</translation>
@@ -5186,7 +5183,7 @@
 <translation id="9101691533782776290">App starten</translation>
 <translation id="9102610709270966160">Erweiterung aktivieren</translation>
 <translation id="9103868373786083162">Drücken, um zurückzugehen. Kontextmenü, um Verlauf aufzurufen</translation>
-<translation id="9104396740804929809">Sie haben die Möglichkeit, Nutzungs- und Diagnosedaten zu senden. Sie können uns helfen, Android zu verbessern, indem Sie zulassen, dass Diagnose- sowie Geräte- und App-Nutzungsdaten automatisch an Google gesendet werden. Die Daten helfen unter anderem dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Diese Einstellung wird vom Inhaber erzwungen. Der Inhaber kann festlegen, ob Diagnose- und Nutzungsdaten von diesem Gerät an Google gesendet werden. Wenn zusätzlich die Einstellung "Web- &amp; App-Aktivitäten" aktiviert ist, werden diese Daten eventuell in Ihrem Google-Konto gespeichert. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
+<translation id="9104396740804929809">Du hast die Möglichkeit, Nutzungs- und Diagnosedaten zu senden. Du kannst uns helfen, Android zu verbessern, indem du zulässt, dass Diagnose- sowie Geräte- und App-Nutzungsdaten automatisch an Google gesendet werden. Die Daten helfen unter anderem dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Diese Einstellung wird vom Inhaber erzwungen. Der Inhaber kann festlegen, ob Diagnose- und Nutzungsdaten von diesem Gerät an Google gesendet werden. Wenn zusätzlich die Einstellung "Web- &amp; App-Aktivitäten" aktiviert ist, werden diese Daten eventuell in deinem Google-Konto gespeichert. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
 <translation id="9109122242323516435">Löschen Sie Dateien aus dem Gerätespeicher, um Speicherplatz freizugeben.</translation>
 <translation id="9111102763498581341">Entsperren</translation>
 <translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index e096fea..b66ce3cb 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Ενεργοποίηση δικτύου κινητής τηλεφωνίας</translation>
 <translation id="1407489512183974736">Περικοπή στο κέντρο</translation>
 <translation id="1408504635543854729">Εξερευνήστε το περιεχόμενο της συσκευής στην εφαρμογή "Αρχεία". Το περιεχόμενο περιορίζεται από κάποιον διαχειριστή και δεν είναι δυνατή η τροποποίησή του.</translation>
-<translation id="1408789165795197664">Για προχωρημένους...</translation>
 <translation id="1409390508152595145">Δημιουργία εποπτευόμενου χρήστη</translation>
 <translation id="1410197035576869800">Εικονίδιο εφαρμογής</translation>
 <translation id="1410616244180625362">Να συνεχίσει να επιτρέπεται στο <ph name="HOST" /> η πρόσβαση στην κάμερά σας</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Κονσόλα &amp;JavaScript</translation>
 <translation id="5184662919967270437">Ενημέρωση της συσκευής σας</translation>
 <translation id="5185386675596372454">Η τελευταία έκδοση του " <ph name="EXTENSION_NAME" /> "έχει απενεργοποιηθεί, επειδή απαιτούνται περισσότερα δικαιώματα.</translation>
-<translation id="5187295959347858724">Είστε πλέον συνδεδεμένοι στο <ph name="SHORT_PRODUCT_NAME" />. Οι σελιδοδείκτες, το ιστορικό και διάφορες άλλες ρυθμίσεις συγχρονίζονται με τον Λογαριασμό σας Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Ο ιστότοπος <ph name="ORIGIN" /> θέλει να κατεβάσει πολλά αρχεία</translation>
 <translation id="5204673965307125349">Κάντε powerwash στη συσκευή και δοκιμάστε ξανά.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">Προώθηση</translation>
 <translation id="748138892655239008">Βασικοί περιορισμοί πιστοποιητικού</translation>
 <translation id="7487067081878637334">Τεχνολογία</translation>
-<translation id="7487099628810939106">Καθυστέρηση πριν από το κλικ:</translation>
 <translation id="7487141338393529395">Ενεργοποίηση βελτιωμένου ορθογραφικού ελέγχου</translation>
 <translation id="7487969577036436319">Δεν έχουν εγκατασταθεί στοιχεία</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Άνοιγμα όλων}=1{&amp;Άνοιγμα σελιδοδείκτη}other{&amp;Άνοιγμα όλων (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index b816178a..b4e2668 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -238,6 +238,7 @@
 <translation id="1361655923249334273">Unused</translation>
 <translation id="1361872463926621533">Play sound on startup</translation>
 <translation id="1364702626840264065">{NUM_TABS,plural, =1{Close tab}other{Close tabs}}</translation>
+<translation id="1365180424462182382">Your <ph name="BEGIN_LINK" />browser is managed<ph name="END_LINK" /> by <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1366177842110999534">Run Linux tools, editors and IDEs on your <ph name="DEVICE_TYPE" />. &lt;a target="_blank" href="<ph name="URL" />"&gt;Find out more&lt;/a&gt;</translation>
 <translation id="1367951781824006909">Choose a file</translation>
 <translation id="1371301976177520732">Your bookmarks, passwords, history and more on all your devices</translation>
@@ -265,7 +266,6 @@
 <translation id="140723521119632973">Mobile activation</translation>
 <translation id="1407489512183974736">Centre Cropped</translation>
 <translation id="1408504635543854729">Explore the device's content in the Files app. The content is restricted by an admin and can’t be modified.</translation>
-<translation id="1408789165795197664">Advanced...</translation>
 <translation id="1409390508152595145">Create supervised user</translation>
 <translation id="1410197035576869800">App Icon</translation>
 <translation id="1410616244180625362">Continue allowing <ph name="HOST" /> to access your camera</translation>
@@ -471,6 +471,7 @@
 <translation id="1719312230114180055">Note: Your fingerprint may be less secure than a strong password or PIN.</translation>
 <translation id="1720318856472900922">TLS WWW Server Authentication</translation>
 <translation id="1721937473331968728">You can add classic printers connected to your computer to <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="1722460139690167654">Your <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> is managed<ph name="END_LINK" /> by <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1723824996674794290">&amp;New window</translation>
 <translation id="1725149567830788547">Show &amp;Controls</translation>
 <translation id="1726100011689679555">Name servers</translation>
@@ -487,7 +488,8 @@
 <translation id="1744060673522309905">Can't join the device to the domain. Make sure that you haven’t exceeded the number of devices that you can add.</translation>
 <translation id="1744108098763830590">background page</translation>
 <translation id="1745520510852184940">Always Do This</translation>
-<translation id="1746402432151920942">Protected Media Identifier</translation>
+<translation id="174617397682753897">Kerberos accounts</translation>
+<translation id="1746402432151920942">Protected media identifier</translation>
 <translation id="175196451752279553">R&amp;eopen closed tab</translation>
 <translation id="1753905327828125965">Most Visited</translation>
 <translation id="1756681705074952506">Input method</translation>
@@ -545,7 +547,7 @@
 <translation id="1830550083491357902">Not signed in</translation>
 <translation id="1832511806131704864">Phone change updated</translation>
 <translation id="1834503245783133039">Download unsuccessful: <ph name="FILE_NAME" /></translation>
-<translation id="1834583737373831634">MIDI Devices</translation>
+<translation id="1834583737373831634">MIDI devices</translation>
 <translation id="1838374766361614909">Clear search</translation>
 <translation id="1841545962859478868">The device admin may monitor the following:</translation>
 <translation id="1841616161104323629">Missing device record.</translation>
@@ -789,10 +791,11 @@
 <translation id="2220529011494928058">Report an issue</translation>
 <translation id="2220572644011485463">PIN or password</translation>
 <translation id="2224444042887712269">This setting belongs to <ph name="OWNER_EMAIL" />.</translation>
-<translation id="2224471211857467033">Accessibility Events</translation>
+<translation id="2224471211857467033">Accessibility events</translation>
 <translation id="2224551243087462610">Edit folder name</translation>
 <translation id="2226449515541314767">This site has been blocked from having full control of MIDI devices.</translation>
 <translation id="2226720438730111184">Tell us what's happening</translation>
+<translation id="2227179592712503583">Remove suggestion</translation>
 <translation id="2229161054156947610">More than 1 hour left</translation>
 <translation id="222931766245975952">File truncated</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -807,6 +810,7 @@
 <translation id="2241634353105152135">Just once</translation>
 <translation id="2242687258748107519">File Info</translation>
 <translation id="2246549592927364792">Get image descriptions from Google?</translation>
+<translation id="2249269794707377949">All Kerberos accounts for single sign-on into certain apps and websites and file shares can be managed here.</translation>
 <translation id="224940702122312781">This page will use a lot of data.</translation>
 <translation id="2249605167705922988">e.g. 1-5, 8, 11-13</translation>
 <translation id="2251218783371366160">Open with system viewer</translation>
@@ -869,6 +873,7 @@
 <translation id="2342740338116612727">Bookmarks added</translation>
 <translation id="2343747224442182863">Focus This Tab</translation>
 <translation id="2344028582131185878">Automatic downloads</translation>
+<translation id="2345574157728712751">Allow Play Store applications to access this device via Settings.</translation>
 <translation id="2345723121311404059">1 page to <ph name="PRINTER_NAME" /></translation>
 <translation id="2347644257713614136">Use of Hangouts and Cast for Education is governed by the Google Privacy Policy.</translation>
 <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation>
@@ -1032,6 +1037,7 @@
 <translation id="2588636910004461974">Devices from <ph name="VENDOR_NAME" /></translation>
 <translation id="258932246702879617">Select <ph name="BEGIN_BOLD" />Pin to taskbar<ph name="END_BOLD" /></translation>
 <translation id="2594999711683503743">Search Google or type URL</translation>
+<translation id="2597521610396315071">Add supervision</translation>
 <translation id="2603115962224169880">Clean up computer</translation>
 <translation id="2603463522847370204">Open in &amp;Incognito window</translation>
 <translation id="2604255671529671813">Network connection error</translation>
@@ -1251,6 +1257,7 @@
 <translation id="2916073183900451334">Pressing Tab on a web page highlights links, as well as form fields</translation>
 <translation id="2916745397441987255">Search extensions</translation>
 <translation id="2921081876747860777">Please create a password to protect your local data.</translation>
+<translation id="2923234477033317484">Remove this account</translation>
 <translation id="2926085873880284723">Restore default shortcuts</translation>
 <translation id="2927017729816812676">Cache Storage</translation>
 <translation id="2932085390869194046">Suggest password...</translation>
@@ -1824,6 +1831,7 @@
 <translation id="381202950560906753">Add another</translation>
 <translation id="3812525830114410218">Bad certificate</translation>
 <translation id="3813296892522778813">Go to <ph name="BEGIN_LINK_CHROMIUM" />Google Chrome help<ph name="END_LINK_CHROMIUM" /> if you can't find what you're looking for</translation>
+<translation id="3816118180265633665">Chrome colours</translation>
 <translation id="3817579325494460411">Not provided</translation>
 <translation id="3819257035322786455">Back Up</translation>
 <translation id="3819261658055281761">The system failed to store the long-term API access token for this device.</translation>
@@ -1948,6 +1956,7 @@
 <translation id="3982375475032951137">Set up your browser in a few simple steps</translation>
 <translation id="3983400541576569538">Data from some apps may be lost</translation>
 <translation id="3983586614702900908">devices from an unknown vendor</translation>
+<translation id="3983764759749072418">Play Store applications have access to this device.</translation>
 <translation id="3984159763196946143">Couldn't start demo mode</translation>
 <translation id="3984431586879874039">Allow this site to see your security key?</translation>
 <translation id="3987938432087324095">Sorry, didn't catch that.</translation>
@@ -2062,6 +2071,7 @@
 <translation id="4159681666905192102">This is an account for kids managed by <ph name="CUSTODIAN_EMAIL" /> and <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation>
 <translation id="4163560723127662357">Unknown keyboard</translation>
 <translation id="4168015872538332605">Some settings belonging to <ph name="PRIMARY_EMAIL" /> are being shared with you. These settings only affect your account when using multiple sign-in.</translation>
+<translation id="4169535189173047238">Don't allow</translation>
 <translation id="4170314459383239649">Clear On Exit</translation>
 <translation id="4172051516777682613">Always show</translation>
 <translation id="4175737294868205930">Persistent storage</translation>
@@ -2221,6 +2231,7 @@
 <translation id="4453946976636652378">Search <ph name="SEARCH_ENGINE_NAME" /> or type a URL</translation>
 <translation id="4462159676511157176">Custom name servers</translation>
 <translation id="4469477701382819144">Blocked on sites that show intrusive or misleading ads</translation>
+<translation id="4470957202018033307">External storage preferences</translation>
 <translation id="447252321002412580">Help improve Chrome's features and performance</translation>
 <translation id="4472575034687746823">Get started</translation>
 <translation id="4474155171896946103">Bookmark all tabs...</translation>
@@ -2577,6 +2588,7 @@
 <translation id="504561833207953641">Opening in existing browser session.</translation>
 <translation id="5047421709274785093">Block sites from using motion and light sensors</translation>
 <translation id="5050042263972837708">Group name</translation>
+<translation id="5051836348807686060">Spellcheck isn’t supported for the languages that you have selected</translation>
 <translation id="5052499409147950210">Edit site</translation>
 <translation id="5053604404986157245">The randomly generated TPM password is not available. This is normal after a Powerwash.</translation>
 <translation id="5057110919553308744">When you click the extension</translation>
@@ -2657,9 +2669,9 @@
 <translation id="5184063094292164363">&amp;JavaScript Console</translation>
 <translation id="5184662919967270437">Updating your device</translation>
 <translation id="5185386675596372454">The newest version of "<ph name="EXTENSION_NAME" />" has been disabled because it requires more permissions.</translation>
-<translation id="5187295959347858724">You're now signed in to <ph name="SHORT_PRODUCT_NAME" />. Your bookmarks, history and other settings are being synced to your Google Account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> wants to download multiple files</translation>
+<translation id="5202089186707505116">Allow this site to access your VR sensors?</translation>
 <translation id="5204673965307125349">Please powerwash the device and try again.</translation>
 <translation id="5204967432542742771">Enter password</translation>
 <translation id="5206215183583316675">Delete "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -2755,6 +2767,7 @@
 <translation id="5331975486040154427">USB-C device (left side back port)</translation>
 <translation id="5334142896108694079">Script Cache</translation>
 <translation id="5336126339807372270">Do not allow any sites to access USB devices</translation>
+<translation id="5336688142483283574">This page will also be removed from your history and <ph name="SEARCH_ENGINE" /> activity.</translation>
 <translation id="5337771866151525739">Installed by a third party.</translation>
 <translation id="5338503421962489998">Local storage</translation>
 <translation id="5340638867532133571">Allow sites to install payment handlers (recommended)</translation>
@@ -2873,6 +2886,7 @@
 <translation id="5518584115117143805">Email Encryption Certificate</translation>
 <translation id="5521078259930077036">Is this the home page that you were expecting?</translation>
 <translation id="5522156646677899028">This extension contains a serious security vulnerability.</translation>
+<translation id="5523201311986093262">Backgrounds</translation>
 <translation id="5525677322972469346">Create a new supervised user</translation>
 <translation id="5526701598901867718">All (insecure)</translation>
 <translation id="5526745900034778153">Sign in again to resume sync</translation>
@@ -3975,6 +3989,7 @@
 <translation id="7230787553283372882">Customise your text size</translation>
 <translation id="7232750842195536390">Renaming failed</translation>
 <translation id="7235716375204803342">Fetching activities...</translation>
+<translation id="7235737137505019098">Your security key does not have enough space for any more accounts.</translation>
 <translation id="7238585580608191973">SHA-256 Fingerprint</translation>
 <translation id="7240120331469437312">Certificate Subject Alternative Name</translation>
 <translation id="7240339475467890413">Connect to new hotspot?</translation>
@@ -3991,6 +4006,7 @@
 <translation id="7254951428499890870">Are you sure that you want to launch "<ph name="APP_NAME" />" in diagnostic mode?</translation>
 <translation id="7255002516883565667">At the moment, you have one card that can only be used on this device</translation>
 <translation id="7255220508626648026">Casting: <ph name="ROUTETITLE" /></translation>
+<translation id="7255916308560539517">Touch your security key again to confirm reset. All information stored on the security key, including its PIN, will be erased.</translation>
 <translation id="7255935316994522020">Apply</translation>
 <translation id="7256069762010468647">Site is using your camera</translation>
 <translation id="7256405249507348194">Unrecognised error: <ph name="DESC" /></translation>
@@ -4026,6 +4042,7 @@
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{This application could prevent Chrome from working properly.}other{These applications could prevent Chrome from working properly.}}</translation>
 <translation id="7303281435234579599">Oops! Something went wrong while setting up demo mode.</translation>
 <translation id="7303900363563182677">This site has been blocked from seeing text and images copied to the clipboard</translation>
+<translation id="7305123176580523628">USB printer connected</translation>
 <translation id="730515362922783851">Exchange data with any device on the local network or Internet</translation>
 <translation id="7307129035224081534">Paused</translation>
 <translation id="7308002049209013926">Use the Launcher to quickly get to new apps and activities. To get here by keyboard, press Alt + Shift + L.</translation>
@@ -4133,7 +4150,6 @@
 <translation id="7481312909269577407">Forward</translation>
 <translation id="748138892655239008">Certificate Basic Constraints</translation>
 <translation id="7487067081878637334">Technology</translation>
-<translation id="7487099628810939106">Delay before click:</translation>
 <translation id="7487141338393529395">Turn on Enhanced Spell Check</translation>
 <translation id="7487969577036436319">No components are installed</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Open all}=1{&amp;Open bookmark}other{&amp;Open all (#)}}</translation>
@@ -4150,6 +4166,7 @@
 <translation id="7502658306369382406">IPv6 address</translation>
 <translation id="7503191893372251637">Netscape Certificate Type</translation>
 <translation id="7503821294401948377">Could not load icon '<ph name="ICON" />' for browser action.</translation>
+<translation id="7503985202154027481">A record of your visit to this site will be kept on your security key.</translation>
 <translation id="750509436279396091">Open downloads folder</translation>
 <translation id="7506541170099744506">Your <ph name="DEVICE_TYPE" /> has successfully been enrolled for enterprise management.</translation>
 <translation id="7507930499305566459">Status Responder Certificate</translation>
@@ -4162,6 +4179,7 @@
 <translation id="7529411698175791732">Check your Internet connection. If the problem continues, try signing out and signing in again.</translation>
 <translation id="7530016656428373557">Discharge Rate in Watts</translation>
 <translation id="7531779363494549572">Go to Settings &gt; Apps &amp; notifications &gt; Notifications.</translation>
+<translation id="7536220825385726660">Allow Play Store applications to access external drives</translation>
 <translation id="7537601449003285327">Pin to taskbar</translation>
 <translation id="7539856059004947393">Bluetooth security key</translation>
 <translation id="7540972813190816353">An error occurred while checking for updates: <ph name="ERROR" /></translation>
@@ -4191,6 +4209,7 @@
 <translation id="7574650250151586813">To type text, update the Daydream Keyboard app</translation>
 <translation id="7576690715254076113">Collate</translation>
 <translation id="7576976045740938453">A problem with demo mode account occurred.</translation>
+<translation id="757941033127302446">Signed in</translation>
 <translation id="7580671184200851182">Play the same audio through all speakers (mono audio)</translation>
 <translation id="7581462281756524039">A cleanup tool</translation>
 <translation id="7582582252461552277">Prefer this network</translation>
@@ -4248,6 +4267,7 @@
 <translation id="7665369617277396874">Add account</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Incorrect PIN. You have one attempt remaining.}other{Incorrect PIN. You have # attempts remaining.}}</translation>
 <translation id="7671130400130574146">Use system title bar and borders</translation>
+<translation id="767127784612208024">Touch to confirm reset</translation>
 <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, in <ph name="PAGE_TITLE" />.</translation>
 <translation id="7676867886086876795">Send your voice to Google to allow dictation into any text field.</translation>
 <translation id="7678280409648629969">Sign-in data will be stored in Chrome after you exit Incognito mode. This will let you use Touch ID with this website again later.</translation>
@@ -4434,6 +4454,7 @@
 <translation id="7925247922861151263">AAA check failed</translation>
 <translation id="7925285046818567682">Waiting for <ph name="HOST_NAME" />...</translation>
 <translation id="7926423016278357561">This wasn't me.</translation>
+<translation id="7928836894214140642">Managed by <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="7930294771522048157">Saved payment methods will appear here</translation>
 <translation id="79312157130859720"><ph name="APP_NAME" /> is sharing your screen and audio.</translation>
 <translation id="7931318309563332511">Unknown</translation>
@@ -4461,6 +4482,7 @@
 <translation id="7959074893852789871">The file contained multiple certificates, some of which were not imported:</translation>
 <translation id="7961015016161918242">Never</translation>
 <translation id="7963826112438303517">Your Assistant uses these recordings and your spoken requests to create and update your voice model, which is only stored on devices where you've turned on Voice Match. View or retrain voice activity in Assistant Settings.</translation>
+<translation id="796416202355062143"><ph name="ORIGIN" /> wants to scan for nearby Bluetooth devices. The following devices have been found:</translation>
 <translation id="7966241909927244760">C&amp;opy Image Address</translation>
 <translation id="7968742106503422125">Read and modify data that you copy and paste</translation>
 <translation id="7968833647796919681">Enable performance data collection</translation>
@@ -4560,11 +4582,13 @@
     <ph name="BEGIN_PARAGRAPH4" />Backup data will not count toward your Drive storage quota.<ph name="END_PARAGRAPH4" />
     <ph name="BEGIN_PARAGRAPH5" />You can turn this service off in Settings.<ph name="END_PARAGRAPH5" /></translation>
 <translation id="80974698889265265">PINs do not match</translation>
+<translation id="8099495042588009598">More permissions</translation>
 <translation id="8101987792947961127">Powerwash required on next reboot</translation>
 <translation id="8102159139658438129">Go to <ph name="LINK_BEGIN" />Settings<ph name="LINK_END" /> to see options for your connected phone</translation>
 <translation id="8104696615244072556">Powerwash your <ph name="IDS_SHORT_PRODUCT_NAME" /> device and return to the previous version.</translation>
 <translation id="8105368624971345109">Turn Off</translation>
 <translation id="8107015733319732394">Installing the Google Play Store on your <ph name="DEVICE_TYPE" />. This could take a few minutes.</translation>
+<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="8116972784401310538">&amp;Bookmark manager</translation>
@@ -4714,6 +4738,7 @@
 <translation id="8363095875018065315">stable</translation>
 <translation id="8363142353806532503">Microphone blocked</translation>
 <translation id="8366396658833131068">Your network connectivity is restored. Please select a different network or press 'Continue' button below to launch your kiosk app.</translation>
+<translation id="8368027906805972958">Unknown or unsupported device (<ph name="DEVICE_ID" />)</translation>
 <translation id="8368859634510605990">&amp;Open all bookmarks</translation>
 <translation id="8371695176452482769">Speak now</translation>
 <translation id="8371925839118813971">{NUM_TABS,plural, =1{Mute Site}other{Mute Sites}}</translation>
@@ -4913,6 +4938,7 @@
 <translation id="8678648549315280022">Manage download settings...</translation>
 <translation id="8678933587484842200">How would you like this application to launch?</translation>
 <translation id="8680251145628383637">Sign in to get your bookmarks, history, passwords and other settings on all your devices. You'll also automatically be signed in to your Google services.</translation>
+<translation id="8682730193597992579"><ph name="PRINTER_NAME" /> is connected and ready</translation>
 <translation id="8688579245973331962">Don't see your name?</translation>
 <translation id="8688591111840995413">Bad password</translation>
 <translation id="8688672835843460752">Available</translation>
@@ -5066,6 +5092,7 @@
 <translation id="8898840733695078011">Signal strength</translation>
 <translation id="8899851313684471736">Open link in new &amp;window</translation>
 <translation id="8902667442496790482">Open Select to Speak settings</translation>
+<translation id="8903263458134414071">Select an account to sign in</translation>
 <translation id="8904976895050290827">Chrome Sync</translation>
 <translation id="890616557918890486">Change source</translation>
 <translation id="8909833622202089127">Site is tracking your location</translation>
@@ -5152,6 +5179,7 @@
 <translation id="9040661932550800571">Update password for <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Access to local files on your machine is disabled by your administrator</translation>
 <translation id="9041909613332246191">This file is not commonly downloaded and may be dangerous. You're defended by Advanced Protection.</translation>
+<translation id="9042858701776831292">Google Play Store applications may require access to external storage devices in order to read and write files and folders on them.</translation>
 <translation id="9042893549633094279">Privacy and security</translation>
 <translation id="904451693890288097">Please enter the passkey for "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9044646465488564462">Failed to connect to network: <ph name="DETAILS" /></translation>
@@ -5211,6 +5239,7 @@
 <translation id="9137916601698928395">Open link as <ph name="USER" /></translation>
 <translation id="9138978632494473300">Add shortcuts to the following places:</translation>
 <translation id="9140067245205650184">You are using an unsupported feature flag: <ph name="BAD_FLAG" />. Stability and security will suffer.</translation>
+<translation id="9143298529634201539">Remove suggestion?</translation>
 <translation id="9147304170847707004">Authentication Method</translation>
 <translation id="9147392381910171771">&amp;Options</translation>
 <translation id="9148058034647219655">Exit</translation>
@@ -5225,6 +5254,7 @@
 <translation id="916607977885256133">Picture in Picture</translation>
 <translation id="9168436347345867845">Do it later</translation>
 <translation id="9169496697824289689">View keyboard shortcuts</translation>
+<translation id="916964310188958970">Why this suggestion?</translation>
 <translation id="9169931577761441333">Add <ph name="APP_NAME" /> to Home screen</translation>
 <translation id="9170848237812810038">&amp;Undo</translation>
 <translation id="9170884462774788842">Another programme on your computer added a theme that may change the way Chrome works.</translation>
@@ -5235,6 +5265,7 @@
 <translation id="9179734824669616955">Set up Linux (Beta) on your <ph name="DEVICE_TYPE" /></translation>
 <translation id="9180281769944411366">This process may take a few minutes. Starting the Linux container.</translation>
 <translation id="9180380851667544951">Site can share your screen</translation>
+<translation id="9185926955514281189">Colours and themes</translation>
 <translation id="9188441292293901223">Please update your phone to a newer version of Android to unlock this <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9188732951356337132">Send usage and diagnostic data. This device is currently 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. 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>
 <translation id="9190063653747922532">L2TP/IPSec + Preshared key</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 017a06e..330b791e 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Activación del teléfono celular</translation>
 <translation id="1407489512183974736">Centrar imagen recortada</translation>
 <translation id="1408504635543854729">Explora el contenido del dispositivo en la app de Archivos. Un administrador restringió el contenido, por lo que no puede modificarse.</translation>
-<translation id="1408789165795197664">Avanzado...</translation>
 <translation id="1409390508152595145">Crear usuario supervisado</translation>
 <translation id="1410197035576869800">Ícono de la app</translation>
 <translation id="1410616244180625362">Seguir permitiendo que <ph name="HOST" /> acceda a la cámara</translation>
@@ -2655,7 +2654,6 @@
 <translation id="5184063094292164363">&amp;Consola de JavaScript</translation>
 <translation id="5184662919967270437">Actualizando tu dispositivo</translation>
 <translation id="5185386675596372454">Se ha desactivado la versión más reciente de "<ph name="EXTENSION_NAME" />" porque requiere más permisos.</translation>
-<translation id="5187295959347858724">Accediste a <ph name="SHORT_PRODUCT_NAME" />. Tus favoritos, historial y demás parámetros de configuración se están sincronizando con tu cuenta de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> quiere descargar varios archivos</translation>
 <translation id="5204673965307125349">Aplica la función "Powerwash" en el dispositivo y vuelve a intentarlo.</translation>
@@ -4131,7 +4129,6 @@
 <translation id="7481312909269577407">Reenviar</translation>
 <translation id="748138892655239008">Restricciones básicas del certificado</translation>
 <translation id="7487067081878637334">Tecnología</translation>
-<translation id="7487099628810939106">Demora antes de hacer clic:</translation>
 <translation id="7487141338393529395">Activa el corrector ortográfico mejorado</translation>
 <translation id="7487969577036436319">No hay componentes instalados.</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Abrir todo}=1{&amp;Abrir favorito}other{&amp;Abrir todo (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 0c8743f..bb33d6d 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Activación de datos móviles</translation>
 <translation id="1407489512183974736">Centrar imagen recortada</translation>
 <translation id="1408504635543854729">Explora el contenido del dispositivo en la aplicación Archivos. Un administrador ha restringido el contenido y este no se puede modificar.</translation>
-<translation id="1408789165795197664">Configuración avanzada</translation>
 <translation id="1409390508152595145">Crear usuario supervisado</translation>
 <translation id="1410197035576869800">Icono de la aplicación</translation>
 <translation id="1410616244180625362">Seguir permitiendo que <ph name="HOST" /> acceda a la cámara</translation>
@@ -2655,7 +2654,6 @@
 <translation id="5184063094292164363">&amp;Consola JavaScript</translation>
 <translation id="5184662919967270437">Actualizando el dispositivo</translation>
 <translation id="5185386675596372454">Se ha inhabilitado la versión más reciente de "<ph name="EXTENSION_NAME" />" porque requiere más permisos.</translation>
-<translation id="5187295959347858724">Has iniciado sesión en <ph name="SHORT_PRODUCT_NAME" />. Tus marcadores, tu historial y otros ajustes se están sincronizando con tu cuenta de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> quiere descargar varios archivos</translation>
 <translation id="5204673965307125349">Realiza un powerwash e inténtalo de nuevo.</translation>
@@ -4131,7 +4129,6 @@
 <translation id="7481312909269577407">Adelante</translation>
 <translation id="748138892655239008">Restricciones básicas del certificado</translation>
 <translation id="7487067081878637334">Tecnología</translation>
-<translation id="7487099628810939106">Pausa antes del clic:</translation>
 <translation id="7487141338393529395">Activa la revisión ortográfica mejorada</translation>
 <translation id="7487969577036436319">No hay componentes instalados</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Abrir todas}=1{&amp;Abrir marcador}other{&amp;Abrir (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index a1d0ab8d..299a8756 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -238,6 +238,7 @@
 <translation id="1361655923249334273">Kasutamata</translation>
 <translation id="1361872463926621533">Esita käivitamisel heli</translation>
 <translation id="1364702626840264065">{NUM_TABS,plural, =1{Sule vaheleht}other{Sule vahelehed}}</translation>
+<translation id="1365180424462182382">Teie<ph name="BEGIN_LINK" /> brauserit haldab<ph name="END_LINK" /> <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1366177842110999534">Saate oma seadmes <ph name="DEVICE_TYPE" /> käitada Linuxi tööriistu, redaktoreid ja IDE-sid. &lt;a target="_blank" href="<ph name="URL" />"&gt;Lisateave&lt;/a&gt;</translation>
 <translation id="1367951781824006909">Vali fail</translation>
 <translation id="1371301976177520732">Teie järjehoidjad, paroolid, ajalugu ja muu kõigis teie seadmetes</translation>
@@ -265,7 +266,6 @@
 <translation id="140723521119632973">Mobiilsidevõrgu aktiveerimine</translation>
 <translation id="1407489512183974736">Keskel, kärbitud</translation>
 <translation id="1408504635543854729">Avastage seadme sisu rakenduses Failid. Sisu piirab administraator ja seda ei saa muuta.</translation>
-<translation id="1408789165795197664">Täpsem ...</translation>
 <translation id="1409390508152595145">Jälgitava kasutaja loomine</translation>
 <translation id="1410197035576869800">Rakenduse ikoon</translation>
 <translation id="1410616244180625362">Luba saidil <ph name="HOST" /> ka edaspidi kaamera juurde pääseda</translation>
@@ -471,6 +471,7 @@
 <translation id="1719312230114180055">Märkus. Sõrmejälg võib olla vähem turvaline kui tugev parool või PIN-kood.</translation>
 <translation id="1720318856472900922">TLS WWW serveri autentimine</translation>
 <translation id="1721937473331968728">Saate ühendada teenusega <ph name="CLOUD_PRINT_NAME" /> teie arvutiga ühendatud tavaprintereid.</translation>
+<translation id="1722460139690167654">Teie seadet <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> haldab<ph name="END_LINK" /> <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1723824996674794290">&amp;Uus aken</translation>
 <translation id="1725149567830788547">Kuva &amp;juhtelemente</translation>
 <translation id="1726100011689679555">Nimeserverid</translation>
@@ -487,6 +488,7 @@
 <translation id="1744060673522309905">Seadet ei saa domeeniga liita. Veenduge, et lisatavate seadmete maksimumarv ei oleks ületatud.</translation>
 <translation id="1744108098763830590">taustleht</translation>
 <translation id="1745520510852184940">Tee seda alati</translation>
+<translation id="174617397682753897">Kerberose kontod</translation>
 <translation id="1746402432151920942">Kaitstud meedia identifikaator</translation>
 <translation id="175196451752279553">&amp;Ava suletud vaheleht uuesti</translation>
 <translation id="1753905327828125965">Enim külastatud</translation>
@@ -793,6 +795,7 @@
 <translation id="2224551243087462610">Muuda kausta nime</translation>
 <translation id="2226449515541314767">Saidil pole lubatud MIDI-seadmeid täielikult juhtida.</translation>
 <translation id="2226720438730111184">Andke meile teada, mis toimub</translation>
+<translation id="2227179592712503583">Eemalda soovitus</translation>
 <translation id="2229161054156947610">Jäänud on rohkem kui 1 tund</translation>
 <translation id="222931766245975952">Fail on kärbitud</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -807,6 +810,7 @@
 <translation id="2241634353105152135">Ainult ühe korra</translation>
 <translation id="2242687258748107519">Faili teave</translation>
 <translation id="2246549592927364792">Kas hankida Google'ist piltide kirjeldused?</translation>
+<translation id="2249269794707377949">Siin saab hallata kõiki Kerberose kontosid, millega saab ühekordse sisselogimisega kasutada teatud rakendusi ja veebisaite.</translation>
 <translation id="224940702122312781">See leht kasutab palju andmemahtu.</translation>
 <translation id="2249605167705922988">nt 1–5, 8, 11–13</translation>
 <translation id="2251218783371366160">Ava süsteemivaaturiga</translation>
@@ -869,6 +873,7 @@
 <translation id="2342740338116612727">Järjehoidjad on lisatud</translation>
 <translation id="2343747224442182863">Tõsta see vaheleht esile</translation>
 <translation id="2344028582131185878">Automaatsed allalaadimised</translation>
+<translation id="2345574157728712751">Andke menüüs Seaded Play poe rakendustele juurdepääs sellele seadmele.</translation>
 <translation id="2345723121311404059">Üks leht printerisse <ph name="PRINTER_NAME" /></translation>
 <translation id="2347644257713614136">Hangoutsi ja Cast for Educationi kasutamisel kehtivad Google'i privaatsuseeskirjad.</translation>
 <translation id="2348176352564285430">Rakendus: <ph name="ARC_PROCESS_NAME" /></translation>
@@ -1033,6 +1038,7 @@
 <translation id="2588636910004461974">Seadmed teenusepakkujalt <ph name="VENDOR_NAME" /></translation>
 <translation id="258932246702879617">Valige käsk <ph name="BEGIN_BOLD" />Kinnita tegumiribale<ph name="END_BOLD" /></translation>
 <translation id="2594999711683503743">Otsige Google'ist või sisestage URL</translation>
+<translation id="2597521610396315071">Järelevalve lisamine</translation>
 <translation id="2603115962224169880">Puhasta arvuti</translation>
 <translation id="2603463522847370204">Ava &amp;inkognito aknas</translation>
 <translation id="2604255671529671813">Võrguühenduse viga</translation>
@@ -1252,6 +1258,7 @@
 <translation id="2916073183900451334">Veebilehel tabeldusklahvi vajutades tõstetakse esile lingid ja ka vormiväljad</translation>
 <translation id="2916745397441987255">Otsige laiendusi</translation>
 <translation id="2921081876747860777">Looge parool, et oma kohalikke andmeid kaitsta.</translation>
+<translation id="2923234477033317484">Eemalda see konto</translation>
 <translation id="2926085873880284723">Vaikeotseteede taastamine</translation>
 <translation id="2927017729816812676">Vahemälu</translation>
 <translation id="2932085390869194046">Soovita parooli …</translation>
@@ -1825,6 +1832,7 @@
 <translation id="381202950560906753">Lisa veel üks</translation>
 <translation id="3812525830114410218">Halb sertifikaat</translation>
 <translation id="3813296892522778813">Kui te ei leia otsitavat, avage <ph name="BEGIN_LINK_CHROMIUM" />Google Chrome'i abi<ph name="END_LINK_CHROMIUM" /></translation>
+<translation id="3816118180265633665">Chrome'i värvid</translation>
 <translation id="3817579325494460411">Puudub</translation>
 <translation id="3819257035322786455">Varundamine</translation>
 <translation id="3819261658055281761">Süsteemil ei õnnestunud selle seadme pikaajalist API juurdepääsuluba salvestada.</translation>
@@ -1949,6 +1957,7 @@
 <translation id="3982375475032951137">Seadistage brauser vaid mõne lihtsa sammuga</translation>
 <translation id="3983400541576569538">Mõnede rakenduste andmed võivad kaotsi minna</translation>
 <translation id="3983586614702900908">tundmatu müüja seadmed</translation>
+<translation id="3983764759749072418">Play poe rakendustel on juurdepääs sellele seadmele.</translation>
 <translation id="3984159763196946143">Demorežiimi ei saanud käivitada</translation>
 <translation id="3984431586879874039">Kas lubada saidil teie turvavõtit näha?</translation>
 <translation id="3987938432087324095">Kahjuks ei kuulnud seda.</translation>
@@ -2063,6 +2072,7 @@
 <translation id="4159681666905192102">Seda lastekontot haldavad <ph name="CUSTODIAN_EMAIL" /> ja <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation>
 <translation id="4163560723127662357">Tundmatu klaviatuur</translation>
 <translation id="4168015872538332605">Teiega jagatakse teatud seadeid, mille omanik on <ph name="PRIMARY_EMAIL" />. Seaded mõjutavad teie kontot vaid juhul, kui kasutate mitmesse kontosse sisselogimist.</translation>
+<translation id="4169535189173047238">Ära luba</translation>
 <translation id="4170314459383239649">Kustuta väljumisel</translation>
 <translation id="4172051516777682613">Kuva alati</translation>
 <translation id="4175737294868205930">Püsiv salvestusruum</translation>
@@ -2222,6 +2232,7 @@
 <translation id="4453946976636652378">Otsige teenusega <ph name="SEARCH_ENGINE_NAME" /> või sisestage URL</translation>
 <translation id="4462159676511157176">Kohandatud nimeserverid</translation>
 <translation id="4469477701382819144">Blokeeritud saitidel, mis kuvavad sekkuvaid või eksitavaid reklaame</translation>
+<translation id="4470957202018033307">Välise salvestusruumi eelistused</translation>
 <translation id="447252321002412580">Aidake täiustada Chrome'i funktsioone ja toimivust</translation>
 <translation id="4472575034687746823">Alustamine</translation>
 <translation id="4474155171896946103">Lisa kõik vahelehed järjehoidjatesse...</translation>
@@ -2578,6 +2589,7 @@
 <translation id="504561833207953641">Olemasolevas brauseriseansis avamine.</translation>
 <translation id="5047421709274785093">Blokeeri saitide jaoks liikumis- ja valgusandurite kasutamine</translation>
 <translation id="5050042263972837708">Grupi nimi</translation>
+<translation id="5051836348807686060">Õigekirjakontrolli teie valitud keelte puhul ei toetata</translation>
 <translation id="5052499409147950210">Saidi muutmine</translation>
 <translation id="5053604404986157245">Juhuslikult loodud TPM-i parool pole saadaval. See on pärast Powerwashi tavapärane.</translation>
 <translation id="5057110919553308744">Laiendusel klõpsamisel</translation>
@@ -2658,9 +2670,9 @@
 <translation id="5184063094292164363">&amp;JavaScripti konsool</translation>
 <translation id="5184662919967270437">Teie seadme värskendamine</translation>
 <translation id="5185386675596372454">Laienduse <ph name="EXTENSION_NAME" /> uusim versioon on keelatud, sest see nõuab rohkem õigusi.</translation>
-<translation id="5187295959347858724">Olete nüüd teenusesse <ph name="SHORT_PRODUCT_NAME" /> sisse logitud. Järjehoidjad, ajalugu ja muud seaded sünkroonitakse teie Google'i kontoga.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> soovib alla laadida mitu faili</translation>
+<translation id="5202089186707505116">Kas anda sellele saidile juurdepääs teie VR-anduritele?</translation>
 <translation id="5204673965307125349">Käitage seadmes funktsiooni Powerwash ja proovige uuesti.</translation>
 <translation id="5204967432542742771">Sisestage parool</translation>
 <translation id="5206215183583316675">Kas kustutada „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -2756,6 +2768,7 @@
 <translation id="5331975486040154427">C-tüüpi USB-seade (tagumine vasakpoolne port)</translation>
 <translation id="5334142896108694079">Skripti vahemälu</translation>
 <translation id="5336126339807372270">Ära luba ühelgi saidil USB-seadmetele juurde pääseda</translation>
+<translation id="5336688142483283574">See leht eemaldatakse ka teie ajaloost ja otsingumootori <ph name="SEARCH_ENGINE" /> tegevustest.</translation>
 <translation id="5337771866151525739">Installis kolmas osapool.</translation>
 <translation id="5338503421962489998">Kohalik talletusruum</translation>
 <translation id="5340638867532133571">Luba saitidel maksetöötlejaid installida (soovitatav)</translation>
@@ -2874,6 +2887,7 @@
 <translation id="5518584115117143805">Meili krüpteerimise sertifikaat</translation>
 <translation id="5521078259930077036">Kas see on avaleht, mida ootasite?</translation>
 <translation id="5522156646677899028">See laiendus sisaldab tõsist turvaauku.</translation>
+<translation id="5523201311986093262">Taustad</translation>
 <translation id="5525677322972469346">Loo uus jälgitav kasutaja</translation>
 <translation id="5526701598901867718">Kõik (ebaturvaline)</translation>
 <translation id="5526745900034778153">Sünkroonimise jätkamiseks logige uuesti sisse</translation>
@@ -3976,6 +3990,7 @@
 <translation id="7230787553283372882">Teksti suuruse kohandamine</translation>
 <translation id="7232750842195536390">Ümbernimetamine ebaõnnestus</translation>
 <translation id="7235716375204803342">Tegevuste toomine …</translation>
+<translation id="7235737137505019098">Teie turvavõtmel pole muude kontode jaoks piisavalt ruumi.</translation>
 <translation id="7238585580608191973">SHA-256 sõrmejälg</translation>
 <translation id="7240120331469437312">Sertifikaadi subjekti alternatiivne nimi</translation>
 <translation id="7240339475467890413">Kas luua ühendus uue levialaga?</translation>
@@ -3992,6 +4007,7 @@
 <translation id="7254951428499890870">Kas soovite kindlasti käivitada rakenduse „<ph name="APP_NAME" />” diagnostikarežiimis?</translation>
 <translation id="7255002516883565667">Praegu on teil üks kaart, mida saab kasutada ainult selles seadmes</translation>
 <translation id="7255220508626648026">Ülekandmine: <ph name="ROUTETITLE" /></translation>
+<translation id="7255916308560539517">Lähtestamise kinnitamiseks puudutage turvavõtit. Kogu turvavõtmele salvestatud teave, sh selle PIN-kood, kustutatakse.</translation>
 <translation id="7255935316994522020">Rakenda</translation>
 <translation id="7256069762010468647">Sait kasutab teie kaamerat</translation>
 <translation id="7256405249507348194">Tundmatu viga: <ph name="DESC" /></translation>
@@ -4027,6 +4043,7 @@
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Rakendus võib takistada Chrome'i õiget toimimist.}other{Need rakendused võivad takistada Chrome'i õiget toimimist.}}</translation>
 <translation id="7303281435234579599">Demorežiimi seadistamisel läks midagi valesti.</translation>
 <translation id="7303900363563182677">Selle saidi jaoks blokeeriti lõikelauale kopeeritud teksti ja kujutiste nägemine</translation>
+<translation id="7305123176580523628">USB-printer on ühendatud</translation>
 <translation id="730515362922783851">Vaheta andmeid mis tahes seadmega kohalikus võrgus või Internetis</translation>
 <translation id="7307129035224081534">Peatatud</translation>
 <translation id="7308002049209013926">Kasutage käivitusprogrammi, et kiirelt uute rakenduste ja tegevuste juurde liikuda. Klaviatuuri abil siia liikumiseks vajutage klahvikombinatsiooni Alt + Tõstuklahv + L.</translation>
@@ -4134,7 +4151,6 @@
 <translation id="7481312909269577407">Edasta</translation>
 <translation id="748138892655239008">Sertifikaadi põhipiirangud</translation>
 <translation id="7487067081878637334">Tehnoloogia</translation>
-<translation id="7487099628810939106">Viivitus enne klikki:</translation>
 <translation id="7487141338393529395">Lülita sisse täiustatud õigekirjakontroll</translation>
 <translation id="7487969577036436319">Ühtegi komponenti pole installitud</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Ava kõik}=1{&amp;Ava järjehoidja}other{&amp;Ava kõik (#)}}</translation>
@@ -4151,6 +4167,7 @@
 <translation id="7502658306369382406">IPv6 aadress</translation>
 <translation id="7503191893372251637">Netscape'i sertifikaadi tüüp</translation>
 <translation id="7503821294401948377">Brauseri toimingu jaoks ei õnnestunud laadida ikooni <ph name="ICON" />.</translation>
+<translation id="7503985202154027481">Kirje teie külastusest sellele saidile säilitatakse turvavõtmes.</translation>
 <translation id="750509436279396091">Ava allalaaditud failide kaust</translation>
 <translation id="7506541170099744506">Teie <ph name="DEVICE_TYPE" /> registreeriti ettevõtte halduse jaoks.</translation>
 <translation id="7507930499305566459">Olekuvastaja sertifikaat</translation>
@@ -4163,6 +4180,7 @@
 <translation id="7529411698175791732">Kontrollige oma Interneti-ühendust. Probleemi jätkumisel logige välja ja uuesti sisse.</translation>
 <translation id="7530016656428373557">Tühjenemise määr vattides</translation>
 <translation id="7531779363494549572">Avage jaotis Seaded &gt; Rakendused ja märguanded &gt; Märguanded.</translation>
+<translation id="7536220825385726660">Play poe rakendustele juurdepääsu andmine välistele ketastele</translation>
 <translation id="7537601449003285327">Kinnita tegumiribale</translation>
 <translation id="7539856059004947393">Bluetoothi turvavõti</translation>
 <translation id="7540972813190816353">Värskenduste otsimisel ilmnes viga: <ph name="ERROR" /></translation>
@@ -4192,6 +4210,7 @@
 <translation id="7574650250151586813">Teksti sisestamiseks uuendage Daydreami klaviatuuri rakendust.</translation>
 <translation id="7576690715254076113">Eksemplarhaaval</translation>
 <translation id="7576976045740938453">Ilmnes demorežiimi kontoga seotud probleem.</translation>
+<translation id="757941033127302446">Sisse logitud</translation>
 <translation id="7580671184200851182">Esita sama heli kõigist kõlaritest (monoheli)</translation>
 <translation id="7581462281756524039">Puhastustööriist</translation>
 <translation id="7582582252461552277">Eelista seda võrku</translation>
@@ -4249,6 +4268,7 @@
 <translation id="7665369617277396874">Konto lisamine</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Vale PIN-kood. Teil on veel üks katse.}other{Vale PIN-kood. Teil on veel # katset.}}</translation>
 <translation id="7671130400130574146">Kasutage süsteemi pealkirjariba ja ääriseid</translation>
+<translation id="767127784612208024">Puudutage lähtestamise kinnitamiseks</translation>
 <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> lehel <ph name="PAGE_TITLE" />.</translation>
 <translation id="7676867886086876795">Saatke oma hääl Google'ile, et lubada dikteerimine kõigil tekstiväljadel.</translation>
 <translation id="7678280409648629969">Sisselogimisandmed salvestatakse Chrome'i pärast inkognito režiimist väljumist. See võimaldab teil Touch ID-d sellel veebisaidil hiljem uuesti kasutada.</translation>
@@ -4435,6 +4455,7 @@
 <translation id="7925247922861151263">AAA kontrollimine nurjus</translation>
 <translation id="7925285046818567682"><ph name="HOST_NAME" /> vastuse ootel...</translation>
 <translation id="7926423016278357561">See ei olnud mina.</translation>
+<translation id="7928836894214140642">Haldab <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="7930294771522048157">Salvestatud makseviisid kuvatakse siin</translation>
 <translation id="79312157130859720">Rakendus <ph name="APP_NAME" /> jagab teie ekraani ja heli.</translation>
 <translation id="7931318309563332511">Teadmata</translation>
@@ -4462,6 +4483,7 @@
 <translation id="7959074893852789871">Fail sisaldas mitut sertifikaati, mõnda neist ei imporditud:</translation>
 <translation id="7961015016161918242">Mitte kunagi</translation>
 <translation id="7963826112438303517">Assistent kasutab neid salvestisi ja teie öeldud päringuid teie häälemudeli loomiseks ja värskendamiseks. Mudel salvestatakse ainult seadmetes, kus Voice Match on sisse lülitatud. Assistendi seadetes saate häältegevusi vaadata ja ümber õpetada.</translation>
+<translation id="796416202355062143"><ph name="ORIGIN" /> soovib otsida läheduses olevaid Bluetooth-seadmeid. Leiti järgmised seadmed:</translation>
 <translation id="7966241909927244760">K&amp;opeeri kujutise aadress</translation>
 <translation id="7968742106503422125">Kopeeritud ja kleebitud andmete lugemine ning muutmine</translation>
 <translation id="7968833647796919681">Luba toimivusandmete kogumine</translation>
@@ -4561,11 +4583,13 @@
     <ph name="BEGIN_PARAGRAPH4" />Varundatud andmeid ei loeta teie Drive'i salvestuskvoodi hulka.<ph name="END_PARAGRAPH4" />
     <ph name="BEGIN_PARAGRAPH5" />Selle teenuse saate menüüs Seaded välja lülitada.<ph name="END_PARAGRAPH5" /></translation>
 <translation id="80974698889265265">PIN-koodid ei ühti</translation>
+<translation id="8099495042588009598">Rohkem lube</translation>
 <translation id="8101987792947961127">Järgmisel taaskäivitusel nõutakse Powerwashi</translation>
 <translation id="8102159139658438129">Avage jaotis <ph name="LINK_BEGIN" />Seaded<ph name="LINK_END" />, et näha ühendatud telefoni valikuid</translation>
 <translation id="8104696615244072556">Rakendage teenuse <ph name="IDS_SHORT_PRODUCT_NAME" /> seadmele funktsioon Powerwash ja naaske eelmisele versioonile.</translation>
 <translation id="8105368624971345109">Lülita välja</translation>
 <translation id="8107015733319732394">Google Play pood installitakse teie seadmesse <ph name="DEVICE_TYPE" />. See võib võtta mõne minuti.</translation>
+<translation id="810875025413331850">Läheduses olevaid seadmeid ei leitud.</translation>
 <translation id="8111155949205007504">Jagage seda parooli oma iPhone'iga</translation>
 <translation id="8113043281354018522">Valige litsentsi tüüp</translation>
 <translation id="8116972784401310538">&amp;Järjehoidjate haldur</translation>
@@ -4716,6 +4740,7 @@
 <translation id="8363095875018065315">stabiilne</translation>
 <translation id="8363142353806532503">Mikrofon on blokeeritud</translation>
 <translation id="8366396658833131068">Võrguühendus on taastatud. Valige teine võrk või vajutage allolevat nuppu „Jätka” rakenduse Kiosk käivitamiseks.</translation>
+<translation id="8368027906805972958">Tundmatu või toetamata seade (<ph name="DEVICE_ID" />)</translation>
 <translation id="8368859634510605990">&amp;Ava kõik järjehoidjad</translation>
 <translation id="8371695176452482769">Alustage rääkimist</translation>
 <translation id="8371925839118813971">{NUM_TABS,plural, =1{Vaigista sait}other{Vaigista saidid}}</translation>
@@ -4915,6 +4940,7 @@
 <translation id="8678648549315280022">Allalaadimisseadete haldamine ...</translation>
 <translation id="8678933587484842200">Kuidas soovite selle rakenduse käivitada?</translation>
 <translation id="8680251145628383637">Logige sisse, et teie järjehoidjad, ajalugu, paroolid ja muud seaded oleksid kõikides seadmetes saadaval. Teid logitakse ka automaatselt sisse Google'i teenustesse.</translation>
+<translation id="8682730193597992579"><ph name="PRINTER_NAME" /> on juba ühendatud</translation>
 <translation id="8688579245973331962">Kas te ei näe oma nime?</translation>
 <translation id="8688591111840995413">Sobimatu parool</translation>
 <translation id="8688672835843460752">Saadaval</translation>
@@ -5068,6 +5094,7 @@
 <translation id="8898840733695078011">Signaali tugevus</translation>
 <translation id="8899851313684471736">Ava link uues &amp;aknas</translation>
 <translation id="8902667442496790482">Ava funktsiooni Vali ja kuula seaded</translation>
+<translation id="8903263458134414071">Sisselogimiseks valige konto</translation>
 <translation id="8904976895050290827">Chrome'i sünkroonimine</translation>
 <translation id="890616557918890486">Vaheta allikat</translation>
 <translation id="8909833622202089127">Sait jälgib teie asukohta</translation>
@@ -5154,6 +5181,7 @@
 <translation id="9040661932550800571">Kas värskendada saidi <ph name="ORIGIN" /> parooli?</translation>
 <translation id="9041692268811217999">Administraator keelas juurdepääsu arvutis olevatele kohalikele failidele</translation>
 <translation id="9041909613332246191">Seda faili ei laadita tavaliselt alla ja see võib olla ohtlik. Teid kaitseb funktsioon Täiustatud kaitse.</translation>
+<translation id="9042858701776831292">Google Play poe rakendused võivad nõuda juurdepääsu välistele salvestusseadmetele, et sinna faile ja kaustu salvestada ning neid lugeda.</translation>
 <translation id="9042893549633094279">Privaatsus ja turvalisus</translation>
 <translation id="904451693890288097">Sisestage seadme „<ph name="DEVICE_NAME" />” pääsuvõti:</translation>
 <translation id="9044646465488564462">Võrguga ühenduse loomine ebaõnnestus: <ph name="DETAILS" /></translation>
@@ -5213,6 +5241,7 @@
 <translation id="9137916601698928395">Ava link kasutajana <ph name="USER" /></translation>
 <translation id="9138978632494473300">Lisa otseteed järgmistele kohtadele:</translation>
 <translation id="9140067245205650184">Kasutate toeta funktsioonimärgistust: <ph name="BAD_FLAG" />. See vähendab stabiilsust ja turvalisust.</translation>
+<translation id="9143298529634201539">Kas eemaldada soovitus?</translation>
 <translation id="9147304170847707004">Autentimismeetod</translation>
 <translation id="9147392381910171771">&amp;Valikud</translation>
 <translation id="9148058034647219655">Välju</translation>
@@ -5227,6 +5256,7 @@
 <translation id="916607977885256133">Pilt pildis</translation>
 <translation id="9168436347345867845">Teen seda hiljem</translation>
 <translation id="9169496697824289689">Kuva klaviatuuri otseteed</translation>
+<translation id="916964310188958970">Miks see soovitus?</translation>
 <translation id="9169931577761441333">Lisa <ph name="APP_NAME" /> avaekraanile</translation>
 <translation id="9170848237812810038">&amp;Võta tagasi</translation>
 <translation id="9170884462774788842">Teine programm teie arvutis lisas teema, mis võib muuta Chrome'i toimimist.</translation>
@@ -5237,6 +5267,7 @@
 <translation id="9179734824669616955">Linuxi (beetaversioon) seadistamine teie seadmes <ph name="DEVICE_TYPE" /></translation>
 <translation id="9180281769944411366">Protsess võib võtta mõne minuti. Linuxi konteinerit käivitatakse.</translation>
 <translation id="9180380851667544951">Sait saab jagada teie ekraanikuva</translation>
+<translation id="9185926955514281189">Värvid ja teemad</translation>
 <translation id="9188441292293901223">Seadme <ph name="DEVICE_TYPE" /> avamiseks värskendage oma telefon uuemale Androidi versioonile.</translation>
 <translation id="9188732951356337132">Saada kasutus- ja diagnostikaandmeid. See seade saadab Google'ile praegu automaatselt seadme teavet ning rakenduse kasutus- ja  diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole. <ph name="BEGIN_LINK2" />Lisateave<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPSec + eeljagatud võti</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 69345a96..25c0bae 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">فعال‌سازی شبکه داده تلفن همراه</translation>
 <translation id="1407489512183974736">برش خورده در مرکز</translation>
 <translation id="1408504635543854729">‏محتوای دستگاه را در برنامه Files کاوش کنید. محتوا توسط سرپرست محدود شده است و قابل ویرایش نیست.</translation>
-<translation id="1408789165795197664">پیشرفته...</translation>
 <translation id="1409390508152595145">ایجاد کاربر نظارت شده</translation>
 <translation id="1410197035576869800">نماد برنامه</translation>
 <translation id="1410616244180625362">ادامه اجازه به <ph name="HOST" /> برای دسترسی به دوربین</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">کنسول &amp;جاوا اسکریپت</translation>
 <translation id="5184662919967270437">درحال به‌روزرسانی دستگاه</translation>
 <translation id="5185386675596372454">جدیدترین نسخه از "<ph name="EXTENSION_NAME" />" غیر فعال شده است زیرا به مجوزهای بیشتری نیاز دارد.</translation>
-<translation id="5187295959347858724">‏شما اکنون به سیستم <ph name="SHORT_PRODUCT_NAME" /> وارد شدید. نشانک‌ها، سابقه و سایر تنظیمات شما با حساب Google  شما همگام‌سازی می‌شوند.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> می‌خواهد چند فایل را بارگیری کند</translation>
 <translation id="5204673965307125349">لطفاً دستگاه را پاورواش کنید و دوباره امتحان کنید.</translation>
@@ -4130,7 +4128,6 @@
 <translation id="7481312909269577407">ارسال کردن</translation>
 <translation id="748138892655239008">محدودیت‌های اصلی گواهی</translation>
 <translation id="7487067081878637334">فناوری</translation>
-<translation id="7487099628810939106">تأخیر قبل از کلیک:</translation>
 <translation id="7487141338393529395">روشن کردن غلط‌گیر املای بهبود‌یافته</translation>
 <translation id="7487969577036436319">هیچ مؤلفه‌ای نصب نشده است</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{باز کردن همه}=1{باز کردن نشانک}one{باز کردن همه (#)}other{باز کردن همه (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 799d8d2e..f58f20e4 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Mobiiliyhteyden aktivointi</translation>
 <translation id="1407489512183974736">Rajaa keskelle</translation>
 <translation id="1408504635543854729">Tutustu laitteen sisältöön Tiedostot-sovelluksen kautta. Ylläpitäjä on rajoittanut sisältöä eikä sitä voi muokata.</translation>
-<translation id="1408789165795197664">Lisäasetukset...</translation>
 <translation id="1409390508152595145">Luo valvottu käyttäjä</translation>
 <translation id="1410197035576869800">Sovelluskuvake</translation>
 <translation id="1410616244180625362">Anna sivuston <ph name="HOST" /> käyttää edelleen kameraasi</translation>
@@ -1107,7 +1106,7 @@
 <translation id="2705736684557713153">Vieritä näytön alareunaan ja ota yhteyden pikajakaminen käyttöön, jos vaihtoehto tulee näkyviin. Jos ei, sinun ei tarvitse tehdä mitään.</translation>
 <translation id="2707024448553392710">Komponenttia ladataan</translation>
 <translation id="270921614578699633">Keskimäärin</translation>
-<translation id="2709453993673701466">Haluatko hallinnoida synkronointia ja räätälöintiä ennen kuin ne otetaan käyttöön? Siirry <ph name="BEGIN_LINK" />Asetuksiin<ph name="END_LINK" />.</translation>
+<translation id="2709453993673701466">Haluatko hallinnoida synkronointia ja personointia ennen kuin ne otetaan käyttöön? Siirry <ph name="BEGIN_LINK" />Asetuksiin<ph name="END_LINK" />.</translation>
 <translation id="2709516037105925701">Automaattinen täyttö</translation>
 <translation id="271033894570825754">Uusi</translation>
 <translation id="2714393097308983682">Google Play Kauppa</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-konsoli</translation>
 <translation id="5184662919967270437">Päivitetään laitetta.</translation>
 <translation id="5185386675596372454">Laajennuksen <ph name="EXTENSION_NAME" /> uusin versio on poistettu käytöstä, koska se vaatii enemmän käyttöoikeuksia.</translation>
-<translation id="5187295959347858724">Olet kirjautunut tuotteeseen <ph name="SHORT_PRODUCT_NAME" />. Kirjanmerkkisi, historiasi ja muut asetuksesi synkronoidaan Google-tiliisi.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> haluaa ladata useita tiedostoja</translation>
 <translation id="5204673965307125349">Suorita powerwash ja yritä uudelleen.</translation>
@@ -3443,7 +3441,7 @@
 <translation id="6393156038355142111">Ehdota vahvaa salasanaa</translation>
 <translation id="6395423953133416962">Lähetä <ph name="BEGIN_LINK1" />järjestelmän tiedot<ph name="END_LINK1" /> ja <ph name="BEGIN_LINK2" />tilastot<ph name="END_LINK2" /></translation>
 <translation id="6396988158856674517">Estä sivustoja käyttämästä liiketunnistimia</translation>
-<translation id="6397094776139756010">Synkronoinnin ja räätälöinnin asetukset</translation>
+<translation id="6397094776139756010">Synkronoinnin ja personoinnin asetukset</translation>
 <translation id="6398715114293939307">Poista Google Play Kauppa</translation>
 <translation id="6398765197997659313">Poistu koko näytön tilasta</translation>
 <translation id="6399774419735315745">Vakooja</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Seuraava</translation>
 <translation id="748138892655239008">Varmenteen perusrajoitukset</translation>
 <translation id="7487067081878637334">Tekniikka</translation>
-<translation id="7487099628810939106">Viive ennen klikkausta:</translation>
 <translation id="7487141338393529395">Ota käyttöön parannettu oikeinkirjoituksen tarkistus</translation>
 <translation id="7487969577036436319">Ei asennettuja osia</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Avaa kaikki}=1{Avaa kirjanmerkki}other{Avaa kaikki #}}</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index fa8fb4db..0709e87 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Pag-activate ng Cellular Network</translation>
 <translation id="1407489512183974736">Gitnang Naka-crop</translation>
 <translation id="1408504635543854729">I-explore ang content ng device sa Files app. Pinaghihigpitan ng isang admin ang content at hindi maaaring baguhin.</translation>
-<translation id="1408789165795197664">Advanced...</translation>
 <translation id="1409390508152595145">Gumawa ng pinangangasiwaang user</translation>
 <translation id="1410197035576869800">Icon ng App</translation>
 <translation id="1410616244180625362">Ipagpatuloy ang pagpapahintulot sa <ph name="HOST" /> na i-access ang iyong camera</translation>
@@ -487,7 +486,7 @@
 <translation id="1744060673522309905">Hindi maisama ang device sa domain. Tiyaking hindi mo nalampasan ang bilang ng mga device na maaari mong idagdag.</translation>
 <translation id="1744108098763830590">pahina ng background</translation>
 <translation id="1745520510852184940">Palagi Itong Gawin</translation>
-<translation id="1746402432151920942">Pinoprotektahang Pagkakakilanlan ng Media</translation>
+<translation id="1746402432151920942">Pagkakakilanlan ng Pinoprotektahang Media</translation>
 <translation id="175196451752279553">M&amp;uling buksan ang nakasarang tab</translation>
 <translation id="1753905327828125965">Most Visited</translation>
 <translation id="1756681705074952506">Pamamaraan ng pag-input</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;JavaScript Console</translation>
 <translation id="5184662919967270437">Ina-update ang iyong device</translation>
 <translation id="5185386675596372454">Hindi pinagana ang pinakabagong bersyon ng "<ph name="EXTENSION_NAME" />" dahil nangangailangan ito ng higit pang mga pahintulot.</translation>
-<translation id="5187295959347858724">Naka-sign in ka na ngayon sa <ph name="SHORT_PRODUCT_NAME" />. Ang iyong mga bookmark, kasaysayan, at ibang mga setting ay sini-sync sa iyong Google Account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Gustong mag-download ng <ph name="ORIGIN" /> ng maraming file</translation>
 <translation id="5204673965307125349">Paki-powerwash ang device at subukang muli.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Sumulong</translation>
 <translation id="748138892655239008">Mga Limitasyon sa Pangunahing Certificate</translation>
 <translation id="7487067081878637334">Teknolohiya</translation>
-<translation id="7487099628810939106">Pagkaantala bago ang pag-click:</translation>
 <translation id="7487141338393529395">I-on ang Pinahusay na Pang-check ng Pagbabaybay</translation>
 <translation id="7487969577036436319">Walang naka-install na mga bahagi</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Buksan lahat}=1{&amp;Buksan ang bookmark}one{&amp;Buksan lahat (#)}other{&amp;Buksan lahat (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 26051ca..3e7dc48 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Activation mobile</translation>
 <translation id="1407489512183974736">Recadrer et centrer</translation>
 <translation id="1408504635543854729">Explorez le contenu de l'appareil dans l'application Fichiers. L'accès à ce contenu étant limité par un administrateur, vous ne pouvez pas le modifier.</translation>
-<translation id="1408789165795197664">Paramètres avancés…</translation>
 <translation id="1409390508152595145">Créer un utilisateur supervisé</translation>
 <translation id="1410197035576869800">Icône de l'application</translation>
 <translation id="1410616244180625362">Continuer à autoriser <ph name="HOST" /> à accéder à votre caméra</translation>
@@ -2026,7 +2025,7 @@
 <translation id="4099060993766194518">Restaurer le moteur de recherche par défaut ?</translation>
 <translation id="4099874310852108874">Une erreur réseau s'est produite.</translation>
 <translation id="4100733287846229632">Très peu d'espace disponible sur l'appareil</translation>
-<translation id="4100853287411968461">Nouvelle limite d'utilisation</translation>
+<translation id="4100853287411968461">Nouvelle limite du temps d'utilisation</translation>
 <translation id="4103091233824664032">Saisissez votre mot de passe pour configurer le verrouillage de l'écran et la connexion</translation>
 <translation id="4104163789986725820">E&amp;xporter...</translation>
 <translation id="4107048419833779140">Identifier et exclure des périphériques de stockage</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Console &amp;JavaScript</translation>
 <translation id="5184662919967270437">Mise à jour de l'appareil...</translation>
 <translation id="5185386675596372454">La nouvelle version de "<ph name="EXTENSION_NAME" />" a été désactivée, car elle nécessite davantage d'autorisations.</translation>
-<translation id="5187295959347858724">Vous êtes maintenant connecté à <ph name="SHORT_PRODUCT_NAME" />. Vos favoris, votre historique et d'autres paramètres sont synchronisés avec votre compte Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> souhaite télécharger plusieurs fichiers</translation>
 <translation id="5204673965307125349">Veuillez effectuer un Powerwash de l'appareil, puis réessayer.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">Avancer</translation>
 <translation id="748138892655239008">Contraintes de base du certificat</translation>
 <translation id="7487067081878637334">Technologie</translation>
-<translation id="7487099628810939106">Délai avant un clic :</translation>
 <translation id="7487141338393529395">Activer le correcteur orthographique amélioré</translation>
 <translation id="7487969577036436319">Aucun composant installé</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Tout &amp;ouvrir}=1{&amp;Ouvrir le favori}one{Tout &amp;ouvrir (#)}other{Tout &amp;ouvrir (#)}}</translation>
@@ -4277,7 +4274,7 @@
 <translation id="7704628569466676326">Associez votre clé de sécurité à cet appareil afin de pouvoir l'utiliser pour vous connecter à votre compte</translation>
 <translation id="7705276765467986571">Impossible de charger le modèle du favori.</translation>
 <translation id="7705524343798198388">VPN</translation>
-<translation id="7707108266051544351">L'utilisation des capteurs de mouvement ou de lumière a été bloquée pour ce site.</translation>
+<translation id="7707108266051544351">L'utilisation des capteurs de mouvement a été bloquée pour ce site.</translation>
 <translation id="7707922173985738739">Utiliser les données mobiles</translation>
 <translation id="7709152031285164251">Échec – <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7710568461918838723">&amp;Caster…</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 7933200..6247195 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">સેલ્યુલર સક્રિયકરણ</translation>
 <translation id="1407489512183974736">મધ્યમાં કાપેલું</translation>
 <translation id="1408504635543854729">Files ઍપ્લિકેશનમાં ડિવાઇસના કન્ટેન્ટમાં નવું શોધો. કન્ટેન્ટ એડમિન દ્વારા પ્રતિબંધિત છે અને બદલી શકતા નથી.</translation>
-<translation id="1408789165795197664">વિગતવાર...</translation>
 <translation id="1409390508152595145">નિરીક્ષણ કરેલ વપરાશકર્તા બનાવો</translation>
 <translation id="1410197035576869800">ઍપ આઇકન</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> ને તમારા કૅમેરાને ઍક્સેસ કરવા દેવાનું ચાલુ રાખો</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">&amp;JavaScript કન્સોલ</translation>
 <translation id="5184662919967270437">તમારા ઉપકરણને અપડેટ કરી રહ્યાં છે</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />"નું સૌથી નવું વર્ઝન બંધ કરવામાં આવ્યું છે, કારણ કે એને વધુ પરવાનગીઓની જરૂર છે.</translation>
-<translation id="5187295959347858724">તમે હવે <ph name="SHORT_PRODUCT_NAME" /> પર સાઇન ઇન થયેલા છો. તમારા બુકમાર્ક, ઇતિહાસ, અને બીજા સેટિંગ તમારા Google એકાઉન્ટ સાથે સિંક થાય છે.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> એકથી વધુ ફાઇલો ડાઉનલોડ કરવા માગે છે</translation>
 <translation id="5204673965307125349">કૃપા કરીને ડિવાઇસને પાવરવોશ કરો અને ફરી પ્રયાસ કરો.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">ફોર્વર્ડ કરો</translation>
 <translation id="748138892655239008">પ્રમાણપત્રની મૂળભૂત મર્યાદાઓ</translation>
 <translation id="7487067081878637334">તકનીક</translation>
-<translation id="7487099628810939106">ક્લિક પહેલાં વિલંબ:</translation>
 <translation id="7487141338393529395">વધુ સારી બનાવાયેલી જોડણીની તપાસ ચાલુ કરો</translation>
 <translation id="7487969577036436319">કોઈ ઘટકો ઇન્સ્ટોલ કરેલા નથી</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;તમામ URL ખોલો}=1{&amp;બુકમાર્ક ખોલો}one{&amp;તમામ (#) URLને ખોલો}other{&amp;તમામ (#) URLને ખોલો}}</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index dc95c97..71c4ac9 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">सेल्युलर एक्टिवेशन</translation>
 <translation id="1407489512183974736">मध्य में काटा गया</translation>
 <translation id="1408504635543854729">डिवाइस की सामग्री फ़ाइल ऐप्लिकेशन में एक्सप्लोर करें. सामग्री किसी एडमिन ने प्रतिबंधित की है और उसे बदला नहीं जा सकता.</translation>
-<translation id="1408789165795197664">बेहतर...</translation>
 <translation id="1409390508152595145">'निगरानी में रखा गया उपयोगकर्ता' बनाएं</translation>
 <translation id="1410197035576869800">ऐप्लिकेशन आइकॉन</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> को अपना कैमरा एक्सेस करते रहने दें</translation>
@@ -2657,7 +2656,6 @@
 <translation id="5184063094292164363">&amp;JavaScript कंसोल</translation>
 <translation id="5184662919967270437">आपका डिवाइस अपडेट हो रहा है</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" का नवीनतम वर्शन अक्षम कर दिया गया है क्‍योंकि इसे ज़्यादा अनुमतियों की आवश्‍यकता है.</translation>
-<translation id="5187295959347858724">आप अब <ph name="SHORT_PRODUCT_NAME" /> में प्रवेश हो गए हैं. आपके बुकमार्क, इतिहास, और अन्‍य सेटिंग आपके Google खाते में समन्‍वयित की जा रही हैं.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> एक से ज़्यादा फ़ाइलें डाउनलोड करना चाहते हैं</translation>
 <translation id="5204673965307125349">कृपया डिवाइस को पावरवॉश करें और फिर से कोशिश करें.</translation>
@@ -4133,7 +4131,6 @@
 <translation id="7481312909269577407">आगे जाएं</translation>
 <translation id="748138892655239008">प्रमाणपत्र मूल बाध्यताएं</translation>
 <translation id="7487067081878637334">तकनीक</translation>
-<translation id="7487099628810939106">क्‍लिक से पहले देरी:</translation>
 <translation id="7487141338393529395">'बेहतर वर्तनी जाँच' चालू करें</translation>
 <translation id="7487969577036436319">कोई घटक इंस्टॉल नहीं हैं</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;सभी खोलें}=1{&amp;बुकमार्क खोलें}one{&amp;सभी (#) खोलें}other{&amp;सभी (#) खोलें}}</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index acc4807e..906ceae 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -266,7 +266,6 @@
 <translation id="140723521119632973">Mobilna aktivacija</translation>
 <translation id="1407489512183974736">Centriraj obrezano</translation>
 <translation id="1408504635543854729">Istražite sadržaj ovog uređaja u aplikaciji Datoteke. Administrator nameće ograničenja za sadržaj, pa se sadržaj ne može mijenjati.</translation>
-<translation id="1408789165795197664">Napredno...</translation>
 <translation id="1409390508152595145">Izradi nadziranog korisnika</translation>
 <translation id="1410197035576869800">Ikona aplikacije</translation>
 <translation id="1410616244180625362">Nastavi dopuštati hostu <ph name="HOST" /> pristup kameri</translation>
@@ -2671,7 +2670,6 @@
 <translation id="5184063094292164363">&amp;Konzola JavaScripta</translation>
 <translation id="5184662919967270437">Ažuriranje uređaja</translation>
 <translation id="5185386675596372454">Najnovija verzija "<ph name="EXTENSION_NAME" />" onemogućena je jer zahtijeva više dozvola.</translation>
-<translation id="5187295959347858724">Sada ste prijavljeni na uslugu <ph name="SHORT_PRODUCT_NAME" />. Vaše oznake, povijest i druge postavke sinkroniziraju se s vašim Google računom.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> želi preuzeti više datoteka</translation>
 <translation id="5202089186707505116">Želite li omogućiti toj web-lokaciji pristup vašim VR senzorima?</translation>
@@ -4153,7 +4151,6 @@
 <translation id="7481312909269577407">Naprijed</translation>
 <translation id="748138892655239008">Osnovno ograničenje certifikata</translation>
 <translation id="7487067081878637334">Tehnologija</translation>
-<translation id="7487099628810939106">Odgoda prije klika:</translation>
 <translation id="7487141338393529395">Uključivanje poboljšane provjere pravopisa</translation>
 <translation id="7487969577036436319">Nema instaliranih komponenti</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Otvori sve}=1{&amp;Otvori oznaku}one{&amp;Otvori sve (#)}few{&amp;Otvori sve (#)}other{&amp;Otvori sve (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 5db2192..90b6aa0 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Mobilhálózati aktiválás</translation>
 <translation id="1407489512183974736">Középre, levágva</translation>
 <translation id="1408504635543854729">Fedezze fel az eszköz tartalmait a Fájlok alkalmazásban. A rendszergazda korlátozta a tartalmakat, így nem lehet módosítani őket.</translation>
-<translation id="1408789165795197664">Speciális...</translation>
 <translation id="1409390508152595145">Felügyelt felhasználó létrehozása</translation>
 <translation id="1410197035576869800">Alkalmazás ikonja</translation>
 <translation id="1410616244180625362">A(z) <ph name="HOST" /> továbbra is hozzáférhet az Ön kamerájához</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-konzol</translation>
 <translation id="5184662919967270437">Az eszköz frissítése folyamatban van</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" legújabb verziója ki van kapcsolva, mert több jogosultság kell hozzá.</translation>
-<translation id="5187295959347858724">Bejelentkezett a <ph name="SHORT_PRODUCT_NAME" /> szolgáltatásba. A rendszer most szinkronizálja a könyvjelzőket, előzményeket és egyéb beállításokat Google Fiókjával.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">A(z) <ph name="ORIGIN" /> több fájlt szeretne letölteni</translation>
 <translation id="5204673965307125349">Hajtson végre powerwash műveletet az eszközön, majd próbálja újra.</translation>
@@ -4136,7 +4134,6 @@
 <translation id="7481312909269577407">Előre</translation>
 <translation id="748138892655239008">Tanúsítvány alapvető típusmegkötései</translation>
 <translation id="7487067081878637334">Technológia</translation>
-<translation id="7487099628810939106">Kattintás előtti késleltetés:</translation>
 <translation id="7487141338393529395">A továbbfejlesztett helyesírás-ellenőrzés bekapcsolása</translation>
 <translation id="7487969577036436319">Nincsenek összetevők telepítve</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Összes &amp;megnyitása}=1{Könyvjelző &amp;megnyitása}other{Összes (#) &amp;megnyitása}}</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index f3b403eb..18fe0a1 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivasi Seluler</translation>
 <translation id="1407489512183974736">Dipangkas di Tengah</translation>
 <translation id="1408504635543854729">Jelajahi konten perangkat di aplikasi File. Konten dibatasi oleh admin dan tidak dapat diubah.</translation>
-<translation id="1408789165795197664">Lanjutan...</translation>
 <translation id="1409390508152595145">Membuat pengguna yang dilindungi</translation>
 <translation id="1410197035576869800">Ikon Aplikasi</translation>
 <translation id="1410616244180625362">Terus izinkan <ph name="HOST" /> mengakses kamera Anda</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">Konsol &amp;JavaScript</translation>
 <translation id="5184662919967270437">Memperbarui perangkat</translation>
 <translation id="5185386675596372454">Versi terbaru dari "<ph name="EXTENSION_NAME" />" telah dinonaktifkan karena versi tersebut memerlukan tingkat izin yang lebih tinggi.</translation>
-<translation id="5187295959347858724">Sekarang Anda masuk pada <ph name="SHORT_PRODUCT_NAME" />. Bookmark, histori, dan setelan lainnya sedang disinkronkan ke Akun Google Anda.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ingin mendownload beberapa file</translation>
 <translation id="5204673965307125349">Harap powerwash perangkat, lalu coba lagi.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">Maju</translation>
 <translation id="748138892655239008">Kendala Dasar Sertifikat</translation>
 <translation id="7487067081878637334">Teknologi</translation>
-<translation id="7487099628810939106">Penundaan sebelum klik:</translation>
 <translation id="7487141338393529395">Aktifkan fitur Periksa Ejaan yang Disempurnakan</translation>
 <translation id="7487969577036436319">Tidak ada komponen yang dipasang</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Buka semua}=1{&amp;Buka bookmark}other{&amp;Buka semua (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 229cdb1c..f0838bd1 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Attivazione della rete mobile</translation>
 <translation id="1407489512183974736">Ritagliato al centro</translation>
 <translation id="1408504635543854729">Esplora i contenuti del dispositivo nell'app File. I contenuti sono limitati da un amministratore e non possono essere modificati.</translation>
-<translation id="1408789165795197664">Avanzate...</translation>
 <translation id="1409390508152595145">Crea utente supervisionato</translation>
 <translation id="1410197035576869800">Icona dell'app</translation>
 <translation id="1410616244180625362">Continua a consentire l'accesso di <ph name="HOST" /> alla webcam</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">Console &amp;JavaScript</translation>
 <translation id="5184662919967270437">Aggiornamento del dispositivo in corso</translation>
 <translation id="5185386675596372454">La versione più recente di "<ph name="EXTENSION_NAME" />" è stata disattivata perché richiede altre autorizzazioni.</translation>
-<translation id="5187295959347858724">Hai eseguito l'accesso a <ph name="SHORT_PRODUCT_NAME" />. I tuoi Preferiti, la tua cronologia e le altre impostazioni sono in fase di sincronizzazione con il tuo Account Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vuole scaricare più file</translation>
 <translation id="5204673965307125349">Esegui il powerwash del dispositivo e riprova.</translation>
@@ -4130,7 +4128,6 @@
 <translation id="7481312909269577407">Avanti</translation>
 <translation id="748138892655239008">Limitazioni di base certificato</translation>
 <translation id="7487067081878637334">Tecnologia</translation>
-<translation id="7487099628810939106">Ritardo prima del clic:</translation>
 <translation id="7487141338393529395">Attiva il controllo ortografico avanzato</translation>
 <translation id="7487969577036436319">Nessun componente installato</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Apri tutti}=1{&amp;Apri preferito}other{&amp;Apri tutti (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 7d0cb39..7187fae3 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">הפעלה סלולרית</translation>
 <translation id="1407489512183974736">חתוך במרכז</translation>
 <translation id="1408504635543854729">עיין בתוכן של המכשיר באמצעות האפליקציה 'קבצים'. התוכן מוגבל על-ידי מנהל מערכת, ואי אפשר לשנות אותו.</translation>
-<translation id="1408789165795197664">מתקדם...</translation>
 <translation id="1409390508152595145">צור משתמש בפיקוח</translation>
 <translation id="1410197035576869800">סמל האפליקציה</translation>
 <translation id="1410616244180625362">המשך לאפשר ל-<ph name="HOST" /> לגשת למצלמה שלך</translation>
@@ -2655,7 +2654,6 @@
 <translation id="5184063094292164363">‏קונסולת JavaScript&amp; </translation>
 <translation id="5184662919967270437">מעדכן את המכשיר שלך</translation>
 <translation id="5185386675596372454">הגרסה החדשה ביותר של "<ph name="EXTENSION_NAME" />" הושבתה מכיוון שהיא דורשת הרשאות נרחבות יותר.</translation>
-<translation id="5187295959347858724">‏נכנסת ל-<ph name="SHORT_PRODUCT_NAME" />. הסימניות, ההיסטוריה והגדרות אחרות שלך מסתנכרנות עם חשבון Google שלך.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> ‏(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> רוצה להוריד מספר קבצים</translation>
 <translation id="5204673965307125349">‏אפשר לבצע Powerwash במכשיר ולנסות שוב.</translation>
@@ -4131,7 +4129,6 @@
 <translation id="7481312909269577407">קדימה</translation>
 <translation id="748138892655239008">מגבלות בסיסיות של אישור </translation>
 <translation id="7487067081878637334">טכנולוגיה</translation>
-<translation id="7487099628810939106">השהיה לפני לחיצה:</translation>
 <translation id="7487141338393529395">הפעלה של בדיקת איות משופרת</translation>
 <translation id="7487969577036436319">לא מותקנים רכיבים</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;פתח הכל}=1{&amp;פתח סימניה}two{&amp;פתח הכל (2)}many{&amp;פתח הכל (#)}other{&amp;פתח הכל (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 87764bb..0b662c4 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">モバイル有効化</translation>
 <translation id="1407489512183974736">中央トリミング</translation>
 <translation id="1408504635543854729">ファイルアプリでデバイスの内容を確認できます。ただし管理者が制限を設定しているため、デバイスの内容を変更することはできません。</translation>
-<translation id="1408789165795197664">詳細...</translation>
 <translation id="1409390508152595145">監視対象ユーザーを作成</translation>
 <translation id="1410197035576869800">アプリのアイコン</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> によるカメラへのアクセスを引き続き許可する</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">JavaScript コンソール(&amp;J)</translation>
 <translation id="5184662919967270437">デバイスを更新しています</translation>
 <translation id="5185386675596372454">「<ph name="EXTENSION_NAME" />」の最新バージョンは、さらに許可が必要なため無効になっています。</translation>
-<translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME" /> にログインしています。ブックマーク、履歴、その他の設定は Google アカウントに同期されます。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> で複数のファイルがダウンロードされようとしています</translation>
 <translation id="5204673965307125349">デバイスで Powerwash を実行してもう一度お試しください。</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">進む</translation>
 <translation id="748138892655239008">証明書の基本制約</translation>
 <translation id="7487067081878637334">テクノロジー</translation>
-<translation id="7487099628810939106">クリックされるまでの時間:</translation>
 <translation id="7487141338393529395">拡張スペルチェックの有効化</translation>
 <translation id="7487969577036436319">コンポーネントはインストールされていません</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{すべてを開く(&amp;O)}=1{ブックマークを開く(&amp;O)}other{すべて(# 件)を開く(&amp;O)}}</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 9369b44..8514895 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">ಸೆಲ್ಯುಲರ್ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ</translation>
 <translation id="1407489512183974736">ಮಧ್ಯಕ್ಕೆ ಕತ್ತರಿಸಲಾಗಿರುವುದು</translation>
 <translation id="1408504635543854729">ಫೈಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಸಾಧನದ ವಿಷಯವನ್ನು ಅನ್ವೇಷಿಸಿ. ನಿರ್ವಾಹಕರಿಂದ ವಿಷಯವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಮತ್ತು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
-<translation id="1408789165795197664">ಸುಧಾರಿತ...</translation>
 <translation id="1409390508152595145">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಿ</translation>
 <translation id="1410197035576869800">ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್</translation>
 <translation id="1410616244180625362">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಗೆ ಅನುಮತಿಸುವುದನ್ನು ಮುಂದುವರೆಸಿ</translation>
@@ -2659,7 +2658,6 @@
 <translation id="5184063094292164363">&amp;JavaScript ಕನ್ಸೋಲ್</translation>
 <translation id="5184662919967270437">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" ನ ಹೊಸ ಆವೃತ್ತಿಗೆ ಹೆಚ್ಚಿನ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿರುವ ಕಾರಣ ಅದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
-<translation id="5187295959347858724">ಇದೀಗ ನೀವು<ph name="SHORT_PRODUCT_NAME" /> ಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ. ನಿಮ್ಮ Google ಖಾತೆ ಜೊತೆ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರೆ ಸೆಟ್ಟಿಂಗ್‌‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="5204673965307125349">ಸಾಧನವನ್ನು ಪವರ್‌ವಾಷ್ ಮಾಡಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
@@ -4138,7 +4136,6 @@
 <translation id="7481312909269577407">ಫಾರ್ವರ್ಡ್</translation>
 <translation id="748138892655239008">ಪ್ರಮಾಣಪತ್ರ ಆಧಾರಿತ ನಿರ್ಬಂಧಗಳು</translation>
 <translation id="7487067081878637334">ತಂತ್ರಜ್ಞಾನ</translation>
-<translation id="7487099628810939106">ಕ್ಲಿಕ್ ಮಾಡುವ ಮೊದಲು ವಿಳಂಬ:</translation>
 <translation id="7487141338393529395">ವರ್ಧಿತ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಆನ್ ಮಾಡಿ</translation>
 <translation id="7487969577036436319">ಯಾವುದೇ ಕಾಂಪೊನೆಂಟ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಿಲ್ಲ</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;ಎಲ್ಲವನ್ನೂ ತೆರೆಯಿರಿ}=1{&amp;ಬುಕ್‌ಮಾರ್ಕ್ ತರೆಯಿರಿ}one{&amp;ಎಲ್ಲಾ (#) ಅನ್ನು ತೆರೆಯಿರಿ}other{&amp;ಎಲ್ಲಾ (#) ಅನ್ನು ತೆರೆಯಿರಿ}}</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 0715b13..0f270269 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">모바일 활성화</translation>
 <translation id="1407489512183974736">가운데 부분 자르기</translation>
 <translation id="1408504635543854729">파일 앱에서 기기의 콘텐츠를 탐색합니다. 콘텐츠는 관리자에 의해 제한되며 수정할 수 없습니다.</translation>
-<translation id="1408789165795197664">고급...</translation>
 <translation id="1409390508152595145">관리 대상 사용자 만들기</translation>
 <translation id="1410197035576869800">앱 아이콘</translation>
 <translation id="1410616244180625362"><ph name="HOST" />에서 카메라에 액세스하도록 계속 허용</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">자바스크립트 콘솔(&amp;J)</translation>
 <translation id="5184662919967270437">기기 업데이트 중</translation>
 <translation id="5185386675596372454">'<ph name="EXTENSION_NAME" />'의 최신 버전에 더 많은 권한이 필요하여 사용이 중지되었습니다.</translation>
-<translation id="5187295959347858724">이제 <ph name="SHORT_PRODUCT_NAME" />에 로그인되었으며 북마크와 방문기록, 기타 설정이 내 Google 계정과 동기화됩니다.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" />에서 여러 파일을 다운로드하려고 합니다.</translation>
 <translation id="5204673965307125349">기기를 파워워시한 후 다시 시도해 주세요.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">앞으로</translation>
 <translation id="748138892655239008">인증서 기본 제약조건</translation>
 <translation id="7487067081878637334">테크놀로지</translation>
-<translation id="7487099628810939106">클릭하기 전 지연:</translation>
 <translation id="7487141338393529395">향상된 맞춤법 검사 기능 사용 설정</translation>
 <translation id="7487969577036436319">설치된 구성요소가 없습니다.</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{모두 열기(O)}=1{북마크 열기(O)}other{#개 모두 열기(O)}}</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 42fccc1..65e86ac 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Mobiliojo ryšio aktyvinimas</translation>
 <translation id="1407489512183974736">Apkarpytas centre</translation>
 <translation id="1408504635543854729">Naršykite įrenginio turinį programoje „Failai“. Turinį riboja administratorius, todėl jo negalima keisti.</translation>
-<translation id="1408789165795197664">Išplėstiniai...</translation>
 <translation id="1409390508152595145">Kurti prižiūrimą naudotoją</translation>
 <translation id="1410197035576869800">Programos piktograma</translation>
 <translation id="1410616244180625362">Toliau leisti <ph name="HOST" /> pasiekti fotoaparatą</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">„&amp;JavaScript“·pultas</translation>
 <translation id="5184662919967270437">Įrenginys atnaujinamas</translation>
 <translation id="5185386675596372454">Naujausia „<ph name="EXTENSION_NAME" />“ versija buvo išjungta, nes jai reikia daugiau leidimų.</translation>
-<translation id="5187295959347858724">Dabar esate prisijungę prie „<ph name="SHORT_PRODUCT_NAME" />“. Žymės, istorija ir kiti nustatymai sinchronizuojami su „Google“ paskyra.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> nori atsisiųsti kelis failus</translation>
 <translation id="5204673965307125349">Vykdykite „Powerwash“ ir bandykite dar kartą.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">Persiųsti</translation>
 <translation id="748138892655239008">Pagrindiniai sertifikato apribojimai</translation>
 <translation id="7487067081878637334">Technologija</translation>
-<translation id="7487099628810939106">Delsa prieš paspaudimą:</translation>
 <translation id="7487141338393529395">Patobulinto rašybos tikrinimo įjungimas</translation>
 <translation id="7487969577036436319">Neįdiegta jokių komponentų</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Atidaryti viską}=1{&amp;Atidaryti žymę}one{&amp;Atidaryti viską (#)}few{&amp;Atidaryti viską (#)}many{&amp;Atidaryti viską (#)}other{&amp;Atidaryti viską (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index af0f2b0d9..dd73721 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -238,6 +238,7 @@
 <translation id="1361655923249334273">Neizmantots</translation>
 <translation id="1361872463926621533">Atskaņot skaņu sākumā</translation>
 <translation id="1364702626840264065">{NUM_TABS,plural, =1{Aizvērt cilni}zero{Aizvērt cilnes}one{Aizvērt cilnes}other{Aizvērt cilnes}}</translation>
+<translation id="1365180424462182382">Jūsu <ph name="BEGIN_LINK" />pārlūkprogrammu pārvalda<ph name="END_LINK" /> <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1366177842110999534">Palaidiet Linux rīkus, redaktorus un IDE savā <ph name="DEVICE_TYPE" />. &lt;a target="_blank" href="<ph name="URL" />"&gt;Uzziniet vairāk&lt;/a&gt;</translation>
 <translation id="1367951781824006909">Izvēlēties failu</translation>
 <translation id="1371301976177520732">Jūsu grāmatzīmes, paroles, vēsture un cits saturs visās jūsu ierīcēs</translation>
@@ -265,7 +266,6 @@
 <translation id="140723521119632973">Mobilā tīkla aktivizācija</translation>
 <translation id="1407489512183974736">Apgriezt un centrēt</translation>
 <translation id="1408504635543854729">Pārlūkojiet ierīces saturu lietotnē Faili. Saturu ierobežo administrators, un to nevar mainīt.</translation>
-<translation id="1408789165795197664">Papildu...</translation>
 <translation id="1409390508152595145">Izveidot uzraudzīto lietotāju</translation>
 <translation id="1410197035576869800">Lietotnes ikona</translation>
 <translation id="1410616244180625362">Arī turpmāk ļaut vietnei <ph name="HOST" /> piekļūt kamerai</translation>
@@ -471,6 +471,7 @@
 <translation id="1719312230114180055">Piezīme. Jūsu pirksta nospiedums var būt mazāk drošs nekā sarežģīta parole vai PIN.</translation>
 <translation id="1720318856472900922">TLS WWW servera autentifikācija</translation>
 <translation id="1721937473331968728">Varat pievienot pakalpojumam <ph name="CLOUD_PRINT_NAME" /> klasiskos printerus, ar kuriem jūsu datoram ir izveidots savienojums.</translation>
+<translation id="1722460139690167654">Jūsu ierīci <ph name="BEGIN_LINK" />(veids: <ph name="DEVICE_TYPE" />) pārvalda<ph name="END_LINK" /> <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1723824996674794290">Jauns logs</translation>
 <translation id="1725149567830788547">Rādīt &amp;vadīklas</translation>
 <translation id="1726100011689679555">Nosaukumu serveri</translation>
@@ -487,6 +488,7 @@
 <translation id="1744060673522309905">Ierīci nevar saistīt ar domēnu. Nepārsniedziet pievienojamo ierīču skaitu.</translation>
 <translation id="1744108098763830590">fona lapa</translation>
 <translation id="1745520510852184940">Vienmēr</translation>
+<translation id="174617397682753897">Kerberos konti</translation>
 <translation id="1746402432151920942">Aizsargāta multivides satura identifikators</translation>
 <translation id="175196451752279553">Vēlr&amp;eiz atvērt aizvērto cilni</translation>
 <translation id="1753905327828125965">Visapmeklētākais</translation>
@@ -793,6 +795,7 @@
 <translation id="2224551243087462610">Rediģēt mapes nosaukumu</translation>
 <translation id="2226449515541314767">Šajā vietnē ir bloķēta MIDI ierīču pilnīga pārvaldība.</translation>
 <translation id="2226720438730111184">Aprakstiet problēmu.</translation>
+<translation id="2227179592712503583">Noņemt ieteikumu</translation>
 <translation id="2229161054156947610">Atlikusi vairāk nekā 1 stunda</translation>
 <translation id="222931766245975952">Fails ir saīsināts</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -807,6 +810,7 @@
 <translation id="2241634353105152135">Tikai vienreiz</translation>
 <translation id="2242687258748107519">Faila informācija</translation>
 <translation id="2246549592927364792">Vai vēlaties iegūt attēlu aprakstus no Google?</translation>
+<translation id="2249269794707377949">Šeit var pārvaldīt visus Kerberos kontus, kas tiek izmantoti, lai veiktu vienotu pierakstīšanos noteiktās lietotnēs un vietnēs un kopīgotu failus.</translation>
 <translation id="224940702122312781">Šī lapa patērēs daudz datu.</translation>
 <translation id="2249605167705922988">piem., 1-5, 8, 11-13</translation>
 <translation id="2251218783371366160">Atvēršana, izmantojot sistēmas skatītāju</translation>
@@ -869,6 +873,7 @@
 <translation id="2342740338116612727">Grāmatzīmes pievienotas</translation>
 <translation id="2343747224442182863">Izcelt šo cilni</translation>
 <translation id="2344028582131185878">Automātiskās lejupielādes</translation>
+<translation id="2345574157728712751">Atļaut Play veikala lietojumprogrammām piekļūt šai ierīcei iestatījumos.</translation>
 <translation id="2345723121311404059">1 lapa nosūtīta printerim <ph name="PRINTER_NAME" /></translation>
 <translation id="2347644257713614136">Uz funkcijas Hangouts un paplašinājuma Cast for Education izmantošanu attiecas Google konfidencialitātes politika.</translation>
 <translation id="2348176352564285430">Lietotne: <ph name="ARC_PROCESS_NAME" /></translation>
@@ -1033,6 +1038,7 @@
 <translation id="2588636910004461974">Ierīces no: <ph name="VENDOR_NAME" /></translation>
 <translation id="258932246702879617">Atlasiet opciju <ph name="BEGIN_BOLD" />Piespraust uzdevumjoslai<ph name="END_BOLD" /></translation>
 <translation id="2594999711683503743">Meklējiet Google tīklā vai ierakstiet vietrādi URL</translation>
+<translation id="2597521610396315071">Uzraudzības iestatīšana</translation>
 <translation id="2603115962224169880">Tīriet datoru</translation>
 <translation id="2603463522847370204">Atvērt &amp;inkognito režīma logā</translation>
 <translation id="2604255671529671813">Tīkla savienojuma kļūda</translation>
@@ -1252,6 +1258,7 @@
 <translation id="2916073183900451334">Tabulēšanas taustiņa piespiešana tīmekļa lapā izgaismo saites, kā arī veidlapu laukus</translation>
 <translation id="2916745397441987255">Meklēt paplašinājumus</translation>
 <translation id="2921081876747860777">Paroles izveide lokālo datu aizsardzībai</translation>
+<translation id="2923234477033317484">Noņemt šo kontu</translation>
 <translation id="2926085873880284723">Atjaunot noklusējuma saīsnes</translation>
 <translation id="2927017729816812676">Kešatmiņas krātuve</translation>
 <translation id="2932085390869194046">Ieteikt paroli...</translation>
@@ -1825,6 +1832,7 @@
 <translation id="381202950560906753">Pievienot citu</translation>
 <translation id="3812525830114410218">Nederīgs sertifikāts</translation>
 <translation id="3813296892522778813">Ja nevarat atrast meklēto saturu, pārejiet uz <ph name="BEGIN_LINK_CHROMIUM" />Google Chrome palīdzību<ph name="END_LINK_CHROMIUM" /></translation>
+<translation id="3816118180265633665">Chrome krāsas</translation>
 <translation id="3817579325494460411">Nav norādīts</translation>
 <translation id="3819257035322786455">Dublējiet</translation>
 <translation id="3819261658055281761">Sistēmā neizdevās saglabāt šīs ierīces ilgtermiņa API piekļuves pilnvaru.</translation>
@@ -1949,6 +1957,7 @@
 <translation id="3982375475032951137">Iestatiet pārlūku, veicot dažas vienkāršas darbības</translation>
 <translation id="3983400541576569538">No dažām programmām apkopotie dati var tikt zaudēti</translation>
 <translation id="3983586614702900908">ierīces, ko piedāvā nezināms ražotājs</translation>
+<translation id="3983764759749072418">Play veikala lietojumprogrammām ir piekļuve šai ierīcei.</translation>
 <translation id="3984159763196946143">Nevarēja sākt demonstrācijas režīmu</translation>
 <translation id="3984431586879874039">Vai atļaut šai vietnei skatīt jūsu drošības atslēgu?</translation>
 <translation id="3987938432087324095">Diemžēl nav saprotams.</translation>
@@ -2063,6 +2072,7 @@
 <translation id="4159681666905192102">Šis ir bērniem paredzēts konts, ko pārvalda <ph name="CUSTODIAN_EMAIL" /> un <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation>
 <translation id="4163560723127662357">Nezināma tastatūra</translation>
 <translation id="4168015872538332605">Daži iestatījumi, ko veica <ph name="PRIMARY_EMAIL" />, ir kopīgoti ar jums. Šie iestatījumi ietekmē jūsu kontu tikai tad, kad izmantojat vairākkārtēju pierakstīšanos.</translation>
+<translation id="4169535189173047238">Neatļaut</translation>
 <translation id="4170314459383239649">Aizverot notīrīt</translation>
 <translation id="4172051516777682613">Vienmēr rādīt</translation>
 <translation id="4175737294868205930">Pastāvīga krātuve</translation>
@@ -2222,6 +2232,7 @@
 <translation id="4453946976636652378">Meklējiet <ph name="SEARCH_ENGINE_NAME" /> meklētājprogrammā vai ierakstiet URL</translation>
 <translation id="4462159676511157176">Pielāgoti nosaukumu serveri</translation>
 <translation id="4469477701382819144">Bloķētas vietnēs, kurās tiek rādītas traucējošas vai maldinošas reklāmas</translation>
+<translation id="4470957202018033307">Ārējās atmiņas preferences</translation>
 <translation id="447252321002412580">Palīdzēt uzlabot Chrome funkcijas un veiktspēju</translation>
 <translation id="4472575034687746823">Sākt darbu</translation>
 <translation id="4474155171896946103">Saglabāt visas cilnes kā grāmatzīmes...</translation>
@@ -2578,6 +2589,7 @@
 <translation id="504561833207953641">Tiek atvērts esošā pārlūka sesijā.</translation>
 <translation id="5047421709274785093">Neļaut vietnēm izmantot kustību un gaismas sensorus</translation>
 <translation id="5050042263972837708">Grupas nosaukums</translation>
+<translation id="5051836348807686060">Pareizrakstības pārbaude netiek atbalstīta atlasītajās valodās</translation>
 <translation id="5052499409147950210">Vietnes rediģēšana</translation>
 <translation id="5053604404986157245">Pēc nejaušības principa ģenerētā TPM parole nav pieejama. Tā nereti notiek pēc funkcijas Powerwash izmantošanas.</translation>
 <translation id="5057110919553308744">Kad noklikšķināt uz paplašinājuma</translation>
@@ -2658,9 +2670,9 @@
 <translation id="5184063094292164363">&amp;JavaScript konsole</translation>
 <translation id="5184662919967270437">Notiek ierīces atjaunināšana</translation>
 <translation id="5185386675596372454"><ph name="EXTENSION_NAME" /> jaunākā versija ir atspējota, jo tai ir nepieciešams vairāk atļauju.</translation>
-<translation id="5187295959347858724">Šobrīd esat pierakstījies pakalpojumā <ph name="SHORT_PRODUCT_NAME" />. Jūsu grāmatzīmes, vēsture un citi iestatījumi tiek sinhronizēti ar jūsu Google kontu.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vēlas lejupielādēt vairākus failus</translation>
+<translation id="5202089186707505116">Vai atļaut šai vietnei piekļūt jūsu VR sensoriem?</translation>
 <translation id="5204673965307125349">Lūdzu, izpildiet ierīcei funkciju Powerwash un mēģiniet vēlreiz.</translation>
 <translation id="5204967432542742771">Ievadiet paroli</translation>
 <translation id="5206215183583316675">Vai dzēst “<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -2756,6 +2768,7 @@
 <translation id="5331975486040154427">USB-C ierīce (pieslēgvieta kreisajā pusē aizmugurē)</translation>
 <translation id="5334142896108694079">Skriptu kešatmiņa</translation>
 <translation id="5336126339807372270">Neatļaut nevienai vietnei piekļūt USB ierīcēm</translation>
+<translation id="5336688142483283574">Šī lapa tiks noņemta arī no jūsu vēstures un <ph name="SEARCH_ENGINE" /> darbībām.</translation>
 <translation id="5337771866151525739">Instalēts, izmantojot trešās puses lietotni.</translation>
 <translation id="5338503421962489998">Vietējā krātuve</translation>
 <translation id="5340638867532133571">Atļaut vietnēm instalēt maksājumu apdarinātājus (ieteicams)</translation>
@@ -2874,6 +2887,7 @@
 <translation id="5518584115117143805">Nosūtīt pa e-pastu šifrējuma sertifikātu</translation>
 <translation id="5521078259930077036">Vai šī ir lapa “Sākums”, ko bijāt gaidījis?</translation>
 <translation id="5522156646677899028">Šis paplašinājums nopietni apdraud drošību.</translation>
+<translation id="5523201311986093262">Foni</translation>
 <translation id="5525677322972469346">Izveidot jaunu uzraudzītu lietotāju</translation>
 <translation id="5526701598901867718">Visi (nedroši)</translation>
 <translation id="5526745900034778153">Pierakstīties vēlreiz, lai atsāktu sinhronizēšanu</translation>
@@ -3976,6 +3990,7 @@
 <translation id="7230787553283372882">Pielāgojiet teksta lielumu.</translation>
 <translation id="7232750842195536390">Pārdēvēšana neizdevās</translation>
 <translation id="7235716375204803342">Notiek darbību iegūšana...</translation>
+<translation id="7235737137505019098">Jūsu drošības atslēgai nav pietiekami daudz brīvas vietas papildu kontiem.</translation>
 <translation id="7238585580608191973">SHA-256 pirkstu nospiedums</translation>
 <translation id="7240120331469437312">Sertifikāta subjekta cits nosaukums</translation>
 <translation id="7240339475467890413">Vai izveidot savienojumu ar jaunu tīklāju?</translation>
@@ -3992,6 +4007,7 @@
 <translation id="7254951428499890870">Vai tiešām vēlaties palaist lietotni <ph name="APP_NAME" /> diagnostikas režīmā?</translation>
 <translation id="7255002516883565667">Pašlaik vienu no savām kartēm varat izmantot tikai šajā ierīcē</translation>
 <translation id="7255220508626648026">Apraide: <ph name="ROUTETITLE" /></translation>
+<translation id="7255916308560539517">Vēlreiz pieskarieties drošības atslēgai, lai apstiprinātu atiestatīšanu. Tiks dzēsta visa drošības atslēgā saglabātā informācija, tostarp tās PIN.</translation>
 <translation id="7255935316994522020">Lietot</translation>
 <translation id="7256069762010468647">Vietne izmanto jūsu kameru.</translation>
 <translation id="7256405249507348194">Neatpazīta kļūda: <ph name="DESC" /></translation>
@@ -4027,6 +4043,7 @@
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Tālāk norādītā lietojumprogramma, iespējams, izraisa pārlūka Chrome nepareizu darbību.}zero{Tālāk norādītās lietojumprogrammas, iespējams, izraisa pārlūka Chrome nepareizu darbību.}one{Tālāk norādītās lietojumprogrammas, iespējams, izraisa pārlūka Chrome nepareizu darbību.}other{Tālāk norādītās lietojumprogrammas, iespējams, izraisa pārlūka Chrome nepareizu darbību.}}</translation>
 <translation id="7303281435234579599">Hmm... Iestatot demonstrācijas režīmu, radās problēma.</translation>
 <translation id="7303900363563182677">Šajā vietnē ir bloķēta starpliktuvē kopētā teksta un attēlu skatīšana.</translation>
+<translation id="7305123176580523628">USB printeris pievienots</translation>
 <translation id="730515362922783851">apmainīties datiem ar jebkuru ierīci lokālajā tīklā vai internetā</translation>
 <translation id="7307129035224081534">Apturēta</translation>
 <translation id="7308002049209013926">Izmantojiet palaišanas programmu, lai ātri piekļūtu lietotnēm un darbībām. Lai tām piekļūtu, izmantojot tastatūru, nospiediet taustiņu kombināciju Alt + Shift + L.</translation>
@@ -4134,7 +4151,6 @@
 <translation id="7481312909269577407">Pārsūtīt</translation>
 <translation id="748138892655239008">Sertifikāta pamatierobežojumi</translation>
 <translation id="7487067081878637334">Tehnoloģijas</translation>
-<translation id="7487099628810939106">Aizkave pirms klikšķa:</translation>
 <translation id="7487141338393529395">Uzlabotās pareizrakstības pārbaudes ieslēgšana</translation>
 <translation id="7487969577036436319">Nav instalēts neviens komponents.</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Atvērt visas}=1{Atvērt grāmatzīmi}zero{Atvērt visas (#)}one{Atvērt visas (#)}other{Atvērt visas (#)}}</translation>
@@ -4151,6 +4167,7 @@
 <translation id="7502658306369382406">IPv6 adrese</translation>
 <translation id="7503191893372251637">Netscape sertifikāta veids</translation>
 <translation id="7503821294401948377">Nevarēja ielādēt pārlūka darbības ikonu “<ph name="ICON" />”.</translation>
+<translation id="7503985202154027481">Ieraksts par jūsu apmeklējumu šajā vietnē tiks reģistrēts jūsu drošības atslēgā.</translation>
 <translation id="750509436279396091">Atvērt lejupielāžu mapi</translation>
 <translation id="7506541170099744506">Jūsu <ph name="DEVICE_TYPE" /> ierīce ir sekmīgi reģistrēta uzņēmuma pārvaldībai.</translation>
 <translation id="7507930499305566459">Statusa atbildētāja sertifikāts</translation>
@@ -4163,6 +4180,7 @@
 <translation id="7529411698175791732">Pārbaudiet interneta savienojumu. Ja neizdodas novērst problēmu, izrakstieties un atkārtoti pierakstieties.</translation>
 <translation id="7530016656428373557">Izlādes ātrums vatos</translation>
 <translation id="7531779363494549572">Pārejiet uz sadaļu Iestatījumi &gt; Lietotnes un paziņojumi &gt; Paziņojumi.</translation>
+<translation id="7536220825385726660">Atļaut Play veikala lietojumprogrammām piekļūt ārējiem diskiem</translation>
 <translation id="7537601449003285327">Piespraust pie uzdevumjoslas</translation>
 <translation id="7539856059004947393">Bluetooth drošības atslēga</translation>
 <translation id="7540972813190816353">Pārbaudot atjauninājumus, radās kļūda: <ph name="ERROR" /></translation>
@@ -4192,6 +4210,7 @@
 <translation id="7574650250151586813">Lai ievadītu tekstu, atjauniniet Daydream tastatūras lietotni</translation>
 <translation id="7576690715254076113">Kārtot</translation>
 <translation id="7576976045740938453">Radās problēma ar demonstrācijas režīma kontu.</translation>
+<translation id="757941033127302446">Pierakstījies</translation>
 <translation id="7580671184200851182">Atskaņot to pašu audio saturu visos skaļruņos (mono audio)</translation>
 <translation id="7581462281756524039">Tīrīšanas rīks</translation>
 <translation id="7582582252461552277">Dot priekšroku šim tīklam</translation>
@@ -4249,6 +4268,7 @@
 <translation id="7665369617277396874">Pievienot kontu</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Nepareizs PIN. Ir atlicis viens mēģinājums.}zero{Nepareizs PIN. Ir atlikuši # mēģinājumi.}one{Nepareizs PIN. Ir atlicis # mēģinājums.}other{Nepareizs PIN. Ir atlikuši # mēģinājumi.}}</translation>
 <translation id="7671130400130574146">Izmantot sistēmas virsrakstjoslu un apmales</translation>
+<translation id="767127784612208024">Pieskarieties, lai apstiprinātu atiestatīšanu</translation>
 <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, lapā <ph name="PAGE_TITLE" /></translation>
 <translation id="7676867886086876795">Nosūtiet savus balss datus Google serveriem, lai atļautu diktēšanu jebkurā teksta laukā.</translation>
 <translation id="7678280409648629969">Pierakstīšanās dati tiks glabāti pārlūkprogrammā Chrome pēc tam, kad iziesiet no inkognito režīma. Tādējādi varēsiet vēlāk atkārtoti izmantot Touch ID ar šo vietni.</translation>
@@ -4434,6 +4454,7 @@
 <translation id="7925247922861151263">AAA pārbaude neizdevās</translation>
 <translation id="7925285046818567682">Gaida <ph name="HOST_NAME" />...</translation>
 <translation id="7926423016278357561">Tas nebiju es.</translation>
+<translation id="7928836894214140642">Pārvalda <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="7930294771522048157">Šeit tiks parādīti saglabātie maksājumu veidi.</translation>
 <translation id="79312157130859720">Lietotne <ph name="APP_NAME" /> koplieto jūsu ekrānu un audio.</translation>
 <translation id="7931318309563332511">Nezināma</translation>
@@ -4461,6 +4482,7 @@
 <translation id="7959074893852789871">Failā bija iekļauti vairāki sertifikāti, no kuriem daži netika importēti:</translation>
 <translation id="7961015016161918242">Nekad</translation>
 <translation id="7963826112438303517">Jūsu Asistents izmanto šos ierakstus un jūsu izrunātos pieprasījumus, lai izveidotu un atjauninātu jūsu balss modeli, kas tiek glabāts tikai ierīcēs, kurās esat ieslēdzis funkciju Voice Match. Skatiet vai pārveidojiet balss darbību Asistenta iestatījumos.</translation>
+<translation id="796416202355062143"><ph name="ORIGIN" /> vēlas meklēt tuvumā esošas Bluetooth ierīces. Ir atrastas tālāk norādītās ierīces.</translation>
 <translation id="7966241909927244760">Kopēt attēla adresi</translation>
 <translation id="7968742106503422125">Lasīt un modificēt datus, kurus jūs kopējat un ielīmējat</translation>
 <translation id="7968833647796919681">Iespējot veiktspējas datu apkopošanu</translation>
@@ -4560,11 +4582,13 @@
     <ph name="BEGIN_PARAGRAPH4" />Dublētie dati netiek ieskaitīti jūsu Diska krātuves kvotā.<ph name="END_PARAGRAPH4" />
     <ph name="BEGIN_PARAGRAPH5" />Šo pakalpojumu varat izslēgt sadaļā Iestatījumi.<ph name="END_PARAGRAPH5" /></translation>
 <translation id="80974698889265265">PIN vērtības neatbilst.</translation>
+<translation id="8099495042588009598">Citas atļaujas</translation>
 <translation id="8101987792947961127">Nākamajā atkārtotas palaišanas reizē jāizpilda funkcija Powerwash</translation>
 <translation id="8102159139658438129">Dodieties uz sadaļu <ph name="LINK_BEGIN" />Iestatījumi<ph name="LINK_END" />, lai skatītu pievienotā tālruņa opcijas.</translation>
 <translation id="8104696615244072556">Aktivizējiet savā <ph name="IDS_SHORT_PRODUCT_NAME" /> ierīcē funkciju Powerwash un atjaunojiet iepriekšējo versiju.</translation>
 <translation id="8105368624971345109">Izslēgt</translation>
 <translation id="8107015733319732394">Notiek Google Play veikala instalēšana jūsu ierīcē (<ph name="DEVICE_TYPE" />). Tas var ilgt dažas minūtes.</translation>
+<translation id="810875025413331850">Nav atrasta neviena tuvumā esoša ierīce.</translation>
 <translation id="8111155949205007504">Kopīgojiet šo paroli ar savu iPhone tālruni</translation>
 <translation id="8113043281354018522">Izvēlieties licences veidu</translation>
 <translation id="8116972784401310538">&amp;Grāmatzīmju pārvaldnieks</translation>
@@ -4715,6 +4739,7 @@
 <translation id="8363095875018065315">stabila</translation>
 <translation id="8363142353806532503">Mikrofona lietošana ir bloķēta</translation>
 <translation id="8366396658833131068">Tīkla savienojums ir atjaunots. Lūdzu, atlasiet citu tīklu vai nospiediet tālāk esošo pogu “Turpināt”, lai palaistu savu kioska lietotni.</translation>
+<translation id="8368027906805972958">Nezināma vai neatbalstīta ierīce (<ph name="DEVICE_ID" />)</translation>
 <translation id="8368859634510605990">&amp;Atvērt visas grāmatzīmes</translation>
 <translation id="8371695176452482769">Runājiet tūlīt</translation>
 <translation id="8371925839118813971">{NUM_TABS,plural, =1{Nerādīt vietni}zero{Nerādīt vietnes}one{Nerādīt vietnes}other{Nerādīt vietnes}}</translation>
@@ -4914,6 +4939,7 @@
 <translation id="8678648549315280022">Pārvaldīt lejupielādes iestatījumus...</translation>
 <translation id="8678933587484842200">Kā vēlaties palaist šo lietojumprogrammu?</translation>
 <translation id="8680251145628383637">Pierakstieties, lai lietotu savas grāmatzīmes, vēsturi, paroles un citus iestatījumus visās savās ierīcēs. Turklāt jūs tiksiet automātiski pierakstīts savos Google pakalpojumos.</translation>
+<translation id="8682730193597992579">Printeris <ph name="PRINTER_NAME" /> ir pievienots un gatavs darbam</translation>
 <translation id="8688579245973331962">Vai neredzat savu vārdu?</translation>
 <translation id="8688591111840995413">Nepareiza parole</translation>
 <translation id="8688672835843460752">Pieejams</translation>
@@ -5067,6 +5093,7 @@
 <translation id="8898840733695078011">Signāla stiprums</translation>
 <translation id="8899851313684471736">Atvērt saiti jaunā logā</translation>
 <translation id="8902667442496790482">Atvērt funkcijas “Atlasīt, lai izrunātu” iestatījumus</translation>
+<translation id="8903263458134414071">Atlasiet kontu, kurā pierakstīties</translation>
 <translation id="8904976895050290827">Chrome Sync</translation>
 <translation id="890616557918890486">Mainīt avotu</translation>
 <translation id="8909833622202089127">Vietne izseko jūsu atrašanās vietu.</translation>
@@ -5153,6 +5180,7 @@
 <translation id="9040661932550800571">Vai atjaunināt paroli vietnei <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Administrators ir atspējojis piekļuvi lokālajiem failiem jūsu datorā.</translation>
 <translation id="9041909613332246191">Šis fails parasti netiek lejupielādēts un var būt bīstams. Jūsu konts ir aizsargāts ar papildu aizsardzības funkcijām.</translation>
+<translation id="9042858701776831292">Google Play veikala lietojumprogrammas var prasīt piekļuvi ārējām atmiņas ierīcēm, lai lasītu un rakstītu tajās esošus failus un mapes.</translation>
 <translation id="9042893549633094279">Konfidencialitāte un drošība</translation>
 <translation id="904451693890288097">Ievadiet ierīces <ph name="DEVICE_NAME" /> piekļuves atslēgu:</translation>
 <translation id="9044646465488564462">Neizdevās izveidot savienojumu ar tīklu: <ph name="DETAILS" />.</translation>
@@ -5212,6 +5240,7 @@
 <translation id="9137916601698928395">Atvērt saiti ar lietotāja <ph name="USER" /> kontu</translation>
 <translation id="9138978632494473300">Pievienot saīsnes šādās vietās:</translation>
 <translation id="9140067245205650184">Jūs izmantojat neatbalstītu funkcijas karodziņu: <ph name="BAD_FLAG" />. Tas negatīvi ietekmē darbības stabilitāti un drošību.</translation>
+<translation id="9143298529634201539">Vai noņemt ieteikumu?</translation>
 <translation id="9147304170847707004">Autentifikācijas metode</translation>
 <translation id="9147392381910171771">&amp;Iespējas</translation>
 <translation id="9148058034647219655">Iziet</translation>
@@ -5226,6 +5255,7 @@
 <translation id="916607977885256133">Attēls attēlā</translation>
 <translation id="9168436347345867845">Vēlāk</translation>
 <translation id="9169496697824289689">Skatīt īsinājumtaustiņus</translation>
+<translation id="916964310188958970">Kāpēc tiek rādīts šis ieteikums?</translation>
 <translation id="9169931577761441333">Pievienot lietotni <ph name="APP_NAME" /> sākuma ekrānam</translation>
 <translation id="9170848237812810038">&amp;Atsaukt</translation>
 <translation id="9170884462774788842">Cita datorā instalēta programma ir izraisījusi tāda motīva pievienošanu, kas var ietekmēt pārlūkprogrammas Chrome darbību.</translation>
@@ -5236,6 +5266,7 @@
 <translation id="9179734824669616955">Linux (Beta) iestatīšana jūsu <ph name="DEVICE_TYPE" /> ierīcē</translation>
 <translation id="9180281769944411366">Šis process var ilgt dažas minūtes. Notiek Linux konteinera startēšana.</translation>
 <translation id="9180380851667544951">Vietne var kopīgot jūsu ekrānu.</translation>
+<translation id="9185926955514281189">Krāsas un motīvi</translation>
 <translation id="9188441292293901223">Lūdzu, izmantojiet tālrunī jaunāku Android versiju, lai atbloķētu šo <ph name="DEVICE_TYPE" /> ierīci.</translation>
 <translation id="9188732951356337132">Lietojuma un diagnostikas datu sūtīšana. Pašlaik dati par šo ierīci un ierīces diagnostikas un lietotņu lietojuma dati tiek automātiski sūtīti uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Ja jūsu bērnam ir ieslēgts papildu iestatījums “Darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā. <ph name="BEGIN_LINK2" />Uzzināt vairāk<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPSec + iepriekš kopīgota atslēga</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 624bd91..6a28ffb 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">സെല്ലുലാൽ നെറ്റ്‌വർക്ക് സജീവമാക്കൽ</translation>
 <translation id="1407489512183974736">മധ്യഭാഗത്ത് മുറിക്കുക</translation>
 <translation id="1408504635543854729">ഫയലുകൾ ആപ്പിലെ ഉപകരണ ഉള്ളടക്കം അടുത്തറിയുക. ഒരു അഡ്‌മിൻ ഈ ഉള്ളടക്കം നിയന്ത്രിക്കുന്നതിനാൽ അതിൽ മാറ്റം വരുത്താനാകില്ല.</translation>
-<translation id="1408789165795197664">വിപുലമായ...</translation>
 <translation id="1409390508152595145">മേൽനോട്ടത്തിലുള്ള ഉപയോക്താവിനെ സൃഷ്‌ടിക്കുക</translation>
 <translation id="1410197035576869800">ആപ്പ് ഐക്കൺ</translation>
 <translation id="1410616244180625362">നിങ്ങളുടെ ക്യാമറ ആക്‌സസ് ചെയ്യുന്നതിന് <ph name="HOST" />-നെ അനുവദിക്കുന്നത് തുടരുക</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">&amp;JavaScript കണ്‍‌സോള്‍‌</translation>
 <translation id="5184662919967270437">നിങ്ങളുടെ ഉപകരണം അപ്‌ഡേറ്റ് ചെയ്യുന്നു.</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" എന്നതിന്റെ ഏറ്റവും പുതിയ പതിപ്പിന് കൂടുതൽ അനുമതികൾ ആവശ്യമുള്ളതുകൊണ്ട് അത് പ്രവർത്തനരഹിതമാക്കി.</translation>
-<translation id="5187295959347858724">നിങ്ങൾ ഇപ്പോൾ <ph name="SHORT_PRODUCT_NAME" />-ൽ പ്രവേശിച്ചു. നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണം എന്നിവയെല്ലാം നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നു.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" />, ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
 <translation id="5204673965307125349">ഉപകരണം Powerwash ചെയ്‌ത ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">മുന്നോട്ട്</translation>
 <translation id="748138892655239008">സര്‍‌ട്ടിഫിക്കറ്റ് ബേസിക് നിയന്ത്രണങ്ങള്‍‌</translation>
 <translation id="7487067081878637334">സാങ്കേതികവിദ്യ</translation>
-<translation id="7487099628810939106">ക്ലിക്കിനുമുമ്പുള്ള കാലതാമസം:</translation>
 <translation id="7487141338393529395">മെച്ചപ്പെട്ട അക്ഷരത്തെറ്റ് പരിശോധന ഓണാക്കുക</translation>
 <translation id="7487969577036436319">ഘടകങ്ങളൊന്നും ഇൻസ്റ്റാളുചെയ്‌തിട്ടില്ല</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;എല്ലാം തുറക്കുക}=1{&amp;ബുക്ക്‌മാർക്ക് തുറക്കുക}other{&amp;എല്ലാം (#) തുറക്കുക}}</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 5b009f1..b01cf2c 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">सेल्युलर अ‍ॅक्टिव्हेशन</translation>
 <translation id="1407489512183974736">मध्यभागी क्रॉप केला</translation>
 <translation id="1408504635543854729">Files अॅपमध्ये डिव्हाइसचा आशय एक्सप्लोर करा. अॅडमिनिस्ट्रेटरने आशय प्रतिबंधित केला आहे आणि त्यात बदल केला जाऊ शकत नाही.</translation>
-<translation id="1408789165795197664">प्रगत...</translation>
 <translation id="1409390508152595145">पर्यवेक्षित वापरकर्ता तयार करा</translation>
 <translation id="1410197035576869800">अ‍ॅप आयकन</translation>
 <translation id="1410616244180625362">तुमचा कॅमेरा अॅक्सेस करण्यासाठी <ph name="HOST" /> ला परवानगी  देणे सुरू ठेवा</translation>
@@ -2657,7 +2656,6 @@
 <translation id="5184063094292164363">&amp;JavaScript कन्सोल</translation>
 <translation id="5184662919967270437">तुमचे डिव्हाइस अपडेट करीत आहे</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" ची नवीनतम आवृत्ती अक्षम केली गेली कारण यासाठी अधिक परवानग्या आवश्यक आहेत.</translation>
-<translation id="5187295959347858724">तुम्ही आता <ph name="SHORT_PRODUCT_NAME" />मध्‍ये साइन इन केले आहे. तुमचे बुकमार्क, इतिहास, आणि इतर सेटिंग्ज आपल्या Google खात्यात समक्रमीत केल्या जात आहेत.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ला एकाहून अधिक फायली डाउनलोड करायच्या आहेत</translation>
 <translation id="5204673965307125349">कृपया डिव्हाइस पॉवरवॉश करा आणि पुन्हा प्रयत्न करा.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">पुढील</translation>
 <translation id="748138892655239008">सर्टिफिकेट मूळ प्रतिबंध</translation>
 <translation id="7487067081878637334">तंत्रज्ञान</translation>
-<translation id="7487099628810939106">क्लिक करण्यापूर्वी विलंब:</translation>
 <translation id="7487141338393529395">वर्धित केलेले स्पेल चेक सुरू करा</translation>
 <translation id="7487969577036436319">कोणतेही घटक इंस्टॉल केलेले नाहीत</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{आणि सर्व उघडा}=1{आणि बुकमार्क उघडा}other{आणि सर्व (#) उघडा}}</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index a00ab95e..e3b01b72 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Pengaktifan Selular</translation>
 <translation id="1407489512183974736">Tengah Dipotong</translation>
 <translation id="1408504635543854729">Teroka kandungan peranti dalam apl Fail. Kandungan dihadkan oleh pentadbir dan tidak boleh diubah suai.</translation>
-<translation id="1408789165795197664">Lanjutan...</translation>
 <translation id="1409390508152595145">Buat pengguna diselia</translation>
 <translation id="1410197035576869800">Ikon Apl</translation>
 <translation id="1410616244180625362">Terus benarkan <ph name="HOST" /> mengakses kamera anda</translation>
@@ -2659,7 +2658,6 @@
 <translation id="5184063094292164363">&amp;Konsol JavaScript</translation>
 <translation id="5184662919967270437">Mengemas kini peranti anda</translation>
 <translation id="5185386675596372454">Versi terbaharu "<ph name="EXTENSION_NAME" />" telah dilumpuhkan kerana ia memerlukan lebih banyak kebenaran.</translation>
-<translation id="5187295959347858724">Anda sekarang dilog masuk ke <ph name="SHORT_PRODUCT_NAME" />. Penanda halaman, sejarah dan tetapan anda yang lain sedang disegerakkan dengan Akaun Google anda.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> mahu memuat turun berbilang fail</translation>
 <translation id="5204673965307125349">Sila lakukan powerwash pada peranti dan cuba lagi.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">Majukan</translation>
 <translation id="748138892655239008">Kekangan Asas Sijil</translation>
 <translation id="7487067081878637334">Teknologi</translation>
-<translation id="7487099628810939106">Lengahan sebelum klik:</translation>
 <translation id="7487141338393529395">Hidupkan Semak Ejaan yang Dipertingkatkan</translation>
 <translation id="7487969577036436319">Tiada komponen dipasang</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Buka semua}=1{&amp;Buka penanda halaman}other{&amp;Buka semua (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 15964ad..531df8a2 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Mobiele activering</translation>
 <translation id="1407489512183974736">Midden bijsnijden</translation>
 <translation id="1408504635543854729">Verken de content op het apparaat in de app Bestanden. De content wordt beperkt door een beheerder en kan niet worden aangepast.</translation>
-<translation id="1408789165795197664">Geavanceerd...</translation>
 <translation id="1409390508152595145">Gebruiker met beperkte rechten maken</translation>
 <translation id="1410197035576869800">App-pictogram</translation>
 <translation id="1410616244180625362"><ph name="HOST" /> toegang tot je camera blijven geven</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-console</translation>
 <translation id="5184662919967270437">Je apparaat updaten</translation>
 <translation id="5185386675596372454">De nieuwste versie van '<ph name="EXTENSION_NAME" />' is uitgeschakeld omdat er meer rechten voor nodig zijn.</translation>
-<translation id="5187295959347858724">Je bent nu ingelogd bij <ph name="SHORT_PRODUCT_NAME" />. Je bladwijzers, geschiedenis en andere instellingen worden gesynchroniseerd met je Google-account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> wil meerdere bestanden downloaden</translation>
 <translation id="5204673965307125349">Voer een powerwash uit op het apparaat en probeer het opnieuw.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Vooruit</translation>
 <translation id="748138892655239008">Basisvereisten voor certificaten</translation>
 <translation id="7487067081878637334">Technologie</translation>
-<translation id="7487099628810939106">Vertragen vóór klikken:</translation>
 <translation id="7487141338393529395">Verbeterde spellingcontrole inschakelen</translation>
 <translation id="7487969577036436319">Er zijn geen componenten geïnstalleerd</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Alles &amp;openen}=1{Bladwijzer &amp;openen}other{Alles (#) &amp;openen}}</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 3185df92..cd70732 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivering med mobiltelefon</translation>
 <translation id="1407489512183974736">Midstill og beskjær</translation>
 <translation id="1408504635543854729">Utforsk innholdet på enheten med Filer-appen. En administrator har gjort innholdet tilgangsbegrenset, så det kan ikke endres.</translation>
-<translation id="1408789165795197664">Avansert</translation>
 <translation id="1409390508152595145">Opprett administrert bruker</translation>
 <translation id="1410197035576869800">Appikon</translation>
 <translation id="1410616244180625362">Fortsett å tillate <ph name="HOST" /> å bruke kameraet ditt</translation>
@@ -2651,7 +2650,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-konsoll</translation>
 <translation id="5184662919967270437">Oppdaterer enheten</translation>
 <translation id="5185386675596372454">Den nyeste versjonen av <ph name="EXTENSION_NAME" /> er deaktivert fordi den krever ytterligere tillatelser.</translation>
-<translation id="5187295959347858724">Du er nå pålogget <ph name="SHORT_PRODUCT_NAME" />. Bokmerkene, loggen og de andre innstillingene dine blir synkronisert med Google-kontoen din.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ber om å laste ned flere filer</translation>
 <translation id="5204673965307125349">Utfør Powerwash på enheten, og prøv på nytt.</translation>
@@ -4127,7 +4125,6 @@
 <translation id="7481312909269577407">Frem</translation>
 <translation id="748138892655239008">Hovedbegrensninger for sertifikat</translation>
 <translation id="7487067081878637334">Teknologi</translation>
-<translation id="7487099628810939106">Forsinkelse før klikk:</translation>
 <translation id="7487141338393529395">Slå på forbedret stavekontroll</translation>
 <translation id="7487969577036436319">Ingen komponenter er installert</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Åpne alle}=1{&amp;Åpne bokmerket}other{&amp;Åpne alle (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index e336ae6..bc38600 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -238,6 +238,7 @@
 <translation id="1361655923249334273">Nieużywany</translation>
 <translation id="1361872463926621533">Odtwórz dźwięk podczas uruchamiania</translation>
 <translation id="1364702626840264065">{NUM_TABS,plural, =1{Zamknij kartę}few{Zamknij karty}many{Zamknij karty}other{Zamknij karty}}</translation>
+<translation id="1365180424462182382">Twoją <ph name="BEGIN_LINK" />przeglądarką zarządza<ph name="END_LINK" /> <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1366177842110999534">Używaj na urządzeniu <ph name="DEVICE_TYPE" /> narzędzi, edytorów i IDE na Linuksa. &lt;a target="_blank" href="<ph name="URL" />"&gt;Więcej informacji&lt;/a&gt;</translation>
 <translation id="1367951781824006909">Wybierz plik</translation>
 <translation id="1371301976177520732">Twoje zakładki, hasła, historia i inne dane na wszystkich Twoich urządzeniach</translation>
@@ -265,7 +266,6 @@
 <translation id="140723521119632973">Aktywowanie sieci komórkowej</translation>
 <translation id="1407489512183974736">Wyśrodkuj i przytnij</translation>
 <translation id="1408504635543854729">Przeglądaj zawartość urządzenia w aplikacji Pliki. Dostępna zawartość jest określana przez administratora i nie można jej zmienić.</translation>
-<translation id="1408789165795197664">Zaawansowane...</translation>
 <translation id="1409390508152595145">Utwórz nadzorowanego użytkownika</translation>
 <translation id="1410197035576869800">Ikona aplikacji</translation>
 <translation id="1410616244180625362">Nadal zezwalaj witrynie <ph name="HOST" /> na dostęp do kamery</translation>
@@ -471,6 +471,7 @@
 <translation id="1719312230114180055">Uwaga: odcisk palca może być mniej bezpieczny niż silne hasło czy kod PIN.</translation>
 <translation id="1720318856472900922">Uwierzytelnianie serwera WWW TLS</translation>
 <translation id="1721937473331968728">Tradycyjne drukarki podłączone do komputera możesz dodać do <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="1722460139690167654">Twoim urządzeniem <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> zarządza<ph name="END_LINK" /> domena <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="1723824996674794290">&amp;Nowe okno</translation>
 <translation id="1725149567830788547">Pokaż elementy &amp;sterujące</translation>
 <translation id="1726100011689679555">Serwery nazw</translation>
@@ -487,6 +488,7 @@
 <translation id="1744060673522309905">Nie można dołączyć urządzenia do domeny. Upewnij się, że nie została przekroczona dozwolona liczba urządzeń.</translation>
 <translation id="1744108098763830590">strona w tle</translation>
 <translation id="1745520510852184940">Tłumacz zawsze</translation>
+<translation id="174617397682753897">Konta Kerberos</translation>
 <translation id="1746402432151920942">Identyfikator chronionych treści multimedialnych</translation>
 <translation id="175196451752279553">Prz&amp;ywróć zamkniętą kartę</translation>
 <translation id="1753905327828125965">Najczęstsze</translation>
@@ -789,10 +791,11 @@
 <translation id="2220529011494928058">Zgłoś problem</translation>
 <translation id="2220572644011485463">Kod PIN lub hasło</translation>
 <translation id="2224444042887712269">To ustawienie należy do <ph name="OWNER_EMAIL" />.</translation>
-<translation id="2224471211857467033">Zdarzenia związane z ułatwieniami dostępu</translation>
+<translation id="2224471211857467033">Zdarzenia związane z ułatwieniami dostępu</translation>
 <translation id="2224551243087462610">Edytuj nazwę folderu</translation>
 <translation id="2226449515541314767">Pełny dostęp do sterowania urządzeniami MIDI został dla tej witryny zablokowany.</translation>
 <translation id="2226720438730111184">Powiedz nam, co się dzieje</translation>
+<translation id="2227179592712503583">Usuń sugestię</translation>
 <translation id="2229161054156947610">Została ponad 1 godzina</translation>
 <translation id="222931766245975952">Plik obcięty</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -807,6 +810,7 @@
 <translation id="2241634353105152135">Tylko raz</translation>
 <translation id="2242687258748107519">Informacje o pliku</translation>
 <translation id="2246549592927364792">Pobierać opisy obrazów z Google?</translation>
+<translation id="2249269794707377949">Tutaj możesz zarządzać wszystkimi kontami Kerberos używanymi do logowania jednokrotnego w określonych aplikacjach i udziałach plików oraz na określonych stronach.</translation>
 <translation id="224940702122312781">Ta strona będzie przesyłać bardzo dużo danych.</translation>
 <translation id="2249605167705922988">np. 1–5, 8, 11–13</translation>
 <translation id="2251218783371366160">Otwórz w przeglądarce systemowej</translation>
@@ -869,6 +873,7 @@
 <translation id="2342740338116612727">Dodano zakładki</translation>
 <translation id="2343747224442182863">Ustaw tę kartę jako aktywną</translation>
 <translation id="2344028582131185878">Pobieranie automatyczne</translation>
+<translation id="2345574157728712751">W Ustawieniach możesz zezwolić aplikacjom ze Sklepu Play na dostęp do tego urządzenia.</translation>
 <translation id="2345723121311404059">Jedna strona do: <ph name="PRINTER_NAME" /></translation>
 <translation id="2347644257713614136">Korzystanie z Hangouts i Cast for Education podlega Polityce prywatności Google.</translation>
 <translation id="2348176352564285430">Aplikacja: <ph name="ARC_PROCESS_NAME" /></translation>
@@ -1033,6 +1038,7 @@
 <translation id="2588636910004461974">Urządzenia od dostawcy <ph name="VENDOR_NAME" /></translation>
 <translation id="258932246702879617">Wybierz <ph name="BEGIN_BOLD" />Przypnij na pasku zadań<ph name="END_BOLD" /></translation>
 <translation id="2594999711683503743">Wyszukaj w Google lub wpisz URL</translation>
+<translation id="2597521610396315071">Dodaj nadzór</translation>
 <translation id="2603115962224169880">Oczyść komputer</translation>
 <translation id="2603463522847370204">Otwórz w oknie &amp;incognito</translation>
 <translation id="2604255671529671813">Błąd połączenia z siecią</translation>
@@ -1252,6 +1258,7 @@
 <translation id="2916073183900451334">Naciśnięcie klawisza Tab na stronie internetowej powoduje podświetlenie linków, a także pól formularza</translation>
 <translation id="2916745397441987255">Szukaj w rozszerzeniach</translation>
 <translation id="2921081876747860777">Utwórz hasło, by chronić swoje dane lokalne.</translation>
+<translation id="2923234477033317484">Usuń to konto</translation>
 <translation id="2926085873880284723">Przywróć domyślne skróty</translation>
 <translation id="2927017729816812676">Pamięć podręczna</translation>
 <translation id="2932085390869194046">Zaproponuj hasło...</translation>
@@ -1825,6 +1832,7 @@
 <translation id="381202950560906753">Dodaj kolejny</translation>
 <translation id="3812525830114410218">Zły certyfikat</translation>
 <translation id="3813296892522778813">Jeśli nie możesz znaleźć potrzebnych informacji, otwórz <ph name="BEGIN_LINK_CHROMIUM" />pomoc dotyczącą Google Chrome<ph name="END_LINK_CHROMIUM" /></translation>
+<translation id="3816118180265633665">Kolory Chrome</translation>
 <translation id="3817579325494460411">Brak danych</translation>
 <translation id="3819257035322786455">Kopia zapasowa</translation>
 <translation id="3819261658055281761">System nie mógł zapisać długoterminowego tokenu dostępu do interfejsu API dla tego urządzenia.</translation>
@@ -1949,6 +1957,7 @@
 <translation id="3982375475032951137">Skonfiguruj przeglądarkę w kilku prostych krokach</translation>
 <translation id="3983400541576569538">Dane z niektórych aplikacji mogą zostać utracone</translation>
 <translation id="3983586614702900908">urządzenia od nieznanego dostawcy</translation>
+<translation id="3983764759749072418">Aplikacje ze Sklepu Play mają dostęp do tego urządzenia.</translation>
 <translation id="3984159763196946143">Nie udało się uruchomić trybu demonstracyjnego</translation>
 <translation id="3984431586879874039">Zezwolić tej stronie na odczytywanie danych klucza bezpieczeństwa?</translation>
 <translation id="3987938432087324095">Nie rozumiem.</translation>
@@ -2063,6 +2072,7 @@
 <translation id="4159681666905192102">To jest konto dla dzieci, którym zarządzają <ph name="CUSTODIAN_EMAIL" /> i <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation>
 <translation id="4163560723127662357">Nieznana klawiatura</translation>
 <translation id="4168015872538332605">Niektóre ustawienia należące do <ph name="PRIMARY_EMAIL" /> zostały Ci udostępnione. Mają one wpływ na Twoje konto, tylko jeśli korzystasz z wielokrotnego logowania.</translation>
+<translation id="4169535189173047238">Nie zezwalaj</translation>
 <translation id="4170314459383239649">Wyczyść przy zamykaniu</translation>
 <translation id="4172051516777682613">Zawsze pokazuj</translation>
 <translation id="4175737294868205930">Pamięć trwała</translation>
@@ -2222,6 +2232,7 @@
 <translation id="4453946976636652378">Wyszukaj w <ph name="SEARCH_ENGINE_NAME" /> lub wpisz URL</translation>
 <translation id="4462159676511157176">Własne serwery nazw</translation>
 <translation id="4469477701382819144">Blokowane na stronach, które wyświetlają uciążliwe lub wprowadzające w błąd reklamy</translation>
+<translation id="4470957202018033307">Ustawienia pamięci zewnętrznej</translation>
 <translation id="447252321002412580">Pomóż w ulepszaniu funkcji i działania Chrome</translation>
 <translation id="4472575034687746823">Rozpocznij</translation>
 <translation id="4474155171896946103">Dodaj wszystkie karty do zakładek...</translation>
@@ -2578,6 +2589,7 @@
 <translation id="504561833207953641">Otwieram w istniejącej sesji przeglądarki.</translation>
 <translation id="5047421709274785093">Nie zezwalaj stronom internetowym na używanie czujników ruchu i światła</translation>
 <translation id="5050042263972837708">Nazwa grupy</translation>
+<translation id="5051836348807686060">Sprawdzanie pisowni w wybranych językach nie jest obsługiwane</translation>
 <translation id="5052499409147950210">Edytowanie strony internetowej</translation>
 <translation id="5053604404986157245">Losowo generowane hasło TPM jest niedostępne. Ta sytuacja jest normalna po użyciu funkcji Powerwash.</translation>
 <translation id="5057110919553308744">Gdy klikniesz rozszerzenie</translation>
@@ -2658,9 +2670,9 @@
 <translation id="5184063094292164363">Konsola &amp;JavaScript</translation>
 <translation id="5184662919967270437">Aktualizuję urządzenie</translation>
 <translation id="5185386675596372454">Najnowsza wersja rozszerzenia „<ph name="EXTENSION_NAME" />” została wyłączona, ponieważ wymaga więcej uprawnień.</translation>
-<translation id="5187295959347858724">Jesteś zalogowany(a) do <ph name="SHORT_PRODUCT_NAME" />. Twoje zakładki, historia i inne ustawienia są synchronizowane z Twoim kontem Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> chce pobrać wiele plików</translation>
+<translation id="5202089186707505116">Zezwolić tej stronie na dostęp do czujników VR?</translation>
 <translation id="5204673965307125349">Wykonaj Powerwash urządzenia i spróbuj jeszcze raz.</translation>
 <translation id="5204967432542742771">Wpisz hasło</translation>
 <translation id="5206215183583316675">Usunąć „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -2756,6 +2768,7 @@
 <translation id="5331975486040154427">Urządzenie USB-C (tylny port na lewym boku)</translation>
 <translation id="5334142896108694079">Pamięć podręczna skryptów</translation>
 <translation id="5336126339807372270">Nie zezwalaj żadnym stronom na dostęp do urządzeń USB</translation>
+<translation id="5336688142483283574">Ta strona zostanie też usunięta z Twojej historii i aktywności w <ph name="SEARCH_ENGINE" />.</translation>
 <translation id="5337771866151525739">Zainstalowane przez inną firmę.</translation>
 <translation id="5338503421962489998">Przechowywanie lokalne</translation>
 <translation id="5340638867532133571">Zezwalaj stronom na instalowanie modułów do obsługi płatności (zalecane)</translation>
@@ -2874,6 +2887,7 @@
 <translation id="5518584115117143805">Certyfikat szyfrowania poczty e-mail</translation>
 <translation id="5521078259930077036">Czy to oczekiwana strona główna?</translation>
 <translation id="5522156646677899028">To rozszerzenie zawiera poważną lukę w zabezpieczeniach.</translation>
+<translation id="5523201311986093262">Tła</translation>
 <translation id="5525677322972469346">Utwórz nowego nadzorowanego użytkownika</translation>
 <translation id="5526701598901867718">Wszystkie (niebezpieczne)</translation>
 <translation id="5526745900034778153">Zaloguj się ponownie, by wznowić synchronizację</translation>
@@ -3976,6 +3990,7 @@
 <translation id="7230787553283372882">Dostosuj rozmiar tekstu</translation>
 <translation id="7232750842195536390">Nie udało się zmienić nazwy</translation>
 <translation id="7235716375204803342">Pobieram aktywność…</translation>
+<translation id="7235737137505019098">Na Twoim kluczu bezpieczeństwa nie ma wystarczającej ilości miejsca na kolejne konta.</translation>
 <translation id="7238585580608191973">Odcisk cyfrowy SHA-256</translation>
 <translation id="7240120331469437312">Alternatywna nazwa podmiotu certyfikatu</translation>
 <translation id="7240339475467890413">Połączyć z nowym hotspotem?</translation>
@@ -3992,6 +4007,7 @@
 <translation id="7254951428499890870">Czy na pewno chcesz uruchomić „<ph name="APP_NAME" />” w trybie diagnostycznym?</translation>
 <translation id="7255002516883565667">Obecnie masz jedną kartę, której można używać tylko na tym urządzeniu</translation>
 <translation id="7255220508626648026">Przesyłam: <ph name="ROUTETITLE" /></translation>
+<translation id="7255916308560539517">Jeszcze raz dotknij klucza bezpieczeństwa, by potwierdzić resetowanie. Usunięte zostaną wszystkie informacje zapisane w kluczu, w tym jego kod PIN.</translation>
 <translation id="7255935316994522020">Zastosuj</translation>
 <translation id="7256069762010468647">Strona używa kamery</translation>
 <translation id="7256405249507348194">Nierozpoznany błąd: <ph name="DESC" /></translation>
@@ -4027,6 +4043,7 @@
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Ta aplikacja może uniemożliwiać prawidłowe działanie Chrome.}few{Te aplikacje mogą uniemożliwiać prawidłowe działanie Chrome.}many{Te aplikacje mogą uniemożliwiać prawidłowe działanie Chrome.}other{Te aplikacje mogą uniemożliwiać prawidłowe działanie Chrome.}}</translation>
 <translation id="7303281435234579599">Ups! Podczas konfigurowania trybu demonstracyjnego coś poszło nie tak.</translation>
 <translation id="7303900363563182677">Ta witryna nie ma dostępu do tekstu ani obrazów skopiowanych do schowka</translation>
+<translation id="7305123176580523628">Podłączono drukarkę USB</translation>
 <translation id="730515362922783851">Wymiana danych z dowolnym urządzeniem w sieci lokalnej lub internecie</translation>
 <translation id="7307129035224081534">Wstrzymano</translation>
 <translation id="7308002049209013926">Użyj menu z aplikacjami, by szybko otwierać nowe aplikacje i wykonywać inne czynności. Aby otworzyć menu za pomocą klawiatury, naciśnij Alt + Shift + L.</translation>
@@ -4134,7 +4151,6 @@
 <translation id="7481312909269577407">Dalej</translation>
 <translation id="748138892655239008">Podstawowe ograniczenia certyfikatu</translation>
 <translation id="7487067081878637334">Technologia</translation>
-<translation id="7487099628810939106">Opóźnienie przed kliknięciem:</translation>
 <translation id="7487141338393529395">Włączanie ulepszonego sprawdzania pisowni</translation>
 <translation id="7487969577036436319">Nie zainstalowano żadnych komponentów</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Otwórz wszystkie}=1{&amp;Otwórz zakładkę}few{&amp;Otwórz wszystkie (#)}many{&amp;Otwórz wszystkie (#)}other{&amp;Otwórz wszystkie (#)}}</translation>
@@ -4151,6 +4167,7 @@
 <translation id="7502658306369382406">Adres IPv6</translation>
 <translation id="7503191893372251637">Typ certyfikatu firmy Netscape</translation>
 <translation id="7503821294401948377">Nie można wczytać ikony „<ph name="ICON" />” dla czynności wykonywanej w przeglądarce.</translation>
+<translation id="7503985202154027481">Wizyta na tej stronie zostanie zarejestrowana na Twoim kluczu bezpieczeństwa.</translation>
 <translation id="750509436279396091">Otwórz folder pobierania</translation>
 <translation id="7506541170099744506">Urządzenie <ph name="DEVICE_TYPE" /> zostało zarejestrowane na potrzeby zarządzania w firmie.</translation>
 <translation id="7507930499305566459">Certyfikat obiektu odpowiadającego w zakresie stanu</translation>
@@ -4163,6 +4180,7 @@
 <translation id="7529411698175791732">Sprawdź połączenie z internetem. Jeśli problem nie ustąpi, wyloguj się i zaloguj ponownie.</translation>
 <translation id="7530016656428373557">Szybkość rozładowywania w watach</translation>
 <translation id="7531779363494549572">Otwórz Ustawienia &gt; Aplikacje i powiadomienia &gt; Powiadomienia.</translation>
+<translation id="7536220825385726660">Zezwól aplikacjom ze Sklepu Play na dostęp do dysków zewnętrznych</translation>
 <translation id="7537601449003285327">Przypnij na pasku zadań</translation>
 <translation id="7539856059004947393">Klucz bezpieczeństwa Bluetooth</translation>
 <translation id="7540972813190816353">Podczas sprawdzania dostępności aktualizacji wystąpił błąd: <ph name="ERROR" /></translation>
@@ -4192,6 +4210,7 @@
 <translation id="7574650250151586813">Aby wpisywać tekst, zaktualizuj aplikację Klawiatura Daydream</translation>
 <translation id="7576690715254076113">Sortuj</translation>
 <translation id="7576976045740938453">Wystąpił problem z kontem trybu demonstracyjnego.</translation>
+<translation id="757941033127302446">Zalogowano</translation>
 <translation id="7580671184200851182">Odtwarzaj ten sam dźwięk na wszystkich głośnikach (dźwięk mono)</translation>
 <translation id="7581462281756524039">Narzędzie do czyszczenia</translation>
 <translation id="7582582252461552277">Preferuj tę sieć</translation>
@@ -4249,6 +4268,7 @@
 <translation id="7665369617277396874">Dodaj konto</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{Nieprawidłowy kod PIN. Pozostała jedna próba.}few{Nieprawidłowy kod PIN. Pozostały # próby.}many{Nieprawidłowy kod PIN. Pozostało # prób.}other{Nieprawidłowy kod PIN. Pozostało # próby.}}</translation>
 <translation id="7671130400130574146">Użyj systemowego paska tytułu i ramek</translation>
+<translation id="767127784612208024">Dotknij, by potwierdzić resetowanie</translation>
 <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> na stronie <ph name="PAGE_TITLE" />.</translation>
 <translation id="7676867886086876795">Wysyła Twój głos do Google, by umożliwić dyktowanie w dowolnym polu tekstowym.</translation>
 <translation id="7678280409648629969">Dane logowania zostaną zapisane po wyjściu z trybu incognito. Umożliwi Ci to późniejsze korzystanie na tej stronie z funkcji Touch ID.</translation>
@@ -4435,6 +4455,7 @@
 <translation id="7925247922861151263">Sprawdzenie AAA nie powiodło się</translation>
 <translation id="7925285046818567682">Czekam na <ph name="HOST_NAME" />...</translation>
 <translation id="7926423016278357561">To nie ja.</translation>
+<translation id="7928836894214140642">Zarządzane przez <ph name="ENROLLMENT_DOMAIN" /></translation>
 <translation id="7930294771522048157">Tutaj pojawią się zapisane formy płatności</translation>
 <translation id="79312157130859720"><ph name="APP_NAME" /> udostępnia ekran i dźwięk.</translation>
 <translation id="7931318309563332511">Nieznany</translation>
@@ -4462,6 +4483,7 @@
 <translation id="7959074893852789871">Plik zawierał wiele certyfikatów, z których niektóre nie zostały zaimportowane:</translation>
 <translation id="7961015016161918242">Nigdy</translation>
 <translation id="7963826112438303517">Asystent używa tych nagrań i wypowiadanych przez Ciebie poleceń do tworzenia i aktualizowania modelu Twojego głosu. Model ten jest przechowywany tylko na tych urządzeniach, na których jest włączona funkcja Voice Match. W ustawieniach Asystenta możesz zobaczyć aktywność głosową oraz nauczyć go ponownie modelu głosu.</translation>
+<translation id="796416202355062143"><ph name="ORIGIN" /> chce wyszukać urządzenia Bluetooth w pobliżu. Znaleziono te urządzenia:</translation>
 <translation id="7966241909927244760">K&amp;opiuj adres obrazu</translation>
 <translation id="7968742106503422125">Odczyt i modyfikacja danych, które kopiujesz i wklejasz</translation>
 <translation id="7968833647796919681">Włącz zbieranie danych o wydajności</translation>
@@ -4561,11 +4583,13 @@
     <ph name="BEGIN_PARAGRAPH4" />Dane kopii zapasowej nie wliczają się do Twojego limitu miejsca na Dysku.<ph name="END_PARAGRAPH4" />
     <ph name="BEGIN_PARAGRAPH5" />Możesz wyłączyć tę usługę w Ustawieniach.<ph name="END_PARAGRAPH5" /></translation>
 <translation id="80974698889265265">Kody PIN są różne</translation>
+<translation id="8099495042588009598">Więcej uprawnień</translation>
 <translation id="8101987792947961127">Przy następnym uruchomieniu trzeba wykonać Powerwash</translation>
 <translation id="8102159139658438129">Otwórz <ph name="LINK_BEGIN" />Ustawienia<ph name="LINK_END" />, by zobaczyć opcje połączenia z telefonem</translation>
 <translation id="8104696615244072556">Wykonaj Powerwash na urządzeniu z <ph name="IDS_SHORT_PRODUCT_NAME" /> i przywróć poprzednią wersję.</translation>
 <translation id="8105368624971345109">Wyłącz</translation>
 <translation id="8107015733319732394">Instaluję Sklep Google Play na urządzeniu <ph name="DEVICE_TYPE" />. Może to potrwać kilka minut.</translation>
+<translation id="810875025413331850">Nie znaleziono żadnych urządzeń w pobliżu.</translation>
 <translation id="8111155949205007504">Udostępnij to hasło za pomocą iPhone'a</translation>
 <translation id="8113043281354018522">Wybierz typ licencji</translation>
 <translation id="8116972784401310538">&amp;Menedżer zakładek</translation>
@@ -4716,6 +4740,7 @@
 <translation id="8363095875018065315">stabilna</translation>
 <translation id="8363142353806532503">Zablokowano dostęp do mikrofonu</translation>
 <translation id="8366396658833131068">Łączność z siecią została przywrócona. Wybierz inną sieć lub naciśnij przycisk „Dalej” poniżej, by uruchomić aplikację w trybie kiosku.</translation>
+<translation id="8368027906805972958">Nieznane lub nieobsługiwane urządzenie (<ph name="DEVICE_ID" />)</translation>
 <translation id="8368859634510605990">&amp;Otwórz wszystkie zakładki</translation>
 <translation id="8371695176452482769">Mów teraz</translation>
 <translation id="8371925839118813971">{NUM_TABS,plural, =1{Wycisz stronę}few{Wycisz strony}many{Wycisz strony}other{Wycisz strony}}</translation>
@@ -4915,6 +4940,7 @@
 <translation id="8678648549315280022">Zarządzaj ustawieniami pobierania...</translation>
 <translation id="8678933587484842200">Jak chcesz uruchamiać tę aplikację?</translation>
 <translation id="8680251145628383637">Zaloguj się, by korzystać ze swoich zakładek, historii, haseł i innych ustawień na wszystkich urządzeniach. Będziesz też automatycznie logować się do usług Google, których używasz.</translation>
+<translation id="8682730193597992579">Drukarka <ph name="PRINTER_NAME" /> jest podłączona i gotowa do pracy</translation>
 <translation id="8688579245973331962">Nie widzisz swojej nazwy?</translation>
 <translation id="8688591111840995413">Nieprawidłowe hasło</translation>
 <translation id="8688672835843460752">Dostępne</translation>
@@ -5068,6 +5094,7 @@
 <translation id="8898840733695078011">Siła sygnału</translation>
 <translation id="8899851313684471736">Otwórz link w nowym &amp;oknie</translation>
 <translation id="8902667442496790482">Otwórz ustawienia funkcji Przeczytaj na głos</translation>
+<translation id="8903263458134414071">Wybierz konto, by się zalogować</translation>
 <translation id="8904976895050290827">Synchronizacja Chrome</translation>
 <translation id="890616557918890486">Zmień źródło</translation>
 <translation id="8909833622202089127">Strona śledzi Twoją lokalizację</translation>
@@ -5154,6 +5181,7 @@
 <translation id="9040661932550800571">Zaktualizować hasło do: <ph name="ORIGIN" />?</translation>
 <translation id="9041692268811217999">Dostęp do plików lokalnych na tym komputerze został wyłączony przez administratora</translation>
 <translation id="9041909613332246191">Ten plik jest rzadko pobierany i może być niebezpieczny. O Twoje bezpieczeństwo dba Ochrona zaawansowana.</translation>
+<translation id="9042858701776831292">Aplikacje ze Sklepu Google Play mogą wymagać dostępu do urządzeń pamięci zewnętrznej, by móc na nich odczytywać oraz zapisywać pliki i foldery.</translation>
 <translation id="9042893549633094279">Prywatność i bezpieczeństwo</translation>
 <translation id="904451693890288097">Wpisz klucz urządzenia „<ph name="DEVICE_NAME" />”:</translation>
 <translation id="9044646465488564462">Nie udało się połączyć z siecią: <ph name="DETAILS" /></translation>
@@ -5213,6 +5241,7 @@
 <translation id="9137916601698928395">Otwórz link jako <ph name="USER" /></translation>
 <translation id="9138978632494473300">Dodaj skróty do tych miejsc:</translation>
 <translation id="9140067245205650184">Korzystasz z nieobsługiwanej flagi funkcji: <ph name="BAD_FLAG" />. Ma to negatywny wpływ na stabilność i zabezpieczenia.</translation>
+<translation id="9143298529634201539">Usunąć sugestię?</translation>
 <translation id="9147304170847707004">Metoda uwierzytelniania</translation>
 <translation id="9147392381910171771">&amp;Opcje</translation>
 <translation id="9148058034647219655">Zakończ</translation>
@@ -5227,6 +5256,7 @@
 <translation id="916607977885256133">Obraz w obrazie</translation>
 <translation id="9168436347345867845">Później</translation>
 <translation id="9169496697824289689">Pokaż skróty klawiszowe</translation>
+<translation id="916964310188958970">Dlaczego ta sugestia?</translation>
 <translation id="9169931577761441333">Dodaj aplikację <ph name="APP_NAME" /> do ekranu głównego</translation>
 <translation id="9170848237812810038">&amp;Cofnij</translation>
 <translation id="9170884462774788842">Inny program na Twoim komputerze dodał motyw, który może zmienić działanie Chrome.</translation>
@@ -5237,6 +5267,7 @@
 <translation id="9179734824669616955">Skonfiguruj Linuksa (Beta) na urządzeniu <ph name="DEVICE_TYPE" /></translation>
 <translation id="9180281769944411366">Może to potrwać kilka minut. Uruchamiam kontener Linuksa.</translation>
 <translation id="9180380851667544951">Strona może udostępniać ekran</translation>
+<translation id="9185926955514281189">Kolory i motywy</translation>
 <translation id="9188441292293901223">Aby odblokować to urządzenie <ph name="DEVICE_TYPE" />, zaktualizuj Androida na telefonie do nowszej wersji.</translation>
 <translation id="9188732951356337132">Wysyłaj dane diagnostyczne oraz informacje o użyciu. To urządzenie automatycznie wysyła do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. Jeśli na koncie Google dziecka włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na tym koncie. <ph name="BEGIN_LINK2" />Więcej informacji<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPSec + klucz wstępny</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index a048161c..30c40770 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Ativação da rede celular</translation>
 <translation id="1407489512183974736">Cortar para centralizar</translation>
 <translation id="1408504635543854729">Explore o conteúdo do dispositivo no app Arquivos. O conteúdo é restrito por um administrador e não pode ser modificado.</translation>
-<translation id="1408789165795197664">Avançado...</translation>
 <translation id="1409390508152595145">Criar usuário supervisionado</translation>
 <translation id="1410197035576869800">Ícone do app</translation>
 <translation id="1410616244180625362">Continuar permitindo que <ph name="HOST" /> acesse sua câmera</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;Console JavaScript</translation>
 <translation id="5184662919967270437">Atualizando o dispositivo</translation>
 <translation id="5185386675596372454">A versão mais recente de "<ph name="EXTENSION_NAME" />" foi desativada porque requer mais permissões.</translation>
-<translation id="5187295959347858724">Você está conectado a <ph name="SHORT_PRODUCT_NAME" />. Seus favoritos, o histórico e outras configurações estão sendo sincronizados com sua Conta do Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Solicitação do download de vários arquivos feita por <ph name="ORIGIN" /></translation>
 <translation id="5204673965307125349">Execute o Powerwash do dispositivo e tente novamente.</translation>
@@ -4136,7 +4134,6 @@
 <translation id="7481312909269577407">Avançar</translation>
 <translation id="748138892655239008">Restrições básicas do certificado </translation>
 <translation id="7487067081878637334">Tecnologia</translation>
-<translation id="7487099628810939106">Atraso antes de clicar:</translation>
 <translation id="7487141338393529395">Ativar a verificação ortográfica aprimorada</translation>
 <translation id="7487969577036436319">Nenhum componente instalado</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Abrir tudo}=1{&amp;Abrir favorito}one{&amp;Abrir tudo (#)}other{&amp;Abrir tudo (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 83a8128..8f3df8dc 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Ativação de rede móvel</translation>
 <translation id="1407489512183974736">Cortado no centro</translation>
 <translation id="1408504635543854729">Explore o conteúdo do dispositivo na aplicação Ficheiros. O conteúdo é restringido por um gestor e não é possível modificá-lo.</translation>
-<translation id="1408789165795197664">Avançadas...</translation>
 <translation id="1409390508152595145">Criar utilizador supervisionado.</translation>
 <translation id="1410197035576869800">Ícone da aplicação</translation>
 <translation id="1410616244180625362">Continuar a permitir que <ph name="HOST" /> aceda à sua câmara</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Consola de &amp;JavaScript</translation>
 <translation id="5184662919967270437">A atualizar o dispositivo…</translation>
 <translation id="5185386675596372454">A versão mais recente de "<ph name="EXTENSION_NAME" />" foi desativada porque necessita de mais permissões.</translation>
-<translation id="5187295959347858724">Está com sessão iniciada no <ph name="SHORT_PRODUCT_NAME" />. Os seus marcadores, histórico e outras definições estão a ser sincronizados com a sua Conta Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> pretende transferir vários ficheiros.</translation>
 <translation id="5204673965307125349">Efetue um Powerwash ao dispositivo e tente novamente.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">Avançar</translation>
 <translation id="748138892655239008">Restrições básicas do certificado</translation>
 <translation id="7487067081878637334">Tecnologia</translation>
-<translation id="7487099628810939106">Atraso antes do clique:</translation>
 <translation id="7487141338393529395">Ative a verificação ortográfica avançada</translation>
 <translation id="7487969577036436319">Não existem componentes instalados</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Abrir todos}=1{&amp;Abrir marcador}other{&amp;Abrir todos (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 2384471..ad3ae14 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Activare celulară</translation>
 <translation id="1407489512183974736">Pe centru, decupat</translation>
 <translation id="1408504635543854729">Explorează conținutul dispozitivului în aplicația Fișiere. Conținutul este restricționat de un administrator și nu poate fi modificat.</translation>
-<translation id="1408789165795197664">Avansate...</translation>
 <translation id="1409390508152595145">Creați un utilizator monitorizat</translation>
 <translation id="1410197035576869800">Pictograma aplicației</translation>
 <translation id="1410616244180625362">Permiteți în continuare accesul <ph name="HOST" /> la camera dvs.</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Consolă &amp;JavaScript</translation>
 <translation id="5184662919967270437">Se actualizează dispozitivul</translation>
 <translation id="5185386675596372454">Cea mai nouă versiune a „<ph name="EXTENSION_NAME" />” a fost dezactivată, deoarece necesită permisiuni suplimentare.</translation>
-<translation id="5187295959347858724">Acum sunteți conectat(ă) la <ph name="SHORT_PRODUCT_NAME" />. Marcajele dvs., istoricul și alte setări sunt sincronizate cu Contul dvs. Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vrea să descarce mai multe fișiere</translation>
 <translation id="5204673965307125349">Folosește funcția Powerwash pe dispozitiv și încearcă din nou.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Înainte</translation>
 <translation id="748138892655239008">Limitări de bază pentru certificate</translation>
 <translation id="7487067081878637334">Tehnologie</translation>
-<translation id="7487099628810939106">Întârziere înaintea clicului:</translation>
 <translation id="7487141338393529395">Activează verificarea îmbunătățită a ortografiei</translation>
 <translation id="7487969577036436319">Nu există componente instalate</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Deschide-le pe toate}=1{&amp;Deschide marcajul}few{&amp;Deschide-le pe toate (#)}other{&amp;Deschide-le pe toate (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 3796d37..30ee1ea 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Активация мобильной сети</translation>
 <translation id="1407489512183974736">Кадрировать и выровнять по центру</translation>
 <translation id="1408504635543854729">Чтобы просмотреть контент, хранящийся на устройстве, перейдите в приложение "Файлы". Администратор запретил изменять этот контент.</translation>
-<translation id="1408789165795197664">Дополнительно...</translation>
 <translation id="1409390508152595145">Создать контролируемый профиль</translation>
 <translation id="1410197035576869800">Значок приложения</translation>
 <translation id="1410616244180625362">Разрешить <ph name="HOST" /> доступ к камере</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Консоль &amp;JavaScript</translation>
 <translation id="5184662919967270437">Обновление операционной системы…</translation>
 <translation id="5185386675596372454">Новая версия "<ph name="EXTENSION_NAME" />" была отключена, так как для нее требуются дополнительные разрешения.</translation>
-<translation id="5187295959347858724">Вы вошли в <ph name="SHORT_PRODUCT_NAME" />. Ваши закладки, история и другие настройки синхронизируются с аккаунтом Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> хочет скачать несколько файлов</translation>
 <translation id="5204673965307125349">Сбросьте настройки устройства и повторите попытку.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Вперед</translation>
 <translation id="748138892655239008">Базовые ограничения сертификата</translation>
 <translation id="7487067081878637334">Технологии</translation>
-<translation id="7487099628810939106">Задержка перед нажатием:</translation>
 <translation id="7487141338393529395">Включите расширенную проверку правописания</translation>
 <translation id="7487969577036436319">Компоненты не установлены</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{О&amp;ткрыть все}=1{О&amp;ткрыть закладку}one{О&amp;ткрыть все (#)}few{О&amp;ткрыть все (#)}many{О&amp;ткрыть все (#)}other{О&amp;ткрыть все (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 4c1341a0..fafd0e1 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivácia mobilnej siete</translation>
 <translation id="1407489512183974736">Orezať na stred</translation>
 <translation id="1408504635543854729">Preskúmajte obsah zariadenia v aplikácii Súbory. Tento obsah bol obmedzený správcom a nedá sa upraviť.</translation>
-<translation id="1408789165795197664">Rozšírené...</translation>
 <translation id="1409390508152595145">Vytvoriť kontrolovaného používateľa</translation>
 <translation id="1410197035576869800">Ikona aplikácie</translation>
 <translation id="1410616244180625362">Aj naďalej povoliť stránkam <ph name="HOST" /> prístup ku kamere</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">Konzola &amp;JavaScript</translation>
 <translation id="5184662919967270437">Zariadenie sa aktualizuje</translation>
 <translation id="5185386675596372454">Najnovšia verzia doplnku „<ph name="EXTENSION_NAME" />“ bola zakázaná, pretože vyžaduje viac povolení.</translation>
-<translation id="5187295959347858724">Ste prihlásený/-á do prehliadača <ph name="SHORT_PRODUCT_NAME" />. Vaše záložky, história a ďalšie nastavenia sa synchronizujú s účtom Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> chce stiahnuť viacero súborov</translation>
 <translation id="5204673965307125349">Vykonajte v zariadení obnovu Powerwash a skúste to znova.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">Dopredu</translation>
 <translation id="748138892655239008">Základné obmedzenia certifikátu</translation>
 <translation id="7487067081878637334">Technológia</translation>
-<translation id="7487099628810939106">Oneskorenie pred kliknutím:</translation>
 <translation id="7487141338393529395">Zapnutie rozšírenej kontroly pravopisu</translation>
 <translation id="7487969577036436319">Nie sú nainštalované žiadne komponenty</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Otvoriť všetky}=1{&amp;Otvoriť záložku}few{&amp;Otvoriť všetky (#)}many{&amp;Otvoriť všetky (#)}other{&amp;Otvoriť všetky (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 345820a3..90a811d 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktiviranje mobilnega omrežja</translation>
 <translation id="1407489512183974736">Na sredino in obrezano</translation>
 <translation id="1408504635543854729">Vsebino naprave raziščite z aplikacijo Datoteke. Vsebina je omejena glede na skrbnika in je ni mogoče spreminjati.</translation>
-<translation id="1408789165795197664">Dodatno ...</translation>
 <translation id="1409390508152595145">Ustvari zaščitenega uporabnika</translation>
 <translation id="1410197035576869800">Ikona aplikacije</translation>
 <translation id="1410616244180625362">Gostitelju <ph name="HOST" /> še naprej omogočaj dostop do kamere</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Konzola &amp;JavaScript</translation>
 <translation id="5184662919967270437">Posodabljanje naprave</translation>
 <translation id="5185386675596372454">Najnovejša različica razširitve »<ph name="EXTENSION_NAME" />« je bila onemogočena, ker zahteva več dovoljenj.</translation>
-<translation id="5187295959347858724">Zdaj ste prijavljeni v <ph name="SHORT_PRODUCT_NAME" />. Zaznamki, zgodovina in druge nastavitve se sinhronizirajo z vašim Google Računom.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> želi prenesti več datotek</translation>
 <translation id="5204673965307125349">Opravite postopek »powerwash« v napravi in poskusite znova.</translation>
@@ -4136,7 +4134,6 @@
 <translation id="7481312909269577407">Naprej</translation>
 <translation id="748138892655239008">Osnovne omejitve potrdila</translation>
 <translation id="7487067081878637334">Tehnologija</translation>
-<translation id="7487099628810939106">Zakasnitev pred klikom:</translation>
 <translation id="7487141338393529395">Vklop izboljšanega preverjanja črkovanja</translation>
 <translation id="7487969577036436319">Ni nameščenih komponent</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Odpiranje vseh}=1{&amp;Odpiranje zaznamka}one{&amp;Odpiranje vseh (#)}two{&amp;Odpiranje vseh (#)}few{&amp;Odpiranje vseh (#)}other{&amp;Odpiranje vseh (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 077263b..557f96c 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Мобилна активација</translation>
 <translation id="1407489512183974736">Опсеци централно</translation>
 <translation id="1408504635543854729">Истражите садржај уређаја у апликацији Датотеке. Администратор ограничава садржај и садржај не може да се мења.</translation>
-<translation id="1408789165795197664">Напредне опције</translation>
 <translation id="1409390508152595145">Направи корисника под надзором</translation>
 <translation id="1410197035576869800">Икона апликације</translation>
 <translation id="1410616244180625362">И даље дозвољавај да <ph name="HOST" /> приступа камери</translation>
@@ -2654,7 +2653,6 @@
 <translation id="5184063094292164363">&amp;JavaScript конзола</translation>
 <translation id="5184662919967270437">Ажурирање уређаја</translation>
 <translation id="5185386675596372454">Најновија верзија додатка „<ph name="EXTENSION_NAME" />“ је онемогућена јер захтева још дозвола.</translation>
-<translation id="5187295959347858724">Сада сте пријављени на <ph name="SHORT_PRODUCT_NAME" />. Обележивачи, историја и друга подешавања се синхронизују са Google налогом.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> жели да преузме више датотека</translation>
 <translation id="5204673965307125349">Обавите Powerwash на уређају и пробајте поново.</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">Проследи</translation>
 <translation id="748138892655239008">Основна ограничења сертификата</translation>
 <translation id="7487067081878637334">Технологија</translation>
-<translation id="7487099628810939106">Одлагање клика:</translation>
 <translation id="7487141338393529395">Укључите побољшану проверу правописа</translation>
 <translation id="7487969577036436319">Није инсталирана ниједна компонента</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Отвори све}=1{&amp;Отвори обележивач}one{&amp;Отвори све (#)}few{&amp;Отвори све (#)}other{&amp;Отвори све (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index f5e8e998..7e4708d 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Aktivering av mobilnätverk</translation>
 <translation id="1407489512183974736">Centrera och beskär</translation>
 <translation id="1408504635543854729">Utforska innehållet på den här enheten i appen Filer. Innehållet har skrivskyddats av en administratör och kan inte ändras.</translation>
-<translation id="1408789165795197664">Avancerat ...</translation>
 <translation id="1409390508152595145">Skapa en kontrollerad användare</translation>
 <translation id="1410197035576869800">Appikon</translation>
 <translation id="1410616244180625362">Fortsätt tillåta att <ph name="HOST" /> använder kameran</translation>
@@ -2657,7 +2656,6 @@
 <translation id="5184063094292164363">&amp;JavaScript-konsol</translation>
 <translation id="5184662919967270437">Enheten uppdateras</translation>
 <translation id="5185386675596372454">Den senaste versionen av <ph name="EXTENSION_NAME" /> har inaktiverats eftersom ytterligare rättigheter krävs.</translation>
-<translation id="5187295959347858724">Du är nu inloggad i <ph name="SHORT_PRODUCT_NAME" />. Bokmärken, historik och andra inställningar synkroniseras med ditt Google-konto.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vill ladda ned flera filer</translation>
 <translation id="5204673965307125349">Gör en powerwash på enheten och försök igen.</translation>
@@ -4133,7 +4131,6 @@
 <translation id="7481312909269577407">Framåt</translation>
 <translation id="748138892655239008">Grundbegränsningar för certifikat</translation>
 <translation id="7487067081878637334">Teknik</translation>
-<translation id="7487099628810939106">Fördröjning före klick:</translation>
 <translation id="7487141338393529395">Aktivera förbättrad stavningskontroll</translation>
 <translation id="7487969577036436319">Det finns inga installerade komponenter</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Öppna alla}=1{&amp;Öppna bokmärke}other{&amp;Öppna alla (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 98c1aa1..844c1329 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Kuwasha Mtandao wa Simu</translation>
 <translation id="1407489512183974736">Imepogolewa Katikati</translation>
 <translation id="1408504635543854729">Gundua maudhui ya kifaa katika programu ya Faili. Msimamizi ameweka vikwazo kwenye maudhui na hayawezi kurekebishwa.</translation>
-<translation id="1408789165795197664">Mahiri...</translation>
 <translation id="1409390508152595145">Ongeza mtumiaji anayesimamiwa</translation>
 <translation id="1410197035576869800">Aikoni ya Programu</translation>
 <translation id="1410616244180625362">Endelea kuruhusu <ph name="HOST" /> kufikia kamera yako</translation>
@@ -2649,7 +2648,6 @@
 <translation id="5184063094292164363">Kidhibiti Kazi cha &amp;JavaScript</translation>
 <translation id="5184662919967270437">Inasasisha kifaa chako</translation>
 <translation id="5185386675596372454">Toleo jipya zaidi la "<ph name="EXTENSION_NAME" />" limezimwa kwa sababu linahitaji idhini zaidi.</translation>
-<translation id="5187295959347858724">Sasa umeingia kwenye <ph name="SHORT_PRODUCT_NAME" />. Alamisho zako, historia, na mipangilio mingine vinalinganishwa kwa Akaunti yako ya Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> inataka kupakua faili kadhaa</translation>
 <translation id="5204673965307125349">Tafadhali powerwash kifaa na ujaribu tena.</translation>
@@ -4125,7 +4123,6 @@
 <translation id="7481312909269577407">Mbele</translation>
 <translation id="748138892655239008">Vizuizi Msingi vya Cheti</translation>
 <translation id="7487067081878637334">Teknolojia</translation>
-<translation id="7487099628810939106">Muda inayochelewa kabla ya mbofyo:</translation>
 <translation id="7487141338393529395">Washa Kikagua Maendelezo Kilichoboreshwa</translation>
 <translation id="7487969577036436319">Hakuna vipengele vilivyosakinishwa</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Fungua zote}=1{&amp;Fungua alamisho}other{&amp;Fungua zote (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 62cdf76..4cd671a 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -264,7 +264,6 @@
 <translation id="140723521119632973">செல்லுலார் செயல்படுத்தல்</translation>
 <translation id="1407489512183974736">மையமாக வெட்டப்பட்டது</translation>
 <translation id="1408504635543854729">கோப்புகள் பயன்பாட்டில் சாதனத்தின் உள்ளடக்கத்தைத் தேடவும். உள்ளடக்கத்தை நிர்வாகி கட்டுப்படுத்துவதால் அதைத் திருத்த முடியாது.</translation>
-<translation id="1408789165795197664">மேம்பட்டவை...</translation>
 <translation id="1409390508152595145">மேற்பார்வையிடப்படும் பயனரை உருவாக்கு</translation>
 <translation id="1410197035576869800">ஆப்ஸின் ஐகான்</translation>
 <translation id="1410616244180625362">உங்கள் கேமராவை அணுக <ph name="HOST" /> ஐத் தொடர்ந்து அனுமதிக்கவும்</translation>
@@ -485,6 +484,7 @@
 <translation id="1744060673522309905">சாதனத்தை டொமைனுடன் இணைக்க முடியவில்லை. நீங்கள் சேர்க்கக்கூடிய சாதனங்களின் அதிகபட்ச எண்ணிக்கையை மீறவில்லை என்பதை உறுதிசெய்யவும்.</translation>
 <translation id="1744108098763830590">பின்புலப் பக்கம்</translation>
 <translation id="1745520510852184940">எப்போதும் இதைச் செய்</translation>
+<translation id="1746402432151920942">பாதுகாக்கப்பட்ட மீடியா அடையாளங்காட்டி</translation>
 <translation id="175196451752279553">மூடிய தாவலை ம&amp;றுபடி திறக்கவும்</translation>
 <translation id="1753905327828125965">அதிகமாகப் பார்க்கப்பட்டவை</translation>
 <translation id="1756681705074952506">உள்ளீட்டு முறை</translation>
@@ -542,6 +542,7 @@
 <translation id="1830550083491357902">உள்நுழைந்திருக்கவில்லை</translation>
 <translation id="1832511806131704864">ஃபோன் மாற்றம் புதுப்பிக்கப்பட்டது</translation>
 <translation id="1834503245783133039">பதிவிறக்க முடியவில்லை: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI சாதனங்கள்</translation>
 <translation id="1838374766361614909">தேடலை அழி</translation>
 <translation id="1841545962859478868">பின்வருவனவற்றைச் சாதன நிர்வாகி கண்காணிக்கக்கூடும்:</translation>
 <translation id="1841616161104323629">சாதனத்தின் பதிவு இல்லை.</translation>
@@ -784,6 +785,7 @@
 <translation id="2220529011494928058">சிக்கல் குறித்துப் புகார் செய்</translation>
 <translation id="2220572644011485463">பின் அல்லது கடவுச்சொல்</translation>
 <translation id="2224444042887712269">இந்த அமைப்பானது <ph name="OWNER_EMAIL" /> க்கு உரியதாகும்.</translation>
+<translation id="2224471211857467033">அணுகல்தன்மை நிகழ்வுகள்</translation>
 <translation id="2224551243087462610">கோப்புறை பெயரை மாற்று</translation>
 <translation id="2226449515541314767">MIDI சாதனங்களை முழுமையாக கட்டுப்படுத்துவதிலிருந்து இந்தத் தளம் தடுக்கப்பட்டுள்ளது.</translation>
 <translation id="2226720438730111184">என்ன நடக்கிறது என்பதை எங்களிடம் கூறவும்</translation>
@@ -2649,7 +2651,6 @@
 <translation id="5184063094292164363">&amp;JavaScript கன்சோல்</translation>
 <translation id="5184662919967270437">சாதனத்தைப் புதுப்பிக்கிறது</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" இன் புதிய பதிப்பு முடக்கப்பட்டது, ஏனெனில் அதற்கு கூடுதல் அனுமதி தேவை.</translation>
-<translation id="5187295959347858724">நீங்கள் இப்போது <ph name="SHORT_PRODUCT_NAME" /> இல் உள்நுழைந்துள்ளீர்கள். உங்களுடைய புக்மார்க்குகள், வரலாறு மற்றும் இதர அமைப்புகள் Google கணக்குடன் ஒத்திசைக்கப்படுகிறது.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> பல கோப்புகளைப் பதிவிறக்க விரும்புகிறது</translation>
 <translation id="5204673965307125349">சாதனத்தைப் பவர்வாஷ் செய்து, மீண்டும் முயலவும்.</translation>
@@ -4123,7 +4124,6 @@
 <translation id="7481312909269577407">அடுத்த பக்கம்</translation>
 <translation id="748138892655239008">சான்றிதழ் அடிப்படை கட்டுப்பாடுகள்</translation>
 <translation id="7487067081878637334">தொழில்நுட்பம்</translation>
-<translation id="7487099628810939106">கிளிக் செய்யுமுன் தாமதிக்க:</translation>
 <translation id="7487141338393529395">'மேம்பட்ட எழுத்துப் பிழை சரிபார்க்கும்' அம்சத்தை இயக்கு</translation>
 <translation id="7487969577036436319">கூறுகள் எதுவும் நிறுவப்படவில்லை</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;எல்லாம் திற}=1{&amp;புத்தகக்குறியைத் திற}other{&amp;எல்லாவற்றையும் (#) திற}}</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 8ae3245d..3f02ad64 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">సెల్యులార్ యాక్టివేషన్</translation>
 <translation id="1407489512183974736">మధ్యకు కత్తిరించు</translation>
 <translation id="1408504635543854729">ఫైల్స్ యాప్‌లో పరికర కంటెంట్‌ను విశ్లేషించండి. కంటెంట్‌ను నిర్వాహకులు పరిమితం చేశారు మరియు దాన్ని సవరించడం సాధ్యపడదు.</translation>
-<translation id="1408789165795197664">అధునాతన...</translation>
 <translation id="1409390508152595145">పర్యవేక్షించబడే వినియోగదారును సృష్టించు</translation>
 <translation id="1410197035576869800">యాప్ చిహ్నం</translation>
 <translation id="1410616244180625362">మీ కెమెరాను యాక్సెస్ చేయడానికి <ph name="HOST" />కు అనుమతిని కొనసాగించండి</translation>
@@ -2657,7 +2656,6 @@
 <translation id="5184063094292164363">&amp;JavaScript కన్సోల్</translation>
 <translation id="5184662919967270437">మీ పరికరాన్ని అప్‌డేట్ చేస్తోంది</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" కొత్త వెర్షన్ నిలిపివేయబడింది ఎందుకంటే దానికి మరిన్ని అనుమతులు అవసరం.</translation>
-<translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME" />కు మీరు ఇప్పుడు సైన్‌ఇన్ చేశారు. మీ బుక్‌మార్క్‌లు, చరిత్ర, మరియు ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సమకాలీకరించబడుతున్నాయి.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> పలు ఫైల్‌లను డౌన్‌లోడ్ చేయాలనుకుంటోంది</translation>
 <translation id="5204673965307125349">దయచేసి పరికరాన్ని పవర్‌వాష్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
@@ -4133,7 +4131,6 @@
 <translation id="7481312909269577407">ఫార్వర్డ్</translation>
 <translation id="748138892655239008">సర్టిఫికెట్ ఆధార పరిమితులు</translation>
 <translation id="7487067081878637334">సాంకేతికం</translation>
-<translation id="7487099628810939106">క్లిక్ చేయడానికి ముందు జరగాల్సిన ఆలస్యం:</translation>
 <translation id="7487141338393529395">మెరుగైన స్పెల్ చెక్‌ను ఆన్ చేయండి</translation>
 <translation id="7487969577036436319">భాగాలు ఇన్‌స్టాల్ చేయబడలేదు</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;అన్నింటినీ తెరువండి}=1{&amp;బుక్‌మార్క్‌ని తెరవండి}other{&amp;అన్నింటినీ (#) తెరవండి}}</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index e2bb04c..6431af1 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">การเปิดใช้งานเครือข่ายมือถือ</translation>
 <translation id="1407489512183974736">ครอบตัดที่กึ่งกลาง</translation>
 <translation id="1408504635543854729">สำรวจเนื้อหาของอุปกรณ์ในแอปไฟล์ เนื้อหาถูกผู้ดูแลระบบจำกัดไว้และไม่สามารถแก้ไขได้</translation>
-<translation id="1408789165795197664">ขั้นสูง...</translation>
 <translation id="1409390508152595145">สร้างผู้ใช้ภายใต้การดูแล</translation>
 <translation id="1410197035576869800">ไอคอนของแอป</translation>
 <translation id="1410616244180625362">อนุญาตให้ <ph name="HOST" /> เข้าถึงกล้องต่อไป</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;คอนโซล JavaScript</translation>
 <translation id="5184662919967270437">กำลังอัปเดตอุปกรณ์</translation>
 <translation id="5185386675596372454">รุ่นใหม่ล่าสุดของ "<ph name="EXTENSION_NAME" />" ถูกปิดใช้งาน เนื่องจากต้องได้รับการอนุญาตมากกว่านี้</translation>
-<translation id="5187295959347858724">คุณได้ลงชื่อเข้าใช้ <ph name="SHORT_PRODUCT_NAME" /> แล้วในตอนนี้ บุ๊กมาร์ก ประวัติการเข้าชม และการตั้งค่าอื่นๆ ของคุณจะได้รับการซิงค์กับบัญชี Google</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ต้องการดาวน์โหลดหลายไฟล์</translation>
 <translation id="5204673965307125349">โปรดทำ Powerwash อุปกรณ์และลองอีกครั้ง</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">ส่งต่อ</translation>
 <translation id="748138892655239008">ข้อจำกัดพื้นฐานของใบรับรอง</translation>
 <translation id="7487067081878637334">เทคโนโลยี</translation>
-<translation id="7487099628810939106">หน่วงเวลาก่อนการคลิก:</translation>
 <translation id="7487141338393529395">เปิดฟีเจอร์ตรวจตัวสะกดที่ได้รับการปรับปรุง</translation>
 <translation id="7487969577036436319">ไม่มีคอมโพเนนต์ที่ได้รับการติดตั้ง</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;เปิดทั้งหมด}=1{&amp;เปิดบุ๊กมาร์ก}other{&amp;เปิดทั้งหมด (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index c1cc2e8..0e488fe 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Hücresel Etkinleştirme</translation>
 <translation id="1407489512183974736">Ortala ve Kırp</translation>
 <translation id="1408504635543854729">Cihazın içeriğini Dosyalar uygulamasında keşfedin. İçerik, bir yönetici tarafından kısıtlanmış ve üzerinde değişiklik yapılamaz.</translation>
-<translation id="1408789165795197664">Gelişmiş...</translation>
 <translation id="1409390508152595145">Denetlenen kullanıcı oluştur</translation>
 <translation id="1410197035576869800">Uygulama Simgesi</translation>
 <translation id="1410616244180625362">Kameranıza <ph name="HOST" /> tarafından erişilmesine izin vermeye devam edin</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">&amp;JavaScript Konsolu</translation>
 <translation id="5184662919967270437">Cihazınız güncelleniyor</translation>
 <translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" adlı uzantının en yeni sürümü daha fazla izin gerektirdiğinden devre dışı bırakıldı.</translation>
-<translation id="5187295959347858724">Şu anda <ph name="SHORT_PRODUCT_NAME" /> uygulamasında oturum açmış bulunuyorsunuz. Yer işaretleriniz, geçmişiniz ve diğer ayarlarınız Google Hesabınızla senkronize ediliyor.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> birden fazla dosya indirmek istiyor</translation>
 <translation id="5204673965307125349">Lütfen cihazda powerwash işlemi gerçekleştirin ve tekrar deneyin.</translation>
@@ -4135,7 +4133,6 @@
 <translation id="7481312909269577407">İleri</translation>
 <translation id="748138892655239008">Sertifika Temel Kısıtlamaları</translation>
 <translation id="7487067081878637334">Teknoloji</translation>
-<translation id="7487099628810939106">Tıklama öncesi gecikme:</translation>
 <translation id="7487141338393529395">Gelişmiş Yazım Denetimini Etkinleştirin</translation>
 <translation id="7487969577036436319">Yüklü hiç bileşen yok</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{Tümünü &amp;aç}=1{Yer işaretini &amp;aç}other{Tümünü (#) &amp;aç}}</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 07ca7a2e..7c30a4e 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Активація мобільної мережі</translation>
 <translation id="1407489512183974736">Обрізати по центру</translation>
 <translation id="1408504635543854729">Перегляньте вміст пристрою в додатку Файли. Вміст не можна змінювати, доступ до нього обмежено адміністратором.</translation>
-<translation id="1408789165795197664">Розширені...</translation>
 <translation id="1409390508152595145">Створити користувача, яким керує адміністратор</translation>
 <translation id="1410197035576869800">Значок додатка</translation>
 <translation id="1410616244180625362">Продовжити надавати хосту <ph name="HOST" /> доступ до вашої камери</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Консоль &amp;JavaScript</translation>
 <translation id="5184662919967270437">Оновлення пристрою</translation>
 <translation id="5185386675596372454">Нову версію розширення "<ph name="EXTENSION_NAME" />" вимкнено, оскільки для неї потрібно більше дозволів.</translation>
-<translation id="5187295959347858724">Зараз ви ввійшли в <ph name="SHORT_PRODUCT_NAME" />. Ваші закладки, історія й інші налаштування синхронізуються з обліковим записом Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> хоче завантажити кілька файлів</translation>
 <translation id="5204673965307125349">Виконайте Powerwash на пристрої та повторіть спробу.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Переслати</translation>
 <translation id="748138892655239008">Базові обмеження сертифіката</translation>
 <translation id="7487067081878637334">Технології</translation>
-<translation id="7487099628810939106">Затримка перед кліком:</translation>
 <translation id="7487141338393529395">Увімкнути покращену перевірку орфографії</translation>
 <translation id="7487969577036436319">Немає встановлених компонентів</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Відкрити всі}=1{&amp;Відкрити закладку}one{&amp;Відкрити всі (#)}few{&amp;Відкрити всі (#)}many{&amp;Відкрити всі (#)}other{&amp;Відкрити всі (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 98cb20a..97e98427 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">Kích hoạt mạng di động</translation>
 <translation id="1407489512183974736">Cắt giữa</translation>
 <translation id="1408504635543854729">Khám phá nội dung của thiết bị trong ứng dụng Tệp. Quản trị viên đã hạn chế nội dung và bạn không thể sửa đổi nội dung này.</translation>
-<translation id="1408789165795197664">Nâng cao...</translation>
 <translation id="1409390508152595145">Tạo người dùng được giám sát</translation>
 <translation id="1410197035576869800">Biểu tượng ứng dụng</translation>
 <translation id="1410616244180625362">Tiếp tục cho phép <ph name="HOST" /> truy cập máy ảnh của bạn</translation>
@@ -789,7 +788,7 @@
 <translation id="2220529011494928058">Báo cáo sự cố</translation>
 <translation id="2220572644011485463">Mã PIN hoặc mật khẩu</translation>
 <translation id="2224444042887712269">Cài đặt này thuộc về <ph name="OWNER_EMAIL" />.</translation>
-<translation id="2224471211857467033">Sự kiện hỗ trợ tiếp cận</translation>
+<translation id="2224471211857467033">Sự kiện về dịch vụ Hỗ trợ tiếp cận</translation>
 <translation id="2224551243087462610">Chỉnh sửa tên thư mục</translation>
 <translation id="2226449515541314767">Trang web này đã bị chặn quyền kiểm soát hoàn toàn thiết bị MIDI.</translation>
 <translation id="2226720438730111184">Cho chúng tôi biết điều gì đang xảy ra</translation>
@@ -2658,7 +2657,6 @@
 <translation id="5184063094292164363">Bảng điều khiển &amp;JavaScript</translation>
 <translation id="5184662919967270437">Đang cập nhật thiết bị của bạn</translation>
 <translation id="5185386675596372454">Phiên bản mới nhất của "<ph name="EXTENSION_NAME" />" đã bị tắt vì phiên bản đó yêu cầu nhiều giấy phép hơn.</translation>
-<translation id="5187295959347858724">Bạn hiện đã đăng nhập vào <ph name="SHORT_PRODUCT_NAME" />. Dấu trang, lịch sử và các cài đặt khác của bạn đang được đồng bộ hóa với Tài khoản Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> muốn tải nhiều tệp xuống</translation>
 <translation id="5204673965307125349">Vui lòng powerwash thiết bị và thử lại.</translation>
@@ -4134,7 +4132,6 @@
 <translation id="7481312909269577407">Chuyển tiếp</translation>
 <translation id="748138892655239008">Giới hạn Cơ bản của Chứng chỉ</translation>
 <translation id="7487067081878637334">Công nghệ</translation>
-<translation id="7487099628810939106">Độ trễ trước khi nhấp chuột:</translation>
 <translation id="7487141338393529395">Bật tính năng kiểm tra lỗi chính tả nâng cao</translation>
 <translation id="7487969577036436319">Không có thành phần nào được cài đặt</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{&amp;Mở tất cả}=1{&amp;Mở dấu trang}other{&amp;Mở tất cả (#)}}</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 54c3bbbf..020ba754 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">移动网络激活</translation>
 <translation id="1407489512183974736">居中并裁剪</translation>
 <translation id="1408504635543854729">在“文件”应用中浏览此设备上的内容。相关内容受到管理员的限制,无法修改。</translation>
-<translation id="1408789165795197664">高级...</translation>
 <translation id="1409390508152595145">创建受监管用户</translation>
 <translation id="1410197035576869800">应用图标</translation>
 <translation id="1410616244180625362">继续允许 <ph name="HOST" /> 使用您的摄像头</translation>
@@ -2650,7 +2649,6 @@
 <translation id="5184063094292164363">JavaScript 控制台(&amp;J)</translation>
 <translation id="5184662919967270437">正在更新设备</translation>
 <translation id="5185386675596372454">由于最新版的“<ph name="EXTENSION_NAME" />”需要更多权限,因此已将其停用。</translation>
-<translation id="5187295959347858724">您现在已登录 <ph name="SHORT_PRODUCT_NAME" />。系统正在将您的书签、浏览记录和其他设置与您的 Google 帐号同步。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> 想下载多个文件</translation>
 <translation id="5204673965307125349">请对此设备执行 Powerwash,然后重试。</translation>
@@ -4126,7 +4124,6 @@
 <translation id="7481312909269577407">前进</translation>
 <translation id="748138892655239008">证书基本约束</translation>
 <translation id="7487067081878637334">技术</translation>
-<translation id="7487099628810939106">点击前延迟:</translation>
 <translation id="7487141338393529395">开启增强的“拼写检查”功能</translation>
 <translation id="7487969577036436319">没有安装任何组件</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{全部打开(&amp;O)}=1{打开 1 个书签(&amp;O)}other{打开全部(# 个)书签(&amp;O)}}</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index b4dabd2..b3460dd 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -265,7 +265,6 @@
 <translation id="140723521119632973">啟用行動網路</translation>
 <translation id="1407489512183974736">置中並剪裁</translation>
 <translation id="1408504635543854729">在「檔案」應用程式中探索裝置內容。內容受管理員限制,使用者無法修改。</translation>
-<translation id="1408789165795197664">進階...</translation>
 <translation id="1409390508152595145">建立受監管使用者</translation>
 <translation id="1410197035576869800">應用程式圖示</translation>
 <translation id="1410616244180625362">繼續允許 <ph name="HOST" /> 存取你的攝影機</translation>
@@ -2656,7 +2655,6 @@
 <translation id="5184063094292164363">JavaScript 控制台(&amp;J)</translation>
 <translation id="5184662919967270437">正在更新您的裝置</translation>
 <translation id="5185386675596372454">由於最新版本的 <ph name="EXTENSION_NAME" /> 需要更多權限,因此已經停用。</translation>
-<translation id="5187295959347858724">你已登入 <ph name="SHORT_PRODUCT_NAME" />,系統正在將你的書籤、瀏覽記錄和其他設定與「Google 帳戶」進行同步處理。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> 想要下載多個檔案</translation>
 <translation id="5204673965307125349">請在裝置上執行 Powerwash,然後再試一次。</translation>
@@ -4132,7 +4130,6 @@
 <translation id="7481312909269577407">往前</translation>
 <translation id="748138892655239008">憑證基本限制</translation>
 <translation id="7487067081878637334">科技資訊</translation>
-<translation id="7487099628810939106">點擊前延遲:</translation>
 <translation id="7487141338393529395">開啟進階拼字檢查功能</translation>
 <translation id="7487969577036436319">未安裝任何元件</translation>
 <translation id="7489355918927585587">{COUNT,plural, =0{開啟所有書籤(&amp;O)}=1{開啟書籤(&amp;O)}other{開啟全部 # 個書籤(&amp;O)}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 5212e2e..2c4039b 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -25,7 +25,7 @@
 <translation id="1585657529869845941">النقر على زر <ph name="BEGIN_BOLD" />التبديل على أي حال<ph name="END_BOLD" /> في حال ظهوره</translation>
 <translation id="1587223624401073077">‏يستخدم Google Chrome الكاميرا.</translation>
 <translation id="1587325591171447154">‏ملف <ph name="FILE_NAME" /> ضار، لذلك فقد حظره Chrome.</translation>
-<translation id="1590588151039584890">‏للتحديث، يجب إيقاف تشغيل Chrome على جهاز الكمبيوتر هذا. قد يتسبب هذا في فقد التغييرات التي لم يحفظها المستخدمون الآخرون الذين سجَّلوا الدخول إلى جهاز الكمبيوتر هذا.</translation>
+<translation id="1590588151039584890">‏يجب إيقاف تشغيل Chrome على جهاز الكمبيوتر هذا لإجراء التحديث. وجرّاء ذلك، إنّ المستخدمين الآخرين الذين سجَّلوا الدخول إلى جهاز الكمبيوتر هذا قد يفقدون التغييرات غير المحفوظة.</translation>
 <translation id="1619887657840448962">‏لجعل Chrome أكثر أمنًا، أوقفنا الإضافة التالية التي لم تُدرج في <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> وربما تكون قد أضيفت دون علمك.</translation>
 <translation id="1628000112320670027">‏الحصول على مساعدة في Chrome</translation>
 <translation id="1662639173275167396">‏أصبح نظام التشغيل Chrome متاحًا من خلال <ph name="BEGIN_LINK_CROS_OSS" />برنامج مفتوح المصدر<ph name="END_LINK_CROS_OSS" />إضافي، كما في نظام التشغيل <ph name="BEGIN_LINK_LINUX_OSS" />Linux (إصدار تجريبي)<ph name="END_LINK_LINUX_OSS" />.</translation>
@@ -168,7 +168,7 @@
 <translation id="5386244825306882791">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome أو إجراء بحث من المربع متعدد الاستخدامات.</translation>
 <translation id="5430073640787465221">‏ملف التفضيلات تالف أو غير صالح. يتعذر على Google Chrome استرداد إعداداتك.</translation>
 <translation id="5483595757826856374">{0,plural, =0{‏ستتم إعادة تشغيل Chrome الآن}=1{‏ستتم إعادة تشغيل Chrome خلال ثانية واحدة}two{‏ستتم إعادة تشغيل Chrome خلال ثانيتين (#)}few{‏ستتم إعادة تشغيل Chrome خلال # ثوانٍ}many{‏ستتم إعادة تشغيل Chrome خلال # ثانيةً}other{‏ستتم إعادة تشغيل Chrome خلال # ثانية}}</translation>
-<translation id="5543953544073077331">‏هناك نُسخ أخرى من Chrome قيد التشغيل. يُرجى إغلاقها للتحديث.</translation>
+<translation id="5543953544073077331">‏هناك نُسخ أخرى من Chrome قيد التشغيل. يُرجى إغلاقها لإجراء التحديث.</translation>
 <translation id="556024056938947818">‏يحاول Google Chrome إظهار كلمات المرور.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">‏قد يكون ملف <ph name="FILE_NAME" /> ضارًا، لذلك فقد حظره Chrome.</translation>
@@ -229,7 +229,7 @@
 <translation id="7473136999113284234">‏يجري تحديث Chrome تلقائيًا بحيث يكون لديك أحدث إصدار.</translation>
 <translation id="7486227612705979895">‏سيصل Chrome إلى Drive لإنشاء الاقتراحات في شريط العناوين.</translation>
 <translation id="748945194546522577">‏هذا الملف ضار، لذلك قد حظره Chrome. تتم حمايتك في إطار برنامج "الحماية المتقدمة".</translation>
-<translation id="7531671357096394523">‏الخروج من جميع نُسخ Chrome.</translation>
+<translation id="7531671357096394523">‏الخروج من جميع نُسخ Chrome</translation>
 <translation id="7535429826459677826">‏إصدار مطوري البرامج من Google Chrome</translation>
 <translation id="7552219221109926349">‏عرض نظام تشغيل Chrome بهذه اللغة</translation>
 <translation id="7561940363513215021">{0,plural, =1{‏ستتم إعادة تشغيل Chrome خلال دقيقة واحدة}zero{‏ستتم إعادة تشغيل Chrome خلال # دقيقة}two{‏ستتم إعادة تشغيل Chrome خلال دقيقتين (#)}few{‏ستتم إعادة تشغيل Chrome خلال # دقائق}many{‏ستتم إعادة تشغيل Chrome خلال # دقيقةً}other{‏ستتم إعادة تشغيل Chrome خلال # دقيقة}}</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index d38a05d8..621e53d 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2919,6 +2919,10 @@
       "first_run/upgrade_util_win.h",
       "font_family_cache.cc",
       "font_family_cache.h",
+      "hid/hid_chooser_context.cc",
+      "hid/hid_chooser_context.h",
+      "hid/hid_chooser_context_factory.cc",
+      "hid/hid_chooser_context_factory.h",
       "importer/external_process_importer_client.cc",
       "importer/external_process_importer_client.h",
       "importer/external_process_importer_host.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 823405c5..befc5d3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -863,9 +863,35 @@
 const FeatureEntry::FeatureParam kExploreSitesPersonalized = {
     chrome::android::explore_sites::kExploreSitesVariationParameterName,
     chrome::android::explore_sites::kExploreSitesVariationPersonalized};
+const FeatureEntry::FeatureParam kExploreSitesIconArrow[] = {
+    {chrome::android::explore_sites::kExploreSitesVariationParameterName,
+     chrome::android::explore_sites::kExploreSitesVariationMostLikelyTile},
+    {chrome::android::explore_sites::
+         kExploreSitesMostLikelyVariationParameterName,
+     chrome::android::explore_sites::
+         kExploreSitesMostLikelyVariationIconArrow}};
+const FeatureEntry::FeatureParam kExploreSitesIconDots[] = {
+    {chrome::android::explore_sites::kExploreSitesVariationParameterName,
+     chrome::android::explore_sites::kExploreSitesVariationMostLikelyTile},
+    {chrome::android::explore_sites::
+         kExploreSitesMostLikelyVariationParameterName,
+     chrome::android::explore_sites::kExploreSitesMostLikelyVariationIconDots}};
+const FeatureEntry::FeatureParam kExploreSitesIconGrouped[] = {
+    {chrome::android::explore_sites::kExploreSitesVariationParameterName,
+     chrome::android::explore_sites::kExploreSitesVariationMostLikelyTile},
+    {chrome::android::explore_sites::
+         kExploreSitesMostLikelyVariationParameterName,
+     chrome::android::explore_sites::
+         kExploreSitesMostLikelyVariationIconGrouped}};
 const FeatureEntry::FeatureVariation kExploreSitesVariations[] = {
     {"Experimental", &kExploreSitesExperimental, 1, nullptr},
-    {"Personalized", &kExploreSitesPersonalized, 1, nullptr}};
+    {"Personalized", &kExploreSitesPersonalized, 1, nullptr},
+    {"Arrow Icon", kExploreSitesIconArrow, base::size(kExploreSitesIconArrow),
+     nullptr},
+    {"Dots Icon", kExploreSitesIconDots, base::size(kExploreSitesIconDots),
+     nullptr},
+    {"Grouped Icon", kExploreSitesIconGrouped,
+     base::size(kExploreSitesIconGrouped), nullptr}};
 
 const FeatureEntry::FeatureParam kSimplifiedServerAllCocaCards = {
     contextual_search::kContextualCardsVersionParamName,
@@ -3731,7 +3757,7 @@
      FEATURE_VALUE_TYPE(chromeos::features::kAutoScreenBrightness)},
 #endif  // defined(OS_CHROMEOS)
 
-     {"audio-worklet-realtime-thread",
+    {"audio-worklet-realtime-thread",
      flag_descriptions::kAudioWorkletRealtimeThreadName,
      flag_descriptions::kAudioWorkletRealtimeThreadDescription, kOsAll,
      FEATURE_VALUE_TYPE(blink::features::kAudioWorkletRealtimeThread)}
diff --git a/chrome/browser/android/explore_sites/explore_sites_feature.cc b/chrome/browser/android/explore_sites/explore_sites_feature.cc
index 42e55ecc..97a8c961 100644
--- a/chrome/browser/android/explore_sites/explore_sites_feature.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_feature.cc
@@ -17,6 +17,14 @@
 const char kExploreSitesVariationExperimental[] = "experiment";
 const char kExploreSitesVariationPersonalized[] = "personalized";
 const char kExploreSitesVariationCondensed[] = "condensed";
+const char kExploreSitesVariationMostLikelyTile[] = "mostLikelyTile";
+
+const char kExploreSitesMostLikelyVariationParameterName[] =
+    "mostLikelyVariation";
+
+const char kExploreSitesMostLikelyVariationIconArrow[] = "arrowIcon";
+const char kExploreSitesMostLikelyVariationIconDots[] = "dotsIcon";
+const char kExploreSitesMostLikelyVariationIconGrouped[] = "groupedIcon";
 
 ExploreSitesVariation GetExploreSitesVariation() {
   if (base::FeatureList::IsEnabled(kExploreSites)) {
@@ -35,11 +43,40 @@
         kExploreSitesVariationCondensed) {
       return ExploreSitesVariation::CONDENSED;
     }
+    if (base::GetFieldTrialParamValueByFeature(
+            kExploreSites, kExploreSitesVariationParameterName) ==
+        kExploreSitesVariationMostLikelyTile) {
+      return ExploreSitesVariation::MOST_LIKELY;
+    }
     return ExploreSitesVariation::ENABLED;
   }
   return ExploreSitesVariation::DISABLED;
 }
 
+MostLikelyVariation GetMostLikelyVariation() {
+  if (base::FeatureList::IsEnabled(kExploreSites) &&
+      base::GetFieldTrialParamValueByFeature(
+          kExploreSites, kExploreSitesVariationParameterName) ==
+          kExploreSitesVariationMostLikelyTile) {
+    if (base::GetFieldTrialParamValueByFeature(
+            kExploreSites, kExploreSitesMostLikelyVariationParameterName) ==
+        kExploreSitesMostLikelyVariationIconArrow) {
+      return MostLikelyVariation::ICON_ARROW;
+    }
+    if (base::GetFieldTrialParamValueByFeature(
+            kExploreSites, kExploreSitesMostLikelyVariationParameterName) ==
+        kExploreSitesMostLikelyVariationIconDots) {
+      return MostLikelyVariation::ICON_DOTS;
+    }
+    if (base::GetFieldTrialParamValueByFeature(
+            kExploreSites, kExploreSitesMostLikelyVariationParameterName) ==
+        kExploreSitesMostLikelyVariationIconGrouped) {
+      return MostLikelyVariation::ICON_GROUPED;
+    }
+  }
+  return MostLikelyVariation::NONE;
+}
+
 }  // namespace explore_sites
 }  // namespace android
 }  // namespace chrome
diff --git a/chrome/browser/android/explore_sites/explore_sites_feature.h b/chrome/browser/android/explore_sites/explore_sites_feature.h
index 1080208..03e459f 100644
--- a/chrome/browser/android/explore_sites/explore_sites_feature.h
+++ b/chrome/browser/android/explore_sites/explore_sites_feature.h
@@ -13,6 +13,12 @@
 
 extern const char kExploreSitesVariationExperimental[];
 extern const char kExploreSitesVariationPersonalized[];
+extern const char kExploreSitesVariationMostLikelyTile[];
+
+extern const char kExploreSitesMostLikelyVariationParameterName[];
+extern const char kExploreSitesMostLikelyVariationIconArrow[];
+extern const char kExploreSitesMostLikelyVariationIconDots[];
+extern const char kExploreSitesMostLikelyVariationIconGrouped[];
 
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.explore_sites
@@ -21,11 +27,17 @@
   EXPERIMENT,
   PERSONALIZED,
   CONDENSED,
+  MOST_LIKELY,
   DISABLED
 };
 
+// A Java counterpart will be generated for this enum.
+enum class MostLikelyVariation { NONE, ICON_ARROW, ICON_DOTS, ICON_GROUPED };
+
 ExploreSitesVariation GetExploreSitesVariation();
 
+MostLikelyVariation GetMostLikelyVariation();
+
 }  // namespace explore_sites
 }  // namespace android
 }  // namespace chrome
diff --git a/chrome/browser/android/explore_sites/explore_sites_feature_unittest.cc b/chrome/browser/android/explore_sites/explore_sites_feature_unittest.cc
index 39d984f..4d78e4a 100644
--- a/chrome/browser/android/explore_sites/explore_sites_feature_unittest.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_feature_unittest.cc
@@ -38,6 +38,45 @@
   EXPECT_EQ(ExploreSitesVariation::EXPERIMENT, GetExploreSitesVariation());
 }
 
+TEST(ExploreSitesFeatureTest, ExploreSitesEnabledWithIconArrow) {
+  std::map<std::string, std::string> parameters;
+  parameters[kExploreSitesVariationParameterName] =
+      kExploreSitesVariationMostLikelyTile;
+  parameters[kExploreSitesMostLikelyVariationParameterName] =
+      kExploreSitesMostLikelyVariationIconArrow;
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(kExploreSites,
+                                                         parameters);
+  EXPECT_EQ(ExploreSitesVariation::MOST_LIKELY, GetExploreSitesVariation());
+  EXPECT_EQ(MostLikelyVariation::ICON_ARROW, GetMostLikelyVariation());
+}
+
+TEST(ExploreSitesFeatureTest, ExploreSitesEnabledWithIconDots) {
+  std::map<std::string, std::string> parameters;
+  parameters[kExploreSitesVariationParameterName] =
+      kExploreSitesVariationMostLikelyTile;
+  parameters[kExploreSitesMostLikelyVariationParameterName] =
+      kExploreSitesMostLikelyVariationIconDots;
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(kExploreSites,
+                                                         parameters);
+  EXPECT_EQ(ExploreSitesVariation::MOST_LIKELY, GetExploreSitesVariation());
+  EXPECT_EQ(MostLikelyVariation::ICON_DOTS, GetMostLikelyVariation());
+}
+
+TEST(ExploreSitesFeatureTest, ExploreSitesEnabledWithIconGrouped) {
+  std::map<std::string, std::string> parameters;
+  parameters[kExploreSitesVariationParameterName] =
+      kExploreSitesVariationMostLikelyTile;
+  parameters[kExploreSitesMostLikelyVariationParameterName] =
+      kExploreSitesMostLikelyVariationIconGrouped;
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(kExploreSites,
+                                                         parameters);
+  EXPECT_EQ(ExploreSitesVariation::MOST_LIKELY, GetExploreSitesVariation());
+  EXPECT_EQ(MostLikelyVariation::ICON_GROUPED, GetMostLikelyVariation());
+}
+
 TEST(ExploreSitesFeatureTest, ExploreSitesEnabledWithBogus) {
   const char bogusParamValue[] = "bogus";
   std::map<std::string, std::string> parameters;
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
index 85fa2f4..cbf1076 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
@@ -72,7 +72,8 @@
 bool ExploreSitesServiceImpl::IsExploreSitesEnabled() {
   ExploreSitesVariation variation = GetExploreSitesVariation();
   return variation == ExploreSitesVariation::ENABLED ||
-         variation == ExploreSitesVariation::PERSONALIZED;
+         variation == ExploreSitesVariation::PERSONALIZED ||
+         variation == ExploreSitesVariation::MOST_LIKELY;
 }
 
 void ExploreSitesServiceImpl::GetCatalog(CatalogCallback callback) {
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
index 4930c735..38ccbdd 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -664,8 +664,12 @@
   if (!profile)
     return;
 
-  if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial())
+  // ZeroSuggestPrefetcher uses a fake AutocompleteInput classified as OTHER.
+  // See its constructor.
+  if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial(
+          OmniboxEventProto::OTHER)) {
     return;
+  }
 
   // ZeroSuggestPrefetcher deletes itself after it's done prefetching.
   new ZeroSuggestPrefetcher(profile);
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index b42ef0e6..fd5560f 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -701,6 +701,10 @@
     host_content_settings_map_->ClearSettingsForOneTypeWithPredicate(
         CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, delete_begin_, delete_end_,
         HostContentSettingsMap::PatternSourcePredicate());
+
+    host_content_settings_map_->ClearSettingsForOneTypeWithPredicate(
+        CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA, delete_begin_, delete_end_,
+        HostContentSettingsMap::PatternSourcePredicate());
 #else
     // Reset the Default Search Engine permissions to their default.
     SearchPermissionsService* search_permissions_service =
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 4ab8146f..29d8da9 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1999,6 +1999,8 @@
     "ui/echo_dialog_listener.h",
     "ui/echo_dialog_view.cc",
     "ui/echo_dialog_view.h",
+    "ui/gnubby_notification.cc",
+    "ui/gnubby_notification.h",
     "ui/idle_app_name_notification_view.cc",
     "ui/idle_app_name_notification_view.h",
     "ui/kiosk_external_update_notification.cc",
@@ -2613,6 +2615,7 @@
     "system_logs/single_log_file_log_source_unittest.cc",
     "tether/tether_service_unittest.cc",
     "tpm_firmware_update_unittest.cc",
+    "ui/gnubby_notification_unittest.cc",
     "ui/idle_app_name_notification_view_unittest.cc",
     "ui/low_disk_notification_unittest.cc",
     "wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 9cc6e01..3e22a64 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -104,6 +104,7 @@
 #include "chrome/browser/chromeos/startup_settings_cache.h"
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/chromeos/system/user_removal_manager.h"
+#include "chrome/browser/chromeos/ui/gnubby_notification.h"
 #include "chrome/browser/chromeos/ui/low_disk_notification.h"
 #include "chrome/browser/chromeos/usb/cros_usb_detector.h"
 #include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager.h"
@@ -968,6 +969,8 @@
   if (!user_manager::UserManager::Get()->IsLoggedInAsGuest())
     low_disk_notification_ = std::make_unique<LowDiskNotification>();
 
+  gnubby_notification_ = std::make_unique<GnubbyNotification>();
+
   demo_mode_resources_remover_ = DemoModeResourcesRemover::CreateIfNeeded(
       g_browser_process->local_state());
   // Start measuring crosvm processes resource usage.
@@ -1115,6 +1118,7 @@
   dark_resume_controller_.reset();
   lock_to_single_user_manager_.reset();
   wilco_dtc_supportd_manager_.reset();
+  gnubby_notification_.reset();
 
   // Detach D-Bus clients before DBusThreadManager is shut down.
   idle_action_warning_observer_.reset();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index c24b1a4..33f42fb 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -55,6 +55,7 @@
 class ShutdownPolicyForwarder;
 class WakeOnWifiManager;
 class WilcoDtcSupportdManager;
+class GnubbyNotification;
 
 namespace default_app_order {
 class ExternalLoader;
@@ -173,6 +174,8 @@
   std::unique_ptr<policy::LockToSingleUserManager> lock_to_single_user_manager_;
   std::unique_ptr<WilcoDtcSupportdManager> wilco_dtc_supportd_manager_;
 
+  std::unique_ptr<GnubbyNotification> gnubby_notification_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos);
 };
 
diff --git a/chrome/browser/chromeos/ui/gnubby_notification.cc b/chrome/browser/chromeos/ui/gnubby_notification.cc
new file mode 100644
index 0000000..0510f21d
--- /dev/null
+++ b/chrome/browser/chromeos/ui/gnubby_notification.cc
@@ -0,0 +1,82 @@
+// 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/chromeos/ui/gnubby_notification.h"
+
+#include "ash/public/cpp/notification_utils.h"
+#include "base/location.h"
+#include "base/strings/string16.h"
+#include "base/task/post_task.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/public/cpp/notification.h"
+#include "ui/message_center/public/cpp/notification_delegate.h"
+
+namespace {
+constexpr base::TimeDelta kNotificationTimeout =
+    base::TimeDelta::FromSeconds(2);
+}  // namespace
+
+namespace chromeos {
+
+GnubbyNotification::GnubbyNotification()
+    : update_dismiss_notification_timer_(new base::OneShotTimer()),
+      weak_ptr_factory_(this) {
+  DCHECK(DBusThreadManager::Get()->GetGnubbyClient());
+  DBusThreadManager::Get()->GetGnubbyClient()->AddObserver(this);
+}
+GnubbyNotification::~GnubbyNotification() {
+  DCHECK(DBusThreadManager::Get()->GetGnubbyClient());
+  DBusThreadManager::Get()->GetGnubbyClient()->RemoveObserver(this);
+}
+
+void GnubbyNotification::PromptUserAuth() {
+  ShowNotification();
+}
+
+void GnubbyNotification::CreateNotification() {
+  const base::string16 title =
+      l10n_util::GetStringUTF16(IDS_GNUBBY_NOTIFICATION_TITLE);
+  const base::string16 message =
+      l10n_util::GetStringUTF16(IDS_GNUBBY_NOTIFICATION_MESSAGE);
+  const message_center::SystemNotificationWarningLevel colorType =
+      message_center::SystemNotificationWarningLevel::NORMAL;
+
+  GnubbyNotification::notification_prompt_ = ash::CreateSystemNotification(
+      message_center::NOTIFICATION_TYPE_SIMPLE,
+      GnubbyNotification::kNotificationID, title, message, base::string16(),
+      GURL(), message_center::NotifierId(),
+      message_center::RichNotificationData(),
+      new message_center::HandleNotificationClickDelegate(
+          base::BindRepeating(&GnubbyNotification::DismissNotification,
+                              weak_ptr_factory_.GetWeakPtr())),
+      gfx::VectorIcon(), colorType);
+}
+
+void GnubbyNotification::ShowNotification() {
+  GnubbyNotification::update_dismiss_notification_timer_->Stop();
+
+  if (GnubbyNotification::notificationActive == false) {
+    GnubbyNotification::notification_prompt_.reset();
+    CreateNotification();
+  }
+  SystemNotificationHelper::GetInstance()->Display(
+      *GnubbyNotification::notification_prompt_);
+  GnubbyNotification::update_dismiss_notification_timer_->Start(
+      FROM_HERE, kNotificationTimeout,
+      base::BindRepeating(&GnubbyNotification::DismissNotification,
+                          base::Unretained(this)));
+  GnubbyNotification::notificationActive = true;
+}
+
+void GnubbyNotification::DismissNotification() {
+  GnubbyNotification::notificationActive = false;
+  SystemNotificationHelper::GetInstance()->Close(
+      GnubbyNotification::kNotificationID);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/ui/gnubby_notification.h b/chrome/browser/chromeos/ui/gnubby_notification.h
new file mode 100644
index 0000000..9750164
--- /dev/null
+++ b/chrome/browser/chromeos/ui/gnubby_notification.h
@@ -0,0 +1,52 @@
+// 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_CHROMEOS_UI_GNUBBY_NOTIFICATION_H_
+#define CHROME_BROWSER_CHROMEOS_UI_GNUBBY_NOTIFICATION_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/timer/timer.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chromeos/dbus/gnubby_client.h"
+
+namespace message_center {
+class Notification;
+}
+
+namespace chromeos {
+// GnubbyNotification manages the notification informing the user of gnubby
+// U2FD Authentication.  It is responsible for both creating, showing, and
+// closing the notification.
+
+class GnubbyNotification : public GnubbyClient::Observer {
+ public:
+  GnubbyNotification();
+
+  // Resets GnubbyClient NotificationHandler.
+  ~GnubbyNotification() override;
+
+  // Called when dbus client receives a U2FD Auth request
+  // Displays graphic prompting user to press power button
+  // Dismisses graphic after timeout
+  void PromptUserAuth() override;
+
+  void CreateNotification();
+  void ShowNotification();
+  void DismissNotification();
+
+ private:
+  std::unique_ptr<message_center::Notification> notification_prompt_;
+  std::unique_ptr<base::OneShotTimer> update_dismiss_notification_timer_;
+  const std::string kNotificationID = "gnubby_notification";
+  bool notificationActive = false;
+
+  base::WeakPtrFactory<GnubbyNotification> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(GnubbyNotification);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_UI_GNUBBY_NOTIFICATION_H_
diff --git a/chrome/browser/chromeos/ui/gnubby_notification_unittest.cc b/chrome/browser/chromeos/ui/gnubby_notification_unittest.cc
new file mode 100644
index 0000000..6bcfb92
--- /dev/null
+++ b/chrome/browser/chromeos/ui/gnubby_notification_unittest.cc
@@ -0,0 +1,78 @@
+// 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/chromeos/ui/gnubby_notification.h"
+#include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/fake_gnubby_client.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace chromeos {
+
+class GnubbyNotificationTest : public BrowserWithTestWindowTest {
+ public:
+  GnubbyNotificationTest() {}
+  ~GnubbyNotificationTest() override {}
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+    DBusThreadManager::GetSetterForTesting()->SetGnubbyClient(
+        std::unique_ptr<GnubbyClient>(new FakeGnubbyClient));
+
+    TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
+        std::make_unique<SystemNotificationHelper>());
+    tester_ = std::make_unique<NotificationDisplayServiceTester>(
+        nullptr /* profile */);
+    tester_->SetNotificationAddedClosure(base::BindRepeating(
+        &GnubbyNotificationTest::OnNotificationAdded, base::Unretained(this)));
+    gnubby_notification_.reset(new GnubbyNotification());
+    notification_count_ = 0;
+  }
+
+  base::Optional<message_center::Notification> GetNotification() {
+    return tester_->GetNotification("gnubby_notification");
+  }
+
+  void TearDown() override {
+    gnubby_notification_.reset();
+    tester_.reset();
+    DBusThreadManager::GetSetterForTesting()->SetGnubbyClient(nullptr);
+    BrowserWithTestWindowTest::TearDown();
+  }
+
+  void OnNotificationAdded() { notification_count_++; }
+
+ protected:
+  std::unique_ptr<NotificationDisplayServiceTester> tester_;
+  std::unique_ptr<GnubbyNotification> gnubby_notification_;
+  int notification_count_ = 0;
+};
+
+TEST_F(GnubbyNotificationTest, OneNotificationsTest) {
+  base::string16 expected_title =
+      l10n_util::GetStringUTF16(IDS_GNUBBY_NOTIFICATION_TITLE);
+  gnubby_notification_->ShowNotification();
+  auto notification = GetNotification();
+  ASSERT_TRUE(notification);
+  EXPECT_EQ(expected_title, notification->title());
+  EXPECT_EQ(1, notification_count_);
+}
+
+TEST_F(GnubbyNotificationTest, TwoNotificationsTest) {
+  base::string16 expected_title =
+      l10n_util::GetStringUTF16(IDS_GNUBBY_NOTIFICATION_TITLE);
+  gnubby_notification_->ShowNotification();
+  gnubby_notification_->DismissNotification();
+  gnubby_notification_->ShowNotification();
+  auto notification = GetNotification();
+  ASSERT_TRUE(notification);
+  EXPECT_EQ(expected_title, notification->title());
+  EXPECT_EQ(2, notification_count_);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index bf07ce2..2aa77d1 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -81,7 +81,6 @@
 #include "components/download/public/common/download_danger_type.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
-#include "components/download/quarantine/test_support.h"
 #include "components/history/content/browser/download_conversions.h"
 #include "components/history/core/browser/download_constants.h"
 #include "components/history/core/browser/download_row.h"
@@ -93,6 +92,7 @@
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing/safe_browsing_service_interface.h"
 #include "components/security_state/core/security_state.h"
+#include "components/services/quarantine/test_support.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_manager.h"
@@ -1281,7 +1281,7 @@
   base::FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
   base::FilePath downloaded_file(DestinationFile(browser(), file));
   base::ScopedAllowBlockingForTesting allow_blocking;
-  EXPECT_TRUE(download::IsFileQuarantined(downloaded_file, url, GURL()));
+  EXPECT_TRUE(quarantine::IsFileQuarantined(downloaded_file, url, GURL()));
   CheckDownload(browser(), file, file);
 }
 
@@ -1304,7 +1304,7 @@
   DownloadAndWait(browser(), url);
   base::FilePath file(FILE_PATH_LITERAL("a_zip_file.zip"));
   base::FilePath downloaded_file(DestinationFile(browser(), file));
-  EXPECT_FALSE(download::IsFileQuarantined(downloaded_file, GURL(), GURL()));
+  EXPECT_FALSE(quarantine::IsFileQuarantined(downloaded_file, GURL(), GURL()));
 }
 
 // Same as the test above, but uses a file:// URL to a local file.
@@ -1317,7 +1317,7 @@
   DownloadAndWait(browser(), url);
   base::FilePath file(FILE_PATH_LITERAL("a_zip_file.zip"));
   base::FilePath downloaded_file(DestinationFile(browser(), file));
-  EXPECT_FALSE(download::IsFileQuarantined(downloaded_file, GURL(), GURL()));
+  EXPECT_FALSE(quarantine::IsFileQuarantined(downloaded_file, GURL(), GURL()));
 }
 #endif
 
diff --git a/chrome/browser/hid/OWNERS b/chrome/browser/hid/OWNERS
new file mode 100644
index 0000000..17b99b4
--- /dev/null
+++ b/chrome/browser/hid/OWNERS
@@ -0,0 +1,6 @@
+file://third_party/blink/renderer/modules/hid/OWNERS
+
+odejesush@chromium.org
+
+# COMPONENT: Blink>HID
+# TEAM: device-dev@chromium.org
diff --git a/chrome/browser/hid/hid_chooser_context.cc b/chrome/browser/hid/hid_chooser_context.cc
new file mode 100644
index 0000000..b62dbc1
--- /dev/null
+++ b/chrome/browser/hid/hid_chooser_context.cc
@@ -0,0 +1,216 @@
+// 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/hid/hid_chooser_context.h"
+
+#include <utility>
+
+#include "base/values.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "content/public/common/service_manager_connection.h"
+#include "services/device/public/mojom/constants.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace {
+
+constexpr char kDeviceNameKey[] = "name";
+constexpr char kGuidKey[] = "guid";
+
+base::Value DeviceInfoToValue(const device::mojom::HidDeviceInfo& device) {
+  base::Value value(base::Value::Type::DICTIONARY);
+  value.SetStringKey(kDeviceNameKey, device.product_name);
+  // The GUID is a temporary ID created on connection that remains valid until
+  // the device is disconnected. Ephemeral permissions are keyed by this ID and
+  // must be granted again each time the device is connected.
+  // TODO(crbug.com/958918): Extract a persistent identifier to allow device
+  // permissions to be retained after the device is disconnected.
+  value.SetStringKey(kGuidKey, device.guid);
+  return value;
+}
+
+}  // namespace
+
+HidChooserContext::HidChooserContext(Profile* profile)
+    : ChooserContextBase(profile,
+                         CONTENT_SETTINGS_TYPE_HID_GUARD,
+                         CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA),
+      is_incognito_(profile->IsOffTheRecord()) {}
+
+HidChooserContext::~HidChooserContext() = default;
+
+// static
+std::string HidChooserContext::GetObjectName(const base::Value& object) {
+  const std::string* name = object.FindStringKey(kDeviceNameKey);
+  DCHECK(name);
+  return *name;
+}
+
+bool HidChooserContext::IsValidObject(const base::Value& object) {
+  if (!object.is_dict() || object.DictSize() != 2 ||
+      !object.FindStringKey(kDeviceNameKey)) {
+    return false;
+  }
+
+  const std::string* guid = object.FindStringKey(kGuidKey);
+  return guid && !guid->empty();
+}
+
+std::vector<std::unique_ptr<ChooserContextBase::Object>>
+HidChooserContext::GetGrantedObjects(const url::Origin& requesting_origin,
+                                     const url::Origin& embedding_origin) {
+  // TODO(crbug.com/958918): Include devices with persistent permissions in the
+  // returned list.
+  if (!CanRequestObjectPermission(requesting_origin, embedding_origin))
+    return {};
+
+  auto origin_it = ephemeral_devices_.find(
+      std::make_pair(requesting_origin, embedding_origin));
+  if (origin_it == ephemeral_devices_.end())
+    return {};
+
+  const std::set<std::string> devices = origin_it->second;
+
+  std::vector<std::unique_ptr<Object>> objects;
+  for (const auto& guid : devices) {
+    auto it = device_info_.find(guid);
+    if (it == device_info_.end())
+      continue;
+
+    objects.push_back(std::make_unique<Object>(
+        requesting_origin, embedding_origin, it->second.Clone(),
+        content_settings::SettingSource::SETTING_SOURCE_USER, is_incognito_));
+  }
+
+  return objects;
+}
+
+std::vector<std::unique_ptr<ChooserContextBase::Object>>
+HidChooserContext::GetAllGrantedObjects() {
+  // TODO(crbug.com/958918): Include devices with persistent permissions in the
+  // returned list.
+  std::vector<std::unique_ptr<Object>> objects;
+  for (const auto& map_entry : ephemeral_devices_) {
+    const url::Origin& requesting_origin = map_entry.first.first;
+    const url::Origin& embedding_origin = map_entry.first.second;
+
+    if (!CanRequestObjectPermission(requesting_origin, embedding_origin))
+      continue;
+
+    for (const auto& guid : map_entry.second) {
+      auto it = device_info_.find(guid);
+      if (it == device_info_.end())
+        continue;
+
+      objects.push_back(std::make_unique<Object>(
+          requesting_origin, embedding_origin, it->second.Clone(),
+          content_settings::SettingSource::SETTING_SOURCE_USER, is_incognito_));
+    }
+  }
+
+  return objects;
+}
+
+void HidChooserContext::RevokeObjectPermission(
+    const url::Origin& requesting_origin,
+    const url::Origin& embedding_origin,
+    const base::Value& object) {
+  // TODO(crbug.com/958918): Revoke persistent permissions if the device has a
+  // persistent ID.
+  auto origin_it = ephemeral_devices_.find(
+      std::make_pair(requesting_origin, embedding_origin));
+  if (origin_it == ephemeral_devices_.end())
+    return;
+
+  std::set<std::string>& devices = origin_it->second;
+
+  DCHECK(IsValidObject(object));
+  devices.erase(*object.FindStringKey(kGuidKey));
+  NotifyPermissionRevoked(requesting_origin, embedding_origin);
+}
+
+void HidChooserContext::GrantDevicePermission(
+    const url::Origin& requesting_origin,
+    const url::Origin& embedding_origin,
+    const device::mojom::HidDeviceInfo& device) {
+  // TODO(crbug.com/958918): Grant persistent permissions for eligible devices.
+  ephemeral_devices_[std::make_pair(requesting_origin, embedding_origin)]
+      .insert(device.guid);
+  device_info_[device.guid] = DeviceInfoToValue(device);
+  NotifyPermissionChanged();
+}
+
+bool HidChooserContext::HasDevicePermission(
+    const url::Origin& requesting_origin,
+    const url::Origin& embedding_origin,
+    const device::mojom::HidDeviceInfo& device) {
+  // TODO(crbug.com/958918): Also check if a persistent permission was granted
+  // for |device|.
+  if (!CanRequestObjectPermission(requesting_origin, embedding_origin)) {
+    return false;
+  }
+
+  auto origin_it = ephemeral_devices_.find(
+      std::make_pair(requesting_origin, embedding_origin));
+  if (origin_it == ephemeral_devices_.end())
+    return false;
+
+  const std::set<std::string> devices = origin_it->second;
+
+  auto device_it = devices.find(device.guid);
+  return device_it != devices.end();
+}
+
+device::mojom::HidManager* HidChooserContext::GetHidManager() {
+  EnsureHidManagerConnection();
+  return hid_manager_.get();
+}
+
+void HidChooserContext::SetHidManagerForTesting(
+    device::mojom::HidManagerPtr manager) {
+  SetUpHidManagerConnection(std::move(manager));
+}
+
+base::WeakPtr<HidChooserContext> HidChooserContext::AsWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
+void HidChooserContext::EnsureHidManagerConnection() {
+  if (hid_manager_)
+    return;
+
+  device::mojom::HidManagerPtr manager;
+  content::ServiceManagerConnection::GetForProcess()
+      ->GetConnector()
+      ->BindInterface(device::mojom::kServiceName, mojo::MakeRequest(&manager));
+  SetUpHidManagerConnection(std::move(manager));
+}
+
+void HidChooserContext::SetUpHidManagerConnection(
+    device::mojom::HidManagerPtr manager) {
+  hid_manager_ = std::move(manager);
+  hid_manager_.set_connection_error_handler(base::BindOnce(
+      &HidChooserContext::OnHidManagerConnectionError, base::Unretained(this)));
+  // TODO(mattreynolds): Register a HidManagerClient to be notified when devices
+  // are disconnected so that ephemeral permissions can be revoked.
+}
+
+void HidChooserContext::OnHidManagerConnectionError() {
+  device_info_.clear();
+
+  std::vector<std::pair<url::Origin, url::Origin>> revoked_origins;
+  revoked_origins.reserve(ephemeral_devices_.size());
+  for (const auto& map_entry : ephemeral_devices_)
+    revoked_origins.push_back(map_entry.first);
+  ephemeral_devices_.clear();
+
+  // Notify permission observers that all ephemeral permissions have been
+  // revoked.
+  for (auto& observer : permission_observer_list_) {
+    observer.OnChooserObjectPermissionChanged(guard_content_settings_type_,
+                                              data_content_settings_type_);
+    for (const auto& origin : revoked_origins)
+      observer.OnPermissionRevoked(origin.first, origin.second);
+  }
+}
diff --git a/chrome/browser/hid/hid_chooser_context.h b/chrome/browser/hid/hid_chooser_context.h
new file mode 100644
index 0000000..ae531042
--- /dev/null
+++ b/chrome/browser/hid/hid_chooser_context.h
@@ -0,0 +1,84 @@
+// 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_HID_HID_CHOOSER_CONTEXT_H_
+#define CHROME_BROWSER_HID_HID_CHOOSER_CONTEXT_H_
+
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "base/unguessable_token.h"
+#include "chrome/browser/permissions/chooser_context_base.h"
+#include "services/device/public/mojom/hid.mojom.h"
+#include "url/origin.h"
+
+namespace base {
+class Value;
+}
+
+// Manages the internal state and connection to the device service for the
+// Human Interface Device (HID) chooser UI.
+class HidChooserContext : public ChooserContextBase {
+ public:
+  explicit HidChooserContext(Profile* profile);
+  ~HidChooserContext() override;
+
+  // Given a chooser item |object|, returns a human-readable string
+  // representing the object.
+  static std::string GetObjectName(const base::Value& object);
+
+  // ChooserContextBase:
+  bool IsValidObject(const base::Value& object) override;
+  // In addition these methods from ChooserContextBase are overridden in order
+  // to expose ephemeral devices through the public interface.
+  std::vector<std::unique_ptr<Object>> GetGrantedObjects(
+      const url::Origin& requesting_origin,
+      const url::Origin& embedding_origin) override;
+  std::vector<std::unique_ptr<Object>> GetAllGrantedObjects() override;
+  void RevokeObjectPermission(const url::Origin& requesting_origin,
+                              const url::Origin& embedding_origin,
+                              const base::Value& object) override;
+
+  // HID-specific interface for granting and checking permissions.
+  void GrantDevicePermission(const url::Origin& requesting_origin,
+                             const url::Origin& embedding_origin,
+                             const device::mojom::HidDeviceInfo& device);
+  bool HasDevicePermission(const url::Origin& requesting_origin,
+                           const url::Origin& embedding_origin,
+                           const device::mojom::HidDeviceInfo& device);
+
+  device::mojom::HidManager* GetHidManager();
+
+  void SetHidManagerForTesting(device::mojom::HidManagerPtr manager);
+  base::WeakPtr<HidChooserContext> AsWeakPtr();
+
+ private:
+  void EnsureHidManagerConnection();
+  void SetUpHidManagerConnection(device::mojom::HidManagerPtr manager);
+  void OnHidManagerConnectionError();
+
+  const bool is_incognito_;
+
+  // Tracks the set of devices to which an origin (potentially embedded in
+  // another origin) has access to. Key is (requesting_origin,
+  // embedding_origin).
+  std::map<std::pair<url::Origin, url::Origin>, std::set<std::string>>
+      ephemeral_devices_;
+
+  // Holds information about devices in |ephemeral_devices_|.
+  std::map<std::string, base::Value> device_info_;
+
+  device::mojom::HidManagerPtr hid_manager_;
+
+  base::WeakPtrFactory<HidChooserContext> weak_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(HidChooserContext);
+};
+
+#endif  // CHROME_BROWSER_HID_HID_CHOOSER_CONTEXT_H_
diff --git a/chrome/browser/hid/hid_chooser_context_factory.cc b/chrome/browser/hid/hid_chooser_context_factory.cc
new file mode 100644
index 0000000..774e3a3
--- /dev/null
+++ b/chrome/browser/hid/hid_chooser_context_factory.cc
@@ -0,0 +1,42 @@
+// 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/hid/hid_chooser_context_factory.h"
+
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/hid/hid_chooser_context.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+// static
+HidChooserContextFactory* HidChooserContextFactory::GetInstance() {
+  static base::NoDestructor<HidChooserContextFactory> factory;
+  return factory.get();
+}
+
+// static
+HidChooserContext* HidChooserContextFactory::GetForProfile(Profile* profile) {
+  return static_cast<HidChooserContext*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+HidChooserContextFactory::HidChooserContextFactory()
+    : BrowserContextKeyedServiceFactory(
+          "HidChooserContext",
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(HostContentSettingsMapFactory::GetInstance());
+}
+
+HidChooserContextFactory::~HidChooserContextFactory() = default;
+
+KeyedService* HidChooserContextFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  return new HidChooserContext(Profile::FromBrowserContext(context));
+}
+
+content::BrowserContext* HidChooserContextFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextOwnInstanceInIncognito(context);
+}
diff --git a/chrome/browser/hid/hid_chooser_context_factory.h b/chrome/browser/hid/hid_chooser_context_factory.h
new file mode 100644
index 0000000..553d256
--- /dev/null
+++ b/chrome/browser/hid/hid_chooser_context_factory.h
@@ -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.
+
+#ifndef CHROME_BROWSER_HID_HID_CHOOSER_CONTEXT_FACTORY_H_
+#define CHROME_BROWSER_HID_HID_CHOOSER_CONTEXT_FACTORY_H_
+
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class HidChooserContext;
+class Profile;
+
+class HidChooserContextFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static HidChooserContext* GetForProfile(Profile* profile);
+  static HidChooserContextFactory* GetInstance();
+
+ private:
+  friend base::NoDestructor<HidChooserContextFactory>;
+
+  HidChooserContextFactory();
+  ~HidChooserContextFactory() override;
+
+  // BrowserContextKeyedBaseFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* profile) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(HidChooserContextFactory);
+};
+
+#endif  // CHROME_BROWSER_HID_HID_CHOOSER_CONTEXT_FACTORY_H_
diff --git a/chrome/browser/hid/hid_chooser_context_unittest.cc b/chrome/browser/hid/hid_chooser_context_unittest.cc
new file mode 100644
index 0000000..a68da2b2
--- /dev/null
+++ b/chrome/browser/hid/hid_chooser_context_unittest.cc
@@ -0,0 +1,65 @@
+// 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/hid/hid_chooser_context.h"
+
+#include "base/run_loop.h"
+#include "chrome/browser/hid/hid_chooser_context_factory.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "services/device/public/mojom/hid.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class HidChooserContextTest : public testing::Test {
+ public:
+  HidChooserContextTest() = default;
+  ~HidChooserContextTest() override = default;
+
+  Profile* profile() { return &profile_; }
+
+  HidChooserContext* GetContext(Profile* profile) {
+    return HidChooserContextFactory::GetForProfile(profile);
+  }
+
+ private:
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+};
+
+}  // namespace
+
+TEST_F(HidChooserContextTest, GrantAndRevokeEphemeralPermission) {
+  const auto origin = url::Origin::Create(GURL("https://google.com"));
+
+  auto device = device::mojom::HidDeviceInfo::New();
+  device->guid = "test-guid";
+
+  HidChooserContext* context = GetContext(profile());
+  EXPECT_FALSE(context->HasDevicePermission(origin, origin, *device));
+  context->GrantDevicePermission(origin, origin, *device);
+  EXPECT_TRUE(context->HasDevicePermission(origin, origin, *device));
+
+  std::vector<std::unique_ptr<ChooserContextBase::Object>> origin_objects =
+      context->GetGrantedObjects(origin, origin);
+  ASSERT_EQ(1u, origin_objects.size());
+
+  std::vector<std::unique_ptr<ChooserContextBase::Object>> objects =
+      context->GetAllGrantedObjects();
+  ASSERT_EQ(1u, objects.size());
+  EXPECT_EQ(origin.GetURL(), objects[0]->requesting_origin);
+  EXPECT_EQ(origin.GetURL(), objects[0]->embedding_origin);
+  EXPECT_EQ(origin_objects[0]->value, objects[0]->value);
+  EXPECT_EQ(content_settings::SettingSource::SETTING_SOURCE_USER,
+            objects[0]->source);
+  EXPECT_FALSE(objects[0]->incognito);
+
+  context->RevokeObjectPermission(origin, origin, objects[0]->value);
+  EXPECT_FALSE(context->HasDevicePermission(origin, origin, *device));
+  origin_objects = context->GetGrantedObjects(origin, origin);
+  EXPECT_EQ(0u, origin_objects.size());
+  objects = context->GetAllGrantedObjects();
+  EXPECT_EQ(0u, objects.size());
+}
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index f0dcad8..d59c96f 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -93,6 +93,8 @@
       "presentation/independent_otr_profile_manager.h",
       "presentation/presentation_navigation_policy.cc",
       "presentation/presentation_navigation_policy.h",
+      "providers/cast/activity_record.cc",
+      "providers/cast/activity_record.h",
       "providers/cast/cast_activity_manager.cc",
       "providers/cast/cast_activity_manager.h",
       "providers/cast/cast_activity_record.cc",
@@ -115,6 +117,8 @@
       "providers/cast/chrome_cast_message_handler.h",
       "providers/cast/dual_media_sink_service.cc",
       "providers/cast/dual_media_sink_service.h",
+      "providers/cast/mirroring_activity_record.cc",
+      "providers/cast/mirroring_activity_record.h",
       "providers/common/buffered_message_sender.cc",
       "providers/common/buffered_message_sender.h",
       "providers/dial/dial_activity_manager.cc",
diff --git a/chrome/browser/media/router/providers/cast/activity_record.cc b/chrome/browser/media/router/providers/cast/activity_record.cc
new file mode 100644
index 0000000..f98dd45
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/activity_record.cc
@@ -0,0 +1,15 @@
+// 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/media/router/providers/cast/activity_record.h"
+
+namespace media_router {
+
+ActivityRecord::ActivityRecord(const MediaRoute& route,
+                               const std::string& app_id)
+    : route_(route), app_id_(app_id) {}
+
+ActivityRecord::~ActivityRecord() = default;
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/activity_record.h b/chrome/browser/media/router/providers/cast/activity_record.h
new file mode 100644
index 0000000..cc1d4009
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/activity_record.h
@@ -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.
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
+
+#include <string>
+
+#include "chrome/common/media_router/media_route.h"
+
+namespace media_router {
+
+class ActivityRecord {
+ public:
+  ActivityRecord(const MediaRoute& route, const std::string& app_id);
+  ActivityRecord(const ActivityRecord&) = delete;
+  ActivityRecord& operator=(const ActivityRecord&) = delete;
+  virtual ~ActivityRecord();
+
+  const MediaRoute& route() const { return route_; }
+  const std::string& app_id() const { return app_id_; }
+
+ protected:
+  MediaRoute route_;
+  const std::string app_id_;
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_ACTIVITY_RECORD_H_
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.h b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
index 4da79f90..9a50586 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
@@ -37,9 +37,18 @@
 // CastActivityRecord.
 class CastActivityManagerBase {
  public:
+  CastActivityManagerBase() = default;
+  CastActivityManagerBase(const CastActivityManagerBase&) = delete;
+  CastActivityManagerBase& operator=(const CastActivityManagerBase&) = delete;
+
   virtual cast_channel::ResultCallback MakeResultCallbackForRoute(
       const std::string& route_id,
       mojom::MediaRouteProvider::TerminateRouteCallback callback) = 0;
+
+ protected:
+  // The destructor is protected to allow deletion only through a pointer to a
+  // derived type.
+  ~CastActivityManagerBase() = default;
 };
 
 // Handles launching and terminating Cast application on a Cast receiver, and
@@ -237,7 +246,6 @@
   SEQUENCE_CHECKER(sequence_checker_);
   base::WeakPtrFactory<CastActivityManager> weak_ptr_factory_;
   FRIEND_TEST_ALL_PREFIXES(CastActivityManagerTest, SendMediaRequestToReceiver);
-  DISALLOW_COPY_AND_ASSIGN(CastActivityManager);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.cc b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
index 35b35ef..8d63948e 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/browser/media/router/providers/cast/cast_activity_record.h"
 
 #include <memory>
@@ -21,7 +20,7 @@
 
 CastActivityRecord::CastActivityRecord(const MediaRoute& route,
                                        const std::string& app_id)
-    : route_(route), app_id_(app_id) {}
+    : ActivityRecord(route, app_id) {}
 
 CastActivityRecord::~CastActivityRecord() = default;
 
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_record.h b/chrome/browser/media/router/providers/cast/cast_activity_record.h
index 369a9a8c..27038ab 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_record.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_record.h
@@ -11,6 +11,7 @@
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/optional.h"
+#include "chrome/browser/media/router/providers/cast/activity_record.h"
 #include "chrome/common/media_router/mojo/media_router.mojom.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
 #include "components/cast_channel/cast_message_handler.h"
@@ -35,16 +36,14 @@
 // are handled by LocalPresentationManager.
 //
 // Instances of this class are associated with a specific session and app.
-class CastActivityRecord {
+class CastActivityRecord : public ActivityRecord {
  public:
   using ClientMap =
       base::flat_map<std::string, std::unique_ptr<CastSessionClient>>;
 
   CastActivityRecord(const MediaRoute& route, const std::string& app_id);
-  virtual ~CastActivityRecord();
+  ~CastActivityRecord() override;
 
-  const MediaRoute& route() const { return route_; }
-  const std::string& app_id() const { return app_id_; }
   const base::Optional<std::string>& session_id() const { return session_id_; }
 
   // TODO(jrw): Get rid of this accessor.
@@ -114,8 +113,6 @@
   virtual void TerminatePresentationConnections() = 0;
 
  protected:
-  MediaRoute route_;
-  const std::string app_id_;
   ClientMap connected_clients_;
 
   // Set by CastActivityManager after the session is launched successfully.
@@ -204,8 +201,6 @@
   CastSessionTracker* const session_tracker_;
   DataDecoder* const data_decoder_;
   CastActivityManagerBase* const activity_manager_;
-
-  DISALLOW_COPY_AND_ASSIGN(CastActivityRecordImpl);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_session_client.h b/chrome/browser/media/router/providers/cast/cast_session_client.h
index a6b9ad3..7232667 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_client.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_client.h
@@ -35,6 +35,8 @@
   CastSessionClient(const std::string& client_id,
                     const url::Origin& origin,
                     int tab_id);
+  CastSessionClient(const CastSessionClient&) = delete;
+  CastSessionClient& operator=(const CastSessionClient&) = delete;
   virtual ~CastSessionClient();
 
   const std::string& client_id() const { return client_id_; }
@@ -185,7 +187,6 @@
   blink::mojom::PresentationConnectionPtr connection_;
 
   base::WeakPtrFactory<CastSessionClientImpl> weak_ptr_factory_;
-  DISALLOW_COPY_AND_ASSIGN(CastSessionClientImpl);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc
new file mode 100644
index 0000000..e042079
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record.cc
@@ -0,0 +1,64 @@
+// 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/media/router/providers/cast/mirroring_activity_record.h"
+
+#include <utility>
+
+#include "chrome/common/media_router/mojo/media_router.mojom.h"
+#include "components/mirroring/mojom/session_parameters.mojom.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+
+using mirroring::mojom::CastMessageChannelPtr;
+using mirroring::mojom::CastMessagePtr;
+using mirroring::mojom::SessionError;
+using mirroring::mojom::SessionObserverPtr;
+using mirroring::mojom::SessionParameters;
+
+namespace media_router {
+
+MirroringActivityRecord::MirroringActivityRecord(
+    const MediaRoute& route,
+    const std::string& app_id,
+    int32_t target_tab_id,
+    mojom::MediaRouter* media_router)
+    : ActivityRecord(route, app_id),
+      observer_binding_(this),
+      channel_binding_(this) {
+  media_router->GetMirroringServiceHostForTab(target_tab_id,
+                                              mojo::MakeRequest(&host_));
+  SessionObserverPtr observer_ptr_;
+  observer_binding_.Bind(mojo::MakeRequest(&observer_ptr_));
+
+  CastMessageChannelPtr channel_ptr_;
+  channel_binding_.Bind(mojo::MakeRequest(&channel_ptr_));
+
+  // TODO(jrw): Set session parameters.
+  host_->Start(SessionParameters::New(), std::move(observer_ptr_),
+               std::move(channel_ptr_), mojo::MakeRequest(&inbound_channel_));
+}
+
+MirroringActivityRecord::~MirroringActivityRecord() = default;
+
+void MirroringActivityRecord::OnError(SessionError error) {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::DidStart() {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::DidStop() {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+void MirroringActivityRecord::Send(CastMessagePtr message) {
+  // TODO(jrw)
+  NOTIMPLEMENTED();
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record.h b/chrome/browser/media/router/providers/cast/mirroring_activity_record.h
new file mode 100644
index 0000000..c536c7d
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record.h
@@ -0,0 +1,47 @@
+// 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_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
+
+#include <string>
+
+#include "chrome/browser/media/router/providers/cast/activity_record.h"
+#include "chrome/common/media_router/media_route.h"
+#include "chrome/common/media_router/mojo/media_router.mojom-forward.h"
+#include "components/mirroring/mojom/cast_message_channel.mojom.h"
+#include "components/mirroring/mojom/mirroring_service_host.mojom.h"
+#include "components/mirroring/mojom/session_observer.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+namespace media_router {
+
+class MirroringActivityRecord : public ActivityRecord,
+                                public mirroring::mojom::SessionObserver,
+                                public mirroring::mojom::CastMessageChannel {
+ public:
+  MirroringActivityRecord(const MediaRoute& route,
+                          const std::string& app_id,
+                          int32_t target_tab_id,
+                          mojom::MediaRouter* media_router);
+  ~MirroringActivityRecord() override;
+
+  // SessionObserver implementation
+  void OnError(mirroring::mojom::SessionError error) override;
+  void DidStart() override;
+  void DidStop() override;
+
+  // CastMessageChannel implementation
+  void Send(mirroring::mojom::CastMessagePtr message) override;
+
+ private:
+  mirroring::mojom::MirroringServiceHostPtr host_;
+  mirroring::mojom::CastMessageChannelPtr inbound_channel_;
+  mojo::Binding<mirroring::mojom::SessionObserver> observer_binding_;
+  mojo::Binding<mirroring::mojom::CastMessageChannel> channel_binding_;
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_MIRRORING_ACTIVITY_RECORD_H_
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc
new file mode 100644
index 0000000..a02c5807
--- /dev/null
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_record_unittest.cc
@@ -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.
+
+#include "chrome/browser/media/router/providers/cast/mirroring_activity_record.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+using mirroring::mojom::CastMessagePtr;
+using mirroring::mojom::SessionError;
+
+namespace media_router {
+
+class MirroringActivityRecordTest : public testing::Test {
+ public:
+  MirroringActivityRecordTest() {
+    // TODO(jrw)
+  }
+
+  ~MirroringActivityRecordTest() override {
+    // TODO(jrw)
+  }
+};
+
+}  // namespace media_router
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb
index cac95542..68c3de2 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_en-GB.xtb
@@ -3,10 +3,12 @@
 <translationbundle lang="en-GB">
 <translation id="1276998909102132017">Gallery images</translation>
 <translation id="1430915738399379752">Print</translation>
+<translation id="1462966117743110941">Your camera now supports new modes and your photos and videos will be available under your downloads folders.</translation>
 <translation id="1620510694547887537">Camera</translation>
 <translation id="1627744224761163218">4 x 4</translation>
 <translation id="1664224225747386870">Nothing recorded</translation>
 <translation id="1862930711583847113">Unable to export <ph name="FILE" /></translation>
+<translation id="2008689030244369546">A whole new look</translation>
 <translation id="2036868001356139588">Timer duration</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2064538373111010176"><ph name="CAMERA" /> active</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb
index 6acbd9e..5f9f73d 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_et.xtb
@@ -3,10 +3,12 @@
 <translationbundle lang="et">
 <translation id="1276998909102132017">Galerii pildid</translation>
 <translation id="1430915738399379752">Printimine</translation>
+<translation id="1462966117743110941">Teie kaamera toetab nüüd uusi režiime ning teie fotod ja videod on saadaval kaustas Allalaadimised.</translation>
 <translation id="1620510694547887537">Kaamera</translation>
 <translation id="1627744224761163218">4 x 4</translation>
 <translation id="1664224225747386870">Midagi pole salvestatud</translation>
 <translation id="1862930711583847113">Faili <ph name="FILE" /> ei saa eksportida</translation>
+<translation id="2008689030244369546">Täiesti uus välimus</translation>
 <translation id="2036868001356139588">Taimeri kestus</translation>
 <translation id="2050339315714019657">Vertikaalpaigutus</translation>
 <translation id="2064538373111010176"><ph name="CAMERA" /> on aktiivne</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb
index 213da7cc..f995f4b 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_lv.xtb
@@ -3,10 +3,12 @@
 <translationbundle lang="lv">
 <translation id="1276998909102132017">Galerijas attēli</translation>
 <translation id="1430915738399379752">Drukāt</translation>
+<translation id="1462966117743110941">Tagad jūsu kamerā tiek atbalstīti jauni režīmi, un jūsu fotoattēli un videoklipi būs pieejami lejupielādes mapēs.</translation>
 <translation id="1620510694547887537">Kamera</translation>
 <translation id="1627744224761163218">4 x 4</translation>
 <translation id="1664224225747386870">Nekas nav ierakstīts</translation>
 <translation id="1862930711583847113">Nevar eksportēt failu <ph name="FILE" /></translation>
+<translation id="2008689030244369546">Jauns izskats</translation>
 <translation id="2036868001356139588">Taimera ilgums</translation>
 <translation id="2050339315714019657">Portrets</translation>
 <translation id="2064538373111010176"><ph name="CAMERA" /> aktīva</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb
index 3f6b090..53956341 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_pl.xtb
@@ -3,10 +3,12 @@
 <translationbundle lang="pl">
 <translation id="1276998909102132017">Zdjęcia z galerii</translation>
 <translation id="1430915738399379752">Drukuj</translation>
+<translation id="1462966117743110941">Twój aparat obsługuje teraz nowe tryby, a zdjęcia i filmy znajdziesz w folderze Pobrane.</translation>
 <translation id="1620510694547887537">Kamera</translation>
 <translation id="1627744224761163218">4 x 4</translation>
 <translation id="1664224225747386870">Nic nie zostało nagrane</translation>
 <translation id="1862930711583847113">Nie udało się wyeksportować pliku <ph name="FILE" /></translation>
+<translation id="2008689030244369546">Zupełnie nowy wygląd</translation>
 <translation id="2036868001356139588">Czas samowyzwalacza</translation>
 <translation id="2050339315714019657">Pionowo</translation>
 <translation id="2064538373111010176">Aparat <ph name="CAMERA" /> jest aktywny</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 6ba9a95..fa4f852 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -213,7 +213,7 @@
 <translation id="2626530649491650971">قابل للنقر</translation>
 <translation id="2628764385451019380">ليس هناك مربع تحرير وسرد سابق.</translation>
 <translation id="2637227747952042642">رياضيات</translation>
-<translation id="2638785836053527382">تم استئناف تنزيل <ph name="FILE_NAME" /></translation>
+<translation id="2638785836053527382">تم استئناف تنزيل <ph name="FILE_NAME" />.</translation>
 <translation id="2639750663247012216">‏مفتاح تعديل ChromeVox</translation>
 <translation id="2644542693584024604">misspelled</translation>
 <translation id="2661530546602071611">ملاحظة</translation>
@@ -441,7 +441,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{قوس كبير أيمن واحد}zero{# right braces}two{قوسان كبيران أيمنان (#)}few{# أقواس كبيرة يمنى}many{# قوسًا كبيرًا أيمنًا}other{# من الأقواس الكبيرة اليمنى}}</translation>
 <translation id="4158704014418536539">حساس لحالة الأحرف.</translation>
 <translation id="4159784952369912983">أرجواني</translation>
-<translation id="4161104397932142764">{COUNT,plural, =1{ثانية واحدة}zero{ثوانٍ}two{ثانيتان}few{ثوانٍ}many{ثوانٍ}other{ثوانٍ}}</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{ثانية واحدة}zero{ثوانٍ}two{ثانيتان}few{ثوانٍ}many{ثانية}other{ثانية}}</translation>
 <translation id="4161663686871496107">‏تعليقات ChromeVox المنطوقة جاهزة</translation>
 <translation id="4173994908659439270">ليس هناك حقل تالٍ قابل للتعديل.</translation>
 <translation id="4176463684765177261">غير مفعّل</translation>
@@ -621,7 +621,7 @@
 <translation id="5349770431644471053">رابط رجوع</translation>
 <translation id="536031132345979795">الرجوع إلى الخلف أثناء القراءة المتواصلة</translation>
 <translation id="5368000168321181111">‏تم إيقاف Earcons</translation>
-<translation id="5368505757342402527">اكتمل التنزيل بنسبة <ph name="PROGRESS" />% للملف <ph name="FILE_NAME" />. الوقت المتبقي حوالي <ph name="TIME" /> <ph name="UNITS" />.</translation>
+<translation id="5368505757342402527">اكتمل تنزيل الملف <ph name="FILE_NAME" /> بنسبة <ph name="PROGRESS" />%. يتبقى حوالي <ph name="TIME" /> <ph name="UNITS" />.</translation>
 <translation id="5374320867641260420">ليس هناك زر تالٍ.</translation>
 <translation id="5376407118396657359">‏يُرجى الضغط على بحث+Ctrl+Alt مع استخدام الأسهم للتنقل بين الخلايا.</translation>
 <translation id="5382299583965267720">ليس هناك عنوان تالٍ من المستوى الأول.</translation>
@@ -802,7 +802,7 @@
 <translation id="667999046851023355">مستند</translation>
 <translation id="6688209025607531203">تنبيه غير نمطي</translation>
 <translation id="6689672606256159458">برتقالي وردي داكن</translation>
-<translation id="669617842401078250">تم إيقاف تنزيل <ph name="FILE_NAME" /> مؤقتًا</translation>
+<translation id="669617842401078250">تم إيقاف تنزيل <ph name="FILE_NAME" /> مؤقتًا.</translation>
 <translation id="6696967141280706829">تمهيد</translation>
 <translation id="6697092096875747123">مربع التحرير والسرد السابق</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{علامة تعجب واحدة}zero{# علامة تعجب}two{علامتا تعجب (#)}few{# علامات تعجب}many{# علامة تعجب}other{# علامة تعجب}}</translation>
@@ -941,7 +941,7 @@
 <translation id="7641134354185483015">ليس هناك عنوان سابق من المستوى الثالث.</translation>
 <translation id="7659376057562985921">مربع نص <ph name="NAME" />، بالقيمة <ph name="VALUE" /></translation>
 <translation id="7663318257180412551">العنوان الثاني</translation>
-<translation id="7668307052366682650">{COUNT,plural, =1{ساعة واحدة}zero{ساعات}two{ساعتان}few{ساعات}many{ساعات}other{ساعات}}</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{ساعة واحدة}zero{ساعات}two{ساعتان}few{ساعات}many{ساعة}other{ساعة}}</translation>
 <translation id="7674576868851035240">الرابط التالي</translation>
 <translation id="7674768236845044097">علامة</translation>
 <translation id="7684431668231950609">‏تعديل النص، إدخال عنوان URL</translation>
@@ -956,7 +956,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
-<translation id="7763537600611320912">بدأ تنزيل <ph name="FILE_NAME" /></translation>
+<translation id="7763537600611320912">بدأ تنزيل <ph name="FILE_NAME" />.</translation>
 <translation id="7770823902658038748">مربع نص كلمة المرور <ph name="NAME" />، بالقيمة <ph name="VALUE" /></translation>
 <translation id="7776293189010177726">‏فتح قوائم ChromeVox</translation>
 <translation id="7800558923657349506">تتِّمة</translation>
@@ -1081,7 +1081,7 @@
 <translation id="8096975275316362544">زبدي</translation>
 <translation id="8098587210054821856">رمادي مائل إلى الأزرق</translation>
 <translation id="8110647606445335195">‏ليست هناك معالم ARIA.</translation>
-<translation id="812886159861361726">تم إيقاف تنزيل <ph name="FILE_NAME" /></translation>
+<translation id="812886159861361726">تم إيقاف تنزيل <ph name="FILE_NAME" />.</translation>
 <translation id="8138880386467279117">اللمس</translation>
 <translation id="8153880621934657047">ليس بداخل الجدول.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{شرطة سفلية واحدة}zero{# underscores}two{شرطتان سفليتان (#)}few{# شرطات سفلية}many{# شرطة سفلية}other{# من الشرطات السفلية}}</translation>
@@ -1151,7 +1151,7 @@
 <translation id="8743786158317878347">دخول إلى المحتوى المنظم، مثل الجداول</translation>
 <translation id="8747966237988593539">قائمة مرتبة</translation>
 <translation id="8749988712346667988">فضي</translation>
-<translation id="875769700429317857">اكتمل تنزيل <ph name="FILE_NAME" /></translation>
+<translation id="875769700429317857">اكتمل تنزيل <ph name="FILE_NAME" />.</translation>
 <translation id="8759334257841767240">ليس هناك رابط تالٍ.</translation>
 <translation id="8767968232364267681">عنوان المستوى الرابع التالي</translation>
 <translation id="8770473310765924354">خروج من المحتوى المنظم، مثل الجداول</translation>
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
index 2316e51..a583b893 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
@@ -84,18 +84,19 @@
         min-height: 0;
       }
     </style>
-    <multidevice-setup delegate="[[delegate_]]"
+    <multidevice-setup id="multideviceSetup"
+        delegate="[[delegate_]]"
         on-setup-exited="onExitRequested_"
         on-forward-button-focus-requested="onForwardButtonFocusRequested_"
-        forward-button-text="{{forwardButtonText_}}"
+        forward-button-text-id="{{forwardButtonTextId_}}"
         forward-button-disabled="{{forwardButtonDisabled_}}"
-        cancel-button-text="{{cancelButtonText_}}">
+        cancel-button-text-id="{{cancelButtonTextId_}}">
       <oobe-text-button slot="cancel-button">
-        <div>[[cancelButtonText_]]</div>
+        <div>[[i18nDynamic(locale, cancelButtonTextId_)]]</div>
       </oobe-text-button>
-      <oobe-next-button id="next-button" slot="forward-button"
+      <oobe-next-button id="nextButton" slot="forward-button"
           disabled$="[[forwardButtonDisabled_]]">
-        <div>[[forwardButtonText_]]</div>
+        <div>[[i18nDynamic(locale, forwardButtonTextId_)]]</div>
       </oobe-next-button>
     </multidevice-setup>
 
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
index c2660bf6..a8696594 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
@@ -60,12 +60,11 @@
       delegate_: Object,
 
       /**
-       * Text to be shown on the forward navigation button.
+       * ID of loadTimeData string to be shown on the forward navigation button.
        * @private {string|undefined}
        */
-      forwardButtonText_: {
+      forwardButtonTextId_: {
         type: String,
-        value: '',
       },
 
       /**
@@ -78,12 +77,11 @@
       },
 
       /**
-       * Text to be shown on the cancel button.
+       * ID of loadTimeData string to be shown on the cancel button.
        * @private {string|undefined}
        */
-      cancelButtonText_: {
+      cancelButtonTextId_: {
         type: String,
-        value: '',
       },
 
       /** Whether the webview overlay should be hidden. */
@@ -111,8 +109,18 @@
       this.delegate_ = new MultiDeviceSetupFirstRunDelegate();
     },
 
+    /** @override */
+    ready: function() {
+      this.updateLocalizedContent();
+    },
+
+    updateLocalizedContent: function() {
+      this.i18nUpdateLocale();
+      this.$.multideviceSetup.updateLocalizedContent();
+    },
+
     onForwardButtonFocusRequested_: function() {
-      this.$$('#next-button').focus();
+      this.$.nextButton.focus();
     },
 
     /**
diff --git a/chrome/browser/resources/chromeos/login/screen_multidevice_setup.js b/chrome/browser/resources/chromeos/login/screen_multidevice_setup.js
index 626a1bf..d0f8cce 100644
--- a/chrome/browser/resources/chromeos/login/screen_multidevice_setup.js
+++ b/chrome/browser/resources/chromeos/login/screen_multidevice_setup.js
@@ -10,5 +10,12 @@
     get defaultControl() {
       return $('multidevice-setup-impl');
     },
+
+    /**
+     * This is called after resources are updated.
+     */
+    updateLocalizedContent: function() {
+      $('multidevice-setup-impl').updateLocalizedContent();
+    },
   };
 });
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
index 7192cf2..64e541d 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
@@ -3,6 +3,7 @@
 <link rel="import" href="chrome://resources/html/cr.html">
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="post_oobe_delegate.html">
 
@@ -22,22 +23,22 @@
         on-setup-exited="onExitRequested_"
         on-forward-button-focus-requested="onForwardButtonFocusRequested_"
         on-visible-page-name-changed="onVisiblePageNameChanged_"
-        forward-button-text="{{forwardButtonText_}}"
+        forward-button-text-id="{{forwardButtonTextId_}}"
         forward-button-disabled="{{forwardButtonDisabled_}}"
-        cancel-button-text="{{cancelButtonText_}}"
-        backward-button-text="{{backwardButtonText_}}">
+        cancel-button-text-id="{{cancelButtonTextId_}}"
+        backward-button-text-id="{{backwardButtonTextId_}}">
       <paper-button id="backward-button"
           slot="backward-button" class="cancel-button">
-        [[backwardButtonText_]]
+        [[i18n(backwardButtonTextId_)]]
       </paper-button>
       <paper-button id="cancel-button"
           slot="cancel-button" class="cancel-button">
-        [[cancelButtonText_]]
+        [[i18n(cancelButtonTextId_)]]
       </paper-button>
       <paper-button id="forward-button"
           slot="forward-button" class="action-button"
           disabled$="[[forwardButtonDisabled_]]">
-        [[forwardButtonText_]]
+        [[i18n(forwardButtonTextId_)]]
       </paper-button>
     </multidevice-setup>
   </template>
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
index 25e6ea2a..1df4336 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -33,12 +33,11 @@
     delegate_: Object,
 
     /**
-     * Text to be shown on the forward navigation button.
+     * ID of loadTimeData string to be shown on the forward navigation button.
      * @private {string|undefined}
      */
-    forwardButtonText: {
+    forwardButtonTextId_: {
       type: String,
-      value: '',
     },
 
     /**
@@ -51,24 +50,24 @@
     },
 
     /**
-     * Text to be shown on the cancel navigation button.
+     * ID of loadTimeData string to be shown on the cancel navigation button.
      * @private {string|undefined}
      */
-    cancelButtonText_: {
+    cancelButtonTextId_: {
       type: String,
-      value: '',
     },
 
     /**
-     * Text to be shown on the backward navigation button.
+     * ID of loadTimeData string to be shown on the backward navigation button.
      * @private {string|undefined}
      */
-    backwardButtonText_: {
+    backwardButtonTextId_: {
       type: String,
-      value: '',
     },
   },
 
+  behaviors: [I18nBehavior],
+
   /** @override */
   attached: function() {
     this.delegate_ = new multidevice_setup.PostOobeDelegate();
diff --git a/chrome/browser/resources/chromeos/select_to_speak/prefs_manager.js b/chrome/browser/resources/chromeos/select_to_speak/prefs_manager.js
index 2720b7b4..50bde8e 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/prefs_manager.js
+++ b/chrome/browser/resources/chromeos/select_to_speak/prefs_manager.js
@@ -259,7 +259,7 @@
 /**
  * Generates the basic speech options for Select-to-Speak based on user
  * preferences. Call for each chrome.tts.speak.
- * @return {Object} options The TTS options.
+ * @return {!Object} options The TTS options.
  * @public
  */
 PrefsManager.prototype.speechOptions = function() {
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.html b/chrome/browser/resources/settings/chromeos/lazy_load.html
index 278048b7..f7a01083f 100644
--- a/chrome/browser/resources/settings/chromeos/lazy_load.html
+++ b/chrome/browser/resources/settings/chromeos/lazy_load.html
@@ -3,10 +3,10 @@
 <body>
   <link rel="import" href="../a11y_page/a11y_page.html">
   <link rel="import" href="../date_time_page/date_time_page.html">
-  <link rel="import" href="../downloads_page/downloads_page.html">
   <link rel="import" href="../languages_page/languages_page.html">
   <link rel="import" href="../printing_page/printing_page.html">
   <link rel="import" href="../reset_page/reset_page.html">
+  <link rel="import" href="os_downloads_page/os_downloads_page.html">
   <link rel="import" href="os_privacy_page/os_privacy_page.html">
 </body>
 </html>
diff --git a/chrome/browser/resources/settings/chromeos/os_downloads_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_downloads_page/BUILD.gn
new file mode 100644
index 0000000..38799493
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_downloads_page/BUILD.gn
@@ -0,0 +1,26 @@
+# 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 = [
+    ":os_downloads_page",
+    ":smb_shares_page",
+  ]
+}
+
+js_library("smb_shares_page") {
+  deps = [
+    "../..:route",
+    "//ui/webui/resources/cr_components/chromeos/smb_shares:smb_browser_proxy",
+  ]
+}
+
+js_library("os_downloads_page") {
+  deps = [
+    "../..:page_visibility",
+    "../..:route",
+  ]
+}
diff --git a/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.html b/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.html
new file mode 100644
index 0000000..2ddf33f
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.html
@@ -0,0 +1,37 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html">
+<link rel="import" href="chrome://resources/settings/settings_page/settings_animated_pages.html">
+<link rel="import" href="chrome://resources/settings/settings_page/settings_subpage.html">
+<link rel="import" href="../../controls/settings_toggle_button.html">
+<link rel="import" href="../../route.html">
+<link rel="import" href="../../settings_shared_css.html">
+<link rel="import" href="smb_shares_page.html">
+
+<dom-module id="os-settings-downloads-page">
+  <template>
+  <settings-animated-pages id="pages" section="downloads"
+      focus-config="[[focusConfig_]]">
+    <div route-path="default">
+      <settings-toggle-button class="continuation"
+          pref="{{prefs.gdata.disabled}}"
+          label="$i18n{disconnectGoogleDriveAccount}"
+          hidden="[[!pageVisibility.googleDrive]]">
+      </settings-toggle-button>
+      <cr-link-row id="smbShares" class="hr" on-click="onTapSmbShares_"
+          hidden="[[!pageVisibility.smbShares]]"
+          label="$i18n{smbSharesTitle}"></cr-link-row>
+    </div>
+    <template is="dom-if" route-path="/smbShares">
+      <settings-subpage
+          hidden="[[!pageVisibility.smbShares]]"
+          associated-control="[[$$('#smbShares')]]"
+          page-title="$i18n{smbSharesTitle}">
+        <settings-smb-shares-page prefs="[[prefs]]">
+        </settings-smb-shares-page>
+      </settings-subpage>
+    </template>
+  </settings-animated-pages>
+  </template>
+  <script src="os_downloads_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.js b/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.js
new file mode 100644
index 0000000..f8f7f48
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_downloads_page/os_downloads_page.js
@@ -0,0 +1,47 @@
+// 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
+ * 'os-settings-downloads-page' is the settings page containing downloads
+ * settings.
+ *
+ */
+Polymer({
+  is: 'os-settings-downloads-page',
+
+  properties: {
+    /**
+     * Preferences state.
+     */
+    prefs: {
+      type: Object,
+      notify: true,
+    },
+
+    /**
+     * Dictionary defining page visibility.
+     * @type {!DownloadsPageVisibility}
+     */
+    pageVisibility: Object,
+
+    /** @private {!Map<string, string>} */
+    focusConfig_: {
+      type: Object,
+      value: function() {
+        const map = new Map();
+        if (settings.routes.SMB_SHARES) {
+          map.set(settings.routes.SMB_SHARES.path, '#smbShares');
+        }
+        return map;
+      },
+    },
+
+  },
+
+  /** @private */
+  onTapSmbShares_: function() {
+    settings.navigateTo(settings.routes.SMB_SHARES);
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.html b/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.html
new file mode 100644
index 0000000..c3f3725
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.html
@@ -0,0 +1,47 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html">
+<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html">
+<link rel="import" href="chrome://resources/html/action_link.html">
+<link rel="import" href="chrome://resources/html/action_link_css.html">
+<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="../../route.html">
+<link rel="import" href="../../settings_shared_css.html">
+<link rel="import" href="../../settings_vars_css.html">
+
+<dom-module id="settings-smb-shares-page">
+  <template>
+    <style include="settings-shared"></style>
+    <div class="settings-box first">
+      <div class="start">
+        <span>$i18n{smbSharesLearnMoreLabel}</span>
+        <a href="$i18n{smbSharesLearnMoreURL}" target="_blank">
+          $i18n{learnMore}
+        </a>
+        <div class="secondary">
+          $i18n{requireNetworkMessage}
+        </div>
+      </div>
+      <template is="dom-if" if="[[!prefs.network_file_shares.allowed.value]]"
+          restamp>
+        <cr-policy-pref-indicator
+            pref="[[prefs.network_file_shares.allowed]]"
+            icon-aria-label="$i18n{smbSharesTitle}">
+        </cr-policy-pref-indicator>
+      </template>
+      <paper-button class="action-button" id="addShare"
+          on-click="onAddShareTap_"
+          disabled="[[!prefs.network_file_shares.allowed.value]]">
+        $i18n{addSmbShare}
+      </paper-button>
+    </div>
+    <template is="dom-if" if="[[showAddSmbDialog_]]" restamp>
+      <add-smb-share-dialog on-close="onAddSmbDialogClosed_"
+          last-url="[[prefs.network_file_shares.most_recently_used_url.value]]"
+          should-open-file-manager-after-mount
+      </add-smb-share-dialog>
+    </template>
+  </template>
+  <script src="smb_shares_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.js b/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.js
new file mode 100644
index 0000000..507475b
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_downloads_page/smb_shares_page.js
@@ -0,0 +1,46 @@
+// 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: 'settings-smb-shares-page',
+
+  behaviors: [
+    settings.RouteObserverBehavior,
+  ],
+
+  properties: {
+    /**
+     * Preferences state.
+     */
+    prefs: {
+      type: Object,
+      notify: true,
+    },
+
+    /** @private */
+    showAddSmbDialog_: Boolean,
+  },
+
+  /**
+   * Overridden from settings.RouteObserverBehavior.
+   * @param {!settings.Route} route
+   * @protected
+   */
+  currentRouteChanged: function(route) {
+    if (route == settings.routes.SMB_SHARES) {
+      this.showAddSmbDialog_ =
+          settings.getQueryParameters().get('showAddShare') == 'true';
+    }
+  },
+
+  /** @private */
+  onAddShareTap_: function() {
+    this.showAddSmbDialog_ = true;
+  },
+
+  /** @private */
+  onAddSmbDialogClosed_: function() {
+    this.showAddSmbDialog_ = false;
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
index 0405d34..33d9feb 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -247,9 +247,9 @@
                 restamp>
               <settings-section page-title="$i18n{downloadsPageTitle}"
                   section="downloads">
-                <settings-downloads-page prefs="{{prefs}}"
+                <os-settings-downloads-page prefs="{{prefs}}"
                     page-visibility="[[pageVisibility.downloads]]">
-                </settings-downloads-page>
+                </os-settings-downloads-page>
               </settings-section>
             </template>
             <template is="dom-if" if="[[showPage_(pageVisibility.printing)]]"
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html
index 47f3440..3e3dac9e 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_page.html
+++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -54,7 +54,8 @@
           hidden="[[!pageVisibility.googleDrive]]">
       </settings-toggle-button>
       <cr-link-row id="smbShares" class="hr" on-click="onTapSmbShares_"
-          label="$i18n{smbSharesTitle}"></cr-link-row>
+          hidden="[[!pageVisibility.smbShares]]" label="$i18n{smbSharesTitle}">
+      </cr-link-row>
 </if>
       <template is="dom-if" if="[[autoOpenDownloads_]]" restamp>
         <div class="settings-box">
@@ -73,6 +74,7 @@
 <if expr="chromeos">
     <template is="dom-if" route-path="/smbShares">
       <settings-subpage
+          hidden="[[!pageVisibility.smbShares]]"
           associated-control="[[$$('#smbShares')]]"
           page-title="$i18n{smbSharesTitle}">
         <settings-smb-shares-page prefs="[[prefs]]">
diff --git a/chrome/browser/resources/settings/downloads_page/smb_shares_page.html b/chrome/browser/resources/settings/downloads_page/smb_shares_page.html
index bcc0c97..683db591 100644
--- a/chrome/browser/resources/settings/downloads_page/smb_shares_page.html
+++ b/chrome/browser/resources/settings/downloads_page/smb_shares_page.html
@@ -1,11 +1,11 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.html">
+<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html">
 <link rel="import" href="chrome://resources/html/action_link.html">
 <link rel="import" href="chrome://resources/html/action_link_css.html">
 <link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
-<link rel="import" href="chrome://resources/html/md_select_css.html">
 <link rel="import" href="../route.html">
 <link rel="import" href="../settings_shared_css.html">
 <link rel="import" href="../settings_vars_css.html">
@@ -19,7 +19,7 @@
         <a href="$i18n{smbSharesLearnMoreURL}" target="_blank">
           $i18n{learnMore}
         </a>
-        <div class="secondary" hidden="false">
+        <div class="secondary">
           $i18n{requireNetworkMessage}
         </div>
       </div>
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index f18f257b..7f137e4 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -406,27 +406,20 @@
       <structure name="IDR_OS_SETTINGS_DEVICE_NIGHT_LIGHT_SLIDER_JS"
                  file="device_page/night_light_slider.js"
                  type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_DOWNLOADS_BROWSER_PROXY_HTML"
-                 file="downloads_page/downloads_browser_proxy.html"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_DOWNLOADS_BROWSER_PROXY_JS"
-                 file="downloads_page/downloads_browser_proxy.js"
-                 preprocess="true"
-                 type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_DOWNLOADS_PAGE_HTML"
-                 file="downloads_page/downloads_page.html"
+                 file="chromeos/os_downloads_page/os_downloads_page.html"
                  type="chrome_html"
                  preprocess="true"
                  allowexternalscript="true" />
       <structure name="IDR_OS_SETTINGS_DOWNLOADS_PAGE_JS"
-                 file="downloads_page/downloads_page.js"
+                 file="chromeos/os_downloads_page/os_downloads_page.js"
                  type="chrome_html"
                  preprocess="true" />
       <structure name="IDR_OS_SETTINGS_SMB_SHARES_PAGE_HTML"
-                 file="downloads_page/smb_shares_page.html"
+                 file="chromeos/os_downloads_page/smb_shares_page.html"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_SMB_SHARES_PAGE_JS"
-                 file="downloads_page/smb_shares_page.js"
+                 file="chromeos/os_downloads_page/smb_shares_page.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_I18n_SETUP_HTML"
                  file="i18n_setup.html"
diff --git a/chrome/browser/resources/settings/page_visibility.js b/chrome/browser/resources/settings/page_visibility.js
index 662c86bd..078fdb38 100644
--- a/chrome/browser/resources/settings/page_visibility.js
+++ b/chrome/browser/resources/settings/page_visibility.js
@@ -20,6 +20,7 @@
  *   multidevice: (boolean|undefined),
  *   onStartup: (boolean|undefined),
  *   people: (boolean|undefined|PeoplePageVisibility),
+ *   printing: (boolean|undefined),
  *   privacy: (boolean|undefined|PrivacyPageVisibility),
  *   reset:(boolean|undefined),
  * }}
@@ -39,7 +40,8 @@
 
 /**
  * @typedef {{
- *   googleDrive: boolean
+ *   googleDrive: boolean,
+ *   smbShares: boolean,
  * }}
  */
 let DownloadsPageVisibility;
@@ -86,6 +88,7 @@
       defaultBrowser: false,
       advancedSettings: false,
       extensions: false,
+      printing: false,
     };
     // </if>
     // <if expr="chromeos">
@@ -115,8 +118,10 @@
       },
       downloads: {
         googleDrive: false,
+        smbShares: false,
       },
       extensions: false,
+      printing: showOSSettings,
     };
     // </if>
   } else {
@@ -153,9 +158,11 @@
         wakeOnWifi: showOSSettings,
       },
       downloads: {
-        googleDrive: true,
+        googleDrive: showOSSettings,
+        smbShares: showOSSettings,
       },
       extensions: true,
+      printing: showOSSettings,
     };
     // </if>
   }
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html
index fc85367..8e942609 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.html
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -193,7 +193,7 @@
             <iron-icon icon="cr:file-download"></iron-icon>
             $i18n{downloadsPageTitle}
           </a>
-          <a href="/printing">
+          <a href="/printing" hidden="[[!pageVisibility.printing]]">
             <iron-icon icon="cr:print"></iron-icon>
             $i18n{printingPageTitle}
           </a>
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc
index b2dfc78..5e45c1d 100644
--- a/chrome/browser/search/instant_service_unittest.cc
+++ b/chrome/browser/search/instant_service_unittest.cc
@@ -179,7 +179,7 @@
   const GURL kUrl("https://www.foo.com");
 
   instant_service_->AddValidBackdropUrlForTesting(kUrl);
-  instant_service_->SetCustomBackgroundURL(kUrl);
+  instant_service_->SetCustomBackgroundURLWithAttributions(kUrl, std::string(), std::string(), GURL());
 
   ThemeBackgroundInfo* theme_info = instant_service_->GetInitializedThemeInfo();
   EXPECT_EQ(kUrl, theme_info->custom_background_url);
@@ -196,7 +196,7 @@
   ThemeBackgroundInfo* theme_info = instant_service_->GetInitializedThemeInfo();
   EXPECT_EQ(kValidUrl.spec(), theme_info->custom_background_url.spec());
 
-  instant_service_->SetCustomBackgroundURL(kInvalidUrl);
+  instant_service_->SetCustomBackgroundURLWithAttributions(kInvalidUrl, std::string(), std::string(), GURL());
 
   theme_info = instant_service_->GetInitializedThemeInfo();
   EXPECT_EQ(std::string(), theme_info->custom_background_url.spec());
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index d230c84..2226cca11 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -900,6 +900,8 @@
       "hats/hats_service.h",
       "hats/hats_service_factory.cc",
       "hats/hats_service_factory.h",
+      "hid/hid_chooser.cc",
+      "hid/hid_chooser.h",
       "hung_renderer/hung_renderer_core.cc",
       "hung_renderer/hung_renderer_core.h",
       "intent_picker_tab_helper.cc",
@@ -2476,6 +2478,8 @@
       "views/autofill/payments/payments_view_util.h",
       "views/autofill/payments/save_card_bubble_views.cc",
       "views/autofill/payments/save_card_bubble_views.h",
+      "views/autofill/payments/save_card_failure_bubble_views.cc",
+      "views/autofill/payments/save_card_failure_bubble_views.h",
       "views/autofill/payments/save_card_icon_view.cc",
       "views/autofill/payments/save_card_icon_view.h",
       "views/autofill/payments/save_card_manage_cards_bubble_views.cc",
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc
index 4d991206..894f6b54 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -62,8 +62,6 @@
 
 namespace {
 
-ChromeNewWindowClient* g_chrome_new_window_client_instance = nullptr;
-
 void RestoreTabUsingProfile(Profile* profile) {
   sessions::TabRestoreService* service =
       TabRestoreServiceFactory::GetForProfile(profile);
@@ -212,32 +210,18 @@
 
 }  // namespace
 
-ChromeNewWindowClient::ChromeNewWindowClient() : binding_(this) {
+ChromeNewWindowClient::ChromeNewWindowClient() {
   arc::ArcIntentHelperBridge::SetOpenUrlDelegate(this);
-
-  service_manager::Connector* connector =
-      content::ServiceManagerConnection::GetForProcess()->GetConnector();
-  connector->BindInterface(ash::mojom::kServiceName, &new_window_controller_);
-
-  // Register this object as the client interface implementation.
-  ash::mojom::NewWindowClientAssociatedPtrInfo ptr_info;
-  binding_.Bind(mojo::MakeRequest(&ptr_info));
-  new_window_controller_->SetClient(std::move(ptr_info));
-
-  DCHECK(!g_chrome_new_window_client_instance);
-  g_chrome_new_window_client_instance = this;
 }
 
 ChromeNewWindowClient::~ChromeNewWindowClient() {
-  DCHECK_EQ(g_chrome_new_window_client_instance, this);
-  g_chrome_new_window_client_instance = nullptr;
-
   arc::ArcIntentHelperBridge::SetOpenUrlDelegate(nullptr);
 }
 
 // static
 ChromeNewWindowClient* ChromeNewWindowClient::Get() {
-  return g_chrome_new_window_client_instance;
+  return static_cast<ChromeNewWindowClient*>(
+      ash::NewWindowDelegate::GetInstance());
 }
 
 // TabRestoreHelper is used to restore a tab. In particular when the user
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.h b/chrome/browser/ui/ash/chrome_new_window_client.h
index f62f807..2fe917c0 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.h
+++ b/chrome/browser/ui/ash/chrome_new_window_client.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "ash/public/interfaces/new_window.mojom.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "base/macros.h"
 #include "components/arc/intent_helper/open_url_delegate.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
@@ -19,7 +19,7 @@
 
 // Handles opening new tabs and windows on behalf of ash (over mojo) and the
 // ARC bridge (via a delegate in the browser process).
-class ChromeNewWindowClient : public ash::mojom::NewWindowClient,
+class ChromeNewWindowClient : public ash::NewWindowDelegate,
                               public arc::OpenUrlDelegate {
  public:
   ChromeNewWindowClient();
@@ -27,7 +27,7 @@
 
   static ChromeNewWindowClient* Get();
 
-  // Overridden from ash::mojom::NewWindowClient:
+  // Overridden from ash::NewWindowDelegate:
   void NewTab() override;
   void NewTabWithUrl(const GURL& url, bool from_user_interaction) override;
   void NewWindow(bool incognito) override;
@@ -62,11 +62,6 @@
 
   std::unique_ptr<TabRestoreHelper> tab_restore_helper_;
 
-  ash::mojom::NewWindowControllerPtr new_window_controller_;
-
-  // Binds this object to the client interface.
-  mojo::AssociatedBinding<ash::mojom::NewWindowClient> binding_;
-
   DISALLOW_COPY_AND_ASSIGN(ChromeNewWindowClient);
 };
 
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
index 9d42da11..bb48f0c 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -163,6 +163,11 @@
   ShowBubble();
 }
 
+void SaveCardBubbleControllerImpl::ShowBubbleForSaveCardFailureForTesting() {
+  current_bubble_type_ = BubbleType::FAILURE;
+  ShowBubble();
+}
+
 void SaveCardBubbleControllerImpl::HideBubble() {
   if (save_card_bubble_view_) {
     save_card_bubble_view_->Hide();
@@ -221,6 +226,8 @@
       return l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_SAVED);
     case BubbleType::MANAGE_CARDS:
       return l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_SAVED);
+    case BubbleType::FAILURE:
+      return l10n_util::GetStringUTF16(IDS_AUTOFILL_FAILURE_BUBBLE_TITLE);
     case BubbleType::INACTIVE:
       NOTREACHED();
       return base::string16();
@@ -228,6 +235,9 @@
 }
 
 base::string16 SaveCardBubbleControllerImpl::GetExplanatoryMessage() const {
+  if (current_bubble_type_ == BubbleType::FAILURE)
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_FAILURE_BUBBLE_EXPLANATION);
+
   if (current_bubble_type_ != BubbleType::UPLOAD_SAVE)
     return base::string16();
 
@@ -336,6 +346,7 @@
           AutofillMetrics::MANAGE_CARDS_DONE, is_upload_save_);
       return;
     case BubbleType::SIGN_IN_PROMO:
+    case BubbleType::FAILURE:
     case BubbleType::INACTIVE:
       NOTREACHED();
   }
@@ -570,6 +581,9 @@
       break;
     case BubbleType::SIGN_IN_PROMO:
       break;
+    case BubbleType::FAILURE:
+      // TODO(crbug.com/964127): Add metrics.
+      break;
     case BubbleType::INACTIVE:
       NOTREACHED();
   }
@@ -605,6 +619,9 @@
               prefs::kAutofillAcceptSaveCreditCardPromptState),
           GetSecurityLevel(), GetSyncState());
       break;
+    case BubbleType::FAILURE:
+      // TODO(crbug.com/964127): Add metrics.
+      break;
     case BubbleType::MANAGE_CARDS:
     case BubbleType::SIGN_IN_PROMO:
     case BubbleType::INACTIVE:
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
index 64072d0..3e2241f 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
@@ -85,6 +85,10 @@
   // just saved and links the user to manage their other cards.
   void ShowBubbleForManageCardsForTesting(const CreditCard& card);
 
+  // For testing. Sets up the controller for showing the
+  // save card failure bubble.
+  void ShowBubbleForSaveCardFailureForTesting();
+
   void HideBubble();
   void ReshowBubble();
 
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
index 54ad16c..ec5a8e9 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_browsertest.cc
@@ -78,6 +78,8 @@
       bubble_type = BubbleType::SIGN_IN_PROMO;
     if (name.find("Manage") != std::string::npos)
       bubble_type = BubbleType::MANAGE_CARDS;
+    if (name.find("Failure") != std::string::npos)
+      bubble_type = BubbleType::FAILURE;
 
     switch (bubble_type) {
       case BubbleType::LOCAL_SAVE:
@@ -97,6 +99,9 @@
       case BubbleType::MANAGE_CARDS:
         controller_->ShowBubbleForManageCardsForTesting(test::GetCreditCard());
         break;
+      case BubbleType::FAILURE:
+        controller_->ShowBubbleForSaveCardFailureForTesting();
+        break;
       case BubbleType::INACTIVE:
         break;
     }
@@ -150,6 +155,11 @@
   ShowAndVerifyUi();
 }
 
+// Invokes a bubble displaying the card saving just failed.
+IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, InvokeUi_Failure) {
+  ShowAndVerifyUi();
+}
+
 // Tests that opening a new tab will hide the save card bubble.
 IN_PROC_BROWSER_TEST_F(SaveCardBubbleControllerImplTest, NewTabHidesDialog) {
   ShowUi("Local");
diff --git a/chrome/browser/ui/autofill/payments/save_card_ui.h b/chrome/browser/ui/autofill/payments/save_card_ui.h
index 90d1561..d8f4e58 100644
--- a/chrome/browser/ui/autofill/payments/save_card_ui.h
+++ b/chrome/browser/ui/autofill/payments/save_card_ui.h
@@ -22,6 +22,9 @@
   // icon is clicked.
   MANAGE_CARDS,
 
+  // The failure bubble when credit card uploading failed.
+  FAILURE,
+
   // There is no bubble to show anymore. This also
   // indicates that the icon should not be visible.
   INACTIVE
diff --git a/chrome/browser/ui/hid/OWNERS b/chrome/browser/ui/hid/OWNERS
new file mode 100644
index 0000000..4df27c1
--- /dev/null
+++ b/chrome/browser/ui/hid/OWNERS
@@ -0,0 +1,4 @@
+file://third_party/blink/renderer/modules/hid/OWNERS
+
+# COMPONENT: Blink>HID
+# TEAM: device-dev@chromium.org
diff --git a/chrome/browser/ui/hid/hid_chooser.cc b/chrome/browser/ui/hid/hid_chooser.cc
new file mode 100644
index 0000000..1d2b5f381
--- /dev/null
+++ b/chrome/browser/ui/hid/hid_chooser.cc
@@ -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.
+
+#include "chrome/browser/ui/hid/hid_chooser.h"
+
+#include <utility>
+
+#include "components/bubble/bubble_controller.h"
+
+HidChooser::HidChooser(BubbleReference bubble) : bubble_(std::move(bubble)) {}
+
+HidChooser::~HidChooser() {
+  if (bubble_)
+    bubble_->CloseBubble(BUBBLE_CLOSE_FORCED);
+}
diff --git a/chrome/browser/ui/hid/hid_chooser.h b/chrome/browser/ui/hid/hid_chooser.h
new file mode 100644
index 0000000..fbb66b6
--- /dev/null
+++ b/chrome/browser/ui/hid/hid_chooser.h
@@ -0,0 +1,23 @@
+// 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_HID_HID_CHOOSER_H_
+#define CHROME_BROWSER_UI_HID_HID_CHOOSER_H_
+
+#include "base/macros.h"
+#include "components/bubble/bubble_reference.h"
+
+// Owns a HID device chooser dialog and closes it when destroyed.
+class HidChooser {
+ public:
+  explicit HidChooser(BubbleReference bubble);
+  ~HidChooser();
+
+ private:
+  BubbleReference bubble_;
+
+  DISALLOW_COPY_AND_ASSIGN(HidChooser);
+};
+
+#endif  // CHROME_BROWSER_UI_HID_HID_CHOOSER_H_
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc
index dde5d39..0c591d8b 100644
--- a/chrome/browser/ui/search/search_ipc_router.cc
+++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -332,13 +332,6 @@
   delegate_->PasteIntoOmnibox(text);
 }
 
-void SearchIPCRouter::SetCustomBackgroundURL(const GURL& url) {
-  if (!policy_->ShouldProcessSetCustomBackgroundURL())
-    return;
-
-  delegate_->OnSetCustomBackgroundURL(url);
-}
-
 void SearchIPCRouter::SetCustomBackgroundURLWithAttributions(
     const GURL& background_url,
     const std::string& attribution_line_1,
diff --git a/chrome/browser/ui/search/search_ipc_router.h b/chrome/browser/ui/search/search_ipc_router.h
index 435934f..0d65a18 100644
--- a/chrome/browser/ui/search/search_ipc_router.h
+++ b/chrome/browser/ui/search/search_ipc_router.h
@@ -104,9 +104,6 @@
     // if the |text| is empty) into the omnibox.
     virtual void PasteIntoOmnibox(const base::string16& text) = 0;
 
-    // Called when a custom background is selected on the NTP.
-    virtual void OnSetCustomBackgroundURL(const GURL& url) = 0;
-
     // Called when a custom background with attributions is selected on the NTP.
     // background_url: Url of the background image.
     // attribution_line_1: First attribution line for the image.
@@ -169,7 +166,6 @@
     virtual bool ShouldSendOmniboxFocusChanged() = 0;
     virtual bool ShouldSendMostVisitedItems() = 0;
     virtual bool ShouldSendThemeBackgroundInfo() = 0;
-    virtual bool ShouldProcessSetCustomBackgroundURL() = 0;
     virtual bool ShouldProcessSetCustomBackgroundURLWithAttributions() = 0;
     virtual bool ShouldProcessSelectLocalBackgroundImage() = 0;
     virtual bool ShouldProcessBlocklistSearchSuggestion() = 0;
@@ -257,7 +253,6 @@
       const ntp_tiles::NTPTileImpression& impression) override;
   void PasteAndOpenDropdown(int page_seq_no,
                             const base::string16& text) override;
-  void SetCustomBackgroundURL(const GURL& url) override;
   void SetCustomBackgroundURLWithAttributions(
       const GURL& background_url,
       const std::string& attribution_line_1,
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 6fd38bb..340858a 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
@@ -99,10 +99,6 @@
   return !is_incognito_ && search::IsInstantNTP(web_contents_);
 }
 
-bool SearchIPCRouterPolicyImpl::ShouldProcessSetCustomBackgroundURL() {
-  return !is_incognito_ && search::IsInstantNTP(web_contents_);
-}
-
 bool SearchIPCRouterPolicyImpl::
     ShouldProcessSetCustomBackgroundURLWithAttributions() {
   return !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 5b96046..0df882d 100644
--- a/chrome/browser/ui/search/search_ipc_router_policy_impl.h
+++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
@@ -45,7 +45,6 @@
   bool ShouldSendOmniboxFocusChanged() override;
   bool ShouldSendMostVisitedItems() override;
   bool ShouldSendThemeBackgroundInfo() override;
-  bool ShouldProcessSetCustomBackgroundURL() override;
   bool ShouldProcessSetCustomBackgroundURLWithAttributions() override;
   bool ShouldProcessSelectLocalBackgroundImage() override;
   bool ShouldProcessBlocklistSearchSuggestion() override;
diff --git a/chrome/browser/ui/search/search_ipc_router_unittest.cc b/chrome/browser/ui/search/search_ipc_router_unittest.cc
index a1664cd..77d73ce 100644
--- a/chrome/browser/ui/search/search_ipc_router_unittest.cc
+++ b/chrome/browser/ui/search/search_ipc_router_unittest.cc
@@ -812,32 +812,6 @@
   GetSearchIPCRouter().SendThemeBackgroundInfo(ThemeBackgroundInfo());
 }
 
-TEST_F(SearchIPCRouterTest, ProcessSetCustomBackgroundURLMsg) {
-  NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar"));
-  SetupMockDelegateAndPolicy();
-  MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy();
-  GURL bg_url("www.foo.com");
-  EXPECT_CALL(*mock_delegate(), OnSetCustomBackgroundURL(bg_url)).Times(1);
-  EXPECT_CALL(*policy, ShouldProcessSetCustomBackgroundURL())
-      .Times(1)
-      .WillOnce(Return(true));
-
-  GetSearchIPCRouter().SetCustomBackgroundURL(bg_url);
-}
-
-TEST_F(SearchIPCRouterTest, IgnoreSetCustomBackgroundURLMsg) {
-  NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar"));
-  SetupMockDelegateAndPolicy();
-  MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy();
-  GURL bg_url("www.foo.com");
-  EXPECT_CALL(*mock_delegate(), OnSetCustomBackgroundURL(bg_url)).Times(0);
-  EXPECT_CALL(*policy, ShouldProcessSetCustomBackgroundURL())
-      .Times(1)
-      .WillOnce(Return(false));
-
-  GetSearchIPCRouter().SetCustomBackgroundURL(bg_url);
-}
-
 TEST_F(SearchIPCRouterTest, ProcessSetCustomBackgroundURLWithAttributionsMsg) {
   NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar"));
   SetupMockDelegateAndPolicy();
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index 77b66b7..26eeb21 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -378,11 +378,6 @@
   omnibox_view->OnAfterPossibleChange(true);
 }
 
-void SearchTabHelper::OnSetCustomBackgroundURL(const GURL& url) {
-  if (instant_service_)
-    instant_service_->SetCustomBackgroundURL(url);
-}
-
 void SearchTabHelper::OnSetCustomBackgroundURLWithAttributions(
     const GURL& background_url,
     const std::string& attribution_line_1,
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index 9ccfad5..999497d 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -109,7 +109,6 @@
   void OnLogMostVisitedNavigation(
       const ntp_tiles::NTPTileImpression& impression) override;
   void PasteIntoOmnibox(const base::string16& text) override;
-  void OnSetCustomBackgroundURL(const GURL& url) override;
   void OnSetCustomBackgroundURLWithAttributions(
       const GURL& background_url,
       const std::string& attribution_line_1,
diff --git a/chrome/browser/ui/search/third_party_ntp_browsertest.cc b/chrome/browser/ui/search/third_party_ntp_browsertest.cc
new file mode 100644
index 0000000..83e24a4
--- /dev/null
+++ b/chrome/browser/ui/search/third_party_ntp_browsertest.cc
@@ -0,0 +1,83 @@
+// 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 "base/command_line.h"
+#include "base/macros.h"
+#include "chrome/browser/search/instant_service.h"
+#include "chrome/browser/search/instant_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/search/instant_test_base.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/network_session_configurator/common/network_switches.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "net/dns/mock_host_resolver.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+class ThirdPartyNTPBrowserTest : public InProcessBrowserTest,
+                                 public InstantTestBase {
+ public:
+  ThirdPartyNTPBrowserTest() = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
+  }
+
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(https_test_server().Start());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ThirdPartyNTPBrowserTest);
+};
+
+// Verifies that a third party NTP can successfully embed the most visited
+// iframe.
+IN_PROC_BROWSER_TEST_F(ThirdPartyNTPBrowserTest, EmbeddedMostVisitedIframe) {
+  GURL base_url =
+      https_test_server().GetURL("ntp.com", "/instant_extended.html");
+  GURL ntp_url =
+      https_test_server().GetURL("ntp.com", "/instant_extended_ntp.html");
+  InstantTestBase::Init(base_url, ntp_url, false);
+
+  SetupInstant(browser());
+
+  // Navigate to the NTP URL and verify that the resulting process is marked as
+  // an Instant process.
+  ui_test_utils::NavigateToURL(browser(), ntp_url);
+  content::WebContents* contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  InstantService* instant_service =
+      InstantServiceFactory::GetForProfile(browser()->profile());
+  EXPECT_TRUE(instant_service->IsInstantProcess(
+      contents->GetMainFrame()->GetProcess()->GetID()));
+
+  // Add a chrome-search://most-visited/title.html?rid=1&fs=0 subframe and
+  // verify that navigation completes successfully, with no kills.
+  content::TestNavigationObserver nav_observer(contents);
+  const char* kScript = R"(
+      const frame = document.createElement('iframe');
+      frame.src = 'chrome-search://most-visited/title.html?rid=1&fs=0';
+      document.body.appendChild(frame);
+  )";
+  ASSERT_TRUE(content::ExecJs(contents, kScript));
+  nav_observer.WaitForNavigationFinished();
+
+  // Verify that the subframe exists and has the expected origin.
+  ASSERT_EQ(2u, contents->GetAllFrames().size());
+  content::RenderFrameHost* subframe = contents->GetAllFrames()[1];
+  std::string subframe_origin;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
+      subframe, "domAutomationController.send(window.origin)",
+      &subframe_origin));
+  EXPECT_EQ("chrome-search://most-visited", subframe_origin);
+}
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
new file mode 100644
index 0000000..e187d3d
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
@@ -0,0 +1,47 @@
+// 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/views/autofill/payments/save_card_failure_bubble_views.h"
+
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/chrome_typography.h"
+#include "components/autofill/core/browser/ui/payments/save_card_bubble_controller.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace autofill {
+
+SaveCardFailureBubbleViews::SaveCardFailureBubbleViews(
+    views::View* anchor_view,
+    const gfx::Point& anchor_point,
+    content::WebContents* web_contents,
+    SaveCardBubbleController* controller)
+    : SaveCardBubbleViews(anchor_view, anchor_point, web_contents, controller) {
+}
+
+int SaveCardFailureBubbleViews::GetDialogButtons() const {
+  return ui::DIALOG_BUTTON_NONE;
+}
+
+std::unique_ptr<views::View>
+SaveCardFailureBubbleViews::CreateMainContentView() {
+  std::unique_ptr<views::View> main_view = std::make_unique<views::View>();
+  ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
+
+  main_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::kVertical, gfx::Insets(),
+      provider->GetDistanceMetric(views::DISTANCE_UNRELATED_CONTROL_VERTICAL)));
+
+  base::string16 explanation = controller()->GetExplanatoryMessage();
+  if (!explanation.empty()) {
+    auto* explanation_label = new views::Label(
+        explanation, CONTEXT_BODY_TEXT_LARGE, ChromeTextStyle::STYLE_SECONDARY);
+    explanation_label->SetMultiLine(true);
+    explanation_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+    main_view->AddChildView(explanation_label);
+  }
+  return main_view;
+}
+
+}  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.h b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.h
new file mode 100644
index 0000000..a09faff
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.h
@@ -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.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_CARD_FAILURE_BUBBLE_VIEWS_H_
+#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_CARD_FAILURE_BUBBLE_VIEWS_H_
+
+#include "chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h"
+
+namespace autofill {
+
+// This class displays the bubble shown when credit card upload failed.
+class SaveCardFailureBubbleViews : public SaveCardBubbleViews {
+ public:
+  SaveCardFailureBubbleViews(views::View* anchor_view,
+                             const gfx::Point& anchor_point,
+                             content::WebContents* web_contents,
+                             SaveCardBubbleController* controller);
+
+  // SaveCardBubbleViews:
+  int GetDialogButtons() const override;
+
+ protected:
+  ~SaveCardFailureBubbleViews() override = default;
+
+ private:
+  // SaveCardBubbleViews:
+  std::unique_ptr<views::View> CreateMainContentView() override;
+
+  DISALLOW_COPY_AND_ASSIGN(SaveCardFailureBubbleViews);
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_CARD_FAILURE_BUBBLE_VIEWS_H_
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index d43d4b1..59d87d4 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -899,21 +899,22 @@
 
   dropdown_state_ = NORMAL;
   if (mode_ == DANGEROUS_MODE) {
-    save_button_ = views::MdTextButton::Create(
+    auto save_button = views::MdTextButton::Create(
         this, model_->GetWarningConfirmButtonText());
-    AddChildView(save_button_);
+    save_button_ = AddChildView(std::move(save_button));
   }
-  discard_button_ = views::MdTextButton::Create(
+  auto discard_button = views::MdTextButton::Create(
       this, l10n_util::GetStringUTF16(IDS_DISCARD_DOWNLOAD));
-  AddChildView(discard_button_);
+  discard_button_ = AddChildView(std::move(discard_button));
 
   base::string16 dangerous_label =
       model_->GetWarningText(font_list_, kTextWidth);
-  dangerous_download_label_ = new views::Label(dangerous_label);
-  dangerous_download_label_->SetMultiLine(true);
-  dangerous_download_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  dangerous_download_label_->SetAutoColorReadabilityEnabled(false);
-  AddChildView(dangerous_download_label_);
+  auto dangerous_download_label =
+      std::make_unique<views::Label>(dangerous_label);
+  dangerous_download_label->SetMultiLine(true);
+  dangerous_download_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  dangerous_download_label->SetAutoColorReadabilityEnabled(false);
+  dangerous_download_label_ = AddChildView(std::move(dangerous_download_label));
   SizeLabelToMinWidth();
 
   file_name_label_->SetVisible(false);
diff --git a/chrome/browser/ui/views/download/download_shelf_view.cc b/chrome/browser/ui/views/download/download_shelf_view.cc
index f9e92e7..9a63032 100644
--- a/chrome/browser/ui/views/download/download_shelf_view.cc
+++ b/chrome/browser/ui/views/download/download_shelf_view.cc
@@ -72,16 +72,15 @@
   // cases, like when installing a theme. See DownloadShelf::AddDownload().
   SetVisible(false);
 
-  show_all_view_ = views::MdTextButton::Create(
+  auto show_all_view = views::MdTextButton::Create(
       this, l10n_util::GetStringUTF16(IDS_SHOW_ALL_DOWNLOADS));
-  AddChildView(show_all_view_);
+  show_all_view_ = AddChildView(std::move(show_all_view));
 
   auto close_button = views::CreateVectorImageButton(this);
   close_button->SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE));
   close_button_ = AddChildView(std::move(close_button));
 
-  accessible_alert_ = new views::View();
-  AddChildView(accessible_alert_);
+  accessible_alert_ = AddChildView(std::make_unique<views::View>());
 
   if (gfx::Animation::ShouldRenderRichAnimation()) {
     new_item_animation_.SetSlideDuration(kNewItemAnimationDurationMs);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 252a06c..c1ef49ee 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -70,6 +70,7 @@
 #include "chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.h"
 #include "chrome/browser/ui/views/autofill/payments/local_card_migration_icon_view.h"
 #include "chrome/browser/ui/views/autofill/payments/save_card_bubble_views.h"
+#include "chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.h"
 #include "chrome/browser/ui/views/autofill/payments/save_card_icon_view.h"
 #include "chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.h"
 #include "chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.h"
@@ -1358,6 +1359,10 @@
       bubble = new autofill::SaveCardManageCardsBubbleViews(
           anchor_view, gfx::Point(), web_contents, controller);
       break;
+    case autofill::BubbleType::FAILURE:
+      bubble = new autofill::SaveCardFailureBubbleViews(
+          anchor_view, gfx::Point(), web_contents, controller);
+      break;
     case autofill::BubbleType::INACTIVE:
       break;
   }
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar.cc b/chrome/browser/ui/views/infobars/confirm_infobar.cc
index cdc8122..7949bcc 100644
--- a/chrome/browser/ui/views/infobars/confirm_infobar.cc
+++ b/chrome/browser/ui/views/infobars/confirm_infobar.cc
@@ -128,16 +128,16 @@
 
 views::MdTextButton* ConfirmInfoBar::CreateButton(
     ConfirmInfoBarDelegate::InfoBarButton type) {
-  auto* button =
+  auto button =
       views::MdTextButton::Create(this, GetDelegate()->GetButtonLabel(type));
   button->SetProperty(
       views::kMarginsKey,
       new gfx::Insets(ChromeLayoutProvider::Get()->GetDistanceMetric(
                           DISTANCE_TOAST_CONTROL_VERTICAL),
                       0));
-  AddChildView(button);
-  button->SizeToPreferredSize();
-  return button;
+  auto* button_ptr = AddChildView(std::move(button));
+  button_ptr->SizeToPreferredSize();
+  return button_ptr;
 }
 
 int ConfirmInfoBar::NonLabelWidth() const {
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
index ff5e2cea4..ee7651ff 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
@@ -345,16 +345,16 @@
   if (type != kBillingAddressType)
     return nullptr;
 
-  std::unique_ptr<views::View> button_view = std::make_unique<views::View>();
+  auto button_view = std::make_unique<views::View>();
   button_view->SetLayoutManager(std::make_unique<views::FillLayout>());
 
   // The button to add new billing addresses.
-  std::unique_ptr<views::Button> add_button(
-      views::MdTextButton::Create(this, l10n_util::GetStringUTF16(IDS_ADD)));
+  auto add_button =
+      views::MdTextButton::Create(this, l10n_util::GetStringUTF16(IDS_ADD));
   add_button->SetID(static_cast<int>(DialogViewID::ADD_BILLING_ADDRESS_BUTTON));
   add_button->set_tag(add_billing_address_button_tag_);
   add_button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
-  button_view->AddChildView(add_button.release());
+  button_view->AddChildView(std::move(add_button));
   return button_view;
 }
 
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
index e17a827..c2a65cd5 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -280,7 +280,7 @@
     bool md_style) {
   std::unique_ptr<views::LabelButton> button =
       md_style ? views::MdTextButton::CreateSecondaryUiBlueButton(this, text)
-               : base::WrapUnique(views::MdTextButton::Create(this, text));
+               : views::MdTextButton::Create(this, text);
   views::Button* pointer = button.get();
 
   // Add margins.
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc
index 23da85c..4d576db 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc
@@ -4,10 +4,15 @@
 
 #include "chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h"
 
+#include <string>
+
 #include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/send_tab_to_self/target_device_info.h"
 #include "components/sync/protocol/sync.pb.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
 
@@ -17,6 +22,7 @@
 
 // Icon sizes in DIP.
 constexpr int kPrimaryIconSize = 20;
+constexpr int kPrimaryIconBorderWidth = 6;
 
 enum class DeviceIconType {
   DESKTOP = 0,
@@ -40,12 +46,35 @@
   return gfx::CreateVectorIcon(*vector_icon, kPrimaryIconSize, icon_color);
 }
 
-gfx::ImageSkia CreateIconView(
+std::unique_ptr<views::ImageView> CreateIconView(
     const sync_pb::SyncEnums::DeviceType device_type) {
+  gfx::ImageSkia image;
   if (device_type == sync_pb::SyncEnums::TYPE_PHONE) {
-    return CreateDeviceIcon(DeviceIconType::PHONE);
+    image = CreateDeviceIcon(DeviceIconType::PHONE);
+  } else {
+    image = CreateDeviceIcon(DeviceIconType::DESKTOP);
   }
-  return CreateDeviceIcon(DeviceIconType::DESKTOP);
+  auto icon_view = std::make_unique<views::ImageView>();
+  icon_view->SetImage(image);
+  icon_view->SetBorder(
+      views::CreateEmptyBorder(gfx::Insets(kPrimaryIconBorderWidth)));
+  return icon_view;
+}
+
+base::string16 GetLastUpdatedTime(const TargetDeviceInfo& device_info) {
+  int time_in_days =
+      (base::Time::Now() - device_info.last_updated_timestamp).InDays();
+  if (time_in_days == 0) {
+    return l10n_util::GetStringUTF16(
+        IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_TODAY_SEND_TAB_TO_SELF);
+  } else if (time_in_days == 1) {
+    return l10n_util::GetStringFUTF16(
+        IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAY_SEND_TAB_TO_SELF,
+        base::UTF8ToUTF16(std::to_string(time_in_days)));
+  }
+  return l10n_util::GetStringFUTF16(
+      IDS_OMNIBOX_BUBBLE_ITEM_SUBTITLE_DAYS_SEND_TAB_TO_SELF,
+      base::UTF8ToUTF16(std::to_string(time_in_days)));
 }
 
 }  // namespace
@@ -57,7 +86,8 @@
     int button_tag)
     : HoverButton(button_listener,
                   CreateIconView(device_info.device_type),
-                  base::UTF8ToUTF16(device_name)) {
+                  base::UTF8ToUTF16(device_name),
+                  GetLastUpdatedTime(device_info)) {
   device_name_ = device_name;
   device_guid_ = device_info.cache_guid;
   device_type_ = device_info.device_type;
diff --git a/chrome/browser/ui/views/sync/dice_signin_button_view.cc b/chrome/browser/ui/views/sync/dice_signin_button_view.cc
index ef94f831..e57f72a6 100644
--- a/chrome/browser/ui/views/sync/dice_signin_button_view.cc
+++ b/chrome/browser/ui/views/sync/dice_signin_button_view.cc
@@ -33,12 +33,11 @@
     : account_(base::nullopt) {
   SetLayoutManager(std::make_unique<views::FillLayout>());
   // Regular MD text button when there is no account.
-  views::MdTextButton* button = views::MdTextButton::Create(
+  auto button = views::MdTextButton::Create(
       button_listener,
       l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON));
   button->SetProminent(prominent);
-  AddChildView(button);
-  signin_button_ = button;
+  signin_button_ = AddChildView(std::move(button));
 }
 
 DiceSigninButtonView::DiceSigninButtonView(
@@ -93,12 +92,12 @@
   // Add a stretching column for the sign in button.
   columns->AddColumn(views::GridLayout::FILL, views::GridLayout::TRAILING, 1.0,
                      views::GridLayout::USE_PREF, 0, 0);
-  views::MdTextButton* button = views::MdTextButton::Create(
+  auto button = views::MdTextButton::Create(
       button_listener,
       l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON));
   button->SetProminent(true);
-  grid_layout->AddView(button);
-  signin_button_ = button;
+  grid_layout->AddView(button.get());
+  signin_button_ = button.release();
 }
 
 DiceSigninButtonView::~DiceSigninButtonView() = default;
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
index 7d3874c5..7a95459 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_localized_strings_provider.cc
@@ -76,6 +76,9 @@
       localized_strings([] {
         std::vector<LocalizedStringWithName> localized_strings;
 
+        // TODO(crbug.com/964547): Refactor so that any change to these strings
+        // will surface in both the OOBE and post-OOBE UIs without having to
+        // adjust both localization calls separately.
         localized_strings.emplace_back(
             "startSetupPageMessage",
             l10n_util::GetStringFUTF16(
@@ -120,8 +123,26 @@
   for (const auto& entry : kLocalizedStringsWithoutPlaceholders)
     builder->Add(entry.name, entry.id);
 
-  for (const auto& entry : GetLocalizedStringsWithPlaceholders())
-    builder->Add(entry.name, entry.localized_string);
+  // TODO(crbug.com/964547): Refactor so that any change to these strings will
+  // surface in both the OOBE and post-OOBE UIs without having to adjust both
+  // localization calls separately.
+  builder->AddF(
+      "startSetupPageMessage", IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_MESSAGE,
+      base::ASCIIToUTF16(kFootnoteMarker),
+      base::UTF8ToUTF16(chromeos::multidevice_setup::
+                            GetBoardSpecificBetterTogetherSuiteLearnMoreUrl()
+                                .spec()));
+
+  builder->AddF("startSetupPageFootnote",
+                IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_FOOTNOTE,
+                base::ASCIIToUTF16(kFootnoteMarker));
+
+  builder->AddF(
+      "startSetupPageFeatureListAwm",
+      IDS_MULTIDEVICE_SETUP_START_SETUP_PAGE_AWM_DESCRIPTION,
+      base::UTF8ToUTF16(
+          chromeos::multidevice_setup::GetBoardSpecificMessagesLearnMoreUrl()
+              .spec()));
 }
 
 }  // namespace multidevice_setup
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc
index 7bf71367..d259e91 100644
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc
+++ b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc
@@ -30,6 +30,8 @@
       return "Personalized";
     case ExploreSitesVariation::CONDENSED:
       return "Condensed";
+    case ExploreSitesVariation::MOST_LIKELY:
+      return "Most Likely";
     case ExploreSitesVariation::DISABLED:
       return "Disabled";
   }
diff --git a/chrome/browser/ui/webui/site_settings_helper.cc b/chrome/browser/ui/webui/site_settings_helper.cc
index 8dcc3e66..fa12149 100644
--- a/chrome/browser/ui/webui/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/site_settings_helper.cc
@@ -13,6 +13,8 @@
 #include "base/stl_util.h"
 #include "base/values.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/hid/hid_chooser_context.h"
+#include "chrome/browser/hid/hid_chooser_context_factory.h"
 #include "chrome/browser/permissions/chooser_context_base.h"
 #include "chrome/browser/permissions/permission_manager.h"
 #include "chrome/browser/permissions/permission_result.h"
@@ -53,6 +55,7 @@
 // Chooser data group names.
 const char kUsbChooserDataGroupType[] = "usb-devices-data";
 const char kSerialChooserDataGroupType[] = "serial-ports-data";
+const char kHidChooserDataGroupType[] = "hid-devices-data";
 
 const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
     // The following ContentSettingsTypes have UI in Content Settings
@@ -85,6 +88,8 @@
     {CONTENT_SETTINGS_TYPE_SERIAL_GUARD, "serial-ports"},
     {CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, kSerialChooserDataGroupType},
     {CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING, "bluetooth-scanning"},
+    {CONTENT_SETTINGS_TYPE_HID_GUARD, "hid-devices"},
+    {CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA, kHidChooserDataGroupType},
 
     // Add new content settings here if a corresponding Javascript string
     // representation for it is not required. Note some exceptions do have UI in
@@ -248,11 +253,17 @@
   return SerialChooserContextFactory::GetForProfile(profile);
 }
 
+ChooserContextBase* GetHidChooserContext(Profile* profile) {
+  return HidChooserContextFactory::GetForProfile(profile);
+}
+
 const ChooserTypeNameEntry kChooserTypeGroupNames[] = {
     {&GetUsbChooserContext, &UsbChooserContext::GetObjectName,
      kUsbChooserDataGroupType},
     {&GetSerialChooserContext, &SerialChooserContext::GetObjectName,
      kSerialChooserDataGroupType},
+    {&GetHidChooserContext, &HidChooserContext::GetObjectName,
+     kHidChooserDataGroupType},
 };
 
 }  // namespace
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h
index 376ff207..79e7055 100644
--- a/chrome/browser/web_applications/components/install_finalizer.h
+++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -45,7 +45,6 @@
     // app will launch in |force_launch_container|.
     LaunchContainer force_launch_container = LaunchContainer::kDefault;
     Source source = Source::kUser;
-    bool error_on_unsupported_requirements = false;
     bool locally_installed = true;
     bool no_network_install = false;
   };
diff --git a/chrome/browser/web_applications/components/web_app_data_retriever.cc b/chrome/browser/web_applications/components/web_app_data_retriever.cc
index 855ad55..9170b89 100644
--- a/chrome/browser/web_applications/components/web_app_data_retriever.cc
+++ b/chrome/browser/web_applications/components/web_app_data_retriever.cc
@@ -80,6 +80,7 @@
   params.check_eligibility = true;
   params.valid_primary_icon = true;
   params.valid_manifest = true;
+  params.check_webapp_manifest_display = false;
   // Do not wait for a service worker if it doesn't exist.
   params.has_worker = !bypass_service_worker_check;
   // Do not wait_for_worker. OnDidPerformInstallableCheck is always invoked.
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
index 47ff5910..eb4d91e1 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -89,9 +89,6 @@
   scoped_refptr<CrxInstaller> crx_installer =
       crx_installer_factory_.Run(profile_);
 
-  crx_installer->set_error_on_unsupported_requirements(
-      options.error_on_unsupported_requirements);
-
   extensions::LaunchType launch_type =
       web_app_info.open_as_window ? LAUNCH_TYPE_WINDOW : LAUNCH_TYPE_REGULAR;
 
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc
index 3948bda0..5bb61f2d 100644
--- a/chrome/browser/web_applications/web_app_install_task.cc
+++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -305,7 +305,6 @@
 
   InstallFinalizer::FinalizeOptions options;
   options.locally_installed = is_locally_installed;
-  options.error_on_unsupported_requirements = true;
 
   install_finalizer_->FinalizeInstall(
       *web_app_info, options,
diff --git a/chrome/browser/web_applications/web_app_install_task_unittest.cc b/chrome/browser/web_applications/web_app_install_task_unittest.cc
index a434f14..b60df918d 100644
--- a/chrome/browser/web_applications/web_app_install_task_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_task_unittest.cc
@@ -840,10 +840,6 @@
                             .finalize_options_list()
                             .at(0)
                             .locally_installed);
-            EXPECT_TRUE(test_install_finalizer()
-                            .finalize_options_list()
-                            .at(0)
-                            .error_on_unsupported_requirements);
 
             std::unique_ptr<WebApplicationInfo> final_web_app_info =
                 test_install_finalizer().web_app_info();
diff --git a/chrome/common/search.mojom b/chrome/common/search.mojom
index 6b7f168..019e2ab 100644
--- a/chrome/common/search.mojom
+++ b/chrome/common/search.mojom
@@ -103,7 +103,6 @@
                        mojo_base.mojom.String16 text_to_be_pasted);
 
   // Updates the NTP custom background preferences.
-  SetCustomBackgroundURL(url.mojom.Url url);
   SetCustomBackgroundURLWithAttributions(url.mojom.Url background_url,
                                          string attribution_line_1,
                                          string attribution_line_2,
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index b4bde767..8c1dd6b 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -484,7 +484,7 @@
   void SimulateUsernameFieldAutofill(const std::string& text) {
     // Simulate set |username_element_| in focus.
     static_cast<content::RenderFrameObserver*>(autofill_agent_)
-        ->FocusedNodeChanged(username_element_);
+        ->FocusedElementChanged(username_element_);
     // Fill focused element (i.e. |username_element_|).
     autofill_agent_->FillFieldWithValue(ASCIIToUTF16(text));
   }
diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc
index a9a24e1..5574106 100644
--- a/chrome/renderer/searchbox/searchbox.cc
+++ b/chrome/renderer/searchbox/searchbox.cc
@@ -364,10 +364,6 @@
   return internal::FixupAndValidateUrl(url);
 }
 
-void SearchBox::SetCustomBackgroundURL(const GURL& background_url) {
-  embedded_search_service_->SetCustomBackgroundURL(background_url);
-}
-
 void SearchBox::SetCustomBackgroundURLWithAttributions(
     const GURL& background_url,
     const std::string& attribution_line_1,
diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h
index 2575d72..791cfd5 100644
--- a/chrome/renderer/searchbox/searchbox.h
+++ b/chrome/renderer/searchbox/searchbox.h
@@ -140,7 +140,6 @@
 
   // Updates the NTP custom background preferences, sometimes this includes
   // image attributions.
-  void SetCustomBackgroundURL(const GURL& background_url);
   void SetCustomBackgroundURLWithAttributions(
       const GURL& background_url,
       const std::string& attribution_line_1,
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc
index 7a962078..eb9c22ef 100644
--- a/chrome/renderer/searchbox/searchbox_extension.cc
+++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -1025,7 +1025,7 @@
     const std::string& background_url) {
   SearchBox* search_box = GetSearchBoxForCurrentContext();
   GURL url(background_url);
-  search_box->SetCustomBackgroundURL(url);
+  search_box->SetCustomBackgroundURLWithAttributions(url, std::string(), std::string(), GURL());
 }
 
 // static
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 6482a11..c77c37b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1025,6 +1025,7 @@
       "../browser/ui/search/local_ntp_suggestions_browsertest.cc",
       "../browser/ui/search/local_ntp_voice_search_browsertest.cc",
       "../browser/ui/search/new_tab_page_navigation_throttle_browsertest.cc",
+      "../browser/ui/search/third_party_ntp_browsertest.cc",
       "../browser/ui/search_engines/search_engine_tab_helper_browsertest.cc",
       "../browser/ui/settings_window_manager_browsertest_chromeos.cc",
       "../browser/ui/startup/startup_browser_creator_browsertest.cc",
@@ -1164,13 +1165,13 @@
       "//components/dom_distiller/content/browser",
       "//components/dom_distiller/content/renderer",
       "//components/dom_distiller/core:test_support",
-      "//components/download/quarantine:test_support",
       "//components/feature_engagement/test:test_support",
       "//components/offline_items_collection/core/test_support",
       "//components/optimization_guide:test_support",
       "//components/policy:chrome_settings_proto_generated_compile",
       "//components/resources",
       "//components/safe_browsing/db:test_database_manager",
+      "//components/services/quarantine:test_support",
       "//components/strings",
       "//components/sync",
       "//components/translate/core/common",
@@ -3375,6 +3376,7 @@
 
       # GCMDriverAndroid is not yet implemented.
       "../browser/gcm/gcm_profile_service_unittest.cc",
+      "../browser/hid/hid_chooser_context_unittest.cc",
       "../browser/importer/firefox_profile_lock_unittest.cc",
       "../browser/importer/profile_writer_unittest.cc",
       "../browser/lifetime/application_lifetime_unittest.cc",
@@ -3676,6 +3678,7 @@
       "../browser/media/router/providers/cast/cast_session_client_unittest.cc",
       "../browser/media/router/providers/cast/cast_session_tracker_unittest.cc",
       "../browser/media/router/providers/cast/dual_media_sink_service_unittest.cc",
+      "../browser/media/router/providers/cast/mirroring_activity_record_unittest.cc",
       "../browser/media/router/providers/cast/mock_cast_activity_record.cc",
       "../browser/media/router/providers/cast/mock_cast_activity_record.h",
       "../browser/media/router/providers/cast/test_util.cc",
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
index 0ee9fb8..b8a4cf50 100644
--- a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
+++ b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
@@ -498,6 +498,28 @@
   mocha.run();
 });
 
+/**
+ * @constructor
+ * @extends {CrElementsBrowserTest}
+ */
+function CrElementsLinkRowTest() {}
+
+CrElementsLinkRowTest.prototype = {
+  __proto__: CrElementsBrowserTest.prototype,
+
+  /** @override */
+  browsePreload: 'chrome://resources/cr_elements/cr_link_row/cr_link_row.html',
+
+  /** @override */
+  extraLibraries: CrElementsBrowserTest.prototype.extraLibraries.concat([
+    'cr_link_row_tests.js',
+  ]),
+};
+
+TEST_F('CrElementsLinkRowTest', 'All', function() {
+  mocha.run();
+});
+
 GEN('#if defined(OS_CHROMEOS)');
 /**
  * @constructor
diff --git a/chrome/test/data/webui/cr_elements/cr_link_row_tests.js b/chrome/test/data/webui/cr_elements/cr_link_row_tests.js
new file mode 100644
index 0000000..94ad3e7
--- /dev/null
+++ b/chrome/test/data/webui/cr_elements/cr_link_row_tests.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.
+
+suite('cr-link-row', function() {
+  let linkRow;
+
+  setup(() => {
+    PolymerTest.clearBody();
+    document.body.innerHTML = '<cr-link-row></cr-link-row>';
+    linkRow = document.body.querySelector('cr-link-row');
+  });
+
+  test('check label visibility', () => {
+    assertTrue(linkRow.$.labelWrapper.hidden);
+    linkRow.usingSlottedLabel = true;
+    assertFalse(linkRow.$.labelWrapper.hidden);
+    linkRow.usingSlottedLabel = false;
+    assertTrue(linkRow.$.labelWrapper.hidden);
+    linkRow.label = 'label';
+    assertFalse(linkRow.$.labelWrapper.hidden);
+  });
+
+  test('icon', () => {
+    const iconButton = linkRow.$.icon;
+    assertFalse(linkRow.external);
+    assertEquals('cr:arrow-right', iconButton.ironIcon);
+    linkRow.external = true;
+    assertEquals('cr:open-in-new', iconButton.ironIcon);
+  });
+});
diff --git a/chrome/test/data/webui/settings/split_settings_flag_test.js b/chrome/test/data/webui/settings/split_settings_flag_test.js
index f5abb68..7930849 100644
--- a/chrome/test/data/webui/settings/split_settings_flag_test.js
+++ b/chrome/test/data/webui/settings/split_settings_flag_test.js
@@ -20,7 +20,6 @@
       'languages',
       'onStartup',
       'people',
-      'printing',
       'privacy',
       'reset',
       'search',
diff --git a/chrome/test/ppapi/ppapi_filechooser_browsertest.cc b/chrome/test/ppapi/ppapi_filechooser_browsertest.cc
index e3ac345..f0ffcde 100644
--- a/chrome/test/ppapi/ppapi_filechooser_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_filechooser_browsertest.cc
@@ -17,7 +17,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/ppapi/ppapi_test.h"
 #include "chrome/test/ppapi/ppapi_test_select_file_dialog_factory.h"
-#include "components/download/quarantine/test_support.h"
+#include "components/services/quarantine/test_support.h"
 #include "ppapi/shared_impl/test_utils.h"
 
 #if defined(FULL_SAFE_BROWSING)
@@ -260,7 +260,7 @@
       temp_dir.GetPath().AppendASCII("dangerous.exe");
 
   ASSERT_TRUE(base::PathExists(actual_filename));
-  EXPECT_TRUE(download::IsFileQuarantined(actual_filename, GURL(), GURL()));
+  EXPECT_TRUE(quarantine::IsFileQuarantined(actual_filename, GURL(), GURL()));
 }
 #endif  // defined(OS_WIN)
 
diff --git a/chromecast/media/audio/cast_audio_mixer.cc b/chromecast/media/audio/cast_audio_mixer.cc
index 0b9884eb..95a57b70 100644
--- a/chromecast/media/audio/cast_audio_mixer.cc
+++ b/chromecast/media/audio/cast_audio_mixer.cc
@@ -137,6 +137,9 @@
     source_callback_ = nullptr;
   }
 
+  // There is nothing to flush since the proxy stream is removed during Stop().
+  void Flush() override {}
+
   void SetVolume(double volume) override {
     DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
 
diff --git a/chromecast/media/audio/cast_audio_mixer_unittest.cc b/chromecast/media/audio/cast_audio_mixer_unittest.cc
index 8c090a86..c767e949 100644
--- a/chromecast/media/audio/cast_audio_mixer_unittest.cc
+++ b/chromecast/media/audio/cast_audio_mixer_unittest.cc
@@ -97,6 +97,7 @@
 
   MOCK_METHOD0(Open, bool());
   MOCK_METHOD0(Close, void());
+  MOCK_METHOD0(Flush, void());
   MOCK_METHOD1(Start, void(AudioSourceCallback* source_callback));
   MOCK_METHOD0(Stop, void());
   MOCK_METHOD1(SetVolume, void(double volume));
diff --git a/chromecast/media/audio/cast_audio_output_stream.cc b/chromecast/media/audio/cast_audio_output_stream.cc
index 6e3fd2bb..91b9801 100644
--- a/chromecast/media/audio/cast_audio_output_stream.cc
+++ b/chromecast/media/audio/cast_audio_output_stream.cc
@@ -689,6 +689,12 @@
   }
 }
 
+void CastAudioOutputStream::Flush() {
+  DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
+  DVLOG(2) << this << ": " << __func__;
+  // TODO(alexleung): Implement in follow-up CL.
+}
+
 void CastAudioOutputStream::SetVolume(double volume) {
   DCHECK_CALLED_ON_VALID_THREAD(audio_thread_checker_);
   DCHECK(audio_thread_state_ != kPendingClose);
diff --git a/chromecast/media/audio/cast_audio_output_stream.h b/chromecast/media/audio/cast_audio_output_stream.h
index 731d39f..c471664 100644
--- a/chromecast/media/audio/cast_audio_output_stream.h
+++ b/chromecast/media/audio/cast_audio_output_stream.h
@@ -124,6 +124,7 @@
   void Stop() override;
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
+  void Flush() override;
 
  private:
   class CmaWrapper;
diff --git a/chromeos/dbus/BUILD.gn b/chromeos/dbus/BUILD.gn
index 5ed5920..b08d1bd 100644
--- a/chromeos/dbus/BUILD.gn
+++ b/chromeos/dbus/BUILD.gn
@@ -90,6 +90,8 @@
     "fake_debug_daemon_client.h",
     "fake_easy_unlock_client.cc",
     "fake_easy_unlock_client.h",
+    "fake_gnubby_client.cc",
+    "fake_gnubby_client.h",
     "fake_image_burner_client.cc",
     "fake_image_burner_client.h",
     "fake_image_loader_client.cc",
@@ -112,6 +114,8 @@
     "fake_vm_plugin_dispatcher_client.h",
     "fake_wilco_dtc_supportd_client.cc",
     "fake_wilco_dtc_supportd_client.h",
+    "gnubby_client.cc",
+    "gnubby_client.h",
     "image_burner_client.cc",
     "image_burner_client.h",
     "image_loader_client.cc",
@@ -224,6 +228,7 @@
     "cryptohome/fake_cryptohome_client_unittest.cc",
     "dbus_thread_manager_unittest.cc",
     "fake_easy_unlock_client_unittest.cc",
+    "fake_gnubby_client_unittest.cc",
     "native_timer_unittest.cc",
     "oobe_configuration_client_unittest.cc",
     "pipe_reader_unittest.cc",
diff --git a/chromeos/dbus/dbus_clients_browser.cc b/chromeos/dbus/dbus_clients_browser.cc
index 9546b4a0..ee234f3 100644
--- a/chromeos/dbus/dbus_clients_browser.cc
+++ b/chromeos/dbus/dbus_clients_browser.cc
@@ -27,6 +27,7 @@
 #include "chromeos/dbus/fake_cros_disks_client.h"
 #include "chromeos/dbus/fake_debug_daemon_client.h"
 #include "chromeos/dbus/fake_easy_unlock_client.h"
+#include "chromeos/dbus/fake_gnubby_client.h"
 #include "chromeos/dbus/fake_image_burner_client.h"
 #include "chromeos/dbus/fake_image_loader_client.h"
 #include "chromeos/dbus/fake_lorgnette_manager_client.h"
@@ -37,6 +38,7 @@
 #include "chromeos/dbus/fake_virtual_file_provider_client.h"
 #include "chromeos/dbus/fake_vm_plugin_dispatcher_client.h"
 #include "chromeos/dbus/fake_wilco_dtc_supportd_client.h"
+#include "chromeos/dbus/gnubby_client.h"
 #include "chromeos/dbus/image_burner_client.h"
 #include "chromeos/dbus/image_loader_client.h"
 #include "chromeos/dbus/lorgnette_manager_client.h"
@@ -85,6 +87,7 @@
   debug_daemon_client_ =
       CREATE_DBUS_CLIENT(DebugDaemonClient, use_real_clients);
   easy_unlock_client_ = CREATE_DBUS_CLIENT(EasyUnlockClient, use_real_clients);
+  gnubby_client_ = CREATE_DBUS_CLIENT(GnubbyClient, use_real_clients);
   image_burner_client_ =
       CREATE_DBUS_CLIENT(ImageBurnerClient, use_real_clients);
   image_loader_client_ =
@@ -122,6 +125,7 @@
   cros_disks_client_->Init(system_bus);
   debug_daemon_client_->Init(system_bus);
   easy_unlock_client_->Init(system_bus);
+  gnubby_client_->Init(system_bus);
   image_burner_client_->Init(system_bus);
   image_loader_client_->Init(system_bus);
   lorgnette_manager_client_->Init(system_bus);
diff --git a/chromeos/dbus/dbus_clients_browser.h b/chromeos/dbus/dbus_clients_browser.h
index ba62632..e7f9404 100644
--- a/chromeos/dbus/dbus_clients_browser.h
+++ b/chromeos/dbus/dbus_clients_browser.h
@@ -26,6 +26,7 @@
 class CrosDisksClient;
 class DebugDaemonClient;
 class EasyUnlockClient;
+class GnubbyClient;
 class ImageBurnerClient;
 class ImageLoaderClient;
 class LorgnetteManagerClient;
@@ -63,6 +64,7 @@
   std::unique_ptr<CrosDisksClient> cros_disks_client_;
   std::unique_ptr<DebugDaemonClient> debug_daemon_client_;
   std::unique_ptr<EasyUnlockClient> easy_unlock_client_;
+  std::unique_ptr<GnubbyClient> gnubby_client_;
   std::unique_ptr<ImageBurnerClient> image_burner_client_;
   std::unique_ptr<ImageLoaderClient> image_loader_client_;
   std::unique_ptr<LorgnetteManagerClient> lorgnette_manager_client_;
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
index ea856f110..a6460da7 100644
--- a/chromeos/dbus/dbus_thread_manager.cc
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -23,6 +23,7 @@
 #include "chromeos/dbus/dbus_clients_browser.h"
 #include "chromeos/dbus/debug_daemon_client.h"
 #include "chromeos/dbus/easy_unlock_client.h"
+#include "chromeos/dbus/gnubby_client.h"
 #include "chromeos/dbus/image_burner_client.h"
 #include "chromeos/dbus/image_loader_client.h"
 #include "chromeos/dbus/lorgnette_manager_client.h"
@@ -152,6 +153,10 @@
                           : nullptr;
 }
 
+GnubbyClient* DBusThreadManager::GetGnubbyClient() {
+  return clients_browser_ ? clients_browser_->gnubby_client_.get() : nullptr;
+}
+
 ShillDeviceClient* DBusThreadManager::GetShillDeviceClient() {
   return ShillDeviceClient::Get();
 }
@@ -357,6 +362,12 @@
       std::move(client);
 }
 
+void DBusThreadManagerSetter::SetGnubbyClient(
+    std::unique_ptr<GnubbyClient> client) {
+  DBusThreadManager::Get()->clients_browser_->gnubby_client_ =
+      std::move(client);
+}
+
 void DBusThreadManagerSetter::SetRuntimeProbeClient(
     std::unique_ptr<RuntimeProbeClient> client) {
   DBusThreadManager::Get()->clients_browser_->runtime_probe_client_ =
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h
index 10a7517..f3e508af 100644
--- a/chromeos/dbus/dbus_thread_manager.h
+++ b/chromeos/dbus/dbus_thread_manager.h
@@ -36,6 +36,7 @@
 class DBusThreadManagerSetter;
 class DebugDaemonClient;
 class EasyUnlockClient;
+class GnubbyClient;
 class ImageBurnerClient;
 class ImageLoaderClient;
 class LorgnetteManagerClient;
@@ -124,6 +125,7 @@
   CrosDisksClient* GetCrosDisksClient();
   DebugDaemonClient* GetDebugDaemonClient();
   EasyUnlockClient* GetEasyUnlockClient();
+  GnubbyClient* GetGnubbyClient();
   ImageBurnerClient* GetImageBurnerClient();
   ImageLoaderClient* GetImageLoaderClient();
   LorgnetteManagerClient* GetLorgnetteManagerClient();
@@ -180,6 +182,7 @@
   void SetConciergeClient(std::unique_ptr<ConciergeClient> client);
   void SetCrosDisksClient(std::unique_ptr<CrosDisksClient> client);
   void SetDebugDaemonClient(std::unique_ptr<DebugDaemonClient> client);
+  void SetGnubbyClient(std::unique_ptr<GnubbyClient> client);
   void SetImageBurnerClient(std::unique_ptr<ImageBurnerClient> client);
   void SetImageLoaderClient(std::unique_ptr<ImageLoaderClient> client);
   void SetSeneschalClient(std::unique_ptr<SeneschalClient> client);
diff --git a/chromeos/dbus/fake_gnubby_client.cc b/chromeos/dbus/fake_gnubby_client.cc
new file mode 100644
index 0000000..c3a1698
--- /dev/null
+++ b/chromeos/dbus/fake_gnubby_client.cc
@@ -0,0 +1,29 @@
+// 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 "chromeos/dbus/fake_gnubby_client.h"
+
+namespace chromeos {
+
+FakeGnubbyClient::FakeGnubbyClient() : weak_ptr_factory_(this) {}
+
+FakeGnubbyClient::~FakeGnubbyClient() = default;
+
+void FakeGnubbyClient::Init(dbus::Bus* bus) {}
+
+void FakeGnubbyClient::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+}
+
+void FakeGnubbyClient::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
+void FakeGnubbyClient::SignalPromptUserAuth() {
+  calls_++;
+  for (auto& observer : observer_list_)
+    observer.PromptUserAuth();
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/fake_gnubby_client.h b/chromeos/dbus/fake_gnubby_client.h
new file mode 100644
index 0000000..7df051e0
--- /dev/null
+++ b/chromeos/dbus/fake_gnubby_client.h
@@ -0,0 +1,38 @@
+// 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 CHROMEOS_DBUS_FAKE_GNUBBY_CLIENT_H_
+#define CHROMEOS_DBUS_FAKE_GNUBBY_CLIENT_H_
+
+#include "base/observer_list.h"
+#include "chromeos/dbus/gnubby_client.h"
+
+namespace chromeos {
+
+// A fake implementation of GnubbyClient used for tests.
+class COMPONENT_EXPORT(CHROMEOS_DBUS) FakeGnubbyClient : public GnubbyClient {
+ public:
+  FakeGnubbyClient();
+  ~FakeGnubbyClient() override;
+
+  // GnubbyClient overrides
+  void Init(dbus::Bus* bus) override;
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
+  void SignalPromptUserAuth();
+  int calls() { return calls_; }
+
+ private:
+  int calls_ = 0;
+
+  base::ObserverList<Observer>::Unchecked observer_list_;
+
+  base::WeakPtrFactory<FakeGnubbyClient> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeGnubbyClient);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_FAKE_GNUBBY_CLIENT_H_
diff --git a/chromeos/dbus/fake_gnubby_client_unittest.cc b/chromeos/dbus/fake_gnubby_client_unittest.cc
new file mode 100644
index 0000000..3586fdf2
--- /dev/null
+++ b/chromeos/dbus/fake_gnubby_client_unittest.cc
@@ -0,0 +1,56 @@
+// 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 "chromeos/dbus/fake_gnubby_client.h"
+
+#include "base/scoped_observer.h"
+#include "base/test/scoped_task_environment.h"
+#include "chromeos/dbus/attestation/attestation.pb.h"
+#include "chromeos/dbus/gnubby_client.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+namespace {
+
+class TestObserver : public GnubbyClient::Observer {
+ public:
+  TestObserver() = default;
+
+  void PromptUserAuth() override { calls_++; }
+  int calls() { return calls_; }
+
+ private:
+  int calls_ = 0;
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+}  // namespace
+
+class FakeGnubbyClientTest : public testing::Test {
+ public:
+  FakeGnubbyClientTest() = default;
+
+ protected:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  FakeGnubbyClient fake_gnubby_client_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FakeGnubbyClientTest);
+};
+
+TEST_F(FakeGnubbyClientTest, NotificationSent) {
+  TestObserver observer;
+  ScopedObserver<GnubbyClient, TestObserver> scoped_observer(&observer);
+  scoped_observer.Add(&fake_gnubby_client_);
+
+  EXPECT_EQ(fake_gnubby_client_.calls(), 0);
+  EXPECT_EQ(observer.calls(), 0);
+  fake_gnubby_client_.SignalPromptUserAuth();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(fake_gnubby_client_.calls(), 1);
+  EXPECT_EQ(observer.calls(), 1);
+}
+
+}  // namespace chromeos
diff --git a/chromeos/dbus/gnubby_client.cc b/chromeos/dbus/gnubby_client.cc
new file mode 100644
index 0000000..1ff11b6
--- /dev/null
+++ b/chromeos/dbus/gnubby_client.cc
@@ -0,0 +1,78 @@
+// 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 "chromeos/dbus/gnubby_client.h"
+
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
+#include "base/timer/timer.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_path.h"
+#include "dbus/object_proxy.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+namespace {
+
+class GnubbyClientImpl : public GnubbyClient {
+ public:
+  GnubbyClientImpl() : weak_ptr_factory_(this) {}
+
+  // GnubbyClient override.
+  void AddObserver(Observer* observer) override {
+    observer_list_.AddObserver(observer);
+  }
+
+  // GnubbyClient override.
+  void RemoveObserver(Observer* observer) override {
+    observer_list_.RemoveObserver(observer);
+  }
+
+  void PromptUserAuth(dbus::Signal* signal) {
+    for (auto& observer : observer_list_)
+      observer.PromptUserAuth();
+  }
+
+ protected:
+  void Init(dbus::Bus* bus) override {
+    dbus::ObjectProxy* proxy_ = bus->GetObjectProxy(
+        u2f::kU2FServiceName, dbus::ObjectPath(u2f::kU2FServicePath));
+
+    proxy_->ConnectToSignal(
+        u2f::kU2FInterface, u2f::kU2FUserNotificationSignal,
+        base::BindRepeating(&GnubbyClientImpl::PromptUserAuth,
+                            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&GnubbyClientImpl::OnSignalConnected,
+                       weak_ptr_factory_.GetWeakPtr()));
+  }
+
+ private:
+  // Handles the result of signal connection setup.
+  void OnSignalConnected(const std::string& interface,
+                         const std::string& signal,
+                         bool succeeded) {
+    LOG_IF(ERROR, !succeeded)
+        << "Connect to " << interface << " " << signal << " failed.";
+  }
+
+  base::ObserverList<Observer>::Unchecked observer_list_;
+
+  base::WeakPtrFactory<GnubbyClientImpl> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(GnubbyClientImpl);
+};
+
+}  // namespace
+
+GnubbyClient::GnubbyClient() = default;
+
+GnubbyClient::~GnubbyClient() = default;
+
+// static
+std::unique_ptr<GnubbyClient> GnubbyClient::Create() {
+  return std::make_unique<GnubbyClientImpl>();
+}
+}  // namespace chromeos
diff --git a/chromeos/dbus/gnubby_client.h b/chromeos/dbus/gnubby_client.h
new file mode 100644
index 0000000..fb632e33
--- /dev/null
+++ b/chromeos/dbus/gnubby_client.h
@@ -0,0 +1,49 @@
+// 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 CHROMEOS_DBUS_GNUBBY_CLIENT_H_
+#define CHROMEOS_DBUS_GNUBBY_CLIENT_H_
+
+#include <memory>
+
+#include "base/component_export.h"
+#include "chromeos/dbus/dbus_client.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "third_party/cros_system_api/dbus/u2f/dbus-constants.h"
+
+namespace chromeos {
+// GnubbyClient is used to communicate with the Gnubby service.
+class COMPONENT_EXPORT(CHROMEOS_DBUS) GnubbyClient : public DBusClient {
+ public:
+  // Interface for observing changes in Gnubby Client
+  class Observer {
+   public:
+    // Called when U2F service is requested
+    virtual void PromptUserAuth() {}
+
+   protected:
+    virtual ~Observer() = default;
+  };
+
+  // Create should be called instead of constructor.
+  GnubbyClient();
+  ~GnubbyClient() override;
+
+  // Factory function, creates a new instance and returns ownership.
+  // For normal usage, access the singleton via DBusThreadManager::Get().
+  static std::unique_ptr<GnubbyClient> Create();
+
+  // Adds an observer.
+  virtual void AddObserver(Observer* observer) = 0;
+
+  // Removes an observer if added.
+  virtual void RemoveObserver(Observer* observer) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GnubbyClient);
+};
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DBUS_GNUBBY_CLIENT_H_
diff --git a/chromeos/printing/printer_configuration.h b/chromeos/printing/printer_configuration.h
index 9994113..0f6015f 100644
--- a/chromeos/printing/printer_configuration.h
+++ b/chromeos/printing/printer_configuration.h
@@ -27,7 +27,12 @@
 
 // Classes of printers tracked.  See doc/cups_printer_management.md for
 // details on what these mean.
-enum class PrinterClass { kEnterprise, kAutomatic, kDiscovered, kSaved };
+enum class CHROMEOS_EXPORT PrinterClass {
+  kEnterprise,
+  kAutomatic,
+  kDiscovered,
+  kSaved
+};
 
 class CHROMEOS_EXPORT Printer {
  public:
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 188bfd3f..db1c3f3 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -256,6 +256,7 @@
       "//components/security_interstitials/content:unit_tests",
       "//components/security_state/content:unit_tests",
       "//components/services/heap_profiling:unit_tests",
+      "//components/services/quarantine:unit_tests",
       "//components/spellcheck/browser:unit_tests",
       "//components/spellcheck/renderer:unit_tests",
       "//components/subresource_filter/content/browser:unit_tests",
diff --git a/components/arc/intent_helper/DEPS b/components/arc/intent_helper/DEPS
index 8deb491..f64439e4 100644
--- a/components/arc/intent_helper/DEPS
+++ b/components/arc/intent_helper/DEPS
@@ -1,7 +1,6 @@
 include_rules = [
   "+ash/link_handler_model.h",
   "+ash/link_handler_model_factory.h",
-  "+ash/new_window_controller.h",
   "+ash/public",
   "+ash/shell.h",
   "+ash/shell_delegate.h",
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.cc b/components/arc/intent_helper/arc_intent_helper_bridge.cc
index 1a10375..56f860b 100644
--- a/components/arc/intent_helper/arc_intent_helper_bridge.cc
+++ b/components/arc/intent_helper/arc_intent_helper_bridge.cc
@@ -7,10 +7,9 @@
 #include <iterator>
 #include <utility>
 
-#include "ash/new_window_controller.h"
+#include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/interfaces/constants.mojom.h"
 #include "ash/public/interfaces/wallpaper.mojom.h"
-#include "ash/shell.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
 #include "base/memory/weak_ptr.h"
@@ -175,8 +174,7 @@
   // simply be brought to the forgeground without forcibly being navigated to
   // downloads, which is probably not ideal.
   // TODO(mash): Support this functionality without ash::Shell access in Chrome.
-  if (ash::Shell::HasInstance())
-    ash::Shell::Get()->new_window_controller()->OpenFileManager();
+  ash::NewWindowDelegate::GetInstance()->OpenFileManager();
 }
 
 void ArcIntentHelperBridge::OnOpenUrl(const std::string& url) {
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index 2b42a7a42..3e8a3349 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -225,19 +225,19 @@
     HidePopup();
 }
 
-void AutofillAgent::FocusedNodeChanged(const WebNode& node) {
+void AutofillAgent::FocusedElementChanged(const WebElement& element) {
   was_focused_before_now_ = false;
 
   if ((IsKeyboardAccessoryEnabled() || !focus_requires_scroll_) &&
       WebUserGestureIndicator::IsProcessingUserGesture(
-          node.IsNull() ? nullptr : node.GetDocument().GetFrame())) {
+          element.IsNull() ? nullptr : element.GetDocument().GetFrame())) {
     focused_node_was_last_clicked_ = true;
     HandleFocusChangeComplete();
   }
 
   HidePopup();
 
-  if (node.IsNull() || !node.IsElementNode()) {
+  if (element.IsNull()) {
     if (!last_interacted_form_.IsNull()) {
       // Focus moved away from the last interacted form to somewhere else on
       // the page.
@@ -246,22 +246,21 @@
     return;
   }
 
-  WebElement web_element = node.ToConst<WebElement>();
-  const WebInputElement* element = ToWebInputElement(&web_element);
+  const WebInputElement* input = ToWebInputElement(&element);
 
   if (!last_interacted_form_.IsNull() &&
-      (!element || last_interacted_form_ != element->Form())) {
+      (!input || last_interacted_form_ != input->Form())) {
     // The focused element is not part of the last interacted form (could be
     // in a different form).
     GetAutofillDriver()->FocusNoLongerOnForm();
     return;
   }
 
-  if (!element || !element->IsEnabled() || element->IsReadOnly() ||
-      !element->IsTextField())
+  if (!input || !input->IsEnabled() || input->IsReadOnly() ||
+      !input->IsTextField())
     return;
 
-  element_ = *element;
+  element_ = *input;
 
   FormData form;
   FormFieldData field;
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index d96e855..66a009e 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -165,7 +165,7 @@
                                 ui::PageTransition transition) override;
   void DidFinishDocumentLoad() override;
   void DidChangeScrollOffset() override;
-  void FocusedNodeChanged(const blink::WebNode& node) override;
+  void FocusedElementChanged(const blink::WebElement& element) override;
   void OnDestruct() override;
 
   // Fires Mojo messages for a given form submission.
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 8a25aab..e480b07 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -85,6 +85,12 @@
   <message name="IDS_AUTOFILL_DONE" desc="Text to show for the button in the save card manager bubble when the card has been saved either locally or to Google Payments.">
     Done
   </message>
+  <message name="IDS_AUTOFILL_FAILURE_BUBBLE_TITLE" desc="Title text for the Autofill credit card upload failure bubble.">
+    Can't save card
+  </message>
+  <message name="IDS_AUTOFILL_FAILURE_BUBBLE_EXPLANATION" desc="Explanation text for the Autofill credit card upload failure bubble main content. Shown as user-facing descripion.">
+    Sorry, your card can't be saved right now
+  </message>
   <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments and also saved locally. The prompt can be either a bubble or an infobar.">
     Pay quickly on sites and apps across devices using cards you have saved with Google.
   </message>
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
index c737231..d179a47d 100644
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -472,6 +472,15 @@
            ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE,
            ContentSettingsInfo::PERSISTENT,
            ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
+
+  Register(CONTENT_SETTINGS_TYPE_HID_GUARD, "hid-guard", CONTENT_SETTING_ASK,
+           WebsiteSettingsInfo::UNSYNCABLE, WhitelistedSchemes(),
+           ValidSettings(CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK),
+           WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_SCOPE,
+           WebsiteSettingsRegistry::DESKTOP,
+           ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE,
+           ContentSettingsInfo::PERSISTENT,
+           ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
 }
 
 void ContentSettingsRegistry::Register(
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc
index 085efe9..62d824a 100644
--- a/components/content_settings/core/browser/website_settings_registry.cc
+++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -199,6 +199,10 @@
            WebsiteSettingsInfo::NOT_LOSSY,
            WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE,
            DESKTOP, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO);
+  Register(CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA, "hid-chooser-data", nullptr,
+           WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY,
+           WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE,
+           DESKTOP, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO);
 }
 
 }  // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
index 38b527f..71bd6c60 100644
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -73,6 +73,8 @@
     {CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, 49},
     {CONTENT_SETTINGS_TYPE_PERIODIC_BACKGROUND_SYNC, 50},
     {CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING, 51},
+    {CONTENT_SETTINGS_TYPE_HID_GUARD, 52},
+    {CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA, 53},
 };
 
 }  // namespace
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
index a6a663f..3aa7f2a 100644
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -146,6 +146,13 @@
   // to do Bluetooth scanning.
   CONTENT_SETTINGS_TYPE_BLUETOOTH_SCANNING,
 
+  // Content settings for access to HID devices. The "guard" content setting
+  // stores whether to allow sites to ask for permission to access a device. The
+  // permissions granted to access particular devices are stored in the "chooser
+  // data" website setting.
+  CONTENT_SETTINGS_TYPE_HID_GUARD,
+  CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA,
+
   CONTENT_SETTINGS_NUM_TYPES,
 };
 
diff --git a/components/download/BUILD.gn b/components/download/BUILD.gn
index 5e81255a..a9b5439e 100644
--- a/components/download/BUILD.gn
+++ b/components/download/BUILD.gn
@@ -14,7 +14,6 @@
       "//components/download/internal/common:unit_tests",
       "//components/download/public/common:unit_tests",
       "//components/download/public/task:unit_tests",
-      "//components/download/quarantine:unit_tests",
     ]
   }
 
diff --git a/components/download/quarantine/BUILD.gn b/components/download/quarantine/BUILD.gn
index 4ce7b5b..395de65 100644
--- a/components/download/quarantine/BUILD.gn
+++ b/components/download/quarantine/BUILD.gn
@@ -2,113 +2,13 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromecast_build.gni")
-
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-
 static_library("quarantine") {
   sources = [
     "quarantine.cc",
     "quarantine.h",
-    "quarantine_features_win.cc",
-    "quarantine_features_win.h",
-    "quarantine_mac.mm",
-    "quarantine_win.cc",
   ]
 
   deps = [
-    ":common",
-    "//base",
-    "//net",
-    "//url",
+    "//components/services/quarantine",
   ]
-
-  if (is_mac) {
-    libs = [
-      "Carbon.framework",
-      "Foundation.framework",
-    ]
-  }
-}
-
-source_set("common") {
-  sources = [
-    "common_mac.h",
-    "common_mac.mm",
-    "common_win.cc",
-    "common_win.h",
-  ]
-
-  deps = [
-    "//base",
-  ]
-
-  if (is_mac) {
-    libs = [
-      "Carbon.framework",
-      "Foundation.framework",
-    ]
-  }
-}
-
-source_set("test_support") {
-  testonly = true
-
-  sources = [
-    "test_support.cc",
-    "test_support.h",
-    "test_support_mac.mm",
-    "test_support_win.cc",
-  ]
-
-  deps = [
-    ":common",
-    ":quarantine",
-    "//base",
-    "//url",
-  ]
-
-  if (is_mac) {
-    libs = [
-      "Carbon.framework",
-      "Foundation.framework",
-    ]
-  }
-}
-
-source_set("unit_tests") {
-  testonly = true
-
-  sources = [
-    "quarantine_mac_unittest.mm",
-    "quarantine_win_unittest.cc",
-  ]
-
-  # Chromecasts do not have extended attributes enabled; even if it were
-  # enabled, the devices use tmpfs which restricts the extended attributes that
-  # can be set such that quarantining still would not work. (The platform
-  # specific tests include a runtime guard to skip tests that need xattr.)
-  if (!is_chromecast) {
-    sources += [ "quarantine_unittest.cc" ]
-  }
-
-  deps = [
-    ":common",
-    ":quarantine",
-    ":test_support",
-    "//base",
-    "//base/test:test_support",
-    "//net",
-    "//testing/gtest",
-    "//url",
-  ]
-
-  if (is_mac) {
-    libs = [
-      "Carbon.framework",
-      "Foundation.framework",
-    ]
-  }
 }
diff --git a/components/download/quarantine/DEPS b/components/download/quarantine/DEPS
index 9d3031f..ad6fcad 100644
--- a/components/download/quarantine/DEPS
+++ b/components/download/quarantine/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+net/base/filename_util.h",
+  "+components/services/quarantine/quarantine.h",
 ]
diff --git a/components/download/quarantine/common_win.h b/components/download/quarantine/common_win.h
deleted file mode 100644
index b75de7b..0000000
--- a/components/download/quarantine/common_win.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 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_DOWNLOAD_QUARANTINE_COMMON_WIN_H_
-#define COMPONENTS_DOWNLOAD_QUARANTINE_COMMON_WIN_H_
-
-#include "base/files/file_path.h"
-
-namespace download {
-
-extern const base::FilePath::CharType kZoneIdentifierStreamSuffix[];
-
-}  // namespace download
-
-#endif  // COMPONENTS_DOWNLOAD_QUARANTINE_COMMON_WIN_H_
diff --git a/components/download/quarantine/quarantine.cc b/components/download/quarantine/quarantine.cc
index ac5b109..b576c4d 100644
--- a/components/download/quarantine/quarantine.cc
+++ b/components/download/quarantine/quarantine.cc
@@ -4,19 +4,14 @@
 
 #include "components/download/quarantine/quarantine.h"
 
-#include "build/build_config.h"
-
-#if !defined(OS_WIN) && !defined(OS_MACOSX)
-
 namespace download {
 
 QuarantineFileResult QuarantineFile(const base::FilePath& file,
                                     const GURL& source_url,
                                     const GURL& referrer_url,
                                     const std::string& client_guid) {
-  return QuarantineFileResult::OK;
+  return quarantine::QuarantineFile(file, source_url, referrer_url,
+                                    client_guid);
 }
 
 }  // namespace download
-
-#endif  // !WIN && !MAC
diff --git a/components/download/quarantine/quarantine.h b/components/download/quarantine/quarantine.h
index 8393e4a7..eb6e9469 100644
--- a/components/download/quarantine/quarantine.h
+++ b/components/download/quarantine/quarantine.h
@@ -7,6 +7,8 @@
 
 #include <string>
 
+#include "components/services/quarantine/quarantine.h"
+
 class GURL;
 
 namespace base {
@@ -15,62 +17,17 @@
 
 namespace download {
 
-// Return value for QuarantineFile.
-enum class QuarantineFileResult {
-  OK,             // Success.
-  ACCESS_DENIED,  // Access to the file was denied. The safety of the file could
-                  // not be determined.
-  BLOCKED_BY_POLICY,  // Downloads from |source_url| are not allowed by policy.
-                      // The file has been deleted.
-  ANNOTATION_FAILED,  // Unable to write the mark-of-the-web or otherwise
-                      // annotate the file as being downloaded from
-                      // |source_url|.
-  FILE_MISSING,       // |file| does not name a valid file.
-  SECURITY_CHECK_FAILED,  // An unknown error occurred while checking |file|.
-                          // The file may have been deleted.
-  VIRUS_INFECTED  // |file| was found to be infected by a virus and was deleted.
-};
+using quarantine::QuarantineFileResult;
 
 // Quarantine a file that was downloaded from the internet.
+// See components/services/quarantine/quarantine.h for a full explanation.
 //
-// Ensures that |file| is handled as safely as possible given that it was
-// downloaded from |source_url|. The details of how a downloaded file is handled
-// are platform dependent. Please refer to the individual quarantine_<os>
-// implementation.
+// Forwards to the definition in components/services/quarantine.
+// This is a temporary state before the quarantine service is fully implemented,
+// when the call sites will be updated to use the service directly.
 //
-// This function should be called for all files downloaded from the internet and
-// placed in a manner discoverable by the user, or exposed to an external
-// application. Furthermore, it should be called:
-//
-// * **AFTER** all the data has been written to the file. On Windows, registered
-//   anti-virus products will be invoked for scanning the contents of the file.
-//   Hence it's important to have the final contents of the file be available at
-//   the point at which this function is called.
-//
-//   Exception: Zero-length files will be handled solely on the basis of the
-//   |source_url| and the file type. This exception accommodates situations
-//   where the file contents cannot be determined before it is made visible to
-//   an external application.
-//
-// * **AFTER** the file has been renamed to its final name. The file type is
-//   significant and is derived from the filename.
-//
-// * **BEFORE** the file is made visible to an external application or the user.
-//   Security checks and mark-of-the-web annotations must be made prior to
-//   exposing the file externally.
-//
-// Note that it is possible for this method to take a long time to complete
-// (several seconds or more). In addition to blocking during this time, this
-// delay also introduces a window during which a browser shutdown may leave the
-// downloaded file unannotated.
-//
-// Parameters:
-//   |file| : Final name of the file.
-//   |source_url|: URL from which the file content was downloaded. This is empty
-//     for off-the-record download.
-//   |referrer_url|: Referring URL. This is empty for off-the-record download.
-//   |client_guid|: Only used on Windows. Identifies the client application
-//     that downloaded the file.
+// TODO: Delete this file (and all of components/download/quarantine)
+// when the quarantine service is implemented.
 QuarantineFileResult QuarantineFile(const base::FilePath& file,
                                     const GURL& source_url,
                                     const GURL& referrer_url,
diff --git a/components/download/quarantine/quarantine_features_win.cc b/components/download/quarantine/quarantine_features_win.cc
deleted file mode 100644
index 6c67f2e1..0000000
--- a/components/download/quarantine/quarantine_features_win.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/download/quarantine/quarantine_features_win.h"
-
-namespace download {
-
-// This feature controls whether the InvokeAttachmentServices function will be
-// called. Has no effect on machines that are domain-joined, where the function
-// is always called.
-const base::Feature kInvokeAttachmentServices{"InvokeAttachmentServices",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
-
-}  // namespace download
diff --git a/components/download/quarantine/quarantine_features_win.h b/components/download/quarantine/quarantine_features_win.h
deleted file mode 100644
index 7363a0f4..0000000
--- a/components/download/quarantine/quarantine_features_win.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 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_DOWNLOAD_QUARANTINE_QUARANTINE_FEATURES_WIN_H_
-#define COMPONENTS_DOWNLOAD_QUARANTINE_QUARANTINE_FEATURES_WIN_H_
-
-#include "base/feature_list.h"
-
-namespace download {
-
-extern const base::Feature kInvokeAttachmentServices;
-
-}  // namespace download
-
-#endif  // COMPONENTS_DOWNLOAD_QUARANTINE_QUARANTINE_FEATURES_WIN_H_
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index 0e1828a..5e3168d 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -101,13 +101,14 @@
     shell_surface_->OnBoundsChangeEvent(
         window_state->GetStateType(), requested_state, display_id,
         bounds_in_screen,
-        window_state->drag_details()
+        window_state->drag_details() && shell_surface_->IsDragging()
             ? window_state->drag_details()->bounds_change
             : 0);
   }
 
  private:
   ClientControlledShellSurface* shell_surface_;
+
   DISALLOW_COPY_AND_ASSIGN(ClientControlledStateDelegate);
 };
 
@@ -493,6 +494,10 @@
   }
 }
 
+bool ClientControlledShellSurface::IsDragging() {
+  return in_drag_;
+}
+
 void ClientControlledShellSurface::SetCanMaximize(bool can_maximize) {
   TRACE_EVENT1("exo", "ClientControlledShellSurface::SetCanMaximize",
                "can_maximzie", can_maximize);
@@ -595,12 +600,14 @@
 }
 
 void ClientControlledShellSurface::OnDragStarted(int component) {
+  in_drag_ = true;
   if (drag_started_callback_)
     drag_started_callback_.Run(component);
 }
 
 void ClientControlledShellSurface::OnDragFinished(bool canceled,
                                                   const gfx::Point& location) {
+  in_drag_ = false;
   if (drag_finished_callback_)
     drag_finished_callback_.Run(location.x(), location.y(), canceled);
 }
diff --git a/components/exo/client_controlled_shell_surface.h b/components/exo/client_controlled_shell_surface.h
index 4247160..3545ead 100644
--- a/components/exo/client_controlled_shell_surface.h
+++ b/components/exo/client_controlled_shell_surface.h
@@ -119,6 +119,9 @@
     drag_finished_callback_ = callback;
   }
 
+  // Returns true if this shell surface is currently being dragged.
+  bool IsDragging();
+
   // Pin/unpin the surface. Pinned surface cannot be switched to
   // other windows unless its explicitly unpinned.
   void SetPinned(ash::mojom::WindowPinType type);
@@ -314,6 +317,13 @@
 
   bool preserve_widget_bounds_ = false;
 
+  // Checking DragDetails is not sufficient to determine if a bounds
+  // request happened during a drag move or resize. If the window resizer
+  // requests a bounds update after completing the drag but before the
+  // drag details are cleaned up, we want to consider that as a regular
+  // bounds update, not a drag move/resize update.
+  bool in_drag_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(ClientControlledShellSurface);
 };
 
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn
index d501af23..86abffd 100644
--- a/components/exo/wayland/BUILD.gn
+++ b/components/exo/wayland/BUILD.gn
@@ -438,6 +438,34 @@
   ]
 }
 
+source_set("wayland_client_test_helper") {
+  testonly = true
+
+  sources = [
+    "clients/test/wayland_client_test_helper.cc",
+    "clients/test/wayland_client_test_helper.h",
+  ]
+
+  deps = [
+    ":wayland",
+    "//base",
+    "//components/exo",
+    "//ui/aura",
+    "//ui/events:gesture_detection",
+    "//ui/wm",
+  ]
+
+  data_deps = []
+
+  if (is_chromeos) {
+    deps += [
+      "//ash",
+      "//ash:test_support",
+      "//ash/public/cpp",
+    ]
+  }
+}
+
 test("wayland_client_perftests") {
   sources = [
     "clients/perftests.cc",
@@ -450,22 +478,17 @@
     ":blur",
     ":client_support",
     ":simple",
-    ":wayland",
-    "//base",
+    ":wayland_client_test_helper",
     "//base/test:test_support",
     "//cc:test_support",
-    "//components/exo",
     "//components/viz/test:test_support",
     "//mojo/core/embedder",
     "//testing/gtest",
     "//testing/perf",
-    "//ui/aura",
     "//ui/aura:test_support",
     "//ui/base",
     "//ui/compositor:test_support",
-    "//ui/events:gesture_detection",
     "//ui/gl:test_support",
-    "//ui/wm",
   ]
 
   data_deps = []
@@ -482,11 +505,7 @@
       "//ash/resources:ash_test_resources_200_percent",
     ]
 
-    deps += [
-      "//ash",
-      "//ash:test_support",
-      "//ash/public/cpp",
-    ]
+    deps += [ "//ash:test_support" ]
   }
 }
 
diff --git a/components/exo/wayland/clients/test/wayland_client_test.cc b/components/exo/wayland/clients/test/wayland_client_test.cc
index f6d33a3..1879e4c 100644
--- a/components/exo/wayland/clients/test/wayland_client_test.cc
+++ b/components/exo/wayland/clients/test/wayland_client_test.cc
@@ -4,150 +4,24 @@
 
 #include "components/exo/wayland/clients/test/wayland_client_test.h"
 
-#include <stdlib.h>
-
-#include <memory>
-
-#include "ash/session/session_controller_impl.h"
-#include "ash/shell.h"
-#include "ash/test/ash_test_helper.h"
-#include "ash/test/ash_test_views_delegate.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/synchronization/waitable_event.h"
-#include "components/exo/display.h"
-#include "components/exo/file_helper.h"
-#include "components/exo/wayland/server.h"
-#include "components/exo/wm_helper.h"
-#include "components/exo/wm_helper_chromeos.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/gesture_detection/gesture_configuration.h"
-#include "ui/wm/core/cursor_manager.h"
-#include "ui/wm/core/wm_core_switches.h"
-
 namespace exo {
 
-// The ui message loop for running the wayland server. If it is not provided, we
-// will use external wayland server.
-scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner_ = nullptr;
-
-class WaylandClientTest::WaylandWatcher
-    : public base::MessagePumpLibevent::FdWatcher {
- public:
-  explicit WaylandWatcher(exo::wayland::Server* server)
-      : controller_(FROM_HERE), server_(server) {
-    base::MessageLoopCurrentForUI::Get()->WatchFileDescriptor(
-        server_->GetFileDescriptor(),
-        true,  // persistent
-        base::MessagePumpLibevent::WATCH_READ, &controller_, this);
-  }
-
-  // base::MessagePumpLibevent::FdWatcher:
-  void OnFileCanReadWithoutBlocking(int fd) override {
-    server_->Dispatch(base::TimeDelta());
-    server_->Flush();
-  }
-  void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); }
-
- private:
-  base::MessagePumpLibevent::FdWatchController controller_;
-  exo::wayland::Server* const server_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaylandWatcher);
-};
-
 WaylandClientTest::WaylandClientTest() = default;
-
 WaylandClientTest::~WaylandClientTest() = default;
 
-// static
+// Static
 void WaylandClientTest::SetUIThreadTaskRunner(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  DCHECK_NE(!!task_runner, !!ui_thread_task_runner_);
-  ui_thread_task_runner_ = std::move(task_runner);
+    scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner) {
+  WaylandClientTestHelper::SetUIThreadTaskRunner(
+      std::move(ui_thread_task_runner));
 }
 
 void WaylandClientTest::SetUp() {
-  if (!ui_thread_task_runner_)
-    return;
-
-  DCHECK(!ui_thread_task_runner_->BelongsToCurrentThread());
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  ui_thread_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&WaylandClientTest::SetUpOnUIThread,
-                                base::Unretained(this), &event));
-  event.Wait();
+  test_helper_.SetUp();
 }
 
 void WaylandClientTest::TearDown() {
-  if (!ui_thread_task_runner_)
-    return;
-
-  DCHECK(ui_thread_task_runner_);
-  DCHECK(!ui_thread_task_runner_->BelongsToCurrentThread());
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  ui_thread_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&WaylandClientTest::TearDownOnUIThread,
-                                base::Unretained(this), &event));
-  event.Wait();
-}
-
-void WaylandClientTest::SetUpOnUIThread(base::WaitableEvent* event) {
-  xdg_temp_dir_ = std::make_unique<base::ScopedTempDir>();
-  ASSERT_TRUE(xdg_temp_dir_->CreateUniqueTempDir());
-  setenv("XDG_RUNTIME_DIR", xdg_temp_dir_->GetPath().MaybeAsASCII().c_str(),
-         1 /* overwrite */);
-
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  // Disable window animation when running tests.
-  command_line->AppendSwitch(wm::switches::kWindowAnimationsDisabled);
-
-  ash_test_helper_ = std::make_unique<ash::AshTestHelper>();
-
-  ash_test_helper_->SetUp(false /* start_session */,
-                          true /* provide_local_state */);
-  ash::Shell::GetPrimaryRootWindow()->Show();
-  ash::Shell::GetPrimaryRootWindow()->GetHost()->Show();
-  ash::Shell::GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(-1000, -1000));
-  ash::Shell::Get()->cursor_manager()->EnableMouseEvents();
-
-  // Changing GestureConfiguration shouldn't make tests fail. These values
-  // prevent unexpected events from being generated during tests. Such as
-  // delayed events which create race conditions on slower tests.
-  ui::GestureConfiguration* gesture_config =
-      ui::GestureConfiguration::GetInstance();
-  gesture_config->set_max_touch_down_duration_for_click_in_ms(800);
-  gesture_config->set_long_press_time_in_ms(1000);
-  gesture_config->set_max_touch_move_in_pixels_for_click(5);
-
-  wm_helper_ = std::make_unique<WMHelperChromeOS>();
-  WMHelper::SetInstance(wm_helper_.get());
-  display_ = std::make_unique<Display>(nullptr, nullptr, nullptr);
-  wayland_server_ = exo::wayland::Server::Create(display_.get());
-  DCHECK(wayland_server_);
-  wayland_watcher_ = std::make_unique<WaylandWatcher>(wayland_server_.get());
-  event->Signal();
-}
-
-void WaylandClientTest::TearDownOnUIThread(base::WaitableEvent* event) {
-  wayland_watcher_.reset();
-  wayland_server_.reset();
-  display_.reset();
-  WMHelper::SetInstance(nullptr);
-  wm_helper_.reset();
-
-  ash::Shell::Get()->session_controller()->NotifyChromeTerminating();
-  ash_test_helper_->TearDown();
-  ash_test_helper_ = nullptr;
-  xdg_temp_dir_ = nullptr;
-  event->Signal();
+  test_helper_.TearDown();
 }
 
 }  // namespace exo
diff --git a/components/exo/wayland/clients/test/wayland_client_test.h b/components/exo/wayland/clients/test/wayland_client_test.h
index 76436dc8..5014531 100644
--- a/components/exo/wayland/clients/test/wayland_client_test.h
+++ b/components/exo/wayland/clients/test/wayland_client_test.h
@@ -7,27 +7,10 @@
 
 #include <memory>
 
-#include "base/macros.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/single_thread_task_runner.h"
+#include "components/exo/wayland/clients/test/wayland_client_test_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace ash {
-class AshTestHelper;
-}  // namespace ash
-
-namespace base {
-class ScopedTempDir;
-class WaitableEvent;
-}  // namespace base
-
 namespace exo {
-namespace wayland {
-class Server;
-}
-
-class Display;
-class WMHelper;
 
 class WaylandClientTest : public testing::Test {
  public:
@@ -43,18 +26,7 @@
   void TearDown() override;
 
  private:
-  class WaylandWatcher;
-
-  void SetUpOnUIThread(base::WaitableEvent* event);
-  void TearDownOnUIThread(base::WaitableEvent* event);
-
-  // Below objects can only be accessed from UI thread.
-  std::unique_ptr<base::ScopedTempDir> xdg_temp_dir_;
-  std::unique_ptr<ash::AshTestHelper> ash_test_helper_;
-  std::unique_ptr<WMHelper> wm_helper_;
-  std::unique_ptr<Display> display_;
-  std::unique_ptr<wayland::Server> wayland_server_;
-  std::unique_ptr<WaylandWatcher> wayland_watcher_;
+  WaylandClientTestHelper test_helper_;
 
   DISALLOW_COPY_AND_ASSIGN(WaylandClientTest);
 };
diff --git a/components/exo/wayland/clients/test/wayland_client_test_helper.cc b/components/exo/wayland/clients/test/wayland_client_test_helper.cc
new file mode 100644
index 0000000..d702da9
--- /dev/null
+++ b/components/exo/wayland/clients/test/wayland_client_test_helper.cc
@@ -0,0 +1,150 @@
+// 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 "components/exo/wayland/clients/test/wayland_client_test_helper.h"
+
+#include <stdlib.h>
+
+#include <memory>
+
+#include "ash/session/session_controller_impl.h"
+#include "ash/shell.h"
+#include "ash/test/ash_test_helper.h"
+#include "ash/test/ash_test_views_delegate.h"
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/message_loop/message_loop_current.h"
+#include "base/synchronization/waitable_event.h"
+#include "components/exo/display.h"
+#include "components/exo/file_helper.h"
+#include "components/exo/wayland/server.h"
+#include "components/exo/wm_helper_chromeos.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/events/gesture_detection/gesture_configuration.h"
+#include "ui/wm/core/cursor_manager.h"
+#include "ui/wm/core/wm_core_switches.h"
+
+namespace exo {
+
+// The ui message loop for running the wayland server. If it is not provided, we
+// will use external wayland server.
+scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner_ = nullptr;
+
+class WaylandClientTestHelper::WaylandWatcher
+    : public base::MessagePumpLibevent::FdWatcher {
+ public:
+  explicit WaylandWatcher(exo::wayland::Server* server)
+      : controller_(FROM_HERE), server_(server) {
+    base::MessageLoopCurrentForUI::Get()->WatchFileDescriptor(
+        server_->GetFileDescriptor(),
+        true,  // persistent
+        base::MessagePumpLibevent::WATCH_READ, &controller_, this);
+  }
+
+  // base::MessagePumpLibevent::FdWatcher:
+  void OnFileCanReadWithoutBlocking(int fd) override {
+    server_->Dispatch(base::TimeDelta());
+    server_->Flush();
+  }
+  void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); }
+
+ private:
+  base::MessagePumpLibevent::FdWatchController controller_;
+  exo::wayland::Server* const server_;
+
+  DISALLOW_COPY_AND_ASSIGN(WaylandWatcher);
+};
+
+// static
+void WaylandClientTestHelper::SetUIThreadTaskRunner(
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+  DCHECK_NE(!!task_runner, !!ui_thread_task_runner_);
+  ui_thread_task_runner_ = std::move(task_runner);
+}
+
+WaylandClientTestHelper::WaylandClientTestHelper() = default;
+WaylandClientTestHelper::~WaylandClientTestHelper() = default;
+
+void WaylandClientTestHelper::SetUp() {
+  if (!ui_thread_task_runner_)
+    return;
+
+  DCHECK(!ui_thread_task_runner_->BelongsToCurrentThread());
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  ui_thread_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&WaylandClientTestHelper::SetUpOnUIThread,
+                                base::Unretained(this), &event));
+  event.Wait();
+}
+
+void WaylandClientTestHelper::TearDown() {
+  if (!ui_thread_task_runner_)
+    return;
+
+  DCHECK(ui_thread_task_runner_);
+  DCHECK(!ui_thread_task_runner_->BelongsToCurrentThread());
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  ui_thread_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&WaylandClientTestHelper::TearDownOnUIThread,
+                                base::Unretained(this), &event));
+  event.Wait();
+}
+
+void WaylandClientTestHelper::SetUpOnUIThread(base::WaitableEvent* event) {
+  xdg_temp_dir_ = std::make_unique<base::ScopedTempDir>();
+  CHECK(xdg_temp_dir_->CreateUniqueTempDir());
+  setenv("XDG_RUNTIME_DIR", xdg_temp_dir_->GetPath().MaybeAsASCII().c_str(),
+         1 /* overwrite */);
+
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  // Disable window animation when running tests.
+  command_line->AppendSwitch(wm::switches::kWindowAnimationsDisabled);
+
+  ash_test_helper_ = std::make_unique<ash::AshTestHelper>();
+
+  ash_test_helper_->SetUp(false /* start_session */,
+                          true /* provide_local_state */);
+  ash::Shell::GetPrimaryRootWindow()->Show();
+  ash::Shell::GetPrimaryRootWindow()->GetHost()->Show();
+  ash::Shell::GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(-1000, -1000));
+  ash::Shell::Get()->cursor_manager()->EnableMouseEvents();
+
+  // Changing GestureConfiguration shouldn't make tests fail. These values
+  // prevent unexpected events from being generated during tests. Such as
+  // delayed events which create race conditions on slower tests.
+  ui::GestureConfiguration* gesture_config =
+      ui::GestureConfiguration::GetInstance();
+  gesture_config->set_max_touch_down_duration_for_click_in_ms(800);
+  gesture_config->set_long_press_time_in_ms(1000);
+  gesture_config->set_max_touch_move_in_pixels_for_click(5);
+
+  wm_helper_ = std::make_unique<WMHelperChromeOS>();
+  WMHelper::SetInstance(wm_helper_.get());
+  display_ = std::make_unique<Display>(nullptr, nullptr, nullptr);
+  wayland_server_ = exo::wayland::Server::Create(display_.get());
+  DCHECK(wayland_server_);
+  wayland_watcher_ = std::make_unique<WaylandWatcher>(wayland_server_.get());
+  event->Signal();
+}
+
+void WaylandClientTestHelper::TearDownOnUIThread(base::WaitableEvent* event) {
+  wayland_watcher_.reset();
+  wayland_server_.reset();
+  display_.reset();
+  WMHelper::SetInstance(nullptr);
+  wm_helper_.reset();
+
+  ash::Shell::Get()->session_controller()->NotifyChromeTerminating();
+  ash_test_helper_->TearDown();
+  ash_test_helper_ = nullptr;
+  xdg_temp_dir_ = nullptr;
+  event->Signal();
+}
+
+}  // namespace exo
diff --git a/components/exo/wayland/clients/test/wayland_client_test_helper.h b/components/exo/wayland/clients/test/wayland_client_test_helper.h
new file mode 100644
index 0000000..7d0bedb
--- /dev/null
+++ b/components/exo/wayland/clients/test/wayland_client_test_helper.h
@@ -0,0 +1,58 @@
+// 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 COMPONENTS_EXO_WAYLAND_CLIENTS_TEST_WAYLAND_CLIENT_TEST_HELPER_H_
+#define COMPONENTS_EXO_WAYLAND_CLIENTS_TEST_WAYLAND_CLIENT_TEST_HELPER_H_
+
+#include "base/memory/scoped_refptr.h"
+#include "base/single_thread_task_runner.h"
+
+namespace ash {
+class AshTestHelper;
+}
+
+namespace base {
+class ScopedTempDir;
+class WaitableEvent;
+}  // namespace base
+
+namespace exo {
+namespace wayland {
+class Server;
+}
+
+class Display;
+class WMHelper;
+
+class WaylandClientTestHelper {
+ public:
+  WaylandClientTestHelper();
+  ~WaylandClientTestHelper();
+
+  static void SetUIThreadTaskRunner(
+      scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner);
+
+  void SetUp();
+  void TearDown();
+
+ private:
+  class WaylandWatcher;
+
+  void SetUpOnUIThread(base::WaitableEvent* event);
+  void TearDownOnUIThread(base::WaitableEvent* event);
+
+  // Below objects can only be accessed from UI thread.
+  std::unique_ptr<base::ScopedTempDir> xdg_temp_dir_;
+  std::unique_ptr<ash::AshTestHelper> ash_test_helper_;
+  std::unique_ptr<WMHelper> wm_helper_;
+  std::unique_ptr<Display> display_;
+  std::unique_ptr<wayland::Server> wayland_server_;
+  std::unique_ptr<WaylandWatcher> wayland_watcher_;
+
+  DISALLOW_COPY_AND_ASSIGN(WaylandClientTestHelper);
+};
+
+}  // namespace exo
+
+#endif  // COMPONENTS_EXO_WAYLAND_CLIENTS_TEST_WAYLAND_CLIENT_TEST_HELPER_H_
diff --git a/components/gwp_asan/client/guarded_page_allocator.cc b/components/gwp_asan/client/guarded_page_allocator.cc
index 9e7ae79..0076961 100644
--- a/components/gwp_asan/client/guarded_page_allocator.cc
+++ b/components/gwp_asan/client/guarded_page_allocator.cc
@@ -65,12 +65,16 @@
 }
 
 template <typename T>
-T GuardedPageAllocator::SimpleFreeList<T>::Allocate() {
-  if (num_used_entries_ < max_entries_)
-    return num_used_entries_++;
+bool GuardedPageAllocator::SimpleFreeList<T>::Allocate(T* out,
+                                                       const char* type) {
+  if (num_used_entries_ < max_entries_) {
+    *out = num_used_entries_++;
+    return true;
+  }
 
   DCHECK_LE(free_list_.size(), max_entries_);
-  return RandomEviction(&free_list_);
+  *out = RandomEviction(&free_list_);
+  return true;
 }
 
 template <typename T>
@@ -79,12 +83,47 @@
   free_list_.push_back(entry);
 }
 
+GuardedPageAllocator::PartitionAllocSlotFreeList::PartitionAllocSlotFreeList() =
+    default;
+GuardedPageAllocator::PartitionAllocSlotFreeList::
+    ~PartitionAllocSlotFreeList() = default;
+
+void GuardedPageAllocator::PartitionAllocSlotFreeList::Initialize(
+    AllocatorState::SlotIdx max_entries) {
+  max_entries_ = max_entries;
+  type_mapping_.reserve(max_entries);
+}
+
+bool GuardedPageAllocator::PartitionAllocSlotFreeList::Allocate(
+    AllocatorState::SlotIdx* out,
+    const char* type) {
+  if (num_used_entries_ < max_entries_) {
+    type_mapping_[num_used_entries_] = type;
+    *out = num_used_entries_++;
+    return true;
+  }
+
+  if (!free_list_.count(type) || free_list_[type].empty())
+    return false;
+
+  DCHECK_LE(free_list_[type].size(), max_entries_);
+  *out = RandomEviction(&free_list_[type]);
+  return true;
+}
+
+void GuardedPageAllocator::PartitionAllocSlotFreeList::Free(
+    AllocatorState::SlotIdx entry) {
+  DCHECK_LT(entry, num_used_entries_);
+  free_list_[type_mapping_[entry]].push_back(entry);
+}
+
 GuardedPageAllocator::GuardedPageAllocator() {}
 
 void GuardedPageAllocator::Init(size_t max_alloced_pages,
                                 size_t num_metadata,
                                 size_t total_pages,
-                                OutOfMemoryCallback oom_callback) {
+                                OutOfMemoryCallback oom_callback,
+                                bool is_partition_alloc) {
   CHECK_GT(max_alloced_pages, 0U);
   CHECK_LE(max_alloced_pages, num_metadata);
   CHECK_LE(num_metadata, AllocatorState::kMaxMetadata);
@@ -94,6 +133,7 @@
   state_.num_metadata = num_metadata;
   state_.total_pages = total_pages;
   oom_callback_ = std::move(oom_callback);
+  is_partition_alloc_ = is_partition_alloc;
 
   state_.page_size = base::GetPageSize();
 
@@ -110,7 +150,11 @@
     // there should be no risk of a race here.
     base::AutoLock lock(lock_);
     free_metadata_.Initialize(num_metadata);
-    free_slots_.Initialize(total_pages);
+    if (is_partition_alloc_)
+      free_slots_ = std::make_unique<PartitionAllocSlotFreeList>();
+    else
+      free_slots_ = std::make_unique<SimpleFreeList<AllocatorState::SlotIdx>>();
+    free_slots_->Initialize(total_pages);
   }
 
   slot_to_metadata_idx_.resize(total_pages);
@@ -129,7 +173,12 @@
     UnmapRegion();
 }
 
-void* GuardedPageAllocator::Allocate(size_t size, size_t align) {
+void* GuardedPageAllocator::Allocate(size_t size,
+                                     size_t align,
+                                     const char* type) {
+  if (!is_partition_alloc_)
+    DCHECK_EQ(type, nullptr);
+
   if (!size || size > state_.page_size || align > state_.page_size)
     return nullptr;
 
@@ -143,7 +192,7 @@
 
   AllocatorState::SlotIdx free_slot;
   AllocatorState::MetadataIdx free_metadata;
-  if (!ReserveSlotAndMetadata(&free_slot, &free_metadata))
+  if (!ReserveSlotAndMetadata(&free_slot, &free_metadata, type))
     return nullptr;
 
   uintptr_t free_page = state_.SlotToAddr(free_slot);
@@ -232,11 +281,13 @@
 
 bool GuardedPageAllocator::ReserveSlotAndMetadata(
     AllocatorState::SlotIdx* slot,
-    AllocatorState::MetadataIdx* metadata_idx) {
+    AllocatorState::MetadataIdx* metadata_idx,
+    const char* type) {
   base::AutoLock lock(lock_);
-  if (num_alloced_pages_ == max_alloced_pages_) {
-    if (++consecutive_failed_allocations_ == kOutOfMemoryCount) {
-      if (!oom_hit_) {
+  if (num_alloced_pages_ == max_alloced_pages_ ||
+      !free_slots_->Allocate(slot, type)) {
+    if (!oom_hit_) {
+      if (++consecutive_failed_allocations_ == kOutOfMemoryCount) {
         oom_hit_ = true;
         base::AutoUnlock unlock(lock_);
         std::move(oom_callback_).Run(total_allocations_ - kOutOfMemoryCount);
@@ -245,8 +296,7 @@
     return false;
   }
 
-  *slot = free_slots_.Allocate();
-  *metadata_idx = free_metadata_.Allocate();
+  CHECK(free_metadata_.Allocate(metadata_idx, nullptr));
   if (metadata_[*metadata_idx].alloc_ptr) {
     // Overwrite the outdated slot_to_metadata_idx mapping from the previous use
     // of this metadata if it's still valid.
@@ -269,7 +319,7 @@
   DCHECK_LT(metadata_idx, state_.num_metadata);
 
   base::AutoLock lock(lock_);
-  free_slots_.Free(slot);
+  free_slots_->Free(slot);
   free_metadata_.Free(metadata_idx);
 
   DCHECK_GT(num_alloced_pages_, 0U);
diff --git a/components/gwp_asan/client/guarded_page_allocator.h b/components/gwp_asan/client/guarded_page_allocator.h
index 502b1b7..4c0b7d0 100644
--- a/components/gwp_asan/client/guarded_page_allocator.h
+++ b/components/gwp_asan/client/guarded_page_allocator.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_GWP_ASAN_CLIENT_GUARDED_PAGE_ALLOCATOR_H_
 
 #include <atomic>
+#include <map>
 #include <memory>
 #include <string>
 #include <vector>
@@ -13,7 +14,6 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
-#include "base/no_destructor.h"
 #include "base/synchronization/lock.h"
 #include "base/thread_annotations.h"
 #include "components/gwp_asan/client/export.h"
@@ -55,7 +55,8 @@
   void Init(size_t max_alloced_pages,
             size_t num_metadata,
             size_t total_pages,
-            OutOfMemoryCallback oom_callback);
+            OutOfMemoryCallback oom_callback,
+            bool is_partition_alloc);
 
   // On success, returns a pointer to size bytes of page-guarded memory. On
   // failure, returns nullptr. The allocation is not guaranteed to be
@@ -66,8 +67,10 @@
   // It must be less than or equal to the allocation size. If it's left as zero
   // it will default to the default alignment the allocator chooses.
   //
+  // The type parameter should only be set for PartitionAlloc allocations.
+  //
   // Preconditions: Init() must have been called.
-  void* Allocate(size_t size, size_t align = 0);
+  void* Allocate(size_t size, size_t align = 0, const char* type = nullptr);
 
   // Deallocates memory pointed to by ptr. ptr must have been previously
   // returned by a call to Allocate.
@@ -87,17 +90,29 @@
   }
 
  private:
+  // Virtual base class representing a free list of entries T.
+  template <typename T>
+  class FreeList {
+   public:
+    FreeList() = default;
+    virtual ~FreeList() = default;
+    virtual void Initialize(T max_entries) = 0;
+    virtual bool Allocate(T* out, const char* type) = 0;
+    virtual void Free(T entry) = 0;
+  };
+
   // Manages a free list of slot or metadata indices in the range
   // [0, max_entries). Access to SimpleFreeList objects must be synchronized.
   //
   // SimpleFreeList is specifically designed to pre-allocate data in Initialize
   // so that it never recurses into malloc/free during Allocate/Free.
   template <typename T>
-  class SimpleFreeList {
+  class SimpleFreeList : public FreeList<T> {
    public:
-    void Initialize(T max_entries);
-    T Allocate();
-    void Free(T entry);
+    ~SimpleFreeList() final = default;
+    void Initialize(T max_entries) final;
+    bool Allocate(T* out, const char* type) final;
+    void Free(T entry) final;
 
    private:
     std::vector<T> free_list_;
@@ -108,6 +123,36 @@
     T max_entries_ = 0;
   };
 
+  // Manages a free list of slot indices especially for PartitionAlloc.
+  // Allocate() is type-aware so that once a page has been used to allocate
+  // a given partition, it never reallocates an object of a different type on
+  // that page. Access to this object must be synchronized.
+  //
+  // PartitionAllocSlotFreeList can perform malloc/free during Allocate/Free,
+  // so it is not safe to use with malloc hooks!
+  //
+  // TODO(vtsyrklevich): Right now we allocate slots to partitions on a
+  // first-come first-serve basis, this makes it likely that all slots will be
+  // used up by common types first. Set aside a fixed amount of slots (~5%) for
+  // one-off partitions so that we make sure to sample rare types as well.
+  class PartitionAllocSlotFreeList : public FreeList<AllocatorState::SlotIdx> {
+   public:
+    PartitionAllocSlotFreeList();
+    ~PartitionAllocSlotFreeList() final;
+    void Initialize(AllocatorState::SlotIdx max_entries) final;
+    bool Allocate(AllocatorState::SlotIdx* out, const char* type) final;
+    void Free(AllocatorState::SlotIdx entry) final;
+
+   private:
+    std::vector<const char*> type_mapping_;
+    std::map<const char*, std::vector<AllocatorState::SlotIdx>> free_list_;
+
+    // Number of used entries. This counter ensures all free entries are used
+    // before starting to use random eviction.
+    AllocatorState::SlotIdx num_used_entries_ = 0;
+    AllocatorState::SlotIdx max_entries_ = 0;
+  };
+
   // Unmaps memory allocated by this class, if Init was called.
   ~GuardedPageAllocator();
 
@@ -128,8 +173,8 @@
   // On success, returns true and writes the reserved indices to |slot| and
   // |metadata_idx|. Otherwise returns false if no allocations are available.
   bool ReserveSlotAndMetadata(AllocatorState::SlotIdx* slot,
-                              AllocatorState::MetadataIdx* metadata_idx)
-      LOCKS_EXCLUDED(lock_);
+                              AllocatorState::MetadataIdx* metadata_idx,
+                              const char* type) LOCKS_EXCLUDED(lock_);
 
   // Marks the specified slot and metadata as unreserved.
   void FreeSlotAndMetadata(AllocatorState::SlotIdx slot,
@@ -151,7 +196,8 @@
   // Lock that synchronizes allocating/freeing slots between threads.
   base::Lock lock_;
 
-  SimpleFreeList<AllocatorState::SlotIdx> free_slots_ GUARDED_BY(lock_);
+  std::unique_ptr<FreeList<AllocatorState::SlotIdx>> free_slots_
+      GUARDED_BY(lock_);
   SimpleFreeList<AllocatorState::MetadataIdx> free_metadata_ GUARDED_BY(lock_);
 
   // Number of currently-allocated pages.
@@ -174,16 +220,12 @@
   bool oom_hit_ GUARDED_BY(lock_) = false;
   OutOfMemoryCallback oom_callback_;
 
-  // Required for a singleton to access the constructor.
-  friend base::NoDestructor<GuardedPageAllocator>;
+  bool is_partition_alloc_ = false;
 
+  friend class BaseGpaTest;
   friend class CrashAnalyzerTest;
-  friend class GuardedPageAllocatorTest;
   FRIEND_TEST_ALL_PREFIXES(CrashAnalyzerTest, InternalError);
   FRIEND_TEST_ALL_PREFIXES(CrashAnalyzerTest, StackTraceCollection);
-  FRIEND_TEST_ALL_PREFIXES(GuardedPageAllocatorTest,
-                           GetNearestValidPageEdgeCases);
-  FRIEND_TEST_ALL_PREFIXES(GuardedPageAllocatorTest, GetErrorTypeEdgeCases);
 
   DISALLOW_COPY_AND_ASSIGN(GuardedPageAllocator);
 };
diff --git a/components/gwp_asan/client/guarded_page_allocator_unittest.cc b/components/gwp_asan/client/guarded_page_allocator_unittest.cc
index 399b62c..5633ffd 100644
--- a/components/gwp_asan/client/guarded_page_allocator_unittest.cc
+++ b/components/gwp_asan/client/guarded_page_allocator_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/gwp_asan/client/guarded_page_allocator.h"
 
+#include <algorithm>
 #include <array>
 #include <set>
 #include <utility>
@@ -23,14 +24,24 @@
 static constexpr size_t kMaxMetadata = AllocatorState::kMaxMetadata;
 static constexpr size_t kMaxSlots = AllocatorState::kMaxSlots;
 
-class GuardedPageAllocatorTest : public testing::Test {
+class BaseGpaTest : public testing::Test {
  protected:
-  explicit GuardedPageAllocatorTest(size_t max_allocated_pages = kMaxMetadata) {
+  BaseGpaTest(size_t max_allocated_pages, bool is_partition_alloc) {
     gpa_.Init(max_allocated_pages, kMaxMetadata, kMaxSlots,
               base::BindLambdaForTesting(
-                  [&](size_t allocations) { allocator_oom_ = true; }));
+                  [&](size_t allocations) { allocator_oom_ = true; }),
+              is_partition_alloc);
   }
 
+  GuardedPageAllocator gpa_;
+  bool allocator_oom_ = false;
+};
+
+class GuardedPageAllocatorTest : public BaseGpaTest,
+                                 public testing::WithParamInterface<bool> {
+ protected:
+  GuardedPageAllocatorTest() : BaseGpaTest(kMaxMetadata, GetParam()) {}
+
   // Get a left- or right- aligned allocation (or nullptr on error.)
   char* GetAlignedAllocation(bool left_aligned, size_t sz, size_t align = 0) {
     for (size_t i = 0; i < 100; i++) {
@@ -61,12 +72,13 @@
 
     return reinterpret_cast<uintptr_t>(buf) & page_mask;
   }
-
-  GuardedPageAllocator gpa_;
-  bool allocator_oom_ = false;
 };
 
-TEST_F(GuardedPageAllocatorTest, SingleAllocDealloc) {
+INSTANTIATE_TEST_SUITE_P(VaryPartitionAlloc,
+                         GuardedPageAllocatorTest,
+                         testing::Values(false, true));
+
+TEST_P(GuardedPageAllocatorTest, SingleAllocDealloc) {
   char* buf = reinterpret_cast<char*>(gpa_.Allocate(base::GetPageSize()));
   EXPECT_NE(buf, nullptr);
   EXPECT_TRUE(gpa_.PointerIsMine(buf));
@@ -77,14 +89,14 @@
   EXPECT_DEATH(gpa_.Deallocate(buf), "");
 }
 
-TEST_F(GuardedPageAllocatorTest, CrashOnBadDeallocPointer) {
+TEST_P(GuardedPageAllocatorTest, CrashOnBadDeallocPointer) {
   EXPECT_DEATH(gpa_.Deallocate(nullptr), "");
   char* buf = reinterpret_cast<char*>(gpa_.Allocate(8));
   EXPECT_DEATH(gpa_.Deallocate(buf + 1), "");
   gpa_.Deallocate(buf);
 }
 
-TEST_F(GuardedPageAllocatorTest, PointerIsMine) {
+TEST_P(GuardedPageAllocatorTest, PointerIsMine) {
   void* buf = gpa_.Allocate(1);
   auto malloc_ptr = std::make_unique<char>();
   EXPECT_TRUE(gpa_.PointerIsMine(buf));
@@ -95,7 +107,7 @@
   EXPECT_FALSE(gpa_.PointerIsMine(malloc_ptr.get()));
 }
 
-TEST_F(GuardedPageAllocatorTest, GetRequestedSize) {
+TEST_P(GuardedPageAllocatorTest, GetRequestedSize) {
   void* buf = gpa_.Allocate(100);
   EXPECT_EQ(gpa_.GetRequestedSize(buf), 100U);
 #if !defined(OS_MACOSX)
@@ -105,7 +117,7 @@
 #endif
 }
 
-TEST_F(GuardedPageAllocatorTest, LeftAlignedAllocation) {
+TEST_P(GuardedPageAllocatorTest, LeftAlignedAllocation) {
   char* buf = GetAlignedAllocation(true, 16);
   ASSERT_NE(buf, nullptr);
   EXPECT_DEATH(buf[-1] = 'A', "");
@@ -114,7 +126,7 @@
   gpa_.Deallocate(buf);
 }
 
-TEST_F(GuardedPageAllocatorTest, RightAlignedAllocation) {
+TEST_P(GuardedPageAllocatorTest, RightAlignedAllocation) {
   char* buf =
       GetAlignedAllocation(false, GuardedPageAllocator::kGpaAllocAlignment);
   ASSERT_NE(buf, nullptr);
@@ -124,7 +136,7 @@
   gpa_.Deallocate(buf);
 }
 
-TEST_F(GuardedPageAllocatorTest, AllocationAlignment) {
+TEST_P(GuardedPageAllocatorTest, AllocationAlignment) {
   const uintptr_t page_size = base::GetPageSize();
 
   EXPECT_EQ(GetRightAlignedAllocationOffset(9, 1), page_size - 9);
@@ -144,7 +156,7 @@
   EXPECT_EQ(GetAlignedAllocation(false, 5, page_size * 2), nullptr);
 }
 
-TEST_F(GuardedPageAllocatorTest, OutOfMemoryCallback) {
+TEST_P(GuardedPageAllocatorTest, OutOfMemoryCallback) {
   for (size_t i = 0; i < kMaxMetadata; i++)
     EXPECT_NE(gpa_.Allocate(1), nullptr);
 
@@ -156,10 +168,10 @@
 }
 
 class GuardedPageAllocatorParamTest
-    : public GuardedPageAllocatorTest,
+    : public BaseGpaTest,
       public testing::WithParamInterface<size_t> {
  protected:
-  GuardedPageAllocatorParamTest() : GuardedPageAllocatorTest(GetParam()) {}
+  GuardedPageAllocatorParamTest() : BaseGpaTest(GetParam(), false) {}
 };
 
 TEST_P(GuardedPageAllocatorParamTest, AllocDeallocAllPages) {
@@ -196,9 +208,8 @@
 
 class ThreadedAllocCountDelegate : public base::DelegateSimpleThread::Delegate {
  public:
-  explicit ThreadedAllocCountDelegate(
-      GuardedPageAllocator* gpa,
-      std::array<void*, kMaxMetadata>* allocations)
+  ThreadedAllocCountDelegate(GuardedPageAllocator* gpa,
+                             std::array<void*, kMaxMetadata>* allocations)
       : gpa_(gpa), allocations_(allocations) {}
 
   void Run() override {
@@ -216,7 +227,7 @@
 
 // Test that no pages are double-allocated or left unallocated, and that no
 // extra pages are allocated when there's concurrent calls to Allocate().
-TEST_F(GuardedPageAllocatorTest, ThreadedAllocCount) {
+TEST_P(GuardedPageAllocatorTest, ThreadedAllocCount) {
   constexpr size_t num_threads = 2;
   std::array<void*, kMaxMetadata> allocations[num_threads];
   {
@@ -277,7 +288,7 @@
 
 // Test that allocator remains in consistent state under high contention and
 // doesn't double-allocate pages or fail to deallocate pages.
-TEST_F(GuardedPageAllocatorTest, ThreadedHighContention) {
+TEST_P(GuardedPageAllocatorTest, ThreadedHighContention) {
   constexpr size_t num_threads = 1000;
   {
     base::DelegateSimpleThreadPool threads("page_writers", num_threads);
@@ -298,5 +309,36 @@
     EXPECT_NE(gpa_.Allocate(1), nullptr);
 }
 
+class GuardedPageAllocatorPartitionAllocTest : public BaseGpaTest {
+ protected:
+  GuardedPageAllocatorPartitionAllocTest() : BaseGpaTest(kMaxMetadata, true) {}
+};
+
+TEST_F(GuardedPageAllocatorPartitionAllocTest,
+       DifferentPartitionsNeverOverlap) {
+  constexpr const char* kType1 = "fake type1";
+  constexpr const char* kType2 = "fake type2";
+
+  std::set<void*> type1, type2;
+  for (size_t i = 0; i < kMaxSlots * 3; i++) {
+    void* alloc1 = gpa_.Allocate(1, 0, kType1);
+    ASSERT_NE(alloc1, nullptr);
+    void* alloc2 = gpa_.Allocate(1, 0, kType2);
+    ASSERT_NE(alloc2, nullptr);
+
+    type1.insert(alloc1);
+    type2.insert(alloc2);
+
+    gpa_.Deallocate(alloc1);
+    gpa_.Deallocate(alloc2);
+  }
+
+  std::vector<void*> intersection;
+  std::set_intersection(type1.begin(), type1.end(), type2.begin(), type2.end(),
+                        std::back_inserter(intersection));
+
+  EXPECT_EQ(intersection.size(), 0u);
+}
+
 }  // namespace internal
 }  // namespace gwp_asan
diff --git a/components/gwp_asan/client/sampling_malloc_shims.cc b/components/gwp_asan/client/sampling_malloc_shims.cc
index c5f381e..93ca9a210 100644
--- a/components/gwp_asan/client/sampling_malloc_shims.cc
+++ b/components/gwp_asan/client/sampling_malloc_shims.cc
@@ -255,7 +255,8 @@
                         size_t sampling_frequency) {
   static crash_reporter::CrashKeyString<24> malloc_crash_key(kMallocCrashKey);
   gpa = new GuardedPageAllocator();
-  gpa->Init(max_allocated_pages, num_metadata, total_pages, base::DoNothing());
+  gpa->Init(max_allocated_pages, num_metadata, total_pages, base::DoNothing(),
+            false);
   malloc_crash_key.Set(gpa->GetCrashKey());
   sampling_state.Init(sampling_frequency);
   base::allocator::InsertAllocatorDispatch(&g_allocator_dispatch);
diff --git a/components/gwp_asan/client/sampling_partitionalloc_shims.cc b/components/gwp_asan/client/sampling_partitionalloc_shims.cc
index 544f3a2..517b88e 100644
--- a/components/gwp_asan/client/sampling_partitionalloc_shims.cc
+++ b/components/gwp_asan/client/sampling_partitionalloc_shims.cc
@@ -28,13 +28,6 @@
 // for every access.
 GuardedPageAllocator* gpa = nullptr;
 
-// TODO(vtsyrklevich): PartitionAlloc ensures that different typed allocations
-// never overlap. For now, we ensure this property by only allowing one
-// allocation for every page. In the future we need to teach the allocator about
-// types so that it keeps track and pages can be reused.
-size_t allocation_counter = 0;
-size_t total_allocations = 0;
-
 bool AllocationHook(void** out, int flags, size_t size, const char* type_name) {
   if (UNLIKELY(sampling_state.Sample())) {
     // Ignore allocation requests with unknown flags.
@@ -43,12 +36,7 @@
     if (flags & ~kKnownFlags)
       return false;
 
-    // Ensure PartitionAlloc types are separated for now.
-    if (allocation_counter >= total_allocations)
-      return false;
-    allocation_counter++;
-
-    if (void* allocation = gpa->Allocate(size)) {
+    if (void* allocation = gpa->Allocate(size, 0, type_name)) {
       *out = allocation;
       return true;
     }
@@ -86,10 +74,10 @@
   static crash_reporter::CrashKeyString<24> pa_crash_key(
       kPartitionAllocCrashKey);
   gpa = new GuardedPageAllocator();
-  gpa->Init(max_allocated_pages, num_metadata, total_pages, base::DoNothing());
+  gpa->Init(max_allocated_pages, num_metadata, total_pages, base::DoNothing(),
+            true);
   pa_crash_key.Set(gpa->GetCrashKey());
   sampling_state.Init(sampling_frequency);
-  total_allocations = total_pages;
   // TODO(vtsyrklevich): Allow SetOverrideHooks to be passed in so we can hook
   // PDFium's PartitionAlloc fork.
   base::PartitionAllocHooks::SetOverrideHooks(&AllocationHook, &FreeHook,
diff --git a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
index 01d526d..680b9d8 100644
--- a/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
+++ b/components/gwp_asan/crash_handler/crash_analyzer_unittest.cc
@@ -44,7 +44,7 @@
 class CrashAnalyzerTest : public testing::Test {
  protected:
   void SetUp() final {
-    gpa_.Init(1, 1, 1, base::DoNothing());
+    gpa_.Init(1, 1, 1, base::DoNothing(), false);
     InitializeSnapshot();
   }
 
diff --git a/components/gwp_asan/crash_handler/crash_handler_unittest.cc b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
index e2d685a8..eb61bee9 100644
--- a/components/gwp_asan/crash_handler/crash_handler_unittest.cc
+++ b/components/gwp_asan/crash_handler/crash_handler_unittest.cc
@@ -78,7 +78,7 @@
 MULTIPROCESS_TEST_MAIN(CrashingProcess) {
   base::NoDestructor<GuardedPageAllocator> gpa;
   gpa->Init(AllocatorState::kMaxMetadata, AllocatorState::kMaxMetadata,
-            kTotalPages, base::DoNothing());
+            kTotalPages, base::DoNothing(), false);
 
   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
   base::FilePath directory = cmd_line->GetSwitchValuePath("directory");
diff --git a/components/keyed_service/content/BUILD.gn b/components/keyed_service/content/BUILD.gn
index 763dd15..940b427 100644
--- a/components/keyed_service/content/BUILD.gn
+++ b/components/keyed_service/content/BUILD.gn
@@ -9,8 +9,6 @@
   sources = [
     "browser_context_dependency_manager.cc",
     "browser_context_dependency_manager.h",
-    "browser_context_keyed_base_factory.cc",
-    "browser_context_keyed_base_factory.h",
     "browser_context_keyed_service_factory.cc",
     "browser_context_keyed_service_factory.h",
     "browser_context_keyed_service_shutdown_notifier_factory.cc",
diff --git a/components/keyed_service/content/browser_context_keyed_base_factory.cc b/components/keyed_service/content/browser_context_keyed_base_factory.cc
deleted file mode 100644
index 9ccbf2d..0000000
--- a/components/keyed_service/content/browser_context_keyed_base_factory.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/keyed_service/content/browser_context_keyed_base_factory.h"
-
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "content/public/browser/browser_context.h"
-
-BrowserContextKeyedBaseFactory::BrowserContextKeyedBaseFactory(
-    const char* name,
-    BrowserContextDependencyManager* manager)
-    : KeyedServiceBaseFactory(name, manager, BROWSER_CONTEXT) {}
-
-BrowserContextKeyedBaseFactory::~BrowserContextKeyedBaseFactory() {
-}
-
-content::BrowserContext* BrowserContextKeyedBaseFactory::GetBrowserContextToUse(
-    content::BrowserContext* context) const {
-  // TODO(crbug.com/701326): This DCHECK should be moved to GetContextToUse().
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // Safe default for the Incognito mode: no service.
-  if (context->IsOffTheRecord())
-    return nullptr;
-
-  return context;
-}
-
-bool BrowserContextKeyedBaseFactory::ServiceIsCreatedWithBrowserContext()
-    const {
-  return KeyedServiceBaseFactory::ServiceIsCreatedWithContext();
-}
-
-bool BrowserContextKeyedBaseFactory::ServiceIsNULLWhileTesting() const {
-  return KeyedServiceBaseFactory::ServiceIsNULLWhileTesting();
-}
-
-void BrowserContextKeyedBaseFactory::BrowserContextDestroyed(
-    content::BrowserContext* context) {
-  KeyedServiceBaseFactory::ContextDestroyed(context);
-}
-
-void* BrowserContextKeyedBaseFactory::GetContextToUse(void* context) const {
-  AssertContextWasntDestroyed(context);
-  return GetBrowserContextToUse(static_cast<content::BrowserContext*>(context));
-}
-
-bool BrowserContextKeyedBaseFactory::ServiceIsCreatedWithContext() const {
-  return ServiceIsCreatedWithBrowserContext();
-}
-
-void BrowserContextKeyedBaseFactory::ContextShutdown(void* context) {
-  BrowserContextShutdown(static_cast<content::BrowserContext*>(context));
-}
-
-void BrowserContextKeyedBaseFactory::ContextDestroyed(void* context) {
-  BrowserContextDestroyed(static_cast<content::BrowserContext*>(context));
-}
-
-void BrowserContextKeyedBaseFactory::RegisterPrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  RegisterProfilePrefs(registry);
-}
-
-void BrowserContextKeyedBaseFactory::SetEmptyTestingFactory(void* context) {
-  SetEmptyTestingFactory(static_cast<content::BrowserContext*>(context));
-}
-
-bool BrowserContextKeyedBaseFactory::HasTestingFactory(void* context) {
-  return HasTestingFactory(static_cast<content::BrowserContext*>(context));
-}
-
-void BrowserContextKeyedBaseFactory::CreateServiceNow(void* context) {
-  CreateServiceNow(static_cast<content::BrowserContext*>(context));
-}
diff --git a/components/keyed_service/content/browser_context_keyed_base_factory.h b/components/keyed_service/content/browser_context_keyed_base_factory.h
deleted file mode 100644
index 0bdddd6..0000000
--- a/components/keyed_service/content/browser_context_keyed_base_factory.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 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_KEYED_SERVICE_CONTENT_BROWSER_CONTEXT_KEYED_BASE_FACTORY_H_
-#define COMPONENTS_KEYED_SERVICE_CONTENT_BROWSER_CONTEXT_KEYED_BASE_FACTORY_H_
-
-#include "base/macros.h"
-#include "components/keyed_service/core/keyed_service_base_factory.h"
-#include "components/keyed_service/core/keyed_service_export.h"
-
-class BrowserContextDependencyManager;
-
-namespace content {
-class BrowserContext;
-}
-
-namespace user_prefs {
-class PrefRegistrySyncable;
-}
-
-// Base class for Factories that take a BrowserContext object and return some
-// service.
-//
-// Unless you're trying to make a new type of Factory, you probably don't want
-// this class, but its subclasses: BrowserContextKeyedServiceFactory and
-// RefcountedBrowserContextKeyedServiceFactory. This object describes general
-// dependency management between Factories; subclasses react to lifecycle
-// events and implement memory management.
-//
-// Note: this class is deprecated and should not be used and will be removed
-// once http://crbug.com/131843 and http://crbug.com/131844 are closed. If you
-// need to implement a new way to manage KeyedService lifetime, base your code
-// on KeyedServiceBaseFactory instead.
-class KEYED_SERVICE_EXPORT BrowserContextKeyedBaseFactory
-    : public KeyedServiceBaseFactory {
- protected:
-  BrowserContextKeyedBaseFactory(const char* name,
-                                 BrowserContextDependencyManager* manager);
-  ~BrowserContextKeyedBaseFactory() override;
-
-  // Interface for people building a concrete FooServiceFactory: --------------
-
-  // Finds which browser context (if any) to use.
-  virtual content::BrowserContext* GetBrowserContextToUse(
-      content::BrowserContext* context) const;
-
-  // By default, we create instances of a service lazily and wait until
-  // GetForBrowserContext() is called on our subclass. Some services need to be
-  // created as soon as the BrowserContext has been brought up.
-  virtual bool ServiceIsCreatedWithBrowserContext() const;
-
-  // By default, TestingBrowserContexts will be treated like normal contexts.
-  // You can override this so that by default, the service associated with the
-  // TestingBrowserContext is NULL. (This is just a shortcut around
-  // SetTestingFactory() to make sure our contexts don't directly refer to the
-  // services they use.)
-  bool ServiceIsNULLWhileTesting() const override;
-
-  // Interface for people building a type of BrowserContextKeyedFactory: -------
-
-  // A helper object actually listens for notifications about BrowserContext
-  // destruction, calculates the order in which things are destroyed and then
-  // does a two pass shutdown.
-  //
-  // It is up to the individual factory types to determine what this two pass
-  // shutdown means. The general framework guarantees the following:
-  //
-  // - Each BrowserContextShutdown() is called in dependency order (and you may
-  //   reach out to other services during this phase).
-  //
-  // - Each BrowserContextDestroyed() is called in dependency order. We will
-  //   NOTREACHED() if you attempt to GetForBrowserContext() any other service.
-  //   You should delete/deref/do other final memory management things during
-  //   this phase. You must also call the base class method as the last thing
-  //   you do.
-  virtual void BrowserContextShutdown(content::BrowserContext* context) = 0;
-  virtual void BrowserContextDestroyed(content::BrowserContext* context);
-
- private:
-  // Registers any user preferences on this service. This should be overriden by
-  // any service that wants to register profile-specific preferences.
-  virtual void RegisterProfilePrefs(
-      user_prefs::PrefRegistrySyncable* registry) {}
-
-  // Because of ServiceIsNULLWhileTesting(), we need a way to tell different
-  // subclasses that they should disable testing.
-  virtual void SetEmptyTestingFactory(content::BrowserContext* context) = 0;
-
-  // Returns true if a testing factory function has been set for |context|.
-  virtual bool HasTestingFactory(content::BrowserContext* context) = 0;
-
-  // We also need a generalized, non-returning method that generates the object
-  // now for when we're creating the context.
-  virtual void CreateServiceNow(content::BrowserContext* context) = 0;
-
-  // KeyedServiceBaseFactory:
-  void* GetContextToUse(void* context) const final;
-  bool ServiceIsCreatedWithContext() const final;
-  void ContextShutdown(void* context) final;
-  void ContextDestroyed(void* context) final;
-  void RegisterPrefs(user_prefs::PrefRegistrySyncable* registry) final;
-  void SetEmptyTestingFactory(void* context) final;
-  bool HasTestingFactory(void* context) final;
-  void CreateServiceNow(void* context) final;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserContextKeyedBaseFactory);
-};
-
-#endif  // COMPONENTS_KEYED_SERVICE_CONTENT_BROWSER_CONTEXT_KEYED_BASE_FACTORY_H_
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc
index 565495d..c57d2340 100644
--- a/components/omnibox/browser/omnibox_field_trial.cc
+++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -223,16 +223,19 @@
   return base::TimeDelta::FromMilliseconds(1500);
 }
 
-bool OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial() {
-  return InZeroSuggestMostVisitedWithoutSerpFieldTrial() ||
-         base::GetFieldTrialParamValueByFeature(omnibox::kOnFocusSuggestions,
-                                                kZeroSuggestVariantRule) ==
-             "MostVisited";
+bool OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+    OmniboxEventProto::PageClassification page_classification) {
+  return InZeroSuggestMostVisitedWithoutSerpFieldTrial(page_classification) ||
+         internal::GetValueForRuleInContextByFeature(
+             omnibox::kOnFocusSuggestions, kZeroSuggestVariantRule,
+             page_classification) == "MostVisited";
 }
 
-bool OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial() {
-  std::string variant = base::GetFieldTrialParamValueByFeature(
-      omnibox::kOnFocusSuggestions, kZeroSuggestVariantRule);
+bool OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial(
+    OmniboxEventProto::PageClassification page_classification) {
+  std::string variant = internal::GetValueForRuleInContextByFeature(
+      omnibox::kOnFocusSuggestions, kZeroSuggestVariantRule,
+      page_classification);
   if (variant == "MostVisitedWithoutSERP")
     return true;
 #if defined(OS_ANDROID)
@@ -247,10 +250,11 @@
 }
 
 // static
-bool OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial() {
-  return base::GetFieldTrialParamValueByFeature(omnibox::kOnFocusSuggestions,
-                                                kZeroSuggestVariantRule) ==
-         "Personalized";
+bool OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial(
+    OmniboxEventProto::PageClassification page_classification) {
+  return internal::GetValueForRuleInContextByFeature(
+             omnibox::kOnFocusSuggestions, kZeroSuggestVariantRule,
+             page_classification) == "Personalized";
 }
 
 // static
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h
index 1a0da7d..8276e34 100644
--- a/components/omnibox/browser/omnibox_field_trial.h
+++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -161,16 +161,19 @@
 // Returns whether the user is in a ZeroSuggest field trial, which shows
 // most visited URLs. This is true for both "MostVisited" and
 // "MostVisitedWithoutSERP" trials.
-bool InZeroSuggestMostVisitedFieldTrial();
+bool InZeroSuggestMostVisitedFieldTrial(
+    metrics::OmniboxEventProto::PageClassification page_classification);
 
 // Returns whether the user is in ZeroSuggest field trial showing most
 // visited URLs except it doesn't show suggestions on Google search result
 // pages.
-bool InZeroSuggestMostVisitedWithoutSerpFieldTrial();
+bool InZeroSuggestMostVisitedWithoutSerpFieldTrial(
+    metrics::OmniboxEventProto::PageClassification page_classification);
 
 // Returns whether the user is in a ZeroSuggest field trial, but should
 // show recently searched-for queries instead.
-bool InZeroSuggestPersonalizedFieldTrial();
+bool InZeroSuggestPersonalizedFieldTrial(
+    metrics::OmniboxEventProto::PageClassification page_classification);
 
 // ---------------------------------------------------------
 // For the Zero Suggest Redirect to Chrome field trial.
diff --git a/components/omnibox/browser/omnibox_field_trial_unittest.cc b/components/omnibox/browser/omnibox_field_trial_unittest.cc
index dade926..c16ce259 100644
--- a/components/omnibox/browser/omnibox_field_trial_unittest.cc
+++ b/components/omnibox/browser/omnibox_field_trial_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
 #include "base/strings/string16.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "components/omnibox/common/omnibox_features.h"
@@ -180,22 +181,57 @@
 // Test if InZeroSuggestFieldTrial*() properly parses various field trial
 // group names.
 TEST_F(OmniboxFieldTrialTest, ZeroSuggestFieldTrial) {
+  OmniboxEventProto::PageClassification page_classification =
+      OmniboxEventProto::OTHER;
+
+  // Verify the behavior with no parameters set on the feature.
   ResetFieldTrialList();
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  EXPECT_TRUE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial());
+  EXPECT_TRUE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+      page_classification));
 #else
-  EXPECT_FALSE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial());
+  EXPECT_FALSE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+      page_classification));
 #endif
 
-  ResetFieldTrialList();
-  // ScopedFeatureList reuses the global field trial list already defined
-  // within ResetFieldTrialList.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeatureWithParameters(
-      omnibox::kOnFocusSuggestions,
-      {{OmniboxFieldTrial::kZeroSuggestVariantRule, "MostVisited"}});
+  // Verify that a wildcard ZeroSuggestVariant rule works.
+  {
+    ResetFieldTrialList();
+    // ScopedFeatureList reuses the global field trial list already defined
+    // within ResetFieldTrialList.
+    std::map<std::string, std::string> params;
+    base::test::ScopedFeatureList feature_list;
+    params[std::string(OmniboxFieldTrial::kZeroSuggestVariantRule) + ":*:*"] =
+        "MostVisited";
+    feature_list.InitAndEnableFeatureWithParameters(
+        omnibox::kOnFocusSuggestions, params);
+    EXPECT_TRUE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+        page_classification));
+  }
 
-  EXPECT_TRUE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial());
+  // Sanity check that enabling MostVisited only on the NTP doesn't affect pages
+  // classified as OTHER.
+  {
+    ResetFieldTrialList();
+    // ScopedFeatureList reuses the global field trial list already defined
+    // within ResetFieldTrialList.
+    std::map<std::string, std::string> params;
+    base::test::ScopedFeatureList feature_list;
+
+    std::string ntp_param_name = base::StringPrintf(
+        "%s:%d:*", OmniboxFieldTrial::kZeroSuggestVariantRule,
+        OmniboxEventProto::NTP);
+    params[ntp_param_name] = "MostVisited";
+    feature_list.InitAndEnableFeatureWithParameters(
+        omnibox::kOnFocusSuggestions, params);
+#if defined(OS_ANDROID) || defined(OS_IOS)
+    EXPECT_TRUE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+        page_classification));
+#else
+    EXPECT_FALSE(OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+        page_classification));
+#endif
+  }
 }
 
 TEST_F(OmniboxFieldTrialTest, GetDemotionsByTypeWithFallback) {
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc
index 0fe962596..bb468b0 100644
--- a/components/omnibox/browser/zero_suggest_provider.cc
+++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -227,7 +227,8 @@
 }
 
 void ZeroSuggestProvider::DeleteMatch(const AutocompleteMatch& match) {
-  if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) {
+  if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial(
+          current_page_classification_)) {
     // Remove the deleted match from the cache, so it is not shown to the user
     // again. Since we cannot remove just one result, blow away the cache.
     client()->GetPrefs()->SetString(omnibox::kZeroSuggestCachedResults,
@@ -601,21 +602,27 @@
     return DEFAULT_SERP;
   }
 
-  if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial())
+  if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial(
+          current_page_classification_)) {
     return PersonalizedServiceShouldFallBackToMostVisited(
                client()->GetPrefs(), client()->IsAuthenticated(),
                template_url_service)
                ? MOST_VISITED
                : DEFAULT_SERP;
+  }
 
-  if (OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial() &&
+  if (OmniboxFieldTrial::InZeroSuggestMostVisitedWithoutSerpFieldTrial(
+          current_page_classification_) &&
       client()
           ->GetTemplateURLService()
-          ->IsSearchResultsPageFromDefaultSearchProvider(current_url))
+          ->IsSearchResultsPageFromDefaultSearchProvider(current_url)) {
     return NONE;
+  }
 
-  if (OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial())
+  if (OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial(
+          current_page_classification_)) {
     return MOST_VISITED;
+  }
 
   return can_send_current_url ? DEFAULT_SERP_FOR_URL : NONE;
 }
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc
index 7122fd36..f26e805 100644
--- a/components/omnibox/browser/zero_suggest_provider_unittest.cc
+++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -152,6 +152,7 @@
   void CreatePersonalizedFieldTrial();
   void CreateMostVisitedFieldTrial();
   void CreateContextualSuggestFieldTrial();
+  void SetZeroSuggestVariantForAllContexts(const std::string& variant);
 
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   base::test::ScopedFeatureList scoped_feature_list_;
@@ -188,21 +189,23 @@
 }
 
 void ZeroSuggestProviderTest::CreatePersonalizedFieldTrial() {
-  scoped_feature_list_.InitAndEnableFeatureWithParameters(
-      omnibox::kOnFocusSuggestions,
-      {{OmniboxFieldTrial::kZeroSuggestVariantRule, "Personalized"}});
+  SetZeroSuggestVariantForAllContexts("Personalized");
 }
 
 void ZeroSuggestProviderTest::CreateMostVisitedFieldTrial() {
-  scoped_feature_list_.InitAndEnableFeatureWithParameters(
-      omnibox::kOnFocusSuggestions,
-      {{OmniboxFieldTrial::kZeroSuggestVariantRule, "MostVisitedWithoutSERP"}});
+  SetZeroSuggestVariantForAllContexts("MostVisitedWithoutSERP");
 }
 
 void ZeroSuggestProviderTest::CreateContextualSuggestFieldTrial() {
+  SetZeroSuggestVariantForAllContexts("ContextualSuggestions");
+}
+
+void ZeroSuggestProviderTest::SetZeroSuggestVariantForAllContexts(
+    const std::string& variant) {
   scoped_feature_list_.InitAndEnableFeatureWithParameters(
       omnibox::kOnFocusSuggestions,
-      {{OmniboxFieldTrial::kZeroSuggestVariantRule, "ContextualSuggestions"}});
+      {{std::string(OmniboxFieldTrial::kZeroSuggestVariantRule) + ":*:*",
+        variant}});
 }
 
 TEST_F(ZeroSuggestProviderTest, TestDoesNotReturnMatchesForPrefix) {
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index a0067a5..13f05a7 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -54,11 +54,11 @@
 <translation id="1049138910114524876">‏تهيئ اللغة التي تم فرضها في شاشة تسجيل الدخول لـ <ph name="PRODUCT_OS_NAME" />.
 
       إذا تم تعيين هذه السياسة، فسيتم دائمًا عرض شاشة تسجيل الدخول باللغة التي يتم تقديمها من خلال القيمة الأولى لهذه السياسة (يتم تعريف السياسة كقائمة لتوافق إعادة التوجيه).  وإذا لم يتم تعيين هذه السياسة أو تم تعيينها إلى قائمة فارغة، فسيتم عرض شاشة تسجيل الدخول باللغة التابعة لآخر جلسة مستخدم. وإذا تم تعيين هذه السياسة على قيمة لا تمثل لغة صالحة، فسيتم عرض شاشة تسجيل الدخول باللغة البديلة (حاليًا، "en-US").</translation>
-<translation id="1052499923181221200">‏ليس لهذه السياسة تأثير إلا إذا تم ضبط SamlInSessionPasswordChangeEnabled على "True".
-      في حال ضبط هذه السياسة على "True"، وتم ضبط هذه السياسة على (مثلاً) 14، ذلك يعني أنه سيتم إشعار مستخدمي SAML قبل 14 يومًا من انتهاء صلاحية كلمة مرورهم في يوم معين.
-      وبعد ذلك يمكنهم التعامل مع هذا الأمر فورًا عن طريق إجراء تغيير كلمة المرور في الجلسة وتحديث كلمة مرورهم قبل انتهاء صلاحيتها.
-      ولكن سيتم عرض هذه الإشعارات فقط في حال إرسال معلومات انتهاء صلاحية كلمة المرور إلى الجهاز من خلال موفّر هوية SAML أثناء تدفق تسجيل الدخول إلى SAML.
-      ويعني إعداد هذه السياسة على "ZERO" أنه لن يتم إشعار المستخدمين مسبقًا - سيتم إشعارهم فقط عند انتهاء صلاحية كلمة المرور سابقًا.
+<translation id="1052499923181221200">‏ليس لهذه السياسة تأثير إلا إذا تم ضبط SamlInSessionPasswordChangeEnabled على True.
+      في حال ضبط هذه السياسة على True وعلى القيمة 14 مثلًا، ذلك يعني أنه سيتم إشعار مستخدمي SAML قبل 14 يومًا من انتهاء صلاحية كلمة مرورهم.
+      وبعد ذلك، يمكنهم التعامل مع هذا الأمر فورًا عن طريق تغيير كلمة المرور في الجلسة وتحديث كلمة مرورهم قبل انتهاء صلاحيتها.
+      وسيتم عرض هذه الإشعارات فقط في حال أرسل موفّر هوية SAML معلومات انتهاء صلاحية كلمة المرور إلى الجهاز أثناء تدفق تسجيل الدخول إلى SAML.
+      ويعني ضبط هذه السياسة على صفر أنه لن يتم إشعار المستخدمين مسبقًا، بل سيتم إشعارهم فقط بعد انتهاء صلاحية كلمة المرور.
 
       في حال ضبط هذه السياسة، لا يمكن للمستخدم تغييرها أو إلغاؤها.</translation>
 <translation id="1062011392452772310">تفعيل التأكيد عن بُعد للجهاز</translation>
@@ -325,11 +325,11 @@
 <translation id="1502843533062797703">تفعيل حظر إدخال برامج الجهات الخارجية</translation>
 <translation id="1504431521196476721">التأكيد عن بُعد</translation>
 <translation id="1507382822467487898">‏
-          تضبط هذه السياسة عنوان MAC (عنصر تحكُّم الوسائط) الذي سيتم استخدامه عندما يرتبط الإرساء بالجهاز.
+          تضبط هذه السياسة عنوان MAC (وحدة تحكم وصول الوسائط) الذي سيتم استخدامه عند ربط الإرساء بالجهاز.
 
           عند ربط الإرساء ببعض نماذج الأجهزة، سيتم استخدام عنوان MAC للإرساء المُحدّد للجهاز للتعرّف على الجهاز على الإيثرنت تلقائيًا. تتيح هذه السياسة للمشرف تغيير مصدر عنوان MAC أثناء الإرساء.
 
-          في حال اختيار "DeviceDockMacAddress" أو ترك السياسة بدون ضبط، سيتم استخدام عنوان MAC للإرساء المُحدّد للجهاز.
+          في حال اختيار "DeviceDockMacAddress" أو عدم ضبط السياسة، سيتم استخدام عنوان MAC للإرساء المُحدّد للجهاز.
 
           في حال تم اختيار "DeviceNicMacAddress"، سيتم استخدام عنوان NIC (وحدة تحكم واجهة مستخدم الشبكة) MAC للجهاز.
 
@@ -762,17 +762,17 @@
 <translation id="2303795211377219696">تفعيل الملء التلقائي لبطاقات الائتمان</translation>
 <translation id="2309390639296060546">إعدادات الموقع الجغرافي التلقائي</translation>
 <translation id="2327252517317514801">‏تحديد النطاقات المسموح لها بالوصول إلى G Suite</translation>
-<translation id="2356878440219553005">‏تحدّد هذه السياسة سياسة إدارة الطاقة لوضع شحن البطارية.
+<translation id="2356878440219553005">‏تحدّد "سياسة إدارة الطاقة لوضع شحن البطارية".
 
-          تتحكَّم هذه السياسة في شحن البطارية ديناميكيًا للحد من تآكل البطارية بسبب ضغط البطارية وإطالة عمرها الافتراضي.
+          تتحكّم هذه السياسة في شحن البطارية ديناميكيًا للحد من تآكل البطارية بسبب الضغط الممارس عليها ولإطالة عمرها الافتراضي.
 
-          في حال اختيار وضع شحن البطارية المُخصّص، حينئذٍ يجب تحديد DeviceBatteryChargeCustomStartCharging وDeviceBatteryChargeCustomStopCharging.
+          في حال اختيار وضع شحن البطارية المُخصّص، يجب تحديد DeviceBatteryChargeCustomStartCharging وDeviceBatteryChargeCustomStopCharging.
 
-          في حال ضبط هذه السياسة، حينئذٍ سيتم تطبيق وضع شحن البطارية في حال توفره على الجهاز.
+          في حال ضبط هذه السياسة، سيتم تطبيق وضع شحن البطارية إذا كان متوفرًا على الجهاز.
 
-          في حال ترك هذه السياسة بدون ضبط مع توفير السياسة على الجهاز، سيتم تطبيق وضع شحن البطارية القياسي ولا يمكن للمستخدم تغييره.
+          في حال كانت السياسة متوفرة على الجهاز ولم يتم ضبطها، سيتم تطبيق وضع شحن البطارية القياسي ولا يمكن للمستخدم تغييره.
 
-          ملاحظة: يلغي <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> هذه السياسة في حال تحديد السابق.</translation>
+          ملاحظة: يؤدّي تحديد <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> إلى إلغاء "سياسة إدارة الطاقة لوضع شحن البطارية".</translation>
 <translation id="237494535617297575">‏للسماح لك بتعيين قائمة أنماط عناوين URL التي تحدد المواقع التي يُسمح لها بعرض الإشعارات. إذا تم ترك هذه السياسة بدون تعيين، فسيتم استخدام القيمة التلقائية العامة لجميع المواقع إما من السياسة 'DefaultNotificationsSetting' إذا كان قد تم تعيينها أو من التهيئة الشخصية للمستخدم.</translation>
 <translation id="2386362615870139244">السماح بمفاتيح قفل تشغيل الشاشة</translation>
 <translation id="2411817661175306360">تم إيقاف تحذير حماية كلمة المرور.</translation>
@@ -808,7 +808,7 @@
 
       في حالة ضبط هذه السياسة على False، لا يمكن تجاوز إعداد تسجيل الدخول تلقائيًا بدون مهلة (في حالة تهيئته).</translation>
 <translation id="2454228136871844693">تحسين الثبات</translation>
-<translation id="2463034609187171371">‏تفعّل هذه السياسة مجموعات تشفير DHE في طبقة النقل الآمنة.</translation>
+<translation id="2463034609187171371">‏تفعيل مجموعات تشفير DHE في طبقة النقل الآمنة</translation>
 <translation id="2463365186486772703">لغة التطبيق</translation>
 <translation id="2466131534462628618">تتجاهل مصادقة المداخل مقيدة الوصول الخادم الوكيل</translation>
 <translation id="2482676533225429905">الرسائل الأصلية</translation>
@@ -967,7 +967,7 @@
           في حال ترك هذه السياسة بدون تحديد، سيكون الإعداد التلقائي على "False" للأجهزة المُدارة.</translation>
 <translation id="2787173078141616821">‏إبلاغ المعلومات حول حالة Android</translation>
 <translation id="2799297758492717491">‏السماح بالتشغيل التلقائي للوسائط في أنماط عناوين URL المُدرجة في القائمة البيضاء</translation>
-<translation id="2801155097555584385">تضبط هذه السياسة شحن البطارية المُخصص عند بدء الشحن بالنسبة المئوية</translation>
+<translation id="2801155097555584385">ضبط شحن البطارية المُخصص عند بدء الشحن بالنسبة المئوية</translation>
 <translation id="2801230735743888564">‏السماح للمستخدمين بتشغيل لعبة Dinosaur Easter Egg عندما يكون الجهاز بلا اتصال.
 
       إذا تم تعيين هذه السياسة على "False"، فلن يتمكن المستخدمون من تشغيل لعبة Dinosaur Easter Egg عندما يكون الجهاز بلا اتصال. وإذا تم تعيين هذا الإعداد على "True"، فسيتم السماح للمستخدمين بتشغيل لعبة Dinosaur. وإذا لم يتم تعيين هذه السياسة، فلن يتم السماح للمستخدمين بتشغيل لعبة Dinosaur Easter Egg في نظام تشغيل Chrome المُسجل، ولكن يتم السماح لهم بتشغيل هذه اللعبة في ظل ظروف أخرى.</translation>
@@ -1183,24 +1183,24 @@
 <translation id="3077183141551274418">تفعيل دورات حياة علامات التبويب أو إيقافها</translation>
 <translation id="3079417254871857650">‏تُحدِّد هذه السياسة الإجراء الذي يجب اتخاذه عند إنشاء دليل الصفحة الرئيسية للمستخدم باستخدام نظام التشفير ecryptfs.
 
-      في حال ضبط هذه السياسة على "DisallowArc"، سيتم إيقاف تطبيقات Android للمستخدمين ولن يتم تنفيذ عمليات ترحيل من نظام التشفير ecryptfs إلى تشفير ext4. لن يتم منع تطبيقات Android من العمل عندما يكون دليل الصفحة الرئيسية مشفّرًا باستخدام ext4 من قبل.
+      في حال ضبط هذه السياسة على "DisallowArc"، سيتم إيقاف تطبيقات Android للمستخدمين ولن يتم تنفيذ عمليات الترحيل من نظام التشفير ecryptfs إلى نظام التشفير ext4. إذا كان قد سبق تشفير دليل الصفحة الرئيسية باستخدام ext4، لن يتم منع تطبيقات Android من العمل.
 
-      في حال ضبط هذه السياسة على "Migrate"، سيتم ترحيل أدلة الصفحة الرئيسية بنظام التشفير ecryptfs إلى نظام التشفير ext4 تلقائيًا عند تسجيل الدخول وبدون طلب موافقة المستخدم.
+      في حال ضبط هذه السياسة على "Migrate"، سيتم ترحيل أدلة الصفحة الرئيسية المُشفَرة باستخدام ecryptfs إلى نظام التشفير ext4 تلقائيًا عند تسجيل الدخول وبدون طلب موافقة المستخدم.
 
-      في حال ضبط هذه السياسة على "Wipe"، سيتم حذف أدلة الصفحة الرئيسية بنظام تشفير ecryptfs عند تسجيل الدخول وسيتم إنشاء أدلة صفحة رئيسية بنظام تشفير ext4 بدلاً منها. تحذير: سيؤدي هذا إلى إزالة البيانات المحلية للمستخدم.
+      في حال ضبط هذه السياسة على "Wipe"، سيتم حذف أدلة الصفحة الرئيسية المُشفَرة باستخدام ecryptfs عند تسجيل الدخول وسيتم إنشاء أدلة صفحة رئيسية مُشفَرة باستخدام ext4 بدلاً منها. تحذير: سيؤدي هذا إلى إزالة البيانات المحلية للمستخدم.
 
-      في حال ضبط هذه السياسة على "MinimalMigrate"، سيتم حذف أدلة الصفحة الرئيسية بنظام تشفير ecryptfs عند تسجيل الدخول وسيتم إنشاء أدلة صفحة رئيسية بنظام تشفير ext4 بدلاً منها. ولكن ستتم محاولة الاحتفاظ برموز تسجيل الدخول المميزة حتى لا يضطر المستخدم إلى تسجيل الدخول مرة أخرى. تحذير: سيؤدي هذا إلى إزالة البيانات المحلية للمستخدم.
+      في حال ضبط هذه السياسة على "MinimalMigrate"، سيتم حذف أدلة الصفحة الرئيسية المُشفَرة باستخدام ecryptfs عند تسجيل الدخول وسيتم إنشاء أدلة صفحة رئيسية مُشفَرة باستخدام ext4 بدلاً منها. وستتم محاولة الاحتفاظ برموز تسجيل الدخول المميزة حتى لا يضطر المستخدم إلى تسجيل الدخول مرة أخرى. تحذير: سيؤدي هذا إلى إزالة البيانات المحلية للمستخدم.
 
-      في حال ضبط هذه السياسة على خيار لا يتم توفيره بعد ذلك ("AskUser" أو "AskForEcryptfsArcUsers")، سيتم التعامل معه كما لو تم اختيار "Migrate" بدلاً منه.
+      في حال ضبط هذه السياسة على خيار لم يعد متوفّرًا ("AskUser" أو "AskForEcryptfsArcUsers")، سيتم التعامل معها كما لو تم اختيار "Migrate".
 
-      لا تسري هذه السياسة على مستخدمي kiosk. وفي حال ترك هذه السياسة بدون ضبط، سيعمل الجهاز كما لو تم اختيار "DisallowArc".</translation>
+      لا تسري هذه السياسة على مستخدمي kiosk. وفي حال عدم ضبط هذه السياسة، سيعمل الجهاز كما لو تم اختيار "DisallowArc".</translation>
 <translation id="3086995894968271156">‏تهيئة مستقبِل Cast في <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">‏تسمح لك بإعداد قائمة بأنماط عناوين url التي تحدّد المواقع الإلكترونية المسموح لها بعرض الصور.
 
           إذا لم يتم وضع هذه السياسة، ستُستخدم القيمة التلقائية العامة لكل المواقع الإلكترونية إما من سياسة "DefaultImagesSetting" في حال وضعها، أو من التهيئة الشخصية للمستخدم بدلاً من ذلك.
 
           تجدر الإشارة إلى أنه تم تفعيل هذه السياسة مسبقًا بطريق الخطأ على نظام Android، ولكن لم تكن هذه الوظيفة مدعومة مطلقًا بشكلٍ كامل على نظام Android.</translation>
-<translation id="3091832372132789233">يمكنك شحن بطارية الجهاز المتّصل بمصدر الطاقة الخارجية بشكلٍ أساسي.</translation>
+<translation id="3091832372132789233">شحن بطارية الجهاز المتّصل بشكل أساسي بمصدر طاقة خارجية</translation>
 <translation id="3096595567015595053">قائمة المكونات الإضافية الممَّكنة</translation>
 <translation id="3101501961102569744">اختيار كيفية تحديد إعدادات الخادم الوكيل</translation>
 <translation id="3101709781009526431">التاريخ والوقت</translation>
@@ -1226,7 +1226,7 @@
           وفي حال إيقاف هذا الإعداد، لن يستخدم <ph name="PRODUCT_NAME" /> سوى مضيفي المراسلة الأصلية المثبتة على مستوى النظام.
 
           وفي حال ترك هذا الإعداد بدون ضبط، سيسمح <ph name="PRODUCT_NAME" /> باستخدام مضيفي المراسلة الأصلية على مستوى المستخدمين.</translation>
-<translation id="3177802893484440532">‏عمليات فحص OCSP/CRL على الإنترنت مطلوبة لكيانات الثقة المحلية</translation>
+<translation id="3177802893484440532">‏عمليات التحقق باستخدام OCSP/CRL على الإنترنت مطلوبة لكيانات الثقة المحلية</translation>
 <translation id="3185009703220253572">منذ الإصدار <ph name="SINCE_VERSION" /></translation>
 <translation id="3187220842205194486">‏يتعذّر على تطبيقات Android الحصول على إمكانية الوصول إلى مفاتيح الشركة. ولا تؤثر هذه السياسة على هذه التطبيقات.</translation>
 <translation id="3205825995289802549">زيادة حجم نافذة المتصفح الأولى إلى الحد الأقصى عند التشغيل لأول مرة</translation>
@@ -1258,10 +1258,10 @@
        في حالة تفعيل هذا الإعداد أو لم تتم تهيئته، يتمكن المستخدمون من تفعيل الخادم الوكيل للطباعة السحابية من خلال المصادقة مع حساب Google.
 
        في حالة إيقاف هذا الإعداد، لن يتمكن المستخدمون من تفعيل الخادم الوكيل ولن يتم السماح للجهاز بمشاركة الطابعات التابعة له مع <ph name="CLOUD_PRINT_NAME" />.</translation>
-<translation id="3312206664202507568">‏تعمل هذه السياسة على تفعيل الصفحة على الرابط chrome://password-change الذي يسمح لمستخدمي SAML بتغيير كلمات مرور SAML أثناء حضور الجلسة، ما يضمن مزامنة كلمة مرور SAML وكلمة مرور شاشة قفل الجهاز باستمرار.
+<translation id="3312206664202507568">‏تعمل هذه السياسة على تفعيل الصفحة على الرابط chrome://password-change. وتسمح هذه الصفحة لمستخدمي SAML بتغيير كلمات مرور SAML أثناء حضور الجلسة، ما يضمن مزامنة كلمة مرور SAML وكلمة مرور شاشة قفل الجهاز باستمرار.
 
-      تفعّل هذه السياسة أيضًا الإشعارات التي تحّذر مستخدمي SAML في حال انتهاء صلاحية كلمات مرور SAML قريبًا حتى يتمكنوا من التعامل مع ذلك فورًا عن طريق إجراء تغيير كلمة المرور في الجلسة.
-      ولكن سيتم عرض هذه الإشعارات فقط في حال إرسال معلومات انتهاء صلاحية كلمة المرور إلى الجهاز من خلال موفّر هوية SAML أثناء تدفق تسجيل الدخول إلى SAML.
+      تفعّل هذه السياسة أيضًا الإشعارات التي تحّذر مستخدمي SAML أنّ صلاحية كلمات مرور SAML على وشك الانتهاء قريبًا، حتى يتمكنوا من التعامل مع ذلك فورًا عن طريق تغيير كلمة المرور في الجلسة.
+      وسيتم عرض هذه الإشعارات فقط في حال أرسل موفّر هوية SAML معلومات انتهاء صلاحية كلمة المرور إلى الجهاز أثناء تدفق تسجيل الدخول إلى SAML.
 
       في حال ضبط هذه السياسة، لا يمكن للمستخدم تغييرها أو إلغاؤها.</translation>
 <translation id="3322771899429619102">‏يسمح لك بتعيين قائمة أنماط عناوين URL التي تحدد المواقع التي يُسمح لها باستخدام إنشاء مفتاح. وإذا كان نمط عنوان url في 'KeygenBlockedForUrls'، فإن هذا يلغي هذه الاستثناءات.
@@ -1389,10 +1389,10 @@
       إذا تم ضبط هذه السياسة على "DeveloperToolsAllowed" (القيمة 1)، ستتمكّن من الوصول إلى "أدوات مطوّري البرامج" و"وحدة تحكُّم جافا سكريبت" واستخدامهما في جميع السياقات، بما في ذلك سياق الإضافات التي تم تثبيتها بموجب سياسة المؤسسة.
       إذا تم ضبط هذه السياسة على "DeveloperToolsDisallowed" (القيمة 2)، لن تتمكّن من الوصول إلى "أدوات مطوّري البرامج" وفحص عناصر موقع الويب بعد الآن. وسيتم إيقاف أي اختصارات للوحة المفاتيح وكذلك إدخالات أي قائمة أو قائمة سياقات يتم استخدامها لفتح "أدوات مطوّري البرامج" أو "وحدة تحكُّم جافا سكريبت".</translation>
 <translation id="3547954654003013442">إعدادات الخادم الوكيل</translation>
-<translation id="3550875587920006460">تسمح بإعداد جدول زمني مخصَّص للتحقُّق من التحديثات. وينطبق ذلك على جميع المستخدمين وجميع الواجهات على الجهاز. وبعد إجراء الضبط، سيعمل الجهاز على التحقُّق من التحديثات وفقًا للجدول الزمني. يجب إزالة السياسة لإلغاء أي عمليات أخرى مجدولة للتحقق من التحديث.</translation>
+<translation id="3550875587920006460">تسمح هذه السياسة بإعداد جدول زمني مخصَّص للتحقق من التحديثات. وينطبق ذلك على جميع المستخدمين وجميع الواجهات على الجهاز. وبعد إجراء الضبط، سيعمل الجهاز على التحقق من التحديثات وفقًا للجدول الزمني. يجب إزالة السياسة لإلغاء أي عمليات أخرى مجدولة للتحقق من التحديث.</translation>
 <translation id="355118380775352753">مواقع الويب المُراد فتحها في متصفِّح بديل</translation>
 <translation id="3554984410014457319">‏السماح "لمساعد Google" بالاستماع إلى عبارة تفعيل الصوت</translation>
-<translation id="356579196325389849">‏يمكن للمستخدمين ضبط قناة الإصدار لنظام التشغيل Chrome</translation>
+<translation id="356579196325389849">‏يمكن للمستخدمين ضبط قناة الإصدار لنظام التشغيل Chrome.</translation>
 <translation id="3575011234198230041">‏مصادقة HTTP</translation>
 <translation id="3577251398714997599">إعداد الإعلانات للمواقع التي تتضمن إعلانات متداخلة</translation>
 <translation id="357917253161699596">السماح للمستخدمين بإدارة شهادات المستخدم</translation>
@@ -1498,16 +1498,16 @@
           عند ترك هذه السياسة بدون تعيين، يتم إيقاف لوحة المفاتيح على الشاشة في البداية ولكن يمكن للمستخدم تفعيلها متى شاء.</translation>
 <translation id="382476126209906314">‏تهيئة بادئة TalkGadget لعمليات استضافة الدخول عن بُعد</translation>
 <translation id="3824972131618513497">تتحكّم هذه السياسة في الإعدادات المرتبطة بإدارة الطاقة وإعادة التشغيل.</translation>
-<translation id="3826475866868158882">‏تم تفعيل خدمات الموقع الجغرافي من Google</translation>
-<translation id="3831054243924627613">‏تتحكَّم هذه السياسة في الحالة الأولية لخدمة "النسخ الاحتياطي واستعادة البيانات" على Android.
+<translation id="3826475866868158882">‏تم تفعيل إعداد "خدمات الموقع الجغرافي من Google"</translation>
+<translation id="3831054243924627613">‏تتحكّم هذه السياسة في الحالة الأولية لخدمة "النسخ الاحتياطي واستعادة البيانات" على Android.
 
-      عند عدم ضبط هذه السياسة أو ضبطها على <ph name="BR_DISABLED" />، سيتم مبدئيًا إيقاف "النسخ الاحتياطي واستعادة البيانات" على Android.
+      عند عدم ضبط هذه السياسة أو ضبطها على <ph name="BR_DISABLED" />، سيتم أولًا إيقاف "النسخ الاحتياطي واستعادة البيانات" على Android.
 
-      عند ضبط هذه السياسة على <ph name="BR_ENABLED" />، سيتم مبدئيًا تفعيل "النسخ الاحتياطي واستعادة البيانات" على Android.
+      عند ضبط هذه السياسة على <ph name="BR_ENABLED" />، سيتم أولًا تفعيل "النسخ الاحتياطي واستعادة البيانات" على Android.
 
-      عند ضبط هذه السياسة على <ph name="BR_UNDER_USER_CONTROL" />، سيُطلب من المستخدم اختيار إما استخدام "النسخ الاحتياطي واستعادة البيانات" على Android أو لا. وفي حال فعّل المستخدم "النسخ الاحتياطي واستعادة البيانات"، يتم تحميل بيانات تطبيق Android إلى خوادم النسخ الاحتياطي على Android وتتم استعادتها من هذه الخوادم عند إعادة تثبيت التطبيقات للتطبيقات المتوافقة.
+      عند ضبط هذه السياسة على <ph name="BR_UNDER_USER_CONTROL" />، سيُترك للمستخدم خيار استخدام "النسخ الاحتياطي واستعادة البيانات" على Android أو لا. وفي حال فعّل المستخدم "النسخ الاحتياطي واستعادة البيانات"، يتم تحميل بيانات تطبيق Android إلى خوادم النسخ الاحتياطي على Android وتتم استعادتها من هذه الخوادم عند إعادة تثبيت التطبيقات المتوافقة.
 
-      وتجدر الإشارة إلى أن هذه السياسة تتحكَّم في حالة "النسخ الاحتياطي واستعادة البيانات" على Android أثناء الإعداد الأولي فقط. يمكن للمستخدم فتح إعدادات Android بعد ذلك وتفعيل "النسخ الاحتياطي واستعادة البيانات" على Android أو إيقافها.</translation>
+      وتجدر الإشارة إلى أن هذه السياسة تتحكَّم في حالة "النسخ الاحتياطي واستعادة البيانات" على Android أثناء الإعداد الأولي فقط. يمكن للمستخدم فتح إعدادات Android بعد ذلك وتفعيل خيار "النسخ الاحتياطي واستعادة البيانات" على Android أو إيقافه.</translation>
 <translation id="3831376478177535007">‏عند تفعيل هذا الإعداد، سيسمح <ph name="PRODUCT_NAME" /> بالوثوق في الشهادات التي تم إصدارها من خلال عمليات البنية الأساسية للمفاتيح العامة (PKI) القديمة لشركة Symantec إذا تم بخلاف ذلك التحقق منها بنجاح وربطها بشهادات CA معروفة.
 
       يُرجى ملاحظة أن هذه السياسة تعتمد على نظام التشغيل الذي لا يزال يتعرّف على الشهادات من البنية الأساسية القديمة لشركة Symantec. وفي حال تغيير تحديث نظام التشغيل لمعالجة نظام التشغيل لمثل هذه الشهادات، لن تكون لهذه السياسة تأثير بعد الآن.  علاوة على ذلك، تُعد هذه السياسة بمثابة حل بديل مؤقت لمنح المؤسسات المزيد من الوقت للانتقال من شهادات شركة Symantic القديمة.  وستتم إزالة هذه السياسة اعتبارًا من 1 كانون الثاني (يناير) 2019 أو بحلول ذلك الوقت.
@@ -1592,7 +1592,7 @@
 
           لا يتم استخدام هذه السياسة إلا في حال ضبط DeviceBatteryChargeMode على "مخصص".
 
-          في حال عدم ضبط هذه السياسة أو تركها بدون ضبط، سيتم تطبيق وضع شحن البطارية القياسي.</translation>
+          في حال عدم تفعيل هذه السياسة أو عدم ضبطها على وضع معيّن، سيتم تطبيق وضع شحن البطارية القياسي.</translation>
 <translation id="3925377537407648234">ضبط عامل المقياس ودرجة دقة العرض</translation>
 <translation id="3939893074578116847">‏إرسال حزم الشبكة إلى خادم الإدارة لمراقبة الحالة على الإنترنت، وللسماح
       للخادم بالكشف عن ما إذا كان الجهاز بلا إنترنت.
@@ -1622,29 +1622,29 @@
       عند تعيين هذه السياسة على "صحيح" أو تركها بدون تعيين، سيتمكن المستخدمون من استرداد العروض من خلال تسجيل نظام تشغيل Chrome.
 
       عند تعيين هذه السياسة على "خطأ" لن يتمكن المستخدم من استرداد قيمة العروض.</translation>
-<translation id="4008233182078913897">‏تحدِّد قائمة بالتطبيقات والإضافات التي يتم تثبيتها تلقائيًا
-          وبدون تفاعل من المستخدم، ولا يمكن للمستخدم إلغاء تثبيتها
-          أو إيقافها. ويتم منح جميع الأذونات التي تطلبها
-          التطبيقات/الإضافات ضمنيًا بدون تفاعل المستخدم،
-          بما في ذلك أي أذونات إضافية تطلبها الإصدارات المستقبلية
-          للتطبيق/الإضافة. إضافة إلى ذلك، يتم منح الأذونات
-          لواجهات برمجة تطبيقات الإضافة enterprise.deviceAttributes وenterprise.platformKeys
-          (لا تتوفَّر واجهتا برمجة التطبيقات للتطبيقات/الإضافات غير المثبَّتة
-          من المؤسسة).
+<translation id="4008233182078913897">‏تحدِّد هذه السياسة قائمة بالتطبيقات والإضافات التي تم تثبيتها بدون تنبيه،
+          بدون تفاعل المستخدم، والتي لا يمكن للمستخدم إلغاء تثبيتها
+          أو إيقافها. يتم منح جميع الأذونات المطلوبة
+          من التطبيقات/الإضافات بشكل ضمني، بدون تفاعل المستخدم،
+          بما في ذلك أي أذونات إضافية مطلوبة من خلال الإصدارات المستقبلية
+          للتطبيق/للإضافة. إضافةً إلى ذلك، يتم منح الأذونات إلى
+          واجهات برمجة التطبيقات للإضافتين enterprise.deviceAttributes وenterprise.platformKeys
+          . (لا تتوفر واجهتا برمجة التطبيقات هاتان للتطبيقات/للإضافات
+          التي لم يتم تثبيتها من المؤسسة.)
 
-          وتكون الأولوية لهذه السياسة على السياسة <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> المتعارضة بشكلٍ محتمل. وفي حال إزالة تطبيق أو إضافة مثبَّتة بواسطة المؤسسة من هذه القائمة، سيتم إلغاء التثبيت تلقائيًا بواسطة <ph name="PRODUCT_NAME" />.
+          وتحظى هذه السياسة بالأولوية على سياسة <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> التي يُحتمل أن تكون متعارضة معها. وفي حال إزالة تطبيق أو إضافة مثبَّتة من المؤسسة سابقًا من هذه القائمة، سيلغي <ph name="PRODUCT_NAME" /> التثبيت تلقائيًا.
 
-          وبالنسبة إلى النسخ الافتراضية لنظام التشغيل Windows غير الملحقة بنطاق <ph name="MS_AD_NAME" />، يكون التثبيت من المؤسسة قاصرًا على الإضافات والتطبيقات المُدرجة في سوق Chrome الإلكتروني.
+          وبالنسبة إلى النسخ الافتراضيّة لنظام التشغيل Windows غير الملحقة بنطاق <ph name="MS_AD_NAME" />، يقتصر التثبيت من المؤسسة على التطبيقات والإضافات الواردة في "سوق Chrome الإلكتروني".
 
-          تجدر الإشارة إلى أنه من المحتمل أن يغيّر المستخدمون رمز المصدر لأي إضافة عبر أدوات مطوّري البرامج (التي من المحتمل أن تعرض الإضافة بشكلٍ غير فعّال). وإذا كان هذا الأمر مصدرًا للقلق، ينبغي ضبط السياسة <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
+          تجدر الإشارة إلى أنه يمكن للمستخدمين تغيير رمز المصدر لأي إضافة باستخدام أدوات المطوّرين (ما قد يؤدي إلى إيقاف عمل الإضافة). في هذه الحالة، يجب ضبط السياسة <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-          يُعد كل عنصر قائمة للسياسة سلسلةً تحتوي على معرّف إضافة وعنوان URL "للتحديث" مفصولاً بفاصلة منقوطة (<ph name="SEMICOLON" />). ومعرّف الإضافة هو السلسلة المكونة من 32 حرفًا التي توجد مثلاً في <ph name="CHROME_EXTENSIONS_LINK" /> في وضع مطوّر البرامج. ويجب أن يعمل عنوان URL على التوجيه إلى مستند بيان التحديث بتنسيق XML كما هو موضَّح في <ph name="LINK_TO_EXTENSION_DOC1" />. وبشكلٍ تلقائي، يتم استخدام عنوان URL للتحديث لسوق Chrome الإلكتروني (الذي يمثل حاليًا "https://clients2.google.com/service/update2/crx"). وتجدر الإشارة إلى أنه لا يتم استخدام عنوان URL "للتحديث" الذي تم تحديده في هذه السياسة إلا لعملية التثبيت الأولية، إذ توظف التحديثات اللاحقة للإضافة عنوان URL "للتحديث" المُشار إليه في بيان الإضافة. وتجدر الإشارة أيضًا إلى أن تحديد عنوان URL "للتحديث" صراحةً كان أمرًا إلزاميًا في الإصدارات <ph name="PRODUCT_NAME" /> حتى إصدار 67.
+          يمثّل كل من عناصر قائمة السياسة سلسلةً تحتوي على معرِّف الإضافة وعنوان URL "للتحديث"، يكون اختياريًا ومفصولاً بفاصلة منقوطة (<ph name="SEMICOLON" />). ويكون معرِّف الإضافة هو السلسلة المكونة من 32 حرفًا والواردة على سبيل المثال في <ph name="CHROME_EXTENSIONS_LINK" /> في وضع مطوّر البرامج. في حال تحديد عنوان URL "للتحديث"، يجب أن يشير إلى بيان التحديث بتنسيق XML كما هو موضح في <ph name="LINK_TO_EXTENSION_DOC1" />. ويتم استخدام عنوان URL للتحديث في "سوق Chrome الإلكتروني" تلقائيًا (الذي هو حاليًا "https://clients2.google.com/service/update2/crx"). وتجدر الإشارة إلى أنه يتم استخدام عنوان URL "للتحديث" الذي تم ضبطه في هذه السياسة فقط لعملية التثبيت الأولية، إذ تَستخدم التحديثات اللاحقة للإضافة عنوان URL "للتحديث" المُشار إليه في بيان الإضافة. وتجدر الإشارة أيضًا إلى أن تحديد عنوان URL "للتحديث" صراحةً كان أمرًا إلزاميًا في إصدار 67 والإصدارات السابقة له من <ph name="PRODUCT_NAME" />.
 
-          مثلاً، تثبّت <ph name="EXTENSION_POLICY_EXAMPLE" /> الإضافة التي تحتوي على المعرّف <ph name="EXTENSION_ID_SAMPLE" /> من عنوان URL "للتحديث" لسوق Chrome الإلكتروني القياسي. لمزيد من المعلومات حول استضافة الإضافات، يُرجى الاطّلاع على: <ph name="LINK_TO_EXTENSION_DOC2" />.
+          مثلاً، تثبّت <ph name="EXTENSION_POLICY_EXAMPLE" /> الإضافة التي تحتوي على المعرِّف <ph name="EXTENSION_ID_SAMPLE" /> من عنوان URL "للتحديث" لـ"سوق Chrome الإلكتروني" القياسي. ولمزيد من المعلومات عن استضافة الإضافات، يُرجى الاطّلاع على: <ph name="LINK_TO_EXTENSION_DOC2" />.
 
-          في حال عدم ضبط هذه السياسة، لن يتم تثبيت أي تطبيقات أو إضافات تلقائيًا، ويمكن للمستخدم إلغاء تثبيت أي تطبيق أو إضافة في <ph name="PRODUCT_NAME" />.
+          في حال لم يتم ضبط هذه السياسة، لن يتم تثبيت أي تطبيقات أو إضافات تلقائيًا، ويمكن للمستخدم إلغاء تثبيت أي تطبيق أو إضافة في <ph name="PRODUCT_NAME" />.
 
-          يُرجى العلم أن هذه السياسة لا تنطبق على وضع التصفُّح المتخفي.</translation>
+          تجدر الإشارة إلى أن هذه السياسة لا تنطبق على وضع التصفّح المتخفي.</translation>
 <translation id="4008507541867797979">‏في حال ضبط هذه السياسة على "true" أو عدم تهيئتها، سيعرض <ph name="PRODUCT_OS_NAME" /> المستخدمين الحاليين على شاشة تسجيل الدخول ويسمَح باختيار واحد منهم.
 
       وفي حال ضبط هذه السياسة على "false"، لن يعرض <ph name="PRODUCT_OS_NAME" /> المستخدمين الحاليين على شاشة تسجيل الدخول. سيتم عرض شاشة تسجيل الدخول العادية (المطالبة بإدخال البريد الإلكتروني للمستخدم وكلمة المرور أو الهاتف) أو الشاشة البينية SAML (في حال تفعيلها عبر سياسة <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />)، ما لم تتم تهيئة جلسة مُدارة. وعندما تتم تهيئة جلسة مُدارة، سيتم عرض حسابات "الجلسة المُدارة" فقط، ما يسمح باختيار واحد منها.
@@ -1995,7 +1995,7 @@
 <translation id="4826326557828204741">إجراء يمكن اتخاذه عند الوصول إلى حد التأخير "بعيد" أثناء التشغيل على طاقة البطارية</translation>
 <translation id="4832852360828533362">إعداد تقارير الجهاز والمستخدم</translation>
 <translation id="4834526953114077364">تتم إزالة حسابات المستخدمين الأقل استخدامًا مؤخرًا الذين لم يسجّلوا الدخول خلال آخر 3 أشهر حتى تتوفر مساحة فارغة</translation>
-<translation id="4835622243021053389">‏يمكن لهذه السياسة مصادقة NTLMv2.</translation>
+<translation id="4835622243021053389">‏تفعيل مصادقة NTLMv2</translation>
 <translation id="4858735034935305895">السماح بوضع ملء الشاشة</translation>
 <translation id="4861767323695239729">تحديد طرق الإدخال المسموح بها في جلسة المستخدم</translation>
 <translation id="487460824085252184">يمكنك الترحيل تلقائيًا، ولا تطلب موافقة المستخدم.</translation>
@@ -2107,7 +2107,7 @@
 <translation id="5124368997194894978">تفعيل سياسة "التشغيل من مصدر تيار متردد" (التيار البديل)</translation>
 <translation id="5131211790949066746">تفعّل هذه السياسة دمج سياسات قائمة تثبيت الإضافات <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> و<ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> و<ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
 
-      في حال تفعيل هذا الإعداد، يتم دمج القيم من سياسة وسيط عرض الإعلان للجهاز وسياسة السحابة الإلكترونية للجهاز وسياسة وسيط عرض الإعلانات للمستخدم في قائمة واحدة واستخدامها كلها بدلاً من استخدام القيم ذات الأولوية القصوى من مصدر واحد فقط.
+      في حال تفعيل هذا الإعداد، يتم دمج القيم من سياسة النظام الأساسي للجهاز وسياسة السحابة الإلكترونية للجهاز وسياسة النظام الأساسي للمستخدم في قائمة واحدة ويتم استخدامها كلها بدلاً من استخدام القيم ذات الأولوية القصوى من مصدر واحد فقط.
 
       في حال إيقاف هذا الإعداد أو عدم ضبطه، لن يتم استخدام سوى إدخالات القائمة ذات الأولوية القصوى وسيتم عرض جميع المصادر الأخرى كتعارضات، ولكن سيتم تجاهلها.</translation>
 <translation id="5141670636904227950">تعيين نوع مكبر الشاشة التلقائي على تفعيل في شاشة تسجيل الدخول</translation>
@@ -2309,7 +2309,7 @@
       في حال تعارض القواعد مع بعضها، يستخدم <ph name="PRODUCT_NAME" /> القاعدة الأكثر تحديدًا.</translation>
 <translation id="5475361623548884387">تفعيل الطباعة</translation>
 <translation id="547601067149622666">عدم السماح بالإعلانات على مواقع تتضمن إعلانات متداخلة</translation>
-<translation id="5483065054530244863">‏السماح لشهادات SHA-1 الموقعة التي أصدرتها كيانات الثقة المحلية</translation>
+<translation id="5483065054530244863">‏السماح بشهادات SHA-1 الموقعة التي أصدرتها كيانات الثقة المحلية</translation>
 <translation id="5483777239978559943">‏تم إيقاف هذه السياسة. يُرجى استخدام <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> للتحكّم في مدى توفّر المكوِّن الإضافي Flash و<ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> للتحكّم في ما إذا كان يجب استخدام عارض PDF المدمج لفتح ملفات PDF أم لا.
 
       تُحدد هذه السياسة قائمة بالمكوِّنات الإضافية التي يمكن للمستخدم تفعيلها أو إيقافها في <ph name="PRODUCT_NAME" />.
@@ -2431,15 +2431,15 @@
 <translation id="5630352020869108293">استعادة الجلسة الأخيرة</translation>
 <translation id="5643906875497889108">‏تتحكّم هذه السياسة في أنواع الإضافات/التطبيقات المسموح بتثبيتها وتضع حدودًا للوصول في وقت التشغيل.
 
-          يضيف هذا الإعداد أنواع الإضافات/التطبيقات المسموح بها والتي يمكن تثبيتها في <ph name="PRODUCT_NAME" /> والأطراف المضيفة التي يمكن أن تتفاعل معها إلى القائمة البيضاء. والقيمة هي قائمة من السلاسل، تمثل كل منها واحدة مما يلي: "extension" و"theme" و"user_script" و"hosted_app" و"legacy_packaged_app" و"platform_app". يُرجى الاطّلاع على وثائق إضافات <ph name="PRODUCT_NAME" /> للحصول على مزيد من المعلومات عن هذه الأنواع.
+          يضيف هذا الإعداد إلى القائمة البيضاء أنواع الإضافات/التطبيقات المسموح بها والتي يمكن تثبيتها في المنتج <ph name="PRODUCT_NAME" /> والتي يمكنها التفاعل مع الأطراف المضيفة الخاصّة بهذا المنتج. والقيمة هي قائمة من السلاسل، يمثل كل منها واحدة مما يلي: "extension" و"theme" و"user_script" و"hosted_app" و"legacy_packaged_app" و"platform_app". يُرجى الاطّلاع على وثائق إضافات <ph name="PRODUCT_NAME" /> للحصول على مزيد من المعلومات عن هذه الأنواع.
 
-          وتجدر الإشارة إلى أن هذه السياسة تؤثر أيضًا في الإضافات والتطبيقات لتكون مثبّتة من المؤسسة عبر ExtensionInstallForcelist.
+          وتجدر الإشارة إلى أن هذه السياسة تؤثر أيضًا في الإضافات والتطبيقات ليتم تثبيتها من المؤسسة من خلال ExtensionInstallForcelist.
 
           في حال ضبط هذا الإعداد، لن يتم تثبيت الإضافات/التطبيقات من أي نوع بخلاف الأنواع المدرجة في القائمة.
 
-          في حال ترك هذه الإعدادات بدون ضبط، لن يتم فرض أي قيود على أنواع الإضافات/التطبيقات المقبولة.
+          في حال عدم ضبط هذا الإعداد، لن يتم فرض أي قيود على أنواع الإضافات/التطبيقات المقبولة.
 
-          قبل إصدار 75، يُعد استخدام أرقام تعريف الإضافات المفصولة بفواصل متعددة غير متاح وسيتم تخطيها. ستتم متابعة تطبيق بقية السياسة.</translation>
+          بالنسبة إلى الإصدارات الأقدم من 75، يُعد استخدام أرقام تعريف الإضافات المفصولة بفواصل متعددة غير متاح وسيتم تخطيها. ستتم متابعة تطبيق بقية السياسة.</translation>
 <translation id="5645779841392247734">السماح بملفات تعريف الارتباط في هذه المواقع</translation>
 <translation id="5689430183304951538">حجم صفحة الطباعة التلقائية</translation>
 <translation id="5693469654327063861">السماح بترحيل البيانات</translation>
@@ -2489,7 +2489,7 @@
 <translation id="5765780083710877561">الوصف:</translation>
 <translation id="5770738360657678870">قناة مطوري البرامج (قد لا تكون ثابتة)</translation>
 <translation id="5774856474228476867">‏عنوان URL للبحث باستخدام مزود البحث التلقائي</translation>
-<translation id="5775235485119094648">يمكنك شحن البطارية عندما تكون في نطاق ثابت.</translation>
+<translation id="5775235485119094648">شحن البطارية عندما تكون في نطاق ثابت</translation>
 <translation id="5776485039795852974">السؤال في كل مرة يريد فيها أحد المواقع عرض  اشعارات سطح المكتب</translation>
 <translation id="5781412041848781654">‏تحدد مكتبة GSSAPI التي سيتم استخدامها في مصادقة HTTP. ويمكنك تعيين إما اسم مكتبة فقط أو مسار كامل.
 
@@ -2555,19 +2555,19 @@
 <translation id="5898486742390981550">‏عندما يتمّ تسجيل دخول عدة مستخدمين، لا يمكن سوى للمستخدم الأساسي استخدام تطبيقات Android.</translation>
 <translation id="5901427587865226597">الطباعة المزدوجة فقط</translation>
 <translation id="5903898512448364160">‏
-      في حال ضبط السياسة على "True"، تحظى سياسة السحابة الإلكترونية بالأولوية في حال تعارضها مع سياسة النظام الأساسي.
-      في حال ضبط السياسة على "False" أو عدم ضبطها، تحظى سياسة النظام الأساسي بالأولوية في حال تعارضها مع سياسة السحابة الإلكترونية.
+      في حال ضبط السياسة على True، تحظى سياسة السحابة الإلكترونية بالأولوية في حال تعارضها مع سياسة النظام الأساسي.
+      في حال ضبط السياسة على False أو عدم ضبطها، تحظى سياسة النظام الأساسي بالأولوية في حال تعارضها مع سياسة السحابة الإلكترونية.
 
-      تكون هذه السياسة متاحة باعتبارها سياسة إلزامية للنظام الأساسي للجهاز فقط ولا تؤثر إلا على سياسات تطبيقات السحابة الإلكترونية لنطاق الجهاز.
+      تتوفر هذه السياسة فقط باعتبارها سياسة إلزامية للنظام الأساسي للجهاز وتؤثر فقط على سياسات السحابة الإلكترونية لنطاق الجهاز.
       </translation>
-<translation id="5905473632148429217">‏تفعيل عمليات التحقُّق من OCSP/CRL على الإنترنت</translation>
+<translation id="5905473632148429217">‏تفعيل عمليات التحقّق باستخدام OCSP/CRL على الإنترنت</translation>
 <translation id="5906199912611534122">‏تسمح بتمكين تقييد الشبكة أو إيقافه.
       وينطبق هذا على جميع المستخدمين، وعلى جميع الواجهات على الجهاز. وعند التعيين،
       يستمر التقييد حتى يتم تغيير السياسة لإيقافه.
 
       إذا تم التعيين على "false"، فليس هناك أي تقييد.
       إذا تم التعيين على "true"، فسيتم تقييد النظام لتحقيق معدلات التحميل والتنزيل المتوفرة (بوحدة كيلوبت/ثانية).</translation>
-<translation id="591088232153082363">شحن البطارية المهيأ المستند إلى نمط استخدام البطارية</translation>
+<translation id="591088232153082363">شحن البطارية التكييفي المستند إلى نمط استخدام البطارية</translation>
 <translation id="5921713479449475707">‏السماح بتنزيلات التحديث التلقائي عبر HTTP</translation>
 <translation id="5921888683953999946">‏تعيين الحالة التلقائية لميزة الدخول إلى المؤشر الكبير في شاشة تسجيل الدخول.
 
@@ -2586,7 +2586,7 @@
 
       في حالة إيقاف هذا الإعداد أو عدم تعيين قيمة، فلن يتم فرض البحث الآمن في بحث Google.</translation>
 <translation id="5946082169633555022">قناة تجريبية</translation>
-<translation id="5946329690214660966">تعمل على إعداد جدول زمني مخصَّص للتحقُّق من التحديثات.</translation>
+<translation id="5946329690214660966">إعداد جدول زمني مخصَّص للتحقق من التحديثات</translation>
 <translation id="5950205771952201658">‏في ضوء حقيقة أن الأعطال البسيطة وفحوصات الإبطال على الإنترنت لا توفر فائدة أمان فعالة، لذلك يتم إيقافها بشكل تلقائي في الإصدار 19 من <ph name="PRODUCT_NAME" /> والإصدارات الأحدث. وعند تعيين هذه السياسة على "true"، يتم استرجاع الإجراء السابق وتنفيذ عمليات فحص OCSP/CRL على الإنترنت.
 
       عند عدم تعيين السياسة أو تعيينها على "false"، لن ينفِّذ <ph name="PRODUCT_NAME" /> عمليات فحص لحالات الإلغاء في الإصدار 19 من <ph name="PRODUCT_NAME" /> والإصدارات الأحدث.</translation>
@@ -2606,7 +2606,7 @@
 <translation id="6034341625190551415">‏تتحكّم هذه السياسة في الجلسة العامة وأنواع حسابات Kiosk.</translation>
 <translation id="6034603289689965535">السماح لصفحة بعرض النوافذ المنبثقة أثناء إلغاء تحميلها</translation>
 <translation id="6036523166753287175">تفعيل اجتياز الجدار الناري من مضيف يتمتع بإمكانية الوصول عن بعد</translation>
-<translation id="605475635122964053">‏تقيّد السياسة وضع طباعة رقم التعريف الشخصي. ويتم التعامل مع السياسة التي لم يتم ضبطها بدون قيود. في حال عدم توفُّر الوضع، سيتم تجاهل هذه السياسة. تجدر الإشارة إلى أنه لا يتم تفعيل ميزة طباعة رقم التعريف الشخصي إلا للطابعات التي تستخدم أحد بروتوكولات الطباعة على الإنترنت (IPPS) أو USB أو الطباعة على الإنترنت (IPP) عبر USB </translation>
+<translation id="605475635122964053">‏تقيّد السياسة وضع طباعة رقم التعريف الشخصي. ويتم التعامل مع السياسة التي لم يتم ضبطها على أنّها غير مقيّدة. في حال عدم توفر الوضع، سيتم تجاهل هذه السياسة. تجدر الإشارة إلى أنه يتم تفعيل ميزة طباعة رقم التعريف الشخصي فقط للطابعات التي تستخدم أحد بروتوكولات الطباعة على الإنترنت (IPPS) أو USB أو الطباعة على الإنترنت (IPP) باستخدام USB </translation>
 <translation id="6070667616071269965">تنسيقات لوحة المفاتيح لشاشة تسجيل الدخول إلى الجهاز</translation>
 <translation id="6074963268421707432">عدم السماح لأي موقع بعرض اشعارات سطح المكتب</translation>
 <translation id="6074964551275531965">تحديد الفترة الزمنية لإشعارات التحديث</translation>
@@ -2625,17 +2625,17 @@
 <translation id="6111936128861357925">‏السماح بلعبة Dinosaur Easter Egg</translation>
 <translation id="6114416803310251055">تم تجاهله</translation>
 <translation id="6133088669883929098">السماح لجميع المواقع باستخدام إنشاء مفتاح</translation>
-<translation id="6136537398661737682">‏تتحكَّم هذه السياسة في الحالة الأولية لخدمات الموقع الجغرافي من Google.
+<translation id="6136537398661737682">‏تتحكّم هذه السياسة في الحالة الأولية لخدمات الموقع الجغرافي من Google.
 
-      في حال عدم ضبط هذه السياسة أو ضبطها على <ph name="GLS_DISABLED" />، سيتم مبدئيًا إيقاف خدمات الموقع الجغرافي من Google.
+      في حال عدم ضبط هذه السياسة أو ضبطها على <ph name="GLS_DISABLED" />، سيتم أولًا إيقاف خدمات الموقع الجغرافي من Google.
 
-      عند ضبط هذه السياسة على <ph name="GLS_ENABLED" />، سيتم تفعيل خدمات الموقع الجغرافي من Google.
+      عند ضبط هذه السياسة على <ph name="GLS_ENABLED" />، سيتم أولًا تفعيل خدمات الموقع الجغرافي من Google.
 
-      عند ضبط هذه السياسة على <ph name="GLS_UNDER_USER_CONTROL" />، سيُطلب من المستخدم اختيار إما استخدام خدمات الموقع الجغرافي من Google أو لا. يسمح ذلك لتطبيقات Android باستخدام الخدمات للبحث عن موقع الجهاز الجغرافي، وسيؤدي ذلك أيضًا إلى تفعيل إرسال بيانات الموقع الجغرافي المجهولة إلى Google.
+      عند ضبط هذه السياسة على <ph name="GLS_UNDER_USER_CONTROL" />، سيُترك للمستخدم خيار استخدام خدمات الموقع الجغرافي من Google أو لا. يسمح ذلك لتطبيقات Android باستخدام الخدمات للبحث عن موقع الجهاز الجغرافي، وسيؤدي ذلك أيضًا إلى تفعيل إرسال بيانات الموقع الجغرافي المجهولة إلى Google.
 
       تجدر الإشارة إلى أن هذه السياسة تتحكّم في حالة خدمات الموقع الجغرافي من Google أثناء الإعداد الأولي فقط. يمكن بعد ذلك للمستخدم فتح إعدادات Android وتفعيل خدمات الموقع الجغرافي من Google أو إيقافها.
 
-      تجدر الإشارة إلى أنه يتم تجاهل هذه السياسة ويتم دائمًا إيقاف خدمات الموقع الجغرافي من Google عندما يتم ضبط السياسة <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> على <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
+      تجدر الإشارة إلى أنه يتم تجاهل هذه السياسة وتبقى خدمات الموقع الجغرافي من Google متوقفة عندما يتم ضبط السياسة <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> على <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
 <translation id="6141402445226505817">استخدام الكشف التقريبي عن المنطقة الزمنية دائمًا</translation>
 <translation id="6145799962557135888">‏للسماح لك بتعيين قائمة أنماط عناوين URL التي تحدد المواقع التي يُسمح لها بتشغيل جافا سكريبت. إذا تم ترك هذه السياسة بدون تعيين، فسيتم استخدام القيمة التلقائية العامة لجميع المواقع إما من السياسة 'DefaultJavaScriptSetting' إذا كان قد تم تعيينها أو من التهيئة الشخصية للمستخدم.</translation>
 <translation id="614662973812186053">‏تتحكم هذه السياسة أيضًا في جمع بيانات تشخيص واستخدام Android.</translation>
@@ -2712,13 +2712,13 @@
 <translation id="6224304369267200483">‏سمحت عناوين URL/النطاقات تلقائيًا بتأكيد مفتاح الأمان المباشر</translation>
 <translation id="6233173491898450179">تعيين دليل التنزيل</translation>
 <translation id="6244210204546589761">‏عناوين URL التي يتم فتحها عند بدء التشغيل</translation>
-<translation id="6255387031094435995">تسمح هذه السياسة بدمج سياسات محددة عندما تنتج من مصادر مختلفة بنفس النطاقات والمستويات.
+<translation id="6255387031094435995">تسمح هذه السياسة بدمج سياسات محددة مأخوذة من مصادر مختلفة بنفس النطاقات والمستويات.
 
-        في حال كانت سياسة متوفّرة في القائمة، وكان هناك تعارض بين مصدرين لأن لديها نفس النطاقات والمستويات، سيتم دمج القيم في قائمة سياسات جديدة.
+        في حال كانت سياسة متوفّرة في القائمة، وكان هناك تعارض بين مصدرين لأنهما لديهما نفس النطاقات والمستويات، سيتم دمج القيم في قائمة سياسات جديدة.
 
-        في حال كانت سياسة متوفّرة في القائمة، وكان هناك تعارض بين مصدرين، ولكن هناك أيضًا تعارضًا بين نطاقات و/أو مستويات مختلفة، سيتم تطبيق السياسة ذات الأولوية العُليا.
+        في حال كانت سياسة متوفّرة في القائمة، وكان هناك تعارض بين مصدرين وبين نطاقات و/أو مستويات مختلفة، سيتم تطبيق السياسة ذات الأولوية القصوى.
 
-        في حال لم تكن هناك سياسة متوفرة في القائمة، وكان هناك أي تعارض بين المصادر و/أو النطاقات و/أو المستويات، سيتم تطبيق السياسة ذات الأولوية العُليا.</translation>
+        في حال لم تكن هناك سياسة متوفّرة في القائمة، وكان هناك أي تعارض بين المصادر و/أو النطاقات و/أو المستويات، سيتم تطبيق السياسة ذات الأولوية القصوى.</translation>
 <translation id="6258193603492867656">‏لتحديد ما إذا كان اسم الخدمة الأساسي، الذي تم إنشاؤه لـ Kerberos، سيشتمل على منفذ غير قياسي. إذا تم تفعيل هذا الإعداد وتم إدخال منفذ غير قياسي (أي منفذ بخلاف 80 أو 443)، فسيتم تضمين المنفذ في اسم الخدمة الأساسي لـ Kerberos. إذا تم إيقاف هذا الإعداد أو تركه بدون إعداد، فلن يشتمل اسم الخدمة الأساسي الذي تم إنشاؤه لـ Kerberos على منفذ تحت أي ظرف.</translation>
 <translation id="6261643884958898336">الإبلاغ عن معلومات "تعريف الجهاز"</translation>
 <translation id="6281043242780654992">لتهيئة سياسات الرسائل الأصلية. ولن يتم السماح لمضيفات الرسائل الأصلية ما لم يتم إدراجها ضمن القائمة البيضاء.</translation>
@@ -2902,7 +2902,7 @@
 <translation id="6757438632136860443">‏تتيح لك إعداد قائمة بأنماط عناوين URL التي تحدّد المواقع المخوّلة تشغيل المكّون الإضافي <ph name="FLASH_PLUGIN_NAME" />.
 
          في حال عدم اختيار هذه السياسة، سيتم استخدام القيمة الأصلية العامة لجميع المواقع إما من سياسة 'DefaultPluginsSetting' إذا تم اختيارها أو من التهيئة الشخصية للمستخدم.</translation>
-<translation id="6757613329154374267">تم تفعيل "النسخ الاحتياطي واستعادة البيانات"</translation>
+<translation id="6757613329154374267">تفعيل خيار "النسخ الاحتياطي واستعادة البيانات"</translation>
 <translation id="6762235610019366960">‏تسمح لك هذه السياسة بالتحكُّم في كيفية عرض المحتوى الترويجي و/أو المحتوى التعليمي بوضع full-tab في <ph name="PRODUCT_NAME" />. في حال عدم ضبط هذه السياسة أو تفعيلها (ضبطها على الخيار "true")، قد يعرض <ph name="PRODUCT_NAME" /> المحتوى بوضع full-tab أمام المستخدمين لتزويدهم بمعلومات عن المنتج. وفي حال إيقاف هذه السياسة (ضبطها على الخيار "false")، لن يعرض <ph name="PRODUCT_NAME" /> 
 المحتوى بوضع full-tab أمام المستخدمين لتزويدهم بمعلومات عن المنتج. يتحكّم هذا الإعداد أيضًا في كيفية عرض صفحات الترحيب التي إمّا ستساعد المستخدمين على تسجيل الدخول إلى <ph name="PRODUCT_NAME" /> واختياره كالمتصفّح التلقائي، أو ستعرض لهم معلومات أخرى عن ميزات المنتج.</translation>
 <translation id="6766216162565713893">السماح لمواقع الويب بأن تطلب من المستخدم منح إمكانية الوصول إلى جهاز بلوتوث مجاور</translation>
@@ -3001,17 +3001,17 @@
 
 ......عندما تكون الشاشة على وشك التعتيم، يقيّم نموذج تعتيم الشاشة الذكي ما إذا كان يجب تأجيل تعتيم الشاشة أم لا. وفي حال تأجيل نموذج تعتيم الشاشة الذكي لتعتيم الشاشة، سيؤدي ذلك إلى مدّ الفترة الزمنية بفعالية حتى يتم تعتيم الشاشة. وفي هذه الحالة، سيتم ضبط مُهلات تعتيم الشاشة وإيقاف وقفلها للحفاظ على الفروق الزمنية نفسها بين هذه المُهلات ومهلة تأخير التعتيم وفقًا للتهيئة الأصلية.
 ......في حال ضبط هذه السياسة على "True" أو عدم ضبطها، سيتم تفعيل نموذج تعتيم الشاشة الذكي والسماح بمدّ الفترة الزمنية حتى يتم تعتيم الشاشة. وفي حال ضبط السياسة على "False"، لن يؤثر نموذج تعتيم الشاشة الذكي على تعتيم الشاشة.</translation>
-<translation id="6967394885063085697">‏تتيح هذه السياسة تفعيل سياسة إدارة الطاقة لوضع شحن البطارية المتقدم.
+<translation id="6967394885063085697">‏يمكنك تفعيل "سياسة إدارة الطاقة لوضع شحن البطارية المتقدم".
 
-          يسمح "وضع شحن البطارية المتقدّم" للمستخدم بزيادة سلامة البطارية إلى أقصى حد. وفي "وضع الشحن المتقدّم"، سيستخدم النظام خوارزمية الشحن القياسية وتقنيات أخرى أثناء ساعات العمل لزيادة سلامة البطارية إلى أقصى حد. أثناء ساعات العمل، يتم استخدام الشحن السريع. يسمح هذا الشحن السريع للبطارية بالشحن بشكلٍ أسرع، ولذلك تصبح البطارية كاملة الشحن في أقرب وقت. في كل يوم، يكون الوقت الذي سيتم فيه استخدام النظام كثيرًا محددًا من خلال وقت البدء والمدة الزمنية.
+          يسمح "وضع شحن البطارية المتقدّم" للمستخدم بزيادة سلامة البطارية إلى أقصى حد. وفي "وضع الشحن المتقدّم"، سيستخدم النظام خوارزمية الشحن القياسية وتقنيات أخرى أثناء عدم استخدام الجهاز لزيادة سلامة البطارية إلى أقصى حد. أثناء استخدام الجهاز، يتم استخدام الشحن السريع. يسمح هذا الشحن السريع بشحن البطارية بسرعة أكبر، فيكتمل شحنها في مهلة أقصر. في كل يوم، يكون الوقت الذي سيتم فيه استخدام النظام كثيرًا محددًا من خلال وقت البدء والمدة الزمنية.
 
-          وفي حال ضبط هذه السياسة على "True" وضبط DeviceAdvancedBatteryChargeModeDayConfig أيضًا، حينئذٍ سيتم دائمًا تفعيل وضع شحن البطارية المتقدم إذا كان متاحًا على الجهاز.
+          وفي حال ضبط هذه السياسة على True وضبط DeviceAdvancedBatteryChargeModeDayConfig أيضًا، سيبقى وضع شحن البطارية المتقدم مفعّلًا إذا كان متاحًا على الجهاز.
 
-          في حال ضبط هذه السياسة على "False"، سيتم دائمًا إيقاف وضع شحن البطارية المتقدم.
+          في حال ضبط هذه السياسة على False، سيبقى وضع شحن البطارية المتقدم متوقفًا.
 
-          في حال ضبط هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها.
+          في حال ضبط هذه السياسة، لن يتمكَّن المستخدم من تغييرها أو إلغائها.
 
-          في حال ترك هذه السياسة بدون ضبط، سيتم إيقاف وضع شحن البطارية المتقدم ولن يتمكّن المستخدم من تفعيله.</translation>
+          في حال عدم ضبط هذه السياسة، سيتم إيقاف وضع شحن البطارية المتقدم ولن يتمكّن المستخدم من تفعيله.</translation>
 <translation id="6972540544240464302">اختيار إعدادات ضبط أداة جدولة المهام</translation>
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="6994082778848658360">‏تحدِّد كيفية استخدام أجهزة العنصر الآمن المُدمجة لتوفير عامل المصادقة الثاني إذا كان متوافقًا مع هذه الميزة. يتم استخدام زر تشغيل الجهاز للكشف عن الوجود الفعلي للمستخدم.
@@ -3081,17 +3081,17 @@
       وإذا تم تفعيل هذا الإعداد أو إيقافه، فلن يتمكن المستخدمون من تغييره أو إلغائه.
 
       في حالة ترك السياسة بدون تعيين، يمكن للمستخدم اختيار ما إذا كان يريد أن تتم مطالبته بكلمة المرور لإلغاء قفل الجهاز أم لا.</translation>
-<translation id="7107148737865880402">‏تتيح هذه السياسة تفعيل سياسة إدارة الطاقة عند مشاركة الطاقة عبر USB.
+<translation id="7107148737865880402">‏يمكنك تفعيل "سياسة إدارة الطاقة عند مشاركة الطاقة باستخدام جهاز USB".
 
-          تتضمن أجهزة معينة منفذ USB محددًا تم تمييزه برمز برق أو رمز بطارية يمكن استخدامه لشحن الأجهزة، مثل الهاتف الجوّال الذي يستخدم بطارية النظام. تؤثر هذه السياسة في أداء الشحن لهذا المنفذ عندما يكون النظام في وضع السكون ووضع إيقاف التشغيل. لا تؤثر هذه السياسة في منافذ USB الأخرى وأداء الشحن عندما يكون النظام في وضع نشط.
+          تتضمن أجهزة معيّنة منفذ USB محددًا تم تمييزه برمز صاعقة أو رمز بطارية. ويمكن استخدام هذا المنفذ لشحن الأجهزة، مثل الهواتف الجوّالة التي تستخدم بطارية النظام. تؤثر هذه السياسة في أداء الشحن لهذا المنفذ عندما يكون النظام في وضع السكون ووضع إيقاف التشغيل. لا تؤثر هذه السياسة في منافذ USB الأخرى وأداء الشحن عندما يكون النظام في وضع نشط.
 
           عندما يكون النظام في الوضع النشط، سيوفّر منفذ USB الطاقة دائمًا.
 
-          وعندما يكون النظام في وضع السكون، وفي حال ضبط هذه السياسة على "True"، حينئذٍ سيتم تزويد منفذ USB بالطاقة عندما يكون الجهاز متّصلاً بالشاحن الجداري أو في حال كان مستوى شحن البطارية أكبر من 50%. وإلا لا يتم التزويد بالطاقة.
+          وعندما يكون النظام في وضع السكون، وفي حال ضبط هذه السياسة على True، سيتم تزويد منفذ USB بالطاقة عندما يكون الجهاز متّصلاً بالشاحن الجداري أو في حال كان مستوى شحن البطارية أكبر من 50%. وفي الحالات الأخرى، لن يتم تزويد منفذ USB بالطاقة.
 
-          عند إيقاف التشغيل، في حال ضبط هذه السياسة على "True"، سيتم تزويد منفذ USB بالطاقة عندما يكون الجهاز متّصلاً بالشاحن الجداري. وإلا لا يتم التزويد بالطاقة.
+          عند إيقاف التشغيل، وفي حال ضبط هذه السياسة على True، سيتم تزويد منفذ USB بالطاقة عندما يكون الجهاز متّصلاً بالشاحن الجداري. وفي الحالات الأخرى، لن يتم تزويد منفذ USB بالطاقة.
 
-          في حال ترك هذه السياسة بدون ضبط، سيتم تفعيل السياسة ولن يتمكّن المستخدم من إيقافها.</translation>
+          في حال عدم ضبط هذه السياسة، سيتم تفعيل السياسة ولن يتمكّن المستخدم من إيقافها.</translation>
 <translation id="7115494316187648452">‏تحدد ما إذا كانت معالجة <ph name="PRODUCT_NAME" /> بدأت عند تسجيل الدخول إلى نظام التشغيل ويستمر تشغيلها عند إغلاق النافذة الأخيرة للمتصفح أم لا، مما يسمح لتطبيقات الخلفية وجلسة المتصفح الحالية بأن تظل نشطة، بما في ذلك أي ملفات تعريف ارتباط للجلسة. وتعرض المعالجة في الخلفية رمزًا في لوحة النظام ويمكن إغلاقها دائمًا من هناك.
 
       في حالة تعيين هذه السياسة إلى True، يتم تفعيل وضع الخلفية ولا يمكن التحكم فيه بواسطة المستخدم في إعدادات المتصفح.
@@ -3142,7 +3142,7 @@
           في حال ضبط هذه السياسة على "true" أو عدم ضبطها، سيتم السماح باستخدام ميزة قفل تنشيط الشاشة لإدارة الطاقة، ما لم يتم ضبط AllowWakeLocks على "false".
 
           وفي حال ضبط هذه السياسة على "false"، سيتم تخفيض ترتيب طلبات قفل تنشيط الشاشة إلى طلبات قفل تنشيط النظام.</translation>
-<translation id="7177857088692019405">فتح القفل السريع</translation>
+<translation id="7177857088692019405">فتح القفل بسرعة</translation>
 <translation id="7185078796915954712">طبقة النقل الآمنة 1.3</translation>
 <translation id="718956142899066210">أنواع الاتصالات المسموح بها للتحديثات</translation>
 <translation id="7194407337890404814">اسم مزود البحث التلقائي</translation>
@@ -3207,7 +3207,7 @@
 <translation id="7273823081800296768">عند تفعيل هذا الإعداد أو عدم تهيئته، سيتمكن المستخدمون من اختيار إقران العملاء بالمضيفين في وقت الاتصال، وبذلك يتم تقليص الحاجة إلى إدخال رقم تعريف شخصي في كل مرة.
 
           عند إيقاف هذا الإعداد، لن تصبح هذه الميزة متاحة.</translation>
-<translation id="7274077256421167535">‏تفعيل مشاركة الطاقة عبر USB</translation>
+<translation id="7274077256421167535">‏تفعيل مشاركة الطاقة باستخدام USB</translation>
 <translation id="7275334191706090484">الإشارات المرجعية المُدارة</translation>
 <translation id="7291084543582732020">‏في حال تفعيل هذا الإعداد، سيُسمح للمستخدمين استخدام ميزة Smart Lock في حال استيفاء متطلبات هذه الميزة.
 
@@ -3357,7 +3357,7 @@
 
           لا يتم استخدام هذه السياسة إلا في حال ضبط DeviceBatteryChargeMode على "مخصص".
 
-          في حال عدم ضبط هذه السياسة أو تركها بدون ضبط، سيتم تطبيق وضع شحن البطارية القياسي.</translation>
+          في حال عدم تفعيل هذه السياسة أو عدم ضبطها على وضع معيّن، سيتم تطبيق وضع شحن البطارية القياسي.</translation>
 <translation id="759957074386651883">إعدادات التصفح الآمن</translation>
 <translation id="7604169113182304895">‏قد تختار تطبيقات Android استخدام هذه القائمة طوعًا. ولا يمكنك أن تفرض على هذه التطبيقات استخدامها.</translation>
 <translation id="7612157962821894603">علامات عبر النظام يتم تطبيقها عند بدء تشغيل <ph name="PRODUCT_NAME" /></translation>
@@ -3439,11 +3439,11 @@
 <translation id="7712109699186360774">الرجوع إليّ في كل مرة يريد فيها أحد المواقع الدخول إلى الكاميرا و/أو الميكروفون</translation>
 <translation id="7713608076604149344">قيود على التنزيل</translation>
 <translation id="7715711044277116530">النسبة المئوية التي سيتم بمقتضاها تحديد مهلة إعتام الشاشة في وضع العرض التقديمي</translation>
-<translation id="7716781462866245042">‏تضبط هذه السياسة إعدادًا يوميًا لوضع شحن البطارية المتقدِّم.
+<translation id="7716781462866245042">‏تضبط هذه السياسة إعدادًا يوميًا لوضع شحن البطارية المتقدّم.
 
-          يتم استخدام هذه السياسة فقط في حال ضبط DeviceAdvancedBatteryChargeModeEnabled على "True".
+          يتم استخدام هذه السياسة فقط في حال ضبط DeviceAdvancedBatteryChargeModeEnabled على True.
 
-          في حال عدم ضبط هذه السياسة أو تركها بدون ضبط، سيتم دائمًا إيقاف وضع شحن البطارية المتقدِّم.
+          في حال عدم تفعيل هذه السياسة أو عدم ضبطها على وضع معيّن، سبقى وضع شحن البطارية المتقدّم متوقفًا.
 
           ملاحظة: يجب أن يكون<ph name="CHARGE_START_TIME_FIELD_NAME" /> أقل من <ph name="CHARGE_END_TIME_FIELD_NAME" />.
 
@@ -3549,9 +3549,9 @@
 <translation id="7937491150792971922">دمج سياسات قائمة تثبيت الإضافات من مصادر متعددة</translation>
 <translation id="7937766917976512374">السماح بالتقاط الفيديو أو رفضه</translation>
 <translation id="7941975817681987555">عدم توقع إجراءات الشبكة على أي اتصال بالشبكة</translation>
-<translation id="7952007677054834789">‏تضبط هذه السياسة الصفحات لتحميلها عند بدء التشغيل والصفحة الرئيسية التلقائية وصفحة علامة التبويب الجديدة التلقائية في <ph name="PRODUCT_NAME" /> وتمنع المستخدمين من تغييرها.
+<translation id="7952007677054834789">‏تضبط هذه السياسة الصفحات لتحميلها عند بدء التشغيل، كما تضبط الصفحة الرئيسية التلقائية وصفحة علامة التبويب الجديدة التلقائية في <ph name="PRODUCT_NAME" /> وتمنع المستخدمين من تغييرها.
 
-      ويتم قفل إعدادات الصفحة الرئيسية للمستخدم بالكامل فقط في حال اختيار الصفحة الرئيسية لتكون صفحة علامة التبويب الجديدة، أو ضبطها لتكون عنوان URL وتحديد عنوان URL للصفحة الرئيسية في حال عدم تحديد عنوان URL للصفحة الرئيسية، حينئذٍ سيظل المستخدم قادرًا على ضبط الصفحة الرئيسية لتكون صفحة علامة التبويب الجديدة من خلال تحديد "chrome://newtab".
+      ويتم قفل إعدادات الصفحة الرئيسية للمستخدم بالكامل فقط في حال اختيار الصفحة الرئيسية لتكون صفحة علامة التبويب الجديدة، أو ضبطها لتكون عنوان URL وتحديد عنوان URL للصفحة الرئيسية. في حال عدم تحديد عنوان URL للصفحة الرئيسية، سيظل المستخدم قادرًا على ضبط الصفحة الرئيسية لتكون صفحة علامة التبويب الجديدة من خلال تحديد "chrome://newtab".
 
       يتم تجاهل السياسة "فتح عناوين URL عند بدء التشغيل" ما لم تختَر "فتح قائمة بعناوين URL" في "إجراءات عند بدء التشغيل".</translation>
 <translation id="7952958573604504839">‏تم إيقاف هذه السياسة في M48 لصالح <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />، وإزالتها في M54.
@@ -3895,7 +3895,7 @@
       إذا لم يتم ضبط السياسة، يتم استخدام الفترة التلقائية التي تبلغ 345600000 مللي ثانية (أربعة أيام) لأجهزة <ph name="PRODUCT_OS_NAME" /> و604800000 مللي ثانية (أسبوع واحد) لـ <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8685024486845674965">تم تشغيل تحذير حماية كلمة المرور من خلال إعادة استخدام كلمة المرور.</translation>
 <translation id="8693243869659262736">استخدام عميل نظام أسماء النطاقات المدمج</translation>
-<translation id="8698286761337647563">‏ما عدد الأيام قبل إشعار مستخدمي SAML عندما توشك صلاحية كلمة مرورهم على الانتهاء</translation>
+<translation id="8698286761337647563">‏قبل كم يوم يتم إشعار مستخدمي SAML أنّ صلاحية كلمة مرورهم توشك على الانتهاء</translation>
 <translation id="8703488928438047864">الإبلاغ عن حالة اللوحة</translation>
 <translation id="8703872185032220081">‏ضبط عملية إعداد يومي لتحويل طاقة الذروة.
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 7a9bf2aa..91ce2660 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -1067,6 +1067,7 @@
       If the AutoplayAllowed policy is set to False then any URL patterns set in this policy will still be allowed to play.
 
       Note that if <ph name="PRODUCT_NAME" /> is running and this policy changes, it will only be applied to new opened tabs. Therefore some tabs might still observe the previous behaviour.</translation>
+<translation id="284288632677954003">URL of an XML file that contains URLs that should never trigger a browser switch.</translation>
 <translation id="285480231336205327">Enable high contrast mode</translation>
 <translation id="2854919890879212089">Causes <ph name="PRODUCT_NAME" /> to use the system default printer as the default choice in Print Preview instead of the most recently used printer.
 
@@ -1238,6 +1239,15 @@
 <translation id="3096595567015595053">List of enabled plug-ins</translation>
 <translation id="3101501961102569744">Choose how to specify proxy server settings</translation>
 <translation id="3101709781009526431">Date and time</translation>
+<translation id="3114411414586006215">This policy controls the list of websites that will never cause a browser switch.
+
+      Note that elements can also be added to this list through the <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> policy.
+
+      When this policy is left unset, no websites are added to the list.
+
+      When this policy is set, each item is treated as a rule, similar to the <ph name="URL_LIST_POLICY_NAME" /> policy. However, the logic is reversed: rules that match will not open an alternative browser.
+
+      Unlike <ph name="URL_LIST_POLICY_NAME" />, rules apply to both directions. That is, when the Internet Explorer add-in is present and enabled, it also controls whether <ph name="IE_PRODUCT_NAME" /> should open these URLs in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3117676313396757089">Warning: DHE will be completely removed from <ph name="PRODUCT_NAME" /> after version 57 (around March 2017) and this policy will stop working then.
 
       If the policy is not set, or is set to false, then DHE cipher suites in TLS will not be enabled. Otherwise it may be set to true to enable DHE cipher suites and retain compatibility with an outdated server. This is a stopgap measure and the server should be reconfigured.
@@ -1433,6 +1443,17 @@
 <translation id="3550875587920006460">Allows setting a custom schedule to check for updates. This applies to all users, and to all interfaces on the device. Once set, the device will check for updates according to the schedule. The policy must be removed to cancel any more scheduled update checks.</translation>
 <translation id="355118380775352753">Websites to open in alternative browser</translation>
 <translation id="3554984410014457319">Allow Google Assistant to listen for the voice activation phrase</translation>
+<translation id="3557208865710006939">Force-enables spellcheck languages. Unrecognised languages in the list will be ignored.
+
+      If you enable this policy, spellcheck will be enabled for the languages specified, in addition to the languages for which the user has enabled spellcheck.
+
+      If you do not set this policy, or disable it, there will be no change to the user's spellcheck preferences.
+
+      If the <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> policy is set to false, this policy will have no effect.
+
+      If a language is included in both this policy and the <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> policy, this policy is prioritised and the spellcheck language is enabled.
+
+      The currently supported languages are: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="356579196325389849">Users may configure the Chrome OS release channel</translation>
 <translation id="3575011234198230041">HTTP authentication</translation>
 <translation id="3577251398714997599">Ads setting for sites with intrusive ads</translation>
@@ -1787,6 +1808,9 @@
           If you set this policy, users cannot change or override it.
 
           If this policy is left unset, the sticky keys is disabled initially but can be enabled by the user at any time.</translation>
+<translation id="4171331498167688968">If the policy is set to false then third-party software will be allowed to inject executable code into Chrome's processes. If the policy is unset or set to true then third-party software will be prevented from injecting executable code into Chrome's processes.
+
+      Regardless of the value of this policy, the browser will not currently block third-party software from injecting executable code into its processes on a machine that is joined to a <ph name="MS_AD_NAME" /> domain.</translation>
 <translation id="4183229833636799228">Default <ph name="FLASH_PLUGIN_NAME" /> setting</translation>
 <translation id="4192388905594723944">URL for validating remote access client authentication token</translation>
 <translation id="4203389617541558220">Limit the device uptime by scheduling automatic reboots.
@@ -2152,6 +2176,7 @@
           This policy is available only on Windows instances that are joined to a <ph name="MS_AD_NAME" /> domain. It also applies to Windows 10 Pro or Enterprise instances that enrolled for device management.</translation>
 <translation id="5085647276663819155">Disable Print Preview</translation>
 <translation id="5090209345759901501">Extend Flash content setting to all content</translation>
+<translation id="5090791951240382356">Allow merging dictionary policies from different sources</translation>
 <translation id="5093540029655764852">Specifies the rate (in days) at which a client changes their machine account password. The password is randomly generated by the client and not visible to the user.
 
       Just like user passwords, machine passwords should be changed regularly. Disabling this policy or setting a high number of days can have a negative impact on security since it gives potential attackers more time to find the machine account password and use it.
@@ -3089,6 +3114,17 @@
 <translation id="6923366716660828830">Specifies the name of the default search provider. If left empty or not set, the host name specified by the search URL will be used.
 
           This policy is only considered if the 'DefaultSearchProviderEnabled' policy is enabled.</translation>
+<translation id="6924223708804692571">Force-disables spellcheck languages. Unrecognised languages in that list will be ignored.
+
+      If you enable this policy, spellcheck will be disabled for the languages specified. The user can still enable or disable spellcheck for languages not in the list.
+
+      If you do not set this policy, or disable it, there will be no change to the user's spellcheck preferences.
+
+      If the <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> policy is set to false, this policy will have no effect.
+
+      If a language is included in both this policy and the <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> policy, the latter is prioritised and the spellcheck language will be enabled.
+
+      The currently supported languages are: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Enable long-edge duplex printing</translation>
 <translation id="6931242315485576290">Disable synchronisation of data with Google</translation>
 <translation id="6936894225179401731">Specifies the maximal number of simultaneous connections to the proxy server.
@@ -3237,6 +3273,15 @@
       If this policy is configured, the set of applications is fixed and can't be changed by the user.
 
       If this policy is left unset, the user may change the list of pinned apps in the launcher.</translation>
+<translation id="713121532817834879">This policy is a URL that points to an XML file in the same format as Internet Explorer's<ph name="IEEM_SITELIST_POLICY" /> policy. This loads rules from an XML file, without sharing those rules with Internet Explorer.
+
+      The rules in this XML file apply in the same way as <ph name="GREYLIST_POLICY_NAME" />. That is, these rules prevent <ph name="PRODUCT_NAME" /> from opening the alternative browser, and also prevent the alternative browser from opening <ph name="PRODUCT_NAME" />.
+
+      When this policy is left unset, or not set to a valid URL, <ph name="PRODUCT_NAME" /> does not use it as a source of rules that don't trigger a browser switch.
+
+      When this policy is set to a valid URL, <ph name="PRODUCT_NAME" /> downloads the site list from that URL, and applies the rules as if they had been configured with the <ph name="SITELIST_POLICY_NAME" /> policy.
+
+      For more information on Internet Explorer's <ph name="IEEM_SITELIST_POLICY" /> policy: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7132877481099023201">URLs that will be granted access to video capture devices without prompt</translation>
 <translation id="7138678301420049075">Other</translation>
 <translation id="7140629953254369759">Instructs <ph name="PRODUCT_OS_NAME" /> to use the task scheduler configuration identified by the specified name.
@@ -3284,6 +3329,15 @@
           Automatic playback is only allowed for domains explicitly listed in the <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> policy. If you want to enabled automatic playback for all sites, consider adding http://* and https://* to this list.
 
           If this policy is left not set, the user will be able to change this setting manually.</translation>
+<translation id="7222749588229362483">Allows the selected policies to be merged when they come from different sources, with the same scopes and level.
+
+        The merging consists in merging the first level keys of the dictionary from each source. In case of conflict between keys, the key coming from the highest priority source will be applied.
+
+        If a policy is in the list, in case there is conflict between two sources, given that they have the same scopes and level, the values will be merged into a new policy dictionary.
+
+        If a policy is in the list, in case there is conflict between two sources but also between different scopes and/or level, the policy with the highest priority will be applied.
+
+        If a policy is not in the list, in case there is any conflict between sources, scopes and/or level, the policy with the highest priority will be applied.</translation>
 <translation id="7229975860249300121">Contains a regular expression which is used to determine which Google Accounts can be set as browser primary accounts in <ph name="PRODUCT_NAME" /> (i.e. the account that is chosen during the Sync opt-in flow).
 
       An appropriate error is displayed if a user tries to set a browser primary account with a username that does not match this pattern.
@@ -3919,6 +3973,12 @@
 
       If the policy is set to 'Replace', user policy in user GPOs is replaced by user policy in computer GPOs (user GPOs are ignored).</translation>
 <translation id="8465065632133292531">Parameters for instant URL which uses POST</translation>
+<translation id="8465746466645315861">If this policy is not set, the user can enable or disable spellcheck in the language settings.
+
+      If this policy is set to true, spellcheck is enabled and the user cannot disable it. On <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> and <ph name="LINUX_OS_NAME" />, spellcheck languages can be individually toggled on or off, so that the user can still effectively disable spellcheck by toggling off every spellcheck language. To avoid that, the <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> policy can be used to force specific spellcheck languages to be enabled.
+
+      If this policy is set to false, spellcheck is disabled and the user cannot enable it. The <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> and <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> policies have no effect when this policy is set to false.
+      </translation>
 <translation id="847472800012384958">Do not allow any site to show pop-ups</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
 <translation id="8483004350080020634">Strips privacy and security sensitive parts of https:// URLs before passing them on to PAC scripts (Proxy Auto Config) used by <ph name="PRODUCT_NAME" /> during proxy resolution.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index c7aea15..93cfc58 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -1077,6 +1077,7 @@
       Kui reegel AutoplayAllowed on seatud väärtusele Väär, on selles reeglis määratud URL-i mustrite esitamine lubatud.
 
       Pange tähele, et kui <ph name="PRODUCT_NAME" /> töötab ja reeglit muudetakse, rakendub see ainult uutele vahelehtedele. Seetõttu võite teatud vahelehtedel märgata eelmist käitumismustrit.</translation>
+<translation id="284288632677954003">Selle XML-faili URL, mis sisaldab URL-e, mis ei tohi kunagi aktiveerida brauseri vahetamist.</translation>
 <translation id="285480231336205327">Luba kõrge kontrastiga režiim</translation>
 <translation id="2854919890879212089"><ph name="PRODUCT_NAME" /> kasutab selle seade puhul printimise eelvaates vaikevalikuna süsteemi vaikeprinterit, mitte viimati kasutatud printerit.
 
@@ -1249,6 +1250,15 @@
 <translation id="3096595567015595053">Lubatud pistikprogrammide loend</translation>
 <translation id="3101501961102569744">Valimine, kuidas määrata puhverserveri seaded</translation>
 <translation id="3101709781009526431">Kuupäev ja kellaaeg</translation>
+<translation id="3114411414586006215">Reegel haldab loendit veebisaitidest, mis ei põhjusta kunagi brauserivahetust.
+
+      Pange tähele, et reegliga <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> saab elemente sellesse loendisse ka lisada.
+
+      Kui reegel on määramata, ei lisata loendisse ühtki veebisaiti.
+
+      Kui reegel on määratud, käsitletakse iga üksust reeglina (sarnaselt reegliga <ph name="URL_LIST_POLICY_NAME" />). Loogika on aga vastupidine: kattuvaid reegleid ei avata alternatiivses brauseris.
+
+      Erinevalt reeglist <ph name="URL_LIST_POLICY_NAME" /> kehtivad reeglid mõlemas suunas. See tähendab, et kui Internet Exploreri pistikprogramm on olemas ja lubatud, haldab see ka seda, kas<ph name="IE_PRODUCT_NAME" /> peaks avama need URL-id teenuses <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3117676313396757089">Hoiatus. DHE eemaldatakse teenusest <ph name="PRODUCT_NAME" /> pärast versiooni 57 täielikult (umbes 2017. aasta märtsis) ja edaspidi see reegel enam ei tööta.
 
       Kui reegel on määramata või selle väärtuseks on määratud Väär, ei ole DHE šifreerimiskomplektid TLS-is lubatud. Selle väärtuseks võib olla määratud ka Tõene, et lubada DHE šifreerimiskomplektid ja et säilitada ühilduvus aegunud serveriga. See on ajutine meede ja server tuleks ümber seadistada.
@@ -1442,6 +1452,17 @@
 <translation id="3550875587920006460">Lubab värskenduste kontrollimiseks kohandatud ajakava määramise. See kehtib seadme kõigi kasutajate ja liideste puhul. Kui see on määratud, otsib seade värskendusi selle ajakava järgi. See reegel tuleb eemaldada, et ajastatud värskenduste otsimine tühistada.</translation>
 <translation id="355118380775352753">Alternatiivses brauseris avatavad veebisaidid</translation>
 <translation id="3554984410014457319">Google'i assistendile loa andmine kuulata häälega aktiveerimise fraasi</translation>
+<translation id="3557208865710006939">Sundlubab õigekirjakontrolli keeled. Loendis olevaid tundmatuid keeli eiratakse.
+
+      Kui selle reegli lubate, lubatakse õigekirjakontroll määratud keelte jaoks, mis lisanduvad keeltele, mille jaoks kasutaja on õigekirjakontrolli lubanud.
+
+      Kui jätate reegli määramata või keelate selle, ei mõjuta see kasutaja õigekirjakontrolli eelistusi.
+
+      Kui reegli <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> väärtuseks määratakse Väär, siis ei ole sellel reeglil mõju.
+
+      Kui keel on lisatud nii sellesse reeglisse kui ka reeglisse <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" />, prioriseeritakse seda reeglit ja õigekirjakontrolli keel lubatakse.
+
+      Praegu toetatakse järgmisi keeli: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="356579196325389849">Kasutajad saavad Chrome OS-i väljalaskekanalit seadistada</translation>
 <translation id="3575011234198230041">HTTP autentimine</translation>
 <translation id="3577251398714997599">Sekkuvate reklaamidega saitide reklaamiseaded</translation>
@@ -1795,6 +1816,9 @@
           Kui määrate reegli, ei saa kasutajad seda muuta ega alistada.
 
           Kui reegel on määramata, on nakkeklahvid algselt keelatud, kuid kasutaja võib need igal ajal lubada.</translation>
+<translation id="4171331498167688968">Kui reegel on määratud väärtusele Väär, on kolmanda osapoole tarkvaral lubatud sisestada Chrome'i protsessidesse täitmiskoodi. Kui reegel on määramata või seatud väärtusele Tõene, on kolmandal osapoolel keelatud täitmiskoodi Chrome'i protsessidesse sisestada.
+
+      Olenemata selle reegli väärtusest ei blokeeri brauser praegu kolmanda osapoole tarkvara puhul täitmiskoodi sisestamist selle protsessidesse seadmes, mis on liitunud üksuse <ph name="MS_AD_NAME" /> domeeniga.</translation>
 <translation id="4183229833636799228">Pistikprogrammi <ph name="FLASH_PLUGIN_NAME" /> vaikeseade</translation>
 <translation id="4192388905594723944">URL kaugjuurdepääsuga kliendi autentimismärgi kinnitamiseks</translation>
 <translation id="4203389617541558220">Seadme tööaja piiramine, ajastades automaatsed taaskäivitused.
@@ -2163,6 +2187,7 @@
           Reegel on saadaval ainult Windowsi eksemplarides, mis on liidetud domeeniga <ph name="MS_AD_NAME" />, ja Windows 10 Pro või Enterprise'i eksemplaridega, mis on registreeritud seadmehalduse teenuses.</translation>
 <translation id="5085647276663819155">Printimise eelvaate keelamine</translation>
 <translation id="5090209345759901501">Flash-sisu seade laiendamine kogu sisule</translation>
+<translation id="5090791951240382356">Eri allikatest pärinevate sõnastiku reeglite liitmise lubamine</translation>
 <translation id="5093540029655764852">Määrab sageduse (päevades), kui tihti klient seadme konto parooli muudab. Klient loob parooli juhuslikult ja see pole kasutajale nähtav.
 
       Sarnaselt kasutaja paroolidele tuleb seadme paroole regulaarselt muuta. Kui see reegel keelatakse või määratakse suur päevade arv, võib see turvalisusele negatiivselt mõjuda, kuna see annab võimalikele ründajatele rohkem aega seadme konto parool välja uurida ja seda kasutada.
@@ -3105,6 +3130,17 @@
 <translation id="6923366716660828830">Määrab vaikeotsingupakkuja nime. Kui see jäetakse tühjaks või määramata, siis kasutatakse otsingu URL-i määratud hosti nime.
 
           See reegel kehtib vaid juhul, kui reegel „DefaultSearchProviderEnabled” on lubatud.</translation>
+<translation id="6924223708804692571">Sundkeelab õigekirjakontrolli keeled. Loendis olevaid tundmatuid keeli eiratakse.
+
+      Kui lubate reegli, keelatakse õigekirjakontroll määratud keelte jaoks. Kasutaja saab siiski loendist puuduvate keelte jaoks õigekirjakontrolli lubada või keelata.
+
+      Kui jätate reegli määramata või keelate selle, ei mõjuta see kasutaja õigekirjakontrolli eelistusi.
+
+      Kui reegli <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> väärtuseks määratakse Väär, siis ei ole sellel reeglil mõju.
+
+      Kui keel on lisatud nii sellesse reeglisse kui ka reeglisse <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, prioriseeritakse seda reeglit ja õigekirjakontrolli keel lubatakse.
+
+      Praegu toetatakse järgmisi keeli: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Pikema külje dupleksprintimise lubamine</translation>
 <translation id="6931242315485576290">Keela andmete sünkroonimine Google'iga</translation>
 <translation id="6936894225179401731">Määrab puhverserveri samaaegsete ühenduste maksimumarvu.
@@ -3253,6 +3289,15 @@
       Kui eeskiri on seadistatud, on rakenduste kogum fikseeritud ja kasutaja ei saa seda muuta.
 
       Kui jätate eeskirja määramata, siis võib kasutaja käivitis kinnitatud rakenduste loendit muuta.</translation>
+<translation id="713121532817834879">Reegel on URL, mis viitab XML-failile, mis on Internet Exploreri reegliga <ph name="IEEM_SITELIST_POLICY" /> samas vormingus. See laadib reeglid XML-failist ega jaga reegleid Internet Exploreriga.
+
+      XML-failis olevad reeglid rakendatakse samal viisil kui reegel <ph name="GREYLIST_POLICY_NAME" />. See tähendab, et need reeglid takistavad teenusel <ph name="PRODUCT_NAME" /> avamast alternatiivset brauserit. Samuti takistavad need alternatiivsel brauseril avamast teenust <ph name="PRODUCT_NAME" />.
+
+      Kui see reegel on määramata või selleks pole määratud kehtivat URL-i, ei kasuta teenus <ph name="PRODUCT_NAME" /> seda selliste reeglite allikana, mis ei aktiveeri brauseri vahetamist.
+
+      Kui reeglis on määratud kehtiv URL, laadib <ph name="PRODUCT_NAME" /> URL-ilt saitide loendi alla ja rakendab reeglid samamoodi kui reegliga <ph name="SITELIST_POLICY_NAME" /> seadistamise korral.
+
+      Vaadake lisateavet Internet Exploreri reegli <ph name="IEEM_SITELIST_POLICY" /> kohta: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7132877481099023201">URL-id, millele antakse ilma küsimata juurdepääs videojäädvustusseadmetele</translation>
 <translation id="7138678301420049075">Muu</translation>
 <translation id="7140629953254369759">Juhendab operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> kasutama konkreetse nimega tegumite ajakava koostaja konfiguratsiooni.
@@ -3300,6 +3345,15 @@
           Automaatne taasesitus on lubatud ainult domeenidel, mis on reeglis <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" /> selgesõnaliselt loetletud. Kui soovite lubada automaatse taasesituse kõigil saitidel, kaaluge sellesse loendisse protokollide http://* ja https://* lisamist.
 
           Kui see reegel on määramata, saab kasutaja seda seadet käsitsi muuta.</translation>
+<translation id="7222749588229362483">Lubab valitud reeglite liitmise, kui need pärinevad eri allikatest ning neil on sama ulatus ja tase.
+
+        Liitmine hõlmab iga allika sõnastiku esmataseme klahvide liitmist. Kui klahvide vahel on konflikt, rakendatakse kõige kõrgema prioriteediga allikast pärinev klahv.
+
+        Kui reegel on loendis ja kahe allika vahel, millel on sama ulatus ja tase, ilmneb konflikt, liidetakse väärtused uude reeglisõnastikku.
+
+        Kui reegel on loendis ja kahe allika vahel, millel on erinev ulatus ja tase, ilmneb konflikt, rakendatakse kõrgeima prioriteediga reegel.
+
+        Kui reegel puudub loendist ning allikate, ulatuste ja/või tasemete vahel ilmneb konflikt, rakendatakse kõrgeima prioriteediga reegel.</translation>
 <translation id="7229975860249300121">Sisaldab regulaaravaldist, mis määrab, millised Google'i kontod saab teenuses <ph name="PRODUCT_NAME" /> brauseri peamisteks kontodeks seadistada.
 
       Kui kasutaja üritab määrata brauseri peamist kontot, mille kasutajanimi ei kattu mustriga, kuvatakse vastav veasõnum.
@@ -3936,6 +3990,12 @@
 
       Kui reegli väärtuseks määratakse „Replace”, asendatakse kasutaja GPO-des olevad kasutajareeglid arvuti GPO-des olevate kasutajareeglitega (kasutaja GPO-sid eiratakse).</translation>
 <translation id="8465065632133292531">Parameetrid Instant-URL-i jaoks, mis kasutab POST-meetodit</translation>
+<translation id="8465746466645315861">Kui see reegel on määramata, saab kasutaja õigekirjakontrolli keeleseadetes lubada või keelata.
+
+      Kui selle reegli väärtuseks määratakse Tõene, siis on õigekirjakontroll lubatud ja kasutaja ei saa seda keelata. Operatsioonisüsteemides <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> ja <ph name="LINUX_OS_NAME" /> saab õigekirjakontrolli keeled eraldi sisse või välja lülitada, et kasutaja saaks õigekirjakontrolli keelata, lülitades iga õigekirjakontrolli keele välja. Selle vältimiseks saab teatud õigekirjakontrolli keeled reegliga <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> sundlubada.
+
+      Kui selle reegli väärtuseks määratakse Väär, siis on õigekirjakontroll keelatud ja kasutaja ei saa seda lubada. Kui selle reegli väärtuseks on määratud Väär, siis puudub reeglitel <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> ja <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> mõju.
+      </translation>
 <translation id="847472800012384958">Keela kõikidel saitidel hüpikakende näitamine</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
 <translation id="8483004350080020634">Eemaldatakse protokolli https:// URL-ide privaatsuse ja turvalisusega seotud tundlikud osad enne, kui need saadetakse PAC-skriptidele (puhverserveri automaatne seadistamine), mida teenus <ph name="PRODUCT_NAME" /> puhverserveri lahendamisel kasutab.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 9f2a536a..2a0b426 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1222,15 +1222,15 @@
 <translation id="3072045631333522102">Economiseur d'écran à utiliser sur l'écran de connexion en mode Point de vente</translation>
 <translation id="3072847235228302527">Définir les conditions d'utilisation d'un compte local de l'appareil</translation>
 <translation id="3077183141551274418">Activer ou désactiver le cycle de vie des onglets</translation>
-<translation id="3079417254871857650">Permet de spécifier l'action à effectuer lorsque le répertoire d'accueil de l'utilisateur a été créé avec un chiffrement eCryptfs.
+<translation id="3079417254871857650">Permet de spécifier l'action à effectuer lorsque le répertoire personnel de l'utilisateur a été créé avec un chiffrement eCryptfs.
 
-      Si cette règle est définie sur "DisallowArc", les applications Android sont désactivées pour l'utilisateur, et la migration d'eCryptfs vers ext4 n'aura pas lieu. Les applications Android pourront s'exécuter si l'annuaire principal est déjà chiffré à l'aide du système ext4.
+      Si cette règle est définie sur "DisallowArc", les applications Android sont désactivées pour l'utilisateur, et la migration d'eCryptfs vers ext4 n'aura pas lieu. Les applications Android pourront s'exécuter si le répertoire personnel est déjà chiffré à l'aide du système ext4.
 
-      Si cette règle est définie sur "Migrate", les répertoires d'accueil chiffrés avec eCryptfs feront l'objet d'une migration automatique vers le chiffrement ext4 à la connexion, sans demander la permission de l'utilisateur.
+      Si cette règle est définie sur "Migrate", les répertoires personnels chiffrés avec eCryptfs feront l'objet d'une migration automatique vers le chiffrement ext4 à la connexion, sans demander la permission de l'utilisateur.
 
-      Si cette règle est définie sur "Wipe", les répertoires d'accueil chiffrés avec eCryptfs seront supprimés à la connexion, puis de nouveaux répertoires avec chiffrement ext4 seront créés à leur place. Avertissement : Ceci supprime les données locales de l'utilisateur.
+      Si cette règle est définie sur "Wipe", les répertoires personnels chiffrés avec eCryptfs seront supprimés à la connexion, puis de nouveaux répertoires avec chiffrement ext4 seront créés à leur place. Avertissement : Ceci supprime les données locales de l'utilisateur.
 
-      Si cette règle est définie sur "MinimalMigrate", les répertoires d'accueil chiffrés avec eCryptfs sont supprimés lors de la connexion et remplacés par de nouveaux répertoires d'accueil chiffrés avec ext4. Toutefois, cette option permet de conserver les jetons de connexion pour éviter à l'utilisateur de se reconnecter. Avertissement : Ceci supprime les données locales de l'utilisateur.
+      Si cette règle est définie sur "MinimalMigrate", les répertoires personnels chiffrés avec eCryptfs sont supprimés lors de la connexion et remplacés par de nouveaux répertoires personnels chiffrés avec ext4. Toutefois, la règle tente de conserver les jetons de connexion pour éviter à l'utilisateur de se reconnecter. Avertissement : Ceci supprime les données locales de l'utilisateur.
 
       Si cette règle est définie sur une option qui n'est plus acceptée ("AskUser" ou "AskForEcryptfsArcUsers"), le résultat sera le même que si vous aviez sélectionné l'option "Migrate".
 
@@ -1547,13 +1547,13 @@
 <translation id="3826475866868158882">Services de localisation Google activés</translation>
 <translation id="3831054243924627613">Cette règle permet de contrôler l'état initial du service Android de sauvegarde et de restauration.
 
-      Si cette règle n'est pas configurée ou est définie sur <ph name="BR_DISABLED" />, le service Android de sauvegarde et restauration est désactivé initialement.
+      Si cette règle n'est pas configurée ou est définie sur <ph name="BR_DISABLED" />, le service Android de sauvegarde et restauration est initialement désactivé.
 
-      Si cette règle est définie sur <ph name="BR_ENABLED" />, le service Android de sauvegarde et restauration est activé.
+      Si cette règle est définie sur <ph name="BR_ENABLED" />, le service Android de sauvegarde et restauration est initialement activé.
 
-      Si cette règle est définie sur <ph name="BR_UNDER_USER_CONTROL" />, l'utilisateur est invité à choisir s'il souhaite activer le service Android de sauvegarde et restauration. S'il l'active, les données des applications Android sont sauvegardées sur les serveurs de sauvegarde Android, puis restaurées depuis ces derniers lors de la réinstallation des applications (si ces dernières sont compatibles).
+      Si cette règle est définie sur <ph name="BR_UNDER_USER_CONTROL" />, l'utilisateur est invité à choisir s'il souhaite activer le service Android de sauvegarde et restauration. S'il l'active, les données des applications Android sont importées sur les serveurs de sauvegarde Android, puis restaurées depuis ces derniers lors de la réinstallation des applications (si ces dernières sont compatibles).
 
-      Cette règle contrôle uniquement l'état du service Android de sauvegarde et restauration lors la phase initiale de configuration. Par la suite, l'utilisateur peut accéder aux paramètres Android pour activer ou désactiver ce service.</translation>
+      Cette règle contrôle uniquement l'état du service Android de sauvegarde et restauration lors de la phase initiale de configuration. Par la suite, l'utilisateur peut accéder aux paramètres Android pour activer ou désactiver ce service.</translation>
 <translation id="3831376478177535007">Lorsque ce paramètre est activé, <ph name="PRODUCT_NAME" /> accepte de faire confiance aux certificats émis par l'ancienne infrastructure PKI de Symantec Corporation s'ils sont correctement validés et que leur chaîne de confiance renvoie à un certificat CA reconnu.
 
       Notez que cette règle dépend de la reconnaissance des certificats de l'ancienne infrastructure de Symantec par le système d'exploitation. Si une mise à jour du système d'exploitation modifie sa gestion de ces certificats, cette règle n'aura plus d'effet. En outre, cette règle n'est qu'une solution temporaire destinée à laisser suffisamment de temps aux entreprises pour cesser d'utiliser les anciens certificats Symantec. Elle sera supprimée aux alentours du 1er janvier 2019.
@@ -1674,7 +1674,7 @@
       Si cette règle est définie sur "True" ou si elle n'est pas définie, les utilisateurs peuvent utiliser leurs offres via ce service.
 
       Si elle est définie sur "False", les utilisateurs ne peuvent pas utiliser leurs offres.</translation>
-<translation id="4008233182078913897">Définit la liste des sites Web qui sont installés silencieusement, sans aucune intervention de l'utilisateur, et que ce dernier ne peut pas désinstaller ni désactiver. Toutes les autorisations demandées par les
+<translation id="4008233182078913897">Définit la liste des applications et des extensions qui sont installées silencieusement, sans aucune intervention de l'utilisateur, et que ce dernier ne peut pas désinstaller ni désactiver. Toutes les autorisations demandées par les
           applications et extensions sont accordées implicitement, sans intervention de l’utilisateur,
           y compris n'importe quelle autre autorisation demandée par les futures versions de
           l’application ou l’extension concernée. En outre, les autorisations sont accordées pour les
@@ -1682,7 +1682,7 @@
           enterprise.platformKeys (Ces deux API ne sont pas disponibles pour les applications/extensions qui ne sont pas
           installées d'office).
 
-          Cette règle est prioritaire sur toute règle <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> présentant un conflit potentiel. Si une application ayant été préalablement installée d'office est supprimée de cette liste, elle est automatiquement désinstallée par <ph name="PRODUCT_NAME" />.
+          Cette règle est prioritaire sur toute règle <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> présentant un conflit potentiel. Si une application ou extension ayant été préalablement installée d'office est supprimée de cette liste, elle est automatiquement désinstallée par <ph name="PRODUCT_NAME" />.
 
           Pour les instances Windows qui ne sont pas associées à un domaine <ph name="MS_AD_NAME" />, l'installation d'office est limitée aux applications et aux extensions répertoriées sur le Chrome Web Store.
 
@@ -1690,11 +1690,11 @@
 
           Dans cette règle, chaque élément de la liste est constitué d'une chaîne contenant un identifiant d'extension et une URL de mise à jour séparés par un point-virgule (<ph name="SEMICOLON" />). L'identifiant d'extension est la chaîne de 32 lettres qui se trouve, par exemple, dans <ph name="CHROME_EXTENSIONS_LINK" /> en mode développeur. L'URL de mise à jour doit renvoyer à un fichier manifeste de mise à jour au format XML, comme décrit sur la page <ph name="LINK_TO_EXTENSION_DOC1" />. Par défaut, l'URL de mise à jour du Chrome Web Store est utilisée (il s'agit actuellement de "https://clients2.google.com/service/update2/crx"). Notez que l'URL de mise à jour définie dans cette règle n'est utilisée que pour l'installation initiale. Toute mise à jour ultérieure de l'extension est effectuée avec l'URL de mise à jour indiquée dans le fichier manifeste de l'extension. Sachez également que la définition explicite de l'URL de mise à jour était obligatoire dans les versions de <ph name="PRODUCT_NAME" /> jusqu'à la version 67.
 
-          Par exemple, <ph name="EXTENSION_POLICY_EXAMPLE" /> installe l'application <ph name="EXTENSION_ID_SAMPLE" /> à partir de l'URL de mise à jour standard du Chrome Web Store. Pour en savoir plus sur l'hébergement des extensions, rendez-vous sur : <ph name="LINK_TO_EXTENSION_DOC2" />.
+          Par exemple, <ph name="EXTENSION_POLICY_EXAMPLE" /> installe l'extension <ph name="EXTENSION_ID_SAMPLE" /> à partir de l'URL de mise à jour standard du Chrome Web Store. Pour en savoir plus sur l'hébergement des extensions, rendez-vous sur : <ph name="LINK_TO_EXTENSION_DOC2" />.
 
           Si cette règle n'est pas configurée, aucune application ni extension n'est installée automatiquement. Toute application ou extension de <ph name="PRODUCT_NAME" /> peut donc être désinstallée.
 
-          Sachez que cette règle n'est pas compatible avec le mode navigation privée.</translation>
+          Sachez que cette règle ne s'applique pas en mode navigation privée.</translation>
 <translation id="4008507541867797979">Si cette règle est définie sur True ou si elle n'est pas configurée, <ph name="PRODUCT_OS_NAME" /> affiche les utilisateurs existants sur l'écran de connexion et permet d'en choisir un.
 
       Si cette règle est définie sur False, <ph name="PRODUCT_OS_NAME" /> n'affiche pas les utilisateurs existants sur l'écran de connexion. L'écran de connexion habituel (demandant l'e-mail et le mot de passe ou le numéro de téléphone de l'utilisateur) ou l'écran interstitiel SAML (si autorisé via la règle <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />) s'affiche, à moins qu'une session gérée ne soit configurée. Lorsqu'une session gérée est configurée, seuls les comptes de la session gérée s'affichent, et permettent d'en choisir un.
@@ -2534,7 +2534,7 @@
 
           Si cette règle n'est pas configurée, aucune restriction n'est imposée concernant les types d'extensions ou d'applications pouvant être installés.
 
-          Avant la version 75, l'utilisation de plusieurs identifiants d'extension séparés par une virgule sera ignorée et ne sera pas acceptée. Le reste de la règle continuera de s'appliquer.</translation>
+          Avant la version 75, l'utilisation de plusieurs identifiants d'extension séparés par une virgule n'est pas prise en charge et sera donc ignorée. Le reste de la règle continuera de s'appliquer.</translation>
 <translation id="5645779841392247734">Autoriser les cookies sur ces sites</translation>
 <translation id="5689430183304951538">Format de page d'impression par défaut</translation>
 <translation id="5693469654327063861">Autoriser la migration de données</translation>
@@ -2659,7 +2659,7 @@
       Si cette règle est définie sur "True", la règle relative au cloud prévaut en cas de conflit avec celle concernant les plates-formes.
       Si cette règle est définie sur "False" ou n'est pas configurée, la règle relative aux plates-formes prévaut en cas de conflit avec celle concernant le cloud.
 
-      Cette règle est uniquement disponible en tant que règle de la plate-forme (machine) et n'affecte que les règles relatives au cloud s’appliquant aux machines.
+      Cette règle est uniquement disponible en tant que règle obligatoire de plate-forme de machines et n'affecte que les règles relatives au cloud s’appliquant aux machines.
       </translation>
 <translation id="5905473632148429217">Activer les contrôles OCSP/CRL en ligne</translation>
 <translation id="5906199912611534122">Permet d'activer ou de désactiver la limitation du débit réseau.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index cada14a6..2d83ed0 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -1062,6 +1062,7 @@
       Ja politikai AutoplayAllowed ir iestatīta vērtība “False”, joprojām būs atļauts atskaņot jebkurus šajā politikā iestatītos URL rakstus.
 
       Ņemiet vērā: ja <ph name="PRODUCT_NAME" /> darbojas un tiek mainīta šī politika, tā būs spēkā tikai jaunās atvērtās cilnēs. Tādēļ noteiktās cilnēs, iespējams, joprojām notiks iepriekšējā darbība.</translation>
+<translation id="284288632677954003">URL no tāda XML faila, kurā ir vietrāži URL, kam nekad nebūtu jāaktivizē pārlūkprogrammas pārslēgšana.</translation>
 <translation id="285480231336205327">Iespējot augsta kontrasta režīmu</translation>
 <translation id="2854919890879212089">Šī politika nosaka, ka pēc noklusējuma pārlūkprogrammas <ph name="PRODUCT_NAME" /> drukas priekšskatījumā jāizmanto sistēmas noklusējuma printeris, nevis pēdējais lietotais printeris.
 
@@ -1234,6 +1235,15 @@
 <translation id="3096595567015595053">Iespējoto spraudņu saraksts</translation>
 <translation id="3101501961102569744">Izvēlas, kā jānorāda starpniekservera iestatījumi</translation>
 <translation id="3101709781009526431">Datums un laiks</translation>
+<translation id="3114411414586006215">Šī politika kontrolē to vietņu sarakstu, kuras nekad nepārslēgs pārlūkprogrammu.
+
+      Ņemiet vērā, ka elementus var pievienot šim sarakstam, izmantojot arī politiku <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.
+
+      Ja šī politika nav iestatīta, sarakstam nepievieno nevienu vietni.
+
+      Ja šī politika ir iestatīta, katrs vienums tiek uzskatīts par kārtulu, kas līdzinās politikai <ph name="URL_LIST_POLICY_NAME" />. Tomēr loģika ir pretēja: atbilstošās kārtulas neatver citu pārlūkprogrammu.
+
+      Pretēji politikai <ph name="URL_LIST_POLICY_NAME" /> kārtulas tiek lietotas abos virzienos: ja pārlūkprogrammas Internet Explorer papildinājums ir iespējots, tas kontrolē arī to, vai pārlūkprogrammai <ph name="IE_PRODUCT_NAME" /> attiecīgie vietrāži URL ir jāatver arī pārlūkprogrammā <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3117676313396757089">Brīdinājums: DHE tiks pilnībā noņemts no <ph name="PRODUCT_NAME" /> pēc 57. versijas (aptuveni 2017. gada martā), un šī politika vairs nebūs spēkā.
 
       Ja politika nav iestatīta vai ir iestatīta vērtība Nepatiesa, DHE šifra komplekti standartā TLS netiks iespējoti. Politikai var iestatīt vērtību Patiesa, lai iespējotu DHE šifra komplektus un saglabātu saderību ar novecojušu serveri. Tas ir pagaidu risinājums, un serveris ir jākonfigurē atkārtoti.
@@ -1430,6 +1440,17 @@
 <translation id="3550875587920006460">Šī politika ļauj iestatīt pielāgotu grafiku atjauninājumu pieejamības pārbaudēm. Tā attiecas uz visiem ierīces lietotājiem un saskarnēm. Kad grafiks būs iestatīts, atjauninājumu pieejamība ierīcē tiks pārbaudīta saskaņā ar grafiku. Lai atceltu turpmāk ieplānotas atjauninājumu pieejamības pārbaudes, politika jānoņem.</translation>
 <translation id="355118380775352753">Vietnes, kas atveramas citā pārlūkprogrammā</translation>
 <translation id="3554984410014457319">Atļaut Google asistentam noklausīties balss aktivizēšanas frāzi</translation>
+<translation id="3557208865710006939">Piespiedu kārtā iespējo pareizrakstības pārbaudes valodas. Tiks ignorētas sarakstā iekļautās neatpazītās valodas.
+
+      Ja iespējosiet šo politiku, pareizrakstības pārbaude tiks iespējota gan norādītajām valodām, gan tām valodām, kurām lietotājs ir iespējojis pareizrakstības pārbaudi.
+
+      Ja šī politika nav iestatīta vai tā tiek atspējota, lietotāja pareizrakstības pārbaudes preferencēs netiek ieviestas izmaiņas.
+
+      Ja politikai <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> ir iestatīta vērtība “False”, šī politika nedarbojas.
+
+      Ja valoda ir ietverta gan šajā politikā, gan politikā <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" />, prioritāte ir šai politikai un pareizrakstības pārbaudes valoda tiek iespējota.
+
+      Pašreiz atbalstītās valodas: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="356579196325389849">Lietotāji var konfigurēt Chrome OS laidiena versiju</translation>
 <translation id="3575011234198230041">HTTP autentificēšana</translation>
 <translation id="3577251398714997599">Reklāmu iestatījumi vietnēm, kurās tiek rādītas traucējošas reklāmas</translation>
@@ -1780,6 +1801,9 @@
           Ja iestatīsiet šo politiku, lietotāji nevarēs to mainīt un ignorēt.
 
           Ja šī politika nav iestatīta, taustiņu ķēde sākotnēji būs atspējota, taču lietotājs var jebkurā brīdī to iespējot.</translation>
+<translation id="4171331498167688968">Ja politikai ir iestatīta vērtība “False”, trešās puses programmatūra pārlūkprogrammas Chrome procesos varēs ievietot izpildāmo kodu. Ja politikai nav iestatīta vērtība vai ir iestatīta vērtība “True”, trešās puses programmatūrai tiek liegts ievietot izpildāmo kodu pārlūkprogrammas Chrome procesos.
+
+      Neatkarīgi no šai politikai iestatītās vērtības šobrīd pārlūkprogrammā netiks bloķēta trešās puses programmatūras iespēja ievietot izpildāmu kodu tās procesos ierīcē, kas ir pievienota domēnam <ph name="MS_AD_NAME" />.</translation>
 <translation id="4183229833636799228">Spraudņa <ph name="FLASH_PLUGIN_NAME" /> noklusējuma iestatījums</translation>
 <translation id="4192388905594723944">Vietrādis URL attālās piekļuves klienta autentifikācijas pilnvaras apstiprināšanai</translation>
 <translation id="4203389617541558220">Ierobežojiet ierīces darbspējas laiku, plānojot automātiskas atkārtotas palaišanas gadījumus.
@@ -2147,6 +2171,7 @@
           Šī politika ir pieejama tikai Windows instancēs, kas ir savienotas ar <ph name="MS_AD_NAME" /> domēnu, vai Windows 10 Pro vai Enterprise instancēs, kas ir reģistrētas ierīču pārvaldībai.</translation>
 <translation id="5085647276663819155">Atspējot drukas priekšskatījumu</translation>
 <translation id="5090209345759901501">Izvērst Flash satura iestatījumu visam saturam</translation>
+<translation id="5090791951240382356">Ļaut apvienot vārdnīcu politikas no dažādiem avotiem</translation>
 <translation id="5093540029655764852">Šī politika nosaka, cik bieži (izsakot dienās) klientdators maina datora konta paroli. Paroli ģenerē klientdators pēc nejaušības principa, un tā nav redzama lietotājam.
 
       Datoru paroles ir regulāri jāmaina, tāpat kā lietotāju paroles. Šīs politikas atspējošana vai liela dienu skaita iestatīšana var negatīvi ietekmēt drošību, jo tādā gadījumā potenciālajiem uzbrucējiem ir vairāk laika, lai atrastu datora konta paroli un to izmantotu.
@@ -3079,6 +3104,17 @@
 <translation id="6923366716660828830">Norāda noklusējuma meklētājprogrammas nosaukumu. Ja nekas nav ievadīts vai šī politika nav iestatīta, tiks lietots ar meklēšanas URL norādītais saimniekdatora nosaukums.
 
           Šī politika tiek ievērota tikai tad, ja ir iespējota politika DefaultSearchProviderEnabled.</translation>
+<translation id="6924223708804692571">Piespiedu kārtā atspējo pareizrakstības pārbaudes valodas. Tiks ignorētas sarakstā iekļautas neatpazītas valodas.
+
+      Ja iespējosiet šo politiku, pareizrakstības pārbaude norādītajās valodās tiks atspējota. Lietotājs joprojām var iespējot vai atspējot pareizrakstības pārbaudi valodās, kas nav iekļautas sarakstā.
+
+      Ja šī politika nav iestatīta vai tā tiek atspējota, lietotāja pareizrakstības pārbaudes preferencēs netiek ieviestas izmaiņas.
+
+      Ja politikai <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> ir iestatīta vērtība “False”, šī politika nedarbojas.
+
+      Ja valoda ir iekļauta šajā politikā un politikā <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, šai politikai nav prioritātes un pareizrakstības pārbaudes valoda tiek iespējota.
+
+      Pašreiz atbalstītās valodas: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Iespējot garmalu divpusējo drukāšanu</translation>
 <translation id="6931242315485576290">Atspējo datu sinhronizāciju ar Google</translation>
 <translation id="6936894225179401731">Norāda maksimālo vienlaicīgo savienojumu skaitu ar starpniekserveri.
@@ -3228,6 +3264,15 @@
       Konfigurējot šo politiku, lietojumprogrammu kopa tiek fiksēta un lietotājs to nevar mainīt.
 
       Ja šī politika netiek iestatīta, lietotājs var mainīt piesprausto lietotņu sarakstu palaišanas lapā.</translation>
+<translation id="713121532817834879">Šī politika ir vietrādis URL, kas norāda uz XML failu tādā pašā formātā kā Internet Explorer politika <ph name="IEEM_SITELIST_POLICY" />. Kārtulas tiek ielādētas no XML faila, nekopīgojot šīs kārtulas ar pārlūkprogrammu Internet Explorer.
+
+      Šī XML faila kārtulas tiek lietotas tāpat kā politika <ph name="GREYLIST_POLICY_NAME" />. Tas nozīmē, ka šīs kārtulas novērš citas pārlūkprogrammas atvēršanu produktā <ph name="PRODUCT_NAME" />, kā arī produkta <ph name="PRODUCT_NAME" /> atvēršanu citā pārlūkprogrammā.
+
+      Ja šī politika nav iestatīta vai tai nav iestatīts derīgs URL, produktā <ph name="PRODUCT_NAME" /> tā netiek izmantota kā kārtulu avots un netiek aktivizēta pārlūkprogrammas pārslēgšana.
+
+      Ja šai politikai ir iestatīts derīgs URL, produktā <ph name="PRODUCT_NAME" /> tiek lejupielādēts vietņu saraksts no attiecīgā URL un tiek lietotas attiecīgās kārtulas tā, it kā tās būtu konfigurētas politikai <ph name="SITELIST_POLICY_NAME" />.
+
+      Plašāku informāciju par Internet Explorer politiku <ph name="IEEM_SITELIST_POLICY" /> skatiet vietnē https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7132877481099023201">Vietrāži URL, kuriem tiks nodrošināta piekļuve video tveršanas ierīcēm bez uzvednes parādīšanas.</translation>
 <translation id="7138678301420049075">Cits</translation>
 <translation id="7140629953254369759">Norāda <ph name="PRODUCT_OS_NAME" /> lietotājam izmantot uzdevumu plānotāja konfigurāciju, kas noteikta norādītajā nosaukumā.
@@ -3276,6 +3321,15 @@
           Automātiska atskaņošana ir atļauta tikai tiem domēniem, kas skaidri norādīti politikā <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" />. Ja vēlaties iespējot automātisko atskaņošanu visām vietnēm, pievienojiet šim sarakstam http://* un https://*.
 
           Ja šī politika nav iestatīta, lietotājs varēs mainīt šo iestatījumu manuāli.</translation>
+<translation id="7222749588229362483">Ļauj apvienot atlasītās politikas, ja tās ir no dažādiem avotiem, bet ar vienādiem tvērumiem un līmeni.
+
+        Tiek apvienotas vārdnīcas pirmā līmeņa atslēgas no katra avota. Ja rodas konflikts starp atslēgām, tiek lietota atslēga no avota, kam ir visaugstākā prioritāte.
+
+        Ja politika ir sarakstā un ja rodas konflikts starp diviem avotiem, ņemot vērā to, ka politikām ir vienādi tvērumi un līmenis, vērtības tiek apvienotas jaunā politiku vārdnīcā.
+
+        Ja politika ir sarakstā un ja rodas konflikts starp diviem avotiem, bet politikām ir dažādi tvērumi un/vai līmenis, tiek lietota politika ar visaugstāko prioritāti.
+
+        Ja politika nav sarakstā un ja rodas konflikts starp diviem avotiem, tvērumiem un/vai līmeni, tiek lietota politika ar visaugstāko prioritāti.</translation>
 <translation id="7229975860249300121">Satur parastu izteiksmi, kas tiek izmantota, lai noteiktu, kuri Google konti var tikt iestatīti kā pārlūka primārie konti produktam <ph name="PRODUCT_NAME" /> (piemēram, konts, kas ir atlasīts sinhronizācijas izvēles plūsmā).
 
       Ja lietotājs mēģina iestatīt pārlūka primāro kontu, izmantojot lietotājvārdu, kas neatbilst paraugam, tiek parādīts atbilstošs kļūdas ziņojums.
@@ -3910,6 +3964,12 @@
 
       Ja politikai ir iestatīta vērtība “Replace”, lietotāja politika no lietotāja GPO tiek aizstāta ar lietotāja politiku no datora GPO (lietotāja GPO tiek ignorēti).</translation>
 <translation id="8465065632133292531">Parametri dinamiskās meklēšanas vietrādim URL, kurā izmantota metode POST</translation>
+<translation id="8465746466645315861">Ja šī politika nav iestatīta, lietotājs var iespējot vai atspējot pareizrakstības pārbaudi valodas iestatījumos.
+
+      Ja šai politikai ir iestatīta vērtība “True”, pareizrakstības pārbaude ir iespējota un lietotājs nevar to atspējot. Operētājsistēmās <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> un <ph name="LINUX_OS_NAME" /> pareizrakstības pārbaudes valodas var atsevišķi ieslēgt vai izslēgt, tādējādi lietotājs joprojām var atspējot pareizrakstības pārbaudi, izslēdzot katru pareizrakstības pārbaudes valodu. Lai to nepieļautu, ar politikas <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> palīdzību var piespiedu kārtā iespējot konkrētas pareizrakstības pārbaudes valodas.
+
+      Ja šai politikai ir iespējota vērtība “False”, pareizrakstības pārbaude ir atspējota un lietotājs nevar to iespējot. Ja šai politikai ir iestatīta vērtība “False”, politikas <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> un <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> nedarbojas.
+      </translation>
 <translation id="847472800012384958">Neļaut nevienai vietnei rādīt uznirstošos logus</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
 <translation id="8483004350080020634">Noņem no vietrāžiem URL protokola https:// daļas, kurās ietverta neizpaužama konfidencialitātes un drošības informācija, pirms to nodošanas PAC (Proxy Auto Config — starpniekservera automātiskā konfigurēšana) skriptiem, ko izmanto <ph name="PRODUCT_NAME" /> starpniekservera atrisināšanas laikā.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index e218613..aa420b9 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -1042,6 +1042,7 @@
       Jeśli zasada AutoplayAllowed ma wartość Fałsz, dozwolone jest odtwarzanie filmów z adresów URL pasujących do wzorców ustawionych w tej zasadzie.
 
       Uwaga: jeśli <ph name="PRODUCT_NAME" /> jest uruchomiony w momencie zmiany konfiguracji tej zasady, nowa konfiguracja zostanie zastosowana tylko do nowo otwartych kart. Z tego powodu na niektórych kartach może obowiązywać poprzednia konfiguracja.</translation>
+<translation id="284288632677954003">URL pliku XML zawierającego adresy URL, które nigdy nie powinny powodować zmiany przeglądarki.</translation>
 <translation id="285480231336205327">Włącz tryb wysokiego kontrastu</translation>
 <translation id="2854919890879212089">Sprawia, że w podglądzie wydruku w <ph name="PRODUCT_NAME" /> zostanie wybrana domyślna drukarka systemowa, a nie ostatnio użyta.
 
@@ -1209,6 +1210,15 @@
 <translation id="3096595567015595053">Lista włączonych wtyczek</translation>
 <translation id="3101501961102569744">Wybierz sposób określenia ustawień serwera proxy</translation>
 <translation id="3101709781009526431">Data i godzina</translation>
+<translation id="3114411414586006215">Ta zasada kontroluje listę stron, które nigdy nie będą powodować zmiany przeglądarki.
+
+      Pamiętaj, że pozycje do tej listy można też dodawać za pomocą zasady <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.
+
+      Jeśli ta zasada jest nieskonfigurowana, żadne strony nie będą dodawane do listy.
+
+      Jeśli ta zasada jest skonfigurowana, każdy element jest traktowany jako reguła, podobnie jak w zasadzie <ph name="URL_LIST_POLICY_NAME" />. Logika działania jest odwrotna: dopasowanie do reguły powoduje, że alternatywna przeglądarka nie zostanie otwarta.
+
+      W odróżnieniu od zasady <ph name="URL_LIST_POLICY_NAME" /> reguły są stosowane w obu kierunkach: gdy zainstalowany i włączony jest dodatek do Internet Explorera, reguły określają też, czy <ph name="IE_PRODUCT_NAME" /> ma otwierać te adresy URL w <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3117676313396757089">Ostrzeżenie: DHE zostanie całkowicie usunięty z <ph name="PRODUCT_NAME" /> po wersji 57 (około marca 2017 r.) i wtedy ta zasada przestanie działać.
 
       Jeśli ta zasada nie jest ustawiona lub jest wyłączona, mechanizmy szyfrowania DHE w TLS będą wyłączone. Można ją włączyć, by mechanizmy szyfrowania pozostały aktywne oraz w celu zachowania zgodności z przestarzałym serwerem. Jest to rozwiązanie tymczasowe i konieczna jest zmiana konfiguracji serwera.
@@ -1402,6 +1412,17 @@
 <translation id="3550875587920006460">Umożliwia ustawienie niestandardowego harmonogramu sprawdzania dostępności aktualizacji. Dotyczy to wszystkich użytkowników oraz wszystkich interfejsów na urządzeniu. Po skonfigurowaniu zasady urządzenie sprawdza dostępność aktualizacji zgodnie z harmonogramem. Aby anulować kolejne zaplanowane sprawdzanie dostępności aktualizacji, musisz usunąć tę zasadę.</translation>
 <translation id="355118380775352753">Witryny otwierane w alternatywnej przeglądarce</translation>
 <translation id="3554984410014457319">Zezwól Asystentowi Google nasłuchiwać wyrażenia aktywującego obsługę komend głosowych</translation>
+<translation id="3557208865710006939">Wymusza włączenie sprawdzania pisowni w wybranych językach. Nierozpoznane języki z tej listy będą ignorowane.
+
+      Jeśli ta zasada jest włączona, sprawdzanie pisowni będzie dostępne także w wybranych językach, a nie tylko w tych, dla których funkcję tę włączył użytkownik.
+
+      Jeśli nie skonfigurujesz tej zasady lub ją wyłączysz, nic nie zmieni się w ustawieniach użytkownika dotyczących sprawdzania pisowni.
+
+      Jeśli zasada <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> ma wartość Fałsz, ta zasada nie ma żadnych skutków.
+
+      Jeśli dany język występuje na liście zarówno w tej zasadzie, jak i w zasadzie <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" />, ta zasada ma priorytet i sprawdzanie pisowni w tym języku będzie włączone.
+
+      Aktualnie obsługiwane języki: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk oraz vi.</translation>
 <translation id="356579196325389849">Użytkownicy mogą skonfigurować kanał wersji Chrome OS</translation>
 <translation id="3575011234198230041">Uwierzytelnianie HTTP</translation>
 <translation id="3577251398714997599">Ustawienia reklam dla stron zawierających uciążliwe reklamy</translation>
@@ -1743,6 +1764,9 @@
           Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić.
 
           Jeśli ta zasada jest nieskonfigurowana, klawisze trwałe są początkowo wyłączone, ale użytkownik może je swobodnie włączyć.</translation>
+<translation id="4171331498167688968">Jeśli ta zasada ma ustawienie Fałsz, oprogramowanie innych firm będzie mogło wstrzykiwać kod wykonywalny do procesów Chrome. Jeśli ta zasada jest nieskonfigurowana lub ma ustawienie Prawda, oprogramowanie innych firm nie będzie mogło wstrzykiwać takiego kodu do procesów Chrome.
+
+      Bez względu na wartość tej zasady obecnie przeglądarka nie blokuje wstrzykiwania kodu wykonywalnego na komputerach dołączonych do domeny <ph name="MS_AD_NAME" />.</translation>
 <translation id="4183229833636799228">Domyślne ustawienie wtyczki <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="4192388905594723944">URL pozwalający zweryfikować token uwierzytelniania klienta dostępu zdalnego</translation>
 <translation id="4203389617541558220">Ogranicza czas działania urządzenia przez planowanie automatycznych ponownych uruchomień.
@@ -2100,6 +2124,7 @@
           Ta zasada jest dostępna tylko w wystąpieniach systemu Windows, które należą do domeny <ph name="MS_AD_NAME" />, oraz w wystąpieniach systemu Windows 10 Pro lub Enterprise zarejestrowanych w funkcji zarządzania urządzeniami.</translation>
 <translation id="5085647276663819155">Wyłącz podgląd wydruku</translation>
 <translation id="5090209345759901501">Rozszerz ustawienie treści Flash na całą zawartość</translation>
+<translation id="5090791951240382356">Zezwól na scalanie zasad słownikowych z różnych źródeł</translation>
 <translation id="5093540029655764852">Określa częstotliwość (w dniach), z którą klient zmienia hasło do swojego konta komputera. Hasło jest generowane losowo przez klienta i niewidoczne dla użytkownika.
 
       Hasła do kont komputerów należy zmieniać regularnie tak samo jak hasła do kont użytkowników. Wyłączenie tej zasady lub ustawienie dużej liczby dni może obniżyć bezpieczeństwo, ponieważ daje potencjalnym napastnikom więcej czasu na odkrycie i wykorzystanie hasła do konta komputera.
@@ -3007,6 +3032,17 @@
       </translation>
 <translation id="6922884955650325312">Blokuj wtyczkę <ph name="FLASH_PLUGIN_NAME" /></translation>
 <translation id="6923366716660828830">Określa nazwę domyślnego dostawcy wyszukiwania. Jeśli ta zasada pozostanie pusta lub nieskonfigurowana, będzie używana nazwa hosta określona w URL-u wyszukiwarki. Ta zasada jest uwzględniana tylko przy włączonej zasadzie „DefaultSearchProviderEnabled”.</translation>
+<translation id="6924223708804692571">Wymusza wyłączenie sprawdzania pisowni w wybranych językach. Nierozpoznane języki z tej listy będą ignorowane.
+
+      Po włączeniu tej zasady sprawdzanie pisowni będzie wyłączone w wybranych językach. Użytkownik może nadal włączać i wyłączać sprawdzanie pisowni dla języków, których nie ma na liście.
+
+      Jeśli nie skonfigurujesz tej zasady lub ją wyłączysz, nic nie zmieni się w ustawieniach użytkownika dotyczących sprawdzania pisowni.
+
+      Jeśli zasada <ph name="SPELLCHECK_ENABLED_POLICY_NAME" /> ma wartość Fałsz, ta zasada nie ma żadnych skutków.
+
+      Jeśli dany język występuje na liście zarówno w tej zasadzie, jak i w zasadzie <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />, priorytet ma ta druga i język będzie włączony.
+
+      Aktualnie obsługiwane języki: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk oraz vi.</translation>
 <translation id="6926703471186170050">Włącz drukowanie dwustronne względem długiej krawędzi</translation>
 <translation id="6931242315485576290">Wyłącz synchronizację danych z Google</translation>
 <translation id="6936894225179401731">Określa maksymalną liczbę jednoczesnych połączeń z serwerem proxy. Niektóre serwery proxy nie są w stanie obsłużyć dużej liczby jednoczesnych połączeń z tym samym klientem. W takiej sytuacji można rozwiązać problem, ustawiając dla tej zasady mniejszą wartość. Jej wartość powinna być mniejsza niż 100 i większa niż 6. Wartość domyślna wynosi 32. Niektóre aplikacje sieciowe używają wielu połączeń z oczekującymi żądaniami GET, dlatego zmniejszenie wartości tej zasady poniżej wartości 32 może powodować przerwy w działaniu sieci, jeśli zbyt wiele takich aplikacji będzie otwartych. Zmniejszasz wartości domyślne na własne ryzyko. W przypadku nieskonfigurowania tej zasady będzie używana wartość domyślna, czyli 32.</translation>
@@ -3135,6 +3171,15 @@
       Jeśli ta zasada jest skonfigurowana, zestaw aplikacji jest ustalony i nie może być zmieniany przez użytkownika.
 
       Jeśli zasada nie jest ustawiona, użytkownik może zmieniać listę aplikacji przypiętych w programie uruchamiającym.</translation>
+<translation id="713121532817834879">Ta zasada jest adresem URL, który wskazuje plik XML w formacie zgodnym z zasadą <ph name="IEEM_SITELIST_POLICY" /> w Internet Explorerze. Powoduje wczytanie reguł z pliku XML bez udostępniania ich Internet Explorerowi.
+
+      Reguły z tego pliku XML są stosowane w taki sam sposób jak zasada <ph name="GREYLIST_POLICY_NAME" />. Reguły uniemożliwiają <ph name="PRODUCT_NAME" /> otwieranie alternatywnej przeglądarki, a także uniemożliwiają alternatywnej przeglądarce otwieranie <ph name="PRODUCT_NAME" />.
+
+      Gdy ta zasada jest nieskonfigurowana lub jej wartością nie jest prawidłowy URL, <ph name="PRODUCT_NAME" /> nie używa jej jako źródła reguł blokujących zmianę przeglądarki.
+
+      Jeśli w tej zasadzie podany jest prawidłowy adres URL, <ph name="PRODUCT_NAME" /> pobiera z niego listę stron i stosuje reguły, jak gdyby zostały one skonfigurowane za pomocą zasady <ph name="SITELIST_POLICY_NAME" />.
+
+      Więcej informacji o zasadzie <ph name="IEEM_SITELIST_POLICY" /> w Internet Explorerze: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation>
 <translation id="7132877481099023201">Adresy URL, które bez pytania otrzymają dostęp do urządzeń do nagrywania filmów</translation>
 <translation id="7138678301420049075">Inne</translation>
 <translation id="7140629953254369759">Nakazuje systemowi <ph name="PRODUCT_OS_NAME" /> używać konfiguracji szeregowania zadań o podanej nazwie.
@@ -3182,6 +3227,15 @@
           Automatyczne odtwarzanie jest dozwolone tylko w domenach bezpośrednio wskazanych w zasadzie <ph name="PLUGINS_ALLOWED_FOR_URLS_POLICY_NAME" />. Jeśli chcesz zezwolić na automatyczne odtwarzanie we wszystkich witrynach, dodaj do tej listy http://* i https://*.
 
           Jeśli ta zasada nie jest ustawiona, użytkownik może zmienić to ustawienie ręcznie.</translation>
+<translation id="7222749588229362483">Zezwala na scalanie wybranych zasad, które pochodzą z różnych źródeł, a mają te same zakresy i poziom.
+
+        Scalanie polega na połączeniu pierwszopoziomowych kluczy słowników z poszczególnych źródeł. W przypadku konfliktu między kluczami zastosowany zostanie klucz ze źródła o najwyższym priorytecie.
+
+        Jeśli zasada znajduje się na liście, to w przypadku konfliktu między dwoma źródłami, które mają te same zakresy i poziom, wartości zostaną scalone w nowy słownik zasad.
+
+        Jeśli zasada znajduje się na liście, to w przypadku konfliktu między dwoma źródłami, które mają różne zakresy lub poziom, zostanie zastosowana zasada o najwyższym priorytecie.
+
+        Jeśli zasada nie znajduje się na liście, to w przypadku konfliktu między źródłami, zakresami lub poziomem zostanie zastosowana zasada o najwyższym priorytecie.</translation>
 <translation id="7229975860249300121">Zawiera wyrażenie regularne określające, które konta Google można ustawić jako konta podstawowe przeglądarki w <ph name="PRODUCT_NAME" /> (czyli konta, które można wybrać podczas włączania synchronizacji).
 
       Gdy użytkownik spróbuje ustawić konto podstawowe przeglądarki o nazwie, która nie pasuje do tego wzorca, wyświetli się odpowiedni komunikat o błędzie.
@@ -3804,6 +3858,12 @@
 
       Jeśli zasada ma ustawioną opcję „Zastąp”, zasady dotyczące użytkowników z obiektów użytkownika są zastępowane zasadami z obiektów komputera (obiekty zasad grupy użytkownika są ignorowane).</translation>
 <translation id="8465065632133292531">Parametry dla URL-i dynamicznych używających POST</translation>
+<translation id="8465746466645315861">Jeśli ta zasada jest nieskonfigurowana, użytkownik może włączyć lub wyłączyć sprawdzanie pisowni w ustawieniach języka.
+
+      Jeśli zasada ma wartość Prawda, sprawdzanie pisowni jest włączone, a użytkownik nie może go wyłączyć. W systemach <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> i <ph name="LINUX_OS_NAME" /> można włączać i wyłączać poszczególne języki sprawdzania pisowni, więc użytkownik może wyłączyć sprawdzanie pisowni przez wyłączenie wszystkich języków. Aby to uniemożliwić, można za pomocą zasady <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> wymusić włączenie określonych języków.
+
+      Jeśli ta zasada ma wartość Fałsz, sprawdzanie pisowni jest wyłączone, a użytkownik nie może go włączyć. Gdy ta zasada ma wartość Fałsz, zasady <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> i <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME" /> nie mają żadnych skutków.
+      </translation>
 <translation id="847472800012384958">Nie zezwalaj na pokazywanie wyskakujących okienek w żadnej witrynie</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
 <translation id="8483004350080020634">Wycina poufne pod względem prywatności i bezpieczeństwa fragmenty adresów URL https:// przed przekazaniem tych adresów do skryptów PAC (Proxy Auto Config), których <ph name="PRODUCT_NAME" /> używa podczas rozpoznawania serwerów proxy.
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index b6e6af1..a588b87c 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -3492,7 +3492,7 @@
 <translation id="7750991880413385988">కొత్త‌ ట్యాబ్ పేజీని తెరవండి</translation>
 <translation id="7754704193130578113">ప్రతి ఫైల్‌ను డౌన్‌లోడ్ చేసే ముందు ఎక్కడ సేవ్ చేయాలో అడుగు</translation>
 <translation id="7761446981238915769">లాగిన్ స్క్రీన్‌లో ఇన్‌స్టాల్ చేసిన యాప్‌ల జాబితాను కాన్ఫిగర్ చేయండి</translation>
-<translation id="7763479091692861127"> OS అప్‌డేట్‌ల కోసం ఉపయోగించడానికి అనుమతించబడిన కనెక్షన్‌ల రకాలు. OS అప్‌డేట్‌లు వాటి పరిమాణం కారణంగా కనెక్షన్‌‌పై తీవ్ర ఒత్తిడిని క‌లిగించే అవ‌కాశం ఉంది. అదనపు ఖర్చు కావచ్చు. అందువ‌ల్ల‌, ప్రస్తుతం ఇవి డిఫాల్ట్‌గా WiMax, Bluetooth మరియు Cellular వంటి ఖరీదైనవిగా భావించే కనెక్షన్‌ల రకాల కోసం ప్రారంభించబడదు.
+<translation id="7763479091692861127">OS అప్‌డేట్‌ల కోసం ఉపయోగించడానికి అనుమతించబడిన కనెక్షన్‌ల రకాలు. OS అప్‌డేట్‌లు వాటి పరిమాణం కారణంగా కనెక్షన్‌‌పై తీవ్ర ఒత్తిడిని క‌లిగించే అవ‌కాశం ఉంది. అదనపు ఖర్చు కావచ్చు. అందువ‌ల్ల‌, ప్రస్తుతం ఇవి డిఫాల్ట్‌గా WiMax, బ్లూటూత్‌ మరియు సెల్యులార్‌ వంటి ఖరీదైనవిగా భావించే కనెక్షన్‌ల రకాల కోసం ప్రారంభించబడదు.
 
       "ethernet", "wifi", "wimax", "bluetooth" మరియు "cellular" గుర్తింపు పొందిన కనెక్షన్ రకం ఐడెంటిఫైయర్‌‌లు.</translation>
 <translation id="7763614521440615342">కొత్త ట్యాబ్ పేజీలో కంటెంట్ సూచనలను చూపుతుంది</translation>
diff --git a/components/services/quarantine/BUILD.gn b/components/services/quarantine/BUILD.gn
index 7c08ccb..9a1309a7a 100644
--- a/components/services/quarantine/BUILD.gn
+++ b/components/services/quarantine/BUILD.gn
@@ -2,12 +2,22 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chromecast_build.gni")
+
+if (is_android) {
+  import("//build/config/android/rules.gni")
+}
+
 static_library("quarantine") {
   sources = [
+    "quarantine.cc",
+    "quarantine.h",
     "quarantine_impl.cc",
     "quarantine_impl.h",
+    "quarantine_mac.mm",
     "quarantine_service.cc",
     "quarantine_service.h",
+    "quarantine_win.cc",
   ]
 
   if (is_win) {
@@ -22,6 +32,97 @@
   ]
 
   deps = [
+    ":common",
+    "//base",
+    "//net",
     "//services/service_manager/public/cpp",
+    "//url",
   ]
+
+  if (is_mac) {
+    libs = [
+      "Carbon.framework",
+      "Foundation.framework",
+    ]
+  }
+}
+
+source_set("common") {
+  sources = [
+    "common_mac.h",
+    "common_mac.mm",
+    "common_win.cc",
+    "common_win.h",
+  ]
+
+  deps = [
+    "//base",
+  ]
+
+  if (is_mac) {
+    libs = [
+      "Carbon.framework",
+      "Foundation.framework",
+    ]
+  }
+}
+
+source_set("test_support") {
+  testonly = true
+
+  sources = [
+    "test_support.cc",
+    "test_support.h",
+    "test_support_mac.mm",
+    "test_support_win.cc",
+  ]
+
+  deps = [
+    ":common",
+    ":quarantine",
+    "//base",
+    "//url",
+  ]
+
+  if (is_mac) {
+    libs = [
+      "Carbon.framework",
+      "Foundation.framework",
+    ]
+  }
+}
+
+source_set("unit_tests") {
+  testonly = true
+
+  sources = [
+    "quarantine_mac_unittest.mm",
+    "quarantine_win_unittest.cc",
+  ]
+
+  # Chromecasts do not have extended attributes enabled; even if it were
+  # enabled, the devices use tmpfs which restricts the extended attributes that
+  # can be set such that quarantining still would not work. (The platform
+  # specific tests include a runtime guard to skip tests that need xattr.)
+  if (!is_chromecast) {
+    sources += [ "quarantine_unittest.cc" ]
+  }
+
+  deps = [
+    ":common",
+    ":quarantine",
+    ":test_support",
+    "//base",
+    "//base/test:test_support",
+    "//net",
+    "//testing/gtest",
+    "//url",
+  ]
+
+  if (is_mac) {
+    libs = [
+      "Carbon.framework",
+      "Foundation.framework",
+    ]
+  }
 }
diff --git a/components/services/quarantine/DEPS b/components/services/quarantine/DEPS
new file mode 100644
index 0000000..9d3031f
--- /dev/null
+++ b/components/services/quarantine/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+net/base/filename_util.h",
+]
diff --git a/components/download/quarantine/common_mac.h b/components/services/quarantine/common_mac.h
similarity index 65%
rename from components/download/quarantine/common_mac.h
rename to components/services/quarantine/common_mac.h
index 179bb13..aaff0c8 100644
--- a/components/download/quarantine/common_mac.h
+++ b/components/services/quarantine/common_mac.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_DOWNLOAD_QUARANTINE_COMMON_MAC_H_
-#define COMPONENTS_DOWNLOAD_QUARANTINE_COMMON_MAC_H_
+#ifndef COMPONENTS_SERVICES_QUARANTINE_COMMON_MAC_H_
+#define COMPONENTS_SERVICES_QUARANTINE_COMMON_MAC_H_
 
 #import <Foundation/Foundation.h>
 
@@ -13,12 +13,12 @@
 class FilePath;
 }
 
-namespace download {
+namespace quarantine {
 
 bool GetQuarantineProperties(
     const base::FilePath& file,
     base::scoped_nsobject<NSMutableDictionary>* properties);
 
-}  // namespace download
+}  // namespace quarantine
 
-#endif  // COMPONENTS_DOWNLOAD_QUARANTINE_COMMON_MAC_H_
+#endif  // COMPONENTS_SERVICES_QUARANTINE_COMMON_MAC_H_
diff --git a/components/download/quarantine/common_mac.mm b/components/services/quarantine/common_mac.mm
similarity index 94%
rename from components/download/quarantine/common_mac.mm
rename to components/services/quarantine/common_mac.mm
index a8ccaeba..0f10f3f 100644
--- a/components/download/quarantine/common_mac.mm
+++ b/components/services/quarantine/common_mac.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/common_mac.h"
+#include "components/services/quarantine/common_mac.h"
 
 #import <ApplicationServices/ApplicationServices.h>
 
@@ -15,7 +15,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/strings/sys_string_conversions.h"
 
-namespace download {
+namespace quarantine {
 
 bool GetQuarantineProperties(
     const base::FilePath& file,
@@ -53,4 +53,4 @@
   return true;
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/common_win.cc b/components/services/quarantine/common_win.cc
similarity index 74%
rename from components/download/quarantine/common_win.cc
rename to components/services/quarantine/common_win.cc
index f9d5cd9..de9af3a 100644
--- a/components/download/quarantine/common_win.cc
+++ b/components/services/quarantine/common_win.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 "components/download/quarantine/common_win.h"
+#include "components/services/quarantine/common_win.h"
 
-namespace download {
+namespace quarantine {
 
 // [MS-FSCC] Section 5.6.1
 const base::FilePath::CharType kZoneIdentifierStreamSuffix[] =
     FILE_PATH_LITERAL(":Zone.Identifier");
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/services/quarantine/common_win.h b/components/services/quarantine/common_win.h
new file mode 100644
index 0000000..01210fb
--- /dev/null
+++ b/components/services/quarantine/common_win.h
@@ -0,0 +1,16 @@
+// Copyright 2018 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_SERVICES_QUARANTINE_COMMON_WIN_H_
+#define COMPONENTS_SERVICES_QUARANTINE_COMMON_WIN_H_
+
+#include "base/files/file_path.h"
+
+namespace quarantine {
+
+extern const base::FilePath::CharType kZoneIdentifierStreamSuffix[];
+
+}  // namespace quarantine
+
+#endif  // COMPONENTS_SERVICES_QUARANTINE_COMMON_WIN_H_
diff --git a/components/services/quarantine/quarantine.cc b/components/services/quarantine/quarantine.cc
new file mode 100644
index 0000000..ab1ca7f
--- /dev/null
+++ b/components/services/quarantine/quarantine.cc
@@ -0,0 +1,22 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/services/quarantine/quarantine.h"
+
+#include "build/build_config.h"
+
+#if !defined(OS_WIN) && !defined(OS_MACOSX)
+
+namespace quarantine {
+
+QuarantineFileResult QuarantineFile(const base::FilePath& file,
+                                    const GURL& source_url,
+                                    const GURL& referrer_url,
+                                    const std::string& client_guid) {
+  return QuarantineFileResult::OK;
+}
+
+}  // namespace quarantine
+
+#endif  // !WIN && !MAC
diff --git a/components/services/quarantine/quarantine.h b/components/services/quarantine/quarantine.h
new file mode 100644
index 0000000..18fd1db8
--- /dev/null
+++ b/components/services/quarantine/quarantine.h
@@ -0,0 +1,81 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SERVICES_QUARANTINE_QUARANTINE_H_
+#define COMPONENTS_SERVICES_QUARANTINE_QUARANTINE_H_
+
+#include <string>
+
+class GURL;
+
+namespace base {
+class FilePath;
+}
+
+namespace quarantine {
+
+// Return value for QuarantineFile.
+enum class QuarantineFileResult {
+  OK,             // Success.
+  ACCESS_DENIED,  // Access to the file was denied. The safety of the file could
+                  // not be determined.
+  BLOCKED_BY_POLICY,  // Downloads from |source_url| are not allowed by policy.
+                      // The file has been deleted.
+  ANNOTATION_FAILED,  // Unable to write the mark-of-the-web or otherwise
+                      // annotate the file as being downloaded from
+                      // |source_url|.
+  FILE_MISSING,       // |file| does not name a valid file.
+  SECURITY_CHECK_FAILED,  // An unknown error occurred while checking |file|.
+                          // The file may have been deleted.
+  VIRUS_INFECTED  // |file| was found to be infected by a virus and was deleted.
+};
+
+// Quarantine a file that was downloaded from the internet.
+//
+// Ensures that |file| is handled as safely as possible given that it was
+// downloaded from |source_url|. The details of how a downloaded file is handled
+// are platform dependent. Please refer to the individual quarantine_<os>
+// implementation.
+//
+// This function should be called for all files downloaded from the internet and
+// placed in a manner discoverable by the user, or exposed to an external
+// application. Furthermore, it should be called:
+//
+// * **AFTER** all the data has been written to the file. On Windows, registered
+//   anti-virus products will be invoked for scanning the contents of the file.
+//   Hence it's important to have the final contents of the file be available at
+//   the point at which this function is called.
+//
+//   Exception: Zero-length files will be handled solely on the basis of the
+//   |source_url| and the file type. This exception accommodates situations
+//   where the file contents cannot be determined before it is made visible to
+//   an external application.
+//
+// * **AFTER** the file has been renamed to its final name. The file type is
+//   significant and is derived from the filename.
+//
+// * **BEFORE** the file is made visible to an external application or the user.
+//   Security checks and mark-of-the-web annotations must be made prior to
+//   exposing the file externally.
+//
+// Note that it is possible for this method to take a long time to complete
+// (several seconds or more). In addition to blocking during this time, this
+// delay also introduces a window during which a browser shutdown may leave the
+// downloaded file unannotated.
+//
+// Parameters:
+//   |file| : Final name of the file.
+//   |source_url|: URL from which the file content was downloaded. This is empty
+//     for off-the-record download.
+//   |referrer_url|: Referring URL. This is empty for off-the-record download.
+//   |client_guid|: Only used on Windows. Identifies the client application
+//     that downloaded the file.
+QuarantineFileResult QuarantineFile(const base::FilePath& file,
+                                    const GURL& source_url,
+                                    const GURL& referrer_url,
+                                    const std::string& client_guid);
+
+}  // namespace quarantine
+
+#endif  // COMPONENTS_SERVICES_QUARANTINE_QUARANTINE_H_
diff --git a/components/services/quarantine/quarantine_features_win.cc b/components/services/quarantine/quarantine_features_win.cc
index 5cf5649..381319cc 100644
--- a/components/services/quarantine/quarantine_features_win.cc
+++ b/components/services/quarantine/quarantine_features_win.cc
@@ -12,4 +12,10 @@
 const base::Feature kOutOfProcessQuarantine{"OutOfProcessQuarantine",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
+// This feature controls whether the InvokeAttachmentServices function will be
+// called. Has no effect on machines that are domain-joined, where the function
+// is always called.
+const base::Feature kInvokeAttachmentServices{"InvokeAttachmentServices",
+                                              base::FEATURE_ENABLED_BY_DEFAULT};
+
 }  // namespace quarantine
diff --git a/components/services/quarantine/quarantine_features_win.h b/components/services/quarantine/quarantine_features_win.h
index d45a989..3fa2560 100644
--- a/components/services/quarantine/quarantine_features_win.h
+++ b/components/services/quarantine/quarantine_features_win.h
@@ -11,6 +11,8 @@
 
 extern const base::Feature kOutOfProcessQuarantine;
 
+extern const base::Feature kInvokeAttachmentServices;
+
 }  // namespace quarantine
 
 #endif  // COMPONENTS_SERVICES_QUARANTINE_QUARANTINE_FEATURES_WIN_H_
diff --git a/components/download/quarantine/quarantine_mac.mm b/components/services/quarantine/quarantine_mac.mm
similarity index 97%
rename from components/download/quarantine/quarantine_mac.mm
rename to components/services/quarantine/quarantine_mac.mm
index 26b783a0..48b07f1 100644
--- a/components/download/quarantine/quarantine_mac.mm
+++ b/components/services/quarantine/quarantine_mac.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/quarantine.h"
+#include "components/services/quarantine/quarantine.h"
 
 #import <ApplicationServices/ApplicationServices.h>
 #import <Foundation/Foundation.h>
@@ -17,7 +17,7 @@
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/threading/scoped_blocking_call.h"
-#include "components/download/quarantine/common_mac.h"
+#include "components/services/quarantine/common_mac.h"
 #include "url/gurl.h"
 
 namespace {
@@ -44,7 +44,7 @@
 
 }  // namespace
 
-namespace download {
+namespace quarantine {
 
 namespace {
 
@@ -208,4 +208,4 @@
                               : QuarantineFileResult::ANNOTATION_FAILED;
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/quarantine_mac_unittest.mm b/components/services/quarantine/quarantine_mac_unittest.mm
similarity index 96%
rename from components/download/quarantine/quarantine_mac_unittest.mm
rename to components/services/quarantine/quarantine_mac_unittest.mm
index d37d5ee..dde7389 100644
--- a/components/download/quarantine/quarantine_mac_unittest.mm
+++ b/components/services/quarantine/quarantine_mac_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/quarantine.h"
+#include "components/services/quarantine/quarantine.h"
 
 #include <sys/xattr.h>
 
@@ -17,12 +17,12 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
-#include "components/download/quarantine/test_support.h"
+#include "components/services/quarantine/test_support.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
 #include "url/gurl.h"
 
-namespace download {
+namespace quarantine {
 namespace {
 
 class QuarantineMacTest : public testing::Test {
@@ -126,4 +126,4 @@
 }
 
 }  // namespace
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/quarantine_unittest.cc b/components/services/quarantine/quarantine_unittest.cc
similarity index 94%
rename from components/download/quarantine/quarantine_unittest.cc
rename to components/services/quarantine/quarantine_unittest.cc
index a70fd27e..6929217 100644
--- a/components/download/quarantine/quarantine_unittest.cc
+++ b/components/services/quarantine/quarantine_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/quarantine.h"
+#include "components/services/quarantine/quarantine.h"
 
 #include <iterator>
 #include <string>
@@ -14,7 +14,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-namespace download {
+namespace quarantine {
 
 namespace {
 
@@ -55,4 +55,4 @@
                            GURL(kInternetReferrerURL), std::string()));
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/quarantine_win.cc b/components/services/quarantine/quarantine_win.cc
similarity index 97%
rename from components/download/quarantine/quarantine_win.cc
rename to components/services/quarantine/quarantine_win.cc
index abc15034..fb754db 100644
--- a/components/download/quarantine/quarantine_win.cc
+++ b/components/services/quarantine/quarantine_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/quarantine.h"
+#include "components/services/quarantine/quarantine.h"
 
 #include <windows.h>
 #include <wrl/client.h>
@@ -30,11 +30,11 @@
 #include "base/win/scoped_handle.h"
 #include "base/win/win_util.h"
 #include "base/win/windows_version.h"
-#include "components/download/quarantine/common_win.h"
-#include "components/download/quarantine/quarantine_features_win.h"
+#include "components/services/quarantine/common_win.h"
+#include "components/services/quarantine/quarantine_features_win.h"
 #include "url/gurl.h"
 
-namespace download {
+namespace quarantine {
 namespace {
 
 // Returns true for a valid |url| whose length does not exceed
@@ -276,4 +276,4 @@
   return SetInternetZoneIdentifierDirectly(file, source_url, referrer_url);
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/quarantine_win_unittest.cc b/components/services/quarantine/quarantine_win_unittest.cc
similarity index 98%
rename from components/download/quarantine/quarantine_win_unittest.cc
rename to components/services/quarantine/quarantine_win_unittest.cc
index 0c663a9..6f299175 100644
--- a/components/download/quarantine/quarantine_win_unittest.cc
+++ b/components/services/quarantine/quarantine_win_unittest.cc
@@ -16,13 +16,13 @@
 #include "base/test/test_reg_util_win.h"
 #include "base/win/win_util.h"
 #include "base/win/windows_version.h"
-#include "components/download/quarantine/quarantine.h"
-#include "components/download/quarantine/quarantine_features_win.h"
+#include "components/services/quarantine/quarantine.h"
+#include "components/services/quarantine/quarantine_features_win.h"
 #include "net/base/filename_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-namespace download {
+namespace quarantine {
 
 namespace {
 
@@ -404,4 +404,4 @@
   EXPECT_FALSE(GetZoneIdentifierStreamContents(test_file, &zone_identifier));
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/test_support.cc b/components/services/quarantine/test_support.cc
similarity index 80%
rename from components/download/quarantine/test_support.cc
rename to components/services/quarantine/test_support.cc
index 55ef062..3a66d6572 100644
--- a/components/download/quarantine/test_support.cc
+++ b/components/services/quarantine/test_support.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/test_support.h"
+#include "components/services/quarantine/test_support.h"
 
 #include "build/build_config.h"
 
 #if !defined(OS_WIN) && !defined(OS_MACOSX)
 
-namespace download {
+namespace quarantine {
 
 bool IsFileQuarantined(const base::FilePath& file,
                        const GURL& source_url,
@@ -16,6 +16,6 @@
   return false;
 }
 
-}  // namespace download
+}  // namespace quarantine
 
 #endif  // !WIN && !MAC
diff --git a/components/download/quarantine/test_support.h b/components/services/quarantine/test_support.h
similarity index 86%
rename from components/download/quarantine/test_support.h
rename to components/services/quarantine/test_support.h
index 38e601c..1a1bf01 100644
--- a/components/download/quarantine/test_support.h
+++ b/components/services/quarantine/test_support.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_DOWNLOAD_QUARANTINE_TEST_SUPPORT_H_
-#define COMPONENTS_DOWNLOAD_QUARANTINE_TEST_SUPPORT_H_
+#ifndef COMPONENTS_SERVICES_QUARANTINE_TEST_SUPPORT_H_
+#define COMPONENTS_SERVICES_QUARANTINE_TEST_SUPPORT_H_
 
 #include <string>
 
@@ -13,7 +13,7 @@
 class FilePath;
 }
 
-namespace download {
+namespace quarantine {
 
 // Determine if a file has quarantine metadata attached to it.
 //
@@ -39,6 +39,6 @@
                        const GURL& source_url,
                        const GURL& referrer_url);
 
-}  // namespace download
+}  // namespace quarantine
 
-#endif  // COMPONENTS_DOWNLOAD_QUARANTINE_TEST_SUPPORT_H_
+#endif  // COMPONENTS_SERVICES_QUARANTINE_TEST_SUPPORT_H_
diff --git a/components/download/quarantine/test_support_mac.mm b/components/services/quarantine/test_support_mac.mm
similarity index 90%
rename from components/download/quarantine/test_support_mac.mm
rename to components/services/quarantine/test_support_mac.mm
index 5436910..40b9382 100644
--- a/components/download/quarantine/test_support_mac.mm
+++ b/components/services/quarantine/test_support_mac.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/test_support.h"
+#include "components/services/quarantine/test_support.h"
 
 #import <ApplicationServices/ApplicationServices.h>
 #import <Foundation/Foundation.h>
@@ -12,10 +12,10 @@
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/threading/scoped_blocking_call.h"
-#include "components/download/quarantine/common_mac.h"
+#include "components/services/quarantine/common_mac.h"
 #include "url/gurl.h"
 
-namespace download {
+namespace quarantine {
 
 bool IsFileQuarantined(const base::FilePath& file,
                        const GURL& expected_source_url,
@@ -49,4 +49,4 @@
              isEqualToString:base::SysUTF8ToNSString(referrer_url.spec())];
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/download/quarantine/test_support_win.cc b/components/services/quarantine/test_support_win.cc
similarity index 92%
rename from components/download/quarantine/test_support_win.cc
rename to components/services/quarantine/test_support_win.cc
index 4220849c..c8a0689b 100644
--- a/components/download/quarantine/test_support_win.cc
+++ b/components/services/quarantine/test_support_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/download/quarantine/test_support.h"
+#include "components/services/quarantine/test_support.h"
 
 #include <windows.h>
 
@@ -13,9 +13,9 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/win/scoped_handle.h"
-#include "components/download/quarantine/common_win.h"
+#include "components/services/quarantine/common_win.h"
 
-namespace download {
+namespace quarantine {
 
 namespace {
 
@@ -58,4 +58,4 @@
   return ZoneIdentifierPresentForFile(file);
 }
 
-}  // namespace download
+}  // namespace quarantine
diff --git a/components/spellcheck/renderer/spellcheck_provider.cc b/components/spellcheck/renderer/spellcheck_provider.cc
index d3cae78..e4f2a344 100644
--- a/components/spellcheck/renderer/spellcheck_provider.cc
+++ b/components/spellcheck/renderer/spellcheck_provider.cc
@@ -144,7 +144,8 @@
 #endif  // !USE_BROWSER_SPELLCHECKER
 }
 
-void SpellCheckProvider::FocusedNodeChanged(const blink::WebNode& unused) {
+void SpellCheckProvider::FocusedElementChanged(
+    const blink::WebElement& unused) {
 #if defined(OS_ANDROID)
   if (!spell_check_host_.is_bound())
     return;
diff --git a/components/spellcheck/renderer/spellcheck_provider.h b/components/spellcheck/renderer/spellcheck_provider.h
index b90c7a1..66bbda3 100644
--- a/components/spellcheck/renderer/spellcheck_provider.h
+++ b/components/spellcheck/renderer/spellcheck_provider.h
@@ -61,7 +61,7 @@
   void set_spellcheck(SpellCheck* spellcheck) { spellcheck_ = spellcheck; }
 
   // content::RenderFrameObserver:
-  void FocusedNodeChanged(const blink::WebNode& node) override;
+  void FocusedElementChanged(const blink::WebElement& element) override;
 
  private:
   friend class TestingSpellCheckProvider;
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 5b0cc09..1440608 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
-<translation id="1001338328714563407">بصفتك مدير الجهاز والحساب، <ph name="ENROLLMENT_DOMAIN" />:</translation>
+<translation id="1001338328714563407">يمكن لنطاق التسجيل <ph name="ENROLLMENT_DOMAIN" /> بصفته مدير هذا الجهاز والحساب:</translation>
 <translation id="1008557486741366299">ليس الآن</translation>
 <translation id="1010200102790553230">تحميل الصفحة لاحقًا</translation>
 <translation id="1015730422737071372">تقديم تفاصيل إضافية</translation>
@@ -362,7 +362,7 @@
 <translation id="2903493209154104877">العناوين</translation>
 <translation id="290376772003165898">أليست الصفحة باللغة <ph name="LANGUAGE" />؟</translation>
 <translation id="2909946352844186028">تم اكتشاف حدوث تغيير في الشبكة.</translation>
-<translation id="2910133103376701357">يدير <ph name="ENROLLMENT_DOMAIN" /> جهازك وحسابك.</translation>
+<translation id="2910133103376701357">يدير نطاق التسجيل <ph name="ENROLLMENT_DOMAIN" /> جهازك وحسابك.</translation>
 <translation id="2916038427272391327">إغلاق البرامج الأخرى</translation>
 <translation id="2922350208395188000">لا يمكن التحقق من شهادة الخادم.</translation>
 <translation id="2925673989565098301">طريقة التسليم</translation>
@@ -373,7 +373,7 @@
 <translation id="2948083400971632585">يمكنك إيقاف أي خوادم وكيلة تمت تهيئتها لاتصال من صفحة الإعدادات.</translation>
 <translation id="2955913368246107853">إغلاق شريط البحث</translation>
 <translation id="2969319727213777354">‏لإنشاء اتصال آمن، فإنك بحاجة إلى ضبط ساعتك بشكل صحيح. وذلك لأن الشهادات التي تستخدمها مواقع الويب لتعريف نفسها تكون صالحة فقط لفترات محددة من الوقت. فإذا كانت ساعة جهازك غير صحيحة، فلن يتمكن Google Chrome من التحقق من هذه الشهادات.</translation>
-<translation id="2970515157925768593">يمكن تغيير إعداد الجهاز والحساب عن بُعد.</translation>
+<translation id="2970515157925768593">تغيير إعداد الجهاز والحساب عن بُعد.</translation>
 <translation id="2972581237482394796">إعا&amp;دة</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />، تم تحديده حاليًا. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">محو البيانات</translation>
@@ -385,7 +385,7 @@
 <translation id="3005723025932146533">عرض نسخة محفوظة</translation>
 <translation id="3008447029300691911">‏أدخل رمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" />. بعد تأكيدك، ستتم مشاركة تفاصيل بطاقتك مع هذا الموقع.</translation>
 <translation id="3010559122411665027">إدخال القائمة "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
-<translation id="3014389611820813634">بصفتك مدير هذا الجهاز، <ph name="ENROLLMENT_DOMAIN" />:</translation>
+<translation id="3014389611820813634">يمكن لنطاق التسجيل <ph name="ENROLLMENT_DOMAIN" /> بصفته مدير هذا الجهاز:</translation>
 <translation id="301521992641321250">تم الحظر تلقائيًا</translation>
 <translation id="3023071826883856138">‏You4 (مغلف)</translation>
 <translation id="3024663005179499861">نوع السياسة غير صحيح</translation>
@@ -430,7 +430,7 @@
 <translation id="3287510313208355388">التنزيل عند الاتصال بالإنترنت</translation>
 <translation id="3293642807462928945">مزيد من المعلومات عن سياسة <ph name="POLICY_NAME" /></translation>
 <translation id="3303855915957856445">لم يتم العثور على أي نتائج بحث</translation>
-<translation id="3311730110465560799">يمكن تغيير إعداد الجهاز عن بُعد.</translation>
+<translation id="3311730110465560799">تغيير إعداد الجهاز عن بُعد.</translation>
 <translation id="3320021301628644560">إضافة عنوان إرسال الفواتير</translation>
 <translation id="3324983252691184275">قرمزي</translation>
 <translation id="3338095232262050444">آمن</translation>
@@ -617,7 +617,7 @@
 <translation id="4265872034478892965">تم السماح من قبل المشرف</translation>
 <translation id="4275830172053184480">إعادة تشغيل جهازك</translation>
 <translation id="4277028893293644418">إعادة تعيين كلمة المرور</translation>
-<translation id="4279811152705618813">تتم إدارة <ph name="DEVICE_TYPE" /> من خلال <ph name="ENROLLMENT_DOMAIN" /></translation>
+<translation id="4279811152705618813">يدير <ph name="ENROLLMENT_DOMAIN" /> الجهاز <ph name="DEVICE_TYPE" />.</translation>
 <translation id="428639260510061158">{NUM_CARDS,plural, =1{‏تم حفظ هذه البطاقة في حسابك على Google}zero{‏تم حفظ هذه البطاقات في حسابك على Google}two{‏تم حفظ هاتين البطاقتين في حسابك على Google}few{‏تم حفظ هذه البطاقات في حسابك على Google}many{‏تم حفظ هذه البطاقات في حسابك على Google}other{‏تم حفظ هذه البطاقات في حسابك على Google}}</translation>
 <translation id="42981349822642051">توسيع</translation>
 <translation id="4302965934281694568">‏Chou3 (مغلف)</translation>
@@ -722,7 +722,7 @@
 <translation id="4926159001844873046">يعرض موقع <ph name="SITE" /></translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">لا نتائج</translation>
-<translation id="4945672369594656571">‏يتحكّم في كيفية التعامل مع الجهاز وبيانات الحساب. ستعالج Google بيانات جهازك وحسابك حصريًا ضمن عملية إدارة مدير الحساب وللأغراض المُحدّدة فقط عن طريق مدير الجهاز والحساب.</translation>
+<translation id="4945672369594656571">‏التحكّم في كيفية التعامل مع الجهاز وبيانات الحساب. ستعالج Google بيانات جهازك وحسابك حصريًا تحت إدارة مدير الحساب والجهاز ولتلبية الأغراض التي يحدّدها فقط.</translation>
 <translation id="4950898438188848926">‏زر التبديل بين علامات التبويب، اضغط على Enter للتبديل إلى علامة التبويب المفتوحة هذه <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">إجراءات</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -736,7 +736,7 @@
 <translation id="5017554619425969104">النص الذي نسخته</translation>
 <translation id="5018422839182700155">يتعذّر فتح هذه الصفحة</translation>
 <translation id="5019198164206649151">التخزين المساعد في حالة سيئة</translation>
-<translation id="5020154601324912079">‏يتحكّم في كيفية التعامل مع بيانات الجهاز. ستعالج Google بيانات جهازك حصريًا ضمن عملية إدارة مدير الجهاز وللأغراض المُحدّدة فقط من خلال مدير الجهاز.</translation>
+<translation id="5020154601324912079">‏التحكّم في كيفية التعامل مع بيانات الجهاز. ستعالج Google بيانات جهازك حصريًا تحت إدارة مدير الجهاز ولتلبية الأغراض المُحدّدة فقط من قبل مدير الجهاز.</translation>
 <translation id="5023310440958281426">التحقق من سياسات المشرف</translation>
 <translation id="5029568752722684782">محو النسخة</translation>
 <translation id="503069730517007720">يلزم شهادة جذر لـ "<ph name="SOFTWARE_NAME" />" ولكن لم يتم تثبيتها. ينبغي على مشرف تقنية المعلومات أن يلقي نظرة على تعليمات التهيئة لـ "<ph name="SOFTWARE_NAME" />" لإصلاح تلك المشكلة. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -1159,7 +1159,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">إدارة كلمات المرور…</translation>
 <translation id="7419106976560586862">مسار الملف الشخصي</translation>
-<translation id="7424427397225027541">‏يتحكّم في كيفية التعامل مع بيانات الحساب. ستعالج Google بيانات حسابك حصريًا ضمن عملية إدارة مدير الحساب وللأغراض المُحدّدة فقط عن طريق مدير الحساب.</translation>
+<translation id="7424427397225027541">‏التحكم في كيفية التعامل مع بيانات الحساب. ستعالج Google بيانات حسابك حصريًا تحت إدارة مدير الحساب ولتلبية الأغراض التي يحدّدها فقط.</translation>
 <translation id="7437289804838430631">إضافة معلومات الاتصال</translation>
 <translation id="7440140511386898319">الاستكشاف أثناء عدم الاتصال بالإنترنت</translation>
 <translation id="7441627299479586546">موضوع السياسة غير صحيح</translation>
@@ -1245,7 +1245,7 @@
 <translation id="780301667611848630">لا، شكرًا</translation>
 <translation id="7805768142964895445">الحالة</translation>
 <translation id="7806344367022510803">‏تغيير إعدادات محرّك البحث في Chrome</translation>
-<translation id="7810209002420871817">بصفتك مدير الحساب، <ph name="ACCOUNT_DOMAIN" />:</translation>
+<translation id="7810209002420871817">يمكن لنطاق الحساب <ph name="ACCOUNT_DOMAIN" /> بصفته مدير الحساب:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">‏هل تريد إزالة اقتراح النموذج من Chrome؟</translation>
 <translation id="7815407501681723534">تم العثور على <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> لـ "<ph name="SEARCH_STRING" />"</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index c4b526df..17acb37 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -29,6 +29,7 @@
 <translation id="1113869188872983271">&amp;Undo reorder</translation>
 <translation id="1125573121925420732">Warnings may be common while websites update their security. This should improve soon.</translation>
 <translation id="1126551341858583091">The size on the local storage is <ph name="CRASH_SIZE" />.</translation>
+<translation id="1127259989763091435">Confirm &amp; save card to Google Account?</translation>
 <translation id="112840717907525620">Policy cache OK</translation>
 <translation id="1131264053432022307">Image that you copied</translation>
 <translation id="1150979032973867961">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is not trusted by your computer's operating system. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
@@ -143,6 +144,7 @@
 <translation id="1656489000284462475">Pick up</translation>
 <translation id="1662550410081243962">Save and fill payment methods</translation>
 <translation id="1663943134801823270">Cards and addresses are from Chrome. You can manage them in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation>
+<translation id="1669987054044193553">Confirm &amp; save</translation>
 <translation id="1671391448414634642">Pages in <ph name="SOURCE_LANGUAGE" /> will be translated to <ph name="TARGET_LANGUAGE" /> from now on.</translation>
 <translation id="1676269943528358898"><ph name="SITE" /> normally uses encryption to protect your information. When Google Chrome tried to connect to <ph name="SITE" /> this time, the website sent back unusual and incorrect credentials. This may happen when an attacker is trying to pretend to be <ph name="SITE" />, or a Wi-Fi sign-in screen has interrupted the connection. Your information is still secure because Google Chrome stopped the connection before any data was exchanged.</translation>
 <translation id="168841957122794586">The server certificate contains a weak cryptographic key.</translation>
@@ -201,6 +203,7 @@
 <translation id="2003709556000175978">Reset your password now</translation>
 <translation id="20053308747750172">The server that you are going to, <ph name="ORIGIN" />, has requested that a security policy will be applied to all requests to it. But it has now delivered an invalid policy, which prevents the browser from fulfilling your request for <ph name="SITE" />.</translation>
 <translation id="2025186561304664664">Proxy is set to auto-configured.</translation>
+<translation id="202813660234680402">No, don't add</translation>
 <translation id="2030481566774242610">Did you mean <ph name="LINK" />?</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />Checking the proxy and the firewall<ph name="END_LINK" /></translation>
 <translation id="2053111141626950936">Pages in <ph name="LANGUAGE" /> will not be translated.</translation>
@@ -363,6 +366,7 @@
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is from <ph name="DOMAIN2" />. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
 <translation id="2948083400971632585">You can disable any proxies configured for a connection from the settings page.</translation>
+<translation id="295526156371527179">Warning: This policy was not merged as a dictionary as specified by policy because it is not a dictionary.</translation>
 <translation id="2955913368246107853">Close find bar</translation>
 <translation id="2969319727213777354">To establish a secure connection, your clock needs to be set correctly. This is because the certificates that websites use to identify themselves are only valid for specific periods of time. Since your device's clock is incorrect, Google Chrome cannot verify these certificates.</translation>
 <translation id="2970515157925768593">Can remotely change your device and account setup.</translation>
@@ -683,6 +687,7 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> search suggestion</translation>
 <translation id="4742407542027196863">Manage passwords…</translation>
 <translation id="4744603770635761495">Executable Path</translation>
+<translation id="47454865135383664">Add card to Google Account?</translation>
 <translation id="4750917950439032686">Your information (for example, passwords or credit card numbers) is private when it is sent to this site.</translation>
 <translation id="4756388243121344051">&amp;History</translation>
 <translation id="4758311279753947758">Add contact info</translation>
@@ -778,6 +783,7 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5252000469029418751">C7 (Envelope)</translation>
 <translation id="5254958791078852567">E1</translation>
+<translation id="5273658854610202413">Warning: This policy was not merged as specified in PolicyDictionaryMultipleSourceMergeList policy because it is not part of the dictionary policies that can be merged.</translation>
 <translation id="5283044957620376778">B1</translation>
 <translation id="528468243742722775">End</translation>
 <translation id="5284909709419567258">Network addresses</translation>
@@ -901,6 +907,7 @@
 <translation id="5922853866070715753">Almost finished</translation>
 <translation id="5932224571077948991">Site shows intrusive or misleading ads</translation>
 <translation id="5946937721014915347">Opening <ph name="SITE_NAME" />…</translation>
+<translation id="5947933617628957894">Yes, add</translation>
 <translation id="5951495562196540101">Can't enrol with consumer account (packaged licence available).</translation>
 <translation id="5967592137238574583">Edit Contact Info</translation>
 <translation id="5967867314010545767">Remove from history</translation>
@@ -978,6 +985,7 @@
 <translation id="6414888972213066896">You asked your parent if it's OK to visit this site</translation>
 <translation id="6415778972515849510">Chromium can help you protect your Google account and change your password.</translation>
 <translation id="6417515091412812850">Unable to check whether the certificate has been revoked.</translation>
+<translation id="6431585503458005759">Don't store</translation>
 <translation id="6433490469411711332">Edit contact info</translation>
 <translation id="6433595998831338502"><ph name="HOST_NAME" /> refused to connect.</translation>
 <translation id="6434309073475700221">Discard</translation>
@@ -991,7 +999,9 @@
 <translation id="6489534406876378309">Start uploading crashes</translation>
 <translation id="6499038740797743453">Reset password?</translation>
 <translation id="6507833130742554667">Credit and debit cards are accepted.</translation>
+<translation id="650855688985305916">Yes, store</translation>
 <translation id="6508722015517270189">Restart Chrome</translation>
+<translation id="6517596291481585650">Warning: This policy was not merged as a list as specified by policy because it is not a list.</translation>
 <translation id="6529602333819889595">&amp;Redo Delete</translation>
 <translation id="6534179046333460208">Physical Web suggestions</translation>
 <translation id="6554795675067793129">Your account is managed by <ph name="ENROLLMENT_DOMAIN" />.</translation>
@@ -1017,6 +1027,7 @@
 <translation id="6670613747977017428">Back to safety.</translation>
 <translation id="6671697161687535275">Remove form suggestion from Chromium?</translation>
 <translation id="6685834062052613830">Sign out and complete setup</translation>
+<translation id="6689271823431384964">Chrome is offering to save your cards in your Google account because you are signed in. You can change this behaviour in settings. The cardholder name comes from your account.</translation>
 <translation id="6710213216561001401">Previous</translation>
 <translation id="6710594484020273272">&lt;Type search term&gt;</translation>
 <translation id="671076103358959139">Enrolment Token:</translation>
@@ -1123,6 +1134,7 @@
 <translation id="7313965965371928911"><ph name="BEGIN_LINK" />Safe Browsing<ph name="END_LINK" /> warnings</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Connection Help</translation>
+<translation id="733354035281974745">Device local account override</translation>
 <translation id="7334320624316649418">&amp;Redo reorder</translation>
 <translation id="733923710415886693">The server's certificate was not disclosed via Certificate Transparency.</translation>
 <translation id="734600844861828519">11x15</translation>
@@ -1328,6 +1340,7 @@
 <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="834457929814110454">If you understand the risks to your security, you may <ph name="BEGIN_LINK" />visit this site<ph name="END_LINK" /> before the harmful programs have been removed.</translation>
 <translation id="8349305172487531364">Bookmarks bar</translation>
+<translation id="836241887727198552">Store card in Google Account?</translation>
 <translation id="8363502534493474904">Turning off aeroplane mode</translation>
 <translation id="8364627913115013041">Not set.</translation>
 <translation id="8368476060205742148">Google Play services</translation>
@@ -1369,6 +1382,7 @@
 <translation id="8620436878122366504">Your parents haven't approved it yet</translation>
 <translation id="8622948367223941507">Legal-Extra</translation>
 <translation id="8625384913736129811">Save This Card to This Device</translation>
+<translation id="8626112503828625890">Store billing details in Google Account?</translation>
 <translation id="8663226718884576429">Order Summary, <ph name="TOTAL_LABEL" />, More Details</translation>
 <translation id="8680536109547170164"><ph name="QUERY" />, answer, <ph name="ANSWER" /></translation>
 <translation id="8685155993131031756">Prc-16K</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 286d4394..5220ccd 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -29,6 +29,7 @@
 <translation id="1113869188872983271">&amp;Võta korrastamine tagasi</translation>
 <translation id="1125573121925420732">Sel ajal kui veebisaidid värskendavad turvafunktsioone, võite sageli hoiatusi näha. See olukord peaks varsti lahenema.</translation>
 <translation id="1126551341858583091">Kohaliku salvestusruumi maht on <ph name="CRASH_SIZE" />.</translation>
+<translation id="1127259989763091435">Kas kinnitada kaart ja salvestada see Google'i kontole?</translation>
 <translation id="112840717907525620">Reegli vahemälu töötab probleemideta</translation>
 <translation id="1131264053432022307">Teie kopeeritud pilt</translation>
 <translation id="1150979032973867961">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, arvuti operatsioonisüsteem ei usalda selle turvasertifikaati. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation>
@@ -145,6 +146,7 @@
 <translation id="1656489000284462475">Kättesaamine</translation>
 <translation id="1662550410081243962">Salvesta ja sisesta makseviisid</translation>
 <translation id="1663943134801823270">Kaardid ja aadressid pärinevad Chrome'ist. Neid saate hallata menüüs <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" />.</translation>
+<translation id="1669987054044193553">Kinnita ja salvesta</translation>
 <translation id="1671391448414634642">Lehed keeles <ph name="SOURCE_LANGUAGE" /> tõlgitakse nüüd keelde <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1676269943528358898">Sait <ph name="SITE" /> kasutab teie teabe kaitsmiseks tavaliselt krüpteerimist. Kui Google Chrome püüdis seekord saidiga <ph name="SITE" /> ühendust luua, tagastas veebisait ebatavalised ja valed mandaadid. See võib juhtuda siis, kui ründaja proovib teeselda, et on sait <ph name="SITE" />, või WiFi sisselogimisekraan on ühenduse katkestanud. Teie teave on endiselt kaitstud, sest Google Chrome peatas ühenduse enne andmevahetust.</translation>
 <translation id="168841957122794586">Serveri sertifikaat sisaldab nõrka krüptograafilist võtit.</translation>
@@ -206,6 +208,7 @@
     edastanud sobimatu reegli, mis takistab brauseril
     täitmast teie sisenemistaotlust saidile <ph name="SITE" />.</translation>
 <translation id="2025186561304664664">Puhverserver seadistatakse automaatselt.</translation>
+<translation id="202813660234680402">Ei, ära lisa</translation>
 <translation id="2030481566774242610">Kas mõtlesite aadressi <ph name="LINK" />?</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />Kontrollige puhverserverit ja tulemüüri<ph name="END_LINK" /></translation>
 <translation id="2053111141626950936">Selles keeles lehti ei tõlgita: <ph name="LANGUAGE" />.</translation>
@@ -371,6 +374,7 @@
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, selle turvasertifikaati pärineb domeenilt <ph name="DOMAIN2" />. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation>
 <translation id="2948083400971632585">Seadete lehel saate keelata kõik ühenduse jaoks konfigureeritud puhverserverid.</translation>
+<translation id="295526156371527179">Hoiatus! Seda reeglit ei liidetud reeglis määratud sõnastikuna, kuna see ei ole sõnastik.</translation>
 <translation id="2955913368246107853">Sule leiuriba</translation>
 <translation id="2969319727213777354">Turvalise ühenduse loomiseks peab kell olema õigesti seadistatud, kuna sertifikaadid, mida veebisaidid kasutavad enda tuvastamiseks, kehtivad ainult teatud perioodi jooksul. Kuna teie seadme kell on vale, ei saa Chrome neid sertifikaate kinnitada.</translation>
 <translation id="2970515157925768593">Saab kaugühenduse kaudu teie seadme ja konto seadistust muuta.</translation>
@@ -691,6 +695,7 @@
 <translation id="4738601419177586157">Otsingusoovitus: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Halda paroole …</translation>
 <translation id="4744603770635761495">Täitmistee</translation>
+<translation id="47454865135383664">Kas lisada kaart Google'i kontole?</translation>
 <translation id="4750917950439032686">Teie teave (nt paroolid või krediitkaardi numbrid) on sellele saidile saates privaatne.</translation>
 <translation id="4756388243121344051">&amp;Ajalugu</translation>
 <translation id="4758311279753947758">Lisage kontaktteave</translation>
@@ -786,6 +791,7 @@
 <translation id="5251803541071282808">Pilv</translation>
 <translation id="5252000469029418751">C7 (ümbrik)</translation>
 <translation id="5254958791078852567">E1</translation>
+<translation id="5273658854610202413">Hoiatus! Seda reeglit ei liidetud reeglis PolicyDictionaryMultipleSourceMergeList määratud viisil, kuna see ei ole osa sõnastiku reeglitest, mida saab liita.</translation>
 <translation id="5283044957620376778">B1</translation>
 <translation id="528468243742722775">Lõpeta</translation>
 <translation id="5284909709419567258">Võrguaadressid</translation>
@@ -909,6 +915,7 @@
 <translation id="5922853866070715753">Peaaegu valmis</translation>
 <translation id="5932224571077948991">Sait kuvab sekkuvaid või eksitavaid reklaame</translation>
 <translation id="5946937721014915347">Saidi <ph name="SITE_NAME" /> avamine …</translation>
+<translation id="5947933617628957894">Jah, lisa</translation>
 <translation id="5951495562196540101">Tarbijakontoga ei saa registreeruda (paketipõhine litsents on saadaval).</translation>
 <translation id="5967592137238574583">Kontaktteabe muutmine</translation>
 <translation id="5967867314010545767">Eemalda ajaloost</translation>
@@ -986,6 +993,7 @@
 <translation id="6414888972213066896">Küsisite vanemalt, kas võite seda saiti külastada</translation>
 <translation id="6415778972515849510">Chromium aitab teil oma Google'i kontot kaitsta ja parooli muuta.</translation>
 <translation id="6417515091412812850">Ei saa kontrollida sertifikaadi võimalikku tühistamist.</translation>
+<translation id="6431585503458005759">Ära salvesta</translation>
 <translation id="6433490469411711332">Kontaktandmete muutmine</translation>
 <translation id="6433595998831338502">Host <ph name="HOST_NAME" /> keeldus ühendamast.</translation>
 <translation id="6434309073475700221">Tühista</translation>
@@ -999,7 +1007,9 @@
 <translation id="6489534406876378309">Krahhide üleslaadimise alustamine</translation>
 <translation id="6499038740797743453">Kas lähtestada parool?</translation>
 <translation id="6507833130742554667">Kaupmees aktsepteerib krediit- ja deebetkaarte.</translation>
+<translation id="650855688985305916">Jah, salvesta</translation>
 <translation id="6508722015517270189">Taaskäivitage Chrome</translation>
+<translation id="6517596291481585650">Hoiatus! Seda reeglit ei liidetud reeglis määratud loendina, kuna see ei ole loend.</translation>
 <translation id="6529602333819889595">&amp;Kustuta uuesti</translation>
 <translation id="6534179046333460208">Füüsilise veebi soovitused</translation>
 <translation id="6554795675067793129">Teie kontot haldab <ph name="ENROLLMENT_DOMAIN" />.</translation>
@@ -1025,6 +1035,7 @@
 <translation id="6670613747977017428">Tagasi turvalisusse.</translation>
 <translation id="6671697161687535275">Kas eemaldada Chromiumist vormi soovitus?</translation>
 <translation id="6685834062052613830">Logige välja ja viige seadistus lõpule</translation>
+<translation id="6689271823431384964">Chrome pakub kaartide salvestamist teie Google'i kontole, kuna olete sisse logitud. Seda käitumist saab seadetes muuta. Kaardiomaniku nimi pärineb teie kontolt.</translation>
 <translation id="6710213216561001401">Eelmine</translation>
 <translation id="6710594484020273272">&lt;Sisestage otsingutermin&gt;</translation>
 <translation id="671076103358959139">Registreerimismärk:</translation>
@@ -1134,6 +1145,7 @@
 <translation id="7313965965371928911"><ph name="BEGIN_LINK" />Ohutu sirvimise<ph name="END_LINK" /> hoiatused</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Ühendamise abi</translation>
+<translation id="733354035281974745">Seadme kohaliku konto alistamine</translation>
 <translation id="7334320624316649418">&amp;Korrasta uuesti</translation>
 <translation id="733923710415886693">Serveri sertifikaati ei avalikustatud sertifikaadi läbipaistvuse reegli kaudu.</translation>
 <translation id="734600844861828519">11x15</translation>
@@ -1339,6 +1351,7 @@
 <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="834457929814110454">Kui mõistate, kuidas teie turvalisust ohustatakse, siis võite <ph name="BEGIN_LINK" />seda saiti külastada<ph name="END_LINK" /> enne, kui kahjulikud programmid on eemaldatud.</translation>
 <translation id="8349305172487531364">Järjehoidjariba</translation>
+<translation id="836241887727198552">Kas salvestada kaart Google'i kontole?</translation>
 <translation id="8363502534493474904">Lülitage lennurežiim välja</translation>
 <translation id="8364627913115013041">Määramata.</translation>
 <translation id="8368476060205742148">Google Play teenused</translation>
@@ -1380,6 +1393,7 @@
 <translation id="8620436878122366504">Vanemad ei ole seda veel kinnitanud</translation>
 <translation id="8622948367223941507">Legal-Extra</translation>
 <translation id="8625384913736129811">Salvesta kaart sellesse seadmesse</translation>
+<translation id="8626112503828625890">Kas salvestada arvelduse üksikasjad Google'i kontole?</translation>
 <translation id="8663226718884576429">Tellimuse kokkuvõte, <ph name="TOTAL_LABEL" />, rohkem üksikasju</translation>
 <translation id="8680536109547170164"><ph name="QUERY" />, vastus, <ph name="ANSWER" /></translation>
 <translation id="8685155993131031756">Prc-16K</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 868a433b..bada33a 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -688,7 +688,7 @@
 <translation id="4758311279753947758">Ajouter des coordonnées</translation>
 <translation id="4764776831041365478">Il se peut que la page Web à l'adresse <ph name="URL" /> soit temporairement inaccessible ou qu'elle ait été déplacée de façon permanente à une autre adresse Web.</translation>
 <translation id="4771973620359291008">Une erreur inconnue s'est produite.</translation>
-<translation id="4780900888022378816">Votre appareil est géré par <ph name="ENROLLMENT_DOMAIN" /> et, votre compte, par <ph name="ACCOUNT_DOMAIN" />.</translation>
+<translation id="4780900888022378816">Votre appareil est géré par <ph name="ENROLLMENT_DOMAIN" />, et votre compte par <ph name="ACCOUNT_DOMAIN" />.</translation>
 <translation id="4785689107224900852">Passer à cet onglet</translation>
 <translation id="4798078619018708837">Saisissez la date d'expiration et le code CVC de la carte <ph name="CREDIT_CARD" /> pour mettre à jour les informations relatives à celle-ci. Une fois la validation effectuée, les informations relatives à la carte de votre compte Google seront partagées avec ce site.</translation>
 <translation id="4800132727771399293">Veuillez vérifier la date d'expiration et le code CVC, puis réessayez.</translation>
@@ -714,7 +714,7 @@
 <translation id="4926159001844873046"><ph name="SITE" /> indique</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Aucun résultat</translation>
-<translation id="4945672369594656571">Contrôler la manière dont les données de votre appareil et de votre compte sont traitées. Google traite ces données exclusivement sous la direction du responsable de votre appareil et de votre compte, et uniquement aux fins spécifiées par ce dernier.</translation>
+<translation id="4945672369594656571">Contrôle la manière dont les données de votre appareil et de votre compte sont traitées. Google traite ces données exclusivement sous la direction du responsable de votre appareil et de votre compte, et uniquement aux fins spécifiées par ce dernier.</translation>
 <translation id="4950898438188848926">Bouton pour changer d'onglet (appuyez sur Entrée pour passer à l'onglet ouvert, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />)</translation>
 <translation id="495170559598752135">Actions</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index e29e4a6..1bc46a2 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -29,6 +29,7 @@
 <translation id="1113869188872983271">&amp;Atsaukt pārkārtošanu</translation>
 <translation id="1125573121925420732">Tīmekļa vietņu drošības atjauninājumu laikā bieži var tikt rādīti brīdinājumi. Drīzumā tas tiks labots.</translation>
 <translation id="1126551341858583091">Lielums vietējā krātuvē ir <ph name="CRASH_SIZE" />.</translation>
+<translation id="1127259989763091435">Vai apstiprināt un saglabāt jūsu karti Google kontā?</translation>
 <translation id="112840717907525620">Politikas kešatmiņa ir labā stāvoklī.</translation>
 <translation id="1131264053432022307">Kopētais attēls</translation>
 <translation id="1150979032973867961">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts netiek uzskatīts par uzticamu jūsu datora operētājsistēmā. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation>
@@ -144,6 +145,7 @@
 <translation id="1656489000284462475">Informācija par saņemšanu</translation>
 <translation id="1662550410081243962">Saglabāt un aizpildīt maksājuma veidus</translation>
 <translation id="1663943134801823270">Kartes un adreses tiek iegūtas no Chrome. Varat pārvaldīt tās <ph name="BEGIN_LINK" />iestatījumos<ph name="END_LINK" />.</translation>
+<translation id="1669987054044193553">Apstiprināt un saglabāt</translation>
 <translation id="1671391448414634642">Turpmāk lapas, kas būs šādā valodā: <ph name="SOURCE_LANGUAGE" />, tiks tulkotas šādā valodā: <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1676269943528358898">Vietnē <ph name="SITE" /> informācijas aizsargāšanai parasti tiek izmantota šifrēšana. Kad pārlūkā Google Chrome tika mēģināts izveidot savienojumu ar vietni <ph name="SITE" />, šoreiz tā nosūtīja neparastus un nepareizus akreditācijas datus. Iespējams, tas notika, jo uzbrucējs mēģināja uzdoties par vietni <ph name="SITE" />, vai arī Wi-Fi pierakstīšanās ekrāns pārtrauc savienojumu. Jūsu informācija joprojām ir drošībā, jo pārlūks Google Chrome pārtrauca savienojumu, pirms tika veikta jebkādu datu apmaiņa.</translation>
 <translation id="168841957122794586">Servera sertifikāts ietver vāju kriptogrāfisko atslēgu.</translation>
@@ -202,6 +204,7 @@
 <translation id="2003709556000175978">Nekavējoties atiestatiet paroli</translation>
 <translation id="20053308747750172">Visiem pieprasījumiem uz serveri <ph name="ORIGIN" /> tiek piemērota drošības politika. Taču tagad serveris ir iesniedzis nederīgu politiku, kas neļauj pārlūkam izpildīt jūsu pieprasījumu vietnei <ph name="SITE" />.</translation>
 <translation id="2025186561304664664">Starpniekserverim ir iestatīta autokonfigurācija.</translation>
+<translation id="202813660234680402">Nē, nepievienot</translation>
 <translation id="2030481566774242610">Vai domājāt <ph name="LINK" />?</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />Pārbaudiet starpniekserveri un ugunsmūri<ph name="END_LINK" />.</translation>
 <translation id="2053111141626950936">Lapas netiks tulkotas no šīs valodas: <ph name="LANGUAGE" /></translation>
@@ -364,6 +367,7 @@
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts ir saistīts ar domēnu <ph name="DOMAIN2" />. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation>
 <translation id="2948083400971632585">Iestatījumu lapā varat atspējot jebkurus starpniekserverus, kas konfigurēti savienojuma izveidei.</translation>
+<translation id="295526156371527179">Brīdinājums! Šī politika netika apvienota kā vārdnīca atbilstoši politikā noteiktajam, jo tā nav vārdnīca.</translation>
 <translation id="2955913368246107853">Aizvērt atrašanas joslu</translation>
 <translation id="2969319727213777354">Lai izveidotu drošu savienojumu, ir jāiestata pareizs pulksteņa laiks. Tas ir nepieciešams, jo sertifikāti, kurus vietnes izmanto, lai tiktu identificētas, ir derīgi tikai noteiktos laika periodos. Tā kā jūsu ierīces pulkstenis nav pareizs, Google Chrome nevar verificēt šos sertifikātus.</translation>
 <translation id="2970515157925768593">Var attālināti mainīt jūsu ierīces un konta iestatījumus.</translation>
@@ -683,6 +687,7 @@
 <translation id="4738601419177586157">Meklēšanas ieteikums vaicājumam “<ph name="TEXT" />”</translation>
 <translation id="4742407542027196863">Pārvaldīt paroles…</translation>
 <translation id="4744603770635761495">Izpildāms ceļš</translation>
+<translation id="47454865135383664">Vai pievienot karti Google kontam?</translation>
 <translation id="4750917950439032686">Jūsu informācija (piemēram, paroles vai kredītkaršu numuri) ir privāta, kad tā tiek nosūtīta uz šo vietni.</translation>
 <translation id="4756388243121344051">Vēsture</translation>
 <translation id="4758311279753947758">Pievienot kontaktinformāciju</translation>
@@ -778,6 +783,7 @@
 <translation id="5251803541071282808">Mākonis</translation>
 <translation id="5252000469029418751">C7 (aploksne)</translation>
 <translation id="5254958791078852567">E1</translation>
+<translation id="5273658854610202413">Brīdinājums! Šī politika netika apvienota, kā norādīts politikā PolicyDictionaryMultipleSourceMergeList, jo tā nav daļa no apvienojamām vārdnīcu politikām.</translation>
 <translation id="5283044957620376778">B1</translation>
 <translation id="528468243742722775">Beigas</translation>
 <translation id="5284909709419567258">Tīkla adreses</translation>
@@ -901,6 +907,7 @@
 <translation id="5922853866070715753">Gandrīz pabeigts</translation>
 <translation id="5932224571077948991">Vietnē tiek rādītas traucējošas vai maldinošas reklāmas</translation>
 <translation id="5946937721014915347">Notiek vietnes <ph name="SITE_NAME" /> atvēršana...</translation>
+<translation id="5947933617628957894">Jā, pievienot</translation>
 <translation id="5951495562196540101">Neizdevās reģistrēt, izmantojot patērētāja kontu (pieejama komplektā iekļauta licence).</translation>
 <translation id="5967592137238574583">Kontaktinformācijas rediģēšana</translation>
 <translation id="5967867314010545767">Noņemt no vēstures</translation>
@@ -978,6 +985,7 @@
 <translation id="6414888972213066896">Jūs lūdzāt vienam no vecākiem atļauju apmeklēt šo vietni</translation>
 <translation id="6415778972515849510">Chromium var palīdzēt jums aizsargāt jūsu Google kontu un nomainīt paroli.</translation>
 <translation id="6417515091412812850">Nevar pārbaudīt, vai sertifikāts ir atsaukts.</translation>
+<translation id="6431585503458005759">Nesaglabāt</translation>
 <translation id="6433490469411711332">Kontaktinformācijas rediģēšana</translation>
 <translation id="6433595998831338502"><ph name="HOST_NAME" /> noraidīja savienojuma izveidi.</translation>
 <translation id="6434309073475700221">Atmest</translation>
@@ -991,7 +999,9 @@
 <translation id="6489534406876378309">Sākt avāriju datu augšupielādi</translation>
 <translation id="6499038740797743453">Vai atiestatīt paroli?</translation>
 <translation id="6507833130742554667">Tiek pieņemtas kredītkartes un debetkartes.</translation>
+<translation id="650855688985305916">Jā, saglabāt</translation>
 <translation id="6508722015517270189">Restartējiet pārlūku Chrome</translation>
+<translation id="6517596291481585650">Brīdinājums! Šī politika netika apvienota kā saraksts atbilstoši politikā noteiktajam, jo tā nav saraksts.</translation>
 <translation id="6529602333819889595">&amp;Dzēšanas atsaukuma atcelšana</translation>
 <translation id="6534179046333460208">Fiziskā tīmekļa ieteikumi</translation>
 <translation id="6554795675067793129">Jūsu kontu pārvalda <ph name="ENROLLMENT_DOMAIN" />.</translation>
@@ -1017,6 +1027,7 @@
 <translation id="6670613747977017428">Atpakaļ drošībā.</translation>
 <translation id="6671697161687535275">Vai noņemt veidlapas ieteikumu no pārlūka Chromium?</translation>
 <translation id="6685834062052613830">Izrakstieties un pabeidziet iestatīšanu</translation>
+<translation id="6689271823431384964">Pārlūkprogrammā Chrome tiek piedāvāts saglabāt jūsu kartes Google kontā, jo esat pierakstījies. Varat mainīt šo darbību iestatījumos. Kartes īpašnieka vārds tiek iegūts no jūsu konta.</translation>
 <translation id="6710213216561001401">Iepriekšējais</translation>
 <translation id="6710594484020273272">&lt;Ierakstiet meklēšanas vienumu&gt;</translation>
 <translation id="671076103358959139">Reģistrācijas pilnvara:</translation>
@@ -1123,6 +1134,7 @@
 <translation id="7313965965371928911"><ph name="BEGIN_LINK" />Drošas pārlūkošanas<ph name="END_LINK" /> brīdinājumi</translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Savienojuma palīdzība</translation>
+<translation id="733354035281974745">Ierīces lokālā konta ignorēšana</translation>
 <translation id="7334320624316649418">&amp;Atcelt pārkārtošanas atsaukšanu</translation>
 <translation id="733923710415886693">Servera sertifikāts netika atklāts, izmantojot Certificate Transparency.</translation>
 <translation id="734600844861828519">11x15</translation>
@@ -1328,6 +1340,7 @@
 <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="834457929814110454">Ja apzināties drošības risku, varat arī <ph name="BEGIN_LINK" />apmeklēt šo vietni<ph name="END_LINK" />, pirms ir noņemtas kaitīgās programmas.</translation>
 <translation id="8349305172487531364">Grāmatzīmju josla</translation>
+<translation id="836241887727198552">Vai saglabāt karti Google kontā?</translation>
 <translation id="8363502534493474904">Izslēdziet lidojuma režīmu.</translation>
 <translation id="8364627913115013041">Nav iestatīta.</translation>
 <translation id="8368476060205742148">Google Play pakalpojumi</translation>
@@ -1370,6 +1383,7 @@
 <translation id="8620436878122366504">Jūsu vecāki vēl nav to apstiprinājuši</translation>
 <translation id="8622948367223941507">Legal-Extra</translation>
 <translation id="8625384913736129811">Saglabāt šo karti šajā ierīcē</translation>
+<translation id="8626112503828625890">Vai saglabāt norēķinu datus Google kontā?</translation>
 <translation id="8663226718884576429">Pasūtījuma kopsavilkums, <ph name="TOTAL_LABEL" />, citi dati</translation>
 <translation id="8680536109547170164"><ph name="QUERY" />, atbilde, <ph name="ANSWER" /></translation>
 <translation id="8685155993131031756">Prc-16K</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 1004a69..465c400 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -29,6 +29,7 @@
 <translation id="1113869188872983271">&amp;Cofnij zmianę kolejności</translation>
 <translation id="1125573121925420732">Ostrzeżenia mogą pojawiać się często, dopóki strony internetowe nie zaktualizują swoich zabezpieczeń. Wkrótce powinno się to poprawić.</translation>
 <translation id="1126551341858583091">Rozmiar w pamięci lokalnej: <ph name="CRASH_SIZE" />.</translation>
+<translation id="1127259989763091435">Potwierdzić i zapisać kartę na koncie Google?</translation>
 <translation id="112840717907525620">Pamięć podręczna zasad: OK</translation>
 <translation id="1131264053432022307">Skopiowany obraz</translation>
 <translation id="1150979032973867961">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie jest zaufany w systemie operacyjnym tego komputera. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation>
@@ -145,6 +146,7 @@
 <translation id="1656489000284462475">Odbiór</translation>
 <translation id="1662550410081243962">Zapisuj i automatycznie uzupełniaj informacje o formach płatności</translation>
 <translation id="1663943134801823270">Karty i adresy pochodzą z Chrome. Możesz nimi zarządzać w <ph name="BEGIN_LINK" />Ustawieniach<ph name="END_LINK" />.</translation>
+<translation id="1669987054044193553">Potwierdź i zapisz</translation>
 <translation id="1671391448414634642">Od teraz strony, których językiem jest <ph name="SOURCE_LANGUAGE" />, będą tłumaczone na <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1676269943528358898"><ph name="SITE" /> zazwyczaj używa szyfrowania do ochrony Twoich informacji. Gdy tym razem Google Chrome próbował połączyć się ze stroną <ph name="SITE" />, odesłała ona nietypowe i nieprawidłowe dane logowania. Może się tak zdarzyć, gdy pod stronę <ph name="SITE" /> podszywa się atakująca osoba albo gdy ekran logowania do sieci Wi-Fi przerwie połączenie. Twoje informacje są nadal bezpieczne, bo połączenie w Google Chrome zakończyło się przed wymianą jakichkolwiek danych.</translation>
 <translation id="168841957122794586">Certyfikat serwera ma słaby klucz kryptograficzny.</translation>
@@ -206,6 +208,7 @@
     nieprawidłową zasadę, która uniemożliwia przeglądarce
     zrealizowanie Twojego żądania dotyczącego strony <ph name="SITE" />.</translation>
 <translation id="2025186561304664664">Ustawiono automatyczne konfigurowanie proxy.</translation>
+<translation id="202813660234680402">Nie, nie dodawaj</translation>
 <translation id="2030481566774242610">Czy chodziło Ci o <ph name="LINK" />?</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />Sprawdź serwer proxy i zaporę sieciową<ph name="END_LINK" /></translation>
 <translation id="2053111141626950936">Strony w tym języku (<ph name="LANGUAGE" />) nie będą tłumaczone.</translation>
@@ -371,6 +374,7 @@
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat pochodzi z <ph name="DOMAIN2" />. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation>
 <translation id="2948083400971632585">Możesz wyłączyć dowolne serwery proxy skonfigurowane dla połączenia na stronie ustawień.</translation>
+<translation id="295526156371527179">Ostrzeżenie: ta zasada nie została scalona jako słownik na podstawie zasady, ponieważ nie jest słownikiem.</translation>
 <translation id="2955913368246107853">Zamknij pasek wyszukiwania</translation>
 <translation id="2969319727213777354">Aby urządzenie nawiązało bezpieczne połączenie, jego zegar musi wskazywać prawidłową godzinę. Jest to wymagane, bo certyfikaty używane do identyfikacji stron internetowych są ważne tylko przez określony czas. Zegar urządzenia jest ustawiony nieprawidłowo, więc Google Chrome nie może zweryfikować tych certyfikatów.</translation>
 <translation id="2970515157925768593">Może zdalnie zmienić konfigurację Twojego urządzenia i konta.</translation>
@@ -691,6 +695,7 @@
 <translation id="4738601419177586157">Propozycja wyszukiwania: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Zarządzaj hasłami…</translation>
 <translation id="4744603770635761495">Ścieżka pliku wykonywalnego</translation>
+<translation id="47454865135383664">Dodać kartę do konta Google?</translation>
 <translation id="4750917950439032686">Informacje, które wysyłasz tej witrynie (na przykład hasła lub numery kart kredytowych), pozostają prywatne.</translation>
 <translation id="4756388243121344051">&amp;Historia</translation>
 <translation id="4758311279753947758">Dodaj dane kontaktowe</translation>
@@ -786,6 +791,7 @@
 <translation id="5251803541071282808">Chmura</translation>
 <translation id="5252000469029418751">C7 (koperta)</translation>
 <translation id="5254958791078852567">E1</translation>
+<translation id="5273658854610202413">Ostrzeżenie: ta zasada nie została scalona na podstawie zasady PolicyDictionaryMultipleSourceMergeList, ponieważ nie należy do zasad słownikowych, które można scalić.</translation>
 <translation id="5283044957620376778">B1</translation>
 <translation id="528468243742722775">Zakończ</translation>
 <translation id="5284909709419567258">Adresy sieciowe</translation>
@@ -909,6 +915,7 @@
 <translation id="5922853866070715753">Prawie gotowe</translation>
 <translation id="5932224571077948991">Na tej stronie wyświetlają się uciążliwe lub wprowadzające w błąd reklamy</translation>
 <translation id="5946937721014915347">Otwieram <ph name="SITE_NAME" />…</translation>
+<translation id="5947933617628957894">Tak, dodaj</translation>
 <translation id="5951495562196540101">Nie można zarejestrować się przy użyciu konta klienta (w pakiecie dostępna jest licencja).</translation>
 <translation id="5967592137238574583">Edytuj dane kontaktowe</translation>
 <translation id="5967867314010545767">Usuń z historii</translation>
@@ -986,6 +993,7 @@
 <translation id="6414888972213066896">Zapytałeś rodzica, czy możesz odwiedzić tę stronę</translation>
 <translation id="6415778972515849510">Chromium może Ci pomóc w zabezpieczeniu Twojego konta Google i zmianie hasła.</translation>
 <translation id="6417515091412812850">Nie można sprawdzić, czy certyfikat został unieważniony.</translation>
+<translation id="6431585503458005759">Nie zapisuj</translation>
 <translation id="6433490469411711332">Edytuj dane kontaktowe</translation>
 <translation id="6433595998831338502">Serwer <ph name="HOST_NAME" /> odrzucił połączenie.</translation>
 <translation id="6434309073475700221">Przerwij</translation>
@@ -999,7 +1007,9 @@
 <translation id="6489534406876378309">Rozpocznij przesyłanie informacji o awariach</translation>
 <translation id="6499038740797743453">Zresetować hasło?</translation>
 <translation id="6507833130742554667">Karty kredytowe i debetowe są akceptowane.</translation>
+<translation id="650855688985305916">Tak, zapisz</translation>
 <translation id="6508722015517270189">Uruchom ponownie Chrome</translation>
+<translation id="6517596291481585650">Ostrzeżenie: ta zasada nie została scalona jako lista na podstawie zasady, ponieważ nie jest listą.</translation>
 <translation id="6529602333819889595">&amp;Ponów usunięcie</translation>
 <translation id="6534179046333460208">Sugestie dotyczące internetu rzeczy</translation>
 <translation id="6554795675067793129">To konto jest zarządzane przez: <ph name="ENROLLMENT_DOMAIN" />.</translation>
@@ -1025,6 +1035,7 @@
 <translation id="6670613747977017428">Wróć do bezpiecznej strony.</translation>
 <translation id="6671697161687535275">Usunąć tę podpowiedź do formularza z Chromium?</translation>
 <translation id="6685834062052613830">Wyloguj się i dokończ konfigurację</translation>
+<translation id="6689271823431384964">Chrome proponuje zalogowanym użytkownikom zapisanie kart na koncie Google. Możesz to zmienić w ustawieniach. Imię i nazwisko posiadacza karty pochodzi z Twojego konta.</translation>
 <translation id="6710213216561001401">Wstecz</translation>
 <translation id="6710594484020273272">&lt;Wpisz wyszukiwane słowa&gt;</translation>
 <translation id="671076103358959139">Token rejestracji:</translation>
@@ -1134,6 +1145,7 @@
 <translation id="7313965965371928911">Ostrzeżenia <ph name="BEGIN_LINK" />Bezpiecznego przeglądania<ph name="END_LINK" /></translation>
 <translation id="7319430975418800333">A3</translation>
 <translation id="7320336641823683070">Pomoc dotycząca połączeń</translation>
+<translation id="733354035281974745">Zastąpienie przez konto lokalne na urządzeniu</translation>
 <translation id="7334320624316649418">&amp;Ponów zmianę kolejności</translation>
 <translation id="733923710415886693">Certyfikat serwera nie został ujawniony przez protokół Certificate Transparency.</translation>
 <translation id="734600844861828519">11x15</translation>
@@ -1339,6 +1351,7 @@
 <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="834457929814110454">Jeśli rozumiesz zagrożenie, możesz <ph name="BEGIN_LINK" />wejść na tę stronę<ph name="END_LINK" />, zanim szkodliwe programy zostaną usunięte.</translation>
 <translation id="8349305172487531364">Pasek zakładek</translation>
+<translation id="836241887727198552">Zapisać kartę na koncie Google?</translation>
 <translation id="8363502534493474904">Wyłącz tryb samolotowy</translation>
 <translation id="8364627913115013041">Nie ustawiono.</translation>
 <translation id="8368476060205742148">Usługi Google Play</translation>
@@ -1380,6 +1393,7 @@
 <translation id="8620436878122366504">Twoi rodzice jeszcze na to nie zezwolili</translation>
 <translation id="8622948367223941507">Legal-Extra</translation>
 <translation id="8625384913736129811">Zapisz tę kartę na tym urządzeniu</translation>
+<translation id="8626112503828625890">Zapisać szczegóły płatności na koncie Google?</translation>
 <translation id="8663226718884576429">Podsumowanie zamówienia, <ph name="TOTAL_LABEL" />, Szczegółowe informacje</translation>
 <translation id="8680536109547170164"><ph name="QUERY" />, odpowiedź, <ph name="ANSWER" /></translation>
 <translation id="8685155993131031756">Prc-16K</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 40d9565a..d655baf 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -182,7 +182,7 @@
 <translation id="1871208020102129563">O proxy está definido para utilizar servidores proxy fixos e não um URL de script .pac.</translation>
 <translation id="1871284979644508959">Campo obrigatório</translation>
 <translation id="1874765382782611674">Cartões de débito aceites</translation>
-<translation id="1875512691959384712">Formulários do Google</translation>
+<translation id="1875512691959384712">Google Forms</translation>
 <translation id="187918866476621466">Abrir páginas iniciais</translation>
 <translation id="1883255238294161206">Fechar lista</translation>
 <translation id="1898423065542865115">Filtragem</translation>
diff --git a/components/viz/service/display/software_renderer.cc b/components/viz/service/display/software_renderer.cc
index 990b032..e9f4f44 100644
--- a/components/viz/service/display/software_renderer.cc
+++ b/components/viz/service/display/software_renderer.cc
@@ -491,8 +491,9 @@
       SkIRect result_rect;
       // TODO(ajuma): Apply the filter in the same pass as the content where
       // possible (e.g. when there's no origin offset). See crbug.com/308201.
-      filter_image = ApplyImageFilter(image_filter.get(), quad, source_bitmap,
-                                      &result_rect);
+      filter_image =
+          ApplyImageFilter(image_filter.get(), quad, source_bitmap,
+                           /* offset_expanded_bounds = */ true, &result_rect);
       if (result_rect.isEmpty()) {
         return;
       }
@@ -654,46 +655,47 @@
   return true;
 }
 
-// If non-null, auto_bounds will be filled with the automatically-computed
-// destination bounds. If null, the output will be the same size as the
-// input bitmap.
+// Applies |filter| to |to_filter| bitmap. |result_rect| will be filled with the
+// automatically-computed destination bounds. If |offset_expanded_bounds| is
+// true, the bitmap will be offset for any pixel-moving filters. This function
+// is called for both filters and backdrop_filters. The difference between those
+// two paths is that the filter path wants to offset to the expanded bounds
+// (including border for pixel moving filters) when drawing the bitmap into the
+// canvas, while the backdrop filter path needs to keep the origin unmoved (at
+// quad->rect origin) so that it gets put in the right spot relative to the
+// underlying backdrop.
 sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
     SkImageFilter* filter,
     const RenderPassDrawQuad* quad,
     const SkBitmap& to_filter,
-    SkIRect* auto_bounds) const {
+    bool offset_expanded_bounds,
+    SkIRect* result_rect) const {
+  DCHECK(result_rect);
   if (!filter)
     return nullptr;
 
   SkMatrix local_matrix;
   local_matrix.setTranslate(quad->filters_origin.x(), quad->filters_origin.y());
   local_matrix.postScale(quad->filters_scale.x(), quad->filters_scale.y());
-  SkIRect dst_rect;
-  if (auto_bounds) {
-    dst_rect =
-        filter->filterBounds(gfx::RectToSkIRect(quad->rect), local_matrix,
-                             SkImageFilter::kForward_MapDirection);
-    *auto_bounds = dst_rect;
-  } else {
-    dst_rect = to_filter.bounds();
-  }
-
+  *result_rect =
+      filter->filterBounds(gfx::RectToSkIRect(quad->rect), local_matrix,
+                           SkImageFilter::kForward_MapDirection);
+  gfx::Point canvas_offset =
+      offset_expanded_bounds ? gfx::Point(result_rect->x(), result_rect->y())
+                             : quad->rect.origin();
   SkImageInfo dst_info =
-      SkImageInfo::MakeN32Premul(dst_rect.width(), dst_rect.height());
+      SkImageInfo::MakeN32Premul(result_rect->width(), result_rect->height());
   sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info);
-
-  if (!surface) {
+  if (!surface)
     return nullptr;
-  }
 
   SkPaint paint;
   // Treat subnormal float values as zero for performance.
   cc::ScopedSubnormalFloatDisabler disabler;
   paint.setImageFilter(filter->makeWithLocalMatrix(local_matrix));
-  surface->getCanvas()->translate(-dst_rect.x(), -dst_rect.y());
+  surface->getCanvas()->translate(-canvas_offset.x(), -canvas_offset.y());
   surface->getCanvas()->drawBitmap(to_filter, quad->rect.x(), quad->rect.y(),
                                    &paint);
-
   return surface->makeImageSnapshot();
 }
 
@@ -734,7 +736,7 @@
   // |backdrop_rect| is now the bounding box of clip_region, in window pixel
   // coordinates, and with flip applied.
   gfx::Rect backdrop_rect = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect(
-      contents_device_transform, gfx::RectF(-0.5f, -0.5f, 1.f, 1.f)));
+      contents_device_transform, QuadVertexRect()));
 
   if (ShouldApplyBackdropFilters(backdrop_filters)) {
     SkMatrix matrix;
@@ -833,8 +835,11 @@
           gfx::SizeF(bitmap_rect.width(), bitmap_rect.height()),
           clipping_offset)
           ->cached_sk_filter_;
+
+  SkIRect result_rect;
   sk_sp<SkImage> filtered_image =
-      ApplyImageFilter(filter.get(), quad, backdrop_bitmap, nullptr);
+      ApplyImageFilter(filter.get(), quad, backdrop_bitmap,
+                       /* offset_expanded_bounds = */ false, &result_rect);
   if (!filtered_image)
     return nullptr;
 
diff --git a/components/viz/service/display/software_renderer.h b/components/viz/service/display/software_renderer.h
index 9ac27ed6..064330f 100644
--- a/components/viz/service/display/software_renderer.h
+++ b/components/viz/service/display/software_renderer.h
@@ -84,6 +84,7 @@
   sk_sp<SkImage> ApplyImageFilter(SkImageFilter* filter,
                                   const RenderPassDrawQuad* quad,
                                   const SkBitmap& to_filter,
+                                  bool offset_expanded_bounds,
                                   SkIRect* auto_bounds) const;
   gfx::Rect GetBackdropBoundingBoxForRenderPassQuad(
       const RenderPassDrawQuad* quad,
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index 4270c1ee..e08f6f7 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -751,6 +751,20 @@
       occluding_damage_rect_valid);
 }
 
+SurfaceAggregator::RoundedCornerInfo::RoundedCornerInfo(
+    const gfx::RRectF& bounds_arg,
+    bool is_fast_rounded_corner_arg,
+    const gfx::Transform target_transform) {
+  is_fast_rounded_corner = is_fast_rounded_corner_arg;
+  if (bounds_arg.IsEmpty())
+    return;
+  DCHECK(target_transform.Preserves2dAxisAlignment());
+  bounds = bounds_arg;
+  SkMatrix matrix = target_transform.matrix();
+  bounds.Scale(matrix.getScaleX(), matrix.getScaleY());
+  bounds.Offset(target_transform.To2dTranslation());
+}
+
 SharedQuadState* SurfaceAggregator::CopyAndScaleSharedQuadState(
     const SharedQuadState* source_sqs,
     const gfx::Transform& scaled_quad_to_target_transform,
@@ -766,7 +780,6 @@
   ClipData new_clip_rect = CalculateClipRect(
       clip_rect, ClipData(source_sqs->is_clipped, source_sqs->clip_rect),
       target_transform);
-  DCHECK(rounded_corner_info.bounds);
 
   // target_transform contains any transformation that may exist
   // between the context that these quads are being copied from (i.e. the
@@ -779,7 +792,7 @@
 
   shared_quad_state->SetAll(
       new_transform, quad_layer_rect, visible_quad_layer_rect,
-      *rounded_corner_info.bounds, new_clip_rect.rect, new_clip_rect.is_clipped,
+      rounded_corner_info.bounds, new_clip_rect.rect, new_clip_rect.is_clipped,
       source_sqs->are_contents_opaque, source_sqs->opacity,
       source_sqs->blend_mode, source_sqs->sorting_context_id);
   shared_quad_state->is_fast_rounded_corner =
@@ -846,9 +859,9 @@
         continue;
 
       if (parent_rounded_corner_info.IsEmpty()) {
-        new_rounded_corner_info =
-            RoundedCornerInfo(&quad->shared_quad_state->rounded_corner_bounds,
-                              quad->shared_quad_state->is_fast_rounded_corner);
+        new_rounded_corner_info = RoundedCornerInfo(
+            quad->shared_quad_state->rounded_corner_bounds,
+            quad->shared_quad_state->is_fast_rounded_corner, target_transform);
       }
 
       HandleSurfaceQuad(
@@ -858,9 +871,10 @@
     } else {
       if (quad->shared_quad_state != last_copied_source_shared_quad_state) {
         if (parent_rounded_corner_info.IsEmpty()) {
-          new_rounded_corner_info = RoundedCornerInfo(
-              &quad->shared_quad_state->rounded_corner_bounds,
-              quad->shared_quad_state->is_fast_rounded_corner);
+          new_rounded_corner_info =
+              RoundedCornerInfo(quad->shared_quad_state->rounded_corner_bounds,
+                                quad->shared_quad_state->is_fast_rounded_corner,
+                                target_transform);
         }
         const SharedQuadState* dest_shared_quad_state = CopySharedQuadState(
             quad->shared_quad_state, target_transform, clip_rect, dest_pass,
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h
index f969f724..a9e4c94 100644
--- a/components/viz/service/display/surface_aggregator.h
+++ b/components/viz/service/display/surface_aggregator.h
@@ -91,12 +91,16 @@
   };
 
   struct RoundedCornerInfo {
-    RoundedCornerInfo() : bounds(nullptr), is_fast_rounded_corner(false) {}
-    RoundedCornerInfo(const gfx::RRectF* bounds, bool is_fast_rounded_corner)
-        : bounds(bounds), is_fast_rounded_corner(is_fast_rounded_corner) {}
+    RoundedCornerInfo() : is_fast_rounded_corner(false) {}
+    // |target_transform| is the transform that maps |bounds| from its current
+    // space into the desired target space. It must be a scale+translation
+    // matrix.
+    RoundedCornerInfo(const gfx::RRectF& bounds,
+                      bool is_fast_rounded_corner,
+                      const gfx::Transform target_transform);
 
-    bool IsEmpty() const { return !bounds || bounds->IsEmpty(); }
-    const gfx::RRectF* bounds;
+    bool IsEmpty() const { return bounds.IsEmpty(); }
+    gfx::RRectF bounds;
     bool is_fast_rounded_corner;
   };
 
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc
index 94765c02..db5ba6b 100644
--- a/components/viz/service/display/surface_aggregator_unittest.cc
+++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -179,7 +179,9 @@
                             float opacity,
                             const gfx::Transform& transform,
                             bool stretch_content_to_fill_bounds,
-                            bool ignores_input_event) {
+                            bool ignores_input_event,
+                            const gfx::RRectF& rounded_corner_bounds,
+                            bool is_fast_rounded_corner) {
       Quad quad;
       quad.material = DrawQuad::Material::kSurfaceContent;
       quad.primary_surface_rect = primary_surface_rect;
@@ -189,6 +191,8 @@
       quad.default_background_color = default_background_color;
       quad.stretch_content_to_fill_bounds = stretch_content_to_fill_bounds;
       quad.ignores_input_event = ignores_input_event;
+      quad.rounded_corner_bounds = rounded_corner_bounds;
+      quad.is_fast_rounded_corner = is_fast_rounded_corner;
       return quad;
     }
 
@@ -213,6 +217,8 @@
     gfx::Rect rect;
     // Set when material==DrawQuad::Material::kRenderPass.
     RenderPassId render_pass_id;
+    gfx::RRectF rounded_corner_bounds;
+    bool is_fast_rounded_corner;
 
    private:
     Quad()
@@ -252,7 +258,8 @@
                        desc.to_target_transform, desc.surface_range,
                        desc.default_background_color,
                        desc.stretch_content_to_fill_bounds,
-                       desc.ignores_input_event);
+                       desc.ignores_input_event, desc.rounded_corner_bounds,
+                       desc.is_fast_rounded_corner);
         break;
       case DrawQuad::Material::kRenderPass:
         AddRenderPassQuad(pass, desc.render_pass_id);
@@ -335,11 +342,12 @@
                              const SurfaceRange& surface_range,
                              SkColor default_background_color,
                              bool stretch_content_to_fill_bounds,
-                             bool ignores_input_event) {
+                             bool ignores_input_event,
+                             const gfx::RRectF& rounded_corner_bounds,
+                             bool is_fast_rounded_corner) {
     gfx::Transform layer_to_target_transform = transform;
     gfx::Rect layer_bounds(primary_surface_rect);
     gfx::Rect visible_layer_rect(primary_surface_rect);
-    gfx::RRectF rounded_corner_bounds = gfx::RRectF();
     gfx::Rect clip_rect(primary_surface_rect);
     bool is_clipped = false;
     bool are_contents_opaque = false;
@@ -350,6 +358,7 @@
                               visible_layer_rect, rounded_corner_bounds,
                               clip_rect, is_clipped, are_contents_opaque,
                               opacity, blend_mode, 0);
+    shared_quad_state->is_fast_rounded_corner = is_fast_rounded_corner;
 
     SurfaceDrawQuad* surface_quad =
         pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
@@ -510,7 +519,8 @@
       quads.push_back(Quad::SurfaceQuad(
           range, SK_ColorWHITE, gfx::Rect(5, 5), 1.f, gfx::Transform(),
           /*stretch_content_to_fill_bounds=*/false,
-          /*ignores_input_event=*/false));
+          /*ignores_input_event=*/false, gfx::RRectF(),
+          /*is_fast_border_radius*/ false));
     }
     std::vector<Pass> passes = {Pass(quads, SurfaceSize())};
     RenderPassList pass_list;
@@ -602,7 +612,8 @@
         Quad::SurfaceQuad(SurfaceRange(base::nullopt, embedded_surface_id),
                           SK_ColorWHITE, gfx::Rect(5, 5), .5f, gfx::Transform(),
                           /*stretch_content_to_fill_bounds=*/false,
-                          /*ignores_input_event=*/false)};
+                          /*ignores_input_event=*/false, gfx::RRectF(),
+                          /*is_fast_border_radius*/ false)};
     std::vector<Pass> passes = {Pass(quads, SurfaceSize())};
 
     SubmitCompositorFrame(root_sink_.get(), passes, root_local_surface_id_,
@@ -625,7 +636,8 @@
         SurfaceRange(base::nullopt, embedded_surface_id), SK_ColorWHITE,
         gfx::Rect(5, 5), .9999f, gfx::Transform(),
         /*stretch_content_to_fill_bounds=*/false,
-        /*ignores_input_event=*/false)};
+        /*ignores_input_event=*/false, gfx::RRectF(),
+        /*is_fast_border_radius*/ false)};
     std::vector<Pass> passes = {Pass(quads, SurfaceSize())};
 
     SubmitCompositorFrame(root_sink_.get(), passes, root_local_surface_id_,
@@ -665,7 +677,8 @@
   std::vector<Quad> quads = {Quad::SurfaceQuad(
       SurfaceRange(base::nullopt, embedded_surface_id), SK_ColorWHITE,
       gfx::Rect(5, 5), 1.f, rotate, /*stretch_content_to_fill_bounds=*/false,
-      /*ignores_input_event=*/false)};
+      /*ignores_input_event=*/false, gfx::RRectF(),
+      /*is_fast_border_radius*/ false)};
   std::vector<Pass> passes = {Pass(quads, SurfaceSize())};
 
   SubmitCompositorFrame(root_sink_.get(), passes, root_local_surface_id_,
@@ -4839,7 +4852,8 @@
                         /*primary_surface_rect*/ gfx::Rect(0, 0, 100, 100),
                         /*opacity*/ 1.f, video_transform,
                         /*stretch_content_to_fill_bounds=*/false,
-                        /*ignores_input_event=*/false)};
+                        /*ignores_input_event=*/false, gfx::RRectF(),
+                        /*is_fast_border_radius*/ false)};
 
   std::vector<Pass> root_passes = {
       Pass(root_surface_quads,
@@ -4933,7 +4947,8 @@
         /*primary_surface_rect*/ gfx::Rect(0, 0, 100, 100),
         /*opacity*/ 1.f, video_transform,
         /*stretch_content_to_fill_bounds=*/false,
-        /*ignores_input_event=*/false)};
+        /*ignores_input_event=*/false, gfx::RRectF(),
+        /*is_fast_border_radius*/ false)};
 
     std::vector<Pass> root_passes = {
         Pass(root_surface_quads,
@@ -5154,5 +5169,308 @@
   EXPECT_EQ(frame.render_pass_list.back()->damage_rect, transformed_rect);
 }
 
+// Tests that a rounded_corner_bounds field on a quad in a child
+// surface gets mapped up to the space of the parent surface, due to
+// change of target render surface. (rounded corner bounds are in the space
+// of the render surface).
+TEST_F(SurfaceAggregatorValidSurfaceTest, RoundedCornerTransformChange) {
+  auto middle_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryMiddleFrameSinkId, kChildIsRoot,
+      kNeedsSyncPoints);
+  // Child surface.
+  ParentLocalSurfaceIdAllocator child_allocator;
+  child_allocator.GenerateId();
+  LocalSurfaceId child_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId child_surface_id(child_sink_->frame_sink_id(),
+                             child_local_surface_id);
+  {
+    std::vector<Quad> child_quads[1] = {
+        {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5))},
+    };
+    std::vector<Pass> child_passes = {Pass(child_quads[0], 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_frame.render_pass_list[0]
+        ->shared_quad_state_list.front()
+        ->rounded_corner_bounds = gfx::RRectF(0, 0, 100, 10, 5);
+
+    child_sink_->SubmitCompositorFrame(child_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Root surface.
+  std::vector<Quad> surface_quads = {
+      Quad::SurfaceQuad(SurfaceRange(base::nullopt, child_surface_id),
+                        SK_ColorWHITE, gfx::Rect(5, 5), false, false)};
+  std::vector<Pass> root_passes = {Pass(surface_quads, SurfaceSize())};
+
+  CompositorFrame root_frame = MakeEmptyCompositorFrame();
+  AddPasses(&root_frame.render_pass_list, root_passes,
+            &root_frame.metadata.referenced_surfaces);
+
+  root_frame.render_pass_list[0]
+      ->shared_quad_state_list.front()
+      ->quad_to_target_transform.Translate(0, 7);
+  root_sink_->SubmitCompositorFrame(root_local_surface_id_,
+                                    std::move(root_frame));
+
+  SurfaceId root_surface_id(root_sink_->frame_sink_id(),
+                            root_local_surface_id_);
+
+  CompositorFrame aggregated_frame = AggregateFrame(root_surface_id);
+  auto* aggregated_first_pass_sqs =
+      aggregated_frame.render_pass_list[0]->shared_quad_state_list.front();
+
+  EXPECT_EQ(gfx::RRectF(0, 7, 100, 10, 5),
+            aggregated_first_pass_sqs->rounded_corner_bounds);
+}
+
+// Tests that the rounded corner bounds of a surface quad that gets transformed
+// when drawing into an ancestor surface get properly mapped to the new
+// coordinate space of its final render surface. It also tests the specific case
+// where the surface is embedded in a parent surface that itself can't be
+// merged into the root surface (due to opacity).
+TEST_F(SurfaceAggregatorValidSurfaceTest, RoundedCornerTransformedSurfaceQuad) {
+  auto middle_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryMiddleFrameSinkId, kChildIsRoot,
+      kNeedsSyncPoints);
+  // Grandchild surface.
+  ParentLocalSurfaceIdAllocator child_allocator;
+  child_allocator.GenerateId();
+
+  LocalSurfaceId grandchild_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId grandchild_surface_id(child_sink_->frame_sink_id(),
+                                  grandchild_local_surface_id);
+  {
+    std::vector<Quad> child_quads[1] = {
+        {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5))},
+    };
+    std::vector<Pass> child_passes = {Pass(child_quads[0], 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_sink_->SubmitCompositorFrame(grandchild_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Child surface.
+  child_allocator.GenerateId();
+  LocalSurfaceId child_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId child_surface_id(child_sink_->frame_sink_id(),
+                             child_local_surface_id);
+  {
+    // Set an opacity in order to prevent merging into the root render pass.
+    std::vector<Quad> child_quads = {Quad::SurfaceQuad(
+        SurfaceRange(base::nullopt, grandchild_surface_id), SK_ColorWHITE,
+        gfx::Rect(5, 5), 0.5f, gfx::Transform(), false, false,
+        gfx::RRectF(0, 0, 96, 10, 5),
+        /*is_fast_border_radius*/ false)};
+
+    std::vector<Pass> child_passes = {Pass(child_quads, 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_sink_->SubmitCompositorFrame(child_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Root surface.
+  gfx::Transform surface_transform;
+  surface_transform.Translate(3, 4);
+  std::vector<Quad> secondary_quads = {
+      Quad::SurfaceQuad(SurfaceRange(base::nullopt, child_surface_id),
+                        SK_ColorWHITE, gfx::Rect(5, 5), 1.f, surface_transform,
+                        false, false, gfx::RRectF(), false)};
+
+  std::vector<Pass> root_passes = {Pass(secondary_quads, SurfaceSize())};
+
+  CompositorFrame root_frame =
+      CompositorFrameBuilder().SetDeviceScaleFactor(2.0f).Build();
+  AddPasses(&root_frame.render_pass_list, root_passes,
+            &root_frame.metadata.referenced_surfaces);
+
+  root_frame.render_pass_list[0]
+      ->shared_quad_state_list.front()
+      ->quad_to_target_transform.Translate(0, 7);
+  root_sink_->SubmitCompositorFrame(root_local_surface_id_,
+                                    std::move(root_frame));
+
+  SurfaceId root_surface_id(root_sink_->frame_sink_id(),
+                            root_local_surface_id_);
+
+  CompositorFrame aggregated_frame = AggregateFrame(root_surface_id);
+  auto* aggregated_first_pass_sqs =
+      aggregated_frame.render_pass_list[1]->shared_quad_state_list.front();
+
+  // Original rounded rect is (0, 0, 96, 10, 5). This then gets multiplied
+  // by a device scale factor of 2 to (0, 0, 192, 20, 10), then moved
+  // by a (3, 4) translation followed by a (0, 7) translation.
+  EXPECT_EQ(gfx::RRectF(3, 11, 192, 20, 10),
+            aggregated_first_pass_sqs->rounded_corner_bounds);
+}
+
+// This is a variant of RoundedCornerTransformedSurfaceQuad that does not
+// have opacity, and therefore can be merged into the root render pass.
+TEST_F(SurfaceAggregatorValidSurfaceTest,
+       RoundedCornerTransformedMergedSurfaceQuad) {
+  auto middle_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryMiddleFrameSinkId, kChildIsRoot,
+      kNeedsSyncPoints);
+  // Grandchild surface.
+  ParentLocalSurfaceIdAllocator child_allocator;
+  child_allocator.GenerateId();
+
+  LocalSurfaceId grandchild_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId grandchild_surface_id(child_sink_->frame_sink_id(),
+                                  grandchild_local_surface_id);
+  {
+    std::vector<Quad> child_quads[1] = {
+        {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5))},
+    };
+    std::vector<Pass> child_passes = {Pass(child_quads[0], 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_sink_->SubmitCompositorFrame(grandchild_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Child surface.
+  child_allocator.GenerateId();
+  LocalSurfaceId child_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId child_surface_id(child_sink_->frame_sink_id(),
+                             child_local_surface_id);
+  {
+    std::vector<Quad> child_quads = {
+        Quad::SurfaceQuad(SurfaceRange(base::nullopt, grandchild_surface_id),
+                          SK_ColorWHITE, gfx::Rect(5, 5), 1.f, gfx::Transform(),
+                          false, false, gfx::RRectF(0, 0, 96, 10, 5),
+                          /*is_fast_border_radius*/ false)};
+
+    std::vector<Pass> child_passes = {Pass(child_quads, 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_sink_->SubmitCompositorFrame(child_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Root surface.
+  gfx::Transform surface_transform;
+  surface_transform.Translate(3, 4);
+  std::vector<Quad> secondary_quads = {Quad::SurfaceQuad(
+      SurfaceRange(base::nullopt, child_surface_id), SK_ColorWHITE,
+      gfx::Rect(5, 5), 1.f, surface_transform, false, false, gfx::RRectF(),
+      /*is_fast_border_radius*/ false)};
+
+  std::vector<Pass> root_passes = {Pass(secondary_quads, SurfaceSize())};
+
+  CompositorFrame root_frame =
+      CompositorFrameBuilder().SetDeviceScaleFactor(2.0f).Build();
+  AddPasses(&root_frame.render_pass_list, root_passes,
+            &root_frame.metadata.referenced_surfaces);
+
+  root_frame.render_pass_list[0]
+      ->shared_quad_state_list.front()
+      ->quad_to_target_transform.Translate(0, 7);
+  root_sink_->SubmitCompositorFrame(root_local_surface_id_,
+                                    std::move(root_frame));
+
+  SurfaceId root_surface_id(root_sink_->frame_sink_id(),
+                            root_local_surface_id_);
+
+  CompositorFrame aggregated_frame = AggregateFrame(root_surface_id);
+  auto* aggregated_first_pass_sqs =
+      aggregated_frame.render_pass_list[1]->shared_quad_state_list.front();
+
+  // Original rounded rect is (0, 0, 96, 10, 5). This then gets multiplied
+  // by a device scale factor of 2 to (0, 0, 192, 20, 10), then moved
+  // by a (3, 4) translation followed by a (0, 7) translation.
+  EXPECT_EQ(gfx::RRectF(3, 11, 192, 20, 10),
+            aggregated_first_pass_sqs->rounded_corner_bounds);
+}
+
+TEST_F(SurfaceAggregatorValidSurfaceTest, TransformedRoundedSurfaceQuad) {
+  auto middle_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryMiddleFrameSinkId, kChildIsRoot,
+      kNeedsSyncPoints);
+  // Child surface.
+  ParentLocalSurfaceIdAllocator child_allocator;
+  child_allocator.GenerateId();
+
+  // Child surface.
+  child_allocator.GenerateId();
+  LocalSurfaceId child_local_surface_id =
+      child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id();
+  SurfaceId child_surface_id(child_sink_->frame_sink_id(),
+                             child_local_surface_id);
+  {
+    std::vector<Quad> child_quads[1] = {
+        {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5))},
+    };
+    std::vector<Pass> child_passes = {Pass(child_quads[0], 1, SurfaceSize())};
+
+    CompositorFrame child_frame = MakeEmptyCompositorFrame();
+    AddPasses(&child_frame.render_pass_list, child_passes,
+              &child_frame.metadata.referenced_surfaces);
+
+    child_sink_->SubmitCompositorFrame(child_local_surface_id,
+                                       std::move(child_frame));
+  }
+
+  // Root surface.
+  gfx::Transform surface_transform;
+  surface_transform.Translate(3, 4);
+  std::vector<Quad> secondary_quads = {
+      Quad::SurfaceQuad(SurfaceRange(base::nullopt, child_surface_id),
+                        SK_ColorWHITE, gfx::Rect(5, 5), 1.f, surface_transform,
+                        false, false, gfx::RRectF(0, 0, 96, 10, 5),
+                        /* is_fast_border_radius */ true)};
+
+  std::vector<Pass> root_passes = {Pass(secondary_quads, SurfaceSize())};
+
+  CompositorFrame root_frame =
+      CompositorFrameBuilder().SetDeviceScaleFactor(2.0f).Build();
+  AddPasses(&root_frame.render_pass_list, root_passes,
+            &root_frame.metadata.referenced_surfaces);
+
+  root_frame.render_pass_list[0]
+      ->shared_quad_state_list.front()
+      ->quad_to_target_transform.Translate(0, 7);
+  root_sink_->SubmitCompositorFrame(root_local_surface_id_,
+                                    std::move(root_frame));
+
+  SurfaceId root_surface_id(root_sink_->frame_sink_id(),
+                            root_local_surface_id_);
+
+  CompositorFrame aggregated_frame = AggregateFrame(root_surface_id);
+  // Only one aggregated quad will result, because the use of
+  // is_fast_border_radius will result in the child surface being merged
+  // into the parent.
+  auto* aggregated_first_pass_sqs =
+      aggregated_frame.render_pass_list[0]->shared_quad_state_list.front();
+
+  // The rounded rect on the surface quad is already in the space of the root
+  // surface, so the (3, 4) translation should not apply to it.
+  EXPECT_EQ(gfx::RRectF(0, 0, 96, 10, 5),
+            aggregated_first_pass_sqs->rounded_corner_bounds);
+}
+
 }  // namespace
 }  // namespace viz
diff --git a/components/viz/test/data/backdrop_filter_bounds_with_children.png b/components/viz/test/data/backdrop_filter_bounds_with_children.png
new file mode 100644
index 0000000..94e8dcb
--- /dev/null
+++ b/components/viz/test/data/backdrop_filter_bounds_with_children.png
Binary files differ
diff --git a/content/app/strings/translations/content_strings_en-GB.xtb b/content/app/strings/translations/content_strings_en-GB.xtb
index f0e1babf1..c6399a5 100644
--- a/content/app/strings/translations/content_strings_en-GB.xtb
+++ b/content/app/strings/translations/content_strings_en-GB.xtb
@@ -36,6 +36,7 @@
 <translation id="2148716181193084225">Today</translation>
 <translation id="2158401438286456825">page list</translation>
 <translation id="2226276347425096477">Please shorten this text to <ph name="MAX_CHARACTERS" /> characters or less (you are currently using <ph name="CURRENT_LENGTH" /> characters).</translation>
+<translation id="2246498165605549352">Local file</translation>
 <translation id="2247351761944213033">Week <ph name="WEEKNUMBER" />, <ph name="YEAR" /></translation>
 <translation id="2277199496770840904">Track <ph name="NUMBER" /></translation>
 <translation id="2291999235780842123">Tick box</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb
index f34d4f2..48e5866 100644
--- a/content/app/strings/translations/content_strings_et.xtb
+++ b/content/app/strings/translations/content_strings_et.xtb
@@ -36,6 +36,7 @@
 <translation id="2148716181193084225">Täna</translation>
 <translation id="2158401438286456825">lehtede loend</translation>
 <translation id="2226276347425096477">Lühendage seda teksti <ph name="MAX_CHARACTERS" /> tähemärgini või rohkem (praegu kasutate <ph name="CURRENT_LENGTH" /> tähemärki).</translation>
+<translation id="2246498165605549352">Kohalik fail</translation>
 <translation id="2247351761944213033">Nädal <ph name="WEEKNUMBER" />, <ph name="YEAR" /></translation>
 <translation id="2277199496770840904"><ph name="NUMBER" />. lugu</translation>
 <translation id="2291999235780842123">märkeruut</translation>
diff --git a/content/app/strings/translations/content_strings_lv.xtb b/content/app/strings/translations/content_strings_lv.xtb
index b1f6308..cd22d984 100644
--- a/content/app/strings/translations/content_strings_lv.xtb
+++ b/content/app/strings/translations/content_strings_lv.xtb
@@ -36,6 +36,7 @@
 <translation id="2148716181193084225">Šodien</translation>
 <translation id="2158401438286456825">lapu saraksts</translation>
 <translation id="2226276347425096477">Lūdzu, saīsiniet šo tekstu līdz <ph name="MAX_CHARACTERS" /> vai mazāk zīmēm (pašreiz tas ietver <ph name="CURRENT_LENGTH" /> rakstzīmes).</translation>
+<translation id="2246498165605549352">Lokāls fails</translation>
 <translation id="2247351761944213033"><ph name="WEEKNUMBER" />. nedēļa, <ph name="YEAR" />. gads</translation>
 <translation id="2277199496770840904"><ph name="NUMBER" />. ieraksts</translation>
 <translation id="2291999235780842123">izvēles rūtiņa</translation>
diff --git a/content/app/strings/translations/content_strings_pl.xtb b/content/app/strings/translations/content_strings_pl.xtb
index e0d3c16..3775ffb 100644
--- a/content/app/strings/translations/content_strings_pl.xtb
+++ b/content/app/strings/translations/content_strings_pl.xtb
@@ -36,6 +36,7 @@
 <translation id="2148716181193084225">Dzisiaj</translation>
 <translation id="2158401438286456825">lista stron</translation>
 <translation id="2226276347425096477">Skróć ten tekst do maksymalnie <ph name="MAX_CHARACTERS" /> znaków (w tej chwili korzystasz z <ph name="CURRENT_LENGTH" /> znaków).</translation>
+<translation id="2246498165605549352">Plik lokalny</translation>
 <translation id="2247351761944213033">Tydzień <ph name="WEEKNUMBER" />, <ph name="YEAR" /></translation>
 <translation id="2277199496770840904">Utwór <ph name="NUMBER" /></translation>
 <translation id="2291999235780842123">pole wyboru</translation>
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h
index e7b467ee..bba79b3 100644
--- a/content/browser/bad_message.h
+++ b/content/browser/bad_message.h
@@ -126,7 +126,7 @@
   RFH_OWNER_PROPERTY = 99,
   OBSOLETE_BDH_EMPTY_OR_INVALID_FILTERS = 100,
   OBSOLETE_WC_CONTENT_WITH_CERT_ERRORS_BAD_SECURITY_INFO = 101,
-  RFMF_RENDERER_FAKED_ITS_OWN_DEATH = 102,
+  OBSOLETE_RFMF_RENDERER_FAKED_ITS_OWN_DEATH = 102,
   DWNLD_INVALID_SAVABLE_RESOURCE_LINKS_RESPONSE = 103,
   OBSOLETE_DWNLD_INVALID_SERIALIZE_AS_MHTML_RESPONSE = 104,
   BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN = 105,
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index bb01795..90167b0 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -552,8 +552,8 @@
   main_test_rfh()->GetProcess()->SimulateCrash();
   EXPECT_EQ(
       "RenderProcessGone -> 3*: [22*: [], 23*: []]\n"
-      "RenderFrameDeleted(23) -> 3*: [22*: [], 23*: []]\n"
-      "RenderFrameDeleted(22) -> 3*: [22*: [], 23*: []]\n"
+      "RenderFrameDeleted(23) -> 3*: []\n"
+      "RenderFrameDeleted(22) -> 3*: []\n"
       "RenderFrameDeleted(3) -> 3*: []",
       activity.GetLog());
 }
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 1825213..f104289 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -808,6 +808,7 @@
   g_routing_id_frame_map.Get().emplace(
       RenderFrameHostID(GetProcess()->GetID(), routing_id_), this);
   site_instance_->AddObserver(this);
+  process_->AddObserver(this);
   GetSiteInstance()->IncrementActiveFrameCount();
 
   if (frame_tree_node_->parent()) {
@@ -920,6 +921,7 @@
     g_token_frame_map.Get().erase(*overlay_routing_token_);
 
   site_instance_->RemoveObserver(this);
+  process_->RemoveObserver(this);
 
   const bool was_created = render_frame_created_;
   render_frame_created_ = false;
@@ -1375,21 +1377,6 @@
   // either the FrameHost interface or to interfaces bound by this frame.
   ScopedActiveURL scoped_active_url(this);
 
-  // This message map is for handling internal IPC messages which should not
-  // be dispatched to other objects.
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg)
-    // This message is synthetic and doesn't come from RenderFrame, but from
-    // RenderProcessHost.
-    IPC_MESSAGE_HANDLER(FrameHostMsg_RenderProcessGone, OnRenderProcessGone)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-
-  // Internal IPCs should not be leaked outside of this object, so return
-  // early.
-  if (handled)
-    return true;
-
   if (delegate_->OnMessageReceived(this, msg))
     return true;
 
@@ -1399,7 +1386,7 @@
       proxy->cross_process_frame_connector()->OnMessageReceived(msg))
     return true;
 
-  handled = true;
+  bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg)
     IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach)
     IPC_MESSAGE_HANDLER(FrameHostMsg_FrameFocused, OnFrameFocused)
@@ -1571,6 +1558,71 @@
   return frame_tree_node()->IsMainFrame();
 }
 
+void RenderFrameHostImpl::RenderProcessExited(
+    RenderProcessHost* host,
+    const ChildProcessTerminationInfo& info) {
+  if (base::FeatureList::IsEnabled(features::kCrashReporting))
+    MaybeGenerateCrashReport(info.status, info.exit_code);
+
+  // When a frame's process dies, its RenderFrame no longer exists, which means
+  // that its child frames must be cleaned up as well.
+  ResetChildren();
+
+  // Reset state for the current RenderFrameHost once the FrameTreeNode has been
+  // reset.
+  SetRenderFrameCreated(false);
+  InvalidateMojoConnection();
+  document_scoped_interface_provider_binding_.Close();
+  document_interface_broker_content_binding_.Close();
+  document_interface_broker_blink_binding_.Close();
+  SetLastCommittedUrl(GURL());
+
+  // Execute any pending AX tree snapshot callbacks with an empty response,
+  // since we're never going to get a response from this renderer.
+  for (auto& iter : ax_tree_snapshot_callbacks_)
+    std::move(iter.second).Run(ui::AXTreeUpdate());
+
+#if defined(OS_ANDROID)
+  // Execute any pending Samsung smart clip callbacks.
+  for (base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>>::iterator
+           iter(&smart_clip_callbacks_);
+       !iter.IsAtEnd(); iter.Advance()) {
+    std::move(*iter.GetCurrentValue())
+        .Run(base::string16(), base::string16(), gfx::Rect());
+  }
+  smart_clip_callbacks_.Clear();
+#endif  // defined(OS_ANDROID)
+
+  ax_tree_snapshot_callbacks_.clear();
+  visual_state_callbacks_.clear();
+
+  // Ensure that future remote interface requests are associated with the new
+  // process's channel.
+  remote_associated_interfaces_.reset();
+
+  // Any termination disablers in content loaded by the new process will
+  // be sent again.
+  sudden_termination_disabler_types_enabled_ = 0;
+
+  if (unload_state_ != UnloadState::NotRun) {
+    // If the process has died, we don't need to wait for the ACK. Complete the
+    // deletion immediately.
+    unload_state_ = UnloadState::Completed;
+    DCHECK(children_.empty());
+    PendingDeletionCheckCompleted();
+    // |this| is deleted. Don't add any more code at this point in the function.
+    return;
+  }
+
+  // If this was the current pending or speculative RFH dying, cancel and
+  // destroy it.
+  frame_tree_node_->render_manager()->CancelPendingIfNecessary(this);
+
+  // Note: don't add any more code at this point in the function because
+  // |this| may be deleted. Any additional cleanup should happen before
+  // the last block of code here.
+}
+
 void RenderFrameHostImpl::RenderProcessGone(SiteInstanceImpl* site_instance) {
   DCHECK_EQ(site_instance_.get(), site_instance);
 
@@ -2566,72 +2618,6 @@
   PendingDeletionCheckCompleted();  // Can delete |this|.
 }
 
-void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
-  base::TerminationStatus termination_status =
-      static_cast<base::TerminationStatus>(status);
-
-  if (base::FeatureList::IsEnabled(features::kCrashReporting))
-    MaybeGenerateCrashReport(termination_status, exit_code);
-
-  // When a frame's process dies, its RenderFrame no longer exists, which means
-  // that its child frames must be cleaned up as well.
-  ResetChildren();
-
-  // Reset state for the current RenderFrameHost once the FrameTreeNode has been
-  // reset.
-  SetRenderFrameCreated(false);
-  InvalidateMojoConnection();
-  document_scoped_interface_provider_binding_.Close();
-  document_interface_broker_content_binding_.Close();
-  document_interface_broker_blink_binding_.Close();
-  SetLastCommittedUrl(GURL());
-
-  // Execute any pending AX tree snapshot callbacks with an empty response,
-  // since we're never going to get a response from this renderer.
-  for (auto& iter : ax_tree_snapshot_callbacks_)
-    std::move(iter.second).Run(ui::AXTreeUpdate());
-
-#if defined(OS_ANDROID)
-  // Execute any pending Samsung smart clip callbacks.
-  for (base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>>::iterator
-           iter(&smart_clip_callbacks_);
-       !iter.IsAtEnd(); iter.Advance()) {
-    std::move(*iter.GetCurrentValue())
-        .Run(base::string16(), base::string16(), gfx::Rect());
-  }
-  smart_clip_callbacks_.Clear();
-#endif  // defined(OS_ANDROID)
-
-  ax_tree_snapshot_callbacks_.clear();
-  visual_state_callbacks_.clear();
-
-  // Ensure that future remote interface requests are associated with the new
-  // process's channel.
-  remote_associated_interfaces_.reset();
-
-  // Any termination disablers in content loaded by the new process will
-  // be sent again.
-  sudden_termination_disabler_types_enabled_ = 0;
-
-  if (unload_state_ != UnloadState::NotRun) {
-    // If the process has died, we don't need to wait for the ACK. Complete the
-    // deletion immediately.
-    unload_state_ = UnloadState::Completed;
-    DCHECK(children_.empty());
-    PendingDeletionCheckCompleted();
-    // |this| is deleted. Don't add any more code at this point in the function.
-    return;
-  }
-
-  // If this was the current pending or speculative RFH dying, cancel and
-  // destroy it.
-  frame_tree_node_->render_manager()->CancelPendingIfNecessary(this);
-
-  // Note: don't add any more code at this point in the function because
-  // |this| may be deleted. Any additional cleanup should happen before
-  // the last block of code here.
-}
-
 void RenderFrameHostImpl::OnSwappedOut() {
   DCHECK(is_waiting_for_swapout_ack_);
 
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 6a27b30c..1dbfc41 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -51,6 +51,7 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host_observer.h"
 #include "content/public/common/javascript_dialog_type.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/transferrable_url_loader.mojom.h"
@@ -175,6 +176,7 @@
       public base::SupportsUserData,
       public mojom::FrameHost,
       public BrowserAccessibilityDelegate,
+      public RenderProcessHostObserver,
       public SiteInstanceImpl::Observer,
       public service_manager::mojom::InterfaceProvider,
       public blink::mojom::DocumentInterfaceBroker,
@@ -302,6 +304,10 @@
       override;
   bool AccessibilityIsMainFrame() override;
 
+  // RenderProcessHostObserver implementation.
+  void RenderProcessExited(RenderProcessHost* host,
+                           const ChildProcessTerminationInfo& info) override;
+
   // SiteInstanceImpl::Observer
   void RenderProcessGone(SiteInstanceImpl* site_instance) override;
 
@@ -1069,7 +1075,6 @@
       const base::TimeTicks& renderer_before_unload_start_time,
       const base::TimeTicks& renderer_before_unload_end_time);
   void OnSwapOutACK();
-  void OnRenderProcessGone(int status, int error_code);
   void OnContextMenu(const ContextMenuParams& params);
   void OnVisualStateResponse(uint64_t id);
   void OnRunJavaScriptDialog(const base::string16& message,
diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc
index 95f6afd..9bcc0bc 100644
--- a/content/browser/frame_host/render_frame_message_filter.cc
+++ b/content/browser/frame_host/render_frame_message_filter.cc
@@ -328,8 +328,6 @@
     IPC_MESSAGE_HANDLER(FrameHostMsg_SaveImageFromDataURL,
                         OnSaveImageFromDataURL)
     IPC_MESSAGE_HANDLER(FrameHostMsg_Are3DAPIsBlocked, OnAre3DAPIsBlocked)
-    IPC_MESSAGE_HANDLER_GENERIC(FrameHostMsg_RenderProcessGone,
-                                OnRenderProcessGone())
 #if BUILDFLAG(ENABLE_PLUGINS)
     IPC_MESSAGE_HANDLER(FrameHostMsg_GetPluginInfo, OnGetPluginInfo)
     IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_OpenChannelToPepperPlugin,
@@ -553,15 +551,6 @@
       top_origin_url, render_process_id_, render_frame_id, requester);
 }
 
-void RenderFrameMessageFilter::OnRenderProcessGone() {
-  // FrameHostMessage_RenderProcessGone is a synthetic IPC message used by
-  // RenderProcessHostImpl to clean things up after a crash (it's injected
-  // downstream of this filter). Allowing it to proceed would enable a renderer
-  // to fake its own death; instead, actually kill the renderer.
-  bad_message::ReceivedBadMessage(
-      this, bad_message::RFMF_RENDERER_FAKED_ITS_OWN_DEATH);
-}
-
 void RenderFrameMessageFilter::SetCookie(int32_t render_frame_id,
                                          const GURL& url,
                                          const GURL& site_for_cookies,
diff --git a/content/browser/frame_host/render_frame_message_filter_browsertest.cc b/content/browser/frame_host/render_frame_message_filter_browsertest.cc
index 459bfe5..e108cd2 100644
--- a/content/browser/frame_host/render_frame_message_filter_browsertest.cc
+++ b/content/browser/frame_host/render_frame_message_filter_browsertest.cc
@@ -285,30 +285,6 @@
       v.DepictFrameTree(tab->GetFrameTree()->root()));
 }
 
-// FrameHostMsg_RenderProcessGone is a synthetic message that's really an
-// implementation detail of RenderProcessHostImpl's crash recovery. It should be
-// ignored if it arrives over the IPC channel.
-IN_PROC_BROWSER_TEST_F(RenderFrameMessageFilterBrowserTest, RenderProcessGone) {
-  GURL web_url("http://foo.com/simple_page.html");
-  NavigateToURL(shell(), web_url);
-  RenderFrameHost* web_rfh = shell()->web_contents()->GetMainFrame();
-
-  ASSERT_TRUE(web_rfh->IsRenderFrameLive());
-  RenderProcessHostKillWaiter kill_waiter(web_rfh->GetProcess());
-  IPC::IpcSecurityTestUtil::PwnMessageReceived(
-      web_rfh->GetProcess()->GetChannel(),
-      FrameHostMsg_RenderProcessGone(
-          web_rfh->GetRoutingID(), base::TERMINATION_STATUS_NORMAL_TERMINATION,
-          0));
-
-  // If the message had gone through, we'd have marked the RFH as dead but
-  // left the RPH and its connection alive, and the Wait below would hang.
-  EXPECT_EQ(bad_message::RFMF_RENDERER_FAKED_ITS_OWN_DEATH, kill_waiter.Wait());
-
-  ASSERT_FALSE(web_rfh->GetProcess()->IsInitializedAndNotDead());
-  ASSERT_FALSE(web_rfh->IsRenderFrameLive());
-}
-
 class WaitingCookieStore : public net::CookieMonster {
  public:
   WaitingCookieStore() : CookieMonster(nullptr, nullptr) {}
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc
index 0d65276..44c0e46 100644
--- a/content/browser/loader/cross_site_document_blocking_browsertest.cc
+++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -673,6 +673,11 @@
 IN_PROC_BROWSER_TEST_P(CrossSiteDocumentBlockingTest, BackToAboutBlank) {
   embedded_test_server()->StartAcceptingConnections();
 
+  // TODO(lukasza, nasko): https://crbug.com/888079: Re-enable the test once
+  // initiator origin is stored and reused for history navigations.
+  if (!AreAllSitesIsolatedForTesting())
+    return;
+
   // Prepare to verify results of a fetch.
   GURL resource_url("http://foo.com/title2.html");
   const char* resource = "title2.html";
diff --git a/content/browser/media/capture/web_contents_audio_muter.cc b/content/browser/media/capture/web_contents_audio_muter.cc
index 95fce2a..386ebee 100644
--- a/content/browser/media/capture/web_contents_audio_muter.cc
+++ b/content/browser/media/capture/web_contents_audio_muter.cc
@@ -52,6 +52,7 @@
   void SetVolume(double volume) override {}
   void GetVolume(double* volume) override { *volume = 0; }
   void Close() override { delete this; }
+  void Flush() override {}
 
  private:
   ~AudioDiscarder() override {}
diff --git a/content/browser/native_file_system/file_system_chooser.h b/content/browser/native_file_system/file_system_chooser.h
index efa9bd1..0017005b 100644
--- a/content/browser/native_file_system/file_system_chooser.h
+++ b/content/browser/native_file_system/file_system_chooser.h
@@ -9,6 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/task_runner.h"
 #include "content/common/content_export.h"
+#include "storage/browser/fileapi/isolated_context.h"
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_manager.mojom.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 
diff --git a/content/browser/native_file_system/native_file_system_directory_handle_impl.cc b/content/browser/native_file_system/native_file_system_directory_handle_impl.cc
index c2945a84..36da9ea 100644
--- a/content/browser/native_file_system/native_file_system_directory_handle_impl.cc
+++ b/content/browser/native_file_system/native_file_system_directory_handle_impl.cc
@@ -33,9 +33,13 @@
 
 NativeFileSystemDirectoryHandleImpl::NativeFileSystemDirectoryHandleImpl(
     NativeFileSystemManagerImpl* manager,
-    const storage::FileSystemURL& url)
-    : manager_(manager), url_(url) {
+    const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system)
+    : manager_(manager), url_(url), file_system_(std::move(file_system)) {
   DCHECK(manager_);
+  DCHECK_EQ(url_.mount_type() == storage::kFileSystemTypeIsolated,
+            file_system_.is_valid())
+      << url_.mount_type();
 }
 
 NativeFileSystemDirectoryHandleImpl::~NativeFileSystemDirectoryHandleImpl() =
@@ -151,7 +155,7 @@
   }
 
   std::move(callback).Run(NativeFileSystemError::New(base::File::FILE_OK),
-                          manager()->CreateFileHandle(url));
+                          manager()->CreateFileHandle(url, file_system_));
 }
 
 void NativeFileSystemDirectoryHandleImpl::DidGetDirectory(
@@ -166,7 +170,7 @@
   }
 
   std::move(callback).Run(NativeFileSystemError::New(base::File::FILE_OK),
-                          manager()->CreateDirectoryHandle(url));
+                          manager()->CreateDirectoryHandle(url, file_system_));
 }
 
 void NativeFileSystemDirectoryHandleImpl::DidReadDirectory(
@@ -279,12 +283,14 @@
   if (is_directory) {
     return NativeFileSystemEntry::New(
         NativeFileSystemHandle::NewDirectory(
-            manager()->CreateDirectoryHandle(url).PassInterface()),
+            manager()
+                ->CreateDirectoryHandle(url, file_system_)
+                .PassInterface()),
         name);
   }
   return NativeFileSystemEntry::New(
       NativeFileSystemHandle::NewFile(
-          manager()->CreateFileHandle(url).PassInterface()),
+          manager()->CreateFileHandle(url, file_system_).PassInterface()),
       name);
 }
 
diff --git a/content/browser/native_file_system/native_file_system_directory_handle_impl.h b/content/browser/native_file_system/native_file_system_directory_handle_impl.h
index 55f9516..134874e 100644
--- a/content/browser/native_file_system/native_file_system_directory_handle_impl.h
+++ b/content/browser/native_file_system/native_file_system_directory_handle_impl.h
@@ -31,11 +31,16 @@
 class NativeFileSystemDirectoryHandleImpl
     : public blink::mojom::NativeFileSystemDirectoryHandle {
  public:
-  NativeFileSystemDirectoryHandleImpl(NativeFileSystemManagerImpl* manager,
-                                      const storage::FileSystemURL& url);
+  NativeFileSystemDirectoryHandleImpl(
+      NativeFileSystemManagerImpl* manager,
+      const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system);
   ~NativeFileSystemDirectoryHandleImpl() override;
 
   const storage::FileSystemURL& url() const { return url_; }
+  const storage::IsolatedContext::ScopedFSHandle& file_system() const {
+    return file_system_;
+  }
 
   // blink::mojom::NativeFileSystemDirectoryHandle:
   void GetFile(const std::string& name,
@@ -103,6 +108,7 @@
   // The NativeFileSystemManagerImpl that owns us.
   NativeFileSystemManagerImpl* const manager_;
   const storage::FileSystemURL url_;
+  const storage::IsolatedContext::ScopedFSHandle file_system_;
 
   base::WeakPtrFactory<NativeFileSystemDirectoryHandleImpl> weak_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(NativeFileSystemDirectoryHandleImpl);
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl.cc b/content/browser/native_file_system/native_file_system_file_handle_impl.cc
index 90af9f4..41ae74e 100644
--- a/content/browser/native_file_system/native_file_system_file_handle_impl.cc
+++ b/content/browser/native_file_system/native_file_system_file_handle_impl.cc
@@ -28,9 +28,13 @@
 
 NativeFileSystemFileHandleImpl::NativeFileSystemFileHandleImpl(
     NativeFileSystemManagerImpl* manager,
-    const storage::FileSystemURL& url)
-    : manager_(manager), url_(url) {
+    const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system)
+    : manager_(manager), url_(url), file_system_(std::move(file_system)) {
   DCHECK(manager_);
+  DCHECK_EQ(url_.mount_type() == storage::kFileSystemTypeIsolated,
+            file_system_.is_valid())
+      << url_.mount_type();
 }
 
 NativeFileSystemFileHandleImpl::~NativeFileSystemFileHandleImpl() = default;
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl.h b/content/browser/native_file_system/native_file_system_file_handle_impl.h
index 39e803b8..e070406 100644
--- a/content/browser/native_file_system/native_file_system_file_handle_impl.h
+++ b/content/browser/native_file_system/native_file_system_file_handle_impl.h
@@ -36,11 +36,16 @@
 class CONTENT_EXPORT NativeFileSystemFileHandleImpl
     : public blink::mojom::NativeFileSystemFileHandle {
  public:
-  NativeFileSystemFileHandleImpl(NativeFileSystemManagerImpl* manager,
-                                 const storage::FileSystemURL& url);
+  NativeFileSystemFileHandleImpl(
+      NativeFileSystemManagerImpl* manager,
+      const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system);
   ~NativeFileSystemFileHandleImpl() override;
 
   const storage::FileSystemURL& url() const { return url_; }
+  const storage::IsolatedContext::ScopedFSHandle& file_system() const {
+    return file_system_;
+  }
 
   // blink::mojom::NativeFileSystemFileHandle:
   void AsBlob(AsBlobCallback callback) override;
@@ -96,6 +101,7 @@
   // The NativeFileSystemManagerImpl that owns us.
   NativeFileSystemManagerImpl* const manager_;
   const storage::FileSystemURL url_;
+  const storage::IsolatedContext::ScopedFSHandle file_system_;
 
   base::WeakPtrFactory<NativeFileSystemFileHandleImpl> weak_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(NativeFileSystemFileHandleImpl);
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc b/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc
index de1adba..b51796a 100644
--- a/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc
+++ b/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc
@@ -58,8 +58,8 @@
     manager_ = base::MakeRefCounted<NativeFileSystemManagerImpl>(
         file_system_context_, chrome_blob_context_);
 
-    handle_ = std::make_unique<NativeFileSystemFileHandleImpl>(manager_.get(),
-                                                               test_url_);
+    handle_ = std::make_unique<NativeFileSystemFileHandleImpl>(
+        manager_.get(), test_url_, storage::IsolatedContext::ScopedFSHandle());
   }
 
   blink::mojom::BlobPtr CreateBlob(const std::string& contents) {
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.cc b/content/browser/native_file_system/native_file_system_manager_impl.cc
index 3f7e20fb..af382dab 100644
--- a/content/browser/native_file_system/native_file_system_manager_impl.cc
+++ b/content/browser/native_file_system/native_file_system_manager_impl.cc
@@ -85,25 +85,35 @@
 
 blink::mojom::NativeFileSystemFileHandlePtr
 NativeFileSystemManagerImpl::CreateFileHandle(
-    const storage::FileSystemURL& url) {
+    const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(url.is_valid());
+  DCHECK_EQ(url.mount_type() == storage::kFileSystemTypeIsolated,
+            file_system.is_valid())
+      << url.mount_type();
+
   blink::mojom::NativeFileSystemFileHandlePtr result;
-  file_bindings_.AddBinding(
-      std::make_unique<NativeFileSystemFileHandleImpl>(this, url),
-      mojo::MakeRequest(&result));
+  file_bindings_.AddBinding(std::make_unique<NativeFileSystemFileHandleImpl>(
+                                this, url, std::move(file_system)),
+                            mojo::MakeRequest(&result));
   return result;
 }
 
 blink::mojom::NativeFileSystemDirectoryHandlePtr
 NativeFileSystemManagerImpl::CreateDirectoryHandle(
-    const storage::FileSystemURL& url) {
+    const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(url.is_valid());
+  DCHECK_EQ(url.mount_type() == storage::kFileSystemTypeIsolated,
+            file_system.is_valid())
+      << url.mount_type();
 
   blink::mojom::NativeFileSystemDirectoryHandlePtr result;
   directory_bindings_.AddBinding(
-      std::make_unique<NativeFileSystemDirectoryHandleImpl>(this, url),
+      std::make_unique<NativeFileSystemDirectoryHandleImpl>(
+          this, url, std::move(file_system)),
       mojo::MakeRequest(&result));
   return result;
 }
@@ -113,16 +123,13 @@
     const url::Origin& origin,
     const base::FilePath& file_path) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  std::string name;
-  auto url = CreateFileSystemURLFromPath(origin, file_path, &name);
+  auto url = CreateFileSystemURLFromPath(origin, file_path);
 
-  // TODO(https://crbug.com/955185): Pass file system ID to the handle
-  // implementations so they can properly ref and unref the filesystem.
-  // Right now the isolated file system will just be leaked and never freed.
   return blink::mojom::NativeFileSystemEntry::New(
       blink::mojom::NativeFileSystemHandle::NewFile(
-          CreateFileHandle(url).PassInterface()),
-      name);
+          CreateFileHandle(url.url, std::move(url.file_system))
+              .PassInterface()),
+      url.base_name);
 }
 
 blink::mojom::NativeFileSystemEntryPtr
@@ -130,29 +137,26 @@
     const url::Origin& origin,
     const base::FilePath& directory_path) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  std::string name;
-  auto url = CreateFileSystemURLFromPath(origin, directory_path, &name);
+  auto url = CreateFileSystemURLFromPath(origin, directory_path);
 
-  // TODO(https://crbug.com/955185): Pass file system ID to the handle
-  // implementations so they can properly ref and unref the filesystem.
-  // Right now the isolated file system will just be leaked and never freed.
   return blink::mojom::NativeFileSystemEntry::New(
       blink::mojom::NativeFileSystemHandle::NewDirectory(
-          CreateDirectoryHandle(url).PassInterface()),
-      name);
+          CreateDirectoryHandle(url.url, std::move(url.file_system))
+              .PassInterface()),
+      url.base_name);
 }
 
 void NativeFileSystemManagerImpl::CreateTransferToken(
     const NativeFileSystemFileHandleImpl& file,
     blink::mojom::NativeFileSystemTransferTokenRequest request) {
-  return CreateTransferTokenImpl(file.url(),
+  return CreateTransferTokenImpl(file.url(), file.file_system(),
                                  /*is_directory=*/false, std::move(request));
 }
 
 void NativeFileSystemManagerImpl::CreateTransferToken(
     const NativeFileSystemDirectoryHandleImpl& directory,
     blink::mojom::NativeFileSystemTransferTokenRequest request) {
-  return CreateTransferTokenImpl(directory.url(),
+  return CreateTransferTokenImpl(directory.url(), directory.file_system(),
                                  /*is_directory=*/true, std::move(request));
 }
 
@@ -188,8 +192,9 @@
     return;
   }
 
-  std::move(callback).Run(NativeFileSystemError::New(base::File::FILE_OK),
-                          CreateDirectoryHandle(context()->CrackURL(root)));
+  std::move(callback).Run(
+      NativeFileSystemError::New(base::File::FILE_OK),
+      CreateDirectoryHandle(context()->CrackURL(root), /*file_system=*/{}));
 }
 
 void NativeFileSystemManagerImpl::DidChooseEntries(
@@ -216,14 +221,15 @@
 
 void NativeFileSystemManagerImpl::CreateTransferTokenImpl(
     const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system,
     bool is_directory,
     blink::mojom::NativeFileSystemTransferTokenRequest request) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   auto token_impl = std::make_unique<NativeFileSystemTransferTokenImpl>(
-      url, is_directory
-               ? NativeFileSystemTransferTokenImpl::HandleType::kDirectory
-               : NativeFileSystemTransferTokenImpl::HandleType::kFile);
+      url, std::move(file_system),
+      is_directory ? NativeFileSystemTransferTokenImpl::HandleType::kDirectory
+                   : NativeFileSystemTransferTokenImpl::HandleType::kFile);
   auto token = token_impl->token();
   blink::mojom::NativeFileSystemTransferTokenPtr result;
   auto emplace_result = transfer_tokens_.emplace(
@@ -258,29 +264,28 @@
   }
 }
 
-storage::FileSystemURL NativeFileSystemManagerImpl::CreateFileSystemURLFromPath(
+NativeFileSystemManagerImpl::FileSystemURLAndFSHandle
+NativeFileSystemManagerImpl::CreateFileSystemURLFromPath(
     const url::Origin& origin,
-    const base::FilePath& path,
-    std::string* name) {
+    const base::FilePath& path) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   auto* isolated_context = storage::IsolatedContext::GetInstance();
   DCHECK(isolated_context);
 
-  storage::IsolatedContext::ScopedFSHandle file_system =
-      isolated_context->RegisterFileSystemForPath(
-          storage::kFileSystemTypeNativeLocal, std::string(), path, name);
+  FileSystemURLAndFSHandle result;
 
-  // TODO(https://crbug.com/955185): Properly refcount file system in handle
-  // implementations, rather than just leaking them like this.
-  storage::IsolatedContext::GetInstance()->AddReference(file_system.id());
+  result.file_system = isolated_context->RegisterFileSystemForPath(
+      storage::kFileSystemTypeNativeLocal, std::string(), path,
+      &result.base_name);
 
   base::FilePath root_path =
-      isolated_context->CreateVirtualRootPath(file_system.id());
-  base::FilePath isolated_path = root_path.AppendASCII(*name);
+      isolated_context->CreateVirtualRootPath(result.file_system.id());
+  base::FilePath isolated_path = root_path.AppendASCII(result.base_name);
 
-  return context()->CreateCrackedFileSystemURL(
+  result.url = context()->CreateCrackedFileSystemURL(
       origin.GetURL(), storage::kFileSystemTypeIsolated, isolated_path);
+  return result;
 }
 
 }  // namespace content
\ No newline at end of file
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.h b/content/browser/native_file_system/native_file_system_manager_impl.h
index acada096..ff922c2 100644
--- a/content/browser/native_file_system/native_file_system_manager_impl.h
+++ b/content/browser/native_file_system/native_file_system_manager_impl.h
@@ -63,12 +63,14 @@
   // Creates a new NativeFileSystemFileHandleImpl for a given url. Assumes the
   // passed in URL is valid and represents a file.
   blink::mojom::NativeFileSystemFileHandlePtr CreateFileHandle(
-      const storage::FileSystemURL& url);
+      const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system);
 
   // Creates a new NativeFileSystemDirectoryHandleImpl for a given url. Assumes
   // the passed in URL is valid and represents a directory.
   blink::mojom::NativeFileSystemDirectoryHandlePtr CreateDirectoryHandle(
-      const storage::FileSystemURL& url);
+      const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system);
 
   // Creates a new NativeFileSystemEntryPtr from the path to a file. Assumes the
   // passed in path is valid and represents a file.
@@ -126,6 +128,7 @@
 
   void CreateTransferTokenImpl(
       const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system,
       bool is_directory,
       blink::mojom::NativeFileSystemTransferTokenRequest request);
   void TransferTokenConnectionErrorHandler(const base::UnguessableToken& token);
@@ -134,9 +137,14 @@
                               const base::UnguessableToken& token);
 
   // Creates a FileSystemURL which corresponds to a FilePath and Origin.
-  storage::FileSystemURL CreateFileSystemURLFromPath(const url::Origin& origin,
-                                                     const base::FilePath& path,
-                                                     std::string* name);
+  struct FileSystemURLAndFSHandle {
+    storage::FileSystemURL url;
+    std::string base_name;
+    storage::IsolatedContext::ScopedFSHandle file_system;
+  };
+  FileSystemURLAndFSHandle CreateFileSystemURLFromPath(
+      const url::Origin& origin,
+      const base::FilePath& path);
 
   const scoped_refptr<storage::FileSystemContext> context_;
   const scoped_refptr<ChromeBlobStorageContext> blob_context_;
diff --git a/content/browser/native_file_system/native_file_system_transfer_token_impl.cc b/content/browser/native_file_system/native_file_system_transfer_token_impl.cc
index 662fd02f..1fe718c 100644
--- a/content/browser/native_file_system/native_file_system_transfer_token_impl.cc
+++ b/content/browser/native_file_system/native_file_system_transfer_token_impl.cc
@@ -8,8 +8,16 @@
 
 NativeFileSystemTransferTokenImpl::NativeFileSystemTransferTokenImpl(
     const storage::FileSystemURL& url,
+    storage::IsolatedContext::ScopedFSHandle file_system,
     HandleType type)
-    : token_(base::UnguessableToken::Create()), url_(url), type_(type) {}
+    : token_(base::UnguessableToken::Create()),
+      url_(url),
+      file_system_(std::move(file_system)),
+      type_(type) {
+  DCHECK_EQ(url_.mount_type() == storage::kFileSystemTypeIsolated,
+            file_system_.is_valid())
+      << url_.mount_type();
+}
 
 void NativeFileSystemTransferTokenImpl::GetInternalID(
     GetInternalIDCallback callback) {
diff --git a/content/browser/native_file_system/native_file_system_transfer_token_impl.h b/content/browser/native_file_system/native_file_system_transfer_token_impl.h
index 239968c..473d60f 100644
--- a/content/browser/native_file_system/native_file_system_transfer_token_impl.h
+++ b/content/browser/native_file_system/native_file_system_transfer_token_impl.h
@@ -6,6 +6,7 @@
 #define CONTENT_BROWSER_NATIVE_FILE_SYSTEM_NATIVE_FILE_SYSTEM_TRANSFER_TOKEN_IMPL_H_
 
 #include "storage/browser/fileapi/file_system_url.h"
+#include "storage/browser/fileapi/isolated_context.h"
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_transfer_token.mojom.h"
 
 namespace content {
@@ -20,8 +21,10 @@
  public:
   enum class HandleType { kFile, kDirectory };
 
-  NativeFileSystemTransferTokenImpl(const storage::FileSystemURL& url,
-                                    HandleType type);
+  NativeFileSystemTransferTokenImpl(
+      const storage::FileSystemURL& url,
+      storage::IsolatedContext::ScopedFSHandle file_system,
+      HandleType type);
 
   const base::UnguessableToken& token() const { return token_; }
   const storage::FileSystemURL& url() const { return url_; }
@@ -33,6 +36,7 @@
  private:
   const base::UnguessableToken token_;
   const storage::FileSystemURL url_;
+  const storage::IsolatedContext::ScopedFSHandle file_system_;
   const HandleType type_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeFileSystemTransferTokenImpl);
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc
index ada87ca..b45333f 100644
--- a/content/browser/portal/portal.cc
+++ b/content/browser/portal/portal.cc
@@ -163,6 +163,15 @@
 }
 
 void Portal::Navigate(const GURL& url) {
+  if (!url.SchemeIsHTTPOrHTTPS()) {
+    mojo::ReportBadMessage("Portal::Navigate tried to use non-HTTP protocol.");
+    binding_->Close();  // Also deletes |this|.
+    return;
+  }
+
+  // TODO(lfg): Investigate which other restrictions we might need when
+  // navigating portals. See http://crbug.com/964395.
+
   NavigationController::LoadURLParams load_url_params(url);
   portal_contents_impl_->GetController().LoadURLWithParams(load_url_params);
 }
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index a3f3892..11ae0aa 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -22,6 +22,7 @@
 #include "content/public/test/hit_test_region_observer.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/shell/browser/shell.h"
+#include "content/test/content_browser_test_utils_internal.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -59,6 +60,15 @@
     portal_->Activate(std::move(data), std::move(callback));
   }
 
+  void Navigate(const GURL& url) override {
+    if (navigate_callback_) {
+      navigate_callback_.Run(url);
+      return;
+    }
+
+    portal_->Navigate(url);
+  }
+
   void WaitForActivate() {
     if (portal_activated_)
       return;
@@ -72,6 +82,9 @@
   content::Portal* GetPortal() { return portal_.get(); }
   WebContents* GetPortalContents() { return portal_->GetPortalContents(); }
 
+  // IPC callbacks
+  base::RepeatingCallback<void(const GURL&)> navigate_callback_;
+
  private:
   PortalInterceptorForTesting(RenderFrameHostImpl* render_frame_host_impl)
       : portal_(content::Portal::CreateForTesting(render_frame_host_impl)) {}
@@ -487,6 +500,39 @@
       << "Note: The portal's FrameSinkId is " << portal_view->GetFrameSinkId();
 }
 
+// Tests that trying to navigate to a chrome:// URL kills the renderer.
+IN_PROC_BROWSER_TEST_F(PortalBrowserTest, NavigateToChrome) {
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
+  WebContentsImpl* web_contents_impl =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame();
+
+  // Create portal.
+  PortalCreatedObserver portal_created_observer(main_frame);
+  EXPECT_TRUE(ExecJs(main_frame,
+                     "var portal = document.createElement('portal');"
+                     "document.body.appendChild(portal);"));
+  Portal* portal = portal_created_observer.WaitUntilPortalCreated();
+  PortalInterceptorForTesting* portal_interceptor =
+      PortalInterceptorForTesting::From(portal);
+  WebContentsImpl* portal_contents = portal->GetPortalContents();
+
+  // Try to navigate to chrome://settings and wait for the process to die.
+  portal_interceptor->navigate_callback_ = base::BindRepeating(
+      [](Portal* portal, const GURL& url) {
+        GURL chrome_url("chrome://settings");
+        portal->Navigate(chrome_url);
+      },
+      portal);
+  RenderProcessHostKillWaiter kill_waiter(
+      portal_contents->GetMainFrame()->GetProcess());
+  GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  ignore_result(ExecJs(main_frame, JsReplace("portal.src = $1;", a_url)));
+
+  EXPECT_EQ(base::nullopt, kill_waiter.Wait());
+}
+
 class PortalOOPIFBrowserTest : public PortalBrowserTest {
  protected:
   PortalOOPIFBrowserTest() {}
diff --git a/content/browser/renderer_host/media/audio_output_delegate_impl.cc b/content/browser/renderer_host/media/audio_output_delegate_impl.cc
index aa87128..4c516cd 100644
--- a/content/browser/renderer_host/media/audio_output_delegate_impl.cc
+++ b/content/browser/renderer_host/media/audio_output_delegate_impl.cc
@@ -197,6 +197,11 @@
   audio_log_->OnStopped();
 }
 
+void AudioOutputDelegateImpl::OnFlushStream() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  controller_->Flush();
+}
+
 void AudioOutputDelegateImpl::OnSetVolume(double volume) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK_GE(volume, 0);
diff --git a/content/browser/renderer_host/media/audio_output_delegate_impl.h b/content/browser/renderer_host/media/audio_output_delegate_impl.h
index f5d3a02..59f0fc8 100644
--- a/content/browser/renderer_host/media/audio_output_delegate_impl.h
+++ b/content/browser/renderer_host/media/audio_output_delegate_impl.h
@@ -66,6 +66,7 @@
   int GetStreamId() override;
   void OnPlayStream() override;
   void OnPauseStream() override;
+  void OnFlushStream() override;
   void OnSetVolume(double volume) override;
 
  private:
diff --git a/content/browser/renderer_host/media/audio_output_delegate_impl_unittest.cc b/content/browser/renderer_host/media/audio_output_delegate_impl_unittest.cc
index e4d186b9..86070c3 100644
--- a/content/browser/renderer_host/media/audio_output_delegate_impl_unittest.cc
+++ b/content/browser/renderer_host/media/audio_output_delegate_impl_unittest.cc
@@ -106,6 +106,7 @@
   void SetVolume(double volume) override {}
   void GetVolume(double* volume) override { *volume = 1; }
   void Close() override {}
+  void Flush() override {}
 };
 
 class MockAudioOutputStreamObserver
diff --git a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc
index b3f6212..c1f510a2 100644
--- a/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc
+++ b/content/browser/renderer_host/media/old_render_frame_audio_output_stream_factory_unittest.cc
@@ -78,6 +78,7 @@
   MOCK_METHOD0(GetStreamId, int());
   MOCK_METHOD0(OnPlayStream, void());
   MOCK_METHOD0(OnPauseStream, void());
+  MOCK_METHOD0(OnFlushStream, void());
   MOCK_METHOD1(OnSetVolume, void(double));
 
  private:
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 0e9f6e57..9f1ba1fa 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -4109,9 +4109,8 @@
       // May be in case of IPC error, if it takes long time for renderer
       // to exit. Child process will be killed in any case during
       // child_process_launcher_.reset(). Make sure we will not broadcast
-      // FrameHostMsg_RenderProcessGone with status
-      // TERMINATION_STATUS_STILL_RUNNING, since this will break WebContentsImpl
-      // logic.
+      // RenderProcessExited with status TERMINATION_STATUS_STILL_RUNNING, since
+      // this will break WebContentsImpl logic.
       info.status = base::TERMINATION_STATUS_PROCESS_CRASHED;
 
 // TODO(siggi): Remove this once https://crbug.com/806661 is resolved.
@@ -4130,7 +4129,7 @@
 
   UpdateProcessPriority();
 
-  // RenderProcessGone relies on the exit code set during shutdown.
+  // RenderProcessExited relies on the exit code set during shutdown.
   if (shutdown_exit_code_ != -1)
     info.exit_code = shutdown_exit_code_;
 
@@ -4138,13 +4137,6 @@
   for (auto& observer : observers_)
     observer.RenderProcessExited(this, info);
 
-  base::IDMap<IPC::Listener*>::iterator iter(&listeners_);
-  while (!iter.IsAtEnd()) {
-    iter.GetCurrentValue()->OnMessageReceived(FrameHostMsg_RenderProcessGone(
-        iter.GetCurrentKey(), static_cast<int>(info.status), info.exit_code));
-    iter.Advance();
-  }
-
   NotificationService::current()->Notify(
       NOTIFICATION_RENDERER_PROCESS_CLOSED, Source<RenderProcessHost>(this),
       Details<ChildProcessTerminationInfo>(&info));
diff --git a/content/browser/tracing/startup_tracing_browsertest.cc b/content/browser/tracing/startup_tracing_browsertest.cc
index 5ce4792..e067ff1 100644
--- a/content/browser/tracing/startup_tracing_browsertest.cc
+++ b/content/browser/tracing/startup_tracing_browsertest.cc
@@ -122,7 +122,8 @@
 // StartupTraceWriter, which Perfetto will then have to sync copy into
 // the SMB once the full tracing service starts up. This is to catch common
 // deadlocks.
-IN_PROC_BROWSER_TEST_F(StartupTracingInProcessTest, TestFilledStartupBuffer) {
+IN_PROC_BROWSER_TEST_F(StartupTracingInProcessTest,
+                       DISABLED_TestFilledStartupBuffer) {
   tracing::TraceEventDataSource::GetInstance()->SetupStartupTracing(
       /*privacy_filtering_enabled=*/false);
 
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 3759f0f..d4bbc9d3 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -1113,12 +1113,6 @@
 // detached from the DOM.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_Detach)
 
-// Indicates the renderer process is gone.  This actually is sent by the
-// browser process to itself, but keeps the interface cleaner.
-IPC_MESSAGE_ROUTED2(FrameHostMsg_RenderProcessGone,
-                    int, /* this really is base::TerminationStatus */
-                    int /* exit_code */)
-
 // Sent by the renderer when the frame becomes focused.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_FrameFocused)
 
diff --git a/content/common/swapped_out_messages.cc b/content/common/swapped_out_messages.cc
index 35bc65d..24e0f0f 100644
--- a/content/common/swapped_out_messages.cc
+++ b/content/common/swapped_out_messages.cc
@@ -18,7 +18,6 @@
   // consistent in case we later return to the same renderer.
   switch (msg->type()) {
     // Handled by RenderViewHost.
-    case FrameHostMsg_RenderProcessGone::ID:
     case ViewHostMsg_ClosePage_ACK::ID:
     case ViewHostMsg_Focus::ID:
     case ViewHostMsg_ShowFullscreenWidget::ID:
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h
index 795914e..14f7e7a 100644
--- a/content/public/renderer/render_frame_observer.h
+++ b/content/public/renderer/render_frame_observer.h
@@ -32,8 +32,8 @@
 
 namespace blink {
 class WebDocumentLoader;
+class WebElement;
 class WebFormElement;
-class WebNode;
 class WebString;
 struct WebURLError;
 class WebWorkerFetchContext;
@@ -201,8 +201,8 @@
   virtual void DidReceiveTransferSizeUpdate(int resource_id,
                                             int received_data_length) {}
 
-  // Called when the focused node has changed to |node|.
-  virtual void FocusedNodeChanged(const blink::WebNode& node) {}
+  // Called when the focused element has changed to |element|.
+  virtual void FocusedElementChanged(const blink::WebElement& element) {}
 
   // Called when accessibility is enabled or disabled.
   virtual void AccessibilityModeChanged() {}
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index f4ccca7..a2cf98d 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -102,25 +102,6 @@
 
   for (auto& observer : observers_)
     observer.RenderProcessExited(this, termination_info);
-
-  // Send every routing ID a FrameHostMsg_RenderProcessGone message. To ensure a
-  // predictable order for unittests which may assert against the order, we sort
-  // the listeners by descending routing ID, instead of using the arbitrary
-  // hash-map order like RenderProcessHostImpl.
-  std::vector<std::pair<int32_t, IPC::Listener*>> sorted_listeners_;
-  base::IDMap<IPC::Listener*>::iterator iter(&listeners_);
-  while (!iter.IsAtEnd()) {
-    sorted_listeners_.push_back(
-        std::make_pair(iter.GetCurrentKey(), iter.GetCurrentValue()));
-    iter.Advance();
-  }
-  std::sort(sorted_listeners_.rbegin(), sorted_listeners_.rend());
-
-  for (auto& entry_pair : sorted_listeners_) {
-    entry_pair.second->OnMessageReceived(FrameHostMsg_RenderProcessGone(
-        entry_pair.first, static_cast<int>(termination_info.status),
-        termination_info.exit_code));
-  }
 }
 
 bool MockRenderProcessHost::Init() {
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 686e2120..6f46835 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -575,9 +575,9 @@
   widget->FocusChangeComplete();
 }
 
-void RenderViewTest::SetFocused(const blink::WebNode& node) {
+void RenderViewTest::SetFocused(const blink::WebElement& element) {
   RenderViewImpl* impl = static_cast<RenderViewImpl*>(view_);
-  impl->FocusedNodeChanged(blink::WebNode(), node);
+  impl->FocusedElementChanged(blink::WebElement(), element);
 }
 
 void RenderViewTest::Reload(const GURL& url) {
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h
index 0182fa0..7c4f3d1 100644
--- a/content/public/test/render_view_test.h
+++ b/content/public/test/render_view_test.h
@@ -158,8 +158,8 @@
   // Sends a tap at the |rect|.
   void SimulateRectTap(const gfx::Rect& rect);
 
-  // Simulates |node| being focused.
-  void SetFocused(const blink::WebNode& node);
+  // Simulates |element| being focused.
+  void SetFocused(const blink::WebElement& element);
 
   // Simulates a navigation with a type of reload to the given url.
   void Reload(const GURL& url);
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 2288ca59..d86cd6e 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -310,13 +310,13 @@
   Send(new AccessibilityHostMsg_FindInPageResult(routing_id(), params));
 }
 
-void RenderAccessibilityImpl::AccessibilityFocusedNodeChanged(
-    const WebNode& node) {
+void RenderAccessibilityImpl::AccessibilityFocusedElementChanged(
+    const WebElement& element) {
   const WebDocument& document = GetMainDocument();
   if (document.IsNull())
     return;
 
-  if (node.IsNull()) {
+  if (element.IsNull()) {
     // When focus is cleared, implicitly focus the document.
     // TODO(dmazzoni): Make Blink send this notification instead.
     HandleAXEvent(WebAXObject::FromWebDocument(document),
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 3a84790a..4c383b0 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -26,7 +26,6 @@
 
 namespace blink {
 class WebDocument;
-class WebNode;
 }  // namespace blink
 
 namespace ui {
@@ -105,7 +104,7 @@
       const blink::WebAXObject& end_object,
       int end_offset);
 
-  void AccessibilityFocusedNodeChanged(const blink::WebNode& node);
+  void AccessibilityFocusedElementChanged(const blink::WebElement& element);
 
   void HandleAXEvent(const blink::WebAXObject& obj,
                      ax::mojom::Event event,
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.cc b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
index 615614d..5336fb1f 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.cc
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
@@ -398,8 +398,8 @@
 
   if (!fallback_tick_pending_) {
     fallback_tick_.Reset(
-        base::Bind(&SynchronousLayerTreeFrameSink::FallbackTickFired,
-                   base::Unretained(this)));
+        base::BindOnce(&SynchronousLayerTreeFrameSink::FallbackTickFired,
+                       base::Unretained(this)));
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE, fallback_tick_.callback(),
         base::TimeDelta::FromMilliseconds(kFallbackTickTimeoutInMilliseconds));
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.h b/content/renderer/android/synchronous_layer_tree_frame_sink.h
index bdbbe3e..a1359160 100644
--- a/content/renderer/android/synchronous_layer_tree_frame_sink.h
+++ b/content/renderer/android/synchronous_layer_tree_frame_sink.h
@@ -164,7 +164,7 @@
   bool did_submit_frame_ = false;
   scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
 
-  base::CancelableClosure fallback_tick_;
+  base::CancelableOnceClosure fallback_tick_;
   bool fallback_tick_pending_ = false;
   bool fallback_tick_running_ = false;
 
diff --git a/content/renderer/fetchers/resource_fetcher_impl.cc b/content/renderer/fetchers/resource_fetcher_impl.cc
index 6809d268..cf9b6f4 100644
--- a/content/renderer/fetchers/resource_fetcher_impl.cc
+++ b/content/renderer/fetchers/resource_fetcher_impl.cc
@@ -35,7 +35,6 @@
 namespace {
 
 constexpr int32_t kRoutingId = 0;
-const char kAccessControlAllowOriginHeader[] = "Access-Control-Allow-Origin";
 
 }  // namespace
 
@@ -317,7 +316,7 @@
   if (!frame->GetDocument().GetSecurityOrigin().IsNull()) {
     request_.request_initiator =
         static_cast<url::Origin>(frame->GetDocument().GetSecurityOrigin());
-    SetHeader(kAccessControlAllowOriginHeader,
+    SetHeader(net::HttpRequestHeaders::kOrigin,
               blink::WebSecurityOrigin::CreateUnique().ToString().Ascii());
   }
   request_.resource_type =
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc.cc b/content/renderer/media/audio/mojo_audio_output_ipc.cc
index ed051c8..03666b9 100644
--- a/content/renderer/media/audio/mojo_audio_output_ipc.cc
+++ b/content/renderer/media/audio/mojo_audio_output_ipc.cc
@@ -108,6 +108,12 @@
     stream_->Pause();
 }
 
+void MojoAudioOutputIPC::FlushStream() {
+  DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
+  if (stream_.is_bound())
+    stream_->Flush();
+}
+
 void MojoAudioOutputIPC::CloseStream() {
   DCHECK(io_task_runner_->RunsTasksInCurrentSequence());
   stream_provider_.reset();
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc.h b/content/renderer/media/audio/mojo_audio_output_ipc.h
index 05a7ce9..eaabab4 100644
--- a/content/renderer/media/audio/mojo_audio_output_ipc.h
+++ b/content/renderer/media/audio/mojo_audio_output_ipc.h
@@ -50,6 +50,7 @@
       const base::Optional<base::UnguessableToken>& processing_id) override;
   void PlayStream() override;
   void PauseStream() override;
+  void FlushStream() override;
   void CloseStream() override;
   void SetVolume(double volume) override;
 
diff --git a/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc b/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc
index ff912da..ced4c53 100644
--- a/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc
+++ b/content/renderer/media/audio/mojo_audio_output_ipc_unittest.cc
@@ -174,6 +174,7 @@
  public:
   MOCK_METHOD0(Play, void());
   MOCK_METHOD0(Pause, void());
+  MOCK_METHOD0(Flush, void());
   MOCK_METHOD1(SetVolume, void(double));
 };
 
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc b/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
index 26f0c91..0fde29e 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
+++ b/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
@@ -208,12 +208,11 @@
   base::WaitableEvent waiter(base::WaitableEvent::ResetPolicy::MANUAL,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
   media::VideoDecoder::InitCB init_cb =
-      base::BindRepeating(&FinishWait, &waiter, &result);
+      base::BindOnce(&FinishWait, &waiter, &result);
   if (media_task_runner_->PostTask(
           FROM_HERE,
           base::BindOnce(&RTCVideoDecoderAdapter::InitializeOnMediaThread,
-                         base::Unretained(this), std::cref(config),
-                         std::cref(init_cb)))) {
+                         base::Unretained(this), config, std::move(init_cb)))) {
     waiter.Wait();
   }
   return result;
@@ -337,7 +336,7 @@
 
 void RTCVideoDecoderAdapter::InitializeOnMediaThread(
     const media::VideoDecoderConfig& config,
-    const media::VideoDecoder::InitCB& init_cb) {
+    media::VideoDecoder::InitCB init_cb) {
   DVLOG(3) << __func__;
   DCHECK(media_task_runner_->BelongsToCurrentThread());
 
@@ -353,7 +352,7 @@
 
     if (!video_decoder_) {
       media_task_runner_->PostTask(FROM_HERE,
-                                   base::BindRepeating(init_cb, false));
+                                   base::BindOnce(std::move(init_cb), false));
       return;
     }
   }
@@ -367,8 +366,8 @@
   media::VideoDecoder::OutputCB output_cb =
       base::BindRepeating(&RTCVideoDecoderAdapter::OnOutput, weak_this_);
 
-  video_decoder_->Initialize(config, low_delay, cdm_context, init_cb, output_cb,
-                             base::DoNothing());
+  video_decoder_->Initialize(config, low_delay, cdm_context, std::move(init_cb),
+                             output_cb, base::DoNothing());
 }
 
 void RTCVideoDecoderAdapter::DecodeOnMediaThread() {
@@ -474,7 +473,7 @@
       base::BindRepeating(&FinishWait, &waiter, &result);
   FlushDoneCB flush_success_cb =
       base::BindOnce(&RTCVideoDecoderAdapter::InitializeOnMediaThread,
-                     weak_this_, std::cref(config), std::cref(init_cb));
+                     weak_this_, config, std::move(init_cb));
   FlushDoneCB flush_fail_cb =
       base::BindOnce(&FinishWait, &waiter, &result, false);
   if (media_task_runner_->PostTask(
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_adapter.h b/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
index 67990cf..e81e2447 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
+++ b/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
@@ -89,7 +89,7 @@
 
   bool InitializeSync(const media::VideoDecoderConfig& config);
   void InitializeOnMediaThread(const media::VideoDecoderConfig& config,
-                               const media::VideoDecoder::InitCB& init_cb);
+                               media::VideoDecoder::InitCB init_cb);
   void DecodeOnMediaThread();
   void OnDecodeDone(media::DecodeStatus status);
   void OnOutput(scoped_refptr<media::VideoFrame> frame);
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_adapter_unittest.cc b/content/renderer/media/webrtc/rtc_video_decoder_adapter_unittest.cc
index 387c926..32815e9a 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder_adapter_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_video_decoder_adapter_unittest.cc
@@ -50,11 +50,19 @@
 class MockVideoDecoder : public media::VideoDecoder {
  public:
   std::string GetDisplayName() const override { return "MockVideoDecoder"; }
-  MOCK_METHOD6(Initialize,
+  void Initialize(const media::VideoDecoderConfig& config,
+                  bool low_delay,
+                  media::CdmContext* cdm_context,
+                  InitCB init_cb,
+                  const OutputCB& output_cb,
+                  const media::WaitingCB& waiting_cb) override {
+    Initialize_(config, low_delay, cdm_context, init_cb, output_cb, waiting_cb);
+  }
+  MOCK_METHOD6(Initialize_,
                void(const media::VideoDecoderConfig& config,
                     bool low_delay,
                     media::CdmContext* cdm_context,
-                    const InitCB& init_cb,
+                    InitCB& init_cb,
                     const OutputCB& output_cb,
                     const media::WaitingCB& waiting_cb));
   MOCK_METHOD2(Decode,
@@ -148,9 +156,9 @@
   }
 
   bool CreateAndInitialize(bool init_cb_result = true) {
-    EXPECT_CALL(*video_decoder_, Initialize(_, _, _, _, _, _))
+    EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
         .WillOnce(DoAll(SaveArg<0>(&vda_config_), SaveArg<4>(&output_cb_),
-                        media::RunCallback<3>(init_cb_result)));
+                        media::RunOnceCallback<3>(init_cb_result)));
     rtc_video_decoder_adapter_ =
         RTCVideoDecoderAdapter::Create(&gpu_factories_, sdp_format_);
     return !!rtc_video_decoder_adapter_;
@@ -345,8 +353,9 @@
   EXPECT_CALL(decoded_cb_, Run(_)).Times(2);
 
   // First Decode() should cause a reinitialize as new color space is given.
-  EXPECT_CALL(*video_decoder_, Initialize(_, _, _, _, _, _))
-      .WillOnce(DoAll(SaveArg<0>(&vda_config_), media::RunCallback<3>(true)));
+  EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&vda_config_), media::RunOnceCallback<3>(true)));
   webrtc::EncodedImage first_input_image = GetEncodedImageWithColorSpace(0);
   ASSERT_EQ(rtc_video_decoder_adapter_->Decode(first_input_image, false, 0),
             WEBRTC_VIDEO_CODEC_OK);
@@ -377,8 +386,8 @@
       .WillOnce(media::RunCallback<1>(media::DecodeStatus::OK));
 
   // Set Initialize() to fail.
-  EXPECT_CALL(*video_decoder_, Initialize(_, _, _, _, _, _))
-      .WillOnce(media::RunCallback<3>(false));
+  EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
+      .WillOnce(media::RunOnceCallback<3>(false));
   ASSERT_EQ(rtc_video_decoder_adapter_->Decode(input_image, false, 0),
             WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
 }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4e6a498a..17e1b92 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2006,7 +2006,7 @@
 
   GetLocalRootRenderWidget()->UpdateTextInputState();
 
-  FocusedNodeChangedForAccessibility(WebNode());
+  FocusedElementChangedForAccessibility(WebElement());
 }
 
 void RenderFrameImpl::PepperCaretPositionChanged(
@@ -5917,8 +5917,18 @@
     if (params->origin.scheme() != url::kFileScheme ||
         !render_view_->GetWebkitPreferences()
              .allow_universal_access_from_file_urls) {
-      CHECK(params->origin.IsSameOriginWith(url::Origin::Create(params->url)))
-          << " url:" << params->url << " origin:" << params->origin;
+      if (!params->origin.IsSameOriginWith(url::Origin::Create(params->url))) {
+        base::debug::CrashKeyString* url = base::debug::AllocateCrashKeyString(
+            "mismatched_url", base::debug::CrashKeySize::Size256);
+        base::debug::CrashKeyString* origin =
+            base::debug::AllocateCrashKeyString(
+                "mismatched_origin", base::debug::CrashKeySize::Size256);
+        base::debug::ScopedCrashKeyString(url,
+                                          params->url.possibly_invalid_spec());
+        base::debug::ScopedCrashKeyString(origin,
+                                          params->origin.GetDebugString());
+        CHECK(false) << " url:" << params->url << " origin:" << params->origin;
+      }
     }
   }
   params->request_id = internal_data->request_id();
@@ -6243,12 +6253,11 @@
   Send(new FrameHostMsg_DidChangeLoadProgress(routing_id_, load_progress));
 }
 
-void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) {
+void RenderFrameImpl::FocusedElementChanged(const WebElement& element) {
   has_scrolled_focused_editable_node_into_rect_ = false;
   bool is_editable = false;
   gfx::Rect node_bounds;
-  if (!node.IsNull() && node.IsElementNode()) {
-    WebElement element = const_cast<WebNode&>(node).To<WebElement>();
+  if (!element.IsNull()) {
     blink::WebRect rect = element.BoundsInViewport();
     GetLocalRootRenderWidget()->ConvertViewportToWindow(&rect);
     is_editable = element.IsEditable();
@@ -6261,12 +6270,13 @@
   GetLocalRootRenderWidget()->ClearTextInputState();
 
   for (auto& observer : observers_)
-    observer.FocusedNodeChanged(node);
+    observer.FocusedElementChanged(element);
 }
 
-void RenderFrameImpl::FocusedNodeChangedForAccessibility(const WebNode& node) {
+void RenderFrameImpl::FocusedElementChangedForAccessibility(
+    const WebElement& element) {
   if (render_accessibility())
-    render_accessibility()->AccessibilityFocusedNodeChanged(node);
+    render_accessibility()->AccessibilityFocusedElementChanged(element);
 }
 
 void RenderFrameImpl::OnReportContentSecurityPolicyViolation(
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index a2e8b0e7..53615e6 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -356,14 +356,14 @@
   void HandleWebAccessibilityEvent(const blink::WebAXObject& obj,
                                    ax::mojom::Event event);
 
-  // The focused node changed to |node|. If focus was lost from this frame,
-  // |node| will be null.
-  void FocusedNodeChanged(const blink::WebNode& node);
+  // The focused element changed to |element|. If focus was lost from this
+  // frame, |element| will be null.
+  void FocusedElementChanged(const blink::WebElement& element);
 
   // TODO(dmazzoni): the only reason this is here is to plumb it through to
   // RenderAccessibilityImpl. It should use the RenderFrameObserver method, once
   // blink has a separate accessibility tree per frame.
-  void FocusedNodeChangedForAccessibility(const blink::WebNode& node);
+  void FocusedElementChangedForAccessibility(const blink::WebElement& element);
 
   // A RenderView opened by this RenderFrame needs to be shown.
   void ShowCreatedWindow(bool opened_by_user_gesture,
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 25ab2ac..49e1e56 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1688,25 +1688,25 @@
   Send(new ViewHostMsg_TakeFocus(GetRoutingID(), true));
 }
 
-// TODO(esprehn): Blink only ever passes Elements, this should take WebElement.
-void RenderViewImpl::FocusedNodeChanged(const WebNode& fromNode,
-                                        const WebNode& toNode) {
+void RenderViewImpl::FocusedElementChanged(const WebElement& from_element,
+                                           const WebElement& to_element) {
   RenderFrameImpl* previous_frame = nullptr;
-  if (!fromNode.IsNull())
+  if (!from_element.IsNull())
     previous_frame =
-        RenderFrameImpl::FromWebFrame(fromNode.GetDocument().GetFrame());
+        RenderFrameImpl::FromWebFrame(from_element.GetDocument().GetFrame());
   RenderFrameImpl* new_frame = nullptr;
-  if (!toNode.IsNull())
-    new_frame = RenderFrameImpl::FromWebFrame(toNode.GetDocument().GetFrame());
+  if (!to_element.IsNull())
+    new_frame =
+        RenderFrameImpl::FromWebFrame(to_element.GetDocument().GetFrame());
 
   if (previous_frame && previous_frame != new_frame)
-    previous_frame->FocusedNodeChanged(WebNode());
+    previous_frame->FocusedElementChanged(WebElement());
   if (new_frame)
-    new_frame->FocusedNodeChanged(toNode);
+    new_frame->FocusedElementChanged(to_element);
 
   // TODO(dmazzoni): remove once there's a separate a11y tree per frame.
   if (main_render_frame_)
-    main_render_frame_->FocusedNodeChangedForAccessibility(toNode);
+    main_render_frame_->FocusedElementChangedForAccessibility(to_element);
 }
 
 void RenderViewImpl::DidUpdateMainFrameLayout() {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 561588c..f8edd18 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -235,8 +235,8 @@
   bool AcceptsLoadDrops() override;
   void FocusNext() override;
   void FocusPrevious() override;
-  void FocusedNodeChanged(const blink::WebNode& fromNode,
-                          const blink::WebNode& toNode) override;
+  void FocusedElementChanged(const blink::WebElement& from_element,
+                             const blink::WebElement& to_element) override;
   bool CanUpdateLayout() override;
   void DidUpdateMainFrameLayout() override;
   blink::WebString AcceptLanguages() override;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 2e3a922..2c8ade03 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -333,11 +333,6 @@
 #endif
 }
 
-blink::WebCookieJar* RendererBlinkPlatformImpl::CookieJar() {
-  NOTREACHED() << "Use WebLocalFrameClient::cookieJar() instead!";
-  return nullptr;
-}
-
 blink::WebThemeEngine* RendererBlinkPlatformImpl::ThemeEngine() {
   blink::WebThemeEngine* theme_engine =
       GetContentClient()->renderer()->OverrideThemeEngine();
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index f5298e5e..39d9cf7 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -72,7 +72,6 @@
 
   // Platform methods:
   blink::WebSandboxSupport* GetSandboxSupport() override;
-  blink::WebCookieJar* CookieJar() override;
   blink::WebThemeEngine* ThemeEngine() override;
   std::unique_ptr<blink::WebSpeechSynthesizer> CreateSpeechSynthesizer(
       blink::WebSpeechSynthesizerClient* client) override;
diff --git a/content/shell/browser/shell_views.cc b/content/shell/browser/shell_views.cc
index eb4329b..a8badfb 100644
--- a/content/shell/browser/shell_views.cc
+++ b/content/shell/browser/shell_views.cc
@@ -142,7 +142,8 @@
           toolbar_layout->AddColumnSet(0);
       // Back button
       back_button_ =
-          views::MdTextButton::Create(this, base::ASCIIToUTF16("Back"));
+          views::MdTextButton::Create(this, base::ASCIIToUTF16("Back"))
+              .release();
       gfx::Size back_button_size = back_button_->GetPreferredSize();
       toolbar_column_set->AddColumn(views::GridLayout::CENTER,
                                     views::GridLayout::CENTER, 0,
@@ -151,7 +152,8 @@
                                     back_button_size.width() / 2);
       // Forward button
       forward_button_ =
-          views::MdTextButton::Create(this, base::ASCIIToUTF16("Forward"));
+          views::MdTextButton::Create(this, base::ASCIIToUTF16("Forward"))
+              .release();
       gfx::Size forward_button_size = forward_button_->GetPreferredSize();
       toolbar_column_set->AddColumn(views::GridLayout::CENTER,
                                     views::GridLayout::CENTER, 0,
@@ -160,7 +162,8 @@
                                     forward_button_size.width() / 2);
       // Refresh button
       refresh_button_ =
-          views::MdTextButton::Create(this, base::ASCIIToUTF16("Refresh"));
+          views::MdTextButton::Create(this, base::ASCIIToUTF16("Refresh"))
+              .release();
       gfx::Size refresh_button_size = refresh_button_->GetPreferredSize();
       toolbar_column_set->AddColumn(views::GridLayout::CENTER,
                                     views::GridLayout::CENTER, 0,
@@ -169,7 +172,8 @@
                                     refresh_button_size.width() / 2);
       // Stop button
       stop_button_ =
-          views::MdTextButton::Create(this, base::ASCIIToUTF16("Stop"));
+          views::MdTextButton::Create(this, base::ASCIIToUTF16("Stop"))
+              .release();
       gfx::Size stop_button_size = stop_button_->GetPreferredSize();
       toolbar_column_set->AddColumn(views::GridLayout::CENTER,
                                     views::GridLayout::CENTER, 0,
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
index 6f228ca..d9ebced 100644
--- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -1,6 +1,6 @@
 # tags: [ android chromeos linux mac win win10 win7 ]
 # tags: [ debug ]
-# tags: [ intel nvidia ]
+# tags: [ intel nvidia qualcomm-adreno-(tm)-418 ]
 
  # TODO(kbr): flakily timing out on this configuration.
 crbug.com/648369 [ linux debug intel ] TraceTest_* [ RetryOnFailure ]
@@ -33,3 +33,4 @@
 
 # Flaky for unknown reason.
 crbug.com/960007 [ win10 nvidia ] OverlayModeTraceTest_DirectComposition_Nonroot [ RetryOnFailure ]
+crbug.com/965730 [ android qualcomm-adreno-(tm)-418 ] TraceTest_Video_Context_Loss_VP9 [ RetryOnFailure ]
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 8e13b88f..dc56289 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
@@ -471,19 +471,16 @@
 crbug.com/709704 [ android qualcomm-adreno-(tm)-330 ] conformance/glsl/bugs/varying-arrays-should-not-be-reversed.html [ Failure ]
 
 # Nexus 5X
-# The following test recently became so flaky that it had to be
-# upgraded to Fail.
+# Was timing out randomly on android_optional_gpu_tests_rel, but became so
+# flaky (2018-09-10) that it had to be upgraded to Fail.
 crbug.com/882323 [ android qualcomm-adreno-(tm)-418 ] deqp/data/gles2/shaders/conversions.html [ Failure ]
-
 # The following test just started timing out randomly on the
 # android_optional_gpu_tests_rel tryserver with no apparent cause.
 crbug.com/793050 [ android qualcomm-adreno-(tm)-418 ] deqp/data/gles2/shaders/swizzles.html [ RetryOnFailure ]
-
 # This one is causing intermittent timeouts on the device, and it
 # looks like when that happens, the next test also always times
 # out. Skip it for now until it's fixed and running reliably.
 crbug.com/609883 [ android qualcomm-adreno-(tm)-418 ] conformance/extensions/oes-texture-half-float-with-video.html [ Skip ]
-
 # This test is skipped because it is crashing the GPU process.
 crbug.com/784817 [ android qualcomm-adreno-(tm)-418 ] conformance/glsl/bugs/init-array-with-loop.html [ Skip ]
 crbug.com/920737 [ android qualcomm-adreno-(tm)-418 ] conformance/glsl/bugs/loop-if-loop-gradient.html [ RetryOnFailure ]
@@ -494,7 +491,6 @@
 crbug.com/912161 [ android qualcomm-adreno-(tm)-418 ] conformance/glsl/functions/glsl-function-dot.html [ RetryOnFailure ]
 crbug.com/912161 [ android qualcomm-adreno-(tm)-418 ] conformance/glsl/functions/glsl-function-min-gentype.html [ RetryOnFailure ]
 crbug.com/912161 [ android qualcomm-adreno-(tm)-418 ] conformance/glsl/implicit/add_ivec3_vec3.vert.html [ RetryOnFailure ]
-
 # This test is skipped because it is crashing the GPU process.
 crbug.com/609883 [ android qualcomm-adreno-(tm)-418 no-passthrough ] conformance/glsl/misc/shader-with-non-reserved-words.html [ Skip ]
 crbug.com/793050 [ android qualcomm-adreno-(tm)-418 ] conformance/ogles/GL/all/all_001_to_004.html [ RetryOnFailure ]
@@ -504,6 +500,7 @@
 crbug.com/818041 [ android qualcomm-adreno-(tm)-418 no-angle ] conformance/textures/image_bitmap_from_video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ RetryOnFailure ]
 crbug.com/793050 [ android qualcomm-adreno-(tm)-418 no-angle ] conformance/textures/image_bitmap_from_video/tex-2d-luminance-luminance-unsigned_byte.html [ RetryOnFailure ]
 crbug.com/716496 [ android qualcomm-adreno-(tm)-418 no-angle ] conformance/textures/image_bitmap_from_video/tex-2d-rgb-rgb-unsigned_byte.html [ RetryOnFailure ]
+crbug.com/965387 [ android qualcomm-adreno-(tm)-418 no-angle ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ RetryOnFailure ]
 crbug.com/934545 [ android android-chromium qualcomm-adreno-(tm)-418 no-angle ] conformance/textures/misc/texture-npot-video.html [ RetryOnFailure ]
 crbug.com/610951 [ android qualcomm-adreno-(tm)-418 ] conformance/uniforms/uniform-samplers-test.html [ Skip ]
 crbug.com/610951 [ android qualcomm-adreno-(tm)-418 ] WebglExtension_EXT_sRGB [ Failure ]
diff --git a/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc b/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc
index 11b64de..31596b7 100644
--- a/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc
+++ b/content/test/renderer_audio_output_stream_factory_context_impl_unittest.cc
@@ -117,6 +117,7 @@
     Stop();
     delete this;
   }
+  void Flush() override {}
 
   void ThreadMain() override {
     std::unique_ptr<media::AudioOutputStream::AudioSourceCallback>
diff --git a/content/test/web_contents_observer_sanity_checker.cc b/content/test/web_contents_observer_sanity_checker.cc
index 97cab3b8..f6d19ee 100644
--- a/content/test/web_contents_observer_sanity_checker.cc
+++ b/content/test/web_contents_observer_sanity_checker.cc
@@ -299,9 +299,6 @@
 bool WebContentsObserverSanityChecker::OnMessageReceived(
     const IPC::Message& message,
     RenderFrameHost* render_frame_host) {
-  // FrameHostMsg_RenderProcessGone is special internal IPC message that
-  // should not be leaking outside of RenderFrameHost.
-  CHECK(message.type() != FrameHostMsg_RenderProcessGone::ID);
   CHECK(render_frame_host->IsRenderFrameLive());
 
   AssertRenderFrameExists(render_frame_host);
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc
index ba30570..e7139e8 100644
--- a/device/gamepad/gamepad_standard_mappings_linux.cc
+++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -590,11 +590,11 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
-  enum AnalogGamepadButtons {
-    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
-    ANALOG_GAMEPAD_BUTTON_EXTRA2,
-    ANALOG_GAMEPAD_BUTTON_COUNT
+void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
+  enum StadiaGamepadButtons {
+    STADIA_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    STADIA_GAMEPAD_BUTTON_EXTRA2,
+    STADIA_GAMEPAD_BUTTON_COUNT
   };
   *mapped = input;
   mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]);
@@ -609,9 +609,9 @@
   mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
       AxisPositiveAsButton(input.axes[6]);
   mapped->buttons[BUTTON_INDEX_META] = input.buttons[7];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[11];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[12];
-  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA] = input.buttons[11];
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA2] = input.buttons[12];
+  mapped->buttons_length = STADIA_GAMEPAD_BUTTON_COUNT;
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
@@ -677,15 +677,6 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
-  const size_t kStadiaControllerExtraButtons = 2;
-  *mapped = input;
-  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
-  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
-  mapped->buttons_length = BUTTON_INDEX_COUNT + kStadiaControllerExtraButtons;
-  mapped->axes_length = AXIS_INDEX_COUNT;
-}
-
 constexpr struct MappingData {
   GamepadId gamepad_id;
   GamepadStandardMappingFunction function;
@@ -786,8 +777,8 @@
     {GamepadId::kVendor2836Product0001, MapperOUYA},
     // boom PSX+N64 USB Converter
     {GamepadId::kPrototypeVendorProduct0667, MapperBoomN64Psx},
-    // Analog game controller
-    {GamepadId::kPrototypeVendorProduct9401, MapperAnalogGamepad},
+    // Stadia Controller prototype
+    {GamepadId::kPrototypeVendorProduct9401, MapperStadiaController},
 };
 
 }  // namespace
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm
index 144f54e..9627143 100644
--- a/device/gamepad/gamepad_standard_mappings_mac.mm
+++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -397,11 +397,11 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
-  enum AnalogGamepadButtons {
-    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
-    ANALOG_GAMEPAD_BUTTON_EXTRA2,
-    ANALOG_GAMEPAD_BUTTON_COUNT
+void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
+  enum StadiaGamepadButtons {
+    STADIA_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    STADIA_GAMEPAD_BUTTON_EXTRA2,
+    STADIA_GAMEPAD_BUTTON_COUNT
   };
   *mapped = input;
   mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
@@ -417,12 +417,12 @@
   mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
   mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
   mapped->buttons[BUTTON_INDEX_META] = input.buttons[11];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
   mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
   DpadFromAxis(mapped, input.axes[9]);
 
-  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->buttons_length = STADIA_GAMEPAD_BUTTON_COUNT;
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
@@ -519,15 +519,6 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
-  const size_t kStadiaControllerExtraButtons = 2;
-  *mapped = input;
-  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
-  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
-  mapped->buttons_length = BUTTON_INDEX_COUNT + kStadiaControllerExtraButtons;
-  mapped->axes_length = AXIS_INDEX_COUNT;
-}
-
 void MapperXboxAdaptiveControllerBluetooth(const Gamepad& input,
                                            Gamepad* mapped) {
   *mapped = input;
@@ -634,8 +625,8 @@
     {GamepadId::kVendor2836Product0001, MapperOUYA},
     // boom PSX+N64 USB Converter
     {GamepadId::kPrototypeVendorProduct0667, MapperBoomN64Psx},
-    // Analog game controller
-    {GamepadId::kPrototypeVendorProduct9401, MapperAnalogGamepad},
+    // Stadia Controller prototype
+    {GamepadId::kPrototypeVendorProduct9401, MapperStadiaController},
 };
 
 }  // namespace
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc
index 6a605cb..df3dcdd 100644
--- a/device/gamepad/gamepad_standard_mappings_win.cc
+++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -265,11 +265,11 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
-  enum AnalogGamepadButtons {
-    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
-    ANALOG_GAMEPAD_BUTTON_EXTRA2,
-    ANALOG_GAMEPAD_BUTTON_COUNT
+void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
+  enum StadiaGamepadButtons {
+    STADIA_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    STADIA_GAMEPAD_BUTTON_EXTRA2,
+    STADIA_GAMEPAD_BUTTON_COUNT
   };
   *mapped = input;
   mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
@@ -285,12 +285,12 @@
   mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
   mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
   mapped->buttons[BUTTON_INDEX_META] = input.buttons[11];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
-  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
+  mapped->buttons[STADIA_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
   mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
   DpadFromAxis(mapped, input.axes[9]);
 
-  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->buttons_length = STADIA_GAMEPAD_BUTTON_COUNT;
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
@@ -387,15 +387,6 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
-void MapperStadiaController(const Gamepad& input, Gamepad* mapped) {
-  const size_t kStadiaControllerExtraButtons = 2;
-  *mapped = input;
-  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
-  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
-  mapped->buttons_length = BUTTON_INDEX_COUNT + kStadiaControllerExtraButtons;
-  mapped->axes_length = AXIS_INDEX_COUNT;
-}
-
 constexpr struct MappingData {
   GamepadId gamepad_id;
   GamepadStandardMappingFunction function;
@@ -448,8 +439,8 @@
     {GamepadId::kVendor2836Product0001, MapperOUYA},
     // boom PSX+N64 USB Converter
     {GamepadId::kPrototypeVendorProduct0667, MapperBoomN64Psx},
-    // Analog game controller
-    {GamepadId::kPrototypeVendorProduct9401, MapperAnalogGamepad},
+    // Stadia Controller prototype
+    {GamepadId::kPrototypeVendorProduct9401, MapperStadiaController},
 };
 
 }  // namespace
diff --git a/device/gamepad/hid_haptic_gamepad_base.cc b/device/gamepad/hid_haptic_gamepad_base.cc
index 967e5ff..3631433 100644
--- a/device/gamepad/hid_haptic_gamepad_base.cc
+++ b/device/gamepad/hid_haptic_gamepad_base.cc
@@ -40,7 +40,7 @@
 HidHapticGamepadBase::HapticReportData kHapticReportData[] = {
     // XSkills Gamecube USB adapter
     {0x0b43, 0x0005, 0x00, 4, 3, 3, 1 * kBitsPerByte, 0, 1},
-    // Analog game controller
+    // Stadia controller prototype
     {0x6666, 0x9401, 0x05, 5, 1, 3, 2 * kBitsPerByte, 0, 0xffff},
     // Stadia controller
     {0x18d1, 0x9400, 0x05, 5, 1, 3, 2 * kBitsPerByte, 0, 0xffff},
diff --git a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
index 7be8aeb3..83d6f0e8 100644
--- a/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
+++ b/device/vr/windows_mixed_reality/mixed_reality_input_helper.cc
@@ -40,10 +40,13 @@
 using SourceKind =
     ABI::Windows::UI::Input::Spatial::SpatialInteractionSourceKind;
 
-ParsedInputState::ParsedInputState() {}
-ParsedInputState::~ParsedInputState() {}
+ParsedInputState::ParsedInputState() = default;
+ParsedInputState::~ParsedInputState() = default;
 ParsedInputState::ParsedInputState(ParsedInputState&& other) = default;
 
+MixedRealityInputHelper::ControllerState::ControllerState() = default;
+MixedRealityInputHelper::ControllerState::~ControllerState() = default;
+
 namespace {
 
 // Helpers for WebVR Gamepad
@@ -176,12 +179,16 @@
   AddButton(gamepad, nullptr);  // Nothing seems to trigger this button in Edge.
   AddButtonWithAxes(gamepad, input_state.button_data[ButtonName::kTouchpad]);
 
-  gamepad->pose = ConvertToVRPose(input_state.gamepad_pose);
+  gamepad->timestamp = base::TimeTicks::Now();
   gamepad->hand = input_state.source_state->description->handedness;
   gamepad->controller_id = input_state.source_state->source_id;
-  gamepad->can_provide_position = true;
-  gamepad->can_provide_orientation = true;
-  gamepad->timestamp = base::TimeTicks::Now();
+
+  if (input_state.gamepad_pose.not_null) {
+    gamepad->pose = ConvertToVRPose(input_state.gamepad_pose);
+    gamepad->can_provide_position = input_state.gamepad_pose.position.not_null;
+    gamepad->can_provide_orientation =
+        input_state.gamepad_pose.orientation.not_null;
+  }
 
   return gamepad;
 }
@@ -282,30 +289,27 @@
   return gfx::ComposeTransform(decomposed_transform);
 }
 
-bool TryGetPointerOffset(const WMRInputSourceState* state,
-                         const WMRInputSource* source,
-                         const WMRCoordinateSystem* origin,
-                         gfx::Transform origin_from_grip,
-                         gfx::Transform* grip_from_pointer) {
-  DCHECK(grip_from_pointer);
-  *grip_from_pointer = gfx::Transform();
-
+base::Optional<gfx::Transform> TryGetGripFromPointer(
+    const WMRInputSourceState* state,
+    const WMRInputSource* source,
+    const WMRCoordinateSystem* origin,
+    gfx::Transform origin_from_grip) {
   if (!origin)
-    return false;
+    return base::nullopt;
 
   // We can get the pointer position, but we'll need to transform it to an
   // offset from the grip position.  If we can't get an inverse of that,
   // then go ahead and bail early.
   gfx::Transform grip_from_origin;
   if (!origin_from_grip.GetInverse(&grip_from_origin))
-    return false;
+    return base::nullopt;
 
   bool pointing_supported = source->IsPointingSupported();
 
   std::unique_ptr<WMRPointerPose> pointer_pose =
       state->TryGetPointerPose(origin);
   if (!pointer_pose)
-    return false;
+    return base::nullopt;
 
   WFN::Vector3 pos;
   WFN::Quaternion rot;
@@ -313,7 +317,7 @@
     std::unique_ptr<WMRPointerSourcePose> pointer_source_pose =
         pointer_pose->TryGetInteractionSourcePose(source);
     if (!pointer_source_pose)
-      return false;
+      return base::nullopt;
 
     pos = pointer_source_pose->Position();
     rot = pointer_source_pose->Orientation();
@@ -323,8 +327,7 @@
 
   gfx::Transform origin_from_pointer = CreateTransform(
       ConvertToGamepadVector(pos), ConvertToGamepadQuaternion(rot));
-  *grip_from_pointer = (grip_from_origin * origin_from_pointer);
-  return true;
+  return (grip_from_origin * origin_from_pointer);
 }
 
 device::mojom::XRHandedness WindowsToMojoHandedness(Handedness handedness) {
@@ -436,9 +439,8 @@
     auto parsed_source_state =
         LockedParseWindowsSourceState(state.get(), origin);
 
-    // If we have a grip, then we should have enough data.
-    if (parsed_source_state.source_state &&
-        parsed_source_state.source_state->grip)
+    // If we have a source_state, then we should have enough data.
+    if (parsed_source_state.source_state)
       ret->gamepads.push_back(GetWebVRGamepad(std::move(parsed_source_state)));
   }
 
@@ -463,50 +465,56 @@
   if (!(is_controller || is_voice))
     return input_state;
 
-  // Note that if this is from voice input, we're not supposed to send up the
-  // "grip" position, so this will be left as identity and let us still use
-  // the same code paths, as any transformations by it will leave the original
-  // item unaffected.
+  // Hands may not have the same id especially if they are lost but since we
+  // are only tracking controllers/voice, this id should be consistent.
+  uint32_t id = GetSourceId(source.get());
+
+  // Note that if this is untracked we're not supposed to send up the "grip"
+  // position, so this will be left as identity and let us still use the same
+  // code paths. Any transformations will leave the original item unaffected.
+  // Voice input is always untracked.
   gfx::Transform origin_from_grip;
+  bool is_tracked = false;
   if (is_controller) {
     input_state.button_data = ParseButtonState(state);
     std::unique_ptr<WMRInputLocation> location_in_origin =
         state->TryGetLocation(origin);
-    if (!location_in_origin)
-      return input_state;
+    if (location_in_origin) {
+      auto gamepad_pose = GetGamepadPose(location_in_origin.get());
+      if (gamepad_pose.not_null && gamepad_pose.position.not_null &&
+          gamepad_pose.orientation.not_null) {
+        origin_from_grip =
+            CreateTransform(gamepad_pose.position, gamepad_pose.orientation);
+        is_tracked = true;
+      }
 
-    auto gamepad_pose = GetGamepadPose(location_in_origin.get());
-    if (!(gamepad_pose.not_null && gamepad_pose.position.not_null &&
-          gamepad_pose.orientation.not_null))
-      return input_state;
-
-    origin_from_grip =
-        CreateTransform(gamepad_pose.position, gamepad_pose.orientation);
-    input_state.gamepad_pose = gamepad_pose;
+      input_state.gamepad_pose = gamepad_pose;
+    }
   }
 
-  gfx::Transform grip_from_pointer;
-  if (!TryGetPointerOffset(state, source.get(), origin, origin_from_grip,
-                           &grip_from_pointer))
-    return input_state;
+  base::Optional<gfx::Transform> grip_from_pointer =
+      TryGetGripFromPointer(state, source.get(), origin, origin_from_grip);
 
-  // Now that we know we have tracking for the object, we'll start building.
+  // If we failed to get grip_from_pointer, see if it is cached.  If we did get
+  // it, update the cache.
+  if (!grip_from_pointer) {
+    grip_from_pointer = controller_states_[id].grip_from_pointer;
+  } else {
+    controller_states_[id].grip_from_pointer = grip_from_pointer;
+  }
+
+  // Now that we have calculated information for the object, build it.
   device::mojom::XRInputSourceStatePtr source_state =
       device::mojom::XRInputSourceState::New();
 
-  // Hands may not have the same id especially if they are lost but since we
-  // are only tracking controllers/voice, this id should be consistent.
-  uint32_t id = GetSourceId(source.get());
-
   source_state->source_id = id;
   source_state->primary_input_pressed = controller_states_[id].pressed;
   source_state->primary_input_clicked = controller_states_[id].clicked;
   controller_states_[id].clicked = false;
 
-  // Grip position should *only* be specified for a controller.
-  if (is_controller) {
+  // Grip position should *only* be specified if the controller is tracked.
+  if (is_tracked)
     source_state->grip = origin_from_grip;
-  }
 
   device::mojom::XRInputSourceDescriptionPtr description =
       device::mojom::XRInputSourceDescription::New();
diff --git a/device/vr/windows_mixed_reality/mixed_reality_input_helper.h b/device/vr/windows_mixed_reality/mixed_reality_input_helper.h
index 070d3cde..25644038 100644
--- a/device/vr/windows_mixed_reality/mixed_reality_input_helper.h
+++ b/device/vr/windows_mixed_reality/mixed_reality_input_helper.h
@@ -78,8 +78,11 @@
       released_subscription_;
 
   struct ControllerState {
-    bool pressed;
-    bool clicked;
+    bool pressed = false;
+    bool clicked = false;
+    base::Optional<gfx::Transform> grip_from_pointer = base::nullopt;
+    ControllerState();
+    virtual ~ControllerState();
   };
   std::unordered_map<uint32_t, ControllerState> controller_states_;
   HWND hwnd_;
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 60d83d0..91b9768 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -1252,9 +1252,7 @@
   // Handle header removal by the Declarative Net Request API. We filter these
   // headers so that headers removed by Declarative Net Request API are not
   // visible to web request extensions.
-  // TODO(karandeepb): Change the following to a DCHECK. This is a CHECK to
-  // debug crbug.com/960323.
-  CHECK(request->dnr_action.has_value());
+  DCHECK(request->dnr_action.has_value());
   bool headers_filtered = false;
   scoped_refptr<const net::HttpResponseHeaders> filtered_response_headers =
       FilterResponseHeaders(original_response_headers,
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
index c33a09ef..4221791 100644
--- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -757,9 +757,7 @@
   net::CompletionRepeatingCallback copyable_callback =
       base::AdaptCallbackForRepeating(std::move(continuation));
   if (request_.url.SchemeIsHTTPOrHTTPS()) {
-    // TODO(karandeepb): Change the following to a DCHECK. This is a CHECK to
-    // debug crbug.com/960323.
-    CHECK(info_.has_value());
+    DCHECK(info_.has_value());
     int result =
         ExtensionWebRequestEventRouter::GetInstance()->OnHeadersReceived(
             factory_->browser_context_, factory_->info_map_, &info_.value(),
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index ae077ab..831f9a2 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3282,6 +3282,19 @@
       "disabled_extensions": [
         "GL_MESA_framebuffer_flip_y"
       ]
+    },
+    {
+      "id": 306,
+      "description": "Program binaries don't contain transform feedback varyings on Mali GPUs",
+      "cr_bugs": [961950],
+      "os": {
+        "type": "android"
+      },
+      "gl_vendor": "ARM.*",
+      "gl_renderer": "Mali.*",
+      "features": [
+        "disable_program_caching_for_transform_feedback"
+      ]
     }
   ]
 }
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg
index 595dd2e..ad44262 100644
--- a/infra/config/luci-milo.cfg
+++ b/infra/config/luci-milo.cfg
@@ -750,11 +750,6 @@
     short_name: "tst"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-asan"
-    category: "chromium.memory|android"
-    short_name: "asn"
-  }
-  builders {
     name: "buildbot/chromium.memory/Android CFI"
     name: "buildbucket/luci.chromium.ci/Android CFI"
     category: "chromium.memory|cfi"
@@ -1171,11 +1166,6 @@
     short_name: "tst"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-asan"
-    category: "android"
-    short_name: "asn"
-  }
-  builders {
     name: "buildbot/chromium.memory/Android CFI"
     name: "buildbucket/luci.chromium.ci/Android CFI"
     category: "cfi"
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 ae159048..0ad0c0e 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
@@ -5,6 +5,7 @@
 <translation id="1185134272377778587">About Chromium</translation>
 <translation id="1289966288285062467">Chromium Privacy Notice</translation>
 <translation id="1472013873724362412">Your account does not work on Chromium. Please contact your domain administrator or use a regular Google Account to sign in.</translation>
+<translation id="1507010443238049608">Help improve Chromium's features and performance</translation>
 <translation id="1617663976202781617">Data from Chromium sync</translation>
 <translation id="1736662517232558588">Cleared Chromium Data</translation>
 <translation id="1838412507805038478">Chromium verified that <ph name="ISSUER" /> issued this website's certificate.</translation>
@@ -14,6 +15,7 @@
 <translation id="2168108852149185974">Some add-ons cause Chromium to crash. Please uninstall:</translation>
 <translation id="2178608107313874732">Chromium can't use your camera at the moment</translation>
 <translation id="2195025571279539885">Would you like Chromium to offer to translate <ph name="LANGUAGE_NAME" /> pages from this site next time?</translation>
+<translation id="2590893390871230428">Sync your Chromium data</translation>
 <translation id="2647554856022461007">Chromium may use web services to improve your browsing experience. You may optionally disable these services. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
 <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>
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 22066da0e..a029dd5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -5,6 +5,7 @@
 <translation id="1185134272377778587">Teave Chromiumi kohta</translation>
 <translation id="1289966288285062467">Chromiumi privaatsusteatis</translation>
 <translation id="1472013873724362412">Teie konto ei tööta Chromiumis. Võtke ühendust domeeni administraatoriga või kasutage sisselogimiseks tavalist Google'i kontot.</translation>
+<translation id="1507010443238049608">Aidake täiustada Chromiumi funktsioone ja toimivust</translation>
 <translation id="1617663976202781617">Chromiumi andmete sünkroonimine</translation>
 <translation id="1736662517232558588">Chromiumi andmed kustutati</translation>
 <translation id="1838412507805038478">Chromium kinnitas, et veebisaidi sertifikaadi väljastas <ph name="ISSUER" />.</translation>
@@ -14,6 +15,7 @@
 <translation id="2168108852149185974">Mõned pistikprogrammid põhjustavad Chromiumi kokkujooksmise. Desinstallige need:</translation>
 <translation id="2178608107313874732">Chromium ei saa praegu kaamerat kasutada</translation>
 <translation id="2195025571279539885">Kas soovite, et Chromium pakuks järgmisel korral sellel saidil <ph name="LANGUAGE_NAME" /> keeles olevate lehtede tõlkimise võimalust?</translation>
+<translation id="2590893390871230428">Chromiumi andmete sünkroonimine</translation>
 <translation id="2647554856022461007">Chromium võib sirvimiskogemuse parandamiseks kasutada veebiteenuseid. Võite need teenused valikuliselt keelata. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
 <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>
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 f8a7c30..35574bd 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -5,6 +5,7 @@
 <translation id="1185134272377778587">Par Chromium</translation>
 <translation id="1289966288285062467">Chromium konfidencialitātes paziņojums</translation>
 <translation id="1472013873724362412">Jūsu konts nedarbojas pārlūkā Chromium. Sazinieties ar savu domēna administratoru vai pierakstieties, izmantojot parastu Google kontu.</translation>
+<translation id="1507010443238049608">Palīdzēt uzlabot Chromium funkcijas un veiktspēju</translation>
 <translation id="1617663976202781617">Chromium sinhronizācijas dati</translation>
 <translation id="1736662517232558588">Chromium dati dzēsti</translation>
 <translation id="1838412507805038478">Chromium apstiprināja, ka <ph name="ISSUER" /> izsniedza šīs vietnes sertifikātu.</translation>
@@ -14,6 +15,7 @@
 <translation id="2168108852149185974">Daži papildinājumi var izraisīt pārlūka Chromium avarēšanu. Lūdzu, atinstalējiet šos papildinājumus:</translation>
 <translation id="2178608107313874732">Chromium pašlaik nevar izmantot jūsu kameru.</translation>
 <translation id="2195025571279539885">Vai vēlaties, lai Chromium nākamreiz piedāvātu šīs vietnes lapas, kuru saturs ir šādā valodā: <ph name="LANGUAGE_NAME" />?</translation>
+<translation id="2590893390871230428">Sinhronizēt jūsu Chromium datus</translation>
 <translation id="2647554856022461007">Chromium var izmantot tīmekļa pakalpojumus, lai uzlabotu jūsu pārlūkošanas pieredzi. Varat arī atspējot šos pakalpojumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
 <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>
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 dfbf93d..1853133 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -5,6 +5,7 @@
 <translation id="1185134272377778587">Chromium – informacje</translation>
 <translation id="1289966288285062467">Informacje na temat ochrony prywatności w Chromium</translation>
 <translation id="1472013873724362412">Twoje konto nie działa w Chromium. Skontaktuj się z administratorem domeny lub zaloguj się przy użyciu zwykłego konta Google.</translation>
+<translation id="1507010443238049608">Pomóż w ulepszaniu funkcji i działania Chromium</translation>
 <translation id="1617663976202781617">Dane z synchronizacji Chromium</translation>
 <translation id="1736662517232558588">Wyczyszczono dane Chromium</translation>
 <translation id="1838412507805038478">Chromium sprawdził, że wydawcą certyfikatu tej witryny jest <ph name="ISSUER" />.</translation>
@@ -14,6 +15,7 @@
 <translation id="2168108852149185974">Niektóre dodatki mogą powodować awarie Chromium. Odinstaluj je.</translation>
 <translation id="2178608107313874732">Chromium nie może teraz użyć aparatu</translation>
 <translation id="2195025571279539885">Czy następnym razem Chromium ma zaproponować Ci tłumaczenie stron tej witryny, których język to <ph name="LANGUAGE_NAME" />?</translation>
+<translation id="2590893390871230428">Synchronizuj dane Chromium</translation>
 <translation id="2647554856022461007">Aby zwiększyć wygodę przeglądania, Chromium może korzystać z usług internetowych. Możesz je opcjonalnie wyłączyć. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <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>
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 bf35ace9..f54c660 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
@@ -1,7 +1,9 @@
 <?xml version="1.0" ?>
 <!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>
 <translation id="1863312987075920112">By using this application, you agree to Chrome’s <ph name="BEGIN_LINK_TOS" />Terms of Service<ph name="END_LINK_TOS" /> and <ph name="BEGIN_LINK_PRIVACY" />Privacy Notice<ph name="END_LINK_PRIVACY" />.</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 29fcd165..800b6b62 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
@@ -1,7 +1,9 @@
 <?xml version="1.0" ?>
 <!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>
 <translation id="1863312987075920112">Seda rakendust kasutades nõustute Chrome'i <ph name="BEGIN_LINK_TOS" />teenusetingimuste<ph name="END_LINK_TOS" /> ja <ph name="BEGIN_LINK_PRIVACY" />privaatsusteatisega<ph name="END_LINK_PRIVACY" />.</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 1b0220ed..0707689 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
@@ -1,7 +1,9 @@
 <?xml version="1.0" ?>
 <!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>
 <translation id="1863312987075920112">Izmantojot šo lietojumprogrammu, jūs piekrītat Chrome <ph name="BEGIN_LINK_TOS" />pakalpojumu sniegšanas noteikumiem<ph name="END_LINK_TOS" /> un <ph name="BEGIN_LINK_PRIVACY" />konfidencialitātes paziņojumam<ph name="END_LINK_PRIVACY" />.</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 24b6662..64366b0 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
@@ -1,7 +1,9 @@
 <?xml version="1.0" ?>
 <!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>
 <translation id="1863312987075920112">Korzystając z tej aplikacji, akceptujesz <ph name="BEGIN_LINK_TOS" />Warunki korzystania z Chrome<ph name="END_LINK_TOS" /> i <ph name="BEGIN_LINK_PRIVACY" />Informacje na temat ochrony prywatności w Chrome<ph name="END_LINK_PRIVACY" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 6e07006..793c5f6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -295,7 +295,7 @@
 <translation id="5659593005791499971">البريد الإلكتروني</translation>
 <translation id="5669528293118408608">www</translation>
 <translation id="567881659373499783">الإصدار <ph name="PRODUCT_VERSION" /></translation>
-<translation id="5711039611392265845">‏لعرض مزيد من الإعدادات المتعلِّقة بالخصوصية والأمان وجمع البيانات، يُرجى الاطِّلاع على <ph name="BEGIN_LINK" />خدمات Google والمزامنة<ph name="END_LINK" />.</translation>
+<translation id="5711039611392265845">‏لعرض مزيد من الإعدادات المتعلّقة بالخصوصية والأمان وجمع البيانات، يُرجى الاطّلاع على <ph name="BEGIN_LINK" />خدمات Google والمزامنة<ph name="END_LINK" />.</translation>
 <translation id="5728700505257787410">عذرًا، حدثت مشكلة أثناء تسجيل الدخول إلى حسابك.</translation>
 <translation id="5737974891429562743">تفاصيل تسجيل الدخول إلى الحساب قديمة. يمكنك التحديث لبدء المزامنة.</translation>
 <translation id="5738887413654608789">يتيح لك هذا اكتشاف صفحات الويب ذات الصلة حسب الأشياء المحيطة بك.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 7c50592..b9501e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -37,6 +37,7 @@
 <translation id="1400642268715879018">Seneste fire uger</translation>
 <translation id="1407135791313364759">Åbn alle</translation>
 <translation id="1430915738399379752">Udskriv</translation>
+<translation id="1449835205994625556">Skjul adgangskode</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation>
 <translation id="1491277525950327607">Tryk to gange for at skifte indstilling</translation>
 <translation id="152234381334907219">Gemmes aldrig</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 ccc41d8..99d50342 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -15,6 +15,7 @@
 <translation id="1165039591588034296">Error</translation>
 <translation id="1172898394251786223">Next field</translation>
 <translation id="1176932207622159128">Cannot Save Image</translation>
+<translation id="1180526666083833456">Sync and personalise across devices.</translation>
 <translation id="1181037720776840403">Remove</translation>
 <translation id="1201530049782216880">New Incognito Tab</translation>
 <translation id="1209206284964581585">Hide for now</translation>
@@ -37,6 +38,7 @@
 <translation id="1400642268715879018">Last 4 Weeks</translation>
 <translation id="1407135791313364759">Open all</translation>
 <translation id="1430915738399379752">Print</translation>
+<translation id="1436290164580597469">Enter passphrase to start sync.</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> items</translation>
 <translation id="1491277525950327607">Double tap to toggle setting</translation>
 <translation id="152234381334907219">Never Saved</translation>
@@ -105,8 +107,10 @@
 <translation id="2435457462613246316">Show password</translation>
 <translation id="2481538920734869610">ADD ACCOUNT</translation>
 <translation id="2497852260688568942">Sync is disabled by your administrator</translation>
+<translation id="2500374554657206846">Options to save password</translation>
 <translation id="2523363575747517183">This website is repeatedly trying to open another application.</translation>
 <translation id="2529021024822217800">Open All</translation>
+<translation id="2570206273416014374">Sends some cookies and searches from the address bar and search box to your default search engine.</translation>
 <translation id="2572712655377361602">A device policy blocked access to your photos</translation>
 <translation id="2584132361465095047">Add Account…</translation>
 <translation id="2625189173221582860">Password copied</translation>
@@ -178,6 +182,7 @@
 <translation id="3533202363250687977">Close all incognito tabs</translation>
 <translation id="3533436815740441613">New Tab</translation>
 <translation id="3551320343578183772">Close Tab</translation>
+<translation id="3581564640715911333">Offer to translate pages in other languages</translation>
 <translation id="3588820906588687999">Open Image in New Tab</translation>
 <translation id="3603009562372709545">Copy Link URL</translation>
 <translation id="3607167657931203000">Auto-fill Data</translation>
@@ -185,6 +190,7 @@
 <translation id="3638472932233958418">Pre-load Web Pages</translation>
 <translation id="3691593122358196899">Bookmarked to <ph name="FOLDER_TITLE" /></translation>
 <translation id="3771033907050503522">Incognito Tabs</translation>
+<translation id="3775743491439407556">Sync isn't working</translation>
 <translation id="3779810277399252432">No Internet connection.</translation>
 <translation id="3783017676699494206">Save Image</translation>
 <translation id="3789841737615482174">Install</translation>
@@ -219,11 +225,13 @@
 <translation id="4272631900155121838">To scan a QR code, enable the camera from settings</translation>
 <translation id="4281844954008187215">Terms of Service</translation>
 <translation id="430793432425771671">Sync Everything</translation>
+<translation id="4338650699862464074">Sends URLs of pages that you visit to Google.</translation>
 <translation id="4359125752503270327">This page will open in another application.</translation>
 <translation id="4370827530403103842">Sync isn't working. Tap to fix.</translation>
 <translation id="4375040482473363939">QR code Search</translation>
 <translation id="4378154925671717803">Phone</translation>
 <translation id="441868831736628555">Privacy Notice</translation>
+<translation id="4454246407045105932">Add language</translation>
 <translation id="4476574785019001431">Settings</translation>
 <translation id="4496373720959965247">Add tabs and switch between pages</translation>
 <translation id="4508750114462689118">Close sign-in promo</translation>
@@ -234,6 +242,7 @@
 <translation id="461440297010471931">Searching with Google</translation>
 <translation id="4619615317237390068">Tabs from other devices</translation>
 <translation id="4620246317052452550">Pages That You've Read</translation>
+<translation id="4630540211544979320">Translate pages</translation>
 <translation id="4636930964841734540">Info</translation>
 <translation id="4659667755519643272">Enter Tab Switcher</translation>
 <translation id="4666531726415300315">Signed in as <ph name="EMAIL" />.
@@ -248,7 +257,9 @@
 
 To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation>
 <translation id="4807020197310989387">1 unread Reading List article.</translation>
+<translation id="4818522717893377262">Add language…</translation>
 <translation id="481968316161811770">Cookies, Site Data</translation>
+<translation id="4833786495304741580">Automatically sends usage statistics and crash reports to Google.</translation>
 <translation id="4840495572919996524">Your bookmarks, history, passwords and more will no longer be synced to your Google Account.</translation>
 <translation id="4854345657858711387">Set A Passcode</translation>
 <translation id="4860895144060829044">Call</translation>
@@ -289,6 +300,7 @@
 <translation id="5548760955356983418">Handoff lets you start browsing a website on this device and then easily continue on your Mac. The current open website will appear in the Dock of your Mac.
 
 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="5614553682702429503">Save password?</translation>
 <translation id="5626245204502895507">The file could not be downloaded at this time.</translation>
@@ -336,6 +348,7 @@
 <translation id="6187302354554850004">Last synced: <ph name="LAST_USED_TIME" /></translation>
 <translation id="6189413832092199491">Unread</translation>
 <translation id="6196207969502475924">Voice Search</translation>
+<translation id="6219688215832490856">Never translate</translation>
 <translation id="6254066287920239840">Open links in the app instead of the browser.</translation>
 <translation id="6255097610484507482">Edit Credit Card</translation>
 <translation id="6303969859164067831">Sign out and turn off sync</translation>
@@ -390,6 +403,7 @@
 <translation id="6945221475159498467">Select</translation>
 <translation id="6973630695168034713">Folders</translation>
 <translation id="6979158407327259162">Google Drive</translation>
+<translation id="6988572888918530647">Manage your Google Account</translation>
 <translation id="7004499039102548441">Recent tabs</translation>
 <translation id="7006788746334555276">Content Settings</translation>
 <translation id="7015203776128479407">Initial sync setup was not finished. Sync is off.</translation>
@@ -460,6 +474,7 @@
 <translation id="8059533439631660104">Collapses the section.</translation>
 <translation id="806745655614357130">Keep my data separate</translation>
 <translation id="8073670137947914548">Download finished</translation>
+<translation id="8073872304774253879">Make searches and browsing better</translation>
 <translation id="8076014560081431679">Saved site settings will not be deleted and may reflect your browsing habits. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
 <translation id="8114753159095730575">File download is available. Options available near bottom of screen.</translation>
 <translation id="8131740175452115882">Confirm</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index ada2b17..433531d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -15,6 +15,7 @@
 <translation id="1165039591588034296">Viga</translation>
 <translation id="1172898394251786223">Järgmine väli</translation>
 <translation id="1176932207622159128">Ei saa salvestada</translation>
+<translation id="1180526666083833456">Kasutage eri seadmete vahel sünkroonimist ja isikupärastamist.</translation>
 <translation id="1181037720776840403">Eemalda</translation>
 <translation id="1201530049782216880">Uus inkognito vaheleht</translation>
 <translation id="1209206284964581585">Peida praeguseks</translation>
@@ -37,6 +38,7 @@
 <translation id="1400642268715879018">Viimased neli nädalat</translation>
 <translation id="1407135791313364759">Ava kõik</translation>
 <translation id="1430915738399379752">Printimine</translation>
+<translation id="1436290164580597469">Sünkroonimise alustamiseks sisestage parool.</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> üksust</translation>
 <translation id="1491277525950327607">Seade vahetamiseks topeltpuudutage</translation>
 <translation id="152234381334907219">Ei ole kunagi salvestatud</translation>
@@ -105,8 +107,10 @@
 <translation id="2435457462613246316">Kuva parool</translation>
 <translation id="2481538920734869610">LISA KONTO</translation>
 <translation id="2497852260688568942">Administraator on sünkroonimise keelanud</translation>
+<translation id="2500374554657206846">Valikud parooli salvestamiseks</translation>
 <translation id="2523363575747517183">See veebisait üritab korduvalt avada teist rakendust.</translation>
 <translation id="2529021024822217800">Ava kõik</translation>
+<translation id="2570206273416014374">Saadab teie vaikeotsingumootorile mõned küpsisefailid ja otsingud teie aadressiribalt ning otsingukastist.</translation>
 <translation id="2572712655377361602">Seadme reegel blokeeris juurdepääsu teie fotodele</translation>
 <translation id="2584132361465095047">Lisa konto …</translation>
 <translation id="2625189173221582860">Parool on kopeeritud</translation>
@@ -178,6 +182,7 @@
 <translation id="3533202363250687977">Sule kõik inkognito vahelehed</translation>
 <translation id="3533436815740441613">Uus vaheleht</translation>
 <translation id="3551320343578183772">Sule vaheleht</translation>
+<translation id="3581564640715911333">Paku muudes keeltes olevate lehtede tõlkimist</translation>
 <translation id="3588820906588687999">Ava kujutis uuel vahelehel</translation>
 <translation id="3603009562372709545">Kopeeri lingi URL</translation>
 <translation id="3607167657931203000">Automaattäite andmed</translation>
@@ -185,6 +190,7 @@
 <translation id="3638472932233958418">Lehtede eellaadimine</translation>
 <translation id="3691593122358196899">Lisatud järjehoidjana kausta <ph name="FOLDER_TITLE" /></translation>
 <translation id="3771033907050503522">Inkogn. vahelehed</translation>
+<translation id="3775743491439407556">Sünkroonimine ei tööta</translation>
 <translation id="3779810277399252432">Interneti-ühendus puudub.</translation>
 <translation id="3783017676699494206">Salvesta kujutis</translation>
 <translation id="3789841737615482174">Installi</translation>
@@ -219,11 +225,13 @@
 <translation id="4272631900155121838">QR-koodi skannimiseks lubage seadetes kaamera</translation>
 <translation id="4281844954008187215">Teenusetingimused</translation>
 <translation id="430793432425771671">Sünkrooni kõik</translation>
+<translation id="4338650699862464074">Saadab Google'ile teie külastatud lehtede URL-id.</translation>
 <translation id="4359125752503270327">See leht avatakse teises rakenduses.</translation>
 <translation id="4370827530403103842">Sünkroonimine ei tööta. Puudutage parandamiseks.</translation>
 <translation id="4375040482473363939">QR-koodi otsing</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Privaatsusteatis</translation>
+<translation id="4454246407045105932">Lisa keel</translation>
 <translation id="4476574785019001431">Seaded</translation>
 <translation id="4496373720959965247">Lisage vahelehti ja vahetage lehti</translation>
 <translation id="4508750114462689118">Sule sisselogimisviip</translation>
@@ -234,6 +242,7 @@
 <translation id="461440297010471931">Otsimine Google'iga</translation>
 <translation id="4619615317237390068">Muudest seadmetest pärinevad vahelehed</translation>
 <translation id="4620246317052452550">Teie loetud lehed</translation>
+<translation id="4630540211544979320">Tõlgi lehed</translation>
 <translation id="4636930964841734540">Teave</translation>
 <translation id="4659667755519643272">Ava vahelehtede vaheti</translation>
 <translation id="4666531726415300315">Sisse logitud kasutajana <ph name="EMAIL" />.
@@ -248,7 +257,9 @@
 
 Seade muutmiseks <ph name="BEGIN_LINK" />lähtestage sünkroonimine<ph name="END_LINK" /></translation>
 <translation id="4807020197310989387">Lugemisloendis on 1 lugemata artikkel.</translation>
+<translation id="4818522717893377262">Lisa keel …</translation>
 <translation id="481968316161811770">Küpsis., saidi andm.</translation>
+<translation id="4833786495304741580">Google'ile saadetakse automaatselt kasutusstatistikat ja krahhiaruandeid.</translation>
 <translation id="4840495572919996524">Teie järjehoidjaid, ajalugu, paroole ja muud sisu ei sünkroonita enam teie Google'i kontoga.</translation>
 <translation id="4854345657858711387">Pääsukoodi seadistamine</translation>
 <translation id="4860895144060829044">Helistage</translation>
@@ -289,6 +300,7 @@
 <translation id="5548760955356983418">Handoffi abil saate alustada veebisaidi sirvimist selles seadmes ja jätkata seda hõlpsalt Macis. Praegu avatud veebisait kuvatakse Maci Dockis.
 
 Handoff peab olema lubatud seadete jaotises General ja seadmed peavad kasutama sama iCloudi kontot.</translation>
+<translation id="5551897871312988470">Paku tõlkimist</translation>
 <translation id="5556459405103347317">Laadi uuesti</translation>
 <translation id="5614553682702429503">Kas salvestada parool?</translation>
 <translation id="5626245204502895507">Faili ei õnnestunud praegu alla laadida.</translation>
@@ -336,6 +348,7 @@
 <translation id="6187302354554850004">Viimati sünkr.: <ph name="LAST_USED_TIME" /></translation>
 <translation id="6189413832092199491">Lugemata</translation>
 <translation id="6196207969502475924">Häälotsing</translation>
+<translation id="6219688215832490856">Ära kunagi tõlgi:</translation>
 <translation id="6254066287920239840">Avage lingid brauseri asemel rakenduses.</translation>
 <translation id="6255097610484507482">Muuda krediitkaarti</translation>
 <translation id="6303969859164067831">Logi välja ja lülita sünkroonimine välja</translation>
@@ -390,6 +403,7 @@
 <translation id="6945221475159498467">Vali</translation>
 <translation id="6973630695168034713">Kaustad</translation>
 <translation id="6979158407327259162">Google Drive</translation>
+<translation id="6988572888918530647">Google'i konto haldamine</translation>
 <translation id="7004499039102548441">Hiljutised vahelehed</translation>
 <translation id="7006788746334555276">Sisu seaded</translation>
 <translation id="7015203776128479407">Sünkroonimise algseadistust ei viidud lõpule. Sünkroonimine on välja lülitatud.</translation>
@@ -460,6 +474,7 @@
 <translation id="8059533439631660104">Ahendab jaotist.</translation>
 <translation id="806745655614357130">Hoia minu andmed eraldi</translation>
 <translation id="8073670137947914548">Allalaadimine jõudis lõpule</translation>
+<translation id="8073872304774253879">Otsingute ja sirvimise paremaks muutmine</translation>
 <translation id="8076014560081431679">Saitide salvestatud seadeid ei kustutata ja need võivad kajastada teie sirvimisharjumusi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
 <translation id="8114753159095730575">Allalaaditav fail on saadaval. Valikud kuvatakse ekraani alaosas.</translation>
 <translation id="8131740175452115882">Kinnita</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 9722c48..3fdecf7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -214,7 +214,7 @@
 <translation id="4172051516777682613">Näytä aina</translation>
 <translation id="418156467088430727">Näytä offline-versio uudella välilehdellä</translation>
 <translation id="4181841719683918333">Kielet</translation>
-<translation id="4237682350741091554">Hallinnoi Chromen synkronointia ja räätälöintiä <ph name="BEGIN_LINK" />asetuksissa<ph name="END_LINK" />.</translation>
+<translation id="4237682350741091554">Hallinnoi Chromen synkronointia ja personointia <ph name="BEGIN_LINK" />asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="424315890655130736">Anna tunnuslause</translation>
 <translation id="4272631900155121838">Jos haluat skannata QR-koodin, ota kamera käyttöön asetuksissa.</translation>
 <translation id="4281844954008187215">Käyttöehdot</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index cd005e9..429fce2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -37,6 +37,7 @@
 <translation id="1400642268715879018">מארבעת השבועות האחרונים</translation>
 <translation id="1407135791313364759">פתח הכל</translation>
 <translation id="1430915738399379752">הדפסה</translation>
+<translation id="1449835205994625556">הסתר סיסמה</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> פריטים</translation>
 <translation id="1491277525950327607">הקש פעמיים כדי להחליף את מצב ההגדרה</translation>
 <translation id="152234381334907219">פריטים שאף פעם לא נשמרו</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 87900610..156ccec 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -15,6 +15,7 @@
 <translation id="1165039591588034296">Kļūda</translation>
 <translation id="1172898394251786223">Nākamais lauks</translation>
 <translation id="1176932207622159128">Attēlu nevar sagl.</translation>
+<translation id="1180526666083833456">Sinhronizējiet datus un personalizējiet iespējas vairākās ierīcēs.</translation>
 <translation id="1181037720776840403">Noņemt</translation>
 <translation id="1201530049782216880">Jauna inkognito cilne</translation>
 <translation id="1209206284964581585">Pagaidām slēpt</translation>
@@ -37,6 +38,7 @@
 <translation id="1400642268715879018">Pēdējās 4 nedēļas</translation>
 <translation id="1407135791313364759">Atvērt visas</translation>
 <translation id="1430915738399379752">Drukāt</translation>
+<translation id="1436290164580597469">Lai sāktu sinhronizāciju, ievadiet ieejas frāzi.</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> vienumi</translation>
 <translation id="1491277525950327607">Veiciet dubultskārienu, lai pārslēgtu iestatījumu.</translation>
 <translation id="152234381334907219">Jaunākie saglabātie</translation>
@@ -105,8 +107,10 @@
 <translation id="2435457462613246316">Rādīt paroli</translation>
 <translation id="2481538920734869610">PIEVIENOT KONTU</translation>
 <translation id="2497852260688568942">Administrators ir atspējojis sinhronizēšanu.</translation>
+<translation id="2500374554657206846">Paroles saglabāšanas iespējas</translation>
 <translation id="2523363575747517183">Šī vietne atkārtoti mēģina atvērt citu lietojumprogrammu.</translation>
 <translation id="2529021024822217800">Atvērt visas</translation>
+<translation id="2570206273416014374">Nosūta dažus sīkfailus un meklēšanas vaicājumus no adreses joslas un meklēšanas lodziņa uz jūsu noklusējuma meklētājprogrammu.</translation>
 <translation id="2572712655377361602">Ierīces politikas dēļ tika bloķēta piekļuve jūsu fotoattēliem.</translation>
 <translation id="2584132361465095047">Pievienot kontu…</translation>
 <translation id="2625189173221582860">Parole ir nokopēta.</translation>
@@ -178,6 +182,7 @@
 <translation id="3533202363250687977">Aizvērt visas inkognito cilnes</translation>
 <translation id="3533436815740441613">Jauna cilne</translation>
 <translation id="3551320343578183772">Aizvērt cilni</translation>
+<translation id="3581564640715911333">Piedāvāt tulkot lapas citās valodās</translation>
 <translation id="3588820906588687999">Atvērt attēlu jaunā cilnē</translation>
 <translation id="3603009562372709545">Kopēt saites URL</translation>
 <translation id="3607167657931203000">Aut. aizpildes dati</translation>
@@ -185,6 +190,7 @@
 <translation id="3638472932233958418">Pirmsiel. tīm. lapas</translation>
 <translation id="3691593122358196899">Grāmatzīme saglabāta mapē <ph name="FOLDER_TITLE" /></translation>
 <translation id="3771033907050503522">Inkognito režīma cilnes</translation>
+<translation id="3775743491439407556">Sinhronizācija nedarbojas</translation>
 <translation id="3779810277399252432">Nav interneta savienojuma.</translation>
 <translation id="3783017676699494206">Saglabāt attēlu</translation>
 <translation id="3789841737615482174">Instalēt</translation>
@@ -219,11 +225,13 @@
 <translation id="4272631900155121838">Lai skenētu QR kodu, iestatījumos iespējojiet kameru.</translation>
 <translation id="4281844954008187215">Google pakalpojumu noteikumi</translation>
 <translation id="430793432425771671">Sinhronizēt visu</translation>
+<translation id="4338650699862464074">Nosūta Google serveriem apmeklēto lapu vietrāžus URL.</translation>
 <translation id="4359125752503270327">Šī lapa tiks atvērta citā lietojumprogrammā.</translation>
 <translation id="4370827530403103842">Sinhronizācija nedarbojas. Pieskarieties, lai novērstu problēmu.</translation>
 <translation id="4375040482473363939">Meklēšana ar QR kodu</translation>
 <translation id="4378154925671717803">Tālrunis</translation>
 <translation id="441868831736628555">Konfidencialitātes paziņojums</translation>
+<translation id="4454246407045105932">Valodas pievienošana</translation>
 <translation id="4476574785019001431">Iestatījumi</translation>
 <translation id="4496373720959965247">Pievienojiet cilnes un pārslēdzieties starp lapām</translation>
 <translation id="4508750114462689118">Aizvērt pierakstīšanās piedāvājumu</translation>
@@ -234,6 +242,7 @@
 <translation id="461440297010471931">Google meklēšana</translation>
 <translation id="4619615317237390068">Cilnes no citām ierīcēm</translation>
 <translation id="4620246317052452550">Lapas, kuras esat lasījis</translation>
+<translation id="4630540211544979320">Tulkot lapas</translation>
 <translation id="4636930964841734540">Informācija</translation>
 <translation id="4659667755519643272">Atvērt ciļņu pārslēdzēju</translation>
 <translation id="4666531726415300315">Pierakstījies kā <ph name="EMAIL" />.
@@ -248,7 +257,9 @@
 
 Lai mainītu šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" /></translation>
 <translation id="4807020197310989387">1 nelasīts raksts, kas pievienots lasīšanas sarakstam.</translation>
+<translation id="4818522717893377262">Pievienot valodu...</translation>
 <translation id="481968316161811770">Sīkfaili, vietņu dati</translation>
+<translation id="4833786495304741580">Automātiski sūtīt lietojuma statistiku un avāriju pārskatus Google serveriem.</translation>
 <translation id="4840495572919996524">Jūsu grāmatzīmes, vēsture, paroles un citi iestatījumi vairs netiks sinhronizēti ar jūsu Google kontu.</translation>
 <translation id="4854345657858711387">Piekļuves koda iestatīšana</translation>
 <translation id="4860895144060829044">Zvanīt</translation>
@@ -289,6 +300,7 @@
 <translation id="5548760955356983418">Izmantojot funkciju Handoff, varat pārlūkot vietni šajā ierīcē un pēc tam turpināt pārlūkošanu Mac datorā. Atvērtā vietne būs redzama Mac datora ikonjoslā Dock.
 
 Funkcija Handoff ir jāiespējo arī iestatījumu sadaļā General (Vispārīgi), un ierīcēm ir jāizmanto viens iCloud konts.</translation>
+<translation id="5551897871312988470">Piedāvāt tulkot</translation>
 <translation id="5556459405103347317">Pārlādēt</translation>
 <translation id="5614553682702429503">Vai saglabāt paroli?</translation>
 <translation id="5626245204502895507">Pašlaik failu nevar lejupielādēt.</translation>
@@ -336,6 +348,7 @@
 <translation id="6187302354554850004">Pēdējoreiz sinhr.: <ph name="LAST_USED_TIME" /></translation>
 <translation id="6189413832092199491">Nelasīts</translation>
 <translation id="6196207969502475924">Meklēšana ar balsi</translation>
+<translation id="6219688215832490856">Nekad netulkot</translation>
 <translation id="6254066287920239840">Atvērt saites lietotnē, nevis pārlūkā.</translation>
 <translation id="6255097610484507482">Rediģēt kredītkarti</translation>
 <translation id="6303969859164067831">Izrakstīties un izslēgt sinhronizēšanu</translation>
@@ -390,6 +403,7 @@
 <translation id="6945221475159498467">Atlasīt</translation>
 <translation id="6973630695168034713">Mapes</translation>
 <translation id="6979158407327259162">Google disks</translation>
+<translation id="6988572888918530647">Google konta pārvaldība</translation>
 <translation id="7004499039102548441">Nesen atvērtas cilnes</translation>
 <translation id="7006788746334555276">Satura iestatījumi</translation>
 <translation id="7015203776128479407">Sākotnējā sinhronizācijas iestatīšana netika pabeigta. Sinhronizācija ir izslēgta.</translation>
@@ -460,6 +474,7 @@
 <translation id="8059533439631660104">Sakļauj sadaļu.</translation>
 <translation id="806745655614357130">Glabāt datus atsevišķi</translation>
 <translation id="8073670137947914548">Lejupielāde ir pabeigta</translation>
+<translation id="8073872304774253879">Uzlabot meklēšanu un pārlūkošanu</translation>
 <translation id="8076014560081431679">Saglabātie vietņu iestatījumi netiks dzēsti, un tie var atspoguļot jūsu pārlūkošanas ieradumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
 <translation id="8114753159095730575">Pieejama failu lejupielāde. Pieejamās opcijas redzamas ekrāna apakšdaļā.</translation>
 <translation id="8131740175452115882">Apstiprināt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 37f57d74..a45a6d0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -15,6 +15,7 @@
 <translation id="1165039591588034296">Błąd</translation>
 <translation id="1172898394251786223">Następne pole</translation>
 <translation id="1176932207622159128">Nie można zapisać</translation>
+<translation id="1180526666083833456">Synchronizacja i personalizacja na urządzeniach.</translation>
 <translation id="1181037720776840403">Usuń</translation>
 <translation id="1201530049782216880">Nowa karta incognito</translation>
 <translation id="1209206284964581585">Na razie ukryj</translation>
@@ -37,6 +38,7 @@
 <translation id="1400642268715879018">Ostatnie cztery tygodnie</translation>
 <translation id="1407135791313364759">Otwórz wszystkie</translation>
 <translation id="1430915738399379752">Drukuj</translation>
+<translation id="1436290164580597469">Wpisz hasło, by rozpocząć synchronizację.</translation>
 <translation id="145015347812617860">Elementy: <ph name="COUNT" /></translation>
 <translation id="1491277525950327607">Kliknij dwukrotnie, by zmienić ustawienie</translation>
 <translation id="152234381334907219">Nigdy nie zapisane</translation>
@@ -105,8 +107,10 @@
 <translation id="2435457462613246316">Pokaż hasło</translation>
 <translation id="2481538920734869610">DODAJ KONTO</translation>
 <translation id="2497852260688568942">Synchronizację wyłączył administrator</translation>
+<translation id="2500374554657206846">Opcje zapisania hasła</translation>
 <translation id="2523363575747517183">Ta strona internetowa wielokrotnie próbuje otworzyć inną aplikację.</translation>
 <translation id="2529021024822217800">Otwórz wszystkie</translation>
+<translation id="2570206273416014374">Niektóre pliki cookie oraz zapytania wpisane na pasku adresu i w polu wyszukiwania zostaną wysłane do domyślnej wyszukiwarki.</translation>
 <translation id="2572712655377361602">Zasady dotyczące urządzeń zablokowały dostęp do Twoich zdjęć</translation>
 <translation id="2584132361465095047">Dodaj konto…</translation>
 <translation id="2625189173221582860">Hasło zostało skopiowane</translation>
@@ -178,6 +182,7 @@
 <translation id="3533202363250687977">Zamknij karty incognito</translation>
 <translation id="3533436815740441613">Nowa karta</translation>
 <translation id="3551320343578183772">Zamknij kartę</translation>
+<translation id="3581564640715911333">Proponuj tłumaczenie stron w innych językach</translation>
 <translation id="3588820906588687999">Otwórz grafikę w nowej karcie</translation>
 <translation id="3603009562372709545">Kopiuj URL linku</translation>
 <translation id="3607167657931203000">Autouzupełnianie</translation>
@@ -185,6 +190,7 @@
 <translation id="3638472932233958418">Wstępne wczytywanie stron</translation>
 <translation id="3691593122358196899">Utworzono zakładkę w folderze <ph name="FOLDER_TITLE" /></translation>
 <translation id="3771033907050503522">Karty incognito</translation>
+<translation id="3775743491439407556">Synchronizacja nie działa</translation>
 <translation id="3779810277399252432">Brak połączenia z internetem.</translation>
 <translation id="3783017676699494206">Zapisz obraz</translation>
 <translation id="3789841737615482174">Zainstaluj</translation>
@@ -219,11 +225,13 @@
 <translation id="4272631900155121838">Aby zeskanować kod QR, włącz aparat w ustawieniach</translation>
 <translation id="4281844954008187215">Warunki korzystania z usługi</translation>
 <translation id="430793432425771671">Synchronizuj wszystko</translation>
+<translation id="4338650699862464074">Adresy URL odwiedzanych stron będą wysyłane do Google.</translation>
 <translation id="4359125752503270327">Strona zostanie otwarta w innej aplikacji.</translation>
 <translation id="4370827530403103842">Synchronizacja nie działa. Kliknij, by ją naprawić.</translation>
 <translation id="4375040482473363939">Wyszukiwanie z użyciem kodu QR</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Informacje na temat ochrony prywatności</translation>
+<translation id="4454246407045105932">Dodaj język</translation>
 <translation id="4476574785019001431">Ustawienia</translation>
 <translation id="4496373720959965247">Dodaj karty i przełączaj się między stronami</translation>
 <translation id="4508750114462689118">Zamknij okno zachęcające do logowania</translation>
@@ -234,6 +242,7 @@
 <translation id="461440297010471931">Wyszukiwanie z Google</translation>
 <translation id="4619615317237390068">Karty z innych urządzeń</translation>
 <translation id="4620246317052452550">Przeczytane strony</translation>
+<translation id="4630540211544979320">Przetłumacz strony</translation>
 <translation id="4636930964841734540">Informacje</translation>
 <translation id="4659667755519643272">Otwórz przełącznik kart</translation>
 <translation id="4666531726415300315">Jesteś zalogowany jako <ph name="EMAIL" />.
@@ -248,7 +257,9 @@
 
 Aby zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" />.</translation>
 <translation id="4807020197310989387">1 nieprzeczytany artykuł na liście Do przeczytania.</translation>
+<translation id="4818522717893377262">Dodaj język...</translation>
 <translation id="481968316161811770">Cookie i dane stron</translation>
+<translation id="4833786495304741580">Automatycznie przesyła do Google statystyki użytkowania i raporty o awariach.</translation>
 <translation id="4840495572919996524">Twoje zakładki, historia, hasła i inne ustawienia przestaną być synchronizowane z Twoim kontem Google.</translation>
 <translation id="4854345657858711387">Ustaw kod dostępu</translation>
 <translation id="4860895144060829044">Zadzwoń</translation>
@@ -289,6 +300,7 @@
 <translation id="5548760955356983418">Dzięki funkcji Handoff możesz rozpocząć przeglądanie strony na tym urządzeniu, a następnie płynnie kontynuować na Macu. Aktualnie otwarta strona internetowa wyświetli się w Docku na Macu.
 
 Funkcja Handoff musi być też włączona w sekcji Ogólne w Ustawieniach, a urządzenie musi używać tego samego konta iCloud.</translation>
+<translation id="5551897871312988470">Proponuj tłumaczenie</translation>
 <translation id="5556459405103347317">Odśwież</translation>
 <translation id="5614553682702429503">Zapisać hasło?</translation>
 <translation id="5626245204502895507">Nie udało się pobrać teraz tego pliku.</translation>
@@ -336,6 +348,7 @@
 <translation id="6187302354554850004">Ostatnia synchronizacja: <ph name="LAST_USED_TIME" /></translation>
 <translation id="6189413832092199491">Nieprzeczytane</translation>
 <translation id="6196207969502475924">Wyszukiwanie głosowe</translation>
+<translation id="6219688215832490856">Nigdy nie tłumacz</translation>
 <translation id="6254066287920239840">Otwieraj linki w aplikacji, a nie w przeglądarce.</translation>
 <translation id="6255097610484507482">Edytuj kartę kredytową</translation>
 <translation id="6303969859164067831">Wyloguj się i wyłącz synchronizację</translation>
@@ -390,6 +403,7 @@
 <translation id="6945221475159498467">Wybierz</translation>
 <translation id="6973630695168034713">Foldery</translation>
 <translation id="6979158407327259162">Dysk Google</translation>
+<translation id="6988572888918530647">Zarządzaj kontem Google</translation>
 <translation id="7004499039102548441">Ostatnie karty</translation>
 <translation id="7006788746334555276">Ustawienia treści</translation>
 <translation id="7015203776128479407">Nie ukończono początkowej konfiguracji synchronizacji. Synchronizacja jest wyłączona.</translation>
@@ -460,6 +474,7 @@
 <translation id="8059533439631660104">Zwija sekcję.</translation>
 <translation id="806745655614357130">Przechowuj dane oddzielnie</translation>
 <translation id="8073670137947914548">Pobieranie zakończone</translation>
+<translation id="8073872304774253879">Ulepsz wyszukiwanie i przeglądanie</translation>
 <translation id="8076014560081431679">Zapisane ustawienia witryn nie zostaną usunięte i mogą zawierać informacje o Twoim korzystaniu z przeglądarki. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <translation id="8114753159095730575">Pobrany plik jest dostępny. Opcje są dostępne u dołu ekranu.</translation>
 <translation id="8131740175452115882">Potwierdź</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index c1f8ec54..de5768b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -37,6 +37,7 @@
 <translation id="1400642268715879018">過去 4 週</translation>
 <translation id="1407135791313364759">全部開啟</translation>
 <translation id="1430915738399379752">列印</translation>
+<translation id="1449835205994625556">隱藏密碼</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> 個項目</translation>
 <translation id="1491277525950327607">輕觸兩下即可切換設定</translation>
 <translation id="152234381334907219">永不儲存</translation>
diff --git a/ios/chrome/browser/browsing_data/browsing_data_features.cc b/ios/chrome/browser/browsing_data/browsing_data_features.cc
index 991ec07..4b585cc 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_features.cc
+++ b/ios/chrome/browser/browsing_data/browsing_data_features.cc
@@ -5,7 +5,7 @@
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 
 const base::Feature kNewClearBrowsingDataUI{"NewClearBrowsingDataUI",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kWebClearBrowsingData{"WebClearBrowsingData",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
index b878f35..55fb48c 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -32,6 +32,7 @@
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_metrics_recorder.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h"
+#import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_consumer.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_metrics.h"
 #import "ios/chrome/browser/ui/content_suggestions/user_account_image_update_delegate.h"
@@ -47,6 +48,8 @@
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #import "ios/chrome/common/favicon/favicon_attributes.h"
 #include "ios/chrome/grit/ios_strings.h"
+#import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
+#import "ios/public/provider/chrome/browser/signin/signin_resources_provider.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
 #import "ios/web/public/navigation_item.h"
 #import "ios/web/public/navigation_manager.h"
@@ -463,6 +466,36 @@
 }
 
 - (void)registerImageUpdater:(id<UserAccountImageUpdateDelegate>)imageUpdater {
+  UIImage* image;
+  // Fetches user's identity from Authentication Service.
+  ChromeIdentity* identity = self.authService->GetAuthenticatedIdentity();
+  if (identity) {
+    // Fetches user's avatar from Authentication Service. Use cached version if
+    // one is available. If not, use the default avatar and initiate a fetch
+    // in the background. When background fetch completes, all observers will
+    // be notified to refresh the user's avatar.
+    // TODO(crbug.com/961120): Implement observers. This avatar fetch code
+    // is from the IdentityRefreshLogic in settings_table_view_controller.mm.
+    // Code can probably be shared.
+    ios::ChromeIdentityService* identityService =
+        ios::GetChromeBrowserProvider()->GetChromeIdentityService();
+    image = identityService->GetCachedAvatarForIdentity(identity);
+    if (!image) {
+      image = [self defaultAvatar];
+      identityService->GetAvatarForIdentity(identity, nil);
+    }
+  } else {
+    // User is not signed in, show default avatar.
+    image = [self defaultAvatar];
+  }
+  // TODO(crbug.com/961120): Use ResizedAvatarCache when it accepts the
+  // specification of different image sizes.
+  CGFloat dimension = ntp_home::kIdentityAvatarDimension;
+  if (image.size.width != dimension || image.size.height != dimension) {
+    image = ResizeImage(image, CGSizeMake(dimension, dimension),
+                        ProjectionMode::kAspectFit);
+  }
+  [imageUpdater updateAccountImage:image];
 }
 
 - (BOOL)ignoreLoadRequests {
@@ -621,4 +654,12 @@
     [self.suggestionsViewController setContentOffset:offset];
 }
 
+// Returns the default avatar image for users who are not signed in or signed
+// in but avatar image is not available yet.
+- (UIImage*)defaultAvatar {
+  return ios::GetChromeBrowserProvider()
+      ->GetSigninResourcesProvider()
+      ->GetDefaultAvatar();
+}
+
 @end
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index d7a8b4d6..dc93121f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -67,6 +67,28 @@
 // CHROME_EG_ASSERT_NO_ERROR is removed.
 - (NSError*)goBack;
 
+// Opens a new tab and waits for the new tab animation to complete within a
+// timeout, or a GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)openNewTab;
+
+// Opens a new incognito tab and waits for the new tab animation to complete.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)openNewIncognitoTab;
+
+// Closes all tabs in the current mode (incognito or normal), and waits for the
+// UI to complete. If current mode is Incognito, mode will be switched to
+// normal after closing all tabs.
+- (void)closeAllTabsInCurrentMode;
+
+// Closes all incognito tabs and waits for the UI to complete within a
+// timeout, or a GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)closeAllIncognitoTabs;
+
 // Waits for the page to finish loading within a timeout, or a GREYAssert is
 // induced.
 // TODO(crbug.com/963613): Change return type to void when
@@ -105,26 +127,6 @@
 // CHROME_EG_ASSERT_NO_ERROR is removed.
 - (NSError*)goForward;
 
-// Opens a new tab and waits for the new tab animation to complete within a
-// timeout, or a GREYAssert is induced.
-// TODO(crbug.com/963613): Change return type to void when
-// CHROME_EG_ASSERT_NO_ERROR is removed.
-- (NSError*)openNewTab;
-
-// Opens a new incognito tab and waits for the new tab animation to complete.
-- (NSError*)openNewIncognitoTab WARN_UNUSED_RESULT;
-
-// Closes all tabs in the current mode (incognito or normal), and waits for the
-// UI to complete. If current mode is Incognito, mode will be switched to
-// normal after closing all tabs.
-- (void)closeAllTabsInCurrentMode;
-
-// Closes all incognito tabs and waits for the UI to complete  within a
-// timeout, or a GREYAssert is induced.
-// TODO(crbug.com/963613): Change return type to void when
-// CHROME_EG_ASSERT_NO_ERROR is removed.
-- (NSError*)closeAllIncognitoTabs;
-
 // Closes the current tab and waits for the UI to complete.
 - (void)closeCurrentTab;
 
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index aa11fbf5..03aefa0 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -75,6 +75,35 @@
   return nil;
 }
 
+- (NSError*)openNewTab {
+  [ChromeEarlGreyAppInterface openNewTab];
+  [self waitForPageToFinishLoading];
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  return nil;
+}
+
+- (NSError*)openNewIncognitoTab {
+  [ChromeEarlGreyAppInterface openNewIncognitoTab];
+  [self waitForPageToFinishLoading];
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  return nil;
+}
+
+- (void)closeAllTabsInCurrentMode {
+  [ChromeEarlGreyAppInterface closeAllTabsInCurrentMode];
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+}
+
+- (NSError*)closeAllIncognitoTabs {
+  EG_TEST_HELPER_ASSERT_TRUE([ChromeEarlGreyAppInterface closeAllIncognitoTabs],
+                             @"Could not close all Incognito tabs");
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  return nil;
+}
+
 - (NSError*)waitForPageToFinishLoading {
   GREYCondition* finishedLoading = [GREYCondition
       conditionWithName:kWaitForPageToFinishLoadingError
@@ -192,35 +221,6 @@
   return nil;
 }
 
-- (NSError*)openNewTab {
-  chrome_test_util::OpenNewTab();
-  [self waitForPageToFinishLoading];
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  return nil;
-}
-
-- (NSError*)openNewIncognitoTab {
-  chrome_test_util::OpenNewIncognitoTab();
-  [self waitForPageToFinishLoading];
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  return nil;
-}
-
-- (void)closeAllTabsInCurrentMode {
-  chrome_test_util::CloseAllTabsInCurrentMode();
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-}
-
-- (NSError*)closeAllIncognitoTabs {
-  bool closed = chrome_test_util::CloseAllIncognitoTabs();
-  EG_TEST_HELPER_ASSERT_TRUE(closed, @"Could not close all Incognito tabs");
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-
-  return nil;
-}
-
 - (void)closeCurrentTab {
   chrome_test_util::CloseCurrentTab();
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index 2865017..5d65616f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -29,6 +29,20 @@
 // Returns YES if the current WebState is loading.
 + (BOOL)isLoading;
 
+// Opens a new tab, and does not wait for animations to complete.
++ (void)openNewTab;
+
+// Opens a new incognito tab, and does not wait for animations to complete.
++ (void)openNewIncognitoTab;
+
+// Closes all tabs in the current mode (incognito or normal), and does not wait
+// for the UI to complete. If current mode is Incognito, mode will be switched
+// normal after closing all tabs.
++ (void)closeAllTabsInCurrentMode;
+
+// Closes all incognito tabs. Return YES on success.
++ (bool)closeAllIncognitoTabs;
+
 // Navigates back to the previous page.
 + (void)goBack;
 
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index b32c423..3f3ac81 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -8,6 +8,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/history_test_util.h"
 #include "ios/chrome/test/app/navigation_test_util.h"
+#import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/testing/nserror_util.h"
 #import "ios/web/public/test/earl_grey/js_test_util.h"
 
@@ -44,6 +45,21 @@
   return chrome_test_util::IsLoading();
 }
 
++ (void)openNewTab {
+  chrome_test_util::OpenNewTab();
+}
+
++ (void)openNewIncognitoTab {
+  chrome_test_util::OpenNewIncognitoTab();
+}
+
++ (void)closeAllTabsInCurrentMode {
+  chrome_test_util::CloseAllTabsInCurrentMode();
+}
+
++ (bool)closeAllIncognitoTabs {
+  return chrome_test_util::CloseAllIncognitoTabs();
+}
 + (void)goBack {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goBack];
 }
diff --git a/ios/chrome/test/earl_grey2/smoke_egtest.mm b/ios/chrome/test/earl_grey2/smoke_egtest.mm
index 32107e3..e770e38 100644
--- a/ios/chrome/test/earl_grey2/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey2/smoke_egtest.mm
@@ -115,4 +115,13 @@
   [ChromeEarlGrey loadURL:GURL("chrome://version")];
 }
 
+// Tests tab open/close-related converted helpers in chrome_earl_grey.h.
+- (void)testTabOpeningAndClosing {
+  [ChromeEarlGrey openNewTab];
+  [ChromeEarlGrey openNewIncognitoTab];
+  [ChromeEarlGrey openNewTab];
+  [ChromeEarlGrey closeAllTabsInCurrentMode];
+  [ChromeEarlGrey closeAllIncognitoTabs];
+}
+
 @end
diff --git a/media/audio/alsa/alsa_output.cc b/media/audio/alsa/alsa_output.cc
index 254fd306..7f72aef 100644
--- a/media/audio/alsa/alsa_output.cc
+++ b/media/audio/alsa/alsa_output.cc
@@ -337,6 +337,10 @@
   TransitionTo(kIsStopped);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void AlsaPcmOutputStream::Flush() {}
+
 void AlsaPcmOutputStream::SetVolume(double volume) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
diff --git a/media/audio/alsa/alsa_output.h b/media/audio/alsa/alsa_output.h
index acf139b..4efec65 100644
--- a/media/audio/alsa/alsa_output.h
+++ b/media/audio/alsa/alsa_output.h
@@ -81,6 +81,7 @@
   void Close() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
+  void Flush() override;
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
 
diff --git a/media/audio/android/audio_track_output_stream.cc b/media/audio/android/audio_track_output_stream.cc
index b271a8a..1012622b8 100644
--- a/media/audio/android/audio_track_output_stream.cc
+++ b/media/audio/android/audio_track_output_stream.cc
@@ -88,6 +88,10 @@
   audio_manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void AudioTrackOutputStream::Flush() {}
+
 void AudioTrackOutputStream::SetMute(bool muted) {
   if (params_.IsBitstreamFormat() && muted) {
     LOG(WARNING)
diff --git a/media/audio/android/audio_track_output_stream.h b/media/audio/android/audio_track_output_stream.h
index 8cb2ba0..500671b 100644
--- a/media/audio/android/audio_track_output_stream.h
+++ b/media/audio/android/audio_track_output_stream.h
@@ -31,6 +31,7 @@
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
   void Close() override;
+  void Flush() override;
 
   // MuteableAudioOutputStream implementation.
   void SetMute(bool muted) override;
diff --git a/media/audio/android/opensles_output.cc b/media/audio/android/opensles_output.cc
index 0c0a1c9..17554fa 100644
--- a/media/audio/android/opensles_output.cc
+++ b/media/audio/android/opensles_output.cc
@@ -220,6 +220,10 @@
   audio_manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void OpenSLESOutputStream::Flush() {}
+
 void OpenSLESOutputStream::SetVolume(double volume) {
   DVLOG(2) << "OpenSLESOutputStream::SetVolume(" << volume << ")";
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/media/audio/android/opensles_output.h b/media/audio/android/opensles_output.h
index 6de0991..4c1cec16 100644
--- a/media/audio/android/opensles_output.h
+++ b/media/audio/android/opensles_output.h
@@ -42,6 +42,7 @@
   // Implementation of MuteableAudioOutputStream.
   bool Open() override;
   void Close() override;
+  void Flush() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
   void SetVolume(double volume) override;
diff --git a/media/audio/audio_io.h b/media/audio/audio_io.h
index ed22a294..8f56ef0 100644
--- a/media/audio/audio_io.h
+++ b/media/audio/audio_io.h
@@ -111,6 +111,10 @@
   // Close the stream.
   // After calling this method, the object should not be used anymore.
   virtual void Close() = 0;
+
+  // Flushes the stream. This should only be called if the stream is not
+  // playing. (i.e. called after Stop or Open)
+  virtual void Flush() = 0;
 };
 
 // Models an audio sink receiving recorded audio from the audio driver.
diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc
index 508c571..88a5ddc 100644
--- a/media/audio/audio_output_controller.cc
+++ b/media/audio/audio_output_controller.cc
@@ -205,6 +205,19 @@
           base::WrapRefCounted(this), std::move(closed_task)));
 }
 
+void AudioOutputController::Flush() {
+  CHECK_EQ(AudioManager::Get(), audio_manager_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+
+  if (task_runner_->BelongsToCurrentThread()) {
+    DoFlush();
+    return;
+  }
+
+  task_runner_->PostTask(FROM_HERE,
+                         base::BindOnce(&AudioOutputController::DoFlush, this));
+}
+
 void AudioOutputController::SetVolume(double volume) {
   CHECK_EQ(AudioManager::Get(), audio_manager_);
   DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
@@ -347,6 +360,21 @@
   }
 }
 
+void AudioOutputController::DoFlush() {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+  SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.FlushTime");
+  TRACE_EVENT0("audio", "AudioOutputController::DoFlush");
+  handler_->OnLog("AOC::DoFlush");
+
+  if (stream_) {
+    if (state_ == kPlaying) {
+      handler_->OnControllerError();
+    } else {
+      stream_->Flush();
+    }
+  }
+}
+
 void AudioOutputController::DoSetVolume(double volume) {
   DCHECK(task_runner_->BelongsToCurrentThread());
 
diff --git a/media/audio/audio_output_controller.h b/media/audio/audio_output_controller.h
index b3721f1..77b793a 100644
--- a/media/audio/audio_output_controller.h
+++ b/media/audio/audio_output_controller.h
@@ -162,6 +162,9 @@
   // case, it must be null.
   void Close(base::OnceClosure closed_task);
 
+  // Flushes the audio output stream
+  void Flush();
+
   // Sets the volume of the audio output stream.
   void SetVolume(double volume);
 
@@ -247,6 +250,7 @@
   void DoPlay();
   void DoPause();
   void DoClose();
+  void DoFlush();
   void DoSetVolume(double volume);
   void DoReportError();
   void DoStartDiverting(AudioOutputStream* to_stream);
diff --git a/media/audio/audio_output_controller_unittest.cc b/media/audio/audio_output_controller_unittest.cc
index 3cbbbfe3..55e0b08 100644
--- a/media/audio/audio_output_controller_unittest.cc
+++ b/media/audio/audio_output_controller_unittest.cc
@@ -25,6 +25,7 @@
 #include "base/unguessable_token.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/audio_source_diverter.h"
+#include "media/audio/mock_audio_manager.h"
 #include "media/audio/test_audio_thread.h"
 #include "media/base/audio_bus.h"
 #include "media/base/audio_parameters.h"
@@ -93,20 +94,25 @@
   explicit MockAudioOutputStream(AudioManager* audio_manager)
       : audio_manager_(audio_manager) {}
 
+  explicit MockAudioOutputStream() : audio_manager_(nullptr) {}
+
   // We forward to a fake stream to get automatic OnMoreData callbacks,
   // required by some tests.
   MOCK_METHOD0(DidOpen, void());
   MOCK_METHOD0(DidStart, void());
   MOCK_METHOD0(DidStop, void());
   MOCK_METHOD0(DidClose, void());
+  MOCK_METHOD0(DidFlush, void());
   MOCK_METHOD1(SetVolume, void(double));
   MOCK_METHOD1(GetVolume, void(double* volume));
 
   bool Open() override {
     EXPECT_EQ(nullptr, impl_);
-    impl_ =
-        audio_manager_->MakeAudioOutputStreamProxy(AOCTestParams(), "default");
-    impl_->Open();
+    if (audio_manager_) {
+      impl_ = audio_manager_->MakeAudioOutputStreamProxy(AOCTestParams(),
+                                                         "default");
+      impl_->Open();
+    }
     DidOpen();
     return true;
   }
@@ -114,22 +120,35 @@
   void Start(AudioOutputStream::AudioSourceCallback* cb) override {
     EXPECT_EQ(nullptr, callback_);
     callback_ = cb;
-    impl_->Start(this);
+    if (impl_) {
+      impl_->Start(this);
+    }
     DidStart();
   }
 
   void Stop() override {
-    impl_->Stop();
+    if (impl_) {
+      impl_->Stop();
+    }
     callback_ = nullptr;
     DidStop();
   }
 
   void Close() override {
-    impl_->Close();
+    if (impl_) {
+      impl_->Close();
+    }
     impl_ = nullptr;
     DidClose();
   }
 
+  void Flush() override {
+    if (impl_) {
+      impl_->Flush();
+    }
+    DidFlush();
+  }
+
  private:
   int OnMoreData(base::TimeDelta delay,
                  base::TimeTicks delay_timestamp,
@@ -413,6 +432,89 @@
   DISALLOW_COPY_AND_ASSIGN(AudioOutputControllerTest);
 };
 
+class AudioOutputControllerMockTest : public TestWithParam<bool> {
+ public:
+  AudioOutputControllerMockTest()
+      : audio_manager_(std::make_unique<media::TestAudioThread>(true)) {
+    audio_manager_.SetMakeOutputStreamCB(
+        base::BindRepeating([](media::AudioOutputStream* stream,
+                               const media::AudioParameters& params,
+                               const std::string& device_id) { return stream; },
+                            &mock_stream_));
+  }
+
+  ~AudioOutputControllerMockTest() { audio_manager_.Shutdown(); }
+
+ protected:
+  void Create() {
+    EXPECT_CALL(mock_event_handler_, OnControllerCreated());
+    EXPECT_CALL(mock_stream_, DidOpen());
+    EXPECT_CALL(mock_stream_, SetVolume(1));  // Default volume
+    controller_ = AudioOutputController::Create(
+        &audio_manager_, &mock_event_handler_, AOCTestParams(), std::string(),
+        base::UnguessableToken(), &mock_sync_reader_);
+    EXPECT_NE(nullptr, controller_.get());
+    EXPECT_CALL(mock_stream_, SetVolume(kTestVolume));
+    controller_->SetVolume(kTestVolume);
+  }
+
+  void Close() {
+    EXPECT_CALL(mock_sync_reader_, Close());
+    EXPECT_CALL(mock_stream_, DidClose());
+
+    base::RunLoop run_loop;
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(&AudioOutputController::Close, controller_,
+                                  run_loop.QuitClosure()));
+    run_loop.Run();
+  }
+
+  void Play() {
+    base::RunLoop run_loop;
+    EXPECT_CALL(mock_stream_, DidStart())
+        .WillOnce(RunClosure(run_loop.QuitClosure()));
+    EXPECT_CALL(mock_event_handler_, OnControllerPlaying());
+    EXPECT_CALL(mock_sync_reader_, RequestMoreData(_, _, _))
+        .WillRepeatedly(Return());
+    controller_->Play();
+    run_loop.Run();
+  }
+
+  void Pause() {
+    base::RunLoop loop;
+    EXPECT_CALL(mock_stream_, DidStop());
+    EXPECT_CALL(mock_event_handler_, OnControllerPaused())
+        .WillOnce(RunOnceClosure(loop.QuitClosure()));
+    controller_->Pause();
+    loop.Run();
+    Mock::VerifyAndClearExpectations(&mock_event_handler_);
+  }
+
+  void Flush(bool is_playing) {
+    base::RunLoop loop;
+    if (is_playing) {
+      EXPECT_CALL(mock_stream_, DidFlush())
+          .WillOnce(RunOnceClosure(loop.QuitClosure()));
+    } else {
+      EXPECT_CALL(mock_event_handler_, OnControllerError())
+          .Times(1)
+          .WillOnce(RunOnceClosure(loop.QuitClosure()));
+    }
+
+    controller_->Flush();
+    loop.Run();
+  }
+
+  StrictMock<MockAudioOutputControllerEventHandler> mock_event_handler_;
+
+ private:
+  base::TestMessageLoop message_loop_;
+  MockAudioManager audio_manager_;
+  StrictMock<MockAudioOutputControllerSyncReader> mock_sync_reader_;
+  StrictMock<MockAudioOutputStream> mock_stream_;
+  scoped_refptr<AudioOutputController> controller_;
+};
+
 TEST_P(AudioOutputControllerTest, CreateAndClose) {
   Create();
   Close();
@@ -520,6 +622,22 @@
   Close();
 }
 
+TEST_F(AudioOutputControllerMockTest, FlushWhenStreamIsPaused) {
+  Create();
+  Play();
+  Pause();
+  Flush(true);
+  Close();
+}
+
+TEST_F(AudioOutputControllerMockTest, FlushWhenStreamIsPlayingTriggersError) {
+  Create();
+  Play();
+  Flush(false);
+  Pause();
+  Close();
+}
+
 INSTANTIATE_TEST_SUITE_P(AOC, AudioOutputControllerTest, Bool());
 
 }  // namespace media
diff --git a/media/audio/audio_output_delegate.h b/media/audio/audio_output_delegate.h
index 8cd95aa..ab14a28c 100644
--- a/media/audio/audio_output_delegate.h
+++ b/media/audio/audio_output_delegate.h
@@ -44,6 +44,7 @@
   // Stream control:
   virtual void OnPlayStream() = 0;
   virtual void OnPauseStream() = 0;
+  virtual void OnFlushStream() = 0;
   virtual void OnSetVolume(double volume) = 0;
 };
 
diff --git a/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc
index 0cf6975..0b4eda8f6 100644
--- a/media/audio/audio_output_device.cc
+++ b/media/audio/audio_output_device.cc
@@ -126,6 +126,12 @@
       FROM_HERE, base::BindOnce(&AudioOutputDevice::PauseOnIOThread, this));
 }
 
+void AudioOutputDevice::Flush() {
+  TRACE_EVENT0("audio", "AudioOutputDevice::Flush");
+  io_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&AudioOutputDevice::FlushOnIOThread, this));
+}
+
 bool AudioOutputDevice::SetVolume(double volume) {
   TRACE_EVENT1("audio", "AudioOutputDevice::Pause", "volume", volume);
 
@@ -232,6 +238,13 @@
     ipc_->PauseStream();
 }
 
+void AudioOutputDevice::FlushOnIOThread() {
+  DCHECK(io_task_runner_->BelongsToCurrentThread());
+
+  if (ipc_)
+    ipc_->FlushStream();
+}
+
 void AudioOutputDevice::ShutDownOnIOThread() {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
 
diff --git a/media/audio/audio_output_device.h b/media/audio/audio_output_device.h
index a512e72b..ff0ea95e 100644
--- a/media/audio/audio_output_device.h
+++ b/media/audio/audio_output_device.h
@@ -108,6 +108,7 @@
   void Stop() override;
   void Play() override;
   void Pause() override;
+  void Flush() override;
   bool SetVolume(double volume) override;
   OutputDeviceInfo GetOutputDeviceInfo() override;
   void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override;
@@ -160,6 +161,7 @@
   void CreateStreamOnIOThread();
   void PlayOnIOThread();
   void PauseOnIOThread();
+  void FlushOnIOThread();
   void ShutDownOnIOThread();
   void SetVolumeOnIOThread(double volume);
 
diff --git a/media/audio/audio_output_device_unittest.cc b/media/audio/audio_output_device_unittest.cc
index 34e2dda..a5f8700 100644
--- a/media/audio/audio_output_device_unittest.cc
+++ b/media/audio/audio_output_device_unittest.cc
@@ -85,6 +85,7 @@
            const base::Optional<base::UnguessableToken>& processing_id));
   MOCK_METHOD0(PlayStream, void());
   MOCK_METHOD0(PauseStream, void());
+  MOCK_METHOD0(FlushStream, void());
   MOCK_METHOD0(CloseStream, void());
   MOCK_METHOD1(SetVolume, void(double volume));
 };
@@ -100,6 +101,7 @@
   void StartAudioDevice();
   void CallOnStreamCreated();
   void StopAudioDevice();
+  void FlushAudioDevice();
   void CreateDevice(const std::string& device_id,
                     base::TimeDelta timeout = kAuthTimeout);
   void SetDevice(const std::string& device_id);
@@ -225,6 +227,14 @@
   task_env_.FastForwardBy(base::TimeDelta());
 }
 
+void AudioOutputDeviceTest::FlushAudioDevice() {
+  if (device_status_ == OUTPUT_DEVICE_STATUS_OK)
+    EXPECT_CALL(*audio_output_ipc_, FlushStream());
+
+  audio_device_->Flush();
+  task_env_.FastForwardBy(base::TimeDelta());
+}
+
 TEST_F(AudioOutputDeviceTest, Initialize) {
   // Tests that the object can be constructed, initialized and destructed
   // without having ever been started.
@@ -383,6 +393,12 @@
   task_env_.FastForwardBy(base::TimeDelta());
 }
 
+TEST_F(AudioOutputDeviceTest, StreamIsFlushed) {
+  StartAudioDevice();
+  FlushAudioDevice();
+  StopAudioDevice();
+}
+
 namespace {
 
 // This struct collects useful stuff without doing anything magical. It is used
diff --git a/media/audio/audio_output_dispatcher.h b/media/audio/audio_output_dispatcher.h
index 22bcd7c..aa79817b 100644
--- a/media/audio/audio_output_dispatcher.h
+++ b/media/audio/audio_output_dispatcher.h
@@ -58,6 +58,10 @@
   // Called by AudioOutputProxy when the stream is closed.
   virtual void CloseStream(AudioOutputProxy* stream_proxy) = 0;
 
+  // Called by AudioOutputProxy to flush the stream.  This should only be
+  // called when a stream is stopped.
+  virtual void FlushStream(AudioOutputProxy* stream_proxy) = 0;
+
  protected:
   AudioManager* audio_manager() const { return audio_manager_; }
 
diff --git a/media/audio/audio_output_dispatcher_impl.cc b/media/audio/audio_output_dispatcher_impl.cc
index 932be81..ebe96ea 100644
--- a/media/audio/audio_output_dispatcher_impl.cc
+++ b/media/audio/audio_output_dispatcher_impl.cc
@@ -131,6 +131,10 @@
   close_timer_.Reset();
 }
 
+// There is nothing to flush since the phsyical stream is removed during
+// StopStream().
+void AudioOutputDispatcherImpl::FlushStream(AudioOutputProxy* stream_proxy) {}
+
 bool AudioOutputDispatcherImpl::HasOutputProxies() const {
   DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
   return idle_proxies_ || !proxy_to_physical_map_.empty();
diff --git a/media/audio/audio_output_dispatcher_impl.h b/media/audio/audio_output_dispatcher_impl.h
index dcea811..488f0ab8 100644
--- a/media/audio/audio_output_dispatcher_impl.h
+++ b/media/audio/audio_output_dispatcher_impl.h
@@ -47,6 +47,7 @@
   void StopStream(AudioOutputProxy* stream_proxy) override;
   void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) override;
   void CloseStream(AudioOutputProxy* stream_proxy) override;
+  void FlushStream(AudioOutputProxy* stream_proxy) override;
 
   // Returns true if there are any open AudioOutputProxy objects.
   bool HasOutputProxies() const;
diff --git a/media/audio/audio_output_ipc.h b/media/audio/audio_output_ipc.h
index 669a1c7..f41054e 100644
--- a/media/audio/audio_output_ipc.h
+++ b/media/audio/audio_output_ipc.h
@@ -95,6 +95,10 @@
   // AudioOutputController::Pause().
   virtual void PauseStream() = 0;
 
+  // Flushes an audio stream. This should only be called when the stream is
+  // paused.
+  virtual void FlushStream() = 0;
+
   // Closes the audio stream which should shut down the corresponding
   // AudioOutputController in the peer process. Usage of an AudioOutputIPC must
   // always end with a call to CloseStream(), and the |delegate| passed to other
diff --git a/media/audio/audio_output_proxy.cc b/media/audio/audio_output_proxy.cc
index f5dd3a1..f8d91be7 100644
--- a/media/audio/audio_output_proxy.cc
+++ b/media/audio/audio_output_proxy.cc
@@ -92,4 +92,11 @@
   delete this;
 }
 
+void AudioOutputProxy::Flush() {
+  DCHECK(state_ != kPlaying);
+
+  if (dispatcher_)
+    dispatcher_->FlushStream(this);
+}
+
 }  // namespace media
diff --git a/media/audio/audio_output_proxy.h b/media/audio/audio_output_proxy.h
index d68622f84b..9e132a1e 100644
--- a/media/audio/audio_output_proxy.h
+++ b/media/audio/audio_output_proxy.h
@@ -36,6 +36,7 @@
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
   void Close() override;
+  void Flush() override;
 
   AudioOutputDispatcher* get_dispatcher_for_testing() const {
     return dispatcher_.get();
diff --git a/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc
index cc5bd95..6f2902a 100644
--- a/media/audio/audio_output_proxy_unittest.cc
+++ b/media/audio/audio_output_proxy_unittest.cc
@@ -90,6 +90,7 @@
   MOCK_METHOD1(SetVolume, void(double volume));
   MOCK_METHOD1(GetVolume, void(double* volume));
   MOCK_METHOD0(Close, void());
+  MOCK_METHOD0(Flush, void());
 
  private:
   bool start_called_;
diff --git a/media/audio/audio_output_resampler.cc b/media/audio/audio_output_resampler.cc
index 67aa3b75..7f50515 100644
--- a/media/audio/audio_output_resampler.cc
+++ b/media/audio/audio_output_resampler.cc
@@ -464,6 +464,13 @@
   }
 }
 
+void AudioOutputResampler::FlushStream(AudioOutputProxy* stream_proxy) {
+  DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
+  DCHECK(dispatcher_);
+
+  dispatcher_->FlushStream(stream_proxy);
+}
+
 void AudioOutputResampler::StopStreamInternal(
     const CallbackMap::value_type& item) {
   DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread());
diff --git a/media/audio/audio_output_resampler.h b/media/audio/audio_output_resampler.h
index 556d9e3..f866ab4 100644
--- a/media/audio/audio_output_resampler.h
+++ b/media/audio/audio_output_resampler.h
@@ -54,6 +54,7 @@
   void StopStream(AudioOutputProxy* stream_proxy) override;
   void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) override;
   void CloseStream(AudioOutputProxy* stream_proxy) override;
+  void FlushStream(AudioOutputProxy* stream_proxy) override;
 
  private:
   using CallbackMap =
diff --git a/media/audio/audio_output_stream_sink.cc b/media/audio/audio_output_stream_sink.cc
index 7974224a..83343f4 100644
--- a/media/audio/audio_output_stream_sink.cc
+++ b/media/audio/audio_output_stream_sink.cc
@@ -61,6 +61,11 @@
       FROM_HERE, base::BindOnce(&AudioOutputStreamSink::DoPause, this));
 }
 
+void AudioOutputStreamSink::Flush() {
+  audio_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&AudioOutputStreamSink::DoFlush, this));
+}
+
 void AudioOutputStreamSink::Play() {
   {
     base::AutoLock al(callback_lock_);
@@ -152,6 +157,13 @@
   stream_->Stop();
 }
 
+void AudioOutputStreamSink::DoFlush() {
+  DCHECK(audio_task_runner_->BelongsToCurrentThread());
+  if (stream_) {
+    stream_->Flush();
+  }
+}
+
 void AudioOutputStreamSink::DoPlay() {
   DCHECK(audio_task_runner_->BelongsToCurrentThread());
   stream_->Start(this);
diff --git a/media/audio/audio_output_stream_sink.h b/media/audio/audio_output_stream_sink.h
index e5fadfa90..612da72 100644
--- a/media/audio/audio_output_stream_sink.h
+++ b/media/audio/audio_output_stream_sink.h
@@ -52,6 +52,7 @@
                  int prior_frames_skipped,
                  AudioBus* dest) override;
   void OnError() override;
+  void Flush() override;
 
  private:
   ~AudioOutputStreamSink() override;
@@ -61,6 +62,7 @@
   void DoStart(const AudioParameters& params);
   void DoStop();
   void DoPause();
+  void DoFlush();
   void DoPlay();
   void DoSetVolume(double volume);
 
diff --git a/media/audio/clockless_audio_sink.cc b/media/audio/clockless_audio_sink.cc
index a41bf20..ac1d2fc5 100644
--- a/media/audio/clockless_audio_sink.cc
+++ b/media/audio/clockless_audio_sink.cc
@@ -107,6 +107,8 @@
     Pause();
 }
 
+void ClocklessAudioSink::Flush() {}
+
 void ClocklessAudioSink::Play() {
   DCHECK(initialized_);
 
diff --git a/media/audio/clockless_audio_sink.h b/media/audio/clockless_audio_sink.h
index 8dbfb52..cf6d6a6e 100644
--- a/media/audio/clockless_audio_sink.h
+++ b/media/audio/clockless_audio_sink.h
@@ -27,6 +27,7 @@
                   RenderCallback* callback) override;
   void Start() override;
   void Stop() override;
+  void Flush() override;
   void Pause() override;
   void Play() override;
   bool SetVolume(double volume) override;
diff --git a/media/audio/cras/cras_unified.cc b/media/audio/cras/cras_unified.cc
index 2a8f92a..0719abca 100644
--- a/media/audio/cras/cras_unified.cc
+++ b/media/audio/cras/cras_unified.cc
@@ -131,6 +131,10 @@
   manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void CrasUnifiedStream::Flush() {}
+
 void CrasUnifiedStream::Start(AudioSourceCallback* callback) {
   CHECK(callback);
 
diff --git a/media/audio/cras/cras_unified.h b/media/audio/cras/cras_unified.h
index 2d5eeee..c857ac4 100644
--- a/media/audio/cras/cras_unified.h
+++ b/media/audio/cras/cras_unified.h
@@ -46,6 +46,7 @@
   // Implementation of AudioOutputStream.
   bool Open() override;
   void Close() override;
+  void Flush() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
   void SetVolume(double volume) override;
diff --git a/media/audio/fake_audio_output_stream.cc b/media/audio/fake_audio_output_stream.cc
index b0ef0481..13b04003c 100644
--- a/media/audio/fake_audio_output_stream.cc
+++ b/media/audio/fake_audio_output_stream.cc
@@ -56,6 +56,8 @@
   audio_manager_->ReleaseOutputStream(this);
 }
 
+void FakeAudioOutputStream::Flush() {}
+
 void FakeAudioOutputStream::SetVolume(double volume) {}
 
 void FakeAudioOutputStream::GetVolume(double* volume) {
diff --git a/media/audio/fake_audio_output_stream.h b/media/audio/fake_audio_output_stream.h
index 1233b2d..3f97020 100644
--- a/media/audio/fake_audio_output_stream.h
+++ b/media/audio/fake_audio_output_stream.h
@@ -32,6 +32,7 @@
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
   void Close() override;
+  void Flush() override;
   void SetMute(bool muted) override;
 
  private:
diff --git a/media/audio/fuchsia/audio_output_stream_fuchsia.cc b/media/audio/fuchsia/audio_output_stream_fuchsia.cc
index f247d5c..a497b7b 100644
--- a/media/audio/fuchsia/audio_output_stream_fuchsia.cc
+++ b/media/audio/fuchsia/audio_output_stream_fuchsia.cc
@@ -82,6 +82,10 @@
   timer_.Stop();
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void AudioOutputStreamFuchsia::Flush() {}
+
 void AudioOutputStreamFuchsia::SetVolume(double volume) {
   DCHECK(0.0 <= volume && volume <= 1.0) << volume;
   volume_ = volume;
diff --git a/media/audio/fuchsia/audio_output_stream_fuchsia.h b/media/audio/fuchsia/audio_output_stream_fuchsia.h
index cbfcbae7..9727702 100644
--- a/media/audio/fuchsia/audio_output_stream_fuchsia.h
+++ b/media/audio/fuchsia/audio_output_stream_fuchsia.h
@@ -26,6 +26,7 @@
   bool Open() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
+  void Flush() override;
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
   void Close() override;
diff --git a/media/audio/mac/audio_auhal_mac.cc b/media/audio/mac/audio_auhal_mac.cc
index cd89860..5bbbd23 100644
--- a/media/audio/mac/audio_auhal_mac.cc
+++ b/media/audio/mac/audio_auhal_mac.cc
@@ -255,6 +255,10 @@
   callback->OnError();
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void AUHALStream::Flush() {}
+
 void AUHALStream::Stop() {
   DCHECK(thread_checker_.CalledOnValidThread());
   deferred_start_cb_.Cancel();
diff --git a/media/audio/mac/audio_auhal_mac.h b/media/audio/mac/audio_auhal_mac.h
index 575a4df8..5cbbc246 100644
--- a/media/audio/mac/audio_auhal_mac.h
+++ b/media/audio/mac/audio_auhal_mac.h
@@ -86,6 +86,7 @@
   void Close() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
+  void Flush() override;
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
 
diff --git a/media/audio/null_audio_sink.cc b/media/audio/null_audio_sink.cc
index 971197af6..56d7c23b9 100644
--- a/media/audio/null_audio_sink.cc
+++ b/media/audio/null_audio_sink.cc
@@ -72,6 +72,8 @@
   playing_ = false;
 }
 
+void NullAudioSink::Flush() {}
+
 bool NullAudioSink::SetVolume(double volume) {
   // Audio is always muted.
   return volume == 0.0;
diff --git a/media/audio/null_audio_sink.h b/media/audio/null_audio_sink.h
index 3ca75aa..1db35b9 100644
--- a/media/audio/null_audio_sink.h
+++ b/media/audio/null_audio_sink.h
@@ -32,6 +32,7 @@
   void Stop() override;
   void Pause() override;
   void Play() override;
+  void Flush() override;
   bool SetVolume(double volume) override;
   OutputDeviceInfo GetOutputDeviceInfo() override;
   void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override;
diff --git a/media/audio/pulse/pulse_output.cc b/media/audio/pulse/pulse_output.cc
index ca1181d..6b03e08 100644
--- a/media/audio/pulse/pulse_output.cc
+++ b/media/audio/pulse/pulse_output.cc
@@ -124,6 +124,10 @@
   manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void PulseAudioOutputStream::Flush() {}
+
 void PulseAudioOutputStream::FulfillWriteRequest(size_t requested_bytes) {
   int bytes_remaining = requested_bytes;
   while (bytes_remaining > 0) {
diff --git a/media/audio/pulse/pulse_output.h b/media/audio/pulse/pulse_output.h
index 3a7b3fe..638459a 100644
--- a/media/audio/pulse/pulse_output.h
+++ b/media/audio/pulse/pulse_output.h
@@ -48,6 +48,7 @@
   // Implementation of AudioOutputStream.
   bool Open() override;
   void Close() override;
+  void Flush() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
   void SetVolume(double volume) override;
diff --git a/media/audio/virtual_audio_output_stream.cc b/media/audio/virtual_audio_output_stream.cc
index a7ba1dec..7bba9df 100644
--- a/media/audio/virtual_audio_output_stream.cc
+++ b/media/audio/virtual_audio_output_stream.cc
@@ -65,6 +65,10 @@
   }
 }
 
+// There is nothing to flush since |this| is removed from the
+// |target_input_stream_|.
+void VirtualAudioOutputStream::Flush() {}
+
 void VirtualAudioOutputStream::SetVolume(double volume) {
   DCHECK(thread_checker_.CalledOnValidThread());
   volume_ = volume;
diff --git a/media/audio/virtual_audio_output_stream.h b/media/audio/virtual_audio_output_stream.h
index 4f61f2873..706097b 100644
--- a/media/audio/virtual_audio_output_stream.h
+++ b/media/audio/virtual_audio_output_stream.h
@@ -44,6 +44,7 @@
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
   void Close() override;
+  void Flush() override;
 
  private:
   // AudioConverter::InputCallback:
diff --git a/media/audio/win/audio_low_latency_output_win.cc b/media/audio/win/audio_low_latency_output_win.cc
index e17cf794..fbb3bf4 100644
--- a/media/audio/win/audio_low_latency_output_win.cc
+++ b/media/audio/win/audio_low_latency_output_win.cc
@@ -362,6 +362,10 @@
   manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void WASAPIAudioOutputStream::Flush() {}
+
 void WASAPIAudioOutputStream::SetVolume(double volume) {
   DVLOG(1) << "SetVolume(volume=" << volume << ")";
   float volume_float = static_cast<float>(volume);
diff --git a/media/audio/win/audio_low_latency_output_win.h b/media/audio/win/audio_low_latency_output_win.h
index 4865a9d6..7609f2ea 100644
--- a/media/audio/win/audio_low_latency_output_win.h
+++ b/media/audio/win/audio_low_latency_output_win.h
@@ -138,6 +138,7 @@
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
   void Close() override;
+  void Flush() override;
   void SetVolume(double volume) override;
   void GetVolume(double* volume) override;
 
diff --git a/media/audio/win/waveout_output_win.cc b/media/audio/win/waveout_output_win.cc
index 3c1e3d6..64878cb 100644
--- a/media/audio/win/waveout_output_win.cc
+++ b/media/audio/win/waveout_output_win.cc
@@ -302,6 +302,10 @@
   manager_->ReleaseOutputStream(this);
 }
 
+// This stream is always used with sub second buffer sizes, where it's
+// sufficient to simply always flush upon Start().
+void PCMWaveOutAudioOutputStream::Flush() {}
+
 void PCMWaveOutAudioOutputStream::SetVolume(double volume) {
   if (!waveout_)
     return;
diff --git a/media/audio/win/waveout_output_win.h b/media/audio/win/waveout_output_win.h
index 76d81ea..f61d79c 100644
--- a/media/audio/win/waveout_output_win.h
+++ b/media/audio/win/waveout_output_win.h
@@ -46,6 +46,7 @@
   // Implementation of AudioOutputStream.
   bool Open() override;
   void Close() override;
+  void Flush() override;
   void Start(AudioSourceCallback* callback) override;
   void Stop() override;
   void SetVolume(double volume) override;
diff --git a/media/base/android/media_crypto_context.h b/media/base/android/media_crypto_context.h
index 77f5c318..1bc3686b 100644
--- a/media/base/android/media_crypto_context.h
+++ b/media/base/android/media_crypto_context.h
@@ -34,14 +34,14 @@
   //                                 Should be ignored if |media_crypto|
   //                                 contains null MediaCrypto object.
   using MediaCryptoReadyCB =
-      base::Callback<void(JavaObjectPtr media_crypto,
-                          bool requires_secure_video_codec)>;
+      base::OnceCallback<void(JavaObjectPtr media_crypto,
+                              bool requires_secure_video_codec)>;
 
   MediaCryptoContext() {}
   ~MediaCryptoContext() override {}
 
   virtual void SetMediaCryptoReadyCB(
-      const MediaCryptoReadyCB& media_crypto_ready_cb) = 0;
+      MediaCryptoReadyCB media_crypto_ready_cb) = 0;
 
   DISALLOW_COPY_AND_ASSIGN(MediaCryptoContext);
 };
diff --git a/media/base/android/media_crypto_context_impl.cc b/media/base/android/media_crypto_context_impl.cc
index d503848..434c9425 100644
--- a/media/base/android/media_crypto_context_impl.cc
+++ b/media/base/android/media_crypto_context_impl.cc
@@ -25,8 +25,8 @@
 }
 
 void MediaCryptoContextImpl::SetMediaCryptoReadyCB(
-    const MediaCryptoReadyCB& media_crypto_ready_cb) {
-  media_drm_bridge_->SetMediaCryptoReadyCB(media_crypto_ready_cb);
+    MediaCryptoReadyCB media_crypto_ready_cb) {
+  media_drm_bridge_->SetMediaCryptoReadyCB(std::move(media_crypto_ready_cb));
 }
 
 }  // namespace media
diff --git a/media/base/android/media_crypto_context_impl.h b/media/base/android/media_crypto_context_impl.h
index a3b83fb..24a4ca1 100644
--- a/media/base/android/media_crypto_context_impl.h
+++ b/media/base/android/media_crypto_context_impl.h
@@ -41,8 +41,7 @@
   void UnregisterPlayer(int registration_id) final;
 
   // MediaCryptoContext implementation.
-  void SetMediaCryptoReadyCB(
-      const MediaCryptoReadyCB& media_crypto_ready_cb) final;
+  void SetMediaCryptoReadyCB(MediaCryptoReadyCB media_crypto_ready_cb) final;
 
  private:
   MediaDrmBridge* const media_drm_bridge_;
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc
index 8d54dbe6..1a759fe57 100644
--- a/media/base/android/media_drm_bridge.cc
+++ b/media/base/android/media_drm_bridge.cc
@@ -626,12 +626,12 @@
 }
 
 void MediaDrmBridge::SetMediaCryptoReadyCB(
-    const MediaCryptoReadyCB& media_crypto_ready_cb) {
+    MediaCryptoReadyCB media_crypto_ready_cb) {
   if (!task_runner_->BelongsToCurrentThread()) {
     task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&MediaDrmBridge::SetMediaCryptoReadyCB,
-                       weak_factory_.GetWeakPtr(), media_crypto_ready_cb));
+        FROM_HERE, base::BindOnce(&MediaDrmBridge::SetMediaCryptoReadyCB,
+                                  weak_factory_.GetWeakPtr(),
+                                  std::move(media_crypto_ready_cb)));
     return;
   }
 
@@ -643,7 +643,7 @@
   }
 
   DCHECK(!media_crypto_ready_cb_);
-  media_crypto_ready_cb_ = media_crypto_ready_cb;
+  media_crypto_ready_cb_ = std::move(media_crypto_ready_cb);
 
   if (!j_media_crypto_)
     return;
diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h
index 852c8cb2..79c12136 100644
--- a/media/base/android/media_drm_bridge.h
+++ b/media/base/android/media_drm_bridge.h
@@ -166,7 +166,7 @@
   // The registered callbacks will be fired on |task_runner_|. The caller
   // should make sure that the callbacks are posted to the correct thread.
   // TODO(xhwang): Move this up to be close to RegisterPlayer().
-  void SetMediaCryptoReadyCB(const MediaCryptoReadyCB& media_crypto_ready_cb);
+  void SetMediaCryptoReadyCB(MediaCryptoReadyCB media_crypto_ready_cb);
 
   // All the OnXxx functions below are called from Java. The implementation must
   // only do minimal work and then post tasks to avoid reentrancy issues.
diff --git a/media/base/android/media_drm_bridge_factory.cc b/media/base/android/media_drm_bridge_factory.cc
index 0b9dd42..e8ce4c9 100644
--- a/media/base/android/media_drm_bridge_factory.cc
+++ b/media/base/android/media_drm_bridge_factory.cc
@@ -122,7 +122,7 @@
     return;
   }
 
-  media_drm_bridge_->SetMediaCryptoReadyCB(base::BindRepeating(
+  media_drm_bridge_->SetMediaCryptoReadyCB(base::BindOnce(
       &MediaDrmBridgeFactory::OnMediaCryptoReady, weak_factory_.GetWeakPtr()));
 }
 
diff --git a/media/base/android/mock_media_crypto_context.cc b/media/base/android/mock_media_crypto_context.cc
index cb0fbd42..c85f690c 100644
--- a/media/base/android/mock_media_crypto_context.cc
+++ b/media/base/android/mock_media_crypto_context.cc
@@ -15,6 +15,12 @@
 using ::testing::SaveArg;
 using ::testing::_;
 
+ACTION_TEMPLATE(MoveArg,
+                HAS_1_TEMPLATE_PARAMS(int, k),
+                AND_1_VALUE_PARAMS(out)) {
+  *out = std::move(::testing::get<k>(args));
+}
+
 namespace media {
 
 MockMediaCryptoContext::MockMediaCryptoContext(bool has_media_crypto_context)
@@ -26,8 +32,8 @@
   ON_CALL(*this, RegisterPlayer(_, _))
       .WillByDefault(DoAll(SaveArg<0>(&new_key_cb), SaveArg<1>(&cdm_unset_cb),
                            Return(kRegistrationId)));
-  ON_CALL(*this, SetMediaCryptoReadyCB(_))
-      .WillByDefault(SaveArg<0>(&media_crypto_ready_cb));
+  ON_CALL(*this, SetMediaCryptoReadyCB_(_))
+      .WillByDefault(MoveArg<0>(&media_crypto_ready_cb));
 
   // Don't set any expectation on the number of correct calls to
   // UnregisterPlayer, but expect no calls with the wrong registration id.
diff --git a/media/base/android/mock_media_crypto_context.h b/media/base/android/mock_media_crypto_context.h
index ceb4246..6630574 100644
--- a/media/base/android/mock_media_crypto_context.h
+++ b/media/base/android/mock_media_crypto_context.h
@@ -30,14 +30,20 @@
                int(const base::Closure& new_key_cb,
                    const base::Closure& cdm_unset_cb));
   MOCK_METHOD1(UnregisterPlayer, void(int registration_id));
-  MOCK_METHOD1(SetMediaCryptoReadyCB,
-               void(const MediaCryptoReadyCB& media_crypto_ready_cb));
+  void SetMediaCryptoReadyCB(
+      MediaCryptoReadyCB media_crypto_ready_cb) override {
+    SetMediaCryptoReadyCB_(media_crypto_ready_cb);
+  }
+  MOCK_METHOD1(SetMediaCryptoReadyCB_,
+               void(MediaCryptoReadyCB& media_crypto_ready_cb));
 
   static constexpr int kRegistrationId = 1000;
 
   base::Closure new_key_cb;
   base::Closure cdm_unset_cb;
   MediaCryptoReadyCB media_crypto_ready_cb;
+  // To be set to true when |media_crypto_ready_cb| is consumed and run.
+  bool ran_media_crypto_ready_cb = false;
 
  private:
   bool has_media_crypto_context_;
diff --git a/media/base/audio_decoder.h b/media/base/audio_decoder.h
index 5f9280d..4c0632df 100644
--- a/media/base/audio_decoder.h
+++ b/media/base/audio_decoder.h
@@ -26,7 +26,7 @@
 class MEDIA_EXPORT AudioDecoder {
  public:
   // Callback for VideoDecoder initialization.
-  using InitCB = base::Callback<void(bool success)>;
+  using InitCB = base::OnceCallback<void(bool success)>;
 
   // Callback for AudioDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
@@ -34,7 +34,7 @@
 
   // Callback for Decode(). Called after the decoder has accepted corresponding
   // DecoderBuffer, indicating that the pipeline can send next buffer to decode.
-  using DecodeCB = base::Callback<void(DecodeStatus)>;
+  using DecodeCB = base::RepeatingCallback<void(DecodeStatus)>;
 
   AudioDecoder();
 
@@ -69,7 +69,7 @@
   // Initialize().
   virtual void Initialize(const AudioDecoderConfig& config,
                           CdmContext* cdm_context,
-                          const InitCB& init_cb,
+                          InitCB init_cb,
                           const OutputCB& output_cb,
                           const WaitingCB& waiting_cb) = 0;
 
diff --git a/media/base/audio_renderer_mixer_input.cc b/media/base/audio_renderer_mixer_input.cc
index ee04a46..b8b0024 100644
--- a/media/base/audio_renderer_mixer_input.cc
+++ b/media/base/audio_renderer_mixer_input.cc
@@ -114,6 +114,10 @@
   playing_ = false;
 }
 
+// Flush is not supported with mixed sinks due to how delayed pausing works in
+// the mixer.
+void AudioRendererMixerInput::Flush() {}
+
 bool AudioRendererMixerInput::SetVolume(double volume) {
   base::AutoLock auto_lock(volume_lock_);
   volume_ = volume;
diff --git a/media/base/audio_renderer_mixer_input.h b/media/base/audio_renderer_mixer_input.h
index 0e47c24..5368185 100644
--- a/media/base/audio_renderer_mixer_input.h
+++ b/media/base/audio_renderer_mixer_input.h
@@ -45,6 +45,7 @@
   void Stop() override;
   void Play() override;
   void Pause() override;
+  void Flush() override;
   bool SetVolume(double volume) override;
   OutputDeviceInfo GetOutputDeviceInfo() override;
   void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override;
diff --git a/media/base/audio_renderer_sink.h b/media/base/audio_renderer_sink.h
index fefc018..e04bcd0 100644
--- a/media/base/audio_renderer_sink.h
+++ b/media/base/audio_renderer_sink.h
@@ -61,6 +61,10 @@
   // Resumes playback after calling Pause().
   virtual void Play() = 0;
 
+  // Flushes playback.
+  // This should only be called if the sink is not playing.
+  virtual void Flush() = 0;
+
   // Sets the playback volume, with range [0.0, 1.0] inclusive.
   // Returns |true| on success.
   virtual bool SetVolume(double volume) = 0;
diff --git a/media/base/callback_holder.h b/media/base/callback_holder.h
index b77f022..ee2da8c 100644
--- a/media/base/callback_holder.h
+++ b/media/base/callback_holder.h
@@ -22,10 +22,10 @@
   }
 
   // Sets the callback to be potentially held.
-  void SetCallback(const CB& cb) {
+  void SetCallback(CB cb) {
     DCHECK(original_cb_.is_null());
     DCHECK(held_cb_.is_null());
-    original_cb_ = cb;
+    original_cb_ = std::move(cb);
   }
 
   bool IsNull() const {
diff --git a/media/base/fake_audio_renderer_sink.cc b/media/base/fake_audio_renderer_sink.cc
index 924691ea..bf5ca25b 100644
--- a/media/base/fake_audio_renderer_sink.cc
+++ b/media/base/fake_audio_renderer_sink.cc
@@ -51,6 +51,10 @@
   ChangeState(kStopped);
 }
 
+void FakeAudioRendererSink::Flush() {
+  DCHECK_NE(state_, kPlaying);
+}
+
 void FakeAudioRendererSink::Pause() {
   DCHECK(state_ == kStarted || state_ == kPlaying) << "state_ " << state_;
   ChangeState(kPaused);
diff --git a/media/base/fake_audio_renderer_sink.h b/media/base/fake_audio_renderer_sink.h
index de599d2..9918eab 100644
--- a/media/base/fake_audio_renderer_sink.h
+++ b/media/base/fake_audio_renderer_sink.h
@@ -35,6 +35,7 @@
                   RenderCallback* callback) override;
   void Start() override;
   void Stop() override;
+  void Flush() override;
   void Pause() override;
   void Play() override;
   bool SetVolume(double volume) override;
diff --git a/media/base/fallback_video_decoder.cc b/media/base/fallback_video_decoder.cc
index 0d5826f..b36c6af8 100644
--- a/media/base/fallback_video_decoder.cc
+++ b/media/base/fallback_video_decoder.cc
@@ -23,19 +23,20 @@
 void FallbackVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                       bool low_delay,
                                       CdmContext* cdm_context,
-                                      const InitCB& init_cb,
+                                      InitCB init_cb,
                                       const OutputCB& output_cb,
                                       const WaitingCB& waiting_cb) {
   // If we've already fallen back, just reinitialize the selected decoder.
   if (selected_decoder_ && did_fallback_) {
-    selected_decoder_->Initialize(config, low_delay, cdm_context, init_cb,
-                                  output_cb, waiting_cb);
+    selected_decoder_->Initialize(config, low_delay, cdm_context,
+                                  std::move(init_cb), output_cb, waiting_cb);
     return;
   }
 
-  InitCB fallback_initialize_cb = base::BindRepeating(
-      &FallbackVideoDecoder::FallbackInitialize, weak_factory_.GetWeakPtr(),
-      config, low_delay, cdm_context, init_cb, output_cb, waiting_cb);
+  InitCB fallback_initialize_cb =
+      base::BindOnce(&FallbackVideoDecoder::FallbackInitialize,
+                     weak_factory_.GetWeakPtr(), config, low_delay, cdm_context,
+                     std::move(init_cb), output_cb, waiting_cb);
 
   preferred_decoder_->Initialize(config, low_delay, cdm_context,
                                  std::move(fallback_initialize_cb), output_cb,
@@ -45,14 +46,14 @@
 void FallbackVideoDecoder::FallbackInitialize(const VideoDecoderConfig& config,
                                               bool low_delay,
                                               CdmContext* cdm_context,
-                                              const InitCB& init_cb,
+                                              InitCB init_cb,
                                               const OutputCB& output_cb,
                                               const WaitingCB& waiting_cb,
                                               bool success) {
   // The preferred decoder was successfully initialized.
   if (success) {
     selected_decoder_ = preferred_decoder_.get();
-    init_cb.Run(true);
+    std::move(init_cb).Run(true);
     return;
   }
 
@@ -65,8 +66,8 @@
       base::BindOnce(base::DoNothing::Once<std::unique_ptr<VideoDecoder>>(),
                      std::move(preferred_decoder_)));
   selected_decoder_ = fallback_decoder_.get();
-  fallback_decoder_->Initialize(config, low_delay, cdm_context, init_cb,
-                                output_cb, waiting_cb);
+  fallback_decoder_->Initialize(config, low_delay, cdm_context,
+                                std::move(init_cb), output_cb, waiting_cb);
 }
 
 void FallbackVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/base/fallback_video_decoder.h b/media/base/fallback_video_decoder.h
index 69ee1f277..4c919d1c 100644
--- a/media/base/fallback_video_decoder.h
+++ b/media/base/fallback_video_decoder.h
@@ -24,7 +24,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -41,7 +41,7 @@
   void FallbackInitialize(const VideoDecoderConfig& config,
                           bool low_delay,
                           CdmContext* cdm_context,
-                          const InitCB& init_cb,
+                          InitCB init_cb,
                           const OutputCB& output_cb,
                           const WaitingCB& waiting_cb,
                           bool success);
diff --git a/media/base/fallback_video_decoder_unittest.cc b/media/base/fallback_video_decoder_unittest.cc
index d2896e7f..bd550c15 100644
--- a/media/base/fallback_video_decoder_unittest.cc
+++ b/media/base/fallback_video_decoder_unittest.cc
@@ -40,14 +40,14 @@
     StrictMock<MockVideoDecoder>* result = new StrictMock<MockVideoDecoder>(n);
 
     if (is_fallback && !preferred_should_succeed) {
-      EXPECT_CALL(*result, Initialize(_, _, _, _, _, _))
-          .WillOnce(RunCallback<3>(true));
+      EXPECT_CALL(*result, Initialize_(_, _, _, _, _, _))
+          .WillOnce(RunOnceCallback<3>(true));
     }
 
     if (!is_fallback) {
       preferred_decoder_ = result;
-      EXPECT_CALL(*result, Initialize(_, _, _, _, _, _))
-          .WillOnce(RunCallback<3>(preferred_should_succeed));
+      EXPECT_CALL(*result, Initialize_(_, _, _, _, _, _))
+          .WillOnce(RunOnceCallback<3>(preferred_should_succeed));
     } else {
       backup_decoder_ = result;
     }
@@ -123,11 +123,11 @@
 
   // If we succeedd the first time, it should still be alive.
   if (PreferredShouldSucceed()) {
-    EXPECT_CALL(*preferred_decoder_, Initialize(_, _, _, _, _, _))
-        .WillOnce(RunCallback<3>(false));  // fail initialization
+    EXPECT_CALL(*preferred_decoder_, Initialize_(_, _, _, _, _, _))
+        .WillOnce(RunOnceCallback<3>(false));  // fail initialization
   }
-  EXPECT_CALL(*backup_decoder_, Initialize(_, _, _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
+  EXPECT_CALL(*backup_decoder_, Initialize_(_, _, _, _, _, _))
+      .WillOnce(RunOnceCallback<3>(true));
 
   fallback_decoder_->Initialize(
       video_decoder_config_, false, nullptr,
@@ -146,17 +146,17 @@
 
   // If we succeedd the first time, it should still be alive.
   if (PreferredShouldSucceed()) {
-    EXPECT_CALL(*preferred_decoder_, Initialize(_, _, _, _, _, _))
-        .WillOnce(RunCallback<3>(true));  // pass initialization
+    EXPECT_CALL(*preferred_decoder_, Initialize_(_, _, _, _, _, _))
+        .WillOnce(RunOnceCallback<3>(true));  // pass initialization
   } else {
     // Otherwise, preferred was deleted, and we only backup still exists.
-    EXPECT_CALL(*backup_decoder_, Initialize(_, _, _, _, _, _))
-        .WillOnce(RunCallback<3>(true));
+    EXPECT_CALL(*backup_decoder_, Initialize_(_, _, _, _, _, _))
+        .WillOnce(RunOnceCallback<3>(true));
   }
 
   fallback_decoder_->Initialize(
       video_decoder_config_, false, nullptr,
-      base::BindRepeating([](bool success) { EXPECT_TRUE(success); }),
+      base::BindOnce([](bool success) { EXPECT_TRUE(success); }),
       base::DoNothing(), base::DoNothing());
 }
 
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 706ec87..ace0cc7 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -199,19 +199,10 @@
 #endif
 };
 
-// Only decode preload=metadata elements upon visibility. Experiment results
-// vary across platforms and are still being analyzed on macOS and CrOS.
-//
-// Android, Windows, and Linux all saw improvements without regressions, so
-// enable by default there.
-const base::Feature kPreloadMetadataLazyLoad {
-  "PreloadMetadataLazyLoad",
-#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
-      base::FEATURE_DISABLED_BY_DEFAULT
-#else
-      base::FEATURE_ENABLED_BY_DEFAULT
-#endif
-};
+// Only decode preload=metadata elements upon visibility.
+// TODO(crbug.com/879406): Remove this after M76 ships to stable.
+const base::Feature kPreloadMetadataLazyLoad{"PreloadMetadataLazyLoad",
+                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Let videos be resumed via remote controls (for example, the notification)
 // when in background.
diff --git a/media/base/mock_audio_renderer_sink.h b/media/base/mock_audio_renderer_sink.h
index 3c848812..06da164 100644
--- a/media/base/mock_audio_renderer_sink.h
+++ b/media/base/mock_audio_renderer_sink.h
@@ -26,6 +26,7 @@
 
   MOCK_METHOD0(Start, void());
   MOCK_METHOD0(Stop, void());
+  MOCK_METHOD0(Flush, void());
   MOCK_METHOD0(Pause, void());
   MOCK_METHOD0(Play, void());
   MOCK_METHOD1(SetVolume, bool(double volume));
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 84f3f43..8ec848c 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -209,11 +209,19 @@
 
   // VideoDecoder implementation.
   std::string GetDisplayName() const override;
-  MOCK_METHOD6(Initialize,
+  void Initialize(const VideoDecoderConfig& config,
+                  bool low_delay,
+                  CdmContext* cdm_context,
+                  InitCB init_cb,
+                  const OutputCB& output_cb,
+                  const WaitingCB& waiting_cb) override {
+    Initialize_(config, low_delay, cdm_context, init_cb, output_cb, waiting_cb);
+  }
+  MOCK_METHOD6(Initialize_,
                void(const VideoDecoderConfig& config,
                     bool low_delay,
                     CdmContext* cdm_context,
-                    const InitCB& init_cb,
+                    InitCB& init_cb,
                     const OutputCB& output_cb,
                     const WaitingCB& waiting_cb));
   MOCK_METHOD2(Decode,
@@ -236,10 +244,17 @@
 
   // AudioDecoder implementation.
   std::string GetDisplayName() const override;
-  MOCK_METHOD5(Initialize,
+  void Initialize(const AudioDecoderConfig& config,
+                  CdmContext* cdm_context,
+                  InitCB init_cb,
+                  const OutputCB& output_cb,
+                  const WaitingCB& waiting_cb) override {
+    Initialize_(config, cdm_context, init_cb, output_cb, waiting_cb);
+  }
+  MOCK_METHOD5(Initialize_,
                void(const AudioDecoderConfig& config,
                     CdmContext* cdm_context,
-                    const InitCB& init_cb,
+                    InitCB& init_cb,
                     const OutputCB& output_cb,
                     const WaitingCB& waiting_cb));
   MOCK_METHOD2(Decode,
diff --git a/media/base/video_decoder.h b/media/base/video_decoder.h
index cbc0ae8..0ac0accd 100644
--- a/media/base/video_decoder.h
+++ b/media/base/video_decoder.h
@@ -26,7 +26,7 @@
 class MEDIA_EXPORT VideoDecoder {
  public:
   // Callback for VideoDecoder initialization.
-  using InitCB = base::Callback<void(bool success)>;
+  using InitCB = base::OnceCallback<void(bool success)>;
 
   // Callback for VideoDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
@@ -84,7 +84,7 @@
   virtual void Initialize(const VideoDecoderConfig& config,
                           bool low_delay,
                           CdmContext* cdm_context,
-                          const InitCB& init_cb,
+                          InitCB init_cb,
                           const OutputCB& output_cb,
                           const WaitingCB& waiting_cb) = 0;
 
diff --git a/media/base/video_thumbnail_decoder_unittest.cc b/media/base/video_thumbnail_decoder_unittest.cc
index 4f7dee3..fcfe5ab 100644
--- a/media/base/video_thumbnail_decoder_unittest.cc
+++ b/media/base/video_thumbnail_decoder_unittest.cc
@@ -82,8 +82,9 @@
 // the video frame.
 TEST_F(VideoThumbnailDecoderTest, Success) {
   auto expected_frame = CreateFrame();
-  EXPECT_CALL(*mock_video_decoder(), Initialize(_, _, _, _, _, _))
-      .WillOnce(DoAll(RunCallback<3>(true), RunCallback<4>(expected_frame)));
+  EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
+      .WillOnce(
+          DoAll(RunOnceCallback<3>(true), RunCallback<4>(expected_frame)));
   EXPECT_CALL(*mock_video_decoder(), Decode(_, _))
       .Times(2)
       .WillRepeatedly(RunCallback<1>(DecodeStatus::OK));
@@ -95,8 +96,8 @@
 // No output video frame when decoder failed to initialize.
 TEST_F(VideoThumbnailDecoderTest, InitializationFailed) {
   auto expected_frame = CreateFrame();
-  EXPECT_CALL(*mock_video_decoder(), Initialize(_, _, _, _, _, _))
-      .WillOnce(RunCallback<3>(false));
+  EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
+      .WillOnce(RunOnceCallback<3>(false));
 
   Start();
   EXPECT_FALSE(frame());
@@ -105,8 +106,8 @@
 // No output video frame when decoder failed to decode.
 TEST_F(VideoThumbnailDecoderTest, DecodingFailed) {
   auto expected_frame = CreateFrame();
-  EXPECT_CALL(*mock_video_decoder(), Initialize(_, _, _, _, _, _))
-      .WillOnce(RunCallback<3>(true));
+  EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
+      .WillOnce(RunOnceCallback<3>(true));
   EXPECT_CALL(*mock_video_decoder(), Decode(_, _))
       .WillOnce(RunCallback<1>(DecodeStatus::DECODE_ERROR));
 
diff --git a/media/blink/webaudiosourceprovider_impl.cc b/media/blink/webaudiosourceprovider_impl.cc
index bc6d454..ec6596a2 100644
--- a/media/blink/webaudiosourceprovider_impl.cc
+++ b/media/blink/webaudiosourceprovider_impl.cc
@@ -236,6 +236,12 @@
     sink_->Pause();
 }
 
+void WebAudioSourceProviderImpl::Flush() {
+  base::AutoLock auto_lock(sink_lock_);
+  if (!client_ && sink_)
+    sink_->Flush();
+}
+
 bool WebAudioSourceProviderImpl::SetVolume(double volume) {
   base::AutoLock auto_lock(sink_lock_);
   volume_ = volume;
diff --git a/media/blink/webaudiosourceprovider_impl.h b/media/blink/webaudiosourceprovider_impl.h
index 15038b8..6a7f6b8 100644
--- a/media/blink/webaudiosourceprovider_impl.h
+++ b/media/blink/webaudiosourceprovider_impl.h
@@ -65,6 +65,7 @@
   void Stop() override;
   void Play() override;
   void Pause() override;
+  void Flush() override;
   bool SetVolume(double volume) override;
   OutputDeviceInfo GetOutputDeviceInfo() override;
   void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override;
diff --git a/media/filters/android/media_codec_audio_decoder.cc b/media/filters/android/media_codec_audio_decoder.cc
index b6e6635..14e7f65 100644
--- a/media/filters/android/media_codec_audio_decoder.cc
+++ b/media/filters/android/media_codec_audio_decoder.cc
@@ -63,7 +63,7 @@
 
 void MediaCodecAudioDecoder::Initialize(const AudioDecoderConfig& config,
                                         CdmContext* cdm_context,
-                                        const InitCB& init_cb,
+                                        InitCB init_cb,
                                         const OutputCB& output_cb,
                                         const WaitingCB& waiting_cb) {
   DVLOG(1) << __func__ << ": " << config.AsHumanReadableString();
@@ -76,7 +76,6 @@
   DCHECK(input_queue_.empty());
   ClearInputQueue(DecodeStatus::ABORTED);
 
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
   is_passthrough_ = MediaCodecUtil::IsPassthroughAudioFormat(config.codec());
   sample_format_ = kSampleFormatS16;
 
@@ -89,7 +88,7 @@
 
   if (state_ == STATE_ERROR) {
     DVLOG(1) << "Decoder is in error state.";
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
 
@@ -101,7 +100,7 @@
       config.codec() == kCodecOpus || is_passthrough_;
   if (!is_codec_supported) {
     DVLOG(1) << "Unsuported codec " << GetCodecName(config.codec());
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
 
@@ -120,24 +119,24 @@
       LOG(ERROR) << "The stream is encrypted but there is no CdmContext or "
                     "MediaCryptoContext is not supported";
       SetState(STATE_ERROR);
-      bound_init_cb.Run(false);
+      BindToCurrentLoop(std::move(init_cb)).Run(false);
       return;
     }
 
     // Postpone initialization after MediaCrypto is available.
     // SetCdm uses init_cb in a method that's already bound to the current loop.
     SetState(STATE_WAITING_FOR_MEDIA_CRYPTO);
-    SetCdm(init_cb);
+    SetCdm(std::move(init_cb));
     return;
   }
 
   if (!CreateMediaCodecLoop()) {
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
 
   SetState(STATE_READY);
-  bound_init_cb.Run(true);
+  BindToCurrentLoop(std::move(init_cb)).Run(true);
 }
 
 bool MediaCodecAudioDecoder::CreateMediaCodecLoop() {
@@ -230,7 +229,7 @@
   return config_.codec() == kCodecAAC;
 }
 
-void MediaCodecAudioDecoder::SetCdm(const InitCB& init_cb) {
+void MediaCodecAudioDecoder::SetCdm(InitCB init_cb) {
   DCHECK(media_crypto_context_);
 
   // Register CDM callbacks. The callbacks registered will be posted back to
@@ -247,8 +246,8 @@
       base::DoNothing());
 
   media_crypto_context_->SetMediaCryptoReadyCB(media::BindToCurrentLoop(
-      base::Bind(&MediaCodecAudioDecoder::OnMediaCryptoReady,
-                 weak_factory_.GetWeakPtr(), init_cb)));
+      base::BindOnce(&MediaCodecAudioDecoder::OnMediaCryptoReady,
+                     weak_factory_.GetWeakPtr(), std::move(init_cb))));
 }
 
 void MediaCodecAudioDecoder::OnKeyAdded() {
@@ -261,7 +260,7 @@
 }
 
 void MediaCodecAudioDecoder::OnMediaCryptoReady(
-    const InitCB& init_cb,
+    InitCB init_cb,
     JavaObjectPtr media_crypto,
     bool /*requires_secure_video_codec*/) {
   DVLOG(1) << __func__;
@@ -272,7 +271,7 @@
   if (media_crypto->is_null()) {
     LOG(ERROR) << "MediaCrypto is not available, can't play encrypted stream.";
     SetState(STATE_UNINITIALIZED);
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -285,12 +284,12 @@
   // After receiving |media_crypto_| we can configure MediaCodec.
   if (!CreateMediaCodecLoop()) {
     SetState(STATE_UNINITIALIZED);
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
   SetState(STATE_READY);
-  init_cb.Run(true);
+  std::move(init_cb).Run(true);
 }
 
 bool MediaCodecAudioDecoder::IsAnyInputPending() const {
diff --git a/media/filters/android/media_codec_audio_decoder.h b/media/filters/android/media_codec_audio_decoder.h
index 923b3f7..503ca7e 100644
--- a/media/filters/android/media_codec_audio_decoder.h
+++ b/media/filters/android/media_codec_audio_decoder.h
@@ -86,7 +86,7 @@
   std::string GetDisplayName() const override;
   void Initialize(const AudioDecoderConfig& config,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -126,10 +126,10 @@
 
   // A helper method to start CDM initialization.  This must be called if and
   // only if we were constructed with |is_encrypted| set to true.
-  void SetCdm(const InitCB& init_cb);
+  void SetCdm(InitCB init_cb);
 
   // This callback is called after CDM obtained a MediaCrypto object.
-  void OnMediaCryptoReady(const InitCB& init_cb,
+  void OnMediaCryptoReady(InitCB init_cb,
                           JavaObjectPtr media_crypto,
                           bool requires_secure_video_codec);
 
diff --git a/media/filters/aom_video_decoder.cc b/media/filters/aom_video_decoder.cc
index 14185a8..6a4f84b 100644
--- a/media/filters/aom_video_decoder.cc
+++ b/media/filters/aom_video_decoder.cc
@@ -139,15 +139,15 @@
 void AomVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                  bool /* low_delay */,
                                  CdmContext* /* cdm_context */,
-                                 const InitCB& init_cb,
+                                 InitCB init_cb,
                                  const OutputCB& output_cb,
                                  const WaitingCB& /* waiting_cb */) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(config.IsValidConfig());
 
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
+  InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
   if (config.is_encrypted() || config.codec() != kCodecAV1) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -172,7 +172,7 @@
                          0 /* flags */) != AOM_CODEC_OK) {
     MEDIA_LOG(ERROR, media_log_) << "aom_codec_dec_init() failed: "
                                  << aom_codec_error(aom_decoder_.get());
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -184,7 +184,7 @@
           memory_pool_.get()) != AOM_CODEC_OK) {
     DLOG(ERROR) << "Failed to configure external buffers. "
                 << aom_codec_error(context.get());
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -192,7 +192,7 @@
   state_ = DecoderState::kNormal;
   output_cb_ = BindToCurrentLoop(output_cb);
   aom_decoder_ = std::move(context);
-  bound_init_cb.Run(true);
+  std::move(bound_init_cb).Run(true);
 }
 
 void AomVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/aom_video_decoder.h b/media/filters/aom_video_decoder.h
index 52f0b36..faf9f7b 100644
--- a/media/filters/aom_video_decoder.h
+++ b/media/filters/aom_video_decoder.h
@@ -31,7 +31,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/audio_decoder_stream_unittest.cc b/media/filters/audio_decoder_stream_unittest.cc
index 146b7faf..303e24d 100644
--- a/media/filters/audio_decoder_stream_unittest.cc
+++ b/media/filters/audio_decoder_stream_unittest.cc
@@ -95,8 +95,9 @@
  private:
   std::vector<std::unique_ptr<AudioDecoder>> CreateMockAudioDecoder() {
     auto decoder = std::make_unique<MockAudioDecoder>();
-    EXPECT_CALL(*decoder, Initialize(_, _, _, _, _))
-        .WillOnce(DoAll(SaveArg<3>(&decoder_output_cb_), RunCallback<2>(true)));
+    EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
+        .WillOnce(
+            DoAll(SaveArg<3>(&decoder_output_cb_), RunOnceCallback<2>(true)));
     decoder_ = decoder.get();
 
     std::vector<std::unique_ptr<AudioDecoder>> result;
@@ -148,7 +149,7 @@
 
   // Expect the decoder to be re-initialized when AudioDecoderStream finishes
   // processing the last decode.
-  EXPECT_CALL(*decoder(), Initialize(_, _, _, _, _));
+  EXPECT_CALL(*decoder(), Initialize_(_, _, _, _, _));
   RunUntilIdle();
 }
 
diff --git a/media/filters/dav1d_video_decoder.cc b/media/filters/dav1d_video_decoder.cc
index c9fcb70d0..851c74a 100644
--- a/media/filters/dav1d_video_decoder.cc
+++ b/media/filters/dav1d_video_decoder.cc
@@ -147,15 +147,16 @@
 void Dav1dVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                    bool low_delay,
                                    CdmContext* /* cdm_context */,
-                                   const InitCB& init_cb,
+                                   InitCB init_cb,
                                    const OutputCB& output_cb,
                                    const WaitingCB& /* waiting_cb */) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(config.IsValidConfig());
 
-  InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(init_cb) : init_cb;
+  InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(std::move(init_cb))
+                                         : std::move(init_cb);
   if (config.is_encrypted() || config.codec() != kCodecAV1) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -213,14 +214,14 @@
   s.frame_size_limit = limits::kMaxCanvas;
 
   if (dav1d_open(&dav1d_decoder_, &s) < 0) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
   config_ = config;
   state_ = DecoderState::kNormal;
   output_cb_ = output_cb;
-  bound_init_cb.Run(true);
+  std::move(bound_init_cb).Run(true);
 }
 
 void Dav1dVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/dav1d_video_decoder.h b/media/filters/dav1d_video_decoder.h
index d400375..09f6cf6 100644
--- a/media/filters/dav1d_video_decoder.h
+++ b/media/filters/dav1d_video_decoder.h
@@ -33,7 +33,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc
index e24a0d22..bd613ac 100644
--- a/media/filters/decoder_selector_unittest.cc
+++ b/media/filters/decoder_selector_unittest.cc
@@ -89,13 +89,14 @@
   // Decoder::Initialize() takes different parameters depending on the type.
   static void ExpectInitialize(MockDecoder* decoder,
                                DecoderCapability capability) {
-    EXPECT_CALL(*decoder, Initialize(_, _, _, _, _))
-        .WillRepeatedly(
-            [capability](const AudioDecoderConfig& config, CdmContext*,
-                         const AudioDecoder::InitCB& init_cb,
-                         const AudioDecoder::OutputCB&, const WaitingCB&) {
-              init_cb.Run(IsConfigSupported(capability, config.is_encrypted()));
-            });
+    EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
+        .WillRepeatedly([capability](const AudioDecoderConfig& config,
+                                     CdmContext*, AudioDecoder::InitCB& init_cb,
+                                     const AudioDecoder::OutputCB&,
+                                     const WaitingCB&) {
+          std::move(init_cb).Run(
+              IsConfigSupported(capability, config.is_encrypted()));
+        });
   }
 };
 
@@ -125,12 +126,13 @@
 
   static void ExpectInitialize(MockDecoder* decoder,
                                DecoderCapability capability) {
-    EXPECT_CALL(*decoder, Initialize(_, _, _, _, _, _))
+    EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _, _))
         .WillRepeatedly(
             [capability](const VideoDecoderConfig& config, bool low_delay,
-                         CdmContext*, const VideoDecoder::InitCB& init_cb,
+                         CdmContext*, VideoDecoder::InitCB& init_cb,
                          const VideoDecoder::OutputCB&, const WaitingCB&) {
-              init_cb.Run(IsConfigSupported(capability, config.is_encrypted()));
+              std::move(init_cb).Run(
+                  IsConfigSupported(capability, config.is_encrypted()));
             });
   }
 };
diff --git a/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc
index 8af2287a..69886c7 100644
--- a/media/filters/decoder_stream_traits.cc
+++ b/media/filters/decoder_stream_traits.cc
@@ -61,7 +61,7 @@
     const DecoderConfigType& config,
     bool /* low_delay */,
     CdmContext* cdm_context,
-    const InitCB& init_cb,
+    InitCB init_cb,
     const OutputCB& output_cb,
     const WaitingCB& waiting_cb) {
   DCHECK(config.IsValidConfig());
@@ -71,7 +71,8 @@
   config_ = config;
 
   stats_.audio_decoder_name = decoder->GetDisplayName();
-  decoder->Initialize(config, cdm_context, init_cb, output_cb, waiting_cb);
+  decoder->Initialize(config, cdm_context, std::move(init_cb), output_cb,
+                      waiting_cb);
 }
 
 void DecoderStreamTraits<DemuxerStream::AUDIO>::OnStreamReset(
@@ -153,14 +154,14 @@
     const DecoderConfigType& config,
     bool low_delay,
     CdmContext* cdm_context,
-    const InitCB& init_cb,
+    InitCB init_cb,
     const OutputCB& output_cb,
     const WaitingCB& waiting_cb) {
   DCHECK(config.IsValidConfig());
   stats_.video_decoder_name = decoder->GetDisplayName();
   DVLOG(2) << stats_.video_decoder_name;
-  decoder->Initialize(config, low_delay, cdm_context, init_cb, output_cb,
-                      waiting_cb);
+  decoder->Initialize(config, low_delay, cdm_context, std::move(init_cb),
+                      output_cb, waiting_cb);
 }
 
 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset(
diff --git a/media/filters/decoder_stream_traits.h b/media/filters/decoder_stream_traits.h
index 5eb561b..4c54717 100644
--- a/media/filters/decoder_stream_traits.h
+++ b/media/filters/decoder_stream_traits.h
@@ -50,7 +50,7 @@
                          const DecoderConfigType& config,
                          bool low_delay,
                          CdmContext* cdm_context,
-                         const InitCB& init_cb,
+                         InitCB init_cb,
                          const OutputCB& output_cb,
                          const WaitingCB& waiting_cb);
   DecoderConfigType GetDecoderConfig(DemuxerStream* stream);
@@ -94,7 +94,7 @@
                          const DecoderConfigType& config,
                          bool low_delay,
                          CdmContext* cdm_context,
-                         const InitCB& init_cb,
+                         InitCB init_cb,
                          const OutputCB& output_cb,
                          const WaitingCB& waiting_cb);
   void OnDecode(const DecoderBuffer& buffer);
diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc
index ed41d53..111bb429 100644
--- a/media/filters/decrypting_audio_decoder.cc
+++ b/media/filters/decrypting_audio_decoder.cc
@@ -45,7 +45,7 @@
 
 void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config,
                                         CdmContext* cdm_context,
-                                        const InitCB& init_cb,
+                                        InitCB init_cb,
                                         const OutputCB& output_cb,
                                         const WaitingCB& waiting_cb) {
   DVLOG(2) << "Initialize()";
@@ -53,7 +53,7 @@
   DCHECK(!decode_cb_);
   DCHECK(!reset_cb_);
 
-  init_cb_ = BindToCurrentLoop(init_cb);
+  init_cb_ = BindToCurrentLoop(std::move(init_cb));
   if (!cdm_context) {
     // Once we have a CDM context, one should always be present.
     DCHECK(!support_clear_content_);
diff --git a/media/filters/decrypting_audio_decoder.h b/media/filters/decrypting_audio_decoder.h
index 95f8d23..c1b7bd5 100644
--- a/media/filters/decrypting_audio_decoder.h
+++ b/media/filters/decrypting_audio_decoder.h
@@ -43,7 +43,7 @@
   std::string GetDisplayName() const override;
   void Initialize(const AudioDecoderConfig& config,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc
index 8302d35..3309c8ec 100644
--- a/media/filters/decrypting_video_decoder.cc
+++ b/media/filters/decrypting_video_decoder.cc
@@ -33,7 +33,7 @@
 void DecryptingVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                         bool /* low_delay */,
                                         CdmContext* cdm_context,
-                                        const InitCB& init_cb,
+                                        InitCB init_cb,
                                         const OutputCB& output_cb,
                                         const WaitingCB& waiting_cb) {
   DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
@@ -46,7 +46,7 @@
   DCHECK(!reset_cb_);
   DCHECK(config.IsValidConfig());
 
-  init_cb_ = BindToCurrentLoop(init_cb);
+  init_cb_ = BindToCurrentLoop(std::move(init_cb));
   if (!cdm_context) {
     // Once we have a CDM context, one should always be present.
     DCHECK(!support_clear_content_);
diff --git a/media/filters/decrypting_video_decoder.h b/media/filters/decrypting_video_decoder.h
index 857ff947..d443e43 100644
--- a/media/filters/decrypting_video_decoder.h
+++ b/media/filters/decrypting_video_decoder.h
@@ -41,7 +41,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc
index 9081bb7..87bddbf4 100644
--- a/media/filters/fake_video_decoder.cc
+++ b/media/filters/fake_video_decoder.cc
@@ -59,7 +59,7 @@
 void FakeVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                   bool low_delay,
                                   CdmContext* cdm_context,
-                                  const InitCB& init_cb,
+                                  InitCB init_cb,
                                   const OutputCB& output_cb,
                                   const WaitingCB& waiting_cb) {
   DVLOG(1) << decoder_name_ << ": " << __func__;
@@ -70,7 +70,7 @@
   DCHECK(reset_cb_.IsNull()) << "No reinitialization during pending reset.";
 
   current_config_ = config;
-  init_cb_.SetCallback(BindToCurrentLoop(init_cb));
+  init_cb_.SetCallback(BindToCurrentLoop(std::move(init_cb)));
 
   // Don't need BindToCurrentLoop() because |output_cb_| is only called from
   // RunDecodeCallback() which is posted from Decode().
diff --git a/media/filters/fake_video_decoder.h b/media/filters/fake_video_decoder.h
index dbcec16..7d4d1ea7 100644
--- a/media/filters/fake_video_decoder.h
+++ b/media/filters/fake_video_decoder.h
@@ -46,7 +46,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index 8163ef8..5419dee 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -69,22 +69,22 @@
 
 void FFmpegAudioDecoder::Initialize(const AudioDecoderConfig& config,
                                     CdmContext* /* cdm_context */,
-                                    const InitCB& init_cb,
+                                    InitCB init_cb,
                                     const OutputCB& output_cb,
                                     const WaitingCB& /* waiting_cb */) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(config.IsValidConfig());
 
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
+  InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
 
   if (config.is_encrypted()) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
   if (!ConfigureDecoder(config)) {
     av_sample_format_ = 0;
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -92,7 +92,7 @@
   config_ = config;
   output_cb_ = BindToCurrentLoop(output_cb);
   state_ = kNormal;
-  bound_init_cb.Run(true);
+  std::move(bound_init_cb).Run(true);
 }
 
 void FFmpegAudioDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_audio_decoder.h b/media/filters/ffmpeg_audio_decoder.h
index 923e8cd..56e2e14 100644
--- a/media/filters/ffmpeg_audio_decoder.h
+++ b/media/filters/ffmpeg_audio_decoder.h
@@ -42,7 +42,7 @@
   std::string GetDisplayName() const override;
   void Initialize(const AudioDecoderConfig& config,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index 14ee372..20c0db7 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -208,7 +208,7 @@
 void FFmpegVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                     bool low_delay,
                                     CdmContext* /* cdm_context */,
-                                    const InitCB& init_cb,
+                                    InitCB init_cb,
                                     const OutputCB& output_cb,
                                     const WaitingCB& /* waiting_cb */) {
   DVLOG(1) << __func__ << ": " << config.AsHumanReadableString();
@@ -216,15 +216,15 @@
   DCHECK(config.IsValidConfig());
   DCHECK(output_cb);
 
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
+  InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
 
   if (config.is_encrypted()) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
   if (!ConfigureDecoder(config, low_delay)) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -232,7 +232,7 @@
   config_ = config;
   output_cb_ = output_cb;
   state_ = kNormal;
-  bound_init_cb.Run(true);
+  std::move(bound_init_cb).Run(true);
 }
 
 void FFmpegVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h
index c16141b2..fa89723 100644
--- a/media/filters/ffmpeg_video_decoder.h
+++ b/media/filters/ffmpeg_video_decoder.h
@@ -42,7 +42,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc
index 39c43d6..384bf91 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -282,7 +282,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -375,13 +375,13 @@
 void FuchsiaVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                      bool low_delay,
                                      CdmContext* cdm_context,
-                                     const InitCB& init_cb,
+                                     InitCB init_cb,
                                      const OutputCB& output_cb,
                                      const WaitingCB& waiting_cb) {
   output_cb_ = output_cb;
   container_pixel_aspect_ratio_ = config.GetPixelAspectRatio();
 
-  auto done_callback = BindToCurrentLoop(init_cb);
+  auto done_callback = BindToCurrentLoop(std::move(init_cb));
 
   fuchsia::mediacodec::CreateDecoder_Params codec_params;
   codec_params.mutable_input_details()->set_format_details_version_ordinal(0);
@@ -404,7 +404,7 @@
       break;
 
     default:
-      done_callback.Run(false);
+      std::move(done_callback).Run(false);
       return;
   }
 
@@ -440,7 +440,7 @@
 
   codec_->EnableOnStreamFailed();
 
-  done_callback.Run(true);
+  std::move(done_callback).Run(true);
 }
 
 void FuchsiaVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 1aa9042..1c8ec16f 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -136,7 +136,7 @@
 // UMA stat reported because the UMA_HISTOGRAM_ENUMERATION API requires a
 // callsite to always be called with the same stat name (can't parameterize it).
 static void ReportGpuVideoDecoderInitializeStatusToUMAAndRunCB(
-    const VideoDecoder::InitCB& cb,
+    VideoDecoder::InitCB cb,
     MediaLog* media_log,
     bool success) {
   // TODO(xhwang): Report |success| directly.
@@ -149,7 +149,7 @@
         "Media.OriginUrl.GpuVideoDecoderInitFailure");
   }
 
-  cb.Run(success);
+  std::move(cb).Run(success);
 }
 
 bool GpuVideoDecoder::IsPlatformDecoder() const {
@@ -163,7 +163,7 @@
 void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                  bool /* low_delay */,
                                  CdmContext* cdm_context,
-                                 const InitCB& init_cb,
+                                 InitCB init_cb,
                                  const OutputCB& output_cb,
                                  const WaitingCB& /* waiting_cb */) {
   DVLOG(3) << "Initialize()";
@@ -171,8 +171,8 @@
   DCHECK(config.IsValidConfig());
 
   InitCB bound_init_cb =
-      base::Bind(&ReportGpuVideoDecoderInitializeStatusToUMAAndRunCB,
-                 BindToCurrentLoop(init_cb), media_log_);
+      base::BindOnce(&ReportGpuVideoDecoderInitializeStatusToUMAAndRunCB,
+                     BindToCurrentLoop(std::move(init_cb)), media_log_);
 
   bool previously_initialized = config_.IsValidConfig();
   DVLOG(1) << (previously_initialized ? "Reinitializing" : "Initializing")
@@ -182,14 +182,14 @@
   if (encryption_mode != EncryptionScheme::CIPHER_MODE_UNENCRYPTED &&
       encryption_mode != EncryptionScheme::CIPHER_MODE_AES_CTR) {
     DVLOG(1) << "VDAs only support clear or cenc encrypted streams.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
   // Disallow codec changes between configuration changes.
   if (previously_initialized && config_.codec() != config.codec()) {
     DVLOG(1) << "Codec changed, cannot reinitialize.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -197,7 +197,7 @@
   // hardware decoder which supports alpha formats.
   if (config.format() == PIXEL_FORMAT_I420A) {
     DVLOG(1) << "Alpha transparency formats are not supported.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -209,7 +209,7 @@
       VideoDecodeAccelerator::Capabilities::SUPPORTS_ENCRYPTED_STREAMS;
   if (config.is_encrypted() && (!cdm_context || !supports_encrypted_streams)) {
     DVLOG(1) << "Encrypted stream not supported.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -219,7 +219,7 @@
              << ", unsupported coded size " << config.coded_size().ToString()
              << ", or accelerator should only be used for encrypted content. "
              << " is_encrypted: " << (config.is_encrypted() ? "yes." : "no.");
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -258,7 +258,7 @@
   if (config.is_encrypted() && !supports_deferred_initialization_) {
     DVLOG(1) << __func__
              << " Encrypted stream requires deferred initialialization.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -268,14 +268,14 @@
     // Reinitialization with a different config (but same codec and profile).
     // VDA should handle it by detecting this in-stream by itself,
     // no need to notify it.
-    bound_init_cb.Run(true);
+    std::move(bound_init_cb).Run(true);
     return;
   }
 
   vda_ = factories_->CreateVideoDecodeAccelerator();
   if (!vda_) {
     DVLOG(1) << "Failed to create a VDA.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -284,11 +284,11 @@
 
   if (config.is_encrypted() && cdm_id_ == CdmContext::kInvalidCdmId) {
     DVLOG(1) << "CDM ID not available.";
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
-  init_cb_ = bound_init_cb;
+  init_cb_ = std::move(bound_init_cb);
 
   const bool supports_external_output_surface = !!(
       capabilities.flags &
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h
index 468a695..bcbd6ca 100644
--- a/media/filters/gpu_video_decoder.h
+++ b/media/filters/gpu_video_decoder.h
@@ -61,7 +61,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/offloading_video_decoder.cc b/media/filters/offloading_video_decoder.cc
index c923c25a7..9f749ea 100644
--- a/media/filters/offloading_video_decoder.cc
+++ b/media/filters/offloading_video_decoder.cc
@@ -83,7 +83,7 @@
 void OffloadingVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                         bool low_delay,
                                         CdmContext* cdm_context,
-                                        const InitCB& init_cb,
+                                        InitCB init_cb,
                                         const OutputCB& output_cb,
                                         const WaitingCB& waiting_cb) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -109,7 +109,8 @@
           // possible for this class to be destroyed during Initialize().
           base::BindOnce(&OffloadingVideoDecoder::Initialize,
                          weak_factory_.GetWeakPtr(), config, low_delay,
-                         cdm_context, init_cb, output_cb, waiting_cb));
+                         cdm_context, std::move(init_cb), output_cb,
+                         waiting_cb));
       return;
     }
 
@@ -124,14 +125,15 @@
 
   // Offloaded decoders expect asynchronous execution of callbacks; even if we
   // aren't currently using the offload thread.
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
+  InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
   OutputCB bound_output_cb = BindToCurrentLoop(output_cb);
 
   // If we're not offloading just pass through to the wrapped decoder.
   if (disable_offloading) {
     offload_task_runner_ = nullptr;
     helper_->decoder()->Initialize(config, low_delay, cdm_context,
-                                   bound_init_cb, bound_output_cb, waiting_cb);
+                                   std::move(bound_init_cb), bound_output_cb,
+                                   waiting_cb);
     return;
   }
 
@@ -144,7 +146,8 @@
       FROM_HERE,
       base::BindOnce(&OffloadableVideoDecoder::Initialize,
                      base::Unretained(helper_->decoder()), config, low_delay,
-                     cdm_context, bound_init_cb, bound_output_cb, waiting_cb));
+                     cdm_context, std::move(bound_init_cb), bound_output_cb,
+                     waiting_cb));
 }
 
 void OffloadingVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/offloading_video_decoder.h b/media/filters/offloading_video_decoder.h
index 88ab010..12b4ef73 100644
--- a/media/filters/offloading_video_decoder.h
+++ b/media/filters/offloading_video_decoder.h
@@ -92,7 +92,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/offloading_video_decoder_unittest.cc b/media/filters/offloading_video_decoder_unittest.cc
index 81705f6a..f1e3471 100644
--- a/media/filters/offloading_video_decoder_unittest.cc
+++ b/media/filters/offloading_video_decoder_unittest.cc
@@ -36,11 +36,19 @@
   std::string GetDisplayName() const override {
     return "MockOffloadableVideoDecoder";
   }
-  MOCK_METHOD6(Initialize,
+  void Initialize(const VideoDecoderConfig& config,
+                  bool low_delay,
+                  CdmContext* cdm_context,
+                  InitCB init_cb,
+                  const OutputCB& output_cb,
+                  const WaitingCB& waiting_cb) override {
+    Initialize_(config, low_delay, cdm_context, init_cb, output_cb, waiting_cb);
+  }
+  MOCK_METHOD6(Initialize_,
                void(const VideoDecoderConfig& config,
                     bool low_delay,
                     CdmContext* cdm_context,
-                    const InitCB& init_cb,
+                    InitCB& init_cb,
                     const OutputCB& output_cb,
                     const WaitingCB& waiting_cb));
   MOCK_METHOD2(Decode,
@@ -102,9 +110,9 @@
     // Verify methods are called on the current thread since the offload codec
     // requirement is not satisfied.
     VideoDecoder::OutputCB output_cb;
-    EXPECT_CALL(*decoder_, Initialize(_, false, nullptr, _, _, _))
+    EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
         .WillOnce(DoAll(VerifyOn(task_env_.GetMainThreadTaskRunner()),
-                        RunCallback<3>(true), SaveArg<4>(&output_cb)));
+                        RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
     offloading_decoder_->Initialize(config, false, nullptr, ExpectInitCB(true),
                                     ExpectOutputCB(), base::NullCallback());
     task_env_.RunUntilIdle();
@@ -143,9 +151,9 @@
     }
     offloading_decoder_->Initialize(config, false, nullptr, ExpectInitCB(true),
                                     ExpectOutputCB(), base::NullCallback());
-    EXPECT_CALL(*decoder_, Initialize(_, false, nullptr, _, _, _))
+    EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
         .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                        RunCallback<3>(true), SaveArg<4>(&output_cb)));
+                        RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
     task_env_.RunUntilIdle();
 
     // When offloading decodes should be parallelized.
@@ -227,9 +235,9 @@
       base::NullCallback());
   EXPECT_CALL(*decoder_, Detach())
       .WillOnce(VerifyNotOn(task_env_.GetMainThreadTaskRunner()));
-  EXPECT_CALL(*decoder_, Initialize(_, false, nullptr, _, _, _))
+  EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyOn(task_env_.GetMainThreadTaskRunner()),
-                      RunCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 }
 
@@ -254,9 +262,9 @@
       base::BindRepeating(&OffloadingVideoDecoderTest::OutputDone,
                           base::Unretained(this)),
       base::NullCallback());
-  EXPECT_CALL(*decoder_, Initialize(_, false, nullptr, _, _, _))
+  EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                      RunCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 
   // When offloading decodes should be parallelized.
@@ -301,9 +309,9 @@
       base::BindRepeating(&OffloadingVideoDecoderTest::OutputDone,
                           base::Unretained(this)),
       base::NullCallback());
-  EXPECT_CALL(*decoder_, Initialize(_, false, nullptr, _, _, _))
+  EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                      RunCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 
   // When offloading decodes should be parallelized.
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
index a851960d..f3048e2 100644
--- a/media/filters/vpx_video_decoder.cc
+++ b/media/filters/vpx_video_decoder.cc
@@ -113,7 +113,7 @@
 void VpxVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                  bool /* low_delay */,
                                  CdmContext* /* cdm_context */,
-                                 const InitCB& init_cb,
+                                 InitCB init_cb,
                                  const OutputCB& output_cb,
                                  const WaitingCB& /* waiting_cb */) {
   DVLOG(1) << __func__ << ": " << config.AsHumanReadableString();
@@ -122,9 +122,10 @@
 
   CloseDecoder();
 
-  InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(init_cb) : init_cb;
+  InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(std::move(init_cb))
+                                         : std::move(init_cb);
   if (config.is_encrypted() || !ConfigureDecoder(config)) {
-    bound_init_cb.Run(false);
+    std::move(bound_init_cb).Run(false);
     return;
   }
 
@@ -132,7 +133,7 @@
   config_ = config;
   state_ = kNormal;
   output_cb_ = output_cb;
-  bound_init_cb.Run(true);
+  std::move(bound_init_cb).Run(true);
 }
 
 void VpxVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/vpx_video_decoder.h b/media/filters/vpx_video_decoder.h
index 7c33f5e..42409df 100644
--- a/media/filters/vpx_video_decoder.h
+++ b/media/filters/vpx_video_decoder.h
@@ -37,7 +37,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc
index d1998c3..a265bc6 100644
--- a/media/gpu/android/media_codec_video_decoder.cc
+++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -254,7 +254,7 @@
 void MediaCodecVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                         bool low_delay,
                                         CdmContext* cdm_context,
-                                        const InitCB& init_cb,
+                                        InitCB init_cb,
                                         const OutputCB& output_cb,
                                         const WaitingCB& waiting_cb) {
   DCHECK(output_cb);
@@ -265,16 +265,15 @@
            << " MCVD with config: " << config.AsHumanReadableString()
            << ", cdm_context = " << cdm_context;
 
-  InitCB bound_init_cb = BindToCurrentLoop(init_cb);
   if (!ConfigSupported(config, device_info_)) {
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
 
   // Disallow codec changes when reinitializing.
   if (!first_init && decoder_config_.codec() != config.codec()) {
     DVLOG(1) << "Codec changed: cannot reinitialize";
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
   decoder_config_ = config;
@@ -295,22 +294,21 @@
   // encrypted config later.
   if (first_init && cdm_context && cdm_context->GetMediaCryptoContext()) {
     DCHECK(media_crypto_.is_null());
-    SetCdm(cdm_context, init_cb);
+    SetCdm(cdm_context, std::move(init_cb));
     return;
   }
 
   if (config.is_encrypted() && media_crypto_.is_null()) {
     DVLOG(1) << "No MediaCrypto to handle encrypted config";
-    bound_init_cb.Run(false);
+    BindToCurrentLoop(std::move(init_cb)).Run(false);
     return;
   }
 
   // Do the rest of the initialization lazily on the first decode.
-  init_cb.Run(true);
+  BindToCurrentLoop(std::move(init_cb)).Run(true);
 }
 
-void MediaCodecVideoDecoder::SetCdm(CdmContext* cdm_context,
-                                    const InitCB& init_cb) {
+void MediaCodecVideoDecoder::SetCdm(CdmContext* cdm_context, InitCB init_cb) {
   DVLOG(1) << __func__;
   DCHECK(cdm_context) << "No CDM provided";
   DCHECK(cdm_context->GetMediaCryptoContext());
@@ -320,12 +318,12 @@
   // Register CDM callbacks. The callbacks registered will be posted back to
   // this thread via BindToCurrentLoop.
   media_crypto_context_->SetMediaCryptoReadyCB(media::BindToCurrentLoop(
-      base::Bind(&MediaCodecVideoDecoder::OnMediaCryptoReady,
-                 weak_factory_.GetWeakPtr(), init_cb)));
+      base::BindOnce(&MediaCodecVideoDecoder::OnMediaCryptoReady,
+                     weak_factory_.GetWeakPtr(), std::move(init_cb))));
 }
 
 void MediaCodecVideoDecoder::OnMediaCryptoReady(
-    const InitCB& init_cb,
+    InitCB init_cb,
     JavaObjectPtr media_crypto,
     bool requires_secure_video_codec) {
   DVLOG(1) << __func__
@@ -335,21 +333,20 @@
   DCHECK(media_crypto);
 
   if (media_crypto->is_null()) {
-    media_crypto_context_->SetMediaCryptoReadyCB(
-        MediaCryptoContext::MediaCryptoReadyCB());
+    media_crypto_context_->SetMediaCryptoReadyCB(base::NullCallback());
     media_crypto_context_ = nullptr;
 
     if (decoder_config_.is_encrypted()) {
       LOG(ERROR) << "MediaCrypto is not available";
       EnterTerminalState(State::kError);
-      init_cb.Run(false);
+      std::move(init_cb).Run(false);
       return;
     }
 
     // MediaCrypto is not available, but the stream is clear. So we can still
     // play the current stream. But if we switch to an encrypted stream playback
     // will fail.
-    init_cb.Run(true);
+    std::move(init_cb).Run(true);
     return;
   }
 
@@ -374,7 +371,7 @@
           : SurfaceChooserHelper::SecureSurfaceMode::kRequested);
 
   // Signal success, and create the codec lazily on the first decode.
-  init_cb.Run(true);
+  std::move(init_cb).Run(true);
 }
 
 void MediaCodecVideoDecoder::OnKeyAdded() {
diff --git a/media/gpu/android/media_codec_video_decoder.h b/media/gpu/android/media_codec_video_decoder.h
index 5a34dac4..17f06cd 100644
--- a/media/gpu/android/media_codec_video_decoder.h
+++ b/media/gpu/android/media_codec_video_decoder.h
@@ -75,7 +75,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -92,11 +92,11 @@
   // Set up |cdm_context| as part of initialization.  Guarantees that |init_cb|
   // will be called depending on the outcome, though not necessarily before this
   // function returns.
-  void SetCdm(CdmContext* cdm_context, const InitCB& init_cb);
+  void SetCdm(CdmContext* cdm_context, InitCB init_cb);
 
   // Called when the Cdm provides |media_crypto|.  Will signal |init_cb| based
   // on the result, and set the codec config properly.
-  void OnMediaCryptoReady(const InitCB& init_cb,
+  void OnMediaCryptoReady(InitCB init_cb,
                           JavaObjectPtr media_crypto,
                           bool requires_secure_video_codec);
 
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc
index d6e3a32..145dd8b 100644
--- a/media/gpu/android/media_codec_video_decoder_unittest.cc
+++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -184,19 +184,21 @@
       CreateMcvd();
     bool result = false;
     auto init_cb = [](bool* result_out, bool result) { *result_out = result; };
-    mcvd_->Initialize(config, false, cdm_.get(), base::Bind(init_cb, &result),
-                      base::BindRepeating(&OutputCb, &most_recent_frame_),
-                      base::DoNothing());
+    mcvd_->Initialize(
+        config, false, cdm_.get(), base::BindOnce(init_cb, &result),
+        base::BindRepeating(&OutputCb, &most_recent_frame_), base::DoNothing());
     base::RunLoop().RunUntilIdle();
 
     // If there is a CDM available, then we expect that MCVD will be waiting
     // for the media crypto object.
     // TODO(liberato): why does CreateJavaObjectPtr() not link?
     if (cdm_ && cdm_->media_crypto_ready_cb) {
-      cdm_->media_crypto_ready_cb.Run(
-          std::make_unique<base::android::ScopedJavaGlobalRef<jobject>>(
-              media_crypto_),
-          require_secure_video_decoder_);
+      std::move(cdm_->media_crypto_ready_cb)
+          .Run(std::make_unique<base::android::ScopedJavaGlobalRef<jobject>>(
+                   media_crypto_),
+               require_secure_video_decoder_);
+      // The callback is consumed, mark that we ran it so tests can verify.
+      cdm_->ran_media_crypto_ready_cb = true;
       base::RunLoop().RunUntilIdle();
     }
 
@@ -838,7 +840,7 @@
       TestVideoConfig::NormalEncrypted(codec_));
   ASSERT_TRUE(!!cdm_->new_key_cb);
   ASSERT_TRUE(!!cdm_->cdm_unset_cb);
-  ASSERT_TRUE(!!cdm_->media_crypto_ready_cb);
+  ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb);
   ASSERT_EQ(surface_chooser_->current_state_.is_secure, true);
   ASSERT_EQ(surface_chooser_->current_state_.is_required, false);
   ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec);
@@ -857,7 +859,7 @@
       TestVideoConfig::NormalEncrypted(codec_));
   ASSERT_TRUE(!!cdm_->new_key_cb);
   ASSERT_TRUE(!!cdm_->cdm_unset_cb);
-  ASSERT_TRUE(!!cdm_->media_crypto_ready_cb);
+  ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb);
   ASSERT_EQ(surface_chooser_->current_state_.is_secure, true);
   ASSERT_EQ(surface_chooser_->current_state_.is_required, true);
   ASSERT_TRUE(codec_allocator_->most_recent_config->requires_secure_codec);
@@ -876,7 +878,7 @@
   InitializeWithOverlay_OneDecodePending(TestVideoConfig::Large(codec_));
   ASSERT_TRUE(!!cdm_->new_key_cb);
   ASSERT_TRUE(!!cdm_->cdm_unset_cb);
-  ASSERT_TRUE(!!cdm_->media_crypto_ready_cb);
+  ASSERT_TRUE(!!cdm_->ran_media_crypto_ready_cb);
   ASSERT_EQ(surface_chooser_->current_state_.is_secure, true);
   ASSERT_EQ(surface_chooser_->current_state_.is_required, false);
   ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec);
@@ -895,6 +897,7 @@
   ASSERT_FALSE(!!cdm_->new_key_cb);
   ASSERT_FALSE(!!cdm_->cdm_unset_cb);
   ASSERT_FALSE(!!cdm_->media_crypto_ready_cb);
+  ASSERT_FALSE(!!cdm_->ran_media_crypto_ready_cb);
   ASSERT_EQ(surface_chooser_->current_state_.is_secure, false);
   ASSERT_EQ(surface_chooser_->current_state_.is_required, false);
   ASSERT_FALSE(codec_allocator_->most_recent_config->requires_secure_codec);
diff --git a/media/gpu/ipc/service/vda_video_decoder.cc b/media/gpu/ipc/service/vda_video_decoder.cc
index bec30f1..9e5adc7 100644
--- a/media/gpu/ipc/service/vda_video_decoder.cc
+++ b/media/gpu/ipc/service/vda_video_decoder.cc
@@ -212,7 +212,7 @@
 void VdaVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                  bool low_delay,
                                  CdmContext* cdm_context,
-                                 const InitCB& init_cb,
+                                 InitCB init_cb,
                                  const OutputCB& output_cb,
                                  const WaitingCB& waiting_cb) {
   DVLOG(1) << __func__ << "(" << config.AsHumanReadableString() << ")";
@@ -224,7 +224,8 @@
   DCHECK(decode_cbs_.empty());
 
   if (has_error_) {
-    parent_task_runner_->PostTask(FROM_HERE, base::BindOnce(init_cb, false));
+    parent_task_runner_->PostTask(FROM_HERE,
+                                  base::BindOnce(std::move(init_cb), false));
     return;
   }
 
@@ -232,7 +233,7 @@
 
   // Store |init_cb| ASAP so that EnterErrorState() can use it. Leave |config_|
   // alone for now so that the checks can inspect it.
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   output_cb_ = output_cb;
 
   // Verify that the configuration is supported.
diff --git a/media/gpu/ipc/service/vda_video_decoder.h b/media/gpu/ipc/service/vda_video_decoder.h
index 39c6478..ba6cfe43 100644
--- a/media/gpu/ipc/service/vda_video_decoder.h
+++ b/media/gpu/ipc/service/vda_video_decoder.h
@@ -101,7 +101,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/test/video_frame_helpers.h b/media/gpu/test/video_frame_helpers.h
index 5542386..525c963f 100644
--- a/media/gpu/test/video_frame_helpers.h
+++ b/media/gpu/test/video_frame_helpers.h
@@ -27,7 +27,8 @@
   // calculate the frame's checksum, write the frame to file,... The
   // |frame_index| is the index of the video frame in display order. The caller
   // should not modify the video frame while a reference is being held by the
-  // VideoFrameProcessor.
+  // VideoFrameProcessor. This function should always be called on the same
+  // thread.
   virtual void ProcessVideoFrame(scoped_refptr<const VideoFrame> video_frame,
                                  size_t frame_index) = 0;
 
diff --git a/media/gpu/test/video_player/frame_renderer.h b/media/gpu/test/video_player/frame_renderer.h
index 91f9b08..086b783 100644
--- a/media/gpu/test/video_player/frame_renderer.h
+++ b/media/gpu/test/video_player/frame_renderer.h
@@ -47,6 +47,9 @@
   // state can be reset. This is e.g. important when calculating the frame
   // drop rate.
   virtual void RenderFrame(scoped_refptr<VideoFrame> video_frame) = 0;
+  // Wait until all currently queued frames are rendered. This function might
+  // take some time to complete, depending on the number of frames queued.
+  virtual void WaitUntilRenderingDone() = 0;
 
   // Create a texture-backed video frame with specified |pixel_format|, |size|
   // and |texture_target|. The texture's id will be put in |texture_id|.
diff --git a/media/gpu/test/video_player/frame_renderer_dummy.cc b/media/gpu/test/video_player/frame_renderer_dummy.cc
index 13d14eb6..aecafcaf 100644
--- a/media/gpu/test/video_player/frame_renderer_dummy.cc
+++ b/media/gpu/test/video_player/frame_renderer_dummy.cc
@@ -4,25 +4,39 @@
 
 #include "media/gpu/test/video_player/frame_renderer_dummy.h"
 
+#include <algorithm>
 #include <utility>
 #include <vector>
 
 #include "base/memory/ptr_util.h"
-
-#define VLOGF(level) VLOG(level) << __func__ << "(): "
+#include "media/gpu/macros.h"
 
 namespace media {
 namespace test {
 
-FrameRendererDummy::FrameRendererDummy() {
-  DETACH_FROM_SEQUENCE(sequence_checker_);
+FrameRendererDummy::FrameRendererDummy(base::TimeDelta frame_duration,
+                                       base::TimeDelta vsync_interval_duration)
+    : frame_duration_(frame_duration),
+      vsync_interval_duration_(vsync_interval_duration),
+      frames_to_drop_decoding_slow_(0),
+      frames_to_drop_rendering_slow_(0),
+      frames_dropped_(0),
+      renderer_thread_("FrameRendererThread"),
+      renderer_cv_(&renderer_lock_) {
+  DETACH_FROM_SEQUENCE(client_sequence_checker_);
+  DETACH_FROM_SEQUENCE(renderer_sequence_checker_);
 }
 
-FrameRendererDummy::~FrameRendererDummy() {}
+FrameRendererDummy::~FrameRendererDummy() {
+  Destroy();
+}
 
 // static
-std::unique_ptr<FrameRendererDummy> FrameRendererDummy::Create() {
-  auto frame_renderer = base::WrapUnique(new FrameRendererDummy());
+std::unique_ptr<FrameRendererDummy> FrameRendererDummy::Create(
+    base::TimeDelta frame_duration,
+    base::TimeDelta vsync_interval_duration) {
+  auto frame_renderer = base::WrapUnique(
+      new FrameRendererDummy(frame_duration, vsync_interval_duration));
   if (!frame_renderer->Initialize()) {
     return nullptr;
   }
@@ -30,9 +44,33 @@
 }
 
 bool FrameRendererDummy::Initialize() {
+  if (!renderer_thread_.Start()) {
+    LOG(ERROR) << "Failed to start frame renderer thread";
+    return false;
+  }
+
+  base::WaitableEvent done;
+  renderer_thread_.task_runner()->PostTask(
+      FROM_HERE, base::BindOnce(&FrameRendererDummy::InitializeTask,
+                                base::Unretained(this), &done));
+  done.Wait();
+
   return true;
 }
 
+void FrameRendererDummy::Destroy() {
+  base::WaitableEvent done;
+  renderer_thread_.task_runner()->PostTask(
+      FROM_HERE, base::BindOnce(&FrameRendererDummy::DestroyTask,
+                                base::Unretained(this), &done));
+  done.Wait();
+
+  renderer_thread_.Stop();
+
+  base::AutoLock auto_lock(renderer_lock_);
+  DCHECK(pending_frames_.empty());
+}
+
 void FrameRendererDummy::AcquireGLContext() {
   // As no actual rendering is done we don't have a GLContext to acquire.
 }
@@ -46,7 +84,46 @@
   return nullptr;
 }
 
-void FrameRendererDummy::RenderFrame(scoped_refptr<VideoFrame> video_frame) {}
+void FrameRendererDummy::RenderFrame(scoped_refptr<VideoFrame> video_frame) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_);
+
+  // If the frame duration is 0 we are decoding as fast as possible, immediately
+  // return the frame to the decoder for reuse.
+  if (frame_duration_.is_zero())
+    return;
+
+  // If rendering or decoding is running behind, drop the frame so the buffer is
+  // immediately released for reuse. Only frames dropped due to slow decoding
+  // will be counted as dropped frames.
+  base::AutoLock auto_lock(renderer_lock_);
+  if (!video_frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) {
+    if (frames_to_drop_rendering_slow_ > 0) {
+      frames_to_drop_rendering_slow_--;
+      return;
+    } else if (frames_to_drop_decoding_slow_ > 0) {
+      DVLOGF(4) << "Dropping frame: decoder too slow";
+      frames_to_drop_decoding_slow_--;
+      frames_dropped_++;
+      return;
+    }
+  }
+
+  pending_frames_.push(std::move(video_frame));
+
+  // If this is the first frame decoded, render it immediately.
+  if (next_frame_time_.is_null()) {
+    next_frame_time_ = base::TimeTicks::Now();
+    renderer_thread_.task_runner()->PostTask(FROM_HERE,
+                                             render_task_.callback());
+  }
+}
+
+void FrameRendererDummy::WaitUntilRenderingDone() {
+  base::AutoLock auto_lock(renderer_lock_);
+  while (!pending_frames_.empty()) {
+    renderer_cv_.Wait();
+  }
+}
 
 scoped_refptr<VideoFrame> FrameRendererDummy::CreateVideoFrame(
     VideoPixelFormat pixel_format,
@@ -56,5 +133,104 @@
   return nullptr;
 }
 
+uint64_t FrameRendererDummy::FramesDropped() const {
+  base::AutoLock auto_lock(renderer_lock_);
+  return frames_dropped_;
+}
+
+void FrameRendererDummy::InitializeTask(base::WaitableEvent* done) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_);
+
+  render_task_.Reset(base::BindRepeating(&FrameRendererDummy::RenderFrameTask,
+                                         base::Unretained(this)));
+  done->Signal();
+}
+
+void FrameRendererDummy::DestroyTask(base::WaitableEvent* done) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_);
+
+  render_task_.Cancel();
+  done->Signal();
+}
+
+void FrameRendererDummy::RenderFrameTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_);
+
+  // Display the next frame. If no new frames are available yet, decoding is
+  // running behind. Keep displaying the current frame and immediately drop the
+  // next frame that arrives.
+  base::AutoLock auto_lock(renderer_lock_);
+  if (pending_frames_.size() > 0) {
+    active_frame_ = std::move(pending_frames_.front());
+    pending_frames_.pop();
+  } else {
+    frames_to_drop_decoding_slow_++;
+  }
+
+  if (!active_frame_->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) {
+    ScheduleNextRenderFrameTask();
+  } else {
+    next_frame_time_ = base::TimeTicks();
+    // Frames-to-drop might be higher than 0 if decoding is running behind.
+    // We don't know the number of frames in the stream until we see an EOS
+    // frame, so the renderer keeps trying to render frames if the EOS frame is
+    // late. This means we might schedule more frames to be dropped than the
+    // video actually has.
+    frames_to_drop_decoding_slow_ = 0;
+    frames_to_drop_rendering_slow_ = 0;
+  }
+
+  renderer_cv_.Signal();
+}
+
+void FrameRendererDummy::ScheduleNextRenderFrameTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_);
+
+  base::TimeTicks now = base::TimeTicks::Now();
+
+  // If this is the first frame, set the base time to be used for vsync. All
+  // frames will be rendered at |vsync_timebase_| + (x * |vsync_interval_|)
+  if (vsync_timebase_.is_null())
+    vsync_timebase_ = now;
+
+  next_frame_time_ += frame_duration_;
+  base::TimeTicks next_render_time;
+
+  if (vsync_interval_duration_.is_zero()) {
+    // No Vsync is present. Render the next frame at the expected frame time.
+    next_render_time = std::max(now, next_frame_time_);
+  } else {
+    // - Video frame rate < Vsync rate: Render the next frame at the latest
+    //   Vsync before the |next_frame_render_time_|.
+    // - Video frame rate > Vsync rate: Render the first frame after the next
+    //   Vsync. This might result in one or more frames getting dropped.
+    next_render_time =
+        std::max(now + vsync_interval_duration_, next_frame_time_);
+    int64_t num_intervals_timebase =
+        (next_render_time - vsync_timebase_) / vsync_interval_duration_;
+    next_render_time =
+        vsync_timebase_ + (num_intervals_timebase * vsync_interval_duration_);
+  }
+
+  // The time at which the next frame will be rendered might be later then the
+  // time at which the next frame appears in the stream. This means we are
+  // displaying less frames than are being decoded and we should drop frames.
+  // e.g. Vsync at 30fps, video frame rate 60fps. We shouldn't increase
+  // |dropped_frames_| in this case, as the decoder is not falling behind.
+  while (next_frame_time_ < next_render_time) {
+    next_frame_time_ += frame_duration_;
+    if (pending_frames_.size() > 0) {
+      pending_frames_.pop();
+    } else {
+      // The next video frame has not been decoded yet. Drop it immediately
+      // when RenderFrame() is called.
+      frames_to_drop_rendering_slow_++;
+    }
+  }
+
+  renderer_thread_.task_runner()->PostDelayedTask(
+      FROM_HERE, render_task_.callback(), (next_render_time - now));
+}
+
 }  // namespace test
 }  // namespace media
diff --git a/media/gpu/test/video_player/frame_renderer_dummy.h b/media/gpu/test/video_player/frame_renderer_dummy.h
index 10943a44..ef1f4f6 100644
--- a/media/gpu/test/video_player/frame_renderer_dummy.h
+++ b/media/gpu/test/video_player/frame_renderer_dummy.h
@@ -7,40 +7,95 @@
 
 #include <memory>
 
+#include "base/cancelable_callback.h"
+#include "base/containers/queue.h"
 #include "base/macros.h"
 #include "base/sequence_checker.h"
+#include "base/synchronization/condition_variable.h"
+#include "base/synchronization/lock.h"
+#include "base/threading/thread.h"
+#include "base/time/time.h"
 #include "media/gpu/test/video_player/frame_renderer.h"
 
 namespace media {
 namespace test {
 
 // The dummy frame renderer can be used when we're not interested in rendering
-// the decoded frames to screen or file. No rate-limiting is done, and frames
-// are consumed as fast as they are provided.
+// the decoded frames to screen or file. The renderer can either consume frames
+// immediately, or introduce a delay to simulate actual rendering.
 class FrameRendererDummy : public FrameRenderer {
  public:
   ~FrameRendererDummy() override;
 
-  // Create an instance of the dummy frame renderer.
-  static std::unique_ptr<FrameRendererDummy> Create();
+  // Create an instance of the dummy frame renderer. |frame_duration| specifies
+  // how long we will simulate displaying each frame, typically the inverse of
+  // the stream's frame rate. If 0 no rendering will be simulated and frames
+  // will be returned to the decoder immediately. |vsync_interval_duration|
+  // specifies the desired VSync interval. If 0 VSync will be disabled.
+  static std::unique_ptr<FrameRendererDummy> Create(
+      base::TimeDelta frame_duration = base::TimeDelta(),
+      base::TimeDelta vsync_interval_duration = base::TimeDelta());
 
   // FrameRenderer implementation
   void AcquireGLContext() override;
   void ReleaseGLContext() override;
   gl::GLContext* GetGLContext() override;
   void RenderFrame(scoped_refptr<VideoFrame> video_frame) override;
+  void WaitUntilRenderingDone() override;
   scoped_refptr<VideoFrame> CreateVideoFrame(VideoPixelFormat pixel_format,
                                              const gfx::Size& size,
                                              uint32_t texture_target,
                                              uint32_t* texture_id) override;
 
+  // Get the number of frames dropped due to the decoder running behind.
+  uint64_t FramesDropped() const;
+
  private:
-  FrameRendererDummy();
+  FrameRendererDummy(base::TimeDelta frame_duration,
+                     base::TimeDelta vsync_interval_duration);
 
   // Initialize the frame renderer, performs all rendering-related setup.
   bool Initialize();
+  void Destroy();
 
-  SEQUENCE_CHECKER(sequence_checker_);
+  // Tasks run on the renderer thread.
+  void InitializeTask(base::WaitableEvent* done);
+  void DestroyTask(base::WaitableEvent* done);
+  void RenderFrameTask();
+  void ScheduleNextRenderFrameTask() EXCLUSIVE_LOCKS_REQUIRED(renderer_lock_);
+
+  // Target duration we will simulate rendering each frame.
+  const base::TimeDelta frame_duration_;
+  // The VSync interval to be used.
+  const base::TimeDelta vsync_interval_duration_;
+  // Time at which we started displaying frames.
+  base::TimeTicks vsync_timebase_;
+
+  // The frame being displayed, only accessed on |renderer_thread_|.
+  scoped_refptr<VideoFrame> active_frame_;
+  // The queue of decoded video frames pending to be displayed.
+  base::queue<scoped_refptr<VideoFrame>> pending_frames_
+      GUARDED_BY(renderer_lock_);
+  // Time at which the next decoded frame should be rendered.
+  base::TimeTicks next_frame_time_ GUARDED_BY(renderer_lock_);
+
+  // Number of frames that need to be dropped because the decoder is too slow.
+  uint64_t frames_to_drop_decoding_slow_ GUARDED_BY(renderer_lock_);
+  // Number of frames that need to be dropped because we're rendering at a lower
+  // rate then the video's frame rate.
+  uint64_t frames_to_drop_rendering_slow_ GUARDED_BY(renderer_lock_);
+  // Number of frames dropped due to decoder running behind.
+  uint64_t frames_dropped_ GUARDED_BY(renderer_lock_);
+
+  // Task that simulates rendering a frame to screen.
+  base::CancelableClosure render_task_;
+  // Thread on which rendering video frames is simulated.
+  base::Thread renderer_thread_;
+  mutable base::Lock renderer_lock_;
+  base::ConditionVariable renderer_cv_;
+
+  SEQUENCE_CHECKER(client_sequence_checker_);
+  SEQUENCE_CHECKER(renderer_sequence_checker_);
   DISALLOW_COPY_AND_ASSIGN(FrameRendererDummy);
 };
 
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
index 8d5db1f..f2e32ec 100644
--- a/media/gpu/test/video_player/frame_renderer_thumbnail.cc
+++ b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
@@ -187,6 +187,8 @@
   RenderThumbnail(mailbox_holder.texture_target, it->second);
 }
 
+void FrameRendererThumbnail::WaitUntilRenderingDone() {}
+
 scoped_refptr<VideoFrame> FrameRendererThumbnail::CreateVideoFrame(
     VideoPixelFormat pixel_format,
     const gfx::Size& texture_size,
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.h b/media/gpu/test/video_player/frame_renderer_thumbnail.h
index cebe2c4..e08813a 100644
--- a/media/gpu/test/video_player/frame_renderer_thumbnail.h
+++ b/media/gpu/test/video_player/frame_renderer_thumbnail.h
@@ -56,6 +56,7 @@
   // Get the active GL context. This requires holding |gl_context_lock_|.
   gl::GLContext* GetGLContext() override;
   void RenderFrame(scoped_refptr<VideoFrame> video_frame) override;
+  void WaitUntilRenderingDone() override;
   scoped_refptr<VideoFrame> CreateVideoFrame(VideoPixelFormat pixel_format,
                                              const gfx::Size& texture_size,
                                              uint32_t texture_target,
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc
index 8b7fc17..d6f4dc5 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.cc
+++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -75,7 +75,7 @@
 void TestVDAVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                      bool low_delay,
                                      CdmContext* cdm_context,
-                                     const InitCB& init_cb,
+                                     InitCB init_cb,
                                      const OutputCB& output_cb,
                                      const WaitingCB& waiting_cb) {
   output_cb_ = output_cb;
@@ -99,7 +99,7 @@
 
   if (!decoder_factory) {
     LOG_ASSERT(decoder_) << "Failed to create VideoDecodeAccelerator factory";
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -120,11 +120,11 @@
 
   if (!decoder_) {
     LOG_ASSERT(decoder_) << "Failed to create VideoDecodeAccelerator factory";
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
-  init_cb.Run(true);
+  std::move(init_cb).Run(true);
 }
 
 void TestVDAVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.h b/media/gpu/test/video_player/test_vda_video_decoder.h
index d6af363..4a05e728 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.h
+++ b/media/gpu/test/video_player/test_vda_video_decoder.h
@@ -45,7 +45,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index 35c964d..fdcd42d 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -52,8 +52,10 @@
   DestroyDecoder();
   decoder_client_thread_.Stop();
 
-  // Wait until the frame processors are done, before destroying them. As the
-  // decoder has been destroyed no new frames will be sent to the processors.
+  // Wait until the renderer and frame processors are done before destroying
+  // them. This needs to be done after |decoder_client_thread_| is stopped so no
+  // new frames will be queued while waiting.
+  WaitForRenderer();
   WaitForFrameProcessors();
 }
 
@@ -119,6 +121,11 @@
   return success;
 }
 
+void VideoDecoderClient::WaitForRenderer() {
+  LOG_ASSERT(frame_renderer_);
+  frame_renderer_->WaitUntilRenderingDone();
+}
+
 FrameRenderer* VideoDecoderClient::GetFrameRenderer() const {
   return frame_renderer_.get();
 }
@@ -154,8 +161,8 @@
       kNoTransformation, video_->Resolution(), gfx::Rect(video_->Resolution()),
       video_->Resolution(), std::vector<uint8_t>(0), EncryptionScheme());
 
-  VideoDecoder::InitCB init_cb = BindToCurrentLoop(base::BindRepeating(
-      &VideoDecoderClient::DecoderInitializedTask, weak_this_));
+  VideoDecoder::InitCB init_cb = BindToCurrentLoop(
+      base::BindOnce(&VideoDecoderClient::DecoderInitializedTask, weak_this_));
   VideoDecoder::OutputCB output_cb = BindToCurrentLoop(
       base::BindRepeating(&VideoDecoderClient::FrameReadyTask, weak_this_));
   WaitingCB waiting_cb =
@@ -168,10 +175,10 @@
     // The video decoder client expects decoders to use the VD interface. We can
     // use the TestVDAVideoDecoder wrapper here to test VDA-based video
     // decoders.
-    decoder_ = base::WrapUnique(
-        new TestVDAVideoDecoder(decoder_client_config_.allocation_mode,
-                                gfx::ColorSpace(), frame_renderer_.get()));
-    decoder_->Initialize(config, false, nullptr, init_cb, output_cb,
+    decoder_ = std::make_unique<TestVDAVideoDecoder>(
+        decoder_client_config_.allocation_mode, gfx::ColorSpace(),
+        frame_renderer_.get());
+    decoder_->Initialize(config, false, nullptr, std::move(init_cb), output_cb,
                          waiting_cb);
   }
 
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h
index 8790d14c..c567d0f9 100644
--- a/media/gpu/test/video_player/video_decoder_client.h
+++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -77,6 +77,8 @@
   // Wait until all frame processors have finished processing. Returns whether
   // processing was successful.
   bool WaitForFrameProcessors();
+  // Wait until the renderer has finished rendering all queued frames.
+  void WaitForRenderer();
   // Get the frame renderer associated with the video decoder client.
   FrameRenderer* GetFrameRenderer() const;
 
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc
index 71a8718..8d4f9a9 100644
--- a/media/gpu/test/video_player/video_player.cc
+++ b/media/gpu/test/video_player/video_player.cc
@@ -185,6 +185,11 @@
   return !decoder_client_ || decoder_client_->WaitForFrameProcessors();
 }
 
+void VideoPlayer::WaitForRenderer() {
+  if (decoder_client_)
+    decoder_client_->WaitForRenderer();
+}
+
 size_t VideoPlayer::GetFlushDoneCount() const {
   return GetEventCount(VideoPlayerEvent::kFlushDone);
 }
diff --git a/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/video_player.h
index 24007d6..2e1ccb86 100644
--- a/media/gpu/test/video_player/video_player.h
+++ b/media/gpu/test/video_player/video_player.h
@@ -68,6 +68,8 @@
   // Wait until all frame processors have finished processing. Returns whether
   // processing was successful.
   bool WaitForFrameProcessors();
+  // Wait until the renderer has finished rendering all queued frames.
+  void WaitForRenderer();
 
   // Play the video asynchronously.
   void Play();
diff --git a/media/gpu/video_decode_accelerator_perf_tests.cc b/media/gpu/video_decode_accelerator_perf_tests.cc
index 27f3559..54aec2c 100644
--- a/media/gpu/video_decode_accelerator_perf_tests.cc
+++ b/media/gpu/video_decode_accelerator_perf_tests.cc
@@ -56,9 +56,12 @@
   // Total measurement duration.
   base::TimeDelta total_duration_;
   // The number of frames decoded.
-  size_t frame_decoded_count_ = 0;
+  size_t frames_decoded_ = 0;
   // The overall number of frames decoded per second.
   double frames_per_second_ = 0.0;
+  // The number of frames dropped because of the decoder running behind, only
+  // relevant for capped performance tests.
+  size_t frames_dropped_ = 0;
   // The average time between subsequent frame deliveries.
   double avg_frame_delivery_time_ms_ = 0.0;
   // The median time between decode start and frame delivery.
@@ -71,6 +74,11 @@
 // enabled as this affects test results.
 class PerformanceEvaluator : public VideoFrameProcessor {
  public:
+  // Create a new performance evaluator. The caller should makes sure
+  // |frame_renderer| outlives the performance evaluator.
+  explicit PerformanceEvaluator(const FrameRendererDummy* const frame_renderer)
+      : frame_renderer_(frame_renderer) {}
+
   // Interface VideoFrameProcessor
   void ProcessVideoFrame(scoped_refptr<const VideoFrame> video_frame,
                          size_t frame_index) override;
@@ -97,6 +105,10 @@
 
   // Collection of various performance metrics.
   PerformanceMetrics perf_metrics_;
+
+  // Frame renderer used to get the dropped frame rate, owned by the creator of
+  // the performance evaluator.
+  const FrameRendererDummy* const frame_renderer_;
 };
 
 void PerformanceEvaluator::ProcessVideoFrame(
@@ -111,7 +123,7 @@
   base::TimeDelta decode_time = now.since_origin() - video_frame->timestamp();
   frame_decode_times_.push_back(decode_time.InMillisecondsF());
 
-  perf_metrics_.frame_decoded_count_++;
+  perf_metrics_.frames_decoded_++;
 }
 
 void PerformanceEvaluator::StartMeasuring() {
@@ -122,12 +134,13 @@
 void PerformanceEvaluator::StopMeasuring() {
   end_time_ = base::TimeTicks::Now();
   perf_metrics_.total_duration_ = end_time_ - start_time_;
-  perf_metrics_.frames_per_second_ = perf_metrics_.frame_decoded_count_ /
+  perf_metrics_.frames_per_second_ = perf_metrics_.frames_decoded_ /
                                      perf_metrics_.total_duration_.InSecondsF();
+  perf_metrics_.frames_dropped_ = frame_renderer_->FramesDropped();
 
   perf_metrics_.avg_frame_delivery_time_ms_ =
       perf_metrics_.total_duration_.InMillisecondsF() /
-      perf_metrics_.frame_decoded_count_;
+      perf_metrics_.frames_decoded_;
 
   std::sort(frame_decode_times_.begin(), frame_decode_times_.end());
   size_t median_index = frame_decode_times_.size() / 2;
@@ -138,10 +151,11 @@
              frame_decode_times_[median_index]) /
                 2.0;
 
-  VLOG(0) << "Number of frames decoded: " << perf_metrics_.frame_decoded_count_;
-  VLOG(0) << "Total duration:           "
+  VLOG(0) << "Frames decoded: " << perf_metrics_.frames_decoded_;
+  VLOG(0) << "Total duration: "
           << perf_metrics_.total_duration_.InMillisecondsF() << "ms";
-  VLOG(0) << "FPS:                      " << perf_metrics_.frames_per_second_;
+  VLOG(0) << "FPS:            " << perf_metrics_.frames_per_second_;
+  VLOG(0) << "Frames Dropped: " << perf_metrics_.frames_dropped_;
   VLOG(0) << "Avg. frame delivery time:   "
           << perf_metrics_.avg_frame_delivery_time_ms_ << "ms";
   VLOG(0) << "Median frame decode time:   "
@@ -150,11 +164,12 @@
 
 void PerformanceEvaluator::WriteMetricsToFile() const {
   std::string str = base::StringPrintf(
-      "Number of frames decoded: %zu\nTotal duration: %fms\nFPS: %f\nAvg. "
-      "frame delivery time: %fms\nMedian frame decode time: %fms\n",
-      perf_metrics_.frame_decoded_count_,
+      "Frames decoded: %zu\nTotal duration: %fms\nFPS: %f\n"
+      "Frames dropped: %zu\nAvg. frame delivery time: %fms\n"
+      "Median frame decode time: %fms\n",
+      perf_metrics_.frames_decoded_,
       perf_metrics_.total_duration_.InMillisecondsF(),
-      perf_metrics_.frames_per_second_,
+      perf_metrics_.frames_per_second_, perf_metrics_.frames_dropped_,
       perf_metrics_.avg_frame_delivery_time_ms_,
       perf_metrics_.median_frame_decode_time_ms_);
 
@@ -189,10 +204,28 @@
 // Video decode test class. Performs setup and teardown for each single test.
 class VideoDecoderTest : public ::testing::Test {
  public:
-  std::unique_ptr<VideoPlayer> CreateVideoPlayer(const Video* video) {
+  // Create a new video player instance. |render_frame_rate| is the rate at
+  // which the video player will simulate rendering frames, if 0 no rendering is
+  // simulated. The |vsync_rate| is used during simulated rendering, if 0 Vsync
+  // is disabled.
+  std::unique_ptr<VideoPlayer> CreateVideoPlayer(const Video* video,
+                                                 uint32_t render_frame_rate = 0,
+                                                 uint32_t vsync_rate = 0) {
     LOG_ASSERT(video);
+
+    // Create dummy frame renderer, simulates rendering at specified frame rate.
+    base::TimeDelta frame_duration;
+    base::TimeDelta vsync_interval_duration;
+    if (render_frame_rate > 0) {
+      frame_duration = base::TimeDelta::FromSeconds(1) / render_frame_rate;
+      vsync_interval_duration = base::TimeDelta::FromSeconds(1) / vsync_rate;
+    }
+    auto frame_renderer =
+        FrameRendererDummy::Create(frame_duration, vsync_interval_duration);
+
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors;
-    auto performance_evaluator = std::make_unique<PerformanceEvaluator>();
+    auto performance_evaluator =
+        std::make_unique<PerformanceEvaluator>(frame_renderer.get());
     performance_evaluator_ = performance_evaluator.get();
     frame_processors.push_back(std::move(performance_evaluator));
 
@@ -200,7 +233,7 @@
     VideoDecoderClientConfig config;
     config.use_vd = g_env->UseVD();
 
-    return VideoPlayer::Create(video, FrameRendererDummy::Create(),
+    return VideoPlayer::Create(video, std::move(frame_renderer),
                                std::move(frame_processors), config);
   }
 
@@ -209,9 +242,9 @@
 
 }  // namespace
 
-// Play video from start to end while measuring performance.
-// TODO(dstaessens@) Add a test to measure capped decode performance, measuring
-// the number of frames dropped.
+// Play video from start to end while measuring uncapped performance. This test
+// will decode a video as fast as possible, and gives an idea about the maximum
+// output of the decoder.
 TEST_F(VideoDecoderTest, MeasureUncappedPerformance) {
   auto tvp = CreateVideoPlayer(g_env->Video());
 
@@ -225,6 +258,23 @@
   EXPECT_EQ(tvp->GetFrameDecodedCount(), g_env->Video()->NumFrames());
 }
 
+// Play video from start to end while measuring capped performance. This test
+// will simulate rendering the video at its actual frame rate, and will
+// calculate the number of frames that were dropped. Vsync is enabled at 60 FPS.
+TEST_F(VideoDecoderTest, MeasureCappedPerformance) {
+  auto tvp = CreateVideoPlayer(g_env->Video(), g_env->Video()->FrameRate(), 60);
+
+  performance_evaluator_->StartMeasuring();
+  tvp->Play();
+  EXPECT_TRUE(tvp->WaitForFlushDone());
+  tvp->WaitForRenderer();
+  performance_evaluator_->StopMeasuring();
+  performance_evaluator_->WriteMetricsToFile();
+
+  EXPECT_EQ(tvp->GetFlushDoneCount(), 1u);
+  EXPECT_EQ(tvp->GetFrameDecodedCount(), g_env->Video()->NumFrames());
+}
+
 }  // namespace test
 }  // namespace media
 
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc
index bd809fb8..9e79edf 100644
--- a/media/gpu/windows/d3d11_video_decoder.cc
+++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -264,7 +264,7 @@
 void D3D11VideoDecoder::Initialize(const VideoDecoderConfig& config,
                                    bool low_delay,
                                    CdmContext* cdm_context,
-                                   const InitCB& init_cb,
+                                   InitCB init_cb,
                                    const OutputCB& output_cb,
                                    const WaitingCB& waiting_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -274,7 +274,7 @@
   state_ = State::kInitializing;
 
   config_ = config;
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   output_cb_ = output_cb;
   waiting_cb_ = waiting_cb;
 
diff --git a/media/gpu/windows/d3d11_video_decoder.h b/media/gpu/windows/d3d11_video_decoder.h
index 82660c5..6c658713 100644
--- a/media/gpu/windows/d3d11_video_decoder.h
+++ b/media/gpu/windows/d3d11_video_decoder.h
@@ -103,7 +103,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/mojo/clients/mojo_audio_decoder.cc b/media/mojo/clients/mojo_audio_decoder.cc
index cbbf36a..3c3d7df 100644
--- a/media/mojo/clients/mojo_audio_decoder.cc
+++ b/media/mojo/clients/mojo_audio_decoder.cc
@@ -44,7 +44,7 @@
 
 void MojoAudioDecoder::Initialize(const AudioDecoderConfig& config,
                                   CdmContext* cdm_context,
-                                  const InitCB& init_cb,
+                                  InitCB init_cb,
                                   const OutputCB& output_cb,
                                   const WaitingCB& waiting_cb) {
   DVLOG(1) << __func__;
@@ -56,7 +56,8 @@
   // This could happen during reinitialization.
   if (remote_decoder_.encountered_error()) {
     DVLOG(1) << __func__ << ": Connection error happened.";
-    task_runner_->PostTask(FROM_HERE, base::BindOnce(init_cb, false));
+    task_runner_->PostTask(FROM_HERE,
+                           base::BindOnce(std::move(init_cb), false));
     return;
   }
 
@@ -67,11 +68,12 @@
 
   if (config.is_encrypted() && CdmContext::kInvalidCdmId == cdm_id) {
     DVLOG(1) << __func__ << ": Invalid CdmContext.";
-    task_runner_->PostTask(FROM_HERE, base::BindOnce(init_cb, false));
+    task_runner_->PostTask(FROM_HERE,
+                           base::BindOnce(std::move(init_cb), false));
     return;
   }
 
-  init_cb_ = init_cb;
+  init_cb_ = std::move(init_cb);
   output_cb_ = output_cb;
   waiting_cb_ = waiting_cb;
 
diff --git a/media/mojo/clients/mojo_audio_decoder.h b/media/mojo/clients/mojo_audio_decoder.h
index 2c77d69..3f18726 100644
--- a/media/mojo/clients/mojo_audio_decoder.h
+++ b/media/mojo/clients/mojo_audio_decoder.h
@@ -35,7 +35,7 @@
   bool IsPlatformDecoder() const final;
   void Initialize(const AudioDecoderConfig& config,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) final;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/mojo/clients/mojo_audio_decoder_unittest.cc b/media/mojo/clients/mojo_audio_decoder_unittest.cc
index f9c34e5..394eb01 100644
--- a/media/mojo/clients/mojo_audio_decoder_unittest.cc
+++ b/media/mojo/clients/mojo_audio_decoder_unittest.cc
@@ -110,9 +110,9 @@
         new StrictMock<MockAudioDecoder>());
     mock_audio_decoder_ = mock_audio_decoder.get();
 
-    EXPECT_CALL(*mock_audio_decoder_, Initialize(_, _, _, _, _))
+    EXPECT_CALL(*mock_audio_decoder_, Initialize_(_, _, _, _, _))
         .WillRepeatedly(DoAll(SaveArg<3>(&output_cb_), SaveArg<4>(&waiting_cb_),
-                              RunCallback<2>(true)));
+                              RunOnceCallback<2>(true)));
     EXPECT_CALL(*mock_audio_decoder_, Decode(_, _))
         .WillRepeatedly(
             DoAll(InvokeWithoutArgs(this, &MojoAudioDecoderTest::ReturnOutput),
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 32f72b3..64a817e 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -33,7 +33,7 @@
 namespace {
 
 void ReportMojoVideoDecoderInitializeStatusToUMAAndRunCB(
-    const VideoDecoder::InitCB& init_cb,
+    VideoDecoder::InitCB init_cb,
     bool success) {
   // Send the same histogram as GpuVideoDecoder to avoid breaking the existing
   // tests.
@@ -42,7 +42,7 @@
   UMA_HISTOGRAM_ENUMERATION("Media.GpuVideoDecoderInitializeStatus", status,
                             PIPELINE_STATUS_MAX + 1);
 
-  init_cb.Run(success);
+  std::move(init_cb).Run(success);
 }
 
 void ReportMojoVideoDecoderErrorStatusToUMAAndRunCB(
@@ -148,19 +148,19 @@
 void MojoVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                   bool low_delay,
                                   CdmContext* cdm_context,
-                                  const InitCB& init_cb,
+                                  InitCB init_cb,
                                   const OutputCB& output_cb,
                                   const WaitingCB& waiting_cb) {
   DVLOG(1) << __func__;
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  InitCB bound_init_cb =
-      base::Bind(&ReportMojoVideoDecoderInitializeStatusToUMAAndRunCB, init_cb);
+  InitCB bound_init_cb = base::BindOnce(
+      &ReportMojoVideoDecoderInitializeStatusToUMAAndRunCB, std::move(init_cb));
   // Fail immediately if we know that the remote side cannot support |config|.
   if (gpu_factories_ && !gpu_factories_->IsDecoderConfigSupported(
                             video_decoder_implementation_, config)) {
     task_runner_->PostTask(FROM_HERE,
-                           base::BindRepeating(bound_init_cb, false));
+                           base::BindOnce(std::move(bound_init_cb), false));
     return;
   }
 
@@ -174,7 +174,8 @@
   // is passed for reinitialization.
   if (config.is_encrypted() && CdmContext::kInvalidCdmId == cdm_id) {
     DVLOG(1) << __func__ << ": Invalid CdmContext.";
-    task_runner_->PostTask(FROM_HERE, base::BindOnce(bound_init_cb, false));
+    task_runner_->PostTask(FROM_HERE,
+                           base::BindOnce(std::move(bound_init_cb), false));
     return;
   }
 
@@ -183,12 +184,12 @@
 
   if (has_connection_error_) {
     task_runner_->PostTask(FROM_HERE,
-                           base::BindRepeating(bound_init_cb, false));
+                           base::BindOnce(std::move(bound_init_cb), false));
     return;
   }
 
   initialized_ = false;
-  init_cb_ = bound_init_cb;
+  init_cb_ = std::move(bound_init_cb);
   output_cb_ = output_cb;
   waiting_cb_ = waiting_cb;
 
diff --git a/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h
index 086aeb2..e6a032cf 100644
--- a/media/mojo/clients/mojo_video_decoder.h
+++ b/media/mojo/clients/mojo_video_decoder.h
@@ -49,7 +49,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) final;
   void Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/mojo/interfaces/audio_output_stream.mojom b/media/mojo/interfaces/audio_output_stream.mojom
index 9683e76..1253a92 100644
--- a/media/mojo/interfaces/audio_output_stream.mojom
+++ b/media/mojo/interfaces/audio_output_stream.mojom
@@ -22,6 +22,9 @@
   // this.
   Pause();
 
+  // Flushes buffered audio.  This should not be called when playing.
+  Flush();
+
   // Sets volume. Volume must be in the range [0, 1].
   SetVolume(double volume);
 };
diff --git a/media/mojo/services/mojo_audio_output_stream.cc b/media/mojo/services/mojo_audio_output_stream.cc
index 27ee8f7..a794425 100644
--- a/media/mojo/services/mojo_audio_output_stream.cc
+++ b/media/mojo/services/mojo_audio_output_stream.cc
@@ -52,6 +52,11 @@
   delegate_->OnPauseStream();
 }
 
+void MojoAudioOutputStream::Flush() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  delegate_->OnFlushStream();
+}
+
 void MojoAudioOutputStream::SetVolume(double volume) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (volume < 0 || volume > 1) {
diff --git a/media/mojo/services/mojo_audio_output_stream.h b/media/mojo/services/mojo_audio_output_stream.h
index 1556ca5..5d0e84fd 100644
--- a/media/mojo/services/mojo_audio_output_stream.h
+++ b/media/mojo/services/mojo_audio_output_stream.h
@@ -46,6 +46,7 @@
   // mojom::AudioOutputStream implementation.
   void Play() override;
   void Pause() override;
+  void Flush() override;
   void SetVolume(double volume) override;
 
   // AudioOutputDelegate::EventHandler implementation.
diff --git a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
index 34543b4..1d6cf50d 100644
--- a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
@@ -51,6 +51,7 @@
   int GetStreamId() override { return 0; }
   void OnPlayStream() override {}
   void OnPauseStream() override {}
+  void OnFlushStream() override {}
   void OnSetVolume(double) override {}
 
  private:
diff --git a/media/mojo/services/mojo_audio_output_stream_unittest.cc b/media/mojo/services/mojo_audio_output_stream_unittest.cc
index e5d80a12..e1d8748 100644
--- a/media/mojo/services/mojo_audio_output_stream_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_unittest.cc
@@ -66,6 +66,7 @@
   MOCK_METHOD0(OnPlayStream, void());
   MOCK_METHOD0(OnPauseStream, void());
   MOCK_METHOD1(OnSetVolume, void(double));
+  MOCK_METHOD0(OnFlushStream, void());
 };
 
 class MockDelegateFactory {
@@ -228,6 +229,17 @@
   base::RunLoop().RunUntilIdle();
 }
 
+TEST_F(MojoAudioOutputStreamTest, Flush_FlushesStream) {
+  AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput();
+
+  EXPECT_CALL(client_, GotNotification());
+  EXPECT_CALL(*delegate_, OnFlushStream());
+  delegate_event_handler_->OnStreamCreated(kStreamId, std::move(mem_),
+                                           std::move(foreign_socket_));
+  audio_output_ptr->Flush();
+  base::RunLoop().RunUntilIdle();
+}
+
 TEST_F(MojoAudioOutputStreamTest, DestructWithCallPending_Safe) {
   AudioOutputStreamPtr audio_output_ptr = CreateAudioOutput();
   EXPECT_CALL(client_, GotNotification());
diff --git a/media/mojo/test/mojo_video_decoder_integration_test.cc b/media/mojo/test/mojo_video_decoder_integration_test.cc
index 3251a1c..6b9be44 100644
--- a/media/mojo/test/mojo_video_decoder_integration_test.cc
+++ b/media/mojo/test/mojo_video_decoder_integration_test.cc
@@ -86,7 +86,7 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool /* low_delay */,
                   CdmContext* /* cdm_context */,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override {
     config_ = config;
@@ -103,7 +103,7 @@
   MOCK_CONST_METHOD0(GetMaxDecodeRequests, int());
 
   // Mock helpers.
-  MOCK_METHOD1(DoInitialize, void(const InitCB&));
+  MOCK_METHOD1(DoInitialize, void(InitCB&));
   VideoFrame::ReleaseMailboxCB GetReleaseMailboxCB() {
     DidGetReleaseMailboxCB();
     return std::move(release_mailbox_cb);
@@ -227,7 +227,7 @@
   bool Initialize() {
     CreateClient();
 
-    EXPECT_CALL(*decoder_, DoInitialize(_)).WillOnce(RunCallback<0>(true));
+    EXPECT_CALL(*decoder_, DoInitialize(_)).WillOnce(RunOnceCallback<0>(true));
 
     bool result = false;
     StrictMock<base::MockCallback<VideoDecoder::InitCB>> init_cb;
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
index e5f050f4..69d9bf0 100644
--- a/media/renderers/audio_renderer_impl.cc
+++ b/media/renderers/audio_renderer_impl.cc
@@ -275,6 +275,11 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
   TRACE_EVENT_ASYNC_BEGIN0("media", "AudioRendererImpl::Flush", this);
 
+  // Flush |sink_| now.  |sink_| must only be accessed on |task_runner_| and not
+  // be called under |lock_|.
+  DCHECK(!sink_playing_);
+  sink_->Flush();
+
   base::AutoLock auto_lock(lock_);
   DCHECK_EQ(state_, kPlaying);
   DCHECK(!flush_cb_);
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc
index c11c8950..b8c66db 100644
--- a/media/renderers/audio_renderer_impl_unittest.cc
+++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -23,6 +23,7 @@
 #include "media/base/gmock_callback_support.h"
 #include "media/base/media_client.h"
 #include "media/base/media_util.h"
+#include "media/base/mock_audio_renderer_sink.h"
 #include "media/base/mock_filters.h"
 #include "media/base/test_helpers.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -65,7 +66,7 @@
     kOutputSamplesPerSecond;
 
 ACTION_P(EnterPendingDecoderInitStateAction, test) {
-  test->EnterPendingDecoderInitState(arg2);
+  test->EnterPendingDecoderInitState(std::move(arg2));
 }
 
 class AudioRendererImplTest : public ::testing::Test, public RendererClient {
@@ -73,11 +74,11 @@
   std::vector<std::unique_ptr<AudioDecoder>> CreateAudioDecoderForTest() {
     auto decoder = std::make_unique<MockAudioDecoder>();
     if (!enter_pending_decoder_init_) {
-      EXPECT_CALL(*decoder, Initialize(_, _, _, _, _))
+      EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
           .WillOnce(DoAll(SaveArg<3>(&output_cb_),
-                          RunCallback<2>(expected_init_result_)));
+                          RunOnceCallback<2>(expected_init_result_)));
     } else {
-      EXPECT_CALL(*decoder, Initialize(_, _, _, _, _))
+      EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
           .WillOnce(EnterPendingDecoderInitStateAction(this));
     }
     EXPECT_CALL(*decoder, Decode(_, _))
@@ -162,6 +163,17 @@
     ConfigureDemuxerStream(true);
   }
 
+  void ConfigureMockRenderer(const AudioParameters& params) {
+    mock_sink_ = new MockAudioRendererSink();
+    renderer_.reset(new AudioRendererImpl(
+        main_thread_task_runner_, mock_sink_.get(),
+        base::Bind(&AudioRendererImplTest::CreateAudioDecoderForTest,
+                   base::Unretained(this)),
+        &media_log_));
+    testing::Mock::VerifyAndClearExpectations(&demuxer_stream_);
+    ConfigureDemuxerStream(true);
+  }
+
   // RendererClient implementation.
   MOCK_METHOD1(OnError, void(PipelineStatus));
   void OnEnded() override {
@@ -253,8 +265,8 @@
     event.RunAndWaitForStatus(PIPELINE_ERROR_ABORT);
   }
 
-  void EnterPendingDecoderInitState(const AudioDecoder::InitCB& cb) {
-    init_decoder_cb_ = cb;
+  void EnterPendingDecoderInitState(AudioDecoder::InitCB cb) {
+    init_decoder_cb_ = std::move(cb);
   }
 
   void FlushDuringPendingRead() {
@@ -496,6 +508,7 @@
   NullMediaLog media_log_;
   std::unique_ptr<AudioRendererImpl> renderer_;
   scoped_refptr<FakeAudioRendererSink> sink_;
+  scoped_refptr<MockAudioRendererSink> mock_sink_;
   base::SimpleTestTickClock tick_clock_;
   PipelineStatistics last_statistics_;
 
@@ -675,6 +688,7 @@
   EXPECT_GT(buffer_capacity().value, initial_capacity.value);
 
   // Verify that the buffer capacity is restored to the |initial_capacity|.
+  StopTicking();
   FlushDuringPendingRead();
   EXPECT_EQ(buffer_capacity().value, initial_capacity.value);
 }
@@ -1226,4 +1240,22 @@
   SetMediaClient(nullptr);
 }
 
+TEST_F(AudioRendererImplTest, SinkIsFlushed) {
+  ConfigureMockRenderer(AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                        kChannelLayout, kOutputSamplesPerSecond,
+                                        1024 * 15));
+
+  Initialize();
+  Preroll();
+  StartTicking();
+  WaitForPendingRead();
+  StopTicking();
+
+  // Start flushing.
+  EXPECT_CALL(*mock_sink_, Flush());
+  WaitableMessageLoopEvent flush_event;
+  renderer_->Flush(flush_event.GetClosure());
+  renderer_.reset();
+}
+
 }  // namespace media
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc
index f39028b..33b9617 100644
--- a/media/renderers/video_renderer_impl_unittest.cc
+++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -41,6 +41,7 @@
 using ::testing::_;
 using ::testing::AnyNumber;
 using ::testing::CreateFunctor;
+using ::testing::DoAll;
 using ::testing::Invoke;
 using ::testing::Mock;
 using ::testing::NiceMock;
@@ -61,9 +62,9 @@
     decoder_ = new NiceMock<MockVideoDecoder>();
     std::vector<std::unique_ptr<VideoDecoder>> decoders;
     decoders.push_back(base::WrapUnique(decoder_));
-    ON_CALL(*decoder_, Initialize(_, _, _, _, _, _))
+    ON_CALL(*decoder_, Initialize_(_, _, _, _, _, _))
         .WillByDefault(DoAll(SaveArg<4>(&output_cb_),
-                             RunCallback<3>(expect_init_success_)));
+                             RunOnceCallback<3>(expect_init_success_)));
     // Monitor decodes from the decoder.
     ON_CALL(*decoder_, Decode(_, _))
         .WillByDefault(Invoke(this, &VideoRendererImplTest::DecodeRequested));
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc
index af8026a..9762d4f 100644
--- a/media/test/pipeline_integration_test.cc
+++ b/media/test/pipeline_integration_test.cc
@@ -381,10 +381,10 @@
   void Initialize(const VideoDecoderConfig& config,
                   bool low_delay,
                   CdmContext* cdm_context,
-                  const InitCB& init_cb,
+                  InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override {
-    init_cb.Run(true);
+    std::move(init_cb).Run(true);
   }
   void Decode(scoped_refptr<DecoderBuffer> buffer,
               const DecodeCB& decode_cb) override {
diff --git a/services/audio/output_controller.cc b/services/audio/output_controller.cc
index 26c06fa..cf04797 100644
--- a/services/audio/output_controller.cc
+++ b/services/audio/output_controller.cc
@@ -317,6 +317,21 @@
   handler_->OnControllerPaused();
 }
 
+void OutputController::Flush() {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+  TRACE_EVENT0("audio", "OutputController::Flush");
+  handler_->OnLog("OutputController::Flush");
+
+  if (state_ == kPlaying) {
+    handler_->OnControllerError();
+    return;
+  }
+
+  if (stream_) {
+    stream_->Flush();
+  }
+}
+
 void OutputController::Close() {
   DCHECK(task_runner_->BelongsToCurrentThread());
   SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CloseTime");
diff --git a/services/audio/output_controller.h b/services/audio/output_controller.h
index d4a2f342..ba979115 100644
--- a/services/audio/output_controller.h
+++ b/services/audio/output_controller.h
@@ -137,6 +137,10 @@
   // Pause this audio output stream.
   void Pause();
 
+  // Flushes the audio output stream.
+  // This should only be called if the audio output stream is not playing.
+  void Flush();
+
   // Closes the audio output stream synchronously. Stops the stream first, if
   // necessary. After this method returns, this OutputController can be
   // destroyed by its owner.
diff --git a/services/audio/output_controller_unittest.cc b/services/audio/output_controller_unittest.cc
index 6df8522..f3da456 100644
--- a/services/audio/output_controller_unittest.cc
+++ b/services/audio/output_controller_unittest.cc
@@ -132,6 +132,7 @@
   MOCK_METHOD0(DidStop, void());
   MOCK_METHOD0(DidClose, void());
   MOCK_METHOD1(DidSetVolume, void(double));
+  MOCK_METHOD0(DidFlush, void());
 
   bool Open() override {
     if (impl_)
@@ -187,6 +188,12 @@
 
   void GetVolume(double* volume) override { *volume = volume_; }
 
+  void Flush() override {
+    if (impl_)
+      impl_->Flush();
+    DidFlush();
+  }
+
  protected:
   ~MockAudioOutputStream() override = default;
 
@@ -452,6 +459,8 @@
     loop.Run();
   }
 
+  void Flush() { controller_->Flush(); }
+
   void SimulateErrorThenDeviceChange() {
     audio_manager_.GetTaskRunner()->PostTask(
         FROM_HERE,
@@ -477,12 +486,13 @@
     Mock::VerifyAndClearExpectations(&mock_event_handler_);
   }
 
+  StrictMock<MockOutputControllerEventHandler> mock_event_handler_;
+
  private:
   base::TestMessageLoop message_loop_;
   AudioManagerForControllerTest audio_manager_;
   base::UnguessableToken group_id_;
   base::UnguessableToken processing_id_;
-  StrictMock<MockOutputControllerEventHandler> mock_event_handler_;
   StrictMock<MockOutputControllerSyncReader> mock_sync_reader_;
   base::Optional<OutputController> controller_;
   StreamMonitorCoordinator stream_monitor_coordinator_;
@@ -737,5 +747,29 @@
   LeaveProcessingGroup(&monitor);
 }
 
+TEST_F(OutputControllerTest, FlushWhenStreamIsPlayingTriggersError) {
+  Create();
+  Play();
+
+  MockAudioOutputStream* const mock_stream = last_created_stream();
+  EXPECT_CALL(*mock_stream, DidFlush()).Times(0);
+  EXPECT_CALL(mock_event_handler_, OnControllerError()).Times(1);
+  Flush();
+
+  Close();
+}
+
+TEST_F(OutputControllerTest, FlushesWhenStreamIsNotPlaying) {
+  Create();
+  Play();
+  Pause();
+
+  MockAudioOutputStream* const mock_stream = last_created_stream();
+  EXPECT_CALL(*mock_stream, DidFlush()).Times(1);
+  Flush();
+
+  Close();
+}
+
 }  // namespace
 }  // namespace audio
diff --git a/services/audio/output_stream.cc b/services/audio/output_stream.cc
index bdc4933..81c0e2b 100644
--- a/services/audio/output_stream.cc
+++ b/services/audio/output_stream.cc
@@ -129,6 +129,12 @@
     log_->OnStopped();
 }
 
+void OutputStream::Flush() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
+
+  controller_.Flush();
+}
+
 void OutputStream::SetVolume(double volume) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_);
   TRACE_EVENT_NESTABLE_ASYNC_INSTANT1("audio", "SetVolume", this, "volume",
diff --git a/services/audio/output_stream.h b/services/audio/output_stream.h
index f2ffab2..451bc9e 100644
--- a/services/audio/output_stream.h
+++ b/services/audio/output_stream.h
@@ -69,6 +69,7 @@
   // media::mojom::AudioOutputStream implementation.
   void Play() final;
   void Pause() final;
+  void Flush() final;
   void SetVolume(double volume) final;
 
   // OutputController::EventHandler implementation.
diff --git a/services/audio/output_stream_unittest.cc b/services/audio/output_stream_unittest.cc
index bedb439..902d480 100644
--- a/services/audio/output_stream_unittest.cc
+++ b/services/audio/output_stream_unittest.cc
@@ -49,6 +49,7 @@
   MOCK_METHOD1(SetVolume, void(double volume));
   MOCK_METHOD1(GetVolume, void(double* volume));
   MOCK_METHOD0(Close, void());
+  MOCK_METHOD0(Flush, void());
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockStream);
diff --git a/services/audio/public/cpp/output_device_unittest.cc b/services/audio/public/cpp/output_device_unittest.cc
index ceaf121..18c11f0e 100644
--- a/services/audio/public/cpp/output_device_unittest.cc
+++ b/services/audio/public/cpp/output_device_unittest.cc
@@ -60,6 +60,7 @@
   MOCK_METHOD0(Play, void());
   MOCK_METHOD0(Pause, void());
   MOCK_METHOD1(SetVolume, void(double));
+  MOCK_METHOD0(Flush, void());
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockStream);
diff --git a/services/device/public/cpp/hid/fake_hid_manager.cc b/services/device/public/cpp/hid/fake_hid_manager.cc
index ef6c71e..c1f5186 100644
--- a/services/device/public/cpp/hid/fake_hid_manager.cc
+++ b/services/device/public/cpp/hid/fake_hid_manager.cc
@@ -102,11 +102,7 @@
 void FakeHidManager::GetDevicesAndSetClient(
     mojom::HidManagerClientAssociatedPtrInfo client,
     GetDevicesCallback callback) {
-  std::vector<mojom::HidDeviceInfoPtr> device_list;
-  for (auto& map_entry : devices_)
-    device_list.push_back(map_entry.second->Clone());
-
-  std::move(callback).Run(std::move(device_list));
+  GetDevices(std::move(callback));
 
   mojom::HidManagerClientAssociatedPtr client_ptr;
   client_ptr.Bind(std::move(client));
@@ -114,8 +110,11 @@
 }
 
 void FakeHidManager::GetDevices(GetDevicesCallback callback) {
-  // Clients of HidManager in extensions only use GetDevicesAndSetClient().
-  NOTREACHED();
+  std::vector<mojom::HidDeviceInfoPtr> device_list;
+  for (auto& map_entry : devices_)
+    device_list.push_back(map_entry.second->Clone());
+
+  std::move(callback).Run(std::move(device_list));
 }
 
 void FakeHidManager::Connect(const std::string& device_guid,
diff --git a/services/tracing/perfetto/producer_host.cc b/services/tracing/perfetto/producer_host.cc
index 5eb84331..12da7a6 100644
--- a/services/tracing/perfetto/producer_host.cc
+++ b/services/tracing/perfetto/producer_host.cc
@@ -11,6 +11,7 @@
 #include "services/tracing/perfetto/perfetto_service.h"
 #include "services/tracing/public/cpp/perfetto/producer_client.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
+#include "services/tracing/public/cpp/tracing_features.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/data_source_descriptor.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/trace_config.h"
@@ -46,9 +47,12 @@
   //   hence we avoid any deadlocking occurring from trace events emitted from
   //   the Perfetto sequence filling up the SMB and stalling while waiting for
   //   Perfetto to free the chunks.
-  base::ProcessId pid;
-  if (PerfettoService::ParsePidFromProducerName(name, &pid)) {
-    is_in_process_ = (pid == base::Process::Current().Pid());
+  if (!base::FeatureList::IsEnabled(
+          features::kPerfettoForceOutOfProcessProducer)) {
+    base::ProcessId pid;
+    if (PerfettoService::ParsePidFromProducerName(name, &pid)) {
+      is_in_process_ = (pid == base::Process::Current().Pid());
+    }
   }
 
   // TODO(oysteine): Figure out an uid once we need it.
diff --git a/services/tracing/public/cpp/tracing_features.cc b/services/tracing/public/cpp/tracing_features.cc
index 43a19ec..9a20fc7 100644
--- a/services/tracing/public/cpp/tracing_features.cc
+++ b/services/tracing/public/cpp/tracing_features.cc
@@ -24,6 +24,10 @@
 const base::Feature kBackgroundTracingProtoOutput{
     "BackgroundTracingProtoOutput", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Causes Perfetto to run in-process mode for in-process tracing producers.
+const base::Feature kPerfettoForceOutOfProcessProducer{
+    "PerfettoForceOutOfProcessProducer", base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Runs the tracing service as an in-process browser service.
 const base::Feature kTracingServiceInProcess {
   "TracingServiceInProcess",
diff --git a/services/tracing/public/cpp/tracing_features.h b/services/tracing/public/cpp/tracing_features.h
index 4d282d6e..ef0bbe8 100644
--- a/services/tracing/public/cpp/tracing_features.h
+++ b/services/tracing/public/cpp/tracing_features.h
@@ -24,6 +24,9 @@
 extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
     kBackgroundTracingProtoOutput;
 
+extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
+    kPerfettoForceOutOfProcessProducer;
+
 }  // namespace features
 
 namespace tracing {
diff --git a/sql/database.cc b/sql/database.cc
index 802923c..3ef9c18d 100644
--- a/sql/database.cc
+++ b/sql/database.cc
@@ -31,6 +31,7 @@
 #include "sql/database_memory_dump_provider.h"
 #include "sql/initialization.h"
 #include "sql/meta_table.h"
+#include "sql/sql_features.h"
 #include "sql/statement.h"
 #include "sql/vfs_wrapper.h"
 #include "third_party/sqlite/sqlite3.h"
@@ -346,6 +347,9 @@
   base::Optional<base::ScopedBlockingCall> scoped_blocking_call;
   InitScopedBlockingCall(&scoped_blocking_call);
 
+  if (base::FeatureList::IsEnabled(features::kSqlSkipPreload))
+    return;
+
   if (!db_) {
     DCHECK(poisoned_) << "Cannot preload null db";
     return;
diff --git a/sql/sql_features.cc b/sql/sql_features.cc
index 93d84e12..833c43e 100644
--- a/sql/sql_features.cc
+++ b/sql/sql_features.cc
@@ -8,7 +8,17 @@
 
 namespace features {
 
-// Flags for SQLite configuration experiments will be defined here.
+// Skip the logic for preloading databases.
+//
+// Enabling this feature turns sql::Database::Preload() into a noop.
+// https://crbug.com/243949 suggests that sql::Database::Preload() was added
+// without any proper benchmarking, and the logic is a pessimization for modern
+// OS schedulers.
+//
+// TODO(pwnall): After the performance impact of the change is assessed, remove
+//               sql::Database::Preload() and this flag.
+const base::Feature kSqlSkipPreload{"SqlSkipPreload",
+                                    base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace features
 
diff --git a/sql/sql_features.h b/sql/sql_features.h
index 4acfc54..eee5770 100644
--- a/sql/sql_features.h
+++ b/sql/sql_features.h
@@ -12,7 +12,7 @@
 
 namespace features {
 
-// Flags for SQLite configuration experiments will be declared here.
+COMPONENT_EXPORT(SQL) extern const base::Feature kSqlSkipPreload;
 
 }  // namespace features
 
diff --git a/sql/sqlite_features_unittest.cc b/sql/sqlite_features_unittest.cc
index ed481ea..24435fe 100644
--- a/sql/sqlite_features_unittest.cc
+++ b/sql/sqlite_features_unittest.cc
@@ -176,6 +176,18 @@
   EXPECT_TRUE(!s.ColumnBool(3)) << " default FALSE added by altering the table";
 }
 
+TEST_F(SQLiteFeaturesTest, IcuEnabled) {
+  sql::Statement lower_en(
+      db().GetUniqueStatement("SELECT lower('I', 'en_us')"));
+  ASSERT_TRUE(lower_en.Step());
+  EXPECT_EQ("i", lower_en.ColumnString(0));
+
+  sql::Statement lower_tr(
+      db().GetUniqueStatement("SELECT lower('I', 'tr_tr')"));
+  ASSERT_TRUE(lower_tr.Step());
+  EXPECT_EQ("\u0131", lower_tr.ColumnString(0));
+}
+
 // Verify that OS file writes are reflected in the memory mapping of a
 // memory-mapped file.  Normally SQLite writes to memory-mapped files using
 // memcpy(), which should stay consistent.  Our SQLite is slightly patched to
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 798a1faf..bfd89da 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -1004,6 +1004,9 @@
       'Linux Tests Code Coverage',
       'GPU Linux Builder Code Coverage',
       'Linux Release Code Coverage (NVIDIA)',
+      # chromium.memory. exists, but is omitted from consoles for now.
+      # https://crbug.com/790202
+      'android-asan'
     ]
 
   def check_input_file_consistency(self, verbose=False):
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index d2a9d41f..dc350107 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4873,6 +4873,26 @@
             ]
         }
     ],
+    "SqlSkipPreload": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "ios",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "SqlSkipPreload"
+                    ]
+                }
+            ]
+        }
+    ],
     "StabilityDebugging": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index bb58e43..22ec927 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -100,7 +100,7 @@
 // Enable off-the-main-thread service worker script fetch.
 // (https://crbug.com/924043)
 const base::Feature kOffMainThreadServiceWorkerScriptFetch{
-    "OffMainThreadServiceWorkerScriptFetch", base::FEATURE_DISABLED_BY_DEFAULT};
+    "OffMainThreadServiceWorkerScriptFetch", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable off-the-main-thread shared worker script fetch.
 // (https://crbug.com/924041)
diff --git a/third_party/blink/public/common/css/OWNERS b/third_party/blink/public/common/css/OWNERS
index b5ccf8dc..261f7b8 100644
--- a/third_party/blink/public/common/css/OWNERS
+++ b/third_party/blink/public/common/css/OWNERS
@@ -1,4 +1,4 @@
 file://third_party/blink/renderer/core/css/OWNERS
 
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
-
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 9211755..f2a375b8 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -104,7 +104,6 @@
 class WebAudioBus;
 class WebAudioLatencyHint;
 class WebBlobRegistry;
-class WebCookieJar;
 class WebCrypto;
 class WebDatabaseObserver;
 class WebDedicatedWorker;
@@ -177,9 +176,6 @@
   Platform();
   virtual ~Platform();
 
-  // May return null.
-  virtual WebCookieJar* CookieJar() { return nullptr; }
-
   // May return null if sandbox support is not necessary
   virtual WebSandboxSupport* GetSandboxSupport() { return nullptr; }
 
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index a1b8fb1..084381d 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -196,8 +196,7 @@
 
   // Services ------------------------------------------------------------
 
-  // A frame specific cookie jar.  May return null, in which case
-  // WebKitPlatformSupport::cookieJar() will be called to access cookies.
+  // A frame specific cookie jar.  May return null.
   virtual WebCookieJar* CookieJar() { return nullptr; }
 
   // Returns a blame context for attributing work belonging to this frame.
diff --git a/third_party/blink/public/web/web_view_client.h b/third_party/blink/public/web/web_view_client.h
index 3bfbc776..e8d46f6 100644
--- a/third_party/blink/public/web/web_view_client.h
+++ b/third_party/blink/public/web/web_view_client.h
@@ -42,7 +42,7 @@
 
 namespace blink {
 
-class WebNode;
+class WebElement;
 class WebPagePopup;
 class WebURL;
 class WebURLRequest;
@@ -123,10 +123,10 @@
   virtual void FocusNext() {}
   virtual void FocusPrevious() {}
 
-  // Called when a new node gets focused. |fromNode| is the previously focused
-  // node, |toNode| is the newly focused node. Either can be null.
-  virtual void FocusedNodeChanged(const WebNode& from_node,
-                                  const WebNode& to_node) {}
+  // Called when a new element gets focused. |from_element| is the previously
+  // focused element, |to_element| is the newly focused one. Either can be null.
+  virtual void FocusedElementChanged(const WebElement& from_element,
+                                     const WebElement& to_element) {}
 
   // Called to check if layout update should be processed.
   virtual bool CanUpdateLayout() { return false; }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
index 0662945..49e6343 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -347,8 +348,8 @@
   ScriptValue on_fulfilled, on_rejected;
   ScriptPromise promise = ScriptPromise::RejectWithDOMException(
       scope.GetScriptState(),
-      DOMException::Create(DOMExceptionCode::kSyntaxError,
-                           "some syntax error"));
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError,
+                                         "some syntax error"));
   promise.Then(FunctionForScriptPromiseTest::CreateFunction(
                    scope.GetScriptState(), &on_fulfilled),
                FunctionForScriptPromiseTest::CreateFunction(
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.cc b/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.cc
index 96a5d4c1..8419c898 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -54,7 +55,7 @@
   if (isolate->IsExecutionTerminating())
     return v8::Local<v8::Value>();
 
-  DOMException* dom_exception = DOMException::Create(
+  auto* dom_exception = MakeGarbageCollected<DOMException>(
       exception_code, sanitized_message, unsanitized_message);
   v8::Local<v8::Object> exception_obj =
       ToV8(dom_exception, isolate->GetCurrentContext()->Global(), isolate)
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h b/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h
index 45694c4..97980a71 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h
+++ b/third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h
@@ -22,8 +22,8 @@
   static void Init();
 
   // Creates and returns a DOMException object, or returns an empty handle if
-  // the isolate is being terminated. Unlike DOMException::Create, this function
-  // associates the stacktrace with the returned object.
+  // the isolate is being terminated. Unlike the DOMException constructor,
+  // this function associates the stacktrace with the returned object.
   //
   // |unsanitized_message| should be specified iff SecurityError.
   static v8::Local<v8::Value> CreateOrEmpty(
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
index eab38972..831ed96 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/raw_resource.h"
@@ -112,7 +113,8 @@
   }
 
   void AbortFromClient() {
-    auto* exception = DOMException::Create(DOMExceptionCode::kAbortError);
+    auto* exception =
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError);
     ScriptState::Scope scope(script_state_);
 
     // Calling ToV8 in a ScriptForbiddenScope will trigger a CHECK and
diff --git a/third_party/blink/renderer/build/scripts/core/css/OWNERS b/third_party/blink/renderer/build/scripts/core/css/OWNERS
index 863b76f..dc98a90e 100644
--- a/third_party/blink/renderer/build/scripts/core/css/OWNERS
+++ b/third_party/blink/renderer/build/scripts/core/css/OWNERS
@@ -4,4 +4,5 @@
 shend@chromium.org
 meade@chromium.org
 
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
index e689518..a33809d5 100644
--- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h
+++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -93,8 +93,8 @@
   // Returns true if the AXObjectCache cares about this attribute
   virtual bool HandleAttributeChanged(const QualifiedName& attr_name,
                                       Element*) = 0;
-  virtual void HandleFocusedUIElementChanged(Node* old_focused_node,
-                                             Node* new_focused_node) = 0;
+  virtual void HandleFocusedUIElementChanged(Element* old_focused_node,
+                                             Element* new_focused_node) = 0;
   virtual void HandleInitialFocus() = 0;
   virtual void HandleEditableTextContentChanged(Node*) = 0;
   virtual void HandleScaleAndLocationChanged(Document*) = 0;
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 03c555d..d5eaaea 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -52,6 +52,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/animation/compositor_animation.h"
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
@@ -1460,7 +1461,8 @@
 }
 
 void Animation::RejectAndResetPromise(AnimationPromise* promise) {
-  promise->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+  promise->Reject(
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   promise->Reset();
 }
 
diff --git a/third_party/blink/renderer/core/css/OWNERS b/third_party/blink/renderer/core/css/OWNERS
index 070536a..d1eb1c3 100644
--- a/third_party/blink/renderer/core/css/OWNERS
+++ b/third_party/blink/renderer/core/css/OWNERS
@@ -3,4 +3,5 @@
 ericwilligers@chromium.org
 futhark@chromium.org
 
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc
index d54ccb594..1454643c 100644
--- a/third_party/blink/renderer/core/css/css_style_sheet.cc
+++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -497,8 +497,8 @@
   if (!resolver_)
     return;
   if (load_error_occured) {
-    resolver_->Reject(DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                                           "Loading @imports failed."));
+    resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotAllowedError, "Loading @imports failed."));
   } else {
     resolver_->Resolve(this);
   }
diff --git a/third_party/blink/renderer/core/css/font_face.cc b/third_party/blink/renderer/core/css/font_face.cc
index d7be19da..2350a25 100644
--- a/third_party/blink/renderer/core/css/font_face.cc
+++ b/third_party/blink/renderer/core/css/font_face.cc
@@ -125,10 +125,10 @@
 
   const CSSValue* src = ParseCSSValue(context, source, AtRuleDescriptorID::Src);
   if (!src || !src->IsValueList()) {
-    font_face->SetError(
-        DOMException::Create(DOMExceptionCode::kSyntaxError,
-                             "The source provided ('" + source +
-                                 "') could not be parsed as a value list."));
+    font_face->SetError(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kSyntaxError,
+        "The source provided ('" + source +
+            "') could not be parsed as a value list."));
   }
 
   font_face->InitCSSFontFace(context, *src);
@@ -307,10 +307,12 @@
     return;
 
   String message = "Failed to set '" + s + "' as a property value.";
-  if (exception_state)
+  if (exception_state) {
     exception_state->ThrowDOMException(DOMExceptionCode::kSyntaxError, message);
-  else
-    SetError(DOMException::Create(DOMExceptionCode::kSyntaxError, message));
+  } else {
+    SetError(MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError,
+                                                message));
+  }
 }
 
 bool FontFace::SetPropertyFromStyle(const CSSPropertyValueSet& properties,
@@ -450,8 +452,9 @@
 
 void FontFace::SetError(DOMException* error) {
   if (!error_) {
-    error_ =
-        error ? error : DOMException::Create(DOMExceptionCode::kNetworkError);
+    error_ = error ? error
+                   : MakeGarbageCollected<DOMException>(
+                         DOMExceptionCode::kNetworkError);
   }
   SetLoadStatus(kError);
 }
@@ -743,11 +746,12 @@
   BinaryDataFontFaceSource* source =
       MakeGarbageCollected<BinaryDataFontFaceSource>(buffer.get(),
                                                      ots_parse_message_);
-  if (source->IsValid())
+  if (source->IsValid()) {
     SetLoadStatus(kLoaded);
-  else
-    SetError(DOMException::Create(DOMExceptionCode::kSyntaxError,
-                                  "Invalid font data in ArrayBuffer."));
+  } else {
+    SetError(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kSyntaxError, "Invalid font data in ArrayBuffer."));
+  }
   css_font_face_->AddSource(source);
 }
 
diff --git a/third_party/blink/renderer/core/css/font_face.idl b/third_party/blink/renderer/core/css/font_face.idl
index 0078fab9..3487e4d 100644
--- a/third_party/blink/renderer/core/css/font_face.idl
+++ b/third_party/blink/renderer/core/css/font_face.idl
@@ -39,7 +39,7 @@
 
 [
     ActiveScriptWrappable,
-    Exposed(Window StableBlinkFeatures, Worker OffscreenCanvasText),
+    Exposed=(Window,Worker),
     // FIXME: This should be (DOMString or BinaryData), where BinaryData is typedef of (ArrayBuffer or ArrayBufferView)
     Constructor(DOMString family, (DOMString or ArrayBuffer or ArrayBufferView) source, optional FontFaceDescriptors descriptors),
     ConstructorCallWith=ExecutionContext,
diff --git a/third_party/blink/renderer/core/css/font_face_set.cc b/third_party/blink/renderer/core/css/font_face_set.cc
index c4ec50b2..7c1d4d8 100644
--- a/third_party/blink/renderer/core/css/font_face_set.cc
+++ b/third_party/blink/renderer/core/css/font_face_set.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/core/css/font_face_cache.h"
 #include "third_party/blink/renderer/core/css/font_face_set_load_event.h"
 #include "third_party/blink/renderer/platform/fonts/font.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -165,7 +166,7 @@
   if (!ResolveFontStyle(font_string, font)) {
     auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
     ScriptPromise promise = resolver->Promise();
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kSyntaxError,
         "Could not resolve '" + font_string + "' as a font."));
     return promise;
diff --git a/third_party/blink/renderer/core/css/font_face_set.idl b/third_party/blink/renderer/core/css/font_face_set.idl
index f1f94a1..d8b2e3e2 100644
--- a/third_party/blink/renderer/core/css/font_face_set.idl
+++ b/third_party/blink/renderer/core/css/font_face_set.idl
@@ -36,7 +36,7 @@
 // [NoInterfaceObject]
 [
     NoInterfaceObject,
-    Exposed(Window StableBlinkFeatures, Worker OffscreenCanvasText)
+    Exposed=(Window,Worker)
 ] interface FontFaceSet : EventTarget {
     setlike<FontFace>;
 
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
index 2aede93..fea89f4 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -24,6 +24,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/paint/pre_paint_tree_walk.h"
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -63,8 +64,8 @@
                                  const char* rejection_reason) {
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   auto promise = resolver->Promise();
-  resolver->Reject(DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                                        rejection_reason));
+  resolver->Reject(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kNotAllowedError, rejection_reason));
   return promise;
 }
 
@@ -340,7 +341,7 @@
       break;
     case kReject:
       DCHECK(rejection_reason);
-      (*resolver)->Reject(DOMException::Create(
+      (*resolver)->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotAllowedError, rejection_reason));
       break;
     case kDetach:
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 709e8f7..8cf39659 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -4811,8 +4811,8 @@
                                          kWebFocusTypeNone, nullptr));
 }
 
-void Document::NotifyFocusedElementChanged(Node* old_focused_element,
-                                           Node* new_focused_element) {
+void Document::NotifyFocusedElementChanged(Element* old_focused_element,
+                                           Element* new_focused_element) {
   if (new_focused_element) {
     if (AXObjectCache* cache = ExistingAXObjectCache()) {
       cache->HandleFocusedUIElementChanged(old_focused_element,
@@ -4821,8 +4821,8 @@
   }
 
   if (GetPage()) {
-    GetPage()->GetChromeClient().FocusedNodeChanged(old_focused_element,
-                                                    new_focused_element);
+    GetPage()->GetChromeClient().FocusedElementChanged(old_focused_element,
+                                                       new_focused_element);
     if (GetSettings()->GetSpatialNavigationEnabled())
       GetPage()->GetSpatialNavigationController().FocusedNodeChanged(this);
   }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 8c63d2b..4fea061 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1703,8 +1703,8 @@
     is_freezing_in_progress_ = is_freezing_in_progress;
   }
 
-  void NotifyFocusedElementChanged(Node* old_focused_element,
-                                   Node* new_focused_element);
+  void NotifyFocusedElementChanged(Element* old_focused_element,
+                                   Element* new_focused_element);
   void DisplayNoneChangedForFrame();
 
   DocumentLifecycle lifecycle_;
diff --git a/third_party/blink/renderer/core/dom/document_test.cc b/third_party/blink/renderer/core/dom/document_test.cc
index 4d4b713..84c7981e 100644
--- a/third_party/blink/renderer/core/dom/document_test.cc
+++ b/third_party/blink/renderer/core/dom/document_test.cc
@@ -322,7 +322,7 @@
   void DocumentDetached(const Document&) override {
     document_detached_was_called = true;
   }
-  void DidChangeFocusTo(const Node*) override {}
+  void DidChangeFocusTo(const Element*) override {}
   void WillBeDestroyed() override {}
 
   // virtual void Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/dom/dom_exception.cc b/third_party/blink/renderer/core/dom/dom_exception.cc
index 4922d7e..5fb53bf 100644
--- a/third_party/blink/renderer/core/dom/dom_exception.cc
+++ b/third_party/blink/renderer/core/dom/dom_exception.cc
@@ -208,6 +208,18 @@
   return entry->message;
 }
 
+DOMException::DOMException(DOMExceptionCode exception_code,
+                           const String& sanitized_message,
+                           const String& unsanitized_message)
+    : DOMException(ToLegacyErrorCode(FindErrorEntry(exception_code)->code),
+                   FindErrorEntry(exception_code)->name
+                       ? FindErrorEntry(exception_code)->name
+                       : "Error",
+                   sanitized_message.IsNull()
+                       ? String(FindErrorEntry(exception_code)->message)
+                       : sanitized_message,
+                   unsanitized_message) {}
+
 DOMException::DOMException(uint16_t legacy_code,
                            const String& name,
                            const String& sanitized_message,
diff --git a/third_party/blink/renderer/core/dom/dom_exception.h b/third_party/blink/renderer/core/dom/dom_exception.h
index 8096926..f52d6645 100644
--- a/third_party/blink/renderer/core/dom/dom_exception.h
+++ b/third_party/blink/renderer/core/dom/dom_exception.h
@@ -49,6 +49,12 @@
   // Constructor exposed to script.
   static DOMException* Create(const String& message, const String& name);
 
+  // This constructor shouldn't be used except for V8ThrowDOMException. Note
+  // that this constructor does not associate the stacktrace with the created
+  // object.
+  DOMException(DOMExceptionCode,
+               const String& sanitized_message = String(),
+               const String& unsanitized_message = String());
   DOMException(uint16_t legacy_code,
                const String& name,
                const String& sanitized_message,
diff --git a/third_party/blink/renderer/core/fetch/body.cc b/third_party/blink/renderer/core/fetch/body.cc
index 3c7d5c4..fe14d5ac 100644
--- a/third_party/blink/renderer/core/fetch/body.cc
+++ b/third_party/blink/renderer/core/fetch/body.cc
@@ -47,7 +47,8 @@
   }
 
   void Abort() override {
-    resolver_->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+    resolver_->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   }
 
   // Resource Timing event is not yet added, so delay the resolution timing
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
index 376bb97..ea4e59e 100644
--- a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
+++ b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/network/encoded_form_data.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -393,7 +394,8 @@
     DCHECK(!consumer_);
     return;
   }
-  Controller()->Error(DOMException::Create(DOMExceptionCode::kAbortError));
+  Controller()->Error(
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   CancelConsumer();
 }
 
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc
index fd601158..0b8b34d 100644
--- a/third_party/blink/renderer/core/fetch/fetch_manager.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -4,7 +4,8 @@
 
 #include "third_party/blink/renderer/core/fetch/fetch_manager.h"
 
-#include <memory>
+#include <utility>
+
 #include "base/single_thread_task_runner.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "third_party/blink/public/platform/web_url_request.h"
@@ -34,6 +35,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/fetch/buffering_bytes_consumer.h"
@@ -634,7 +636,8 @@
 
 void FetchManager::Loader::Abort() {
   if (resolver_) {
-    resolver_->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+    resolver_->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
     resolver_.Clear();
   }
   if (threadable_loader_) {
@@ -843,7 +846,8 @@
 
   DCHECK(signal);
   if (signal->aborted()) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
     return promise;
   }
 
diff --git a/third_party/blink/renderer/core/fileapi/file_error.cc b/third_party/blink/renderer/core/fileapi/file_error.cc
index 4fbca677..8445e59 100644
--- a/third_party/blink/renderer/core/fileapi/file_error.cc
+++ b/third_party/blink/renderer/core/fileapi/file_error.cc
@@ -32,6 +32,7 @@
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
@@ -270,14 +271,14 @@
 
 DOMException* CreateDOMException(FileErrorCode code) {
   DCHECK_NE(code, FileErrorCode::kOK);
-  return DOMException::Create(ErrorCodeToExceptionCode(code),
-                              ErrorCodeToMessage(code));
+  return MakeGarbageCollected<DOMException>(ErrorCodeToExceptionCode(code),
+                                            ErrorCodeToMessage(code));
 }
 
 DOMException* CreateDOMException(base::File::Error code) {
   DCHECK_NE(code, base::File::FILE_OK);
-  return DOMException::Create(FileErrorToExceptionCode(code),
-                              FileErrorToMessage(code));
+  return MakeGarbageCollected<DOMException>(FileErrorToExceptionCode(code),
+                                            FileErrorToMessage(code));
 }
 
 }  // namespace file_error
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
index 8bc8bc1..9b28d20 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
@@ -363,12 +363,6 @@
   WebMouseEvent transformed_event =
       TransformWebMouseEvent(local_root_->GetFrameView(), mouse_event);
 
-  LocalFrame* focusedFrame = FocusedLocalFrameInWidget();
-  if (focusedFrame) {
-    focusedFrame->GetEventHandler().ProcessPendingPointerCaptureForPointerLock(
-        transformed_event);
-  }
-
   std::unique_ptr<UserGestureIndicator> gesture_indicator;
   AtomicString event_type;
   switch (input_event.GetType()) {
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
index 9937ec80b..4f6c7a1 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/platform/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/graphics/image_data_buffer.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
@@ -464,9 +465,9 @@
                           V8BlobCallback>::InvokeAndReportException,
                       WrapPersistent(callback_.Get()), nullptr, nullptr));
   } else {
-    script_promise_resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kEncodingError,
-                             "Encoding of the source image has failed."));
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kEncodingError,
+        "Encoding of the source image has failed."));
   }
   // Avoid unwanted retention, see dispose().
   Dispose();
diff --git a/third_party/blink/renderer/core/html/canvas/image_data.cc b/third_party/blink/renderer/core/html/canvas/image_data.cc
index e1a7c93f..900544d 100644
--- a/third_party/blink/renderer/core/html/canvas/image_data.cc
+++ b/third_party/blink/renderer/core/html/canvas/image_data.cc
@@ -552,9 +552,9 @@
                                            const ImageBitmapOptions* options) {
   if (BufferBase()->IsNeutered()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The source data has been detached."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "The source data has been detached."));
   }
   return ImageBitmapSource::FulfillImageBitmap(
       script_state, ImageBitmap::Create(this, crop_rect, options));
diff --git a/third_party/blink/renderer/core/html/canvas/image_element_base.cc b/third_party/blink/renderer/core/html/canvas/image_element_base.cc
index ad3bb0f..34790e4 100644
--- a/third_party/blink/renderer/core/html/canvas/image_element_base.cc
+++ b/third_party/blink/renderer/core/html/canvas/image_element_base.cc
@@ -142,7 +142,7 @@
   if (!image_content) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "No image can be retrieved from the provided element."));
   }
@@ -153,7 +153,7 @@
          (!options->hasResizeWidth() || !options->hasResizeHeight()))) {
       return ScriptPromise::RejectWithDOMException(
           script_state,
-          DOMException::Create(
+          MakeGarbageCollected<DOMException>(
               DOMExceptionCode::kInvalidStateError,
               "The image element contains an SVG image without intrinsic "
               "dimensions, and no resize options or crop region are "
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
index 3eadd53..2183ac6 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
@@ -43,7 +43,7 @@
   }
 
   void DocumentDetached(const Document&) override {}
-  void DidChangeFocusTo(const Node*) override {}
+  void DidChangeFocusTo(const Element*) override {}
   void WillBeDestroyed() override {}
   void Trace(Visitor* visitor) override {
     visitor->Trace(anchor_);
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 6c8d67c..11e8ba3 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -2402,7 +2402,7 @@
       default:
         NOTREACHED();
     }
-    resolver->Reject(DOMException::Create(code.value(), message));
+    resolver->Reject(MakeGarbageCollected<DOMException>(code.value(), message));
     return promise;
   }
 
@@ -4059,7 +4059,7 @@
          code == DOMExceptionCode::kNotSupportedError);
 
   for (auto& resolver : play_promise_reject_list_)
-    resolver->Reject(DOMException::Create(code, message));
+    resolver->Reject(MakeGarbageCollected<DOMException>(code, message));
 
   play_promise_reject_list_.clear();
 }
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc
index 8244dcc1..10a1cfc 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -685,14 +685,14 @@
   DCHECK(event_target.ToLocalDOMWindow());
   if (getNetworkState() == HTMLMediaElement::kNetworkEmpty) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The provided element has not retrieved data."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "The provided element has not retrieved data."));
   }
   if (getReadyState() <= HTMLMediaElement::kHaveMetadata) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "The provided element's player has no current data."));
   }
diff --git a/third_party/blink/renderer/core/html/portal/html_portal_element.cc b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
index 82a47d7..bf97a2d 100644
--- a/third_party/blink/renderer/core/html/portal/html_portal_element.cc
+++ b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
@@ -60,9 +60,18 @@
 
 void HTMLPortalElement::Navigate() {
   KURL url = GetNonEmptyURLAttribute(html_names::kSrcAttr);
-  if (!url.IsEmpty() && portal_ptr_) {
-    portal_ptr_->Navigate(url);
+  if (!portal_ptr_ || url.IsEmpty())
+    return;
+
+  if (!url.ProtocolIsInHTTPFamily()) {
+    GetDocument().AddConsoleMessage(ConsoleMessage::Create(
+        mojom::ConsoleMessageSource::kRendering,
+        mojom::ConsoleMessageLevel::kWarning,
+        "Portals only allow navigation to protocols in the HTTP family."));
+    return;
   }
+
+  portal_ptr_->Navigate(url);
 }
 
 void HTMLPortalElement::ConsumePortal() {
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
index 70230cf..620fd34 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/scoped_refptr.h"
 #include "base/numerics/checked_math.h"
@@ -978,9 +979,9 @@
   ParsedOptions parsed_options =
       ParseOptions(options, crop_rect, image->BitmapSourceSize());
   if (DstBufferSizeHasOverflow(parsed_options)) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The ImageBitmap could not be allocated."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "The ImageBitmap could not be allocated."));
     return promise;
   }
 
@@ -997,9 +998,9 @@
       bitmap->BitmapImage()->SetOriginClean(!image->WouldTaintOrigin());
       resolver->Resolve(bitmap);
     } else {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               "The ImageBitmap could not be allocated."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "The ImageBitmap could not be allocated."));
     }
     return promise;
   }
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
index fec9bcc..9c2ff5bd 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/location.h"
 #include "third_party/blink/public/platform/platform.h"
@@ -198,7 +199,7 @@
       bitmap_source->BitmapSourceSize().Height() == 0) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             String::Format("The source image %s is 0.",
                            bitmap_source->BitmapSourceSize().Width()
@@ -273,14 +274,14 @@
     ImageBitmapRejectionReason reason) {
   switch (reason) {
     case kUndecodableImageBitmapRejectionReason:
-      resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               "The source image could not be decoded."));
+      resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "The source image could not be decoded."));
       break;
     case kAllocationFailureImageBitmapRejectionReason:
-      resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               "The ImageBitmap could not be allocated."));
+      resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "The ImageBitmap could not be allocated."));
       break;
     default:
       NOTREACHED();
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_source.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_source.cc
index a2854e7b..ff800de 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_source.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_source.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap_options.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -17,9 +18,9 @@
   if (image_bitmap && image_bitmap->BitmapImage()) {
     resolver->Resolve(image_bitmap);
   } else {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The ImageBitmap could not be allocated."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "The ImageBitmap could not be allocated."));
   }
   return promise;
 }
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index e0ba794e..74a7e14 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -1337,12 +1337,6 @@
   }
 }
 
-void EventHandler::ProcessPendingPointerCaptureForPointerLock(
-    const WebMouseEvent& mouse_event) {
-  pointer_event_manager_->ProcessPendingPointerCaptureForPointerLock(
-      mouse_event);
-}
-
 void EventHandler::ElementRemoved(Element* target) {
   pointer_event_manager_->ElementRemoved(target);
   if (target)
diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h
index 001f2989..5701c46 100644
--- a/third_party/blink/renderer/core/input/event_handler.h
+++ b/third_party/blink/renderer/core/input/event_handler.h
@@ -228,7 +228,6 @@
   void ReleasePointerCapture(PointerId, Element*);
   void ReleaseMousePointerCapture();
   bool HasPointerCapture(PointerId, const Element*) const;
-  void ProcessPendingPointerCaptureForPointerLock(const WebMouseEvent&);
 
   void ElementRemoved(Element*);
 
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index 4f41a64..4c8debe8 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -620,7 +620,8 @@
     const AtomicString& mouse_event_name,
     const WebMouseEvent& mouse_event,
     const Vector<WebMouseEvent>& coalesced_events,
-    const Vector<WebMouseEvent>& predicted_events) {
+    const Vector<WebMouseEvent>& predicted_events,
+    const String& canvas_region_id) {
   WebInputEvent::Type event_type;
   // TODO(crbug.com/665924): The following ifs skip the mouseover/leave cases,
   // we should fixed them when further merge the code path.
@@ -644,6 +645,10 @@
   PointerEvent* pointer_event = pointer_event_factory_.Create(
       web_pointer_event, pointer_coalesced_events, pointer_predicted_events,
       target->GetDocument().domWindow());
+
+  ProcessCaptureAndPositionOfPointerEvent(pointer_event, target,
+                                          canvas_region_id, &mouse_event);
+
   return DispatchPointerEvent(target, pointer_event);
 }
 
@@ -662,7 +667,8 @@
       pointer_event_factory_.GetLastPointerPosition(
           PointerEventFactory::kMouseId, event);
   WebInputEventResult result = CreateAndDispatchPointerEvent(
-      target, mouse_event_type, event, coalesced_events, predicted_events);
+      target, mouse_event_type, event, coalesced_events, predicted_events,
+      canvas_region_id);
 
   result = event_handling_util::MergeEventResult(
       result, mouse_event_manager_->DispatchMouseEvent(
@@ -909,15 +915,6 @@
   }
 }
 
-void PointerEventManager::ProcessPendingPointerCaptureForPointerLock(
-    const WebMouseEvent& mouse_event) {
-  PointerEvent* pointer_event = pointer_event_factory_.Create(
-      WebPointerEvent(WebInputEvent::kPointerMove, mouse_event),
-      Vector<WebPointerEvent>(), Vector<WebPointerEvent>(),
-      frame_->GetDocument()->domWindow());
-  ProcessPendingPointerCapture(pointer_event);
-}
-
 void PointerEventManager::RemoveTargetFromPointerCapturingMapping(
     PointerCapturingMap& map,
     const Element* target) {
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.h b/third_party/blink/renderer/core/input/pointer_event_manager.h
index 63b7376..b3dbf065 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.h
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.h
@@ -96,8 +96,6 @@
   // |m_touchIdsForCanceledPointerdowns|.
   bool PrimaryPointerdownCanceled(uint32_t unique_touch_event_id);
 
-  void ProcessPendingPointerCaptureForPointerLock(const WebMouseEvent&);
-
   void RemoveLastMousePosition();
 
   Element* GetMouseCaptureTarget();
@@ -170,7 +168,8 @@
       const AtomicString& mouse_event_name,
       const WebMouseEvent&,
       const Vector<WebMouseEvent>& coalesced_events,
-      const Vector<WebMouseEvent>& predicted_events);
+      const Vector<WebMouseEvent>& predicted_events,
+      const String& canvas_region_id);
 
   // Returns PointerEventTarget for a WebTouchPoint, hit-testing as necessary.
   event_handling_util::PointerEventTarget ComputePointerEventTarget(
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
index c4e77561..35eb165 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -2200,7 +2200,7 @@
         "No layout object for node, perhaps orphan or hidden node");
   }
   while (layout_object && !layout_object->IsDocumentElement() &&
-         !layout_object->IsRelayoutBoundaryForInspector())
+         !layout_object->IsRelayoutBoundary())
     layout_object = layout_object->Container();
   Node* result_node =
       layout_object ? layout_object->GeneratingNode() : node->ownerDocument();
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index b5bfa26f..7ed6d9d8 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3761,7 +3761,7 @@
   return AffineTransform();
 }
 
-bool LayoutObject::IsRelayoutBoundaryForInspector() const {
+bool LayoutObject::IsRelayoutBoundary() const {
   return ObjectIsRelayoutBoundary(this);
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 7577d63..172ed30 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1963,7 +1963,7 @@
   static RespectImageOrientationEnum ShouldRespectImageOrientation(
       const LayoutObject*);
 
-  bool IsRelayoutBoundaryForInspector() const;
+  bool IsRelayoutBoundary() const;
 
   // The visual rect, in the the space of the paint invalidation container
   // (*not* the graphics layer that paints this object).
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
index 79cc220..dd57e57 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
@@ -78,14 +78,23 @@
     // See NGPhysicalBoxFragment::AddSelfOutlineRects().
     if (!child->IsLineBox()) {
       LayoutObject* child_layout_object = child->GetLayoutObject();
-      auto* child_layout_block_flow =
-          DynamicTo<LayoutBlockFlow>(child_layout_object);
-      if (child_layout_object->IsElementContinuation() ||
-          (child_layout_block_flow &&
-           child_layout_block_flow->IsAnonymousBlockContinuation()))
-        continue;
+      if (auto* child_layout_block_flow =
+              DynamicTo<LayoutBlockFlow>(child_layout_object)) {
+        if (child_layout_object->IsElementContinuation() ||
+            child_layout_block_flow->IsAnonymousBlockContinuation())
+          continue;
+        if (child_layout_block_flow->IsRelayoutBoundary()) {
+          const NGPhysicalBoxFragment* maybe_new_child_fragment =
+              child_layout_block_flow->CurrentFragment();
+          if (maybe_new_child_fragment) {
+            AddOutlineRectsForDescendant(
+                {maybe_new_child_fragment, child.Offset()}, outline_rects,
+                additional_offset, outline_type, containing_block);
+            continue;
+          }
+        }
+      }
     }
-
     AddOutlineRectsForDescendant(child, outline_rects, additional_offset,
                                  outline_type, containing_block);
   }
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h
index bad424f0c..f76380c 100644
--- a/third_party/blink/renderer/core/loader/empty_clients.h
+++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -90,7 +90,7 @@
   bool CanTakeFocus(WebFocusType) override { return false; }
   void TakeFocus(WebFocusType) override {}
 
-  void FocusedNodeChanged(Node*, Node*) override {}
+  void FocusedElementChanged(Element*, Element*) override {}
   void Show(NavigationPolicy) override {}
 
   void DidOverscroll(const FloatSize&,
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index b4f070f..7e80e98 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
@@ -959,7 +960,7 @@
 }
 
 void ImageLoader::DecodeRequest::Reject() {
-  resolver_->Reject(DOMException::Create(
+  resolver_->Reject(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kEncodingError, "The source image cannot be decoded."));
   loader_ = nullptr;
 }
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.idl b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.idl
index 42ed441..e4a142fa 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.idl
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.idl
@@ -8,7 +8,6 @@
     Constructor([EnforceRange] unsigned long width, [EnforceRange] unsigned long height),
     Exposed=(Window,Worker),
     Transferable,
-    RuntimeEnabled=OffscreenCanvas,
     MeasureAs=OffscreenCanvas
 ] interface OffscreenCanvas : EventTarget {
     attribute [EnforceRange] unsigned long width;
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h
index cd14d2d..8187609 100644
--- a/third_party/blink/renderer/core/page/chrome_client.h
+++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -136,7 +136,7 @@
   virtual bool CanTakeFocus(WebFocusType) = 0;
   virtual void TakeFocus(WebFocusType) = 0;
 
-  virtual void FocusedNodeChanged(Node*, Node*) = 0;
+  virtual void FocusedElementChanged(Element*, Element*) = 0;
 
   virtual bool HadFormInteraction() const = 0;
 
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 874d864..a42ab26e 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -217,18 +217,21 @@
     web_view_->Client()->FocusNext();
 }
 
-void ChromeClientImpl::FocusedNodeChanged(Node* from_node, Node* to_node) {
-  web_view_->GetPage()->GetValidationMessageClient().DidChangeFocusTo(to_node);
+void ChromeClientImpl::FocusedElementChanged(Element* from_element,
+                                             Element* to_element) {
+  web_view_->GetPage()->GetValidationMessageClient().DidChangeFocusTo(
+      to_element);
 
   if (!web_view_->Client())
     return;
 
-  web_view_->Client()->FocusedNodeChanged(WebNode(from_node), WebNode(to_node));
+  web_view_->Client()->FocusedElementChanged(WebElement(from_element),
+                                             WebElement(to_element));
 
   WebURL focus_url;
-  if (to_node && to_node->IsElementNode() && ToElement(to_node)->IsLiveLink() &&
-      to_node->ShouldHaveFocusAppearance())
-    focus_url = ToElement(to_node)->HrefURL();
+  if (to_element && to_element->IsLiveLink() &&
+      to_element->ShouldHaveFocusAppearance())
+    focus_url = to_element->HrefURL();
   web_view_->Client()->SetKeyboardFocusURL(focus_url);
 }
 
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h
index 6bc9235..6b033d00 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.h
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -66,7 +66,7 @@
   void Focus(LocalFrame*) override;
   bool CanTakeFocus(WebFocusType) override;
   void TakeFocus(WebFocusType) override;
-  void FocusedNodeChanged(Node* from_node, Node* to_node) override;
+  void FocusedElementChanged(Element* from_node, Element* to_node) override;
   void BeginLifecycleUpdates() override;
   void StartDeferringCommits(base::TimeDelta timeout) override;
   void StopDeferringCommits() override;
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
index aefc9e1..4f00762 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -825,6 +825,10 @@
   DCHECK(object);
   DCHECK(object->GetFrame());
 
+  // TODO(bokan): Speculative fix for https://crbug.com/964293.
+  if (!object || !object->GetNode())
+    return true;
+
   const LocalFrame& frame = *object->GetFrame();
 
   // If we're in an iframe document, we need to determine if the containing
diff --git a/third_party/blink/renderer/core/page/validation_message_client.h b/third_party/blink/renderer/core/page/validation_message_client.h
index beb9806..0942526 100644
--- a/third_party/blink/renderer/core/page/validation_message_client.h
+++ b/third_party/blink/renderer/core/page/validation_message_client.h
@@ -58,7 +58,7 @@
   virtual bool IsValidationMessageVisible(const Element& anchor) = 0;
 
   virtual void DocumentDetached(const Document&) = 0;
-  virtual void DidChangeFocusTo(const Node* new_node) = 0;
+  virtual void DidChangeFocusTo(const Element* new_element) = 0;
 
   virtual void WillBeDestroyed() = 0;
 
diff --git a/third_party/blink/renderer/core/page/validation_message_client_impl.cc b/third_party/blink/renderer/core/page/validation_message_client_impl.cc
index f88383a..1566385 100644
--- a/third_party/blink/renderer/core/page/validation_message_client_impl.cc
+++ b/third_party/blink/renderer/core/page/validation_message_client_impl.cc
@@ -155,8 +155,8 @@
     HideValidationMessageImmediately(*current_anchor_);
 }
 
-void ValidationMessageClientImpl::DidChangeFocusTo(const Node* new_node) {
-  if (current_anchor_ && current_anchor_ != new_node)
+void ValidationMessageClientImpl::DidChangeFocusTo(const Element* new_element) {
+  if (current_anchor_ && current_anchor_ != new_element)
     HideValidationMessageImmediately(*current_anchor_);
 }
 
diff --git a/third_party/blink/renderer/core/page/validation_message_client_impl.h b/third_party/blink/renderer/core/page/validation_message_client_impl.h
index d0f965f..5ca11d34 100644
--- a/third_party/blink/renderer/core/page/validation_message_client_impl.h
+++ b/third_party/blink/renderer/core/page/validation_message_client_impl.h
@@ -67,7 +67,7 @@
   void HideValidationMessage(const Element& anchor) override;
   bool IsValidationMessageVisible(const Element& anchor) override;
   void DocumentDetached(const Document&) override;
-  void DidChangeFocusTo(const Node* new_node) override;
+  void DidChangeFocusTo(const Element* new_element) override;
   void WillBeDestroyed() override;
   void LayoutOverlay() override;
   void UpdatePrePaint() override;
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.cc b/third_party/blink/renderer/core/scroll/scrollable_area.cc
index 51e1e02..6435ea3 100644
--- a/third_party/blink/renderer/core/scroll/scrollable_area.cc
+++ b/third_party/blink/renderer/core/scroll/scrollable_area.cc
@@ -51,8 +51,6 @@
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 
-static const float kMinFractionToStepWhenPaging = 0.875f;
-
 namespace blink {
 
 int ScrollableArea::PixelsPerLineStep(ChromeClient* host) {
diff --git a/third_party/blink/renderer/core/style/OWNERS b/third_party/blink/renderer/core/style/OWNERS
index 070536a..d1eb1c3 100644
--- a/third_party/blink/renderer/core/style/OWNERS
+++ b/third_party/blink/renderer/core/style/OWNERS
@@ -3,4 +3,5 @@
 ericwilligers@chromium.org
 futhark@chromium.org
 
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.idl b/third_party/blink/renderer/core/workers/worker_global_scope.idl
index d30a32a9..ba4f7702 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.idl
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.idl
@@ -70,13 +70,13 @@
 
     // AnimationFrameProvider mixin
     // https://html.spec.whatwg.org/C/#animation-frames
-    [RuntimeEnabled=OffscreenCanvas, RaisesException] long requestAnimationFrame(FrameRequestCallback callback);
-    [RuntimeEnabled=OffscreenCanvas] void cancelAnimationFrame(long handle);
+    [RaisesException] long requestAnimationFrame(FrameRequestCallback callback);
+    void cancelAnimationFrame(long handle);
 
     // FontFaceSource
     // https://drafts.csswg.org/css-font-loading-3/#font-face-source
     // TODO(fserb): temporarly until we can enable the interface below.
-    [RuntimeEnabled=OffscreenCanvasText] readonly attribute FontFaceSet fonts;
+    readonly attribute FontFaceSet fonts;
 
     // TrustedTypes API: http://github.com/wicg/trusted-types
     [OriginTrialEnabled=TrustedDOMTypes, Unforgeable] readonly attribute TrustedTypePolicyFactory TrustedTypes;
diff --git a/third_party/blink/renderer/core/workers/worklet.cc b/third_party/blink/renderer/core/workers/worklet.cc
index a16f90e..f55cf010 100644
--- a/third_party/blink/renderer/core/workers/worklet.cc
+++ b/third_party/blink/renderer/core/workers/worklet.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/core/frame/use_counter.h"
 #include "third_party/blink/renderer/core/loader/worker_resource_timing_notifier_impl.h"
 #include "third_party/blink/renderer/core/workers/worklet_pending_tasks.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h"
@@ -44,7 +45,8 @@
   DCHECK(IsMainThread());
   if (!GetExecutionContext()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "This frame is already detached"));
   }
   UseCounter::Count(GetExecutionContext(),
@@ -64,9 +66,9 @@
   // Step 4: "If moduleURLRecord is failure, then reject promise with a
   // "SyntaxError" DOMException and return promise."
   if (!module_url_record.IsValid()) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kSyntaxError,
-                             "'" + module_url + "' is not a valid URL."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kSyntaxError,
+        "'" + module_url + "' is not a valid URL."));
     return promise;
   }
 
diff --git a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
index 6ee7b4e5..6bf787cc 100644
--- a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
+++ b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/workers/worklet.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
 
 namespace blink {
@@ -31,7 +32,8 @@
   if (counter_ != -1) {
     counter_ = -1;
     worklet_->FinishPendingTasks(this);
-    resolver_->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+    resolver_->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   }
 }
 
diff --git a/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js b/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
index ddc40b2..4b75bf3a 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
+++ b/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
@@ -715,15 +715,34 @@
   async _applyFreeFlowStyleTextEdit(context) {
     if (!this._prompt || !this._parentPane.node())
       return;
-    const valueText = this._prompt.textWithCurrentSuggestion();
-    if (context.isEditingName || valueText.includes(';'))
-      return;
-    // Do not live-edit "content" property of pseudo elements. crbug.com/433889
-    const isPseudo = !!this._parentPane.node().pseudoType();
-    if (isPseudo && this.name === 'content')
-      return;
 
-    await this.applyStyleText(this.nameElement.textContent + ': ' + valueText, false);
+    const enteredText = this._prompt.text();
+    if (context.isEditingName && enteredText.includes(':')) {
+      this._editingCommitted(enteredText, context, 'forward');
+      return;
+    }
+
+    const valueText = this._prompt.textWithCurrentSuggestion();
+    if (valueText.includes(';'))
+      return;
+    // Prevent destructive side-effects during live-edit. crbug.com/433889
+    const isPseudo = !!this._parentPane.node().pseudoType();
+    if (isPseudo) {
+      if (this.name.toLowerCase() === 'content')
+        return;
+      const lowerValueText = valueText.trim().toLowerCase();
+      if (lowerValueText.startsWith('content:') || lowerValueText === 'display: none')
+        return;
+    }
+
+    if (context.isEditingName) {
+      if (valueText.includes(':'))
+        await this.applyStyleText(valueText, false);
+      else if (this._hasBeenEditedIncrementally())
+        await this._applyOriginalStyle(context);
+    } else {
+      await this.applyStyleText(`${this.nameElement.textContent}: ${valueText}`, false);
+    }
   }
 
   /**
@@ -802,6 +821,7 @@
     this._removePrompt();
     this.editingEnded(context);
     const isEditingName = context.isEditingName;
+    const nameValueEntered = isEditingName && this.nameElement.textContent.includes(':');
 
     // Determine where to move to before making changes
     let createNewProperty, moveToSelector;
@@ -829,11 +849,14 @@
     let moveToIndex = moveTo && this.treeOutline ? this.treeOutline.rootElement().indexOfChild(moveTo) : -1;
     const blankInput = userInput.isWhitespace();
     const shouldCommitNewProperty = this._newProperty &&
-        (isPropertySplitPaste || moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput));
+        (isPropertySplitPaste || moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput) ||
+         nameValueEntered);
     const section = /** @type {!Elements.StylePropertiesSection} */ (this.section());
     if (((userInput !== context.previousContent || isDirtyViaPaste) && !this._newProperty) || shouldCommitNewProperty) {
       let propertyText;
-      if (blankInput || (this._newProperty && this.valueElement.textContent.isWhitespace())) {
+      if (nameValueEntered) {
+        propertyText = this.nameElement.textContent;
+      } else if (blankInput || (this._newProperty && this.valueElement.textContent.isWhitespace())) {
         propertyText = '';
       } else {
         if (isEditingName)
@@ -1021,6 +1044,15 @@
   }
 };
 
-/** @typedef {{expanded: boolean, hasChildren: boolean, isEditingName: boolean, previousContent: string}} */
+/** @typedef {{
+ *    expanded: boolean,
+ *    hasChildren: boolean,
+ *    isEditingName: boolean,
+ *    originalProperty: (!SDK.CSSProperty|undefined),
+ *    originalName: (string|undefined),
+ *    originalValue: (string|undefined),
+ *    previousContent: string
+ *  }}
+ */
 Elements.StylePropertyTreeElement.Context;
 Elements.StylePropertyTreeElement.ActiveSymbol = Symbol('ActiveSymbol');
diff --git a/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js b/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
index baeb539..dafcf70 100644
--- a/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
+++ b/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
@@ -2091,6 +2091,7 @@
     super();
     this.initialize(this._buildPropertyCompletions.bind(this), UI.StyleValueDelimiters);
     this._isColorAware = SDK.cssMetadata().isColorAwareProperty(treeElement.property.name);
+    /** @type {!Array<string>} */
     this._cssCompletions = [];
     if (isEditingName) {
       this._cssCompletions = SDK.cssMetadata().allProperties();
@@ -2240,6 +2241,11 @@
     const anywhereResults = [];
     if (!editingVariable)
       this._cssCompletions.forEach(completion => filterCompletions.call(this, completion, false /* variable */));
+    if (this._isEditingName) {
+      const nameValuePresets = SDK.cssMetadata().nameValuePresets(this._treeElement.node().isSVGNode());
+      nameValuePresets.forEach(
+          preset => filterCompletions.call(this, preset, false /* variable */, true /* nameValue */));
+    }
     if (this._isEditingName || editingVariable)
       this._cssVariables.forEach(variable => filterCompletions.call(this, variable, true /* variable */));
 
@@ -2278,9 +2284,10 @@
     /**
      * @param {string} completion
      * @param {boolean} variable
+     * @param {boolean=} nameValue
      * @this {Elements.StylesSidebarPane.CSSPropertyPrompt}
      */
-    function filterCompletions(completion, variable) {
+    function filterCompletions(completion, variable, nameValue) {
       const index = completion.toLowerCase().indexOf(lowerQuery);
       const result = {text: completion};
       if (variable) {
@@ -2292,6 +2299,8 @@
             result.subtitleRenderer = swatchRenderer.bind(null, color);
         }
       }
+      if (nameValue)
+        result.hideGhostText = true;
       if (index === 0) {
         result.priority = this._isEditingName ? SDK.cssMetadata().propertyUsageWeight(completion) : 1;
         prefixResults.push(result);
diff --git a/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js b/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
index c5d88b9..011753a 100644
--- a/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
+++ b/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
@@ -42,7 +42,8 @@
     this._canvasContainer = this.contentElement.createChild('div', 'paint-profiler-canvas-container');
     this._progressBanner = this.contentElement.createChild('div', 'full-widget-dimmed-banner hidden');
     this._progressBanner.textContent = Common.UIString('Profiling\u2026');
-    this._pieChart = new PerfUI.PieChart(55, this._formatPieChartTime.bind(this), true);
+    this._pieChart = new PerfUI.PieChart(
+        {chartName: ls`Profiling Results`, size: 55, formatter: this._formatPieChartTime.bind(this)});
     this._pieChart.element.classList.add('paint-profiler-pie-chart');
     this.contentElement.appendChild(this._pieChart.element);
 
diff --git a/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js b/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
index 773c9ed..4ce73b2 100644
--- a/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
+++ b/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
@@ -28,20 +28,25 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+/** @typedef {{size: number, formatter: function(number):string, showLegend: (boolean|undefined), chartName: string}} */
+PerfUI.PieChartOptions;
+
 /**
  * @unrestricted
  */
 PerfUI.PieChart = class {
   /**
-   * @param {number} size
-   * @param {function(number):string=} formatter
-   * @param {boolean=} showTotal
+   * @param {!PerfUI.PieChartOptions} options
    */
-  constructor(size, formatter, showTotal) {
+  constructor(options) {
+    const {size, formatter, showLegend, chartName} = options;
     this.element = createElement('div');
     this._shadowRoot = UI.createShadowRootWithCoreStyles(this.element, 'perf_ui/pieChart.css');
     const root = this._shadowRoot.createChild('div', 'root');
-    const svg = this._createSVGChild(root, 'svg');
+    UI.ARIAUtils.markAsGroup(root);
+    UI.ARIAUtils.setAccessibleName(root, chartName);
+    this._chartRoot = root.createChild('div', 'chart-root');
+    const svg = this._createSVGChild(this._chartRoot, 'svg');
     this._group = this._createSVGChild(svg, 'g');
     this._innerR = 0.618;
     const strokeWidth = 1 / size;
@@ -55,12 +60,13 @@
     circle.setAttribute('stroke', 'hsl(0, 0%, 80%)');
     circle.setAttribute('fill', 'transparent');
     circle.setAttribute('stroke-width', strokeWidth);
-    this._foregroundElement = root.createChild('div', 'pie-chart-foreground');
-    if (showTotal)
-      this._totalElement = this._foregroundElement.createChild('div', 'pie-chart-total');
+    this._foregroundElement = this._chartRoot.createChild('div', 'pie-chart-foreground');
+    this._totalElement = this._foregroundElement.createChild('div', 'pie-chart-total');
     this._formatter = formatter;
     this._slices = [];
     this._lastAngle = -Math.PI / 2;
+    if (showLegend)
+      this._legend = root.createChild('div', 'pie-chart-legend');
     this._setSize(size);
   }
 
@@ -78,8 +84,12 @@
       totalString = this._formatter ? this._formatter(totalValue) : totalValue;
     else
       totalString = '';
-    if (this._totalElement)
-      this._totalElement.textContent = totalString;
+    this._totalElement.textContent = totalString;
+    if (this._legend) {
+      this._legend.removeChildren();
+      const legendItem = this._addLegendItem(totalValue, ls`Total`);
+      UI.ARIAUtils.setLabelledBy(this._totalElement, legendItem);
+    }
   }
 
   /**
@@ -88,15 +98,16 @@
   _setSize(value) {
     this._group.setAttribute('transform', 'scale(' + (value / 2) + ') translate(1, 1) scale(0.99, 0.99)');
     const size = value + 'px';
-    this.element.style.width = size;
-    this.element.style.height = size;
+    this._chartRoot.style.width = size;
+    this._chartRoot.style.height = size;
   }
 
   /**
    * @param {number} value
    * @param {string} color
+   * @param {string=} name
    */
-  addSlice(value, color) {
+  addSlice(value, color, name) {
     let sliceAngle = value / this._totalValue * 2 * Math.PI;
     if (!isFinite(sliceAngle))
       return;
@@ -117,6 +128,10 @@
         `M${x1},${y1} A1,1,0,${largeArc},1,${x2},${y2} L${x3},${y3} A${r2},${r2},0,${largeArc},0,${x4},${y4} Z`);
     path.setAttribute('fill', color);
     this._slices.push(path);
+    if (this._legend) {
+      const legendItem = this._addLegendItem(value, name, color);
+      UI.ARIAUtils.setLabelledBy(path, legendItem);
+    }
   }
 
   /**
@@ -129,4 +144,30 @@
     parent.appendChild(child);
     return child;
   }
+
+  /**
+   * @param {number} value
+   * @param {string=} name
+   * @param {string=} color
+   * @returns {!Element}
+   */
+  _addLegendItem(value, name, color) {
+    const node = this._legend.ownerDocument.createElement('div');
+    node.className = 'pie-chart-legend-row';
+    // make sure total always appears at the bottom
+    if (this._legend.childElementCount)
+      this._legend.insertBefore(node, this._legend.lastElementChild);
+    else
+      this._legend.appendChild(node);
+    const sizeDiv = node.createChild('div', 'pie-chart-size');
+    const swatchDiv = node.createChild('div', 'pie-chart-swatch');
+    const nameDiv = node.createChild('div', 'pie-chart-name');
+    if (color)
+      swatchDiv.style.backgroundColor = color;
+    else
+      swatchDiv.classList.add('pie-chart-empty-swatch');
+    nameDiv.textContent = name;
+    sizeDiv.textContent = this._formatter ? this._formatter(value) : value;
+    return node;
+  }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css b/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
index bef554f..ee469740 100644
--- a/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
+++ b/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
@@ -5,9 +5,15 @@
  */
 
 .root {
+    align-items: center;
+    display: flex;
+    min-width: fit-content;
+    white-space: nowrap;
+}
+
+.chart-root {
     position: relative;
-    width: 100%;
-    height: 100%;
+    overflow: hidden;
 }
 
 .pie-chart-foreground {
@@ -17,10 +23,45 @@
     z-index: 10;
     top: 0;
     display: flex;
+    pointer-events: none;
 }
 
 .pie-chart-total {
     margin: auto;
     padding: 2px 5px;
     background-color: rgba(255, 255, 255, 0.6);
+    pointer-events: auto;
+}
+
+.pie-chart-legend {
+    margin-left: 30px;
+}
+
+.pie-chart-legend-row {
+    margin: 5px auto;
+    padding-right: 25px;
+}
+
+.pie-chart-swatch {
+    display: inline-block;
+    width: 11px;
+    height: 11px;
+    margin: 0 6px;
+    top: 1px;
+    position: relative;
+    border: 1px solid rgba(100, 100, 100, 0.2);
+}
+
+.pie-chart-swatch.pie-chart-empty-swatch {
+    border: none;
+}
+
+.pie-chart-name {
+    display: inline-block;
+}
+
+.pie-chart-size {
+    display: inline-block;
+    text-align: right;
+    width: 70px;
 }
diff --git a/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js b/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
index c33e950..6bedd8e 100644
--- a/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
+++ b/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
@@ -292,7 +292,6 @@
     this._statisticsView.addRecord(statistics.jsArrays, Common.UIString('JS Arrays'), '#7af');
     this._statisticsView.addRecord(statistics.native, Common.UIString('Typed Arrays'), '#fc5');
     this._statisticsView.addRecord(statistics.system, Common.UIString('System Objects'), '#98f');
-    this._statisticsView.addRecord(statistics.total, Common.UIString('Total'));
     return statistics;
   }
 
@@ -1611,10 +1610,14 @@
   constructor() {
     super();
     this.element.classList.add('heap-snapshot-statistics-view');
-    this._pieChart = new PerfUI.PieChart(150, Profiler.HeapSnapshotStatisticsView._valueFormatter, true);
+    this._pieChart = new PerfUI.PieChart({
+      chartName: ls`Heap memory usage`,
+      size: 150,
+      formatter: Profiler.HeapSnapshotStatisticsView._valueFormatter,
+      showLegend: true
+    });
     this._pieChart.element.classList.add('heap-snapshot-stats-pie-chart');
     this.element.appendChild(this._pieChart.element);
-    this._labels = this.element.createChild('div', 'heap-snapshot-stats-legend');
   }
 
   /**
@@ -1635,22 +1638,10 @@
   /**
    * @param {number} value
    * @param {string} name
-   * @param {string=} color
+   * @param {string} color
    */
   addRecord(value, name, color) {
-    if (color)
-      this._pieChart.addSlice(value, color);
-
-    const node = this._labels.createChild('div');
-    const swatchDiv = node.createChild('div', 'heap-snapshot-stats-swatch');
-    const nameDiv = node.createChild('div', 'heap-snapshot-stats-name');
-    const sizeDiv = node.createChild('div', 'heap-snapshot-stats-size');
-    if (color)
-      swatchDiv.style.backgroundColor = color;
-    else
-      swatchDiv.classList.add('heap-snapshot-stats-empty-swatch');
-    nameDiv.textContent = name;
-    sizeDiv.textContent = Profiler.HeapSnapshotStatisticsView._valueFormatter(value);
+    this._pieChart.addSlice(value, color, name);
   }
 };
 
diff --git a/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css b/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
index 7e5ce49..45027e4 100644
--- a/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
+++ b/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
@@ -182,38 +182,6 @@
     flex-shrink: 0;
 }
 
-.heap-snapshot-stats-legend {
-    margin-left: 24px;
-    flex-shrink: 0;
-}
-
-.heap-snapshot-stats-legend > div {
-    margin-top: 1px;
-    width: 170px;
-}
-
-.heap-snapshot-stats-swatch {
-    display: inline-block;
-    width: 10px;
-    height: 10px;
-    border: 1px solid rgba(100, 100, 100, 0.3);
-}
-
-.heap-snapshot-stats-swatch.heap-snapshot-stats-empty-swatch {
-    border: none;
-}
-
-.heap-snapshot-stats-name,
-.heap-snapshot-stats-size {
-    display: inline-block;
-    margin-left: 6px;
-}
-
-.heap-snapshot-stats-size {
-    float: right;
-    text-align: right;
-}
-
 .heap-allocation-stack .stack-frame {
     display: flex;
     justify-content: space-between;
diff --git a/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js b/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
index ceb8b9f..9b060196 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
@@ -40,12 +40,11 @@
         ls`Learn more`);
     learnMoreRow.appendChild(learnMore);
     this._quotaUsage = null;
-    this._pieChart = new PerfUI.PieChart(110, Number.bytesToString, true);
-    this._pieChartLegend = createElement('div');
+    this._pieChart = new PerfUI.PieChart(
+        {chartName: ls`Storage Usage`, size: 110, formatter: Number.bytesToString, showLegend: true});
     const usageBreakdownRow = quota.appendRow();
     usageBreakdownRow.classList.add('usage-breakdown-row');
     usageBreakdownRow.appendChild(this._pieChart.element);
-    usageBreakdownRow.appendChild(this._pieChartLegend);
 
     const clearButtonSection = this._reportView.appendSection('', 'clear-storage-button').appendRow();
     this._clearButton = UI.createTextButton(ls`Clear site data`, this._clear.bind(this));
@@ -234,11 +233,7 @@
           continue;
         const title = this._getStorageTypeName(usageForType.storageType);
         const color = this._pieColors.get(usageForType.storageType) || '#ccc';
-        this._pieChart.addSlice(value, color);
-        const rowElement = this._pieChartLegend.createChild('div', 'usage-breakdown-legend-row');
-        rowElement.createChild('span', 'usage-breakdown-legend-value').textContent = Number.bytesToString(value);
-        rowElement.createChild('span', 'usage-breakdown-legend-swatch').style.backgroundColor = color;
-        rowElement.createChild('span', 'usage-breakdown-legend-title').textContent = title;
+        this._pieChart.addSlice(value, color, title);
       }
     }
 
@@ -251,7 +246,6 @@
    */
   _resetPieChart(total) {
     this._pieChart.setTotal(total);
-    this._pieChartLegend.removeChildren();
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css b/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
index 9cb3cf5..e1bb6a1 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
+++ b/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
@@ -26,27 +26,3 @@
 .usage-breakdown-row {
     min-width: fit-content;
 }
-
-.usage-breakdown-legend-row {
-    margin: 5px auto;
-}
-
-.usage-breakdown-legend-title {
-    display: inline-block;
-}
-
-.usage-breakdown-legend-value {
-    display: inline-block;
-    width: 70px;
-    text-align: right;
-}
-
-.usage-breakdown-legend-swatch {
-    display: inline-block;
-    width: 11px;
-    height: 11px;
-    margin: 0 6px;
-    position: relative;
-    top: 1px;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-}
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
index 9a3b89a1..42a2e24 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
@@ -73,8 +73,36 @@
         }
       }
     }
-    this._values.sort();
+    this._values.sort(SDK.CSSMetadata._sortPrefixesToEnd);
     this._valuesSet = new Set(this._values);
+
+    /** @type {!Array<string>} */
+    this._nameValuePresets = [];
+    /** @type {!Array<string>} */
+    this._nameValuePresetsIncludingSVG = [];
+    for (const name of this._valuesSet) {
+      const values = this._specificPropertyValues(name)
+                         .filter(value => CSS.supports(name, value))
+                         .sort(SDK.CSSMetadata._sortPrefixesToEnd);
+      const presets = values.map(value => `${name}: ${value}`);
+      if (!this.isSVGProperty(name))
+        this._nameValuePresets.pushAll(presets);
+      this._nameValuePresetsIncludingSVG.pushAll(presets);
+    }
+  }
+
+  /**
+   * @param {string} a
+   * @param {string} b
+   */
+  static _sortPrefixesToEnd(a, b) {
+    const aIsPrefixed = a.startsWith('-webkit-');
+    const bIsPrefixed = b.startsWith('-webkit-');
+    if (aIsPrefixed && !bIsPrefixed)
+      return 1;
+    if (!aIsPrefixed && bIsPrefixed)
+      return -1;
+    return a < b ? -1 : (a > b ? 1 : 0);
   }
 
   /**
@@ -85,6 +113,14 @@
   }
 
   /**
+   * @param {boolean=} includeSVG
+   * @return {!Array<string>}
+   */
+  nameValuePresets(includeSVG) {
+    return includeSVG ? this._nameValuePresetsIncludingSVG : this._nameValuePresets;
+  }
+
+  /**
    * @param {string} name
    * @return {boolean}
    */
@@ -188,24 +224,31 @@
    * @param {string} propertyName
    * @return {!Array<string>}
    */
+  _specificPropertyValues(propertyName) {
+    const unprefixedName = propertyName.replace(/^-webkit-/, '');
+    const entry = SDK.CSSMetadata._propertyDataMap[propertyName] || SDK.CSSMetadata._propertyDataMap[unprefixedName];
+    const keywords = entry && entry.values ? entry.values.slice() : [];
+    for (const commonKeyword of ['auto', 'none']) {
+      if (CSS.supports(propertyName, commonKeyword))
+        keywords.push(commonKeyword);
+    }
+    return keywords;
+  }
+
+  /**
+   * @param {string} propertyName
+   * @return {!Array<string>}
+   */
   propertyValues(propertyName) {
     const acceptedKeywords = ['inherit', 'initial', 'unset'];
     propertyName = propertyName.toLowerCase();
-    const unprefixedName = propertyName.replace(/^-webkit-/, '');
-    const entry = SDK.CSSMetadata._propertyDataMap[propertyName] || SDK.CSSMetadata._propertyDataMap[unprefixedName];
-    if (entry && entry.values)
-      acceptedKeywords.pushAll(entry.values);
-    const commonKeywords = ['auto', 'none'];
-    for (const commonKeyword of commonKeywords) {
-      if (CSS.supports(propertyName, commonKeyword))
-        acceptedKeywords.push(commonKeyword);
-    }
+    acceptedKeywords.pushAll(this._specificPropertyValues(propertyName));
     if (this.isColorAwareProperty(propertyName)) {
       acceptedKeywords.push('currentColor');
       for (const color in Common.Color.Nicknames)
         acceptedKeywords.push(color);
     }
-    return acceptedKeywords.sort();
+    return acceptedKeywords.sort(SDK.CSSMetadata._sortPrefixesToEnd);
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
index 7c64b49..4242a12 100644
--- a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
@@ -1523,12 +1523,16 @@
       total += aggregatedStats[categoryName];
 
     const element = createElementWithClass('div', 'timeline-details-view-pie-chart-wrapper hbox');
-    const pieChart = new PerfUI.PieChart(110, value => Number.preciseMillisToString(value), true);
+    const pieChart = new PerfUI.PieChart({
+      chartName: ls`Time spent in rendering`,
+      size: 110,
+      formatter: value => Number.preciseMillisToString(value),
+      showLegend: true,
+    });
     pieChart.element.classList.add('timeline-details-view-pie-chart');
     pieChart.setTotal(total);
     const pieChartContainer = element.createChild('div', 'vbox');
     pieChartContainer.appendChild(pieChart.element);
-    const footerElement = element.createChild('div', 'timeline-aggregated-info-legend');
 
     /**
      * @param {string} name
@@ -1539,12 +1543,7 @@
     function appendLegendRow(name, title, value, color) {
       if (!value)
         return;
-      pieChart.addSlice(value, color);
-      const rowElement = footerElement.createChild('div');
-      rowElement.createChild('span', 'timeline-aggregated-legend-value').textContent =
-          Number.preciseMillisToString(value, 1);
-      rowElement.createChild('span', 'timeline-aggregated-legend-swatch').style.backgroundColor = color;
-      rowElement.createChild('span', 'timeline-aggregated-legend-title').textContent = title;
+      pieChart.addSlice(value, color, title);
     }
 
     // In case of self time, first add self, then children of the same category.
diff --git a/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css b/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
index f54a86c..225c6a9c 100644
--- a/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
+++ b/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
@@ -172,26 +172,6 @@
     height: 100%;
 }
 
-.timeline-aggregated-legend-title {
-    display: inline-block;
-}
-
-.timeline-aggregated-legend-value {
-    display: inline-block;
-    width: 70px;
-    text-align: right;
-}
-
-.timeline-aggregated-legend-swatch {
-    display: inline-block;
-    width: 11px;
-    height: 11px;
-    margin: 0 6px;
-    position: relative;
-    top: 1px;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-}
-
 .popover ul {
     margin: 0;
     padding: 0;
@@ -385,12 +365,6 @@
     line-height: 12px;
 }
 
-.timeline-aggregated-info-legend > div {
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-}
-
 .timeline-flamechart {
     overflow: hidden;
 }
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
index b612b4ec1..84e9cee 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
@@ -110,6 +110,14 @@
 };
 
 /**
+ * @param {!Element} element
+ */
+UI.ARIAUtils.ensureId = function(element) {
+  if (!element.id)
+    element.id = UI.ARIAUtils.nextId('ariaElement');
+};
+
+/**
  * @param {string} prefix
  * @return {string}
  */
@@ -187,6 +195,15 @@
 };
 
 /**
+ * @param {!Element} element
+ * @param {!Element} labelElement
+ */
+UI.ARIAUtils.setLabelledBy = function(element, labelElement) {
+  UI.ARIAUtils.ensureId(labelElement);
+  element.setAttribute('aria-labelledby', labelElement.id);
+};
+
+/**
  * @param {string} message
  * @param {!Element} element
  */
diff --git a/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js b/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
index d3cd95ee..f460d14 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
@@ -365,7 +365,8 @@
  *      priority: (number|undefined),
  *      isSecondary: (boolean|undefined),
  *      subtitleRenderer: (function():!Element|undefined),
- *      selectionRange: ({startColumn: number, endColumn: number}|undefined)
+ *      selectionRange: ({startColumn: number, endColumn: number}|undefined),
+ *      hideGhostText: (boolean|undefined)
  * }}
  */
 UI.SuggestBox.Suggestion;
diff --git a/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js b/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
index 3b4441d..b0e26a1 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
@@ -379,6 +379,10 @@
   }
 
   _refreshGhostText() {
+    if (this._currentSuggestion && this._currentSuggestion.hideGhostText) {
+      this._ghostTextElement.remove();
+      return;
+    }
     if (this._queryRange && this._currentSuggestion && this._isCaretAtEndOfPrompt() &&
         this._currentSuggestion.text.startsWith(this.text().substring(this._queryRange.startColumn))) {
       this._ghostTextElement.textContent =
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 0ac1c5b..3a1ed83 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1504,14 +1504,15 @@
   MarkAXObjectDirty(Get(element), subtree);
 }
 
-void AXObjectCacheImpl::HandleFocusedUIElementChanged(Node* old_focused_node,
-                                                      Node* new_focused_node) {
+void AXObjectCacheImpl::HandleFocusedUIElementChanged(
+    Element* old_focused_element,
+    Element* new_focused_element) {
   RemoveValidationMessageObject();
 
-  if (!new_focused_node)
+  if (!new_focused_element)
     return;
 
-  Page* page = new_focused_node->GetDocument().GetPage();
+  Page* page = new_focused_element->GetDocument().GetPage();
   if (!page)
     return;
 
@@ -1519,7 +1520,7 @@
   if (!focused_object)
     return;
 
-  AXObject* old_focused_object = Get(old_focused_node);
+  AXObject* old_focused_object = Get(old_focused_element);
   PostNotification(old_focused_object, ax::mojom::Event::kBlur);
   PostNotification(focused_object, ax::mojom::Event::kFocus);
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 6a72eec..613ecbf 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -118,8 +118,8 @@
   void HandleAutofillStateChanged(Element*, bool) override;
   void HandleValidationMessageVisibilityChanged(
       const Element* form_control) override;
-  void HandleFocusedUIElementChanged(Node* old_focused_node,
-                                     Node* new_focused_node) override;
+  void HandleFocusedUIElementChanged(Element* old_focused_element,
+                                     Element* new_focused_element) override;
   void HandleInitialFocus() override;
   void HandleTextFormControlChanged(Node*) override;
   void HandleEditableTextContentChanged(Node*) override;
diff --git a/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.cc b/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.cc
index 7dd7cfe..7b50354 100644
--- a/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.cc
+++ b/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/use_counter.h"
 #include "third_party/blink/renderer/modules/app_banner/before_install_prompt_event_init.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -67,9 +68,9 @@
   if (user_choice_ && binding_.is_bound())
     return user_choice_->Promise(script_state->World());
   return ScriptPromise::RejectWithDOMException(
-      script_state,
-      DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                           "userChoice cannot be accessed on this event."));
+      script_state, MakeGarbageCollected<DOMException>(
+                        DOMExceptionCode::kInvalidStateError,
+                        "userChoice cannot be accessed on this event."));
 }
 
 ScriptPromise BeforeInstallPromptEvent::prompt(ScriptState* script_state) {
@@ -77,9 +78,9 @@
   // to display the banner now.
   if (!banner_service_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The prompt() method cannot be called."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "The prompt() method cannot be called."));
   }
 
   ExecutionContext* context = ExecutionContext::From(script_state);
@@ -89,7 +90,7 @@
                               doc ? doc->GetFrame() : nullptr)) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kNotAllowedError,
             "The prompt() method must be called with a user gesture"));
   }
diff --git a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
index e784c5b..500e08e 100644
--- a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
+++ b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -27,22 +28,23 @@
 DOMException* ToException(WebSetSinkIdError error) {
   switch (error) {
     case WebSetSinkIdError::kNotFound:
-      return DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                  "Requested device not found");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, "Requested device not found");
     case WebSetSinkIdError::kNotAuthorized:
-      return DOMException::Create(DOMExceptionCode::kSecurityError,
-                                  "No permission to use requested device");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kSecurityError,
+          "No permission to use requested device");
     case WebSetSinkIdError::kAborted:
-      return DOMException::Create(
+      return MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kAbortError,
           "The operation could not be performed and was aborted");
     case WebSetSinkIdError::kNotSupported:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "Operation not supported");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError, "Operation not supported");
     default:
       NOTREACHED();
-      return DOMException::Create(DOMExceptionCode::kAbortError,
-                                  "Invalid error code");
+      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError,
+                                                "Invalid error code");
   }
 }
 
@@ -108,7 +110,7 @@
     // Detached contexts shouldn't be playing audio. Note that despite this
     // explicit Reject(), any associated JS callbacks will never be called
     // because the context is already detached...
-    Reject(DOMException::Create(
+    Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kSecurityError,
         "Impossible to authorize device for detached context"));
     return;
@@ -122,7 +124,7 @@
     web_frame->Client()->CheckIfAudioSinkExistsAndIsAuthorized(
         sink_id_, std::move(set_sink_id_completion_callback));
   } else {
-    Reject(DOMException::Create(
+    Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kSecurityError,
         "Impossible to authorize device if there is no frame"));
     return;
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
index 316be93..44d1e14 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/background_fetch/background_fetch_manager.h"
 
+#include <utility>
+
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h"
@@ -26,6 +28,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_utils.h"
 #include "third_party/blink/renderer/platform/network/network_utils.h"
@@ -332,7 +335,7 @@
           "There is no service worker available to service the fetch."));
       return;
     case mojom::blink::BackgroundFetchError::QUOTA_EXCEEDED:
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kQuotaExceededError, "Quota exceeded."));
       return;
     case mojom::blink::BackgroundFetchError::REGISTRATION_LIMIT_EXCEEDED:
@@ -474,12 +477,12 @@
       return;
     case mojom::blink::BackgroundFetchError::STORAGE_ERROR:
       DCHECK(!registration);
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kAbortError,
-                               "Failed to get registration due to I/O error."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kAbortError,
+          "Failed to get registration due to I/O error."));
       return;
     case mojom::blink::BackgroundFetchError::SERVICE_WORKER_UNAVAILABLE:
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kInvalidStateError,
           "There's no service worker available to service the fetch."));
       return;
@@ -529,7 +532,7 @@
       return;
     case mojom::blink::BackgroundFetchError::STORAGE_ERROR:
       DCHECK(developer_ids.IsEmpty());
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kAbortError,
           "Failed to get registration IDs due to I/O error."));
       return;
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_record.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_record.cc
index 0e37d45..20a31fe 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_record.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_record.cc
@@ -6,6 +6,7 @@
 #include "third_party/blink/renderer/core/fetch/request.h"
 #include "third_party/blink/renderer/core/fetch/response.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -32,7 +33,7 @@
     case State::kPending:
       return;
     case State::kAborted:
-      response_ready_property_->Reject(DOMException::Create(
+      response_ready_property_->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kAbortError,
           "The fetch was aborted before the record was processed."));
       return;
@@ -51,7 +52,7 @@
       // Rejecting this with a TypeError here doesn't work because the
       // RejectedType is a DOMException. Update this with the correct error
       // once confirmed, or change the RejectedType.
-      response_ready_property_->Reject(DOMException::Create(
+      response_ready_property_->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kUnknownError, "The response is not available."));
   }
 }
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
index 13bcf29a..e1d0cb0e8d 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/modules/manifest/image_resource.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 
 namespace blink {
@@ -220,7 +221,7 @@
   if (!records_available_) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "The records associated with this background fetch are no longer "
             "available."));
@@ -338,7 +339,7 @@
       resolver->Resolve(/* success = */ false);
       return;
     case mojom::blink::BackgroundFetchError::STORAGE_ERROR:
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kAbortError,
           "Failed to abort registration due to I/O error."));
       return;
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
index 86b353d..d804b216 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/modules/event_interface_modules_names.h"
 #include "third_party/blink/renderer/modules/service_worker/wait_until_observer.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -47,16 +48,16 @@
   if (observer_ && !observer_->IsEventActive()) {
     // Return a rejected promise as the event is no longer active.
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "ExtendableEvent is no longer active."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "ExtendableEvent is no longer active."));
   }
   if (update_ui_called_) {
     // Return a rejected promise as this method should only be called once.
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "updateUI may only be called once."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "updateUI may only be called once."));
   }
 
   update_ui_called_ = true;
@@ -114,9 +115,9 @@
       resolver->Resolve();
       return;
     case mojom::blink::BackgroundFetchError::STORAGE_ERROR:
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kAbortError,
-                               "Failed to update UI due to I/O error."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kAbortError,
+          "Failed to update UI due to I/O error."));
       return;
     case mojom::blink::BackgroundFetchError::DUPLICATED_DEVELOPER_ID:
     case mojom::blink::BackgroundFetchError::INVALID_ARGUMENT:
diff --git a/third_party/blink/renderer/modules/background_sync/sync_manager.cc b/third_party/blink/renderer/modules/background_sync/sync_manager.cc
index 15360ce..8e13b62d 100644
--- a/third_party/blink/renderer/modules/background_sync/sync_manager.cc
+++ b/third_party/blink/renderer/modules/background_sync/sync_manager.cc
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -28,9 +29,9 @@
                                             const String& tag) {
   if (!registration_->active()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "Registration failed - no active Service Worker"));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "Registration failed - no active Service Worker"));
   }
 
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -93,22 +94,22 @@
       NOTREACHED();
       break;
     case mojom::blink::BackgroundSyncError::STORAGE:
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                            "Background Sync is disabled."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "Background Sync is disabled."));
       break;
     case mojom::blink::BackgroundSyncError::NOT_ALLOWED:
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidAccessError,
-                               "Attempted to register a sync event without a "
-                               "window or registration tag too long."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidAccessError,
+          "Attempted to register a sync event without a "
+          "window or registration tag too long."));
       break;
     case mojom::blink::BackgroundSyncError::PERMISSION_DENIED:
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                                            "Permission denied."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotAllowedError, "Permission denied."));
       break;
     case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER:
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                            "No service worker is active."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "No service worker is active."));
       break;
   }
 }
@@ -136,12 +137,12 @@
       NOTREACHED();
       break;
     case mojom::blink::BackgroundSyncError::STORAGE:
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                            "Background Sync is disabled."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "Background Sync is disabled."));
       break;
     case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER:
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                            "No service worker is active."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "No service worker is active."));
       break;
   }
 }
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
index e9a1585..33f61ae4 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
@@ -4,8 +4,8 @@
 
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth.h"
 
-#include <memory>
 #include <utility>
+
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
@@ -28,6 +28,7 @@
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_service_data_map.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_uuid.h"
 #include "third_party/blink/renderer/modules/bluetooth/request_device_options.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -188,7 +189,7 @@
   if (!LocalFrame::HasTransientUserActivation(frame)) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kSecurityError,
             "Must be handling a user gesture to show a permission request."));
   }
@@ -308,7 +309,7 @@
   if (!LocalFrame::HasTransientUserActivation(frame)) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kSecurityError,
             "Must be handling a user gesture to show a permission request."));
   }
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
index 305c579..a4027a7 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h"
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -35,7 +36,7 @@
       break;
   }
 
-  return DOMException::Create(
+  return MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kNetworkError,
       String::Format(kGATTServerNotConnectedBase, operation_string));
 }
@@ -48,16 +49,16 @@
     case BluetoothErrorCode::kInvalidService:
     case BluetoothErrorCode::kInvalidCharacteristic:
     case BluetoothErrorCode::kInvalidDescriptor:
-      return DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                  detailed_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError, detailed_message);
     case BluetoothErrorCode::kServiceNotFound:
     case BluetoothErrorCode::kCharacteristicNotFound:
     case BluetoothErrorCode::kDescriptorNotFound:
-      return DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                  detailed_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, detailed_message);
   }
   NOTREACHED();
-  return DOMException::Create(DOMExceptionCode::kUnknownError);
+  return MakeGarbageCollected<DOMException>(DOMExceptionCode::kUnknownError);
 }
 
 // static
@@ -73,10 +74,11 @@
       // expected to be redirected to the switch above that handles
       // BluetoothErrorCode.
       NOTREACHED();
-      return DOMException::Create(DOMExceptionCode::kUnknownError);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError);
 #define MAP_ERROR(enumeration, name, message)         \
   case mojom::blink::WebBluetoothResult::enumeration: \
-    return DOMException::Create(name, message);
+    return MakeGarbageCollected<DOMException>(name, message);
 
       // InvalidModificationErrors:
       MAP_ERROR(GATT_INVALID_ATTRIBUTE_LENGTH,
@@ -203,7 +205,7 @@
   }
 
   NOTREACHED();
-  return DOMException::Create(DOMExceptionCode::kUnknownError);
+  return MakeGarbageCollected<DOMException>(DOMExceptionCode::kUnknownError);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 80e044c..321cdd6 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h"
 
+#include <utility>
+
 #include "mojo/public/cpp/bindings/associated_interface_ptr.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -18,11 +20,9 @@
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_utils.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_uuid.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
-#include <memory>
-#include <utility>
-
 namespace blink {
 
 BluetoothRemoteGATTCharacteristic::BluetoothRemoteGATTCharacteristic(
@@ -190,9 +190,9 @@
   // InvalidModificationError and abort.
   if (value.ByteLength() > 512) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidModificationError,
-                             "Value can't exceed 512 bytes."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidModificationError,
+                          "Value can't exceed 512 bytes."));
   }
 
   // Let valueVector be a copy of the bytes held by value.
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
index c423377..970bdcc 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
@@ -4,13 +4,15 @@
 
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.h"
 
-#include <memory>
+#include <utility>
+
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_utils.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -132,9 +134,9 @@
   // InvalidModificationError and abort.
   if (value.ByteLength() > 512) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidModificationError,
-                             "Value can't exceed 512 bytes."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidModificationError,
+                          "Value can't exceed 512 bytes."));
   }
 
   // Let valueVector be a copy of the bytes held by value.
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index cbb224d0..63be8d69 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include <utility>
+
 #include "base/feature_list.h"
 #include "base/optional.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
@@ -38,6 +39,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
@@ -295,7 +297,8 @@
       return;
     completed_ = true;
     ScriptState::Scope scope(resolver_->GetScriptState());
-    resolver_->Reject(DOMException::Create(DOMExceptionCode::kAbortError));
+    resolver_->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   }
 
   virtual void Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
index 64c7213c..b716630 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/modules/cache_storage/cache_storage.h"
 
-#include <memory>
 #include <utility>
 
 #include "base/memory/ptr_util.h"
@@ -25,6 +24,7 @@
 #include "third_party/blink/renderer/modules/cache_storage/cache_storage_trace_utils.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/network/http_names.h"
@@ -92,7 +92,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!IsAllowed(script_state)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError));
     return promise;
   }
 
@@ -157,7 +158,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!IsAllowed(script_state)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError));
     return promise;
   }
 
@@ -208,7 +210,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!IsAllowed(script_state)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError));
     return promise;
   }
 
@@ -259,7 +262,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!IsAllowed(script_state)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError));
     return promise;
   }
 
@@ -321,7 +325,8 @@
   const ScriptPromise promise = resolver->Promise();
 
   if (!IsAllowed(script_state)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError));
     return promise;
   }
 
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
index 0d9c2569..dff96f41 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/cache_storage/cache.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -50,28 +51,29 @@
       // This function should only be called with an error.
       break;
     case mojom::CacheStorageError::kErrorExists:
-      return DOMException::Create(DOMExceptionCode::kInvalidAccessError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidAccessError, final_message);
     case mojom::CacheStorageError::kErrorStorage:
-      return DOMException::Create(DOMExceptionCode::kUnknownError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kUnknownError,
+                                                final_message);
     case mojom::CacheStorageError::kErrorNotFound:
-      return DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, final_message);
     case mojom::CacheStorageError::kErrorQuotaExceeded:
-      return DOMException::Create(DOMExceptionCode::kQuotaExceededError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kQuotaExceededError, final_message);
     case mojom::CacheStorageError::kErrorCacheNameNotFound:
-      return DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, final_message);
     case mojom::CacheStorageError::kErrorQueryTooLarge:
-      return DOMException::Create(DOMExceptionCode::kAbortError, final_message);
+      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError,
+                                                final_message);
     case mojom::CacheStorageError::kErrorNotImplemented:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError, final_message);
     case mojom::CacheStorageError::kErrorDuplicateOperation:
-      return DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                  final_message);
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError, final_message);
   }
   NOTREACHED();
   return nullptr;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_gradient.idl b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_gradient.idl
index 8c881d3..a9bfc01 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_gradient.idl
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_gradient.idl
@@ -27,7 +27,7 @@
 // https://html.spec.whatwg.org/C#canvasgradient
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface CanvasGradient {
 
     [RaisesException] void addColorStop(double offset, DOMString color);
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_pattern.idl b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_pattern.idl
index d04c0bbb..afb67a41 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_pattern.idl
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_pattern.idl
@@ -23,7 +23,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface CanvasPattern {
 
     [RaisesException] void setTransform(optional DOMMatrix2DInit transform);
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.idl b/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.idl
index 82032cca..ab9862676 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.idl
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/path_2d.idl
@@ -30,7 +30,7 @@
 
 [
     Constructor(optional (Path2D or DOMString) path),
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures, PaintWorklet StableBlinkFeatures)
+    Exposed=(PaintWorklet,Window,Worker)
 ] interface Path2D {
     [RaisesException] void addPath(Path2D path, optional DOMMatrix2DInit transform);
 };
diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.idl b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.idl
index fa8072f..70b52561 100644
--- a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.idl
+++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.idl
@@ -21,5 +21,5 @@
     // (and is not undefined or null). The binding must ignore this.
     // Related spec issue: https://github.com/whatwg/html/issues/595
     [RaisesException] RenderingContext? getContext(DOMString contextId, [PermissiveDictionaryConversion] optional CanvasContextCreationAttributesModule attributes);
-    [RuntimeEnabled=OffscreenCanvas, RaisesException, MeasureAs=OffscreenCanvas] OffscreenCanvas transferControlToOffscreen();
+    [RaisesException, MeasureAs=OffscreenCanvas] OffscreenCanvas transferControlToOffscreen();
 };
diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module_support_webgl2_compute.idl b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module_support_webgl2_compute.idl
index 6f930b1..0c2fe34b 100644
--- a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module_support_webgl2_compute.idl
+++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module_support_webgl2_compute.idl
@@ -22,5 +22,5 @@
     // (and is not undefined or null). The binding must ignore this.
     // Related spec issue: https://github.com/whatwg/html/issues/595
     [RaisesException] RenderingContext? getContext(DOMString contextId, [PermissiveDictionaryConversion] optional CanvasContextCreationAttributesModule attributes);
-    [RuntimeEnabled=OffscreenCanvas, RaisesException, MeasureAs=OffscreenCanvas] OffscreenCanvas transferControlToOffscreen();
+    [RaisesException, MeasureAs=OffscreenCanvas] OffscreenCanvas transferControlToOffscreen();
 };
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module.idl b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module.idl
index 3e312d5..53440b10 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module.idl
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module.idl
@@ -12,5 +12,5 @@
 [
     ImplementedAs=OffscreenCanvasModule
 ] partial interface OffscreenCanvas {
-    [CallWith=ExecutionContext, RaisesException, RuntimeEnabled=OffscreenCanvas] OffscreenRenderingContext? getContext(OffscreenRenderingContextType contextType, optional CanvasContextCreationAttributesModule attributes);
+    [CallWith=ExecutionContext, RaisesException] OffscreenRenderingContext? getContext(OffscreenRenderingContextType contextType, optional CanvasContextCreationAttributesModule attributes);
 };
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module_support_webgl2_compute.idl b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module_support_webgl2_compute.idl
index d4ed9dd5..954e9aa 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module_support_webgl2_compute.idl
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module_support_webgl2_compute.idl
@@ -13,5 +13,5 @@
 [
     ImplementedAs=OffscreenCanvasModule
 ] partial interface OffscreenCanvas {
-    [CallWith=ExecutionContext, RaisesException, RuntimeEnabled=OffscreenCanvas] OffscreenRenderingContext? getContext(OffscreenRenderingContextType contextType, optional CanvasContextCreationAttributesModule attributes);
+    [CallWith=ExecutionContext, RaisesException] OffscreenRenderingContext? getContext(OffscreenRenderingContextType contextType, optional CanvasContextCreationAttributesModule attributes);
 };
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.idl b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.idl
index 2c77305..ed346b5 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.idl
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.idl
@@ -5,8 +5,7 @@
 // https://html.spec.whatwg.org/C/#the-offscreen-2d-rendering-context
 
 [
-    Exposed=(Window,Worker),
-    RuntimeEnabled=OffscreenCanvas
+    Exposed=(Window,Worker)
 ] interface OffscreenCanvasRenderingContext2D {
     // back-reference to the canvas
     [ImplementedAs=offscreenCanvasForBinding] readonly attribute OffscreenCanvas canvas;
@@ -103,7 +102,7 @@
     attribute DOMString font; // (default 10px sans-serif)
     attribute DOMString textAlign; // "start", "end", "left", "right", "center" (default: "start")
     attribute DOMString textBaseline; // "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" (default: "alphabetic")
-    [RuntimeEnabled=OffscreenCanvasText] attribute DOMString direction; // "inherit", "rtl", "ltr" (default: "inherit")
+    attribute DOMString direction; // "inherit", "rtl", "ltr" (default: "inherit")
 };
 
 OffscreenCanvasRenderingContext2D includes CanvasPath;
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
index a958544..d032f794 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -48,8 +49,8 @@
     }
   }
 
-  resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                        "The type was not found"));
+  resolver->Reject(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kNotFoundError, "The type was not found"));
   return promise;
 }
 
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
index 87d99cef..668d3a1b 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/clipboard/clipboard_reader.h"
 #include "third_party/blink/renderer/modules/permissions/permission_utils.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -112,7 +113,7 @@
 
 void ClipboardPromise::RejectFromReadOrDecodeFailure() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  script_promise_resolver_->Reject(DOMException::Create(
+  script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kDataError,
       "Failed to read or decode Blob for clipboard item type " +
           clipboard_item_data_[clipboard_representation_index_].first + "."));
@@ -136,7 +137,7 @@
   DCHECK(clipboard_items);
 
   if (clipboard_items->size() > 1) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError,
         "Support for multiple ClipboardItems is not implemented."));
     return;
@@ -165,7 +166,7 @@
 void ClipboardPromise::HandleReadWithPermission(PermissionStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (status != PermissionStatus::GRANTED) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Read permission denied."));
     return;
   }
@@ -182,7 +183,7 @@
   }
 
   if (!items.size()) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kDataError, "No valid data on clipboard."));
     return;
   }
@@ -194,7 +195,7 @@
 
 void ClipboardPromise::HandleReadTextWithPermission(PermissionStatus status) {
   if (status != PermissionStatus::GRANTED) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Read permission denied."));
     return;
   }
@@ -207,7 +208,7 @@
 void ClipboardPromise::HandleWriteWithPermission(PermissionStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (status != PermissionStatus::GRANTED) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Write permission denied."));
     return;
   }
@@ -220,13 +221,13 @@
     String type = type_and_blob.first;
     String type_with_args = type_and_blob.second->type();
     if (!ClipboardWriter::IsValidType(type)) {
-      script_promise_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                               "Write type " + type + " not supported."));
+      script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotAllowedError,
+          "Write type " + type + " not supported."));
       return;
     }
     if (!type_with_args.Contains(type)) {
-      script_promise_resolver_->Reject(DOMException::Create(
+      script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotAllowedError,
           "MIME type " + type + " does not match the blob type's MIME type " +
               type_with_args));
@@ -241,7 +242,7 @@
 void ClipboardPromise::HandleWriteTextWithPermission(PermissionStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (status != PermissionStatus::GRANTED) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Write permission denied."));
     return;
   }
@@ -266,14 +267,14 @@
   DCHECK(script_promise_resolver_);
 
   if (!IsFocusedDocument(ExecutionContext::From(script_state_))) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Document is not focused."));
     return;
   }
   if (!GetPermissionService()) {
-    script_promise_resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                             "Permission Service could not connect."));
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotAllowedError,
+        "Permission Service could not connect."));
     return;
   }
 
@@ -291,14 +292,14 @@
   DCHECK(script_promise_resolver_);
 
   if (!IsFocusedDocument(ExecutionContext::From(script_state_))) {
-    script_promise_resolver_->Reject(DOMException::Create(
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError, "Document is not focused."));
     return;
   }
   if (!GetPermissionService()) {
-    script_promise_resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                             "Permission Service could not connect."));
+    script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotAllowedError,
+        "Permission Service could not connect."));
     return;
   }
 
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
index 358380e..5edf747 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
@@ -24,6 +24,7 @@
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -536,7 +537,7 @@
     return;
 
   if (!backend_success) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError,
         "An unknown error occured while writing the cookie."));
     return;
@@ -553,7 +554,7 @@
     return;
 
   if (!backend_success) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError,
         "An unknown error occured while subscribing to cookie changes."));
     return;
@@ -571,7 +572,7 @@
     return;
 
   if (!backend_success) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError,
         "An unknown error occured while reading cookie change subscriptions."));
     return;
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
index 53534ce..0a5ab801 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/modules/credentialmanager/public_key_credential_request_options.h"
 #include "third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/weborigin/origin_access_entry.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -93,7 +94,7 @@
 
   if (required_origin_type == RequiredOriginType::kSecureAndSameWithAncestors &&
       !IsSameOriginWithAncestors(resolver->GetFrame())) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError,
         "The following credential operations can only occur in a document which"
         " is same-origin with all of its ancestors: "
@@ -132,8 +133,8 @@
         "The origin ' " + origin->ToRawString() +
         "' is an opaque origin and hence not allowed to access " +
         "'PublicKeyCredential' objects.";
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                                          error_message));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotAllowedError, error_message));
     return false;
   }
 
@@ -146,7 +147,7 @@
 
   if (origin->Protocol() != url::kHttpScheme &&
       origin->Protocol() != url::kHttpsScheme) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotAllowedError,
         "Public-key credentials are only available to HTTPS origin or "
         "HTTP origins that fall under 'localhost'. See "
@@ -173,9 +174,9 @@
     reject_because_invalid_domain = access_entry.HostIsIPAddress();
   }
   if (reject_because_invalid_domain) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kSecurityError,
-                             "Effective domain is not a valid domain."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kSecurityError,
+        "Effective domain is not a valid domain."));
     return false;
   }
 
@@ -189,7 +190,7 @@
     if (relying_party_id.IsEmpty() ||
         access_entry.MatchesDomain(*origin) !=
             network::cors::OriginAccessEntry::kMatchesOrigin) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kSecurityError,
           "The relying party ID '" + relying_party_id +
               "' is not a registrable domain suffix of, nor equal to '" +
@@ -219,72 +220,82 @@
     CredentialManagerError reason) {
   switch (reason) {
     case CredentialManagerError::PENDING_REQUEST:
-      return DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                  "A request is already pending.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "A request is already pending.");
     case CredentialManagerError::PASSWORD_STORE_UNAVAILABLE:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "The password store is unavailable.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "The password store is unavailable.");
     case CredentialManagerError::NOT_ALLOWED:
-      return DOMException::Create(
+      return MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotAllowedError,
           "The operation either timed out or was not allowed. See: "
           "https://w3c.github.io/webauthn/#sec-assertion-privacy.");
     case CredentialManagerError::INVALID_DOMAIN:
-      return DOMException::Create(DOMExceptionCode::kSecurityError,
-                                  "This is an invalid domain.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kSecurityError, "This is an invalid domain.");
     case CredentialManagerError::CREDENTIAL_EXCLUDED:
-      return DOMException::Create(
+      return MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kInvalidStateError,
           "The user attempted to register an authenticator that contains one "
           "of the credentials already registered with the relying party.");
     case CredentialManagerError::CREDENTIAL_NOT_RECOGNIZED:
-      return DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                  "The user attempted to use an authenticator "
-                                  "that recognized none of the provided "
-                                  "credentials.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "The user attempted to use an authenticator "
+          "that recognized none of the provided "
+          "credentials.");
     case CredentialManagerError::NOT_IMPLEMENTED:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "Not implemented");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError, "Not implemented");
     case CredentialManagerError::NOT_FOCUSED:
-      return DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                                  "The operation is not allowed at this time "
-                                  "because the page does not have focus.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotAllowedError,
+          "The operation is not allowed at this time "
+          "because the page does not have focus.");
     case CredentialManagerError::RESIDENT_CREDENTIALS_UNSUPPORTED:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "Resident credentials or empty "
-                                  "'allowCredentials' lists are not supported "
-                                  "at this time.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "Resident credentials or empty "
+          "'allowCredentials' lists are not supported "
+          "at this time.");
     case CredentialManagerError::PROTECTION_POLICY_INCONSISTENT:
-      return DOMException::Create(
+      return MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError,
           "Requested protection policy is inconsistent or incongurent with "
           "other requested parameters.");
     case CredentialManagerError::ANDROID_ALGORITHM_UNSUPPORTED:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "None of the algorithms specified in "
-                                  "`pubKeyCredParams` are supported by "
-                                  "this device.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "None of the algorithms specified in "
+          "`pubKeyCredParams` are supported by "
+          "this device.");
     case CredentialManagerError::ANDROID_EMPTY_ALLOW_CREDENTIALS:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "Use of an empty `allowCredentials` list is "
-                                  "not supported on this device.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "Use of an empty `allowCredentials` list is "
+          "not supported on this device.");
     case CredentialManagerError::ANDROID_NOT_SUPPORTED_ERROR:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "Either the device has received unexpected "
-                                  "request parameters, or the device "
-                                  "cannot support this request.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "Either the device has received unexpected "
+          "request parameters, or the device "
+          "cannot support this request.");
     case CredentialManagerError::ANDROID_USER_VERIFICATION_UNSUPPORTED:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "The specified `userVerification` "
-                                  "requirement cannot be fulfilled by "
-                                  "this device unless the device is secured "
-                                  "with a screen lock.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "The specified `userVerification` "
+          "requirement cannot be fulfilled by "
+          "this device unless the device is secured "
+          "with a screen lock.");
     case CredentialManagerError::ABORT:
-      return DOMException::Create(DOMExceptionCode::kAbortError);
+      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError);
     case CredentialManagerError::UNKNOWN:
-      return DOMException::Create(DOMExceptionCode::kNotReadableError,
-                                  "An unknown error occurred while talking "
-                                  "to the credential manager.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotReadableError,
+          "An unknown error occurred while talking "
+          "to the credential manager.");
     case CredentialManagerError::SUCCESS:
       NOTREACHED();
       break;
@@ -491,16 +502,16 @@
         if (!appid.IsEmpty()) {
           KURL appid_url(appid);
           if (!appid_url.IsValid()) {
-            resolver->Reject(
-                DOMException::Create(DOMExceptionCode::kSyntaxError,
-                                     "The `appid` extension value is neither "
-                                     "empty/null nor a valid URL"));
+            resolver->Reject(MakeGarbageCollected<DOMException>(
+                DOMExceptionCode::kSyntaxError,
+                "The `appid` extension value is neither "
+                "empty/null nor a valid URL"));
             return promise;
           }
         }
       }
       if (options->publicKey()->extensions()->hasCableRegistration()) {
-        resolver->Reject(DOMException::Create(
+        resolver->Reject(MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kNotSupportedError,
             "The 'cableRegistration' extension is only valid when creating "
             "a credential"));
@@ -534,7 +545,7 @@
               &OnGetAssertionComplete,
               WTF::Passed(std::make_unique<ScopedPromiseResolver>(resolver))));
     } else {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError,
           "Required parameters missing in 'options.publicKey'."));
     }
@@ -591,7 +602,7 @@
 
   if (!(credential->IsFederatedCredential() ||
         credential->IsPasswordCredential())) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotSupportedError,
         "Store operation not permitted for PublicKey credentials."));
     return promise;
@@ -604,8 +615,8 @@
           ? static_cast<const FederatedCredential*>(credential)->iconURL()
           : static_cast<const PasswordCredential*>(credential)->iconURL();
   if (!IsIconURLNullOrSecure(url)) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSecurityError,
-                                          "'iconURL' should be a secure URL"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kSecurityError, "'iconURL' should be a secure URL"));
     return promise;
   }
 
@@ -636,7 +647,7 @@
 
   if ((options->hasPassword() + options->hasFederated() +
        options->hasPublicKey()) != 1) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotSupportedError,
         "Only exactly one of 'password', 'federated', and 'publicKey' "
         "credential types are currently supported."));
@@ -673,7 +684,7 @@
 
     if (options->publicKey()->hasExtensions()) {
       if (options->publicKey()->extensions()->hasAppid()) {
-        resolver->Reject(DOMException::Create(
+        resolver->Reject(MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kNotSupportedError,
             "The 'appid' extension is only valid when requesting an assertion "
             "for a pre-existing credential that was registered using the "
@@ -681,7 +692,7 @@
         return promise;
       }
       if (options->publicKey()->extensions()->hasCableAuthentication()) {
-        resolver->Reject(DOMException::Create(
+        resolver->Reject(MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kNotSupportedError,
             "The 'cableAuthentication' extension is only valid when requesting "
             "an assertion"));
@@ -701,7 +712,7 @@
     auto mojo_options =
         MojoPublicKeyCredentialCreationOptions::From(options->publicKey());
     if (!mojo_options) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError,
           "Required parameters missing in `options.publicKey`."));
     } else if (mojo_options->user->id.size() > 64) {
@@ -719,18 +730,18 @@
 
       if (mojo_options->relying_party->icon) {
         if (!IsIconURLNullOrSecure(mojo_options->relying_party->icon.value())) {
-          resolver->Reject(
-              DOMException::Create(DOMExceptionCode::kSecurityError,
-                                   "'rp.icon' should be a secure URL"));
+          resolver->Reject(MakeGarbageCollected<DOMException>(
+              DOMExceptionCode::kSecurityError,
+              "'rp.icon' should be a secure URL"));
           return promise;
         }
       }
 
       if (mojo_options->user->icon) {
         if (!IsIconURLNullOrSecure(mojo_options->user->icon.value())) {
-          resolver->Reject(
-              DOMException::Create(DOMExceptionCode::kSecurityError,
-                                   "'user.icon' should be a secure URL"));
+          resolver->Reject(MakeGarbageCollected<DOMException>(
+              DOMExceptionCode::kSecurityError,
+              "'user.icon' should be a secure URL"));
           return promise;
         }
       }
diff --git a/third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.cc b/third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.cc
index 03e877e..d69c5866 100644
--- a/third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/credentialmanager/scoped_promise_resolver.h"
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -23,7 +24,7 @@
 void ScopedPromiseResolver::OnConnectionError() {
   // The only anticipated reason for a connection error is that the embedder
   // does not implement mojom::AuthenticatorImpl.
-  resolver_->Reject(DOMException::Create(
+  resolver_->Reject(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kNotSupportedError,
       "The user agent does not support public key credentials."));
 }
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
index f10efd9..8749a73 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
+++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/modules/crypto/normalize_algorithm.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -141,12 +142,12 @@
   if (exception_code == ToExceptionCode(ESErrorType::kTypeError)) {
     RejectWithTypeError(error_details, resolver_);
   } else if (IsDOMExceptionCode(exception_code)) {
-    resolver_->Reject(DOMException::Create(
+    resolver_->Reject(MakeGarbageCollected<DOMException>(
         static_cast<DOMExceptionCode>(exception_code), error_details));
   } else {
     NOTREACHED();
-    resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kUnknownError, error_details));
+    resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kUnknownError, error_details));
   }
   ClearResolver();
 }
diff --git a/third_party/blink/renderer/modules/csspaint/OWNERS b/third_party/blink/renderer/modules/csspaint/OWNERS
index b9770dac..f61c6d21 100644
--- a/third_party/blink/renderer/modules/csspaint/OWNERS
+++ b/third_party/blink/renderer/modules/csspaint/OWNERS
@@ -2,5 +2,5 @@
 ikilpatrick@chromium.org
 xidachen@chromium.org
 
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
index 387f29e..8914f53 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/content_decryption_module_result.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
@@ -373,7 +374,8 @@
   //    promise rejected with an InvalidStateError.
   if (this_element.is_attaching_media_keys_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Another request is in progress."));
   }
 
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc
index 67ea539..3edc0dc 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc
@@ -50,6 +50,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/content_decryption_module_result.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/instance_counters.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
 #include "third_party/blink/renderer/platform/timer.h"
@@ -108,23 +109,25 @@
 static ScriptPromise CreateRejectedPromiseNotCallable(
     ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                          "The session is not callable."));
 }
 
 static ScriptPromise CreateRejectedPromiseAlreadyClosed(
     ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                          "The session is already closed."));
 }
 
 static ScriptPromise CreateRejectedPromiseAlreadyInitialized(
     ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state,
-      DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                           "The session is already initialized."));
+      script_state, MakeGarbageCollected<DOMException>(
+                        DOMExceptionCode::kInvalidStateError,
+                        "The session is already initialized."));
 }
 
 // A class holding a pending action.
@@ -479,10 +482,10 @@
       EncryptedMediaUtils::ConvertToInitDataType(init_data_type_string);
   if (init_data_type == WebEncryptedMediaInitDataType::kUnknown) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                           "The initialization data type '" +
-                                               init_data_type_string +
-                                               "' is not supported."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kNotSupportedError,
+                          "The initialization data type '" +
+                              init_data_type_string + "' is not supported."));
   }
 
   // 7. Let init data be a copy of the contents of the initData parameter.
diff --git a/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc b/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
index 6c0b9ae6..ab85f81e 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
@@ -30,6 +30,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/encrypted_media_request.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
 #include "third_party/blink/renderer/platform/network/parsed_content_type.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -93,8 +94,8 @@
   if (!IsExecutionContextValid())
     return;
 
-  resolver_->Reject(DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                         error_message));
+  resolver_->Reject(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kNotSupportedError, error_message));
   resolver_.Clear();
 }
 
@@ -121,7 +122,7 @@
                                kEncryptedMediaFeaturePolicyConsoleWarning));
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kSecurityError,
             "requestMediaKeySystemAccess is disabled by feature policy."));
   }
@@ -151,7 +152,7 @@
   if (!document->GetPage()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "The context provided is not associated with a page."));
   }
diff --git a/third_party/blink/renderer/modules/hid/hid.cc b/third_party/blink/renderer/modules/hid/hid.cc
index 42cdf03..70d801cc 100644
--- a/third_party/blink/renderer/modules/hid/hid.cc
+++ b/third_party/blink/renderer/modules/hid/hid.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
 #include "third_party/blink/renderer/modules/hid/hid_connection_event.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -19,14 +20,16 @@
 
 ScriptPromise HID::getDevices(ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
 ScriptPromise HID::requestDevice(ScriptState* script_state,
                                  const HIDDeviceRequestOptions* options) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
diff --git a/third_party/blink/renderer/modules/hid/hid_device.cc b/third_party/blink/renderer/modules/hid/hid_device.cc
index c702250..73bde94 100644
--- a/third_party/blink/renderer/modules/hid/hid_device.cc
+++ b/third_party/blink/renderer/modules/hid/hid_device.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
 #include "third_party/blink/renderer/modules/hid/hid_collection_info.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -48,13 +49,15 @@
 
 ScriptPromise HIDDevice::open(ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
 ScriptPromise HIDDevice::close(ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
@@ -62,7 +65,8 @@
                                     uint8_t report_id,
                                     const ArrayBufferOrArrayBufferView& data) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
@@ -71,14 +75,16 @@
     uint8_t report_id,
     const ArrayBufferOrArrayBufferView& data) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
 ScriptPromise HIDDevice::receiveFeatureReport(ScriptState* script_state,
                                               uint8_t report_id) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+      script_state,
+      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                          "Not supported."));
 }
 
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.cc b/third_party/blink/renderer/modules/idle/idle_detector.cc
index d60b36c4..be8c8ea 100644
--- a/third_party/blink/renderer/modules/idle/idle_detector.cc
+++ b/third_party/blink/renderer/modules/idle/idle_detector.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <utility>
-
 #include "third_party/blink/renderer/modules/idle/idle_detector.h"
 
+#include <utility>
+
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/mojom/idle/idle_manager.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/modules/idle/idle_state.h"
 #include "third_party/blink/renderer/platform/bindings/name_client.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 
 namespace blink {
@@ -82,7 +83,8 @@
           mojom::FeaturePolicyFeature::kIdleDetection,
           ReportOptions::kReportOnFailure)) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kSecurityError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError,
                                            kFeaturePolicyBlocked));
   }
 
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
index 99c7580..60562ee7 100644
--- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc
+++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/imagecapture/image_capture.h"
 
+#include <memory>
 #include <utility>
 
 #include "services/service_manager/public/cpp/interface_provider.h"
@@ -23,6 +24,7 @@
 #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h"
 #include "third_party/blink/renderer/modules/mediastream/media_track_capabilities.h"
 #include "third_party/blink/renderer/modules/mediastream/media_track_constraints.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/mojo/mojo_helper.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -126,8 +128,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!service_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
     return promise;
   }
   service_requests_.insert(resolver);
@@ -152,8 +154,8 @@
   ScriptPromise promise = resolver->Promise();
 
   if (!service_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
     return promise;
   }
   service_requests_.insert(resolver);
@@ -182,15 +184,15 @@
   ScriptPromise promise = resolver->Promise();
 
   if (TrackIsInactive(*stream_track_)) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The associated Track is in an invalid state."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "The associated Track is in an invalid state."));
     return promise;
   }
 
   if (!service_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
     return promise;
   }
   service_requests_.insert(resolver);
@@ -204,9 +206,9 @@
     if (photo_capabilities_ &&
         (height < photo_capabilities_->imageHeight()->min() ||
          height > photo_capabilities_->imageHeight()->max())) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "imageHeight setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "imageHeight setting out of range"));
       return promise;
     }
     settings->height = height;
@@ -217,9 +219,9 @@
     if (photo_capabilities_ &&
         (width < photo_capabilities_->imageWidth()->min() ||
          width > photo_capabilities_->imageWidth()->max())) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "imageWidth setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "imageWidth setting out of range"));
       return promise;
     }
     settings->width = width;
@@ -229,9 +231,9 @@
   if (settings->has_red_eye_reduction) {
     if (photo_capabilities_ &&
         !photo_capabilities_->IsRedEyeReductionControllable()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "redEyeReduction is not controllable."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "redEyeReduction is not controllable."));
       return promise;
     }
     settings->red_eye_reduction = photo_settings->redEyeReduction();
@@ -242,7 +244,7 @@
     const String fill_light_mode = photo_settings->fillLightMode();
     if (photo_capabilities_ && photo_capabilities_->fillLightMode().Find(
                                    fill_light_mode) == kNotFound) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "Unsupported fillLightMode"));
       return promise;
     }
@@ -263,14 +265,14 @@
   ScriptPromise promise = resolver->Promise();
 
   if (TrackIsInactive(*stream_track_)) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The associated Track is in an invalid state."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "The associated Track is in an invalid state."));
     return promise;
   }
   if (!service_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
     return promise;
   }
 
@@ -304,9 +306,9 @@
   ScriptPromise promise = resolver->Promise();
 
   if (TrackIsInactive(*stream_track_)) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "The associated Track is in an invalid state."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "The associated Track is in an invalid state."));
     return promise;
   }
 
@@ -316,7 +318,7 @@
   }
 
   if (!frame_grabber_) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError, "Couldn't create platform resources"));
     return promise;
   }
@@ -343,8 +345,8 @@
     const HeapVector<Member<MediaTrackConstraintSet>>& constraints_vector) {
   DCHECK_GT(constraints_vector.size(), 0u);
   if (!service_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
     return;
   }
   // TODO(mcasas): add support more than one single advanced constraint.
@@ -367,8 +369,8 @@
       (constraints->hasFocusDistance() && !capabilities_->hasFocusDistance()) ||
       (constraints->hasZoom() && !capabilities_->hasZoom()) ||
       (constraints->hasTorch() && !capabilities_->hasTorch())) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                          "Unsupported constraint(s)"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotSupportedError, "Unsupported constraint(s)"));
     return;
   }
 
@@ -384,9 +386,9 @@
         constraints->whiteBalanceMode().GetAsString();
     if (capabilities_->whiteBalanceMode().Find(white_balance_mode) ==
         kNotFound) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "Unsupported whiteBalanceMode."));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "Unsupported whiteBalanceMode."));
       return;
     }
     temp_constraints->setWhiteBalanceMode(constraints->whiteBalanceMode());
@@ -397,7 +399,7 @@
   if (settings->has_exposure_mode) {
     const auto exposure_mode = constraints->exposureMode().GetAsString();
     if (capabilities_->exposureMode().Find(exposure_mode) == kNotFound) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "Unsupported exposureMode."));
       return;
     }
@@ -410,7 +412,7 @@
   if (settings->has_focus_mode) {
     const auto focus_mode = constraints->focusMode().GetAsString();
     if (capabilities_->focusMode().Find(focus_mode) == kNotFound) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "Unsupported focusMode."));
       return;
     }
@@ -440,9 +442,9 @@
         constraints->exposureCompensation().GetAsDouble();
     if (exposure_compensation < capabilities_->exposureCompensation()->min() ||
         exposure_compensation > capabilities_->exposureCompensation()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "exposureCompensation setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "exposureCompensation setting out of range"));
       return;
     }
     temp_constraints->setExposureCompensation(
@@ -456,9 +458,9 @@
     const auto exposure_time = constraints->exposureTime().GetAsDouble();
     if (exposure_time < capabilities_->exposureTime()->min() ||
         exposure_time > capabilities_->exposureTime()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "exposureTime setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "exposureTime setting out of range"));
       return;
     }
     temp_constraints->setExposureTime(constraints->exposureTime());
@@ -471,9 +473,9 @@
         constraints->colorTemperature().GetAsDouble();
     if (color_temperature < capabilities_->colorTemperature()->min() ||
         color_temperature > capabilities_->colorTemperature()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "colorTemperature setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "colorTemperature setting out of range"));
       return;
     }
     temp_constraints->setColorTemperature(constraints->colorTemperature());
@@ -484,7 +486,7 @@
     const auto iso = constraints->iso().GetAsDouble();
     if (iso < capabilities_->iso()->min() ||
         iso > capabilities_->iso()->max()) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "iso setting out of range"));
       return;
     }
@@ -498,9 +500,9 @@
     const auto brightness = constraints->brightness().GetAsDouble();
     if (brightness < capabilities_->brightness()->min() ||
         brightness > capabilities_->brightness()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "brightness setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "brightness setting out of range"));
       return;
     }
     temp_constraints->setBrightness(constraints->brightness());
@@ -512,9 +514,9 @@
     const auto contrast = constraints->contrast().GetAsDouble();
     if (contrast < capabilities_->contrast()->min() ||
         contrast > capabilities_->contrast()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "contrast setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "contrast setting out of range"));
       return;
     }
     temp_constraints->setContrast(constraints->contrast());
@@ -526,9 +528,9 @@
     const auto saturation = constraints->saturation().GetAsDouble();
     if (saturation < capabilities_->saturation()->min() ||
         saturation > capabilities_->saturation()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "saturation setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "saturation setting out of range"));
       return;
     }
     temp_constraints->setSaturation(constraints->saturation());
@@ -540,9 +542,9 @@
     const auto sharpness = constraints->sharpness().GetAsDouble();
     if (sharpness < capabilities_->sharpness()->min() ||
         sharpness > capabilities_->sharpness()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "sharpness setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "sharpness setting out of range"));
       return;
     }
     temp_constraints->setSharpness(constraints->sharpness());
@@ -555,9 +557,9 @@
     const auto focus_distance = constraints->focusDistance().GetAsDouble();
     if (focus_distance < capabilities_->focusDistance()->min() ||
         focus_distance > capabilities_->focusDistance()->max()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                               "focusDistance setting out of range"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError,
+          "focusDistance setting out of range"));
       return;
     }
     temp_constraints->setFocusDistance(constraints->focusDistance());
@@ -569,7 +571,7 @@
     const auto zoom = constraints->zoom().GetAsDouble();
     if (zoom < capabilities_->zoom()->min() ||
         zoom > capabilities_->zoom()->max()) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "zoom setting out of range"));
       return;
     }
@@ -583,7 +585,7 @@
   if (settings->has_torch) {
     const auto torch = constraints->torch().GetAsBoolean();
     if (torch && !capabilities_->torch()) {
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError, "torch not supported"));
       return;
     }
@@ -689,8 +691,8 @@
   DCHECK(service_requests_.Contains(resolver));
 
   if (photo_state.is_null()) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                          "platform error"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kUnknownError, "platform error"));
     service_requests_.erase(resolver);
     return;
   }
@@ -740,8 +742,8 @@
                        TRACE_EVENT_SCOPE_PROCESS);
 
   if (!result) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                          "setOptions failed"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kUnknownError, "setOptions failed"));
     service_requests_.erase(resolver);
     return;
   }
@@ -766,8 +768,8 @@
 
   // TODO(mcasas): Should be using a mojo::StructTraits.
   if (blob->data.IsEmpty()) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kUnknownError,
-                                          "platform error"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kUnknownError, "platform error"));
   } else {
     resolver->Resolve(
         Blob::Create(blob->data.data(), blob->data.size(), blob->mime_type));
@@ -889,8 +891,8 @@
 void ImageCapture::OnServiceConnectionError() {
   service_.reset();
   for (ScriptPromiseResolver* resolver : service_requests_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                          kNoServiceError));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotFoundError, kNoServiceError));
   }
   service_requests_.clear();
 }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
index 1e35a4b..c649ae1 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_transaction_impl.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -79,10 +80,10 @@
     if (promise_resolver_) {
       probe::AsyncTaskCanceled(
           ExecutionContext::From(promise_resolver_->GetScriptState()), this);
-      promise_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kUnknownError,
-                               "An unexpected shutdown occured before the "
-                               "databases() promise could be resolved"));
+      promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError,
+          "An unexpected shutdown occured before the "
+          "databases() promise could be resolved"));
     }
   }
 
@@ -96,9 +97,9 @@
     probe::AsyncTask async_task(
         ExecutionContext::From(promise_resolver_->GetScriptState()), this,
         "error");
-    promise_resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kUnknownError,
-                             "The databases() promise was rejected."));
+    promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kUnknownError,
+        "The databases() promise was rejected."));
     promise_resolver_.Clear();
   }
 
@@ -268,7 +269,7 @@
 
   if (!IndexedDBClient::From(ExecutionContext::From(script_state))
            ->AllowIndexedDB(ExecutionContext::From(script_state))) {
-    request->HandleResponse(DOMException::Create(
+    request->HandleResponse(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError, kPermissionDeniedErrorMessage));
     return request;
   }
@@ -331,7 +332,7 @@
 
   if (!IndexedDBClient::From(ExecutionContext::From(script_state))
            ->AllowIndexedDB(ExecutionContext::From(script_state))) {
-    request->HandleResponse(DOMException::Create(
+    request->HandleResponse(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError, kPermissionDeniedErrorMessage));
     return request;
   }
@@ -399,7 +400,7 @@
 
   if (!IndexedDBClient::From(ExecutionContext::From(script_state))
            ->AllowIndexedDB(ExecutionContext::From(script_state))) {
-    request->HandleResponse(DOMException::Create(
+    request->HandleResponse(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kUnknownError, kPermissionDeniedErrorMessage));
     return request;
   }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
index 5b2d5db3..918087fc 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/optional.h"
 #include "third_party/blink/renderer/bindings/modules/v8/idb_object_store_or_idb_index_or_idb_cursor.h"
@@ -35,6 +36,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_database_callbacks.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_tracing.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -183,8 +185,8 @@
       ResultAsAny()->GetType() == IDBAny::kIDBDatabaseType &&
       ResultAsAny()->IdbDatabase()->IsClosePending()) {
     SetResult(nullptr);
-    HandleResponse(DOMException::Create(DOMExceptionCode::kAbortError,
-                                        "The connection was closed."));
+    HandleResponse(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kAbortError, "The connection was closed."));
     return DispatchEventResult::kCanceledBeforeDispatch;
   }
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
index 7ca6c4ff..29cdfd5 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
@@ -51,6 +51,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -230,7 +231,7 @@
 
   error_.Clear();
   result_.Clear();
-  EnqueueResponse(DOMException::Create(
+  EnqueueResponse(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kAbortError,
       "The transaction was aborted, so the request cannot be fulfilled."));
   request_aborted_ = true;
@@ -708,9 +709,9 @@
       // Transactions should be aborted after event dispatch if an exception was
       // not caught.
       if (event.LegacyDidListenersThrow()) {
-        transaction_->SetError(
-            DOMException::Create(DOMExceptionCode::kAbortError,
-                                 "Uncaught exception in event handler."));
+        transaction_->SetError(MakeGarbageCollected<DOMException>(
+            DOMExceptionCode::kAbortError,
+            "Uncaught exception in event handler."));
         transaction_->abort(IGNORE_EXCEPTION_FOR_TESTING);
       } else if (event.type() == event_type_names::kError &&
                  dispatch_result == DispatchEventResult::kNotCanceled) {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
index 22ab631..f771af7 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
@@ -144,7 +145,7 @@
   DCHECK(started_);
   DCHECK(!canceled_);
 #endif  // DCHECK_IS_ON()
-  queue_item_->OnResultLoadComplete(DOMException::Create(
+  queue_item_->OnResultLoadComplete(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kDataError, "Failed to read large IndexedDB value"));
 }
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc
index 454fde5..aa3e270 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request_test.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/memory/scoped_refptr.h"
@@ -55,6 +56,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 #include "third_party/blink/renderer/platform/wtf/dtoa/utils.h"
@@ -211,8 +213,8 @@
   ASSERT_TRUE(request->transaction());
   V8TestingScope scope;
 
-  request->HandleResponse(DOMException::Create(DOMExceptionCode::kAbortError,
-                                               "Description goes here."));
+  request->HandleResponse(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Description goes here."));
   request->HandleResponse(nullptr, IDBKey::CreateInvalid(),
                           IDBKey::CreateInvalid(),
                           CreateNullIDBValueForTesting(scope.GetIsolate()));
@@ -360,8 +362,8 @@
 
   // Now simulate the back end having fired an abort error at the request to
   // clear up any intermediaries.  Ensure an assertion is not raised.
-  request->HandleResponse(DOMException::Create(DOMExceptionCode::kAbortError,
-                                               "Description goes here."));
+  request->HandleResponse(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Description goes here."));
 
   // Stop the request lest it be GCed and its destructor
   // finds the object in a pending state (and asserts.)
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
index cc1a1f3..170b823 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/scoped_refptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -51,6 +52,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h"
 #include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h"
 #include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 #include "v8/include/v8.h"
@@ -146,8 +148,8 @@
   // This will generate an Abort() call to the back end which is dropped by the
   // fake proxy, so an explicit OnAbort call is made.
   scope.GetExecutionContext()->NotifyContextDestroyed();
-  transaction_->OnAbort(
-      DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  transaction_->OnAbort(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Aborted"));
   transaction_.Clear();
   store_.Clear();
 
@@ -189,8 +191,8 @@
   // This will generate an Abort() call to the back end which is dropped by the
   // fake proxy, so an explicit OnAbort call is made.
   scope.GetExecutionContext()->NotifyContextDestroyed();
-  transaction_->OnAbort(
-      DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  transaction_->OnAbort(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Aborted"));
   transaction_.Clear();
   store_.Clear();
 
@@ -235,8 +237,8 @@
   // This will generate an Abort() call to the back end which is dropped by the
   // fake proxy, so an explicit OnAbort call is made.
   scope.GetExecutionContext()->NotifyContextDestroyed();
-  transaction_->OnAbort(
-      DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  transaction_->OnAbort(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Aborted"));
   transaction_.Clear();
   store_.Clear();
 
@@ -284,8 +286,8 @@
   // This will generate an Abort() call to the back end which is dropped by the
   // fake proxy, so an explicit OnAbort call is made.
   scope.GetExecutionContext()->NotifyContextDestroyed();
-  transaction_->OnAbort(
-      DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  transaction_->OnAbort(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Aborted"));
   transaction_.Clear();
   store_.Clear();
 
@@ -335,8 +337,8 @@
   // This will generate an Abort() call to the back end which is dropped by the
   // fake proxy, so an explicit OnAbort call is made.
   scope.GetDocument().Shutdown();
-  transaction_->OnAbort(
-      DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  transaction_->OnAbort(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "Aborted"));
   transaction_.Clear();
   store_.Clear();
 
@@ -383,8 +385,8 @@
 
   // Fire an abort to make sure this doesn't free the transaction during use.
   // The test will not fail if it is, but ASAN would notice the error.
-  db_->OnAbort(kTransactionId,
-               DOMException::Create(DOMExceptionCode::kAbortError, "Aborted"));
+  db_->OnAbort(kTransactionId, MakeGarbageCollected<DOMException>(
+                                   DOMExceptionCode::kAbortError, "Aborted"));
 
   // OnAbort() should have cleared the transaction's reference to the database.
   ThreadState::Current()->CollectAllGarbageForTesting();
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
index 58dab1cf..8e3f8dc 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/ptr_util.h"
 #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
@@ -43,6 +44,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
@@ -106,8 +108,8 @@
     return;
 
   probe::AsyncTask async_task(request_->GetExecutionContext(), this, "error");
-  request_->HandleResponse(
-      DOMException::Create(static_cast<DOMExceptionCode>(code), message));
+  request_->HandleResponse(MakeGarbageCollected<DOMException>(
+      static_cast<DOMExceptionCode>(code), message));
   Detach();
 }
 
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.cc
index 5ac0a0b4..41a9ffd 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.cc
@@ -25,7 +25,7 @@
 
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.h"
 
-#include <memory>
+#include <utility>
 
 #include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
@@ -34,6 +34,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_observation.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -62,8 +63,8 @@
   if (callbacks_) {
     callbacks_->OnAbort(
         transaction_id,
-        DOMException::Create(static_cast<DOMExceptionCode>(error.Code()),
-                             error.Message()));
+        MakeGarbageCollected<DOMException>(
+            static_cast<DOMExceptionCode>(error.Code()), error.Message()));
   }
 }
 
diff --git a/third_party/blink/renderer/modules/installedapp/navigator_installed_app.cc b/third_party/blink/renderer/modules/installedapp/navigator_installed_app.cc
index e8a382a..1e59bd2e 100644
--- a/third_party/blink/renderer/modules/installedapp/navigator_installed_app.cc
+++ b/third_party/blink/renderer/modules/installedapp/navigator_installed_app.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/modules/installedapp/installed_app_controller.h"
 #include "third_party/blink/renderer/modules/installedapp/related_application.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -57,7 +58,7 @@
 
   InstalledAppController* app_controller = Controller();
   if (!app_controller) {  // If the associated frame is detached
-    DOMException* exception = DOMException::Create(
+    auto* exception = MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kInvalidStateError,
         "The object is no longer associated to a document.");
     resolver->Reject(exception);
@@ -65,10 +66,10 @@
   }
 
   if (!app_controller->GetSupplementable()->IsMainFrame()) {
-    DOMException* exception =
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "getInstalledRelatedApps() is only supported in "
-                             "top-level browsing contexts.");
+    auto* exception = MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kInvalidStateError,
+        "getInstalledRelatedApps() is only supported in "
+        "top-level browsing contexts.");
     resolver->Reject(exception);
     return promise;
   }
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
index c87f8e63..0b2456e 100644
--- a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
+++ b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -40,19 +41,22 @@
 
   if (!IsLocalFrameAttached()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kKeyboardMapFrameDetachedErrorMsg));
   }
 
   if (!CalledFromSupportedContext(ExecutionContext::From(script_state))) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kKeyboardMapChildFrameErrorMsg));
   }
 
   if (!EnsureServiceConnected()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kKeyboardMapRequestFailedErrorMsg));
   }
 
@@ -100,9 +104,9 @@
           MakeGarbageCollected<KeyboardLayoutMap>(result->layout_map));
       break;
     case mojom::blink::GetKeyboardLayoutMapStatus::kFail:
-      script_promise_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               kKeyboardMapRequestFailedErrorMsg));
+      script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          kKeyboardMapRequestFailedErrorMsg));
       break;
   }
 
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc b/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc
index 46d3e09..2a3e41b 100644
--- a/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc
+++ b/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -46,20 +47,23 @@
 
   if (!IsLocalFrameAttached()) {
     return ScriptPromise::RejectWithDOMException(
-        state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                    kKeyboardLockFrameDetachedErrorMsg));
+        state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
+                                           kKeyboardLockFrameDetachedErrorMsg));
   }
 
   if (!CalledFromSupportedContext(ExecutionContext::From(state))) {
     return ScriptPromise::RejectWithDOMException(
-        state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                    kKeyboardLockChildFrameErrorMsg));
+        state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
+                                           kKeyboardLockChildFrameErrorMsg));
   }
 
   if (!EnsureServiceConnected()) {
     return ScriptPromise::RejectWithDOMException(
-        state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                                    kKeyboardLockRequestFailedErrorMsg));
+        state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
+                                           kKeyboardLockRequestFailedErrorMsg));
   }
 
   request_keylock_resolver_ =
@@ -118,7 +122,7 @@
 
   // If |resolver| is not the current promise, then reject the promise.
   if (resolver != request_keylock_resolver_) {
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kAbortError, kKeyboardLockPromisePreemptedErrorMsg));
     return;
   }
@@ -128,24 +132,24 @@
       request_keylock_resolver_->Resolve();
       break;
     case mojom::KeyboardLockRequestResult::kFrameDetachedError:
-      request_keylock_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               kKeyboardLockFrameDetachedErrorMsg));
+      request_keylock_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          kKeyboardLockFrameDetachedErrorMsg));
       break;
     case mojom::KeyboardLockRequestResult::kNoValidKeyCodesError:
-      request_keylock_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidAccessError,
-                               kKeyboardLockNoValidKeyCodesErrorMsg));
+      request_keylock_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidAccessError,
+          kKeyboardLockNoValidKeyCodesErrorMsg));
       break;
     case mojom::KeyboardLockRequestResult::kChildFrameError:
-      request_keylock_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               kKeyboardLockChildFrameErrorMsg));
+      request_keylock_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          kKeyboardLockChildFrameErrorMsg));
       break;
     case mojom::KeyboardLockRequestResult::kRequestFailedError:
-      request_keylock_resolver_->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               kKeyboardLockRequestFailedErrorMsg));
+      request_keylock_resolver_->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          kKeyboardLockRequestFailedErrorMsg));
       break;
   }
   request_keylock_resolver_ = nullptr;
diff --git a/third_party/blink/renderer/modules/locks/lock.cc b/third_party/blink/renderer/modules/locks/lock.cc
index 8238cd5..515ce51 100644
--- a/third_party/blink/renderer/modules/locks/lock.cc
+++ b/third_party/blink/renderer/modules/locks/lock.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/locks/lock_manager.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -145,7 +146,7 @@
 }
 
 void Lock::OnConnectionError() {
-  resolver_->Reject(DOMException::Create(
+  resolver_->Reject(MakeGarbageCollected<DOMException>(
       DOMExceptionCode::kAbortError,
       "Lock broken by another request with the 'steal' option."));
 }
diff --git a/third_party/blink/renderer/modules/locks/lock_manager.cc b/third_party/blink/renderer/modules/locks/lock_manager.cc
index 4053763..410660a 100644
--- a/third_party/blink/renderer/modules/locks/lock_manager.cc
+++ b/third_party/blink/renderer/modules/locks/lock_manager.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/bindings/name_client.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -102,8 +103,8 @@
     if (!resolver_->GetScriptState()->ContextIsValid())
       return;
 
-    resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kAbortError, reason));
+    resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kAbortError, reason));
   }
 
   void Failed() override {
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
index 5d533c97..a04f390b 100644
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
+++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/media_capabilities/media_capabilities.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/optional.h"
 #include "media/base/mime_util.h"
@@ -44,6 +45,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/to_v8.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/network/parsed_content_type.h"
@@ -728,7 +730,7 @@
                                       WrapPersistent(resolver)));
       return promise;
     }
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kInvalidStateError,
         "Platform error: could not get EncodingInfoHandler."));
     return promise;
@@ -743,7 +745,7 @@
                                       WrapPersistent(resolver)));
       return promise;
     }
-    resolver->Reject(DOMException::Create(
+    resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kInvalidStateError,
         "Platform error: could not create MediaRecorderHandler."));
     return promise;
@@ -794,10 +796,10 @@
                                mojom::ConsoleMessageLevel::kWarning,
                                kEncryptedMediaFeaturePolicyConsoleWarning));
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kSecurityError,
-                             "decodingInfo(): Creating MediaKeySystemAccess is "
-                             "disabled by feature policy."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kSecurityError,
+                          "decodingInfo(): Creating MediaKeySystemAccess is "
+                          "disabled by feature policy."));
   }
 
   // Calling context must have a real Document bound to a Page. This check is
@@ -805,7 +807,7 @@
   if (!document->GetPage()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "The context provided is not associated with a page."));
   }
@@ -813,17 +815,17 @@
   if (execution_context->IsWorkerGlobalScope()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "Encrypted Media decoding info not available in Worker context."));
   }
 
   if (!execution_context->IsSecureContext()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kSecurityError,
-                             "Encrypted Media decoding info can only be "
-                             "queried in a secure context."));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kSecurityError,
+                          "Encrypted Media decoding info can only be "
+                          "queried in a secure context."));
   }
 
   MediaCapabilitiesKeySystemConfiguration* key_system_config =
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.cc b/third_party/blink/renderer/modules/mediastream/media_devices.cc
index a55f9f1..26f2c6b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_devices.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_devices.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/mediastream/media_devices.h"
 
+#include <utility>
+
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
@@ -22,6 +24,7 @@
 #include "third_party/blink/renderer/modules/mediastream/navigator_media_stream.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 using blink::mojom::blink::MediaDeviceType;
@@ -67,7 +70,8 @@
       To<Document>(ExecutionContext::From(script_state))->GetFrame();
   if (!frame) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
                                            "Current frame is detached."));
   }
 
@@ -107,12 +111,13 @@
   Document* document = To<Document>(ExecutionContext::From(script_state));
   UserMediaController* user_media =
       UserMediaController::From(document->GetFrame());
-  if (!user_media)
+  if (!user_media) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                             "No media device controller available; is this a "
-                             "detached window?"));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kNotSupportedError,
+                          "No media device controller available; is this a "
+                          "detached window?"));
+  }
 
   MediaErrorState error_state;
   UserMediaRequest* request = UserMediaRequest::Create(
@@ -131,8 +136,8 @@
   String error_message;
   if (!request->IsSecureContextUse(error_message)) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                           error_message));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kNotSupportedError, error_message));
   }
   auto promise = resolver->Promise();
   request->Start();
@@ -328,8 +333,8 @@
 
 void MediaDevices::OnDispatcherHostConnectionError() {
   for (ScriptPromiseResolver* resolver : requests_) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kAbortError,
-                                          "enumerateDevices() failed."));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kAbortError, "enumerateDevices() failed."));
   }
   requests_.clear();
   dispatcher_host_.reset();
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
index dd9d090..d396d13f 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -48,6 +48,7 @@
 #include "third_party/blink/renderer/modules/mediastream/overconstrained_error.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_center.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -588,9 +589,10 @@
     default:
       NOTREACHED();
   }
-  callbacks_->OnError(nullptr,
-                      DOMExceptionOrOverconstrainedError::FromDOMException(
-                          DOMException::Create(exception_code, message)));
+  callbacks_->OnError(
+      nullptr,
+      DOMExceptionOrOverconstrainedError::FromDOMException(
+          MakeGarbageCollected<DOMException>(exception_code, message)));
 }
 
 void UserMediaRequest::ContextDestroyed(ExecutionContext*) {
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
index ffedafe..3bbc7ab 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
@@ -4,6 +4,9 @@
 
 #include "third_party/blink/renderer/modules/native_file_system/native_file_system_writer.h"
 
+#include <memory>
+#include <utility>
+
 #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view_or_blob_or_usv_string.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_blob.h"
@@ -16,6 +19,7 @@
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
 #include "third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.h"
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -62,8 +66,8 @@
                                                 Blob* blob) {
   if (!file_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError));
   }
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -168,8 +172,8 @@
     ExceptionState& exception_state) {
   if (!file_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError));
   }
   DCHECK(!stream_loader_);
 
@@ -196,8 +200,8 @@
                                                uint64_t size) {
   if (!file_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError));
   }
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -211,8 +215,8 @@
 ScriptPromise NativeFileSystemWriter::close(ScriptState* script_state) {
   if (!file_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError));
   }
   file_ = nullptr;
   return ScriptPromise::CastUndefined(script_state);
diff --git a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.cc b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.cc
index 6211055f..75885e6 100644
--- a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.cc
+++ b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/native_file_system/window_native_file_system.h"
 
+#include <utility>
+
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_manager.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -15,6 +17,7 @@
 #include "third_party/blink/renderer/modules/native_file_system/choose_file_system_entries_options_accepts.h"
 #include "third_party/blink/renderer/modules/native_file_system/native_file_system_directory_handle.h"
 #include "third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -59,19 +62,21 @@
     const ChooseFileSystemEntriesOptions* options) {
   if (!window.IsCurrentlyDisplayedInFrame()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kAbortError));
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   }
 
   Document* document = window.document();
   if (!document) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kAbortError));
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
   }
 
   if (!LocalFrame::HasTransientUserActivation(window.GetFrame())) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kSecurityError,
             "Must be handling a user gesture to show a file picker."));
   }
diff --git a/third_party/blink/renderer/modules/nfc/nfc.cc b/third_party/blink/renderer/modules/nfc/nfc.cc
index a64f4b11..f3465cf 100644
--- a/third_party/blink/renderer/modules/nfc/nfc.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/nfc/nfc.h"
 
+#include <utility>
+
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -18,6 +20,7 @@
 #include "third_party/blink/renderer/modules/nfc/nfc_error.h"
 #include "third_party/blink/renderer/modules/nfc/nfc_push_options.h"
 #include "third_party/blink/renderer/modules/nfc/nfc_watch_options.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/mojo/mojo_helper.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
@@ -374,7 +377,8 @@
                                      DOMExceptionCode exception_code,
                                      const String& message) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(exception_code, message));
+      script_state,
+      MakeGarbageCollected<DOMException>(exception_code, message));
 }
 
 ScriptPromise RejectIfInvalidTextRecord(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/nfc/nfc_error.cc b/third_party/blink/renderer/modules/nfc/nfc_error.cc
index 8f68371..b1b1de4 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_error.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_error.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/nfc/nfc_error.h"
 
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 using device::mojom::blink::NFCErrorType;
 
@@ -14,34 +15,37 @@
                              const NFCErrorType& error_type) {
   switch (error_type) {
     case NFCErrorType::SECURITY:
-      return DOMException::Create(DOMExceptionCode::kSecurityError,
-                                  "NFC operation not allowed.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kSecurityError, "NFC operation not allowed.");
     case NFCErrorType::NOT_SUPPORTED:
     case NFCErrorType::DEVICE_DISABLED:
-      return DOMException::Create(DOMExceptionCode::kNotSupportedError,
-                                  "NFC operation not supported.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError, "NFC operation not supported.");
     case NFCErrorType::NOT_FOUND:
-      return DOMException::Create(DOMExceptionCode::kNotFoundError,
-                                  "Invalid NFC watch Id was provided.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError,
+          "Invalid NFC watch Id was provided.");
     case NFCErrorType::INVALID_MESSAGE:
-      return DOMException::Create(DOMExceptionCode::kSyntaxError,
-                                  "Invalid NFC message was provided.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kSyntaxError, "Invalid NFC message was provided.");
     case NFCErrorType::OPERATION_CANCELLED:
-      return DOMException::Create(DOMExceptionCode::kAbortError,
-                                  "The NFC operation was cancelled.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kAbortError, "The NFC operation was cancelled.");
     case NFCErrorType::TIMER_EXPIRED:
-      return DOMException::Create(DOMExceptionCode::kTimeoutError,
-                                  "NFC operation has timed-out.");
+      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kTimeoutError,
+                                                "NFC operation has timed-out.");
     case NFCErrorType::CANNOT_CANCEL:
-      return DOMException::Create(DOMExceptionCode::kNoModificationAllowedError,
-                                  "NFC operation cannot be canceled.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNoModificationAllowedError,
+          "NFC operation cannot be canceled.");
     case NFCErrorType::IO_ERROR:
-      return DOMException::Create(DOMExceptionCode::kNetworkError,
-                                  "NFC data transfer error has occurred.");
+      return MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNetworkError,
+          "NFC data transfer error has occurred.");
   }
   NOTREACHED();
-  return DOMException::Create(DOMExceptionCode::kUnknownError,
-                              "An unknown NFC error has occurred.");
+  return MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kUnknownError, "An unknown NFC error has occurred.");
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/payments/payment_instruments.cc b/third_party/blink/renderer/modules/payments/payment_instruments.cc
index b7cba2b..5b7e67f 100644
--- a/third_party/blink/renderer/modules/payments/payment_instruments.cc
+++ b/third_party/blink/renderer/modules/payments/payment_instruments.cc
@@ -28,6 +28,7 @@
 #include "third_party/blink/renderer/modules/payments/payment_manager.h"
 #include "third_party/blink/renderer/modules/permissions/permission_utils.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
@@ -45,11 +46,11 @@
       resolver->Resolve();
       return true;
     case payments::mojom::blink::PaymentHandlerStatus::NO_ACTIVE_WORKER:
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kInvalidStateError, "No active service worker"));
       return true;
     case payments::mojom::blink::PaymentHandlerStatus::STORAGE_OPERATION_FAILED:
-      resolver->Reject(DOMException::Create(
+      resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kInvalidStateError, "Storage operation is failed"));
       return true;
     case payments::mojom::blink::PaymentHandlerStatus::
@@ -83,7 +84,7 @@
 
 ScriptPromise RejectNotAllowedToUsePaymentFeatures(ScriptState* script_state) {
   return ScriptPromise::RejectWithDOMException(
-      script_state, DOMException::Create(
+      script_state, MakeGarbageCollected<DOMException>(
                         DOMExceptionCode::kSecurityError,
                         "Must be in a top-level browsing context or an iframe "
                         "needs to specify allow=\"payment\" explicitly"));
@@ -149,7 +150,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -170,7 +172,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -190,7 +193,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -210,7 +214,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -233,7 +238,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -263,7 +269,8 @@
 
   if (!manager_.is_bound()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            kPaymentManagerUnavailable));
   }
 
@@ -298,9 +305,9 @@
   ScriptState::Scope scope(resolver->GetScriptState());
 
   if (status != mojom::blink::PermissionStatus::GRANTED) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kNotAllowedError,
-                             "Not allowed to install this payment handler"));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kNotAllowedError,
+        "Not allowed to install this payment handler"));
     return;
   }
 
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc
index 640bc40a..bff98777 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -56,6 +56,7 @@
 #include "third_party/blink/renderer/modules/payments/update_payment_details_function.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/mojo/mojo_helper.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/uuid.h"
@@ -692,13 +693,15 @@
   if (!script_state->ContextIsValid() || !LocalDOMWindow::From(script_state) ||
       !LocalDOMWindow::From(script_state)->GetFrame()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kAbortError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError,
                                            "Cannot show the payment request"));
   }
 
   if (!payment_provider_.is_bound() || accept_resolver_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Already called show() once"));
   }
 
@@ -714,7 +717,8 @@
   // immersive mode.
   if (GetFrame()->GetDocument()->GetSettings()->GetImmersiveModeEnabled()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Page popups are suppressed"));
   }
 
@@ -744,22 +748,23 @@
 ScriptPromise PaymentRequest::abort(ScriptState* script_state) {
   if (!script_state->ContextIsValid()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Cannot abort payment"));
   }
 
   if (abort_resolver_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state,
-        DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                             "Cannot abort() again until the previous abort() "
-                             "has resolved or rejected"));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "Cannot abort() again until the previous abort() "
+                          "has resolved or rejected"));
   }
 
   if (!GetPendingAcceptPromiseResolver()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "No show() or retry() in progress, so nothing to abort"));
   }
@@ -773,7 +778,8 @@
   if (!payment_provider_.is_bound() || GetPendingAcceptPromiseResolver() ||
       can_make_payment_resolver_ || !script_state->ContextIsValid()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Cannot query payment request"));
   }
 
@@ -790,7 +796,8 @@
   if (!payment_provider_.is_bound() || GetPendingAcceptPromiseResolver() ||
       has_enrolled_instrument_resolver_ || !script_state->ContextIsValid()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Cannot query payment request"));
   }
 
@@ -826,28 +833,31 @@
   if (!script_state->ContextIsValid() || !LocalDOMWindow::From(script_state) ||
       !LocalDOMWindow::From(script_state)->GetFrame()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kAbortError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError,
                                            "Cannot retry the payment request"));
   }
 
   if (complete_resolver_) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "Cannot call retry() because already called complete()"));
   }
 
   if (retry_resolver_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Cannot call retry() again until "
                                            "the previous retry() is finished"));
   }
 
   if (!payment_provider_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Payment request terminated"));
   }
 
@@ -910,19 +920,21 @@
                                        PaymentComplete result) {
   if (!script_state->ContextIsValid()) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Cannot complete payment"));
   }
 
   if (complete_resolver_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
+        script_state,
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError,
                                            "Already called complete() once"));
   }
 
   if (retry_resolver_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(
+        script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError,
                           "Cannot call complete() before retry() is finished"));
   }
@@ -930,7 +942,7 @@
   if (!complete_timer_.IsActive()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
-        DOMException::Create(
+        MakeGarbageCollected<DOMException>(
             DOMExceptionCode::kInvalidStateError,
             "Timed out after 60 seconds, complete() called too late"));
   }
@@ -938,8 +950,8 @@
   // User has cancelled the transaction while the website was processing it.
   if (!payment_provider_) {
     return ScriptPromise::RejectWithDOMException(
-        script_state, DOMException::Create(DOMExceptionCode::kAbortError,
-                                           "Request cancelled"));
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kAbortError, "Request cancelled"));
   }
 
   complete_timer_.Stop();
@@ -993,10 +1005,10 @@
     is_waiting_for_show_promise_to_resolve_ = false;
 
     if (!validated_details->error.IsEmpty()) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kInvalidStateError,
-                               "Cannot specify 'error' when resolving the "
-                               "promise passed into PaymentRequest.show()"));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError,
+          "Cannot specify 'error' when resolving the "
+          "promise passed into PaymentRequest.show()"));
       ClearResolversAndCloseMojoConnection();
       return;
     }
@@ -1012,12 +1024,12 @@
     update_payment_details_timer_.Stop();
   ScriptPromiseResolver* resolver = GetPendingAcceptPromiseResolver();
   if (resolver) {
-    resolver->Reject(
-        DOMException::Create(DOMExceptionCode::kAbortError, error));
+    resolver->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kAbortError, error));
   }
   if (complete_resolver_) {
-    complete_resolver_->Reject(
-        DOMException::Create(DOMExceptionCode::kAbortError, error));
+    complete_resolver_->Reject(MakeGarbageCollected<DOMException>(
+        DOMExceptionCode::kAbortError, error));
   }
   ClearResolversAndCloseMojoConnection();
 }
@@ -1159,8 +1171,9 @@
         FromJSONString(script_state->GetIsolate(), script_state->GetContext(),
                        stringified_details, exception_state);
     if (exception_state.HadException()) {
-      GetPendingAcceptPromiseResolver()->Reject(DOMException::Create(
-          DOMExceptionCode::kSyntaxError, exception_state.Message()));
+      GetPendingAcceptPromiseResolver()->Reject(
+          MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError,
+                                             exception_state.Message()));
       ClearResolversAndCloseMojoConnection();
       return;
     }
@@ -1179,7 +1192,8 @@
   String error_message;
   if (!PaymentsValidators::IsValidShippingAddress(address, &error_message)) {
     GetPendingAcceptPromiseResolver()->Reject(
-        DOMException::Create(DOMExceptionCode::kSyntaxError, error_message));
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError,
+                                           error_message));
     ClearResolversAndCloseMojoConnection();
     return;
   }
@@ -1227,7 +1241,8 @@
   ScriptPromiseResolver* resolver = GetPendingAcceptPromiseResolver();
   if (options_->requestShipping()) {
     if (!response->shipping_address || response->shipping_option.IsEmpty()) {
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kSyntaxError));
+      resolver->Reject(
+          MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError));
       ClearResolversAndCloseMojoConnection();
       return;
     }
@@ -1235,8 +1250,8 @@
     String error_message;
     if (!PaymentsValidators::IsValidShippingAddress(response->shipping_address,
                                                     &error_message)) {
-      resolver->Reject(
-          DOMException::Create(DOMExceptionCode::kSyntaxError, error_message));
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kSyntaxError, error_message));
       ClearResolversAndCloseMojoConnection();
       return;
     }
@@ -1246,7 +1261,8 @@
     shipping_option_ = response->shipping_option;
   } else {
     if (response->shipping_address || !response->shipping_option.IsNull()) {
-      resolver->Reject(DOMException::Create(DOMExceptionCode::kSyntaxError));
+      resolver->Reject(
+          MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError));
       ClearResolversAndCloseMojoConnection();
       return;
     }
@@ -1259,7 +1275,8 @@
       (!options_->requestPayerName() && !response->payer->name.IsNull()) ||
       (!options_->requestPayerEmail() && !response->payer->email.IsNull()) ||
       (!options_->requestPayerPhone() && !response->payer->phone.IsNull())) {
-    resolver->Reject(DOMException::Create(DOMExceptionCode::kSyntaxError));
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(DOMExceptionCode::kSyntaxError));
     ClearResolversAndCloseMojoConnection();
     return;
   }
@@ -1351,20 +1368,24 @@
   }
 
   ScriptPromiseResolver* resolver = GetPendingAcceptPromiseResolver();
-  if (resolver)
-    resolver->Reject(DOMException::Create(exception_code, message));
+  if (resolver) {
+    resolver->Reject(
+        MakeGarbageCollected<DOMException>(exception_code, message));
+  }
 
-  if (abort_resolver_)
-    abort_resolver_->Reject(DOMException::Create(exception_code, message));
+  if (abort_resolver_) {
+    abort_resolver_->Reject(
+        MakeGarbageCollected<DOMException>(exception_code, message));
+  }
 
   if (can_make_payment_resolver_) {
     can_make_payment_resolver_->Reject(
-        DOMException::Create(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, message));
   }
 
   if (has_enrolled_instrument_resolver_) {
     has_enrolled_instrument_resolver_->Reject(
-        DOMException::Create(exception_code, message));
+        MakeGarbageCollected<DOMException>(exception_code, message));
   }
 
   ClearResolversAndCloseMojoConnection();
@@ -1381,15 +1402,15 @@
   DCHECK(GetPendingAcceptPromiseResolver());
 
   if (!aborted_successfully) {
-    abort_resolver_->Reject(DOMException::Create(
+    abort_resolver_->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kInvalidStateError, "Unable to abort the payment"));
     abort_resolver_.Clear();
     return;
   }
 
   ScriptPromiseResolver* resolver = GetPendingAcceptPromiseResolver();
-  resolver->Reject(DOMException::Create(DOMExceptionCode::kAbortError,
-                                        "The website has aborted the payment"));
+  resolver->Reject(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kAbortError, "The website has aborted the payment"));
   abort_resolver_->Resolve();
   ClearResolversAndCloseMojoConnection();
 }
@@ -1416,7 +1437,7 @@
       can_make_payment_resolver_->Resolve(false);
       break;
     case CanMakePaymentQueryResult::QUERY_QUOTA_EXCEEDED:
-      can_make_payment_resolver_->Reject(DOMException::Create(
+      can_make_payment_resolver_->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotAllowedError,
           "Not allowed to check whether can make payment"));
       break;
@@ -1448,9 +1469,10 @@
       has_enrolled_instrument_resolver_->Resolve(false);
       break;
     case HasEnrolledInstrumentQueryResult::QUERY_QUOTA_EXCEEDED:
-      has_enrolled_instrument_resolver_->Reject(DOMException::Create(
-          DOMExceptionCode::kNotAllowedError,
-          "Exceeded query quota for hasEnrolledInstrument"));
+      has_enrolled_instrument_resolver_->Reject(
+          MakeGarbageCollected<DOMException>(
+              DOMExceptionCode::kNotAllowedError,
+              "Exceeded query quota for hasEnrolledInstrument"));
       break;
   }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
index 35bab96..a704ef0 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
@@ -224,7 +224,7 @@
   // thread. Done in a single synchronous call to the signaling thread to ensure
   // channel state consistency.
   peer_connection_handler->RunSynchronousOnceClosureOnSignalingThread(
-      ConvertToBaseCallback(CrossThreadBind(
+      ConvertToBaseOnceCallback(CrossThreadBindOnce(
           [](scoped_refptr<RTCDataChannel::Observer> observer,
              webrtc::DataChannelInterface::DataState current_state) {
             scoped_refptr<webrtc::DataChannelInterface> channel =
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc
index dafa718..c621aff 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 void RunSynchronous(base::TestSimpleTaskRunner* thread,
-                    WTF::CrossThreadClosure closure) {
+                    CrossThreadOnceClosure closure) {
   if (thread->BelongsToCurrentThread()) {
     std::move(closure).Run();
     return;
@@ -35,7 +35,7 @@
   PostCrossThreadTask(
       *thread, FROM_HERE,
       CrossThreadBindOnce(
-          [](WTF::CrossThreadClosure closure, base::WaitableEvent* event) {
+          [](CrossThreadOnceClosure closure, base::WaitableEvent* event) {
             std::move(closure).Run();
             event->Signal();
           },
@@ -54,9 +54,10 @@
       base::OnceClosure closure,
       const char* trace_event_name) override {
     closure_ = std::move(closure);
-    RunSynchronous(signaling_thread_.get(),
-                   CrossThreadBind(&MockPeerConnectionHandler::RunOnceClosure,
-                                   CrossThreadUnretained(this)));
+    RunSynchronous(
+        signaling_thread_.get(),
+        CrossThreadBindOnce(&MockPeerConnectionHandler::RunOnceClosure,
+                            CrossThreadUnretained(this)));
   }
 
  private:
@@ -97,41 +98,43 @@
   void RegisterObserver(webrtc::DataChannelObserver* observer) override {
     RunSynchronous(
         signaling_thread_.get(),
-        CrossThreadBind(&MockDataChannel::RegisterObserverOnSignalingThread,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(observer)));
+        CrossThreadBindOnce(&MockDataChannel::RegisterObserverOnSignalingThread,
+                            CrossThreadUnretained(this),
+                            CrossThreadUnretained(observer)));
   }
 
   void UnregisterObserver() override {
-    RunSynchronous(
-        signaling_thread_.get(),
-        CrossThreadBind(&MockDataChannel::UnregisterObserverOnSignalingThread,
-                        CrossThreadUnretained(this)));
+    RunSynchronous(signaling_thread_.get(),
+                   CrossThreadBindOnce(
+                       &MockDataChannel::UnregisterObserverOnSignalingThread,
+                       CrossThreadUnretained(this)));
   }
 
   uint64_t buffered_amount() const override {
     uint64_t buffered_amount;
-    RunSynchronous(
-        signaling_thread_.get(),
-        CrossThreadBind(&MockDataChannel::GetBufferedAmountOnSignalingThread,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(&buffered_amount)));
+    RunSynchronous(signaling_thread_.get(),
+                   CrossThreadBindOnce(
+                       &MockDataChannel::GetBufferedAmountOnSignalingThread,
+                       CrossThreadUnretained(this),
+                       CrossThreadUnretained(&buffered_amount)));
     return buffered_amount;
   }
 
   DataState state() const override {
     DataState state;
-    RunSynchronous(signaling_thread_.get(),
-                   CrossThreadBind(&MockDataChannel::GetStateOnSignalingThread,
-                                   CrossThreadUnretained(this),
-                                   CrossThreadUnretained(&state)));
+    RunSynchronous(
+        signaling_thread_.get(),
+        CrossThreadBindOnce(&MockDataChannel::GetStateOnSignalingThread,
+                            CrossThreadUnretained(this),
+                            CrossThreadUnretained(&state)));
     return state;
   }
 
   bool Send(const webrtc::DataBuffer& buffer) override {
-    RunSynchronous(signaling_thread_.get(),
-                   CrossThreadBind(&MockDataChannel::SendOnSignalingThread,
-                                   CrossThreadUnretained(this), buffer.size()));
+    RunSynchronous(
+        signaling_thread_.get(),
+        CrossThreadBindOnce(&MockDataChannel::SendOnSignalingThread,
+                            CrossThreadUnretained(this), buffer.size()));
     return true;
   }
 
@@ -139,8 +142,8 @@
   void ChangeState(DataState state) {
     RunSynchronous(
         signaling_thread_.get(),
-        CrossThreadBind(&MockDataChannel::ChangeStateOnSignalingThread,
-                        CrossThreadUnretained(this), state));
+        CrossThreadBindOnce(&MockDataChannel::ChangeStateOnSignalingThread,
+                            CrossThreadUnretained(this), state));
     // The observer posts the state change from the signaling thread to the main
     // thread. Wait for the posted task to be executed.
     base::RunLoop().RunUntilIdle();
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.idl b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.idl
index 0092b94..1b5f96e 100644
--- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.idl
@@ -6,7 +6,7 @@
 
 [
     DoNotCheckConstants,
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGL2RenderingContext { };
 WebGL2RenderingContext includes WebGLRenderingContextBase;
 WebGL2RenderingContext includes WebGL2RenderingContextBase;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_active_info.idl b/third_party/blink/renderer/modules/webgl/webgl_active_info.idl
index 4a144fc..491b208 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_active_info.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_active_info.idl
@@ -26,7 +26,7 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.11
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLActiveInfo {
     readonly attribute long size;
     readonly attribute unsigned long type;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_buffer.idl b/third_party/blink/renderer/modules/webgl/webgl_buffer.idl
index 8d9091a..c39487be 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_buffer.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_buffer.idl
@@ -26,6 +26,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.4
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLBuffer {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.idl b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.idl
index 59f7d68..86dd517 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.idl
@@ -26,6 +26,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.5
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLFramebuffer {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.idl b/third_party/blink/renderer/modules/webgl/webgl_program.idl
index cdb648e..99a37bf 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_program.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_program.idl
@@ -26,6 +26,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.6
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLProgram {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_query.idl b/third_party/blink/renderer/modules/webgl/webgl_query.idl
index 6824d2a..f4d4d3cf 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_query.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_query.idl
@@ -5,6 +5,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.2
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLQuery {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.idl b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.idl
index c78a00a0..62d53827 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.idl
@@ -26,6 +26,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLRenderbuffer {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.idl b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.idl
index f165428..ab6cb06 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.idl
@@ -27,6 +27,6 @@
 
 [
     DoNotCheckConstants,
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLRenderingContext { };
 WebGLRenderingContext includes WebGLRenderingContextBase;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_sampler.idl b/third_party/blink/renderer/modules/webgl/webgl_sampler.idl
index ff8f8e1..d481d91 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_sampler.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_sampler.idl
@@ -5,6 +5,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.3
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLSampler {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader.idl b/third_party/blink/renderer/modules/webgl/webgl_shader.idl
index f05d8f1..394eafc 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_shader.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_shader.idl
@@ -26,6 +26,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.8
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLShader {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.idl b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.idl
index 447cb77..6825c50 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.idl
@@ -27,7 +27,7 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.12
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLShaderPrecisionFormat {
     readonly attribute long rangeMin;
     readonly attribute long rangeMax;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_sync.idl b/third_party/blink/renderer/modules/webgl/webgl_sync.idl
index 2f6cc7c..67086e40 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_sync.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_sync.idl
@@ -5,6 +5,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.4
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLSync {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_texture.idl b/third_party/blink/renderer/modules/webgl/webgl_texture.idl
index dfd20ad..e3ea3a0 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_texture.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_texture.idl
@@ -26,7 +26,7 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.9
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLTexture {
     [RuntimeEnabled=ExtraWebGLVideoTextureMetadata] readonly attribute unsigned long lastUploadedVideoWidth;
     [RuntimeEnabled=ExtraWebGLVideoTextureMetadata] readonly attribute unsigned long lastUploadedVideoHeight;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.idl b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.idl
index 919d72a..95db851b 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.idl
@@ -5,6 +5,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.5
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLTransformFeedback {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.idl b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.idl
index b6c6568..53b44acb 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.idl
@@ -27,6 +27,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.10
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLUniformLocation {
 };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.idl b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.idl
index 2b74799..3a02a6b8 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.idl
+++ b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.idl
@@ -5,6 +5,6 @@
 // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.6
 
 [
-    Exposed(Worker OffscreenCanvas, Window StableBlinkFeatures)
+    Exposed=(Window,Worker)
 ] interface WebGLVertexArrayObject {
 };
diff --git a/third_party/blink/renderer/modules/xr/xr_input_source.cc b/third_party/blink/renderer/modules/xr/xr_input_source.cc
index 6146d0e..5ee644e 100644
--- a/third_party/blink/renderer/modules/xr/xr_input_source.cc
+++ b/third_party/blink/renderer/modules/xr/xr_input_source.cc
@@ -103,6 +103,8 @@
             m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10],
             m[11], m[12], m[13], m[14], m[15]);
     updated_source->SetBasePoseMatrix(std::move(grip_matrix));
+  } else {
+    updated_source->SetBasePoseMatrix(nullptr);
   }
 
   return updated_source;
diff --git a/third_party/blink/renderer/platform/cross_thread_copier.h b/third_party/blink/renderer/platform/cross_thread_copier.h
index 00383e1..f66f7cb 100644
--- a/third_party/blink/renderer/platform/cross_thread_copier.h
+++ b/third_party/blink/renderer/platform/cross_thread_copier.h
@@ -261,6 +261,13 @@
   static Type Copy(Type&& value) { return std::move(value); }
 };
 
+template <typename Signature>
+struct CrossThreadCopier<WTF::CrossThreadOnceFunction<Signature>> {
+  STATIC_ONLY(CrossThreadCopier);
+  using Type = WTF::CrossThreadOnceFunction<Signature>;
+  static Type Copy(Type&& value) { return std::move(value); }
+};
+
 template <>
 struct CrossThreadCopier<KURL> {
   STATIC_ONLY(CrossThreadCopier);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 3505bd4..3a074048 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -970,18 +970,10 @@
       name: "OffMainThreadCSSPaint",
     },
     {
-      name: "OffscreenCanvas",
-      status: "stable",
-    },
-    {
       name: "OffscreenCanvasCommit",
       status: "experimental",
     },
     {
-      name: "OffscreenCanvasText",
-      status: "stable",
-    },
-    {
       name: "OnDeviceChange",
       // Android does not yet support SystemMonitor.
       status: {"Android": "", "default": "stable"},
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 44c74c3..763ac0c 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2769,6 +2769,7 @@
 crbug.com/626703 external/wpt/css/css-overflow/webkit-line-clamp-013.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-overflow/webkit-line-clamp-014.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-overflow/webkit-line-clamp-025.html [ Failure ]
+crbug.com/965137 external/wpt/css/css-overflow/webkit-line-clamp-026.html [ Failure ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/preload/preload-with-type.html [ Failure Timeout ]
 crbug.com/626703 [ Retina ] external/wpt/preload/preload-with-type.html [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/preload/onload-event.html [ Failure Timeout ]
@@ -5632,8 +5633,6 @@
 crbug.com/963141 [ Mac Win ] media/controls/video-overlay-cast-light-rendering.html [ Pass Failure ]
 
 # Sheriff 2019-05-16
-crbug.com/963734 [ Mac ] mojo/bind-intercepted-interface-in-worker.html [ Failure ]
-crbug.com/963734 [ Mac ] shapedetection/detection-on-worker.html  [ Timeout ]
 crbug.com/963764 [ Mac ] media/video-aspect-ratio.html [ Pass Failure ]
 crbug.com/963141 [ Linux ] media/video-object-fit.html [ Pass Failure ]
 crbug.com/963740 [ Win ] compositing/video-frame-size-change.html [ Pass Failure ]
@@ -5646,11 +5645,10 @@
 crbug.com/964158 [ Linux ] external/wpt/payment-handler/change-payment-method.https.html [ Pass Crash ]
 crbug.com/899710 [ Linux ] virtual/threaded/http/tests/devtools/tracing/timeline-paint/timeline-paint-with-layout-invalidations.js [ Pass Timeout ]
 crbug.com/964239 external/wpt/css/css-scroll-snap/scroll-margin.html [ Pass Failure ]
-crbug.com/965137 [ Debug ] external/wpt/css/css-overflow/webkit-line-clamp-026.html [ Failure ]
 crbug.com/965134 [ Linux ] fast/events/pointerevents/multi-touch-events.html [ Failure ]
 crbug.com/965134 [ Linux ] virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-in-slop-region.html [ Failure ]
 crbug.com/965134 [ Linux ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Pass Failure ]
 crbug.com/965389 [ Mac ] media/track/track-cue-rendering-position-auto.html [ Pass Failure ]
 
 # Sheriff 2019-05-21
-crbug.com/965134 [ Linux ] virtual/mouseevent_fractional/fast/events/pointerevents/multi-touch-events.html [ Failure ]
\ No newline at end of file
+crbug.com/965134 [ Linux ] virtual/mouseevent_fractional/fast/events/pointerevents/multi-touch-events.html [ Failure ]
diff --git a/third_party/blink/web_tests/css-parser/OWNERS b/third_party/blink/web_tests/css-parser/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css-parser/OWNERS
+++ b/third_party/blink/web_tests/css-parser/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/basic/OWNERS b/third_party/blink/web_tests/css1/basic/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/basic/OWNERS
+++ b/third_party/blink/web_tests/css1/basic/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/box_properties/OWNERS b/third_party/blink/web_tests/css1/box_properties/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/box_properties/OWNERS
+++ b/third_party/blink/web_tests/css1/box_properties/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/cascade/OWNERS b/third_party/blink/web_tests/css1/cascade/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/cascade/OWNERS
+++ b/third_party/blink/web_tests/css1/cascade/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/classification/OWNERS b/third_party/blink/web_tests/css1/classification/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/classification/OWNERS
+++ b/third_party/blink/web_tests/css1/classification/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/color_and_background/OWNERS b/third_party/blink/web_tests/css1/color_and_background/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/color_and_background/OWNERS
+++ b/third_party/blink/web_tests/css1/color_and_background/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/conformance/OWNERS b/third_party/blink/web_tests/css1/conformance/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/conformance/OWNERS
+++ b/third_party/blink/web_tests/css1/conformance/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/pseudo/OWNERS b/third_party/blink/web_tests/css1/pseudo/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/pseudo/OWNERS
+++ b/third_party/blink/web_tests/css1/pseudo/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css1/units/OWNERS b/third_party/blink/web_tests/css1/units/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css1/units/OWNERS
+++ b/third_party/blink/web_tests/css1/units/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css2.1/OWNERS b/third_party/blink/web_tests/css2.1/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css2.1/OWNERS
+++ b/third_party/blink/web_tests/css2.1/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/css3/OWNERS b/third_party/blink/web_tests/css3/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/css3/OWNERS
+++ b/third_party/blink/web_tests/css3/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/cssom/OWNERS b/third_party/blink/web_tests/cssom/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/cssom/OWNERS
+++ b/third_party/blink/web_tests/cssom/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/custom-properties/OWNERS b/third_party/blink/web_tests/custom-properties/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/custom-properties/OWNERS
+++ b/third_party/blink/web_tests/custom-properties/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/OWNERS b/third_party/blink/web_tests/external/wpt/css/OWNERS
index 110a538a..f025ce3 100644
--- a/third_party/blink/web_tests/external/wpt/css/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/OWNERS
@@ -1,3 +1,3 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
 # WPT-NOTIFY: true
diff --git a/third_party/blink/web_tests/external/wpt/css/css-cascade/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-cascade/OWNERS
index 02d41d82..73cfd0e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-cascade/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-cascade/OWNERS
@@ -1,8 +1,6 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
-bugsnash@chromium.org
+futhark@chromium.org
+andruud@chromium.org
 ericwilligers@chromium.org
-meade@chromium.org
-nainar@chromium.org
-rjwright@chromium.org
 shend@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-color/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-conditional/OWNERS
index 02d41d82..73cfd0e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-conditional/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/OWNERS
@@ -1,8 +1,6 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
-bugsnash@chromium.org
+futhark@chromium.org
+andruud@chromium.org
 ericwilligers@chromium.org
-meade@chromium.org
-nainar@chromium.org
-rjwright@chromium.org
 shend@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-chrome-crash-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-chrome-crash-001.html
new file mode 100644
index 0000000..c7c03bca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-chrome-crash-001.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>CSS Overflow and Transforms: css-overflow-3</title>
+<link rel="author" href="mailto:atotic@google.com">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://crbug.com/964924">
+<meta name="assert" content="chrome does not crash with css contain edge case">
+<style>
+  * {
+    contain: size layout;
+  }
+  html {
+    outline-style: auto;
+    margin-bottom: 39%;
+  }
+  #target {
+    -webkit-appearance: push-button;
+  }
+</style>
+<output id="target">text</output>
+<script>
+test(() => {
+  document.body.offsetTop;
+  document.querySelector("#target").value = "";
+  document.body.offsetTop;
+  assert_equals(document.querySelector("#target").value, "");
+}, 'chrome does not crash with contain');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-namespaces/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-namespaces/OWNERS
index 02d41d82..73cfd0e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-namespaces/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-namespaces/OWNERS
@@ -1,8 +1,6 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
-bugsnash@chromium.org
+futhark@chromium.org
+andruud@chromium.org
 ericwilligers@chromium.org
-meade@chromium.org
-nainar@chromium.org
-rjwright@chromium.org
 shend@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/webkit-line-clamp-026.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/webkit-line-clamp-026.html
index 40ffc8a6..741384f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-overflow/webkit-line-clamp-026.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/webkit-line-clamp-026.html
@@ -1,5 +1,4 @@
 <!DOCTYPE html>
-<html class="reftest-wait">
 <meta charset="utf-8">
 <title>CSS Overflow: Dynamically changing -webkit-box-orient when -webkit-line-clamp applies</title>
 <link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
@@ -24,8 +23,6 @@
 Line 5</div>
 <p>Following content.</p>
 <script>
-window.onload = function() {
+  document.body.offsetTop;
   document.querySelector(".clamp").style.webkitBoxOrient = "horizontal";
-  document.documentElement.className = "";
-};
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/OWNERS
index a8034d56..c6888c4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/OWNERS
@@ -1,4 +1,4 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
 # WPT-NOTIFY: true
 andruud@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scoping/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-scoping/OWNERS
index 343f757..3456394 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scoping/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-scoping/OWNERS
@@ -1,3 +1,3 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
 kojii@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/css-syntax/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-syntax/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-syntax/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-syntax/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/css-timing/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-timing/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-timing/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-timing/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-typed-om/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-values/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/OWNERS b/third_party/blink/web_tests/external/wpt/css/css-variables/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-variables/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/css-variables/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/OWNERS b/third_party/blink/web_tests/external/wpt/css/cssom-view/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom-view/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/OWNERS b/third_party/blink/web_tests/external/wpt/css/cssom/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/cssom/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/OWNERS b/third_party/blink/web_tests/external/wpt/css/mediaqueries/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/external/wpt/css/motion/OWNERS b/third_party/blink/web_tests/external/wpt/css/motion/OWNERS
index bbd8ae4..d10225e4 100644
--- a/third_party/blink/web_tests/external/wpt/css/motion/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/motion/OWNERS
@@ -1,3 +1,3 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
 ericwilligers@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/OWNERS b/third_party/blink/web_tests/external/wpt/css/selectors/OWNERS
index 3f1f959..9b25911 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/OWNERS
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/OWNERS
@@ -1,3 +1,3 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
 rego@igalia.com
diff --git a/third_party/blink/web_tests/fast/css-generated-content/OWNERS b/third_party/blink/web_tests/fast/css-generated-content/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/fast/css-generated-content/OWNERS
+++ b/third_party/blink/web_tests/fast/css-generated-content/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/fast/css/OWNERS b/third_party/blink/web_tests/fast/css/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/fast/css/OWNERS
+++ b/third_party/blink/web_tests/fast/css/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/fast/dom/CSSStyleDeclaration/OWNERS b/third_party/blink/web_tests/fast/dom/CSSStyleDeclaration/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/fast/dom/CSSStyleDeclaration/OWNERS
+++ b/third_party/blink/web_tests/fast/dom/CSSStyleDeclaration/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
index aa5d530..575e991 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
@@ -103,6 +103,35 @@
     await waitForCompositorCommit();
     resetScrollOffset(standardDivFast);
 
+    // Click on the track part just above the down arrow.
+    let x = standardRectFast.right - BUTTON_WIDTH / 2;
+    let y = standardRectFast.bottom - SCROLL_CORNER - BUTTON_WIDTH - 2;
+    await mouseClickOn(x, y);
+    assert_equals(standardDivFast.scrollTop, 74, "Pressing the down trackpart didn't scroll.");
+
+    // Click on the track part just below the up arrow.
+    x = standardRectFast.right - BUTTON_WIDTH / 2;
+    y = standardRectFast.top + BUTTON_WIDTH + 2;
+	await mouseClickOn(x, y);
+    assert_equals(standardDivFast.scrollTop, 0, "Pressing the up trackpart didn't scroll.");
+
+    // Click on the track part just to the left of the right arrow.
+    x = standardRectFast.right - SCROLL_CORNER - BUTTON_WIDTH - 2;
+    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
+	await mouseClickOn(x, y);
+    assert_equals(standardDivFast.scrollLeft, 74, "Pressing the right trackpart didn't scroll.");
+
+    // Click on the track part just to the right of the left arrow.
+    x = standardRectFast.left + BUTTON_WIDTH + 2;
+    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
+	await mouseClickOn(x, y);
+    assert_equals(standardDivFast.scrollLeft, 0, "Pressing the left trackpart didn't scroll.");
+  }, "Test mouse click on non-custom composited div scrollbar empty trackparts.");
+
+  promise_test (async () => {
+    await waitForCompositorCommit();
+    resetScrollOffset(standardDivFast);
+
     // Testing the vertical scrollbar thumb.
     let x = standardRectFast.right - TRACK_WIDTH / 2;
     let y = standardRectFast.top + BUTTON_WIDTH + 5;
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-root-scrollbar.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-root-scrollbar.html
index 90a323a8..7f6aa8c 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-root-scrollbar.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-root-scrollbar.html
@@ -48,6 +48,35 @@
     await waitForCompositorCommit();
     resetScrollOffset(document.scrollingElement);
 
+    // Click on the track part just above the down arrow.
+    let x = window.innerWidth - BUTTON_WIDTH / 2;
+    let y = window.innerHeight - SCROLL_CORNER - BUTTON_WIDTH - 2;
+    await mouseClickOn(x, y);
+    assert_equals(window.scrollY, 431, "Pressing the down trackpart didn't scroll.");
+
+    // Click on the track part just below the up arrow.
+    x = window.innerWidth - BUTTON_WIDTH / 2;
+    y = BUTTON_WIDTH + 2;
+	await mouseClickOn(x, y);
+    assert_equals(window.scrollY, 0, "Pressing the up trackpart didn't scroll.");
+
+    // Click on the track part just to the left of the right arrow.
+    x = window.innerWidth - SCROLL_CORNER - BUTTON_WIDTH - 2;
+    y = window.innerHeight - BUTTON_WIDTH / 2;
+	await mouseClickOn(x, y);
+    assert_equals(window.scrollX, 223, "Pressing the right trackpart didn't scroll.");
+
+    // Click on the track part just to the right of the left arrow.
+    x = BUTTON_WIDTH + 2;
+    y = window.innerHeight - BUTTON_WIDTH / 2;
+	await mouseClickOn(x, y);
+    assert_equals(window.scrollX, 0, "Pressing the left trackpart didn't scroll.");
+  }, "Test mouse click on non-custom composited root scrollbar empty trackparts.");
+
+  promise_test (async () => {
+    await waitForCompositorCommit();
+    resetScrollOffset(document.scrollingElement);
+
     // Testing the vertical scrollbar thumb.
     let x = window.innerWidth - TRACK_WIDTH / 2;
     let y = BUTTON_WIDTH + 10;
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota-expected.txt b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota-expected.txt
index 4deaca7..4ff40ac 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota-expected.txt
@@ -4,13 +4,16 @@
 Clear storage view is visible: true
 -- B used out of -- storage quota. 
 Usage breakdown:
+Total: 0 B
 
 Running: Now with data
 -- KB used out of -- storage quota. 
 Usage breakdown:
 IndexedDB: --.- KB
+Total: --.- KB
 
 Running: Clear again with ActionDelegate
 -- B used out of -- storage quota. 
 Usage breakdown:
+Total: 0 B
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
index 5a49e7e..58da155 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
@@ -43,13 +43,15 @@
     TestRunner.addResult(quotaStripped);
 
     TestRunner.addResult('Usage breakdown:');
-    for (var i = 0; i < view._pieChartLegend.children.length; i++) {
+    const legendElement = view._pieChart.element.shadowRoot.querySelector('.pie-chart-legend');
+
+    for (var i = 0; i < legendElement.children.length; i++) {
       var typeUsage = ': ';
-      var children = view._pieChartLegend.children[i].children;
+      var children = legendElement.children[i].children;
       for (var j = 0; j < children.length; j++) {
-        if (children[j].classList.contains('usage-breakdown-legend-title'))
+        if (children[j].classList.contains('pie-chart-name'))
           typeUsage = children[j].textContent + typeUsage;
-        if (children[j].classList.contains('usage-breakdown-legend-value')) {
+        if (children[j].classList.contains('pie-chart-size')) {
           // Clean usage value because it's platform-dependent.
           var cleanedValue = children[j].textContent.replace(/\d+.\d\sKB/, '--.- KB');
           typeUsage = typeUsage + cleanedValue;
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js
index 42b0e76..5fbb75c1 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-1/case-sensitive-suggestions.js
@@ -51,14 +51,18 @@
       var inputCase = isUpperCase(inputText) ? Case.Upper : isLowerCase(inputText) ? Case.Lower : Case.Mixed;
 
       for (var i = 0; i < result.length; ++i) {
+        let text = result[i].text;
+        const colonIndex = text.indexOf(':');
+        if (colonIndex !== -1)
+          text = text.substring(0, colonIndex);
         switch (inputCase) {
           case Case.Upper:
-            if (!isUpperCase(result[i].text))
-              TestRunner.addResult('Error: Suggestion ' + result[i].text + ' must be in UPPERCASE.');
+            if (!isUpperCase(text))
+              TestRunner.addResult('Error: Suggestion ' + text + ' must be in UPPERCASE.');
             break;
           case Case.Lower:
-            if (!isLowerCase(result[i].text))
-              TestRunner.addResult('Error: Suggestion ' + result[i].text + ' must be in lowercase.');
+            if (!isLowerCase(text))
+              TestRunner.addResult('Error: Suggestion ' + text + ' must be in lowercase.');
             break;
         }
       }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
index 2785196..7e823cb3 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete-expected.txt
@@ -25,6 +25,10 @@
 
 Running: testValuePresets
 
+Running: testNameValuePresets
+
+Running: testNameValuePresetWithNameMatch
+
 Running: testValueSubstring
 
 Running: testNameVariables
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
index d51914c..576dcd3 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-3/style-autocomplete.js
@@ -83,6 +83,14 @@
           ['translate(10px, 10px)', 'translateY(10px)', 'translate3d(10px, 10px, 10px)']);
     },
 
+    function testNameValuePresets(next) {
+      testAgainstGolden(namePrompt, 'underli', false, ['text-decoration: underline'], [], next);
+    },
+
+    function testNameValuePresetWithNameMatch(next) {
+      testAgainstGolden(namePrompt, 'display', false, ['display: block'], [], next);
+    },
+
     function testValueSubstring(next) {
       testAgainstGolden(
           valuePromptFor('color'), 'blue', false, ['blue', 'darkblue', 'lightblue'],
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/autocomplete-css-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/autocomplete-css-expected.txt
index e3c611392..3c2e935d 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/autocomplete-css-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/autocomplete-css-expected.txt
@@ -55,11 +55,11 @@
 .my-class { -webkit-border: 1px solid black; -webkit-color: blue;
 text-align: |}
 ======= Autocomplete Suggestions =======
-[-webkit-auto, -webkit-center, -webkit-left, -webkit-match-parent, -webkit-right, center, end, inherit, initial, justify, left, right, start, unset]
+[center, end, inherit, initial, justify, left, right, start, unset, -webkit-auto, -webkit-center, -webkit-left, -webkit-match-parent, -webkit-right]
 
 Running: verifySuggestionsOnColumnTypedIn
 .green {
    display|
 Suggestions displayed on ':' symbol typed in:
-[-webkit-box, -webkit-inline-box, block, contents, flex, flow-root, grid, inherit, initial, inline, inline-block, inline-flex, inline-grid, inline-table, list-item, none, table, table-caption, table-cell, table-column, table-column-group, table-footer-group, table-header-group, table-row, table-row-group, unset]
+[block, contents, flex, flow-root, grid, inherit, initial, inline, inline-block, inline-flex, inline-grid, inline-table, list-item, none, table, table-caption, table-cell, table-column, table-column-group, table-footer-group, table-header-group, table-row, table-row-group, unset, -webkit-box, -webkit-inline-box]
 
diff --git a/third_party/blink/web_tests/storage/websql/icu-functions.html b/third_party/blink/web_tests/storage/websql/icu-functions.html
new file mode 100644
index 0000000..0138a62
--- /dev/null
+++ b/third_party/blink/web_tests/storage/websql/icu-functions.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>WebSQL: ICU support</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+async_test(testCase => {
+  const database = openDatabase(
+      'IcuFunctionLower', '1.0', 'Database for ICU lower() test',
+      1024 * 1024);
+  assert_not_equals(database, null, 'openDatabase should not fail');
+
+  database.transaction(testCase.step_func(transaction => {
+    transaction.executeSql(
+        'SELECT lower("I", "en_us") AS lower_result', [],
+        testCase.step_func((_, result) => {
+          assert_equals(result.rows.item(0).lower_result, 'i');
+        }), testCase.unreached_func('lower should not fail'));
+    transaction.executeSql(
+        'SELECT lower("I", "tr_tr") AS lower_result', [],
+        testCase.step_func((_, result) => {
+          assert_equals(result.rows.item(0).lower_result, '\u0131');
+          testCase.done();
+        }), testCase.unreached_func('lower should not fail'));
+  }));
+}, `SELECT lower() should use the ICU extension`);
+
+</script>
diff --git a/third_party/blink/web_tests/typedcssom/OWNERS b/third_party/blink/web_tests/typedcssom/OWNERS
index ada3963..e282c4fb 100644
--- a/third_party/blink/web_tests/typedcssom/OWNERS
+++ b/third_party/blink/web_tests/typedcssom/OWNERS
@@ -1,2 +1,2 @@
-# TEAM: style-dev@chromium.org
+# TEAM: layout-dev@chromium.org
 # COMPONENT: Blink>CSS
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index a2ac26d..02eb1289 100644
--- a/third_party/inspector_protocol/README.chromium
+++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: 8ec18cf0885bef0b5c2a922c5dc3813cbf63e962
+Revision: fe0467fd105a9ea90fbb091dc2a7b4cdbf539803
 License: BSD
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/inspector_protocol/encoding/encoding.cc b/third_party/inspector_protocol/encoding/encoding.cc
index cd55954..7055c79 100644
--- a/third_party/inspector_protocol/encoding/encoding.cc
+++ b/third_party/inspector_protocol/encoding/encoding.cc
@@ -842,14 +842,15 @@
           return;
         case MajorType::NEGATIVE: {  // INT32.
           // INT32 is a signed int32 (int32 makes sense for the
-          // inspector_protocol, it's not a CBOR limitation); in CBOR,
-          // the negative values for INT32 are represented as NEGATIVE,
-          // that is, -1 INT32 is represented as 1 << 5 | 0 (major type 1,
-          // additional info value 0). So here, we compute the INT32 value
-          // and then check it against the INT32 min.
-          int64_t actual_value =
-              -static_cast<int64_t>(token_start_internal_value_) - 1;
-          if (!success || actual_value < std::numeric_limits<int32_t>::min()) {
+          // inspector_protocol, it's not a CBOR limitation); in CBOR, the
+          // negative values for INT32 are represented as NEGATIVE, that is, -1
+          // INT32 is represented as 1 << 5 | 0 (major type 1, additional info
+          // value 0). The minimal allowed INT32 value in our protocol is
+          // std::numeric_limits<int32_t>::min(). We check for it by directly
+          // checking the payload against the maximal allowed signed (!) int32
+          // value.
+          if (!success || token_start_internal_value_ >
+                              std::numeric_limits<int32_t>::max()) {
             SetError(Error::CBOR_INVALID_INT32);
             return;
           }
@@ -1856,7 +1857,7 @@
       // If the |Char| we're dealing with is really a byte, then
       // we have utf8 here, and we need to check for multibyte characters
       // and transcode them to utf16 (either one or two utf16 chars).
-      if (sizeof(Char) == sizeof(uint8_t) && c >= 0x7f) {
+      if (sizeof(Char) == sizeof(uint8_t) && c > 0x7f) {
         // Inspect the leading byte to figure out how long the utf8
         // byte sequence is; while doing this initialize |codepoint|
         // with the first few bits.
@@ -1895,7 +1896,7 @@
         // Disallow overlong encodings for ascii characters, as these
         // would include " and other characters significant to JSON
         // string termination / control.
-        if (codepoint < 0x7f)
+        if (codepoint <= 0x7f)
           return false;
         // Invalid in UTF8, and can't be represented in UTF16 anyway.
         if (codepoint > 0x10ffff)
diff --git a/third_party/inspector_protocol/encoding/encoding_test.cc b/third_party/inspector_protocol/encoding/encoding_test.cc
index d365c59..52bea59 100644
--- a/third_party/inspector_protocol/encoding/encoding_test.cc
+++ b/third_party/inspector_protocol/encoding/encoding_test.cc
@@ -234,6 +234,24 @@
   EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
 }
 
+TEST(EncodeDecodeInt32Test, RoundtripsInt32Min) {
+  // std::numeric_limits<int32_t> is encoded as a uint32 after the initial byte.
+  std::vector<uint8_t> encoded;
+  EncodeInt32(std::numeric_limits<int32_t>::min(), &encoded);
+  // 1 for initial byte, 4 for the uint32.
+  // first three bits: major type = 1;
+  // remaining five bits: additional info = 26, indicating payload is uint32.
+  EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 5>{
+                           {1 << 5 | 26, 0x7f, 0xff, 0xff, 0xff}}));
+
+  // Reverse direction: decode with CBORTokenizer.
+  CBORTokenizer tokenizer(SpanFrom(encoded));
+  EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag());
+  EXPECT_EQ(std::numeric_limits<int32_t>::min(), tokenizer.GetInt32());
+  tokenizer.Next();
+  EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag());
+}
+
 TEST(EncodeDecodeInt32Test, CantRoundtripUint32) {
   // 0xdeadbeef is a value which does not fit below
   // std::numerical_limits<int32_t>::max(), so we can't encode
@@ -261,15 +279,21 @@
     std::vector<uint8_t> data;
     std::string msg;
   };
-  std::vector<TestCase> tests{
-      {TestCase{
-           {24},
-           "additional info = 24 would require 1 byte of payload (but it's 0)"},
-       TestCase{{27, 0xaa, 0xbb, 0xcc},
-                "additional info = 27 would require 8 bytes of payload (but "
-                "it's 3)"},
-       TestCase{{29}, "additional info = 29 isn't recognized"}}};
-
+  std::vector<TestCase> tests{{
+      TestCase{
+          {24},
+          "additional info = 24 would require 1 byte of payload (but it's 0)"},
+      TestCase{{27, 0xaa, 0xbb, 0xcc},
+               "additional info = 27 would require 8 bytes of payload (but "
+               "it's 3)"},
+      TestCase{{29}, "additional info = 29 isn't recognized"},
+      TestCase{{1 << 5 | 27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+               "Max UINT64 payload is outside the allowed range"},
+      TestCase{{1 << 5 | 26, 0xff, 0xff, 0xff, 0xff},
+               "Max UINT32 payload is outside the allowed range"},
+      TestCase{{1 << 5 | 26, 0x80, 0x00, 0x00, 0x00},
+               "UINT32 payload w/ high bit set is outside the allowed range"},
+  }};
   for (const TestCase& test : tests) {
     SCOPED_TRACE(test.msg);
     CBORTokenizer tokenizer(SpanFrom(test.data));
@@ -1517,6 +1541,22 @@
       log_.str());
 }
 
+TEST_F(JsonParserTest, UsAsciiDelCornerCase) {
+  // DEL (0x7f) is a 7 bit US-ASCII character, and while it is a control
+  // character according to Unicode, it's not considered a control
+  // character in https://tools.ietf.org/html/rfc7159#section-7, so
+  // it can be placed directly into the JSON string, without JSON escaping.
+  std::string json = "{\"foo\": \"a\x7f\"}";
+  ParseJSON(GetTestPlatform(), SpanFrom(json), &log_);
+  EXPECT_TRUE(log_.status().ok());
+  EXPECT_EQ(
+      "map begin\n"
+      "string16: foo\n"
+      "string16: a\x7f\n"
+      "map end\n",
+      log_.str());
+}
+
 TEST_F(JsonParserTest, Whitespace) {
   std::string json = "\n  {\n\"msg\"\n: \v\"Hello, world.\"\t\r}\t";
   ParseJSON(GetTestPlatform(), SpanFrom(json), &log_);
diff --git a/third_party/inspector_protocol/lib/encoding_cpp.template b/third_party/inspector_protocol/lib/encoding_cpp.template
index 1a07448..e55dffb5 100644
--- a/third_party/inspector_protocol/lib/encoding_cpp.template
+++ b/third_party/inspector_protocol/lib/encoding_cpp.template
@@ -849,14 +849,15 @@
           return;
         case MajorType::NEGATIVE: {  // INT32.
           // INT32 is a signed int32 (int32 makes sense for the
-          // inspector_protocol, it's not a CBOR limitation); in CBOR,
-          // the negative values for INT32 are represented as NEGATIVE,
-          // that is, -1 INT32 is represented as 1 << 5 | 0 (major type 1,
-          // additional info value 0). So here, we compute the INT32 value
-          // and then check it against the INT32 min.
-          int64_t actual_value =
-              -static_cast<int64_t>(token_start_internal_value_) - 1;
-          if (!success || actual_value < std::numeric_limits<int32_t>::min()) {
+          // inspector_protocol, it's not a CBOR limitation); in CBOR, the
+          // negative values for INT32 are represented as NEGATIVE, that is, -1
+          // INT32 is represented as 1 << 5 | 0 (major type 1, additional info
+          // value 0). The minimal allowed INT32 value in our protocol is
+          // std::numeric_limits<int32_t>::min(). We check for it by directly
+          // checking the payload against the maximal allowed signed (!) int32
+          // value.
+          if (!success || token_start_internal_value_ >
+                              std::numeric_limits<int32_t>::max()) {
             SetError(Error::CBOR_INVALID_INT32);
             return;
           }
@@ -1863,7 +1864,7 @@
       // If the |Char| we're dealing with is really a byte, then
       // we have utf8 here, and we need to check for multibyte characters
       // and transcode them to utf16 (either one or two utf16 chars).
-      if (sizeof(Char) == sizeof(uint8_t) && c >= 0x7f) {
+      if (sizeof(Char) == sizeof(uint8_t) && c > 0x7f) {
         // Inspect the leading byte to figure out how long the utf8
         // byte sequence is; while doing this initialize |codepoint|
         // with the first few bits.
@@ -1902,7 +1903,7 @@
         // Disallow overlong encodings for ascii characters, as these
         // would include " and other characters significant to JSON
         // string termination / control.
-        if (codepoint < 0x7f)
+        if (codepoint <= 0x7f)
           return false;
         // Invalid in UTF8, and can't be represented in UTF16 anyway.
         if (codepoint > 0x10ffff)
diff --git a/tools/android/asan/third_party/BUILD.gn b/tools/android/asan/third_party/BUILD.gn
index 9171f29..7c18f14 100644
--- a/tools/android/asan/third_party/BUILD.gn
+++ b/tools/android/asan/third_party/BUILD.gn
@@ -13,9 +13,7 @@
 
   _lib_archs = []
 
-  if (target_cpu == "arm") {
-    _lib_archs += [ "arm" ]
-  } else if (target_cpu == "arm64") {
+  if (target_cpu == "arm" || target_cpu == "arm64") {
     _lib_archs += [
       "arm",
       "aarch64",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d805e38..e187dcf 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4491,7 +4491,7 @@
   <int value="100" label="OBSOLETE_BDH_EMPTY_OR_INVALID_FILTERS"/>
   <int value="101"
       label="OBSOLETE_WC_CONTENT_WITH_CERT_ERRORS_BAD_SECURITY_INFO"/>
-  <int value="102" label="RFMF_RENDERER_FAKED_ITS_OWN_DEATH"/>
+  <int value="102" label="OBSOLETE_RFMF_RENDERER_FAKED_ITS_OWN_DEATH"/>
   <int value="103" label="DWNLD_INVALID_SAVABLE_RESOURCE_LINKS_RESPONSE"/>
   <int value="104" label="OBSOLETE_DWNLD_INVALID_SERIALIZE_AS_MHTML_RESPONSE"/>
   <int value="105" label="BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN"/>
@@ -9239,6 +9239,8 @@
   <int value="48" label="Serial guard"/>
   <int value="49" label="Serial permission data"/>
   <int value="50" label="Periodic background sync"/>
+  <int value="51" label="HID guard"/>
+  <int value="52" label="HID permission data"/>
 </enum>
 
 <enum name="ContentTypeParseableResult">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 3d4289b..49270445 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -120027,6 +120027,9 @@
 </histogram>
 
 <histogram name="SiteIsolation.AllResponses">
+  <obsolete>
+    Removed in March 2018; in M67+, browser-process CORB policy is enabled.
+  </obsolete>
   <owner>creis@chromium.org</owner>
   <summary>
     The count of all network responses received by a renderer. Each response is
diff --git a/tools/wayland_aux/Makefile b/tools/wayland_aux/Makefile
new file mode 100644
index 0000000..91f9017
--- /dev/null
+++ b/tools/wayland_aux/Makefile
@@ -0,0 +1,27 @@
+THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+XDGSHELL := $(THIS_DIR)/../../third_party/wayland-protocols/src/unstable/xdg-shell/xdg-shell-unstable-v6.xml $(wildcard *.py)
+
+all: x.in.svg x.de.svg l.in.svg l.de.svg
+	@echo $(XDG_SHELL)
+
+%.in.svg: %.in.gv
+	fdp -Tsvg $< -o $@
+
+%.de.svg: %.de.gv
+	dot -Tsvg $< -o $@
+
+x.in.gv: $(XDGSHELL)
+	python main.py --spec $< -t interfaces -x > $@
+
+l.in.gv: $(XDGSHELL)
+	python main.py --spec $< -t interfaces > $@
+
+x.de.gv: $(XDGSHELL)
+	python main.py --spec $< -t deps -x > $@
+
+l.de.gv: $(XDGSHELL)
+	python main.py --spec $< -t deps > $@
+
+clean:
+	rm -f *.svg *.gv
+	rm -rf __pycache__
diff --git a/tools/wayland_aux/OWNERS b/tools/wayland_aux/OWNERS
new file mode 100644
index 0000000..a86b2ce
--- /dev/null
+++ b/tools/wayland_aux/OWNERS
@@ -0,0 +1,2 @@
+benwells@chromium.org
+hollingum@google.com
diff --git a/tools/wayland_aux/gv_diagram.py b/tools/wayland_aux/gv_diagram.py
new file mode 100644
index 0000000..99cabb1
--- /dev/null
+++ b/tools/wayland_aux/gv_diagram.py
@@ -0,0 +1,220 @@
+# 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.
+
+"""Draw wayland protocols with Graphviz.
+
+Provides a GvPrinter class which is used to output one (or more) wayland
+protocols as a graph, showing the relationships between interfaces, their
+messages, and how those messages create new interfaces.
+"""
+
+from __future__ import absolute_import
+from __future__ import print_function
+import protocol_util
+
+
+class GvPrinter(object):
+  """Base class for printing graphviz graphs.
+
+  The base printer class, has several generic utilities for printing different
+  graph representations of the protocols.
+
+  Users of this class will call the "draw(protocols)" method to print a
+  graphviz-syntax graph.
+  """
+
+  def __init__(self):
+    self.nodes = {}
+
+  def force_iface(self, arg):
+    i_name = arg.attrib.get('interface', 'unknown')
+    if (i_name, None) not in self.nodes:
+      self.out('"%s" [label="%s" shape=parallelogram]' % (i_name, i_name))
+      self.nodes[(i_name, None)] = i_name
+    return (i_name, None)
+
+  def out(self, text):
+    print(text)
+
+  def draw_nodes(self, protocol):
+    pass
+
+  def draw_edges(self, protocol):
+    pass
+
+  def draw(self, protocols):
+    """Draw the graph.
+
+    Args:
+      protocols: the list of xml.etree.ElementTree.Element protocols which you
+        want to draw as a graph. See third_party/wayland/src/protocol/ for more
+        information.
+    """
+    self.out('digraph g {')
+    self.out('pack=false;')
+    self.out('start="random";')
+    self.out('overlap=false;')
+    self.out('splines=true;')
+    self.out('graph [rankdir = "LR"];')
+    for protocol in protocols:
+      self.draw_nodes(protocol)
+    for protocol in protocols:
+      self.draw_edges(protocol)
+    self.out('}')
+
+
+class InterfacesPrinter(GvPrinter):
+  """Print protocol interfaces as a graphviz graph.
+
+  A specialization of the graph printer which draws interfaces and their
+  methods as a class diagram, where edges indicate relationships between the
+  methods.
+  """
+
+  def __init__(self, draw_enums=False):
+    super(InterfacesPrinter, self).__init__()
+    self.draw_enums = draw_enums
+
+  def draw_edge(self, src, snk):
+    for n in [src, snk]:
+      if n not in self.nodes:
+        raise Exception('Unable to find node "%s" when drawing (%s, %s)' %
+                        (n, src, snk))
+    self.out(self.nodes[src] + ' -> ' + self.nodes[snk] + ' [];')
+
+  def draw_edges(self, protocol):
+    """Draw edges between interfaces and methods.
+
+    Draws all the edges:
+     - From an enum to a method that uses that enum as an argument.
+     - From an interface to a method that uses that interface as an argument.
+     - From a method to an interface that invoking that method will create.
+
+    Args:
+      protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+    """
+    for interface in protocol.findall('interface'):
+      i_name = interface.attrib['name']
+      for message in protocol_util.grab_interface_messages(interface):
+        m_name = message.attrib['name']
+        for arg in message.findall('arg'):
+          if self.draw_enums and 'enum' in arg.attrib:
+            self.draw_edge((i_name, arg.attrib['enum']), (i_name, m_name))
+            continue
+          ty = arg.attrib['type']
+          if ty == 'new_id':
+            self.draw_edge((i_name, m_name), self.force_iface(arg))
+          elif ty == 'object':
+            self.draw_edge(self.force_iface(arg), (i_name, m_name))
+
+  def draw_nodes(self, protocol):
+    """Draw record nodes for each interface.
+
+    Draws a record-style node for each interface. The header is the interface
+    name and each subsequent entry is an event or request which that interface
+    defines.
+
+    As a side-effect, this method populates the |nodes| map.
+
+    Args:
+      protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+    """
+    for interface in protocol.findall('interface'):
+      i_name = interface.attrib['name']
+      i_label = '<i>'+i_name
+      if self.draw_enums:
+        for enum in interface.findall('enum'):
+          e_name = enum.attrib['name']
+          node_name = i_name + '_' + e_name
+          fields = [
+              e.attrib['name'] + ' = ' + e.attrib['value']
+              for e in enum.findall('entry')
+          ]
+          self.out('"%s" [label="%s" shape=record]' %
+                   (node_name, '|'.join(['<e>'+e_name]+fields)))
+          self.nodes[(i_name, e_name)] = node_name+':e'
+      for count, message in enumerate(
+          protocol_util.grab_interface_messages(interface)):
+        m_name = message.attrib['name']
+        is_request = message.tag == 'request'
+        m_label = ('<m%d>'%count) + (m_name + ' -\\>' if is_request
+                                     else '-\\> ' + m_name)
+        i_label += '|' + m_label
+        self.nodes[(i_name, m_name)] = i_name + (':m%d'%count)
+      self.out('"%s" [label="%s" shape=record]' % (i_name, i_label))
+      self.nodes[(i_name, None)] = i_name+':i'
+
+
+class DepsPrinter(GvPrinter):
+  """Print message dependencies as a graphviz graph.
+
+  A specialization of the graph printer for showind dependencies between
+  methods. Nodes in this graph are either interfaces or methods, and edges
+  indicate a relationship of "defines" (when the interface is the method's
+  'this' object), "uses" (when the interface is an argument), or "creates"
+  (when the result of the call is the creation of an object).
+  """
+
+  def __init__(self, draw_all=False):
+    super(DepsPrinter, self).__init__()
+    self.draw_all = draw_all
+
+  def should_draw_message(self, message):
+    return self.draw_all or protocol_util.is_constructor(message)
+
+  def draw_nodes(self, protocol):
+    """Draws a node for each message/interface.
+
+    Draws a node for every interface and all of its methods. As a side effect,
+    calling this method will populate the |nodes| map.
+
+    Args:
+      protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+    """
+    self.nodes[(None, None)] = '_unknown_'
+    self.out('"_unknown_" [label="?" shape=diamond]')
+    for i in protocol.findall('interface'):
+      i_name = i.attrib['name']
+      self.nodes[(i_name, None)] = i_name
+      self.out('"%s" [shape=box]' % (i_name))
+      for m in protocol_util.grab_interface_messages(i):
+        if self.should_draw_message(m):
+          m_name = m.attrib['name']
+          m_node = i_name + ':' + m_name
+          m_shape = 'hexagon' if m.tag == 'event' else 'ellipse'
+          self.nodes[(i_name, m_name)] = m_node
+          self.out('"%s" [label="%s" shape=%s]' %
+                   (m_node, m_name, m_shape))
+
+  def get_obj(self, arg):
+    if 'interface' in arg.attrib:
+      return self.nodes[self.force_iface(arg)]
+    return self.nodes[(None, None)]
+
+  def draw_edges(self, protocol):
+    """Draw edges showing message arguments.
+
+    Draws edges showing the relationship between the messages and the
+    interfaces. Bold edges signify "defines" or "creates" relationships, while
+    dotted edges signify "uses" relationships.
+
+    Args:
+      protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+    """
+    for i in protocol.findall('interface'):
+      i_name = i.attrib['name']
+      for m in protocol_util.grab_interface_messages(i):
+        if self.should_draw_message(m):
+          m_name = m.attrib['name']
+          self.out('"%s" -> "%s" [style=bold]' %
+                   (self.nodes[(i_name, None)], self.nodes[(i_name, m_name)]))
+          for pa in m.findall('arg'):
+            if pa.attrib['type'] == 'object':
+              self.out('"%s" -> "%s" [style=dotted]' %
+                       (self.get_obj(pa), self.nodes[(i_name, m_name)]))
+          for pa in m.findall('arg'):
+            if pa.attrib['type'] == 'new_id':
+              self.out('"%s" -> "%s" [style=bold]' %
+                       (self.nodes[(i_name, m_name)], self.get_obj(pa)))
+
diff --git a/tools/wayland_aux/main.py b/tools/wayland_aux/main.py
new file mode 100644
index 0000000..9152a00
--- /dev/null
+++ b/tools/wayland_aux/main.py
@@ -0,0 +1,61 @@
+# 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.
+
+"""Process wayland specifications.
+
+Various functions for converting/processing/understanding wayland protocols.
+"""
+
+from __future__ import absolute_import
+import argparse
+import sys
+import xml.etree.ElementTree as xml
+import gv_diagram
+
+
+def strip_protocol(protocol):
+  for desc in protocol.findall('description'):
+    protocol.remove(desc)
+  for copy in protocol.findall('copyright'):
+    protocol.remove(copy)
+  if 'summary' in protocol.attrib:
+    protocol.attrib.pop('summary')
+  for c in protocol.getchildren():
+    strip_protocol(c)
+  return protocol
+
+
+def dump_protocol(protocol):
+  xml.dump(protocol)
+
+
+def read_protocol(path):
+  return xml.parse(path).getroot()
+
+
+def main(argv):
+  parser = argparse.ArgumentParser(description=__doc__)
+  parser.add_argument('-s', '--spec',
+                      help='path(s) to the wayland specification(s)',
+                      nargs='+', required=True)
+  parser.add_argument('-t', '--type',
+                      help='Output different types of graph',
+                      choices=['interfaces', 'deps'], required=True)
+  parser.add_argument('-x', '--extra',
+                      help='add extra detail to the normal printout',
+                      action='store_true')
+
+  parsed = parser.parse_args(argv[1:])
+  protocols = [strip_protocol(read_protocol(path)) for path in parsed.spec]
+  extra = parsed.extra
+  if parsed.type == 'deps':
+    drawer = gv_diagram.DepsPrinter(extra)
+  else:
+    drawer = gv_diagram.InterfacesPrinter(extra)
+
+  drawer.draw(protocols)
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/tools/wayland_aux/protocol_util.py b/tools/wayland_aux/protocol_util.py
new file mode 100644
index 0000000..83b9012
--- /dev/null
+++ b/tools/wayland_aux/protocol_util.py
@@ -0,0 +1,52 @@
+# 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.
+
+"""Misc utils.
+
+Misc utils for interpreting protocols.
+"""
+
+from __future__ import absolute_import
+
+
+def grab_interface_messages(interface):
+  """Get the events+requests in this interface.
+
+  Args:
+    interface: the interface which you want the messages of.
+
+  Yields:
+    All the events followed by all the requests.
+  """
+  for e in interface.findall('event'):
+    yield  e
+  for r in interface.findall('request'):
+    yield r
+
+
+def is_constructor(message):
+  """Check if a message is a constructor.
+
+  Args:
+    message: the message which you want to check.
+
+  Returns:
+    True if the message constructs an object (via new_id), False otherwise.
+  """
+  return any(['type' in arg.attrib and arg.attrib['type'] == 'new_id'
+              for arg in message.findall('arg')])
+
+
+def is_destructor(message):
+  """Check if a message is a destructor.
+
+  Args:
+    message: the message which you want to check.
+
+  Returns:
+    True if the message destroys its "this" object (i.e. it has a
+    type=destructor attribute).
+  """
+  return 'type' in message.attrib and message.attrib['type'] == 'destructor'
+
diff --git a/ui/android/java/res/values/color_palette.xml b/ui/android/java/res/values/color_palette.xml
index ad42d15..a82d56e 100644
--- a/ui/android/java/res/values/color_palette.xml
+++ b/ui/android/java/res/values/color_palette.xml
@@ -20,10 +20,10 @@
     <color name="modern_grey_900">#202124</color>
     <color name="modern_grey_900_alpha_38" tools:ignore="UnusedResources">#61202124</color>
 
-    <color name="modern_grey_900_with_white_alpha_4" tools:ignore="UnusedResources">#28292C</color>
-    <color name="modern_grey_900_with_white_alpha_6" tools:ignore="UnusedResources">#2D2E31</color>
-    <color name="modern_grey_900_with_white_alpha_8" tools:ignore="UnusedResources">#313235</color>
-    <color name="modern_grey_900_with_white_alpha_10">#36373A</color>
+    <color name="modern_grey_900_with_grey_200_alpha_4">#292A2D</color>
+    <color name="modern_grey_900_with_grey_200_alpha_6">#303134</color>
+    <color name="modern_grey_900_with_grey_200_alpha_8">#35363A</color>
+    <color name="modern_grey_900_with_grey_200_alpha_10">#38383C</color>
 
     <color name="black_alpha_38" tools:ignore="UnusedResources">#61000000</color>
 
@@ -79,16 +79,16 @@
         @color/modern_grey_900
     </color>
     <color name="default_bg_color_dark_elev_1" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_white_alpha_4
+        @color/modern_grey_900_with_grey_200_alpha_4
     </color>
     <color name="default_bg_color_dark_elev_2" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_white_alpha_6
+        @color/modern_grey_900_with_grey_200_alpha_6
     </color>
     <color name="default_bg_color_dark_elev_3" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_white_alpha_8
+        @color/modern_grey_900_with_grey_200_alpha_8
     </color>
     <color name="default_bg_color_dark_elev_4" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_white_alpha_10
+        @color/modern_grey_900_with_grey_200_alpha_10
     </color>
     <color name="divider_bg_color_dark">@color/modern_grey_300</color>
     <color name="divider_bg_color_light">@color/white_alpha_12</color>
diff --git a/ui/android/java/res_night/values-night/colors.xml b/ui/android/java/res_night/values-night/colors.xml
index f6f5acd..74a8cbd6 100644
--- a/ui/android/java/res_night/values-night/colors.xml
+++ b/ui/android/java/res_night/values-night/colors.xml
@@ -20,7 +20,7 @@
     <color name="default_icon_color_inverse_disabled">@color/default_icon_color_dark_disabled</color>
     <color name="default_icon_color_blue">@color/modern_blue_300</color>
     <color name="default_icon_color_secondary">@color/default_icon_color_secondary_light</color>
-    <color name="hairline_stroke_color">@color/white_alpha_10</color>
+    <color name="hairline_stroke_color">@color/modern_grey_700</color>
 
     <!-- Common background and branding color. -->
     <color name="modern_primary_color">@color/default_bg_color_dark</color>
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 103c0da2..f201984 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -35,7 +35,6 @@
     "input_state_lookup.h",
     "input_state_lookup_win.h",
     "layout_manager.h",
-    "local/window_port_local.h",
     "null_window_targeter.h",
     "scoped_keyboard_hook.h",
     "scoped_simple_keyboard_hook.h",
@@ -47,7 +46,6 @@
     "window_observer.h",
     "window_occlusion_change_builder.h",
     "window_occlusion_tracker.h",
-    "window_port.h",
     "window_targeter.h",
     "window_tracker.h",
     "window_tree_host.h",
@@ -77,7 +75,6 @@
     "input_state_lookup.cc",
     "input_state_lookup_win.cc",
     "layout_manager.cc",
-    "local/window_port_local.cc",
     "native_window_occlusion_tracker_win.cc",
     "native_window_occlusion_tracker_win.h",
     "null_window_targeter.cc",
@@ -90,9 +87,6 @@
     "window_observer.cc",
     "window_occlusion_change_builder.cc",
     "window_occlusion_tracker.cc",
-    "window_port.cc",
-    "window_port_for_shutdown.cc",
-    "window_port_for_shutdown.h",
     "window_targeter.cc",
     "window_tracker.cc",
     "window_tree_host.cc",
diff --git a/ui/aura/DEPS b/ui/aura/DEPS
index 206209eb..7f00c7e 100644
--- a/ui/aura/DEPS
+++ b/ui/aura/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+cc/base",
+  "+cc/mojo_embedder",
   # TODO(danakj): This should not use LayerTreeFrameSink, which is part of the
   # layer compositor. It should use CompositorFrameSink instead.
   "+cc/trees/layer_tree_frame_sink.h",
diff --git a/ui/aura/env.cc b/ui/aura/env.cc
index d7b077d..c224ae4 100644
--- a/ui/aura/env.cc
+++ b/ui/aura/env.cc
@@ -13,11 +13,9 @@
 #include "ui/aura/env_input_state_controller.h"
 #include "ui/aura/env_observer.h"
 #include "ui/aura/input_state_lookup.h"
-#include "ui/aura/local/window_port_local.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher_observer.h"
 #include "ui/aura/window_occlusion_tracker.h"
-#include "ui/aura/window_port_for_shutdown.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/events/event_observer.h"
 #include "ui/events/event_target_iterator.h"
@@ -113,10 +111,6 @@
   return !!g_primary_instance;
 }
 
-std::unique_ptr<WindowPort> Env::CreateWindowPort(Window* window) {
-  return std::make_unique<WindowPortLocal>(window);
-}
-
 void Env::AddObserver(EnvObserver* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/ui/aura/env.h b/ui/aura/env.h
index ed4b407..404e8900 100644
--- a/ui/aura/env.h
+++ b/ui/aura/env.h
@@ -38,7 +38,6 @@
 class Window;
 class WindowEventDispatcherObserver;
 class WindowOcclusionTracker;
-class WindowPort;
 class WindowTreeHost;
 
 // A singleton object that tracks general state within Aura.
@@ -56,9 +55,6 @@
   static Env* GetInstance();
   static bool HasInstance();
 
-  // Called internally to create the appropriate WindowPort implementation.
-  std::unique_ptr<WindowPort> CreateWindowPort(Window* window);
-
   void AddObserver(EnvObserver* observer);
   void RemoveObserver(EnvObserver* observer);
 
diff --git a/ui/aura/local/DEPS b/ui/aura/local/DEPS
deleted file mode 100644
index fa5942b1..0000000
--- a/ui/aura/local/DEPS
+++ /dev/null
@@ -1,8 +0,0 @@
-include_rules = [
-  "+cc/mojo_embedder",
-  "+cc/output",
-  "+cc/scheduler",
-  "+components/viz/service/frame_sinks",
-  "+services/viz/public/interfaces",
-]
-
diff --git a/ui/aura/local/window_port_local.cc b/ui/aura/local/window_port_local.cc
deleted file mode 100644
index 45eb7bc..0000000
--- a/ui/aura/local/window_port_local.cc
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/local/window_port_local.h"
-
-#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
-#include "components/viz/client/hit_test_data_provider_draw_quad.h"
-#include "components/viz/client/local_surface_id_provider.h"
-#include "components/viz/common/features.h"
-#include "components/viz/common/surfaces/local_surface_id_allocation.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/aura/client/cursor_client.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_delegate.h"
-#include "ui/aura/window_occlusion_tracker.h"
-#include "ui/base/layout.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-
-namespace aura {
-
-namespace {
-static const char* kExo = "Exo";
-
-class ScopedCursorHider {
- public:
-  explicit ScopedCursorHider(Window* window)
-      : window_(window), hid_cursor_(false) {
-    if (!window_->IsRootWindow())
-      return;
-    const bool cursor_is_in_bounds = window_->GetBoundsInScreen().Contains(
-        Env::GetInstance()->last_mouse_location());
-    client::CursorClient* cursor_client = client::GetCursorClient(window_);
-    if (cursor_is_in_bounds && cursor_client &&
-        cursor_client->IsCursorVisible()) {
-      cursor_client->HideCursor();
-      hid_cursor_ = true;
-    }
-  }
-  ~ScopedCursorHider() {
-    if (!window_->IsRootWindow())
-      return;
-
-    // Update the device scale factor of the cursor client only when the last
-    // mouse location is on this root window.
-    if (hid_cursor_) {
-      client::CursorClient* cursor_client = client::GetCursorClient(window_);
-      if (cursor_client) {
-        const display::Display& display =
-            display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
-        cursor_client->SetDisplay(display);
-        cursor_client->ShowCursor();
-      }
-    }
-  }
-
- private:
-  Window* window_;
-  bool hid_cursor_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedCursorHider);
-};
-
-}  // namespace
-
-WindowPortLocal::WindowPortLocal(Window* window)
-    : WindowPort(WindowPort::Type::kLocal),
-      window_(window),
-      weak_factory_(this) {}
-
-WindowPortLocal::~WindowPortLocal() {
-  if (frame_sink_id_.is_valid()) {
-    auto* context_factory_private =
-        Env::GetInstance()->context_factory_private();
-    auto* host_frame_sink_manager =
-        context_factory_private->GetHostFrameSinkManager();
-    host_frame_sink_manager->InvalidateFrameSinkId(frame_sink_id_);
-  }
-}
-
-void WindowPortLocal::OnPreInit(Window* window) {}
-
-void WindowPortLocal::OnDeviceScaleFactorChanged(
-    float old_device_scale_factor,
-    float new_device_scale_factor) {
-  if (!window_->IsRootWindow() &&
-      last_device_scale_factor_ != new_device_scale_factor &&
-      IsEmbeddingExternalContent()) {
-    last_device_scale_factor_ = new_device_scale_factor;
-    parent_local_surface_id_allocator_->GenerateId();
-    if (frame_sink_) {
-      frame_sink_->SetLocalSurfaceId(
-          GetCurrentLocalSurfaceIdAllocation().local_surface_id());
-    }
-  }
-
-  ScopedCursorHider hider(window_);
-  if (window_->delegate()) {
-    window_->delegate()->OnDeviceScaleFactorChanged(old_device_scale_factor,
-                                                    new_device_scale_factor);
-  }
-}
-
-void WindowPortLocal::OnWillAddChild(Window* child) {}
-
-void WindowPortLocal::OnWillRemoveChild(Window* child) {}
-
-void WindowPortLocal::OnWillMoveChild(size_t current_index, size_t dest_index) {
-}
-
-void WindowPortLocal::OnVisibilityChanged(bool visible) {}
-
-void WindowPortLocal::OnTransparentChanged(bool visible) {}
-
-void WindowPortLocal::OnDidChangeBounds(const gfx::Rect& old_bounds,
-                                        const gfx::Rect& new_bounds) {
-  if (!window_->IsRootWindow() && last_size_ != new_bounds.size() &&
-      IsEmbeddingExternalContent()) {
-    last_size_ = new_bounds.size();
-    parent_local_surface_id_allocator_->GenerateId();
-    if (frame_sink_) {
-      frame_sink_->SetLocalSurfaceId(
-          GetCurrentLocalSurfaceIdAllocation().local_surface_id());
-    }
-  }
-}
-
-void WindowPortLocal::OnDidChangeTransform(
-    const gfx::Transform& old_transform,
-    const gfx::Transform& new_transform) {}
-
-std::unique_ptr<ui::PropertyData> WindowPortLocal::OnWillChangeProperty(
-    const void* key) {
-  return nullptr;
-}
-
-void WindowPortLocal::OnPropertyChanged(
-    const void* key,
-    int64_t old_value,
-    std::unique_ptr<ui::PropertyData> data) {}
-
-std::unique_ptr<cc::LayerTreeFrameSink>
-WindowPortLocal::CreateLayerTreeFrameSink() {
-  auto* context_factory_private = Env::GetInstance()->context_factory_private();
-  auto* host_frame_sink_manager =
-      context_factory_private->GetHostFrameSinkManager();
-
-  if (!frame_sink_id_.is_valid()) {
-    frame_sink_id_ = context_factory_private->AllocateFrameSinkId();
-    host_frame_sink_manager->RegisterFrameSinkId(
-        frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kYes);
-    window_->SetEmbedFrameSinkId(frame_sink_id_);
-  }
-
-  // For creating a async frame sink which connects to the viz display
-  // compositor.
-  viz::mojom::CompositorFrameSinkPtrInfo sink_info;
-  viz::mojom::CompositorFrameSinkRequest sink_request =
-      mojo::MakeRequest(&sink_info);
-  viz::mojom::CompositorFrameSinkClientPtr client;
-  viz::mojom::CompositorFrameSinkClientRequest client_request =
-      mojo::MakeRequest(&client);
-  host_frame_sink_manager->CreateCompositorFrameSink(
-      frame_sink_id_, std::move(sink_request), std::move(client));
-
-  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
-  params.gpu_memory_buffer_manager =
-      Env::GetInstance()->context_factory()->GetGpuMemoryBufferManager();
-  params.pipes.compositor_frame_sink_info = std::move(sink_info);
-  params.pipes.client_request = std::move(client_request);
-  params.enable_surface_synchronization = true;
-  params.client_name = kExo;
-  bool root_accepts_events =
-      (window_->event_targeting_policy() ==
-       ws::mojom::EventTargetingPolicy::TARGET_ONLY) ||
-      (window_->event_targeting_policy() ==
-       ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS);
-  if (features::IsVizHitTestingDrawQuadEnabled()) {
-    params.hit_test_data_provider =
-        std::make_unique<viz::HitTestDataProviderDrawQuad>(
-            true /* should_ask_for_child_region */, root_accepts_events);
-  }
-  auto frame_sink =
-      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
-          nullptr /* context_provider */, nullptr /* worker_context_provider */,
-          &params);
-  frame_sink_ = frame_sink->GetWeakPtr();
-  AllocateLocalSurfaceId();
-  return std::move(frame_sink);
-}
-
-void WindowPortLocal::AllocateLocalSurfaceId() {
-  if (!parent_local_surface_id_allocator_)
-    parent_local_surface_id_allocator_.emplace();
-  parent_local_surface_id_allocator_->GenerateId();
-  UpdateLocalSurfaceId();
-}
-
-void WindowPortLocal::InvalidateLocalSurfaceId() {
-  if (!parent_local_surface_id_allocator_)
-    return;
-  parent_local_surface_id_allocator_->Invalidate();
-}
-
-viz::ScopedSurfaceIdAllocator WindowPortLocal::GetSurfaceIdAllocator(
-    base::OnceCallback<void()> allocation_task) {
-  return viz::ScopedSurfaceIdAllocator(
-      &parent_local_surface_id_allocator_.value(), std::move(allocation_task));
-}
-
-void WindowPortLocal::UpdateLocalSurfaceIdFromEmbeddedClient(
-    const viz::LocalSurfaceIdAllocation&
-        embedded_client_local_surface_id_allocation) {
-  parent_local_surface_id_allocator_->UpdateFromChild(
-      embedded_client_local_surface_id_allocation);
-  UpdateLocalSurfaceId();
-}
-
-const viz::LocalSurfaceIdAllocation&
-WindowPortLocal::GetLocalSurfaceIdAllocation() {
-  if (!parent_local_surface_id_allocator_)
-    AllocateLocalSurfaceId();
-  return GetCurrentLocalSurfaceIdAllocation();
-}
-
-void WindowPortLocal::OnEventTargetingPolicyChanged() {}
-
-bool WindowPortLocal::ShouldRestackTransientChildren() {
-  return true;
-}
-
-void WindowPortLocal::TrackOcclusionState() {
-  Env::GetInstance()->GetWindowOcclusionTracker()->Track(window_);
-}
-
-void WindowPortLocal::OnFirstSurfaceActivation(
-    const viz::SurfaceInfo& surface_info) {
-  DCHECK_EQ(surface_info.id().frame_sink_id(), window_->GetFrameSinkId());
-  window_->layer()->SetShowSurface(surface_info.id(), window_->bounds().size(),
-                                   SK_ColorWHITE,
-                                   cc::DeadlinePolicy::UseDefaultDeadline(),
-                                   false /* stretch_content_to_fill_bounds */);
-}
-
-void WindowPortLocal::OnFrameTokenChanged(uint32_t frame_token) {}
-
-void WindowPortLocal::UpdateLocalSurfaceId() {
-  last_device_scale_factor_ = ui::GetScaleFactorForNativeView(window_);
-  last_size_ = window_->bounds().size();
-  if (frame_sink_) {
-    frame_sink_->SetLocalSurfaceId(
-        GetCurrentLocalSurfaceIdAllocation().local_surface_id());
-  }
-}
-
-const viz::LocalSurfaceIdAllocation&
-WindowPortLocal::GetCurrentLocalSurfaceIdAllocation() const {
-  return parent_local_surface_id_allocator_
-      ->GetCurrentLocalSurfaceIdAllocation();
-}
-
-bool WindowPortLocal::IsEmbeddingExternalContent() const {
-  return parent_local_surface_id_allocator_.has_value();
-}
-
-}  // namespace aura
diff --git a/ui/aura/local/window_port_local.h b/ui/aura/local/window_port_local.h
deleted file mode 100644
index 059b731c..0000000
--- a/ui/aura/local/window_port_local.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_AURA_LOCAL_WINDOW_PORT_LOCAL_H_
-#define UI_AURA_LOCAL_WINDOW_PORT_LOCAL_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "components/viz/common/surfaces/frame_sink_id.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "components/viz/host/host_frame_sink_client.h"
-#include "ui/aura/window_port.h"
-#include "ui/base/property_data.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace gfx {
-class Size;
-}
-
-namespace aura {
-
-class Window;
-
-// WindowPort implementation for classic aura, e.g. not mus.
-class AURA_EXPORT WindowPortLocal : public WindowPort,
-                                    public viz::HostFrameSinkClient {
- public:
-  explicit WindowPortLocal(Window* window);
-  ~WindowPortLocal() override;
-
-  // WindowPort:
-  void OnPreInit(Window* window) override;
-  void OnDeviceScaleFactorChanged(float old_device_scale_factor,
-                                  float new_device_scale_factor) override;
-  void OnWillAddChild(Window* child) override;
-  void OnWillRemoveChild(Window* child) override;
-  void OnWillMoveChild(size_t current_index, size_t dest_index) override;
-  void OnVisibilityChanged(bool visible) override;
-  void OnTransparentChanged(bool transparent) override;
-  void OnDidChangeBounds(const gfx::Rect& old_bounds,
-                         const gfx::Rect& new_bounds) override;
-  void OnDidChangeTransform(const gfx::Transform& old_transform,
-                            const gfx::Transform& new_transform) override;
-  std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
-      const void* key) override;
-  void OnPropertyChanged(const void* key,
-                         int64_t old_value,
-                         std::unique_ptr<ui::PropertyData> data) override;
-  std::unique_ptr<cc::LayerTreeFrameSink> CreateLayerTreeFrameSink() override;
-  void AllocateLocalSurfaceId() override;
-  viz::ScopedSurfaceIdAllocator GetSurfaceIdAllocator(
-      base::OnceCallback<void()> allocation_task) override;
-  void InvalidateLocalSurfaceId() override;
-  void UpdateLocalSurfaceIdFromEmbeddedClient(
-      const viz::LocalSurfaceIdAllocation&
-          embedded_client_local_surface_id_allocation) override;
-  const viz::LocalSurfaceIdAllocation& GetLocalSurfaceIdAllocation() override;
-  void OnEventTargetingPolicyChanged() override;
-  bool ShouldRestackTransientChildren() override;
-  void TrackOcclusionState() override;
-
-  // viz::HostFrameSinkClient:
-  void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
-  void OnFrameTokenChanged(uint32_t frame_token) override;
-
- private:
-  void UpdateLocalSurfaceId();
-  const viz::LocalSurfaceIdAllocation& GetCurrentLocalSurfaceIdAllocation()
-      const;
-  bool IsEmbeddingExternalContent() const;
-
-  Window* const window_;
-  gfx::Size last_size_;
-  float last_device_scale_factor_ = 1.0f;
-  base::Optional<viz::ParentLocalSurfaceIdAllocator>
-      parent_local_surface_id_allocator_;
-  base::WeakPtr<cc::LayerTreeFrameSink> frame_sink_;
-  viz::FrameSinkId frame_sink_id_;
-
-  base::WeakPtrFactory<WindowPortLocal> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowPortLocal);
-};
-
-}  // namespace aura
-
-#endif  // UI_AURA_LOCAL_WINDOW_PORT_LOCAL_H_
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 19a3906..60e07d2 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -19,7 +19,12 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "cc/mojo_embedder/async_layer_tree_frame_sink.h"
 #include "cc/trees/layer_tree_frame_sink.h"
+#include "components/viz/client/hit_test_data_provider_draw_quad.h"
+#include "components/viz/common/features.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
+#include "components/viz/host/host_frame_sink_manager.h"
 #include "services/ws/public/mojom/window_tree_constants.mojom.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "ui/aura/client/aura_constants.h"
@@ -37,10 +42,10 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_observer.h"
 #include "ui/aura/window_occlusion_tracker.h"
-#include "ui/aura/window_port.h"
 #include "ui/aura/window_targeter.h"
 #include "ui/aura/window_tracker.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/base/layout.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/layer.h"
@@ -53,24 +58,53 @@
 #include "ui/gfx/scoped_canvas.h"
 
 namespace aura {
+namespace {
+static const char* kExo = "Exo";
+
+class ScopedCursorHider {
+ public:
+  explicit ScopedCursorHider(Window* window)
+      : window_(window), hid_cursor_(false) {
+    if (!window_->IsRootWindow())
+      return;
+    const bool cursor_is_in_bounds = window_->GetBoundsInScreen().Contains(
+        Env::GetInstance()->last_mouse_location());
+    client::CursorClient* cursor_client = client::GetCursorClient(window_);
+    if (cursor_is_in_bounds && cursor_client &&
+        cursor_client->IsCursorVisible()) {
+      cursor_client->HideCursor();
+      hid_cursor_ = true;
+    }
+  }
+  ~ScopedCursorHider() {
+    if (!window_->IsRootWindow())
+      return;
+
+    // Update the device scale factor of the cursor client only when the last
+    // mouse location is on this root window.
+    if (hid_cursor_) {
+      client::CursorClient* cursor_client = client::GetCursorClient(window_);
+      if (cursor_client) {
+        const display::Display& display =
+            display::Screen::GetScreen()->GetDisplayNearestWindow(window_);
+        cursor_client->SetDisplay(display);
+        cursor_client->ShowCursor();
+      }
+    }
+  }
+
+ private:
+  Window* window_;
+  bool hid_cursor_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedCursorHider);
+};
+
+}  // namespace
 
 Window::Window(WindowDelegate* delegate, client::WindowType type)
-    : Window(delegate, nullptr, type) {}
-
-Window::Window(WindowDelegate* delegate,
-               std::unique_ptr<WindowPort> port,
-               client::WindowType type)
-    : port_owner_(std::move(port)),
-      port_(port_owner_.get()),
-      host_(nullptr),
-      type_(type),
-      owned_by_parent_(true),
+    : type_(type),
       delegate_(delegate),
-      parent_(nullptr),
-      visible_(false),
-      occlusion_state_(OcclusionState::UNKNOWN),
-      id_(kInitialId),
-      transparent_(false),
       event_targeting_policy_(
           ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS),
       // Don't notify newly added observers during notification. This causes
@@ -142,21 +176,21 @@
   layer()->set_delegate(NULL);
   DestroyLayer();
 
-  // Delete the WindowPort now, in case it needs to reach back into the Window
-  // during destruction.
-  port_owner_.reset();
-  port_ = nullptr;
+  // If SetEmbedFrameSinkId() was called by client code (not internally), then
+  // we assume client code is taking care of unregistering.
+  if (frame_sink_id_.is_valid() && frame_sink_id_internally_allocated_) {
+    auto* context_factory_private =
+        Env::GetInstance()->context_factory_private();
+    auto* host_frame_sink_manager =
+        context_factory_private->GetHostFrameSinkManager();
+    host_frame_sink_manager->InvalidateFrameSinkId(frame_sink_id_);
+  }
 }
 
 void Window::Init(ui::LayerType layer_type) {
   WindowOcclusionTracker::ScopedPause pause_occlusion_tracking;
 
-  if (!port_owner_) {
-    port_owner_ = Env::GetInstance()->CreateWindowPort(this);
-    port_ = port_owner_.get();
-  }
   SetLayer(std::make_unique<ui::Layer>(layer_type));
-  port_->OnPreInit(this);
   layer()->SetVisible(false);
   layer()->set_delegate(this);
   UpdateLayerName();
@@ -202,8 +236,6 @@
   transparent_ = transparent;
   if (layer())
     layer()->SetFillsBoundsOpaquely(!transparent_);
-  if (port_)
-    port_->OnTransparentChanged(transparent);
 }
 
 void Window::SetFillsBoundsCompletely(bool fills_bounds) {
@@ -383,8 +415,6 @@
 
   Window* old_root = child->GetRootWindow();
 
-  port_->OnWillAddChild(child);
-
   DCHECK(!base::ContainsValue(children_, child));
   if (child->parent())
     child->parent()->RemoveChildImpl(child, this);
@@ -419,7 +449,6 @@
   params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING;
   NotifyWindowHierarchyChange(params);
 
-  port_->OnWillRemoveChild(child);
   RemoveChildImpl(child, NULL);
 
   params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGED;
@@ -527,10 +556,6 @@
   return delegate_ ? delegate_->GetCursor(point) : gfx::kNullCursor;
 }
 
-bool Window::ShouldRestackTransientChildren() {
-  return port_->ShouldRestackTransientChildren();
-}
-
 void Window::AddObserver(WindowObserver* observer) {
   observers_.AddObserver(observer);
 }
@@ -553,9 +578,8 @@
   const bool new_window_accepts_events =
       (policy == ws::mojom::EventTargetingPolicy::TARGET_ONLY) ||
       (policy == ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS);
-  if (new_window_accepts_events != old_window_accepts_events) {
+  if (new_window_accepts_events != old_window_accepts_events)
     DCHECK(!created_layer_tree_frame_sink_);
-  }
 #endif
 
   if (event_targeting_policy_ == policy)
@@ -563,8 +587,6 @@
 
   event_targeting_policy_ = policy;
   layer()->SetAcceptEvents(policy != ws::mojom::EventTargetingPolicy::NONE);
-  if (port_)
-    port_->OnEventTargetingPolicyChanged();
 }
 
 bool Window::ContainsPointInRoot(const gfx::Point& point_in_root) const {
@@ -633,8 +655,6 @@
 }
 
 Window* Window::GetToplevelWindow() {
-  // TODO: this may need to call to the WindowPort. For mus this may need to
-  // return for any top level.
   Window* topmost_window_with_delegate = NULL;
   for (aura::Window* window = this; window != NULL; window = window->parent()) {
     if (window->delegate())
@@ -733,8 +753,21 @@
 
 void Window::OnDeviceScaleFactorChanged(float old_device_scale_factor,
                                         float new_device_scale_factor) {
-  port_->OnDeviceScaleFactorChanged(old_device_scale_factor,
-                                    new_device_scale_factor);
+  if (!IsRootWindow() && last_device_scale_factor_ != new_device_scale_factor &&
+      IsEmbeddingExternalContent()) {
+    last_device_scale_factor_ = new_device_scale_factor;
+    parent_local_surface_id_allocator_->GenerateId();
+    if (frame_sink_) {
+      frame_sink_->SetLocalSurfaceId(
+          GetCurrentLocalSurfaceIdAllocation().local_surface_id());
+    }
+  }
+
+  ScopedCursorHider hider(this);
+  if (delegate_) {
+    delegate_->OnDeviceScaleFactorChanged(old_device_scale_factor,
+                                          new_device_scale_factor);
+  }
 }
 
 void Window::UpdateVisualState() {
@@ -784,18 +817,7 @@
   }
 }
 
-std::unique_ptr<ui::PropertyData> Window::BeforePropertyChange(
-    const void* key,
-    bool is_value_changing) {
-  return (is_value_changing && port_) ? port_->OnWillChangeProperty(key)
-                                      : nullptr;
-}
-
-void Window::AfterPropertyChange(const void* key,
-                                 int64_t old_value,
-                                 std::unique_ptr<ui::PropertyData> data) {
-  if (port_)
-    port_->OnPropertyChanged(key, old_value, std::move(data));
+void Window::AfterPropertyChange(const void* key, int64_t old_value) {
   for (WindowObserver& observer : observers_)
     observer.OnWindowPropertyChanged(this, key, old_value);
 }
@@ -803,6 +825,17 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Window, private:
 
+void Window::SetEmbedFrameSinkIdImpl(const viz::FrameSinkId& frame_sink_id,
+                                     bool called_internally) {
+  UnregisterFrameSinkId();
+
+  DCHECK(frame_sink_id.is_valid());
+  frame_sink_id_ = frame_sink_id;
+  embeds_external_client_ = true;
+  frame_sink_id_internally_allocated_ = called_internally;
+  RegisterFrameSinkId();
+}
+
 bool Window::HitTest(const gfx::Point& local_point) {
   gfx::Rect local_bounds(bounds().size());
   if (!delegate_ || !delegate_->HasHitTestMask())
@@ -851,7 +884,6 @@
   else
     layer()->SetVisible(visible);
   visible_ = visible;
-  port_->OnVisibilityChanged(visible);
   SchedulePaint();
   if (parent_ && parent_->layout_manager_)
     parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible);
@@ -942,7 +974,6 @@
       direction == STACK_ABOVE ?
       (child_i < target_i ? target_i : target_i + 1) :
       (child_i < target_i ? target_i - 1 : target_i);
-  port_->OnWillMoveChild(child_i, dest_i);
   children_.erase(children_.begin() + child_i);
   children_.insert(children_.begin() + dest_i, child);
 
@@ -1106,46 +1137,103 @@
 }
 
 std::unique_ptr<cc::LayerTreeFrameSink> Window::CreateLayerTreeFrameSink() {
-  auto sink = port_->CreateLayerTreeFrameSink();
-  DCHECK(frame_sink_id_.is_valid());
-  DCHECK(embeds_external_client_);
+  // Currently we don't have a need for both SetEmbedFrameSinkId() and
+  // this function be called.
+  DCHECK(!embeds_external_client_);
+
+  auto* context_factory_private = Env::GetInstance()->context_factory_private();
+  auto* host_frame_sink_manager =
+      context_factory_private->GetHostFrameSinkManager();
+
+  if (!frame_sink_id_.is_valid()) {
+    auto frame_sink_id = context_factory_private->AllocateFrameSinkId();
+    host_frame_sink_manager->RegisterFrameSinkId(
+        frame_sink_id, this, viz::ReportFirstSurfaceActivation::kYes);
+    SetEmbedFrameSinkIdImpl(frame_sink_id, /* called_internally */ true);
+  }
+
+  // For creating a async frame sink which connects to the viz display
+  // compositor.
+  viz::mojom::CompositorFrameSinkPtrInfo sink_info;
+  viz::mojom::CompositorFrameSinkRequest sink_request =
+      mojo::MakeRequest(&sink_info);
+  viz::mojom::CompositorFrameSinkClientPtr client;
+  viz::mojom::CompositorFrameSinkClientRequest client_request =
+      mojo::MakeRequest(&client);
+  host_frame_sink_manager->CreateCompositorFrameSink(
+      frame_sink_id_, std::move(sink_request), std::move(client));
+
+  cc::mojo_embedder::AsyncLayerTreeFrameSink::InitParams params;
+  params.gpu_memory_buffer_manager =
+      Env::GetInstance()->context_factory()->GetGpuMemoryBufferManager();
+  params.pipes.compositor_frame_sink_info = std::move(sink_info);
+  params.pipes.client_request = std::move(client_request);
+  params.enable_surface_synchronization = true;
+  params.client_name = kExo;
+  bool root_accepts_events =
+      (event_targeting_policy_ ==
+       ws::mojom::EventTargetingPolicy::TARGET_ONLY) ||
+      (event_targeting_policy_ ==
+       ws::mojom::EventTargetingPolicy::TARGET_AND_DESCENDANTS);
+  if (features::IsVizHitTestingDrawQuadEnabled()) {
+    params.hit_test_data_provider =
+        std::make_unique<viz::HitTestDataProviderDrawQuad>(
+            true /* should_ask_for_child_region */, root_accepts_events);
+  }
+  auto frame_sink =
+      std::make_unique<cc::mojo_embedder::AsyncLayerTreeFrameSink>(
+          nullptr /* context_provider */, nullptr /* worker_context_provider */,
+          &params);
+  frame_sink_ = frame_sink->GetWeakPtr();
+  AllocateLocalSurfaceId();
   DCHECK(GetLocalSurfaceIdAllocation().local_surface_id().is_valid());
+#if DCHECK_IS_ON()
   created_layer_tree_frame_sink_ = true;
-  return sink;
+#endif
+  return std::move(frame_sink);
 }
 
-viz::SurfaceId Window::GetSurfaceId() const {
-  return viz::SurfaceId(
-      GetFrameSinkId(),
-      port_->GetLocalSurfaceIdAllocation().local_surface_id());
+viz::SurfaceId Window::GetSurfaceId() {
+  return viz::SurfaceId(GetFrameSinkId(),
+                        GetLocalSurfaceIdAllocation().local_surface_id());
 }
 
 void Window::AllocateLocalSurfaceId() {
-  port_->AllocateLocalSurfaceId();
+  if (!parent_local_surface_id_allocator_) {
+    parent_local_surface_id_allocator_ =
+        std::make_unique<viz::ParentLocalSurfaceIdAllocator>();
+  }
+  parent_local_surface_id_allocator_->GenerateId();
+  UpdateLocalSurfaceId();
 }
 
 viz::ScopedSurfaceIdAllocator Window::GetSurfaceIdAllocator(
     base::OnceCallback<void()> allocation_task) {
-  return port_->GetSurfaceIdAllocator(std::move(allocation_task));
+  return viz::ScopedSurfaceIdAllocator(parent_local_surface_id_allocator_.get(),
+                                       std::move(allocation_task));
 }
 
-const viz::LocalSurfaceIdAllocation& Window::GetLocalSurfaceIdAllocation()
-    const {
-  return port_->GetLocalSurfaceIdAllocation();
+const viz::LocalSurfaceIdAllocation& Window::GetLocalSurfaceIdAllocation() {
+  if (!parent_local_surface_id_allocator_)
+    AllocateLocalSurfaceId();
+  return GetCurrentLocalSurfaceIdAllocation();
 }
 
 void Window::InvalidateLocalSurfaceId() {
-  port_->InvalidateLocalSurfaceId();
+  if (!parent_local_surface_id_allocator_)
+    return;
+  parent_local_surface_id_allocator_->Invalidate();
 }
 
 void Window::UpdateLocalSurfaceIdFromEmbeddedClient(
     const base::Optional<viz::LocalSurfaceIdAllocation>&
         embedded_client_local_surface_id_allocation) {
   if (embedded_client_local_surface_id_allocation) {
-    port_->UpdateLocalSurfaceIdFromEmbeddedClient(
+    parent_local_surface_id_allocator_->UpdateFromChild(
         *embedded_client_local_surface_id_allocation);
+    UpdateLocalSurfaceId();
   } else {
-    port_->AllocateLocalSurfaceId();
+    AllocateLocalSurfaceId();
   }
 }
 
@@ -1160,12 +1248,7 @@
 }
 
 void Window::SetEmbedFrameSinkId(const viz::FrameSinkId& frame_sink_id) {
-  UnregisterFrameSinkId();
-
-  DCHECK(frame_sink_id.is_valid());
-  frame_sink_id_ = frame_sink_id;
-  embeds_external_client_ = true;
-  RegisterFrameSinkId();
+  SetEmbedFrameSinkIdImpl(frame_sink_id, /* called_internally */ false);
 }
 
 bool Window::IsEmbeddingClient() const {
@@ -1173,7 +1256,7 @@
 }
 
 void Window::TrackOcclusionState() {
-  port_->TrackOcclusionState();
+  Env::GetInstance()->GetWindowOcclusionTracker()->Track(this);
 }
 
 bool Window::RequiresDoubleTapGestureEvents() const {
@@ -1229,9 +1312,14 @@
 
   bounds_ = layer()->bounds();
 
-  // Use |bounds_| as that is the bounds before any animations, which is what
-  // mus wants.
-  port_->OnDidChangeBounds(old_bounds, bounds_);
+  if (!IsRootWindow() && old_bounds.size() != bounds_.size() &&
+      IsEmbeddingExternalContent()) {
+    parent_local_surface_id_allocator_->GenerateId();
+    if (frame_sink_) {
+      frame_sink_->SetLocalSurfaceId(
+          GetCurrentLocalSurfaceIdAllocation().local_surface_id());
+    }
+  }
 
   if (layout_manager_)
     layout_manager_->OnWindowResized();
@@ -1268,7 +1356,6 @@
 
 void Window::OnLayerTransformed(const gfx::Transform& old_transform,
                                 ui::PropertyChangeReason reason) {
-  port_->OnDidChangeTransform(old_transform, layer()->transform());
   WindowOcclusionTracker::ScopedPause pause_occlusion_tracking;
   for (WindowObserver& observer : observers_)
     observer.OnWindowTransformed(this, reason);
@@ -1371,6 +1458,15 @@
   return old_layer;
 }
 
+void Window::OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) {
+  DCHECK_EQ(surface_info.id().frame_sink_id(), GetFrameSinkId());
+  layer()->SetShowSurface(surface_info.id(), bounds().size(), SK_ColorWHITE,
+                          cc::DeadlinePolicy::UseDefaultDeadline(),
+                          false /* stretch_content_to_fill_bounds */);
+}
+
+void Window::OnFrameTokenChanged(uint32_t frame_token) {}
+
 void Window::UpdateLayerName() {
 #if DCHECK_IS_ON()
   DCHECK(layer());
@@ -1394,7 +1490,6 @@
   if (auto* compositor = layer()->GetCompositor()) {
     compositor->AddChildFrameSink(frame_sink_id_);
     registered_frame_sink_id_ = true;
-    port_->RegisterFrameSinkId(frame_sink_id_);
   }
 }
 
@@ -1402,9 +1497,26 @@
   if (!registered_frame_sink_id_)
     return;
   registered_frame_sink_id_ = false;
-  port_->UnregisterFrameSinkId(frame_sink_id_);
   if (auto* compositor = layer()->GetCompositor())
     compositor->RemoveChildFrameSink(frame_sink_id_);
 }
 
+void Window::UpdateLocalSurfaceId() {
+  last_device_scale_factor_ = ui::GetScaleFactorForNativeView(this);
+  if (frame_sink_) {
+    frame_sink_->SetLocalSurfaceId(
+        GetCurrentLocalSurfaceIdAllocation().local_surface_id());
+  }
+}
+
+const viz::LocalSurfaceIdAllocation&
+Window::GetCurrentLocalSurfaceIdAllocation() const {
+  return parent_local_surface_id_allocator_
+      ->GetCurrentLocalSurfaceIdAllocation();
+}
+
+bool Window::IsEmbeddingExternalContent() const {
+  return parent_local_surface_id_allocator_.get() != nullptr;
+}
+
 }  // namespace aura
diff --git a/ui/aura/window.h b/ui/aura/window.h
index 10c53084..fd92ec9 100644
--- a/ui/aura/window.h
+++ b/ui/aura/window.h
@@ -16,16 +16,18 @@
 #include "base/compiler_specific.h"
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/common/surfaces/local_surface_id_allocation.h"
 #include "components/viz/common/surfaces/scoped_surface_id_allocator.h"
+#include "components/viz/host/host_frame_sink_client.h"
 #include "ui/aura/aura_export.h"
 #include "ui/aura/client/window_types.h"
 #include "ui/aura/window_observer.h"
-#include "ui/aura/window_port.h"
 #include "ui/base/class_property.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/layer_delegate.h"
@@ -54,6 +56,10 @@
 class Layer;
 }  // namespace ui
 
+namespace viz {
+class ParentLocalSurfaceIdAllocator;
+}
+
 namespace ws {
 namespace mojom {
 enum class EventTargetingPolicy;
@@ -66,7 +72,6 @@
 class ScopedKeyboardHook;
 class WindowDelegate;
 class WindowObserver;
-class WindowPortForShutdown;
 class WindowTargeter;
 class WindowTreeHost;
 
@@ -80,12 +85,12 @@
 
 // Aura window implementation. Interesting events are sent to the
 // WindowDelegate.
-// TODO(beng): resolve ownership.
 class AURA_EXPORT Window : public ui::LayerDelegate,
                            public ui::LayerOwner,
                            public ui::EventTarget,
                            public ui::GestureConsumer,
-                           public ui::PropertyHandler {
+                           public ui::PropertyHandler,
+                           public viz::HostFrameSinkClient {
  public:
   // Initial value of id() for newly created windows.
   static constexpr int kInitialId = -1;
@@ -131,9 +136,6 @@
 
   explicit Window(WindowDelegate* delegate,
                   client::WindowType type = client::WINDOW_TYPE_UNKNOWN);
-  Window(WindowDelegate* delegate,
-         std::unique_ptr<WindowPort> port,
-         client::WindowType type = client::WINDOW_TYPE_UNKNOWN);
   ~Window() override;
 
   // Initializes the window. This creates the window's layer.
@@ -316,10 +318,6 @@
   // Returns the cursor for the specified point, in window coordinates.
   gfx::NativeCursor GetCursor(const gfx::Point& point) const;
 
-  // Returns true if the children of this should be restacked by the
-  // transient window related classes to honor transient window stacking.
-  bool ShouldRestackTransientChildren();
-
   // Add/remove observer.
   void AddObserver(WindowObserver* observer);
   void RemoveObserver(WindowObserver* observer);
@@ -408,7 +406,7 @@
   std::unique_ptr<cc::LayerTreeFrameSink> CreateLayerTreeFrameSink();
 
   // Gets the current viz::SurfaceId.
-  viz::SurfaceId GetSurfaceId() const;
+  viz::SurfaceId GetSurfaceId();
 
   // Forces the window to allocate a new viz::LocalSurfaceId for the next
   // CompositorFrame submission in anticipation of a synchronization operation
@@ -419,7 +417,7 @@
       base::OnceCallback<void()> allocation_task);
 
   // Returns the current viz::LocalSurfaceIdAllocation.
-  const viz::LocalSurfaceIdAllocation& GetLocalSurfaceIdAllocation() const;
+  const viz::LocalSurfaceIdAllocation& GetLocalSurfaceIdAllocation();
 
   // Marks the current viz::LocalSurfaceId as invalid. AllocateLocalSurfaceId
   // must be called before submitting new CompositorFrames.
@@ -497,23 +495,22 @@
   void RemoveOrDestroyChildren();
 
   // Overrides from ui::PropertyHandler
-  std::unique_ptr<ui::PropertyData> BeforePropertyChange(
-      const void* key,
-      bool is_value_changing) override;
-  void AfterPropertyChange(const void* key,
-                           int64_t old_value,
-                           std::unique_ptr<ui::PropertyData> data) override;
+  void AfterPropertyChange(const void* key, int64_t old_value) override;
+
  private:
   friend class DefaultWindowOcclusionChangeBuilder;
   friend class HitTestDataProviderAura;
   friend class LayoutManager;
   friend class PropertyConverter;
-  friend class WindowPort;
-  friend class WindowPortForShutdown;
-  friend class WindowPortMus;
   friend class WindowTargeter;
   friend class test::WindowTestApi;
 
+  // Called by SetEmbedFrameSinkId(). |called_internally| is true if this was
+  // not called from SetEmbedFrameSinkId(), but rather internally; false if
+  // called from client code.
+  void SetEmbedFrameSinkIdImpl(const viz::FrameSinkId& frame_sink_id,
+                               bool called_internally);
+
   // Returns true if the mouse pointer at relative-to-this-Window's-origin
   // |local_point| can trigger an event for this Window.
   // TODO(beng): A Window can supply a hit-test mask to cause some portions of
@@ -612,26 +609,19 @@
                             ui::LocatedEvent* event) const override;
   gfx::PointF GetScreenLocationF(const ui::LocatedEvent& event) const override;
 
+  // viz::HostFrameSinkClient:
+  void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
+  void OnFrameTokenChanged(uint32_t frame_token) override;
+
   // Updates the layer name based on the window's name and id.
   void UpdateLayerName();
 
   void RegisterFrameSinkId();
   void UnregisterFrameSinkId();
-
-  bool registered_frame_sink_id_ = false;
-  bool disable_frame_sink_id_registration_ = false;
-
-  bool created_layer_tree_frame_sink_ = false;
-
-  // Window owns its corresponding WindowPort, but the ref is held as a raw
-  // pointer in |port_| so that it can still be accessed during destruction.
-  // This is important as deleting the WindowPort may result in trying to lookup
-  // the WindowPort associated with the Window.
-  //
-  // NOTE: this value is reset for windows that exist when WindowTreeClient
-  // is deleted.
-  std::unique_ptr<WindowPort> port_owner_;
-  WindowPort* port_;
+  void UpdateLocalSurfaceId();
+  const viz::LocalSurfaceIdAllocation& GetCurrentLocalSurfaceIdAllocation()
+      const;
+  bool IsEmbeddingExternalContent() const;
 
   // Bounds of this window relative to the parent. This is cached as the bounds
   // of the Layer and Window are not necessarily the same. In particular bounds
@@ -639,18 +629,18 @@
   // is relative to the parent Window.
   gfx::Rect bounds_;
 
-  WindowTreeHost* host_;
+  WindowTreeHost* host_ = nullptr;
 
   client::WindowType type_;
 
   // True if the Window is owned by its parent - i.e. it will be deleted by its
-  // parent during its parents destruction. True is the default.
-  bool owned_by_parent_;
+  // parent during its parents destruction.
+  bool owned_by_parent_ = true;
 
   WindowDelegate* delegate_;
 
   // The Window's parent.
-  Window* parent_;
+  Window* parent_ = nullptr;
 
   // Child windows. Topmost is last.
   Windows children_;
@@ -658,26 +648,18 @@
   // The visibility state of the window as set by Show()/Hide(). This may differ
   // from the visibility of the underlying layer, which may remain visible after
   // the window is hidden (e.g. to animate its disappearance).
-  bool visible_;
+  bool visible_ = false;
 
   // Occlusion state of the window.
-  OcclusionState occlusion_state_;
+  OcclusionState occlusion_state_ = OcclusionState::UNKNOWN;
 
   // Occluded region of the window.
   SkRegion occluded_region_;
 
-  int id_;
-
-  // The FrameSinkId associated with this window. If this window is embedding
-  // another client, then this should be set to the FrameSinkId of that client,
-  // and |embeds_external_client_| is turned on. However, a window can still
-  // have a valid FrameSinkId without embedding another client, to facilitate
-  // hit-testing.
-  viz::FrameSinkId frame_sink_id_;
-  bool embeds_external_client_ = false;
+  int id_ = kInitialId;
 
   // Whether layer is initialized as non-opaque. Defaults to false.
-  bool transparent_;
+  bool transparent_ = false;
 
   // Whether it's in a process of CleanupGestureState() or not.
   bool cleaning_up_gesture_state_ = false;
@@ -694,6 +676,45 @@
 
   base::ReentrantObserverList<WindowObserver, true> observers_;
 
+  // Embedding support ---------------------------------------------------------
+
+  // Used to detect changes in device scale factor that require generating a
+  // new LocalSurfaceId.
+  float last_device_scale_factor_ = 1.0f;
+
+  // The FrameSinkId associated with this window. If this window is embedding
+  // another client, then this should be set to the FrameSinkId of that client,
+  // and |embeds_external_client_| is turned on. However, a window can still
+  // have a valid FrameSinkId without embedding another client, to facilitate
+  // hit-testing.
+  viz::FrameSinkId frame_sink_id_;
+
+  // Set to true if |frame_sink_id_| has been registered in the Compositor
+  // associated this this.
+  bool registered_frame_sink_id_ = false;
+
+  // Used by tests to disable registering the FrameSinkId with the Compositor.
+  bool disable_frame_sink_id_registration_ = false;
+
+  // Set to true if SetEmbedFrameSinkId() has been called.
+  bool embeds_external_client_ = false;
+
+  // Set to true if |frame_sink_id_| was allocated as the result of an internal
+  // call, false if SetEmbedFrameSinkId() was called by client. code.
+  bool frame_sink_id_internally_allocated_ = false;
+
+  // Used to allocate LocalSurfaceIds when this is embedding external content.
+  std::unique_ptr<viz::ParentLocalSurfaceIdAllocator>
+      parent_local_surface_id_allocator_;
+
+#if DCHECK_IS_ON()
+  // Set to true if CreateLayerTreeFrameSink() was called.
+  bool created_layer_tree_frame_sink_ = false;
+#endif
+
+  // Used when this is embedding external content.
+  base::WeakPtr<cc::LayerTreeFrameSink> frame_sink_;
+
   DISALLOW_COPY_AND_ASSIGN(Window);
 };
 
diff --git a/ui/aura/window_port.cc b/ui/aura/window_port.cc
deleted file mode 100644
index 2922baf..0000000
--- a/ui/aura/window_port.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/window_port.h"
-
-#include "ui/aura/window.h"
-
-namespace aura {
-
-WindowPort::WindowPort(Type type) : type_(type) {}
-
-// static
-WindowPort* WindowPort::Get(Window* window) {
-  return window ? window->port_ : nullptr;
-}
-
-// static
-base::ReentrantObserverList<WindowObserver, true>* WindowPort::GetObservers(
-    Window* window) {
-  return &(window->observers_);
-}
-
-}  // namespace aura
diff --git a/ui/aura/window_port.h b/ui/aura/window_port.h
deleted file mode 100644
index 4818b26..0000000
--- a/ui/aura/window_port.h
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_AURA_WINDOW_PORT_H_
-#define UI_AURA_WINDOW_PORT_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/callback.h"
-#include "base/observer_list.h"
-#include "base/strings/string16.h"
-#include "base/time/time.h"
-#include "components/viz/common/surfaces/local_surface_id_allocation.h"
-#include "components/viz/common/surfaces/scoped_surface_id_allocator.h"
-#include "components/viz/common/surfaces/surface_id.h"
-#include "ui/aura/aura_export.h"
-#include "ui/base/class_property.h"
-
-namespace cc {
-class LayerTreeFrameSink;
-}
-
-namespace gfx {
-class Rect;
-class Transform;
-}
-
-namespace aura {
-
-class Window;
-class WindowObserver;
-
-// WindowPort defines an interface to enable Window to be used with or without
-// mus. WindowPort is owned by Window and called at key points in Windows
-// lifetime that enable Window to be used in both environments.
-//
-// If a Window is created without an explicit WindowPort then
-// Env::CreateWindowPort() is used to create the WindowPort.
-class AURA_EXPORT WindowPort {
- public:
-  // Corresponds to the concrete implementation of this interface.
-  enum class Type {
-    // WindowPortLocal.
-    kLocal,
-
-    // WindowPortMus.
-    kMus,
-
-    // WindowPortForShutdown.
-    kShutdown,
-  };
-
-  virtual ~WindowPort() {}
-
-  Type type() const { return type_; }
-
-  // Called from Window::Init().
-  virtual void OnPreInit(Window* window) = 0;
-
-  virtual void OnDeviceScaleFactorChanged(float old_device_scale_factor,
-                                          float new_device_scale_factor) = 0;
-
-  // Called when a window is being added as a child. |child| may already have
-  // a parent, but its parent is not the Window this WindowPort is associated
-  // with.
-  virtual void OnWillAddChild(Window* child) = 0;
-
-  virtual void OnWillRemoveChild(Window* child) = 0;
-
-  // Called to move the child at |current_index| to |dest_index|. |dest_index|
-  // is calculated assuming the window at |current_index| has been removed, e.g.
-  //   Window* child = children_[current_index];
-  //   children_.erase(children_.begin() + current_index);
-  //   children_.insert(children_.begin() + dest_index, child);
-  virtual void OnWillMoveChild(size_t current_index, size_t dest_index) = 0;
-
-  virtual void OnVisibilityChanged(bool visible) = 0;
-  virtual void OnTransparentChanged(bool transparent) = 0;
-
-  virtual void OnDidChangeBounds(const gfx::Rect& old_bounds,
-                                 const gfx::Rect& new_bounds) = 0;
-
-  virtual void OnDidChangeTransform(const gfx::Transform& old_transform,
-                                    const gfx::Transform& new_transform) = 0;
-
-  // Called before a property is changed. The return value from this is supplied
-  // into OnPropertyChanged() so that WindowPort may pass data between the two
-  // calls.
-  virtual std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
-      const void* key) = 0;
-
-  // Called after a property changes, but before observers are notified. |data|
-  // is the return value from OnWillChangeProperty().
-  virtual void OnPropertyChanged(const void* key,
-                                 int64_t old_value,
-                                 std::unique_ptr<ui::PropertyData> data) = 0;
-
-  // Called for creating a cc::LayerTreeFrameSink for the window.
-  virtual std::unique_ptr<cc::LayerTreeFrameSink>
-  CreateLayerTreeFrameSink() = 0;
-
-  // Forces the window to allocate a new viz::LocalSurfaceId for the next
-  // CompositorFrame submission in anticipation of a synchronization operation
-  // that does not involve a resize or a device scale factor change.
-  virtual void AllocateLocalSurfaceId() = 0;
-
-  // When a ScopedSurfaceIdAllocator is alive, it prevents the
-  // allocator from actually allocating. Instead, it triggers its
-  // |allocation_task| upon destruction. This allows us to issue only one
-  // allocation during the lifetime. This is used to continue routing and
-  // processing when a child allocates its own LocalSurfaceId.
-  virtual viz::ScopedSurfaceIdAllocator GetSurfaceIdAllocator(
-      base::OnceCallback<void()> allocation_task) = 0;
-
-  // Marks the current viz::LocalSurfaceId as invalid. AllocateLocalSurfaceId
-  // must be called before submitting new CompositorFrames.
-  virtual void InvalidateLocalSurfaceId() = 0;
-
-  virtual void UpdateLocalSurfaceIdFromEmbeddedClient(
-      const viz::LocalSurfaceIdAllocation&
-          embedded_client_local_surface_id_allocation) = 0;
-
-  // Gets the current viz::LocalSurfaceIdAllocation which incorporates both
-  // the viz::LocalSurfaceId and its allocation time.
-  virtual const viz::LocalSurfaceIdAllocation&
-  GetLocalSurfaceIdAllocation() = 0;
-
-  virtual void OnEventTargetingPolicyChanged() = 0;
-
-  // See description of function with same name in transient_window_client.
-  virtual bool ShouldRestackTransientChildren() = 0;
-
-  // Called to register/unregister an embedded FramesSinkId. This is only called
-  // if SetEmbedFrameSinkId() is called on the associated Window.
-  virtual void RegisterFrameSinkId(const viz::FrameSinkId& frame_sink_id) {}
-  virtual void UnregisterFrameSinkId(const viz::FrameSinkId& frame_sink_id) {}
-
-  // Called to start occlusion state tracking.
-  virtual void TrackOcclusionState() {}
-
- protected:
-  explicit WindowPort(Type type);
-
-  // Returns the WindowPort associated with a Window.
-  static WindowPort* Get(Window* window);
-
-  // Returns the ObserverList of a Window.
-  static base::ReentrantObserverList<WindowObserver, true>* GetObservers(
-      Window* window);
-
- private:
-  const Type type_;
-};
-
-}  // namespace aura
-
-#endif  // UI_AURA_WINDOW_PORT_H_
diff --git a/ui/aura/window_port_for_shutdown.cc b/ui/aura/window_port_for_shutdown.cc
deleted file mode 100644
index 9fff1cc..0000000
--- a/ui/aura/window_port_for_shutdown.cc
+++ /dev/null
@@ -1,84 +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 "ui/aura/window_port_for_shutdown.h"
-
-#include "cc/trees/layer_tree_frame_sink.h"
-#include "ui/aura/window.h"
-
-namespace aura {
-
-WindowPortForShutdown::WindowPortForShutdown()
-    : WindowPort(WindowPort::Type::kShutdown) {}
-
-WindowPortForShutdown::~WindowPortForShutdown() {}
-
-// static
-void WindowPortForShutdown::Install(aura::Window* window) {
-  window->port_owner_.reset(new WindowPortForShutdown);
-  window->port_ = window->port_owner_.get();
-}
-
-void WindowPortForShutdown::OnPreInit(Window* window) {}
-
-void WindowPortForShutdown::OnDeviceScaleFactorChanged(
-    float old_device_scale_factor,
-    float new_device_scale_factor) {}
-
-void WindowPortForShutdown::OnWillAddChild(Window* child) {}
-
-void WindowPortForShutdown::OnWillRemoveChild(Window* child) {}
-
-void WindowPortForShutdown::OnWillMoveChild(size_t current_index,
-                                            size_t dest_index) {}
-
-void WindowPortForShutdown::OnVisibilityChanged(bool visible) {}
-
-void WindowPortForShutdown::OnTransparentChanged(bool transparent) {}
-
-void WindowPortForShutdown::OnDidChangeBounds(const gfx::Rect& old_bounds,
-                                              const gfx::Rect& new_bounds) {}
-
-void WindowPortForShutdown::OnDidChangeTransform(
-    const gfx::Transform& old_transform,
-    const gfx::Transform& new_transform) {}
-
-std::unique_ptr<ui::PropertyData> WindowPortForShutdown::OnWillChangeProperty(
-    const void* key) {
-  return nullptr;
-}
-
-void WindowPortForShutdown::OnPropertyChanged(
-    const void* key,
-    int64_t old_value,
-    std::unique_ptr<ui::PropertyData> data) {}
-
-std::unique_ptr<cc::LayerTreeFrameSink>
-WindowPortForShutdown::CreateLayerTreeFrameSink() {
-  return nullptr;
-}
-
-void WindowPortForShutdown::AllocateLocalSurfaceId() {}
-void WindowPortForShutdown::InvalidateLocalSurfaceId() {}
-void WindowPortForShutdown::UpdateLocalSurfaceIdFromEmbeddedClient(
-    const viz::LocalSurfaceIdAllocation&
-        embedded_client_local_surface_id_allocation) {}
-
-viz::ScopedSurfaceIdAllocator WindowPortForShutdown::GetSurfaceIdAllocator(
-    base::OnceCallback<void()> allocation_task) {
-  return viz::ScopedSurfaceIdAllocator(std::move(allocation_task));
-}
-
-const viz::LocalSurfaceIdAllocation&
-WindowPortForShutdown::GetLocalSurfaceIdAllocation() {
-  return local_surface_id_allocation_;
-}
-
-void WindowPortForShutdown::OnEventTargetingPolicyChanged() {}
-
-bool WindowPortForShutdown::ShouldRestackTransientChildren() {
-  return true;
-}
-
-}  // namespace aura
diff --git a/ui/aura/window_port_for_shutdown.h b/ui/aura/window_port_for_shutdown.h
deleted file mode 100644
index 15884ccf..0000000
--- a/ui/aura/window_port_for_shutdown.h
+++ /dev/null
@@ -1,62 +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 UI_AURA_WINDOW_PORT_FOR_SHUTDOWN_H_
-#define UI_AURA_WINDOW_PORT_FOR_SHUTDOWN_H_
-
-#include "ui/aura/window_port.h"
-
-#include "base/time/time.h"
-#include "components/viz/common/surfaces/local_surface_id_allocation.h"
-
-namespace aura {
-
-// When WindowTreeClient is destroyed any existing windows get a
-// WindowPortForShutdown assigned to them. This allows for the Window to keep
-// working without a WindowTreeClient. This class is *only* used inside aura.
-class WindowPortForShutdown : public WindowPort {
- public:
-  WindowPortForShutdown();
-  ~WindowPortForShutdown() override;
-
-  static void Install(aura::Window* window);
-
-  // WindowPort:
-  void OnPreInit(Window* window) override;
-  void OnDeviceScaleFactorChanged(float old_device_scale_factor,
-                                  float new_device_scale_factor) override;
-  void OnWillAddChild(Window* child) override;
-  void OnWillRemoveChild(Window* child) override;
-  void OnWillMoveChild(size_t current_index, size_t dest_index) override;
-  void OnVisibilityChanged(bool visible) override;
-  void OnTransparentChanged(bool transparent) override;
-  void OnDidChangeBounds(const gfx::Rect& old_bounds,
-                         const gfx::Rect& new_bounds) override;
-  void OnDidChangeTransform(const gfx::Transform& old_transform,
-                            const gfx::Transform& new_transform) override;
-  std::unique_ptr<ui::PropertyData> OnWillChangeProperty(
-      const void* key) override;
-  void OnPropertyChanged(const void* key,
-                         int64_t old_value,
-                         std::unique_ptr<ui::PropertyData> data) override;
-  std::unique_ptr<cc::LayerTreeFrameSink> CreateLayerTreeFrameSink() override;
-  void AllocateLocalSurfaceId() override;
-  viz::ScopedSurfaceIdAllocator GetSurfaceIdAllocator(
-      base::OnceCallback<void()> allocation_task) override;
-  void InvalidateLocalSurfaceId() override;
-  void UpdateLocalSurfaceIdFromEmbeddedClient(
-      const viz::LocalSurfaceIdAllocation&
-          embedded_client_local_surface_id_allocation) override;
-  const viz::LocalSurfaceIdAllocation& GetLocalSurfaceIdAllocation() override;
-  void OnEventTargetingPolicyChanged() override;
-  bool ShouldRestackTransientChildren() override;
-
- private:
-  viz::LocalSurfaceIdAllocation local_surface_id_allocation_;
-  DISALLOW_COPY_AND_ASSIGN(WindowPortForShutdown);
-};
-
-}  // namespace aura
-
-#endif  // UI_AURA_WINDOW_PORT_FOR_SHUTDOWN_H_
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc
index 2916480..7d64e34 100644
--- a/ui/aura/window_unittest.cc
+++ b/ui/aura/window_unittest.cc
@@ -3257,7 +3257,7 @@
   EXPECT_NE(nullptr, frame_sink.get());
   EXPECT_TRUE(local_surface_id1.is_valid());
 
-  // Resize 0x0 to make sure WindowPort* stores the correct window size before
+  // Resize to 0x0 to make sure the correct window size is stored before
   // creating the frame sink.
   window.SetBounds(gfx::Rect(0, 0));
   viz::LocalSurfaceId local_surface_id2 =
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index d1e145f..edde5598 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -224,7 +224,6 @@
     "page_transition_types.h",
     "platform_window_defaults.cc",
     "platform_window_defaults.h",
-    "property_data.h",
     "resource/resource_bundle.cc",
     "resource/resource_bundle.h",
     "resource/resource_bundle_android.cc",
diff --git a/ui/base/class_property.cc b/ui/base/class_property.cc
index 162ac89..d6a5378 100644
--- a/ui/base/class_property.cc
+++ b/ui/base/class_property.cc
@@ -20,14 +20,6 @@
                                              PropertyDeallocator deallocator,
                                              int64_t value,
                                              int64_t default_value) {
-  // TODO(https://crbug.com/952087): ideally this code would early out if the
-  // value isn't changing. Unfortunately that breaks some assumptions.
-  // |is_value_changing| is a best guess at whether the value is changing, and
-  // doesn't handle non-POD types.
-  const bool is_value_changing =
-      value != GetPropertyInternal(key, default_value);
-  std::unique_ptr<PropertyData> data =
-      BeforePropertyChange(key, is_value_changing);
   int64_t old = GetPropertyInternal(key, default_value);
   if (value == default_value) {
     prop_map_.erase(key);
@@ -38,16 +30,10 @@
     prop_value.deallocator = deallocator;
     prop_map_[key] = prop_value;
   }
-  AfterPropertyChange(key, old, std::move(data));
+  AfterPropertyChange(key, old);
   return old;
 }
 
-std::unique_ptr<PropertyData> PropertyHandler::BeforePropertyChange(
-    const void* key,
-    bool is_value_changing) {
-  return nullptr;
-}
-
 void PropertyHandler::ClearProperties() {
   // Clear properties.
   for (std::map<const void*, Value>::const_iterator iter = prop_map_.begin();
diff --git a/ui/base/class_property.h b/ui/base/class_property.h
index 7da967e..40bcdeb 100644
--- a/ui/base/class_property.h
+++ b/ui/base/class_property.h
@@ -8,11 +8,9 @@
 #include <stdint.h>
 
 #include <map>
-#include <memory>
 #include <set>
 
 #include "base/time/time.h"
-#include "ui/base/property_data.h"
 #include "ui/base/ui_base_export.h"
 #include "ui/base/ui_base_types.h"
 
@@ -93,16 +91,7 @@
  protected:
   friend class subtle::PropertyHelper;
 
-  // Called from SetPropertyInternal() prior to changing the value. If
-  // |is_value_changing| is false, the new value is the same as the old value
-  // (in other words, the value isn't really changing, but observers will
-  // still be notified).
-  virtual std::unique_ptr<PropertyData> BeforePropertyChange(
-      const void* key,
-      bool is_value_changing);
-  virtual void AfterPropertyChange(const void* key,
-                                   int64_t old_value,
-                                   std::unique_ptr<PropertyData> data) {}
+  virtual void AfterPropertyChange(const void* key, int64_t old_value) {}
   void ClearProperties();
 
   // Called by the public {Set,Get,Clear}Property functions.
diff --git a/ui/base/property_data.h b/ui/base/property_data.h
deleted file mode 100644
index abe13cc..0000000
--- a/ui/base/property_data.h
+++ /dev/null
@@ -1,22 +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 UI_BASE_PROPERTY_DATA_H_
-#define UI_BASE_PROPERTY_DATA_H_
-
-#include "ui/base/ui_base_export.h"
-
-namespace ui {
-
-// Descendants of ui::PropertyHandler may return a descendant of this class
-// when overriding BeforePropertyChange(). This instance is then passed to
-// AfterPropertyChange() in order to preserve and/or communicate data between
-// those two calls.
-struct UI_BASE_EXPORT PropertyData {
-  virtual ~PropertyData() {}
-};
-
-}
-
-#endif
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_factory.js b/ui/file_manager/file_manager/background/js/volume_manager_factory.js
index 57aa45e5..9e477a55 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager_factory.js
+++ b/ui/file_manager/file_manager/background/js/volume_manager_factory.js
@@ -25,8 +25,7 @@
   async function getInstance() {
     if (!instance) {
       instance = new VolumeManagerImpl();
-      instanceInitialized =
-          new Promise(fulfill => instance.initialize(fulfill));
+      instanceInitialized = instance.initialize();
     }
     await instanceInitialized;
     return instance;
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_impl.js b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
index f817e62..7eaaaaa 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager_impl.js
+++ b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
@@ -23,8 +23,7 @@
 
     /**
      * Queue for mounting.
-     * @type {AsyncUtil.Queue}
-     * @private
+     * @private @const {AsyncUtil.Queue}
      */
     this.mountQueue_ = new AsyncUtil.Queue();
 
@@ -119,20 +118,27 @@
 
   /**
    * Initializes mount points.
-   * @param {function()} callback Called upon the completion of the
-   *     initialization.
+   * @return {!Promise<void>}
    */
-  initialize(callback) {
+  async initialize() {
     chrome.fileManagerPrivate.onMountCompleted.addListener(
         this.onMountCompleted_.bind(this));
+
     console.warn('Getting volume list');
-    chrome.fileManagerPrivate.getVolumeMetadataList(volumeMetadataList => {
-      console.warn(`There are ${volumeMetadataList.length} volumes`);
-      // We must subscribe to the mount completed event in the callback of
-      // getVolumeMetadataList. crbug.com/330061.
-      // But volumes reported by onMountCompleted events must be added after the
-      // volumes in the volumeMetadataList are mounted. crbug.com/135477.
-      this.mountQueue_.run(async (inCallback) => {
+    const volumeMetadataList = await new Promise(
+        resolve => chrome.fileManagerPrivate.getVolumeMetadataList(resolve));
+    if (!volumeMetadataList) {
+      console.warn(`There are no volumes`);
+      return;
+    }
+    console.warn(`There are ${volumeMetadataList.length} volumes`);
+
+    // We must subscribe to the mount completed event in the callback of
+    // getVolumeMetadataList (crbug.com/330061). But volumes reported by
+    // onMountCompleted events must be added after the volumes in the
+    // volumeMetadataList are mounted (crbug.com/135477).
+    return new Promise((resolve, reject) => {
+      this.mountQueue_.run(async (done) => {
         try {
           // Create VolumeInfo for each volume.
           await Promise.all(volumeMetadataList.map(async (volumeMetadata) => {
@@ -142,12 +148,13 @@
           }));
 
           console.warn('Initialized all volumes');
+          resolve();
+        } catch (e) {
+          reject(e);
         } finally {
-          // Call the callback of the initialize function.
-          callback();
           // Call the callback of AsyncQueue. Maybe it invokes callbacks
           // registered by mountCompleted events.
-          inCallback();
+          done();
         }
       });
     });
@@ -160,7 +167,7 @@
    * @private
    */
   onMountCompleted_(event) {
-    this.mountQueue_.run(async (callback) => {
+    this.mountQueue_.run(async (done) => {
       try {
         switch (event.eventType) {
           case 'mount':
@@ -212,7 +219,7 @@
             break;
         }
       } finally {
-        callback();
+        done();
       }
     });
   }
diff --git a/ui/file_manager/file_manager/foreground/js/column_visibility_controller.js b/ui/file_manager/file_manager/foreground/js/column_visibility_controller.js
index 51349c82..dfe01e96 100644
--- a/ui/file_manager/file_manager/foreground/js/column_visibility_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/column_visibility_controller.js
@@ -5,41 +5,43 @@
 /**
  * A class that controls the visibility of the import status in the main table
  * UI.
- * @param {!FileManagerUI} ui
- * @param {!DirectoryModel} directoryModel
- * @param {!VolumeManager} volumeManager
- * @constructor
- * @struct
  */
-function ColumnVisibilityController(ui, directoryModel, volumeManager) {
-  /** @private {!DirectoryModel} */
-  this.directoryModel_ = directoryModel;
+class ColumnVisibilityController {
+  /**
+   * @param {!FileManagerUI} ui
+   * @param {!DirectoryModel} directoryModel
+   * @param {!VolumeManager} volumeManager
+   */
+  constructor(ui, directoryModel, volumeManager) {
+    /** @private @const {!DirectoryModel} */
+    this.directoryModel_ = directoryModel;
 
-  /** @private {!VolumeManager} */
-  this.volumeManager_ = volumeManager;
+    /** @private @const {!VolumeManager} */
+    this.volumeManager_ = volumeManager;
 
-  /** @private {!FileManagerUI} */
-  this.ui_ = ui;
+    /** @private @const {!FileManagerUI} */
+    this.ui_ = ui;
 
-  // Register event listener.
-  directoryModel.addEventListener(
-      'directory-changed', this.onDirectoryChanged_.bind(this));
+    // Register event listener.
+    directoryModel.addEventListener(
+        'directory-changed', this.onDirectoryChanged_.bind(this));
+  }
+
+  /**
+   * @param {!Event} event
+   * @private
+   */
+  onDirectoryChanged_(event) {
+    // Enable the status column in import-eligible locations.
+    //
+    // TODO(kenobi): Once import status is exposed as part of the metadata
+    // system, remove this and have the underlying UI determine its own status
+    // using metadata.
+    const isImportEligible =
+        importer.isBeneathMediaDir(event.newDirEntry, this.volumeManager_) &&
+        !!this.volumeManager_.getCurrentProfileVolumeInfo(
+            VolumeManagerCommon.VolumeType.DRIVE);
+    this.ui_.listContainer.table.setImportStatusVisible(isImportEligible);
+    this.ui_.listContainer.grid.setImportStatusVisible(isImportEligible);
+  }
 }
-
-/**
- * @param {!Event} event
- * @private
- */
-ColumnVisibilityController.prototype.onDirectoryChanged_ = function(event) {
-  // Enable the status column in import-eligible locations.
-  //
-  // TODO(kenobi): Once import status is exposed as part of the metadata system,
-  // remove this and have the underlying UI determine its own status using
-  // metadata.
-  const isImportEligible =
-      importer.isBeneathMediaDir(event.newDirEntry, this.volumeManager_) &&
-      !!this.volumeManager_.getCurrentProfileVolumeInfo(
-          VolumeManagerCommon.VolumeType.DRIVE);
-  this.ui_.listContainer.table.setImportStatusVisible(isImportEligible);
-  this.ui_.listContainer.grid.setImportStatusVisible(isImportEligible);
-};
diff --git a/ui/file_manager/file_manager/foreground/js/scan_controller.js b/ui/file_manager/file_manager/foreground/js/scan_controller.js
index 87e157f1..d082676 100644
--- a/ui/file_manager/file_manager/foreground/js/scan_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/scan_controller.js
@@ -4,202 +4,180 @@
 
 /**
  * Handler for scan related events of DirectoryModel.
- *
- * @param {!DirectoryModel} directoryModel
- * @param {!ListContainer} listContainer
- * @param {!SpinnerController} spinnerController
- * @param {!CommandHandler} commandHandler
- * @param {!FileSelectionHandler} selectionHandler
- * @constructor
- * @struct
  */
-function ScanController(
-    directoryModel, listContainer, spinnerController, commandHandler,
-    selectionHandler) {
+class ScanController {
   /**
-   * @type {!DirectoryModel}
-   * @const
-   * @private
+   * @param {!DirectoryModel} directoryModel
+   * @param {!ListContainer} listContainer
+   * @param {!SpinnerController} spinnerController
+   * @param {!CommandHandler} commandHandler
+   * @param {!FileSelectionHandler} selectionHandler
    */
-  this.directoryModel_ = directoryModel;
+  constructor(
+      directoryModel, listContainer, spinnerController, commandHandler,
+      selectionHandler) {
+    /** @private @const {!DirectoryModel} */
+    this.directoryModel_ = directoryModel;
+
+    /** @private @const {!ListContainer} */
+    this.listContainer_ = listContainer;
+
+    /** @private @const {!SpinnerController} */
+    this.spinnerController_ = spinnerController;
+
+    /** @private @const {!CommandHandler} */
+    this.commandHandler_ = commandHandler;
+
+    /** @private @const {!FileSelectionHandler} */
+    this.selectionHandler_ = selectionHandler;
+
+    /**
+     * Whether a scan is in progress.
+     * @private {boolean}
+     */
+    this.scanInProgress_ = false;
+
+    /**
+     * Timer ID to delay UI refresh after a scan is updated.
+     * @private {number}
+     */
+    this.scanUpdatedTimer_ = 0;
+
+    /**
+     * @private {?function()}
+     */
+    this.spinnerHideCallback_ = null;
+
+    this.directoryModel_.addEventListener(
+        'scan-started', this.onScanStarted_.bind(this));
+    this.directoryModel_.addEventListener(
+        'scan-completed', this.onScanCompleted_.bind(this));
+    this.directoryModel_.addEventListener(
+        'scan-failed', this.onScanCancelled_.bind(this));
+    this.directoryModel_.addEventListener(
+        'scan-cancelled', this.onScanCancelled_.bind(this));
+    this.directoryModel_.addEventListener(
+        'scan-updated', this.onScanUpdated_.bind(this));
+    this.directoryModel_.addEventListener(
+        'rescan-completed', this.onRescanCompleted_.bind(this));
+  }
 
   /**
-   * @type {!ListContainer}
-   * @const
    * @private
    */
-  this.listContainer_ = listContainer;
+  onScanStarted_() {
+    if (this.scanInProgress_) {
+      this.listContainer_.endBatchUpdates();
+    }
+
+    this.listContainer_.startBatchUpdates();
+    this.scanInProgress_ = true;
+
+    if (this.scanUpdatedTimer_) {
+      clearTimeout(this.scanUpdatedTimer_);
+      this.scanUpdatedTimer_ = 0;
+    }
+
+    this.hideSpinner_();
+    this.spinnerHideCallback_ = this.spinnerController_.showWithDelay(
+        500, this.onSpinnerShown_.bind(this));
+  }
 
   /**
-   * @type {!SpinnerController}
-   * @const
    * @private
    */
-  this.spinnerController_ = spinnerController;
+  onScanCompleted_() {
+    if (!this.scanInProgress_) {
+      console.error('Scan-completed event received. But scan is not started.');
+      return;
+    }
 
-  /**
-   * @type {!CommandHandler}
-   * @const
-   * @private
-   */
-  this.commandHandler_ = commandHandler;
+    this.hideSpinner_();
 
-  /**
-   * @type {!FileSelectionHandler}
-   * @const
-   * @private
-   */
-  this.selectionHandler_ = selectionHandler;
+    if (this.scanUpdatedTimer_) {
+      clearTimeout(this.scanUpdatedTimer_);
+      this.scanUpdatedTimer_ = 0;
+    }
 
-  /**
-   * Whether a scan is in progress.
-   * @type {boolean}
-   * @private
-   */
-  this.scanInProgress_ = false;
-
-  /**
-   * Timer ID to delay UI refresh after a scan is updated.
-   * @type {number}
-   * @private
-   */
-  this.scanUpdatedTimer_ = 0;
-
-  /**
-   * @type {?function()}
-   * @private
-   */
-  this.spinnerHideCallback_ = null;
-
-  this.directoryModel_.addEventListener(
-      'scan-started', this.onScanStarted_.bind(this));
-  this.directoryModel_.addEventListener(
-      'scan-completed', this.onScanCompleted_.bind(this));
-  this.directoryModel_.addEventListener(
-      'scan-failed', this.onScanCancelled_.bind(this));
-  this.directoryModel_.addEventListener(
-      'scan-cancelled', this.onScanCancelled_.bind(this));
-  this.directoryModel_.addEventListener(
-      'scan-updated', this.onScanUpdated_.bind(this));
-  this.directoryModel_.addEventListener(
-      'rescan-completed', this.onRescanCompleted_.bind(this));
-}
-
-/**
- * @private
- */
-ScanController.prototype.onScanStarted_ = function() {
-  if (this.scanInProgress_) {
+    this.scanInProgress_ = false;
     this.listContainer_.endBatchUpdates();
   }
 
-  this.listContainer_.startBatchUpdates();
-  this.scanInProgress_ = true;
+  /**
+   * @private
+   */
+  onScanUpdated_() {
+    if (!this.scanInProgress_) {
+      console.error('Scan-updated event received. But scan is not started.');
+      return;
+    }
 
-  if (this.scanUpdatedTimer_) {
-    clearTimeout(this.scanUpdatedTimer_);
-    this.scanUpdatedTimer_ = 0;
+    if (this.scanUpdatedTimer_) {
+      return;
+    }
+
+    // Show contents incrementally by finishing batch updated, but only after
+    // 200ms elapsed, to avoid flickering when it is not necessary.
+    this.scanUpdatedTimer_ = setTimeout(() => {
+      this.hideSpinner_();
+
+      // Update the UI.
+      if (this.scanInProgress_) {
+        this.listContainer_.endBatchUpdates();
+        this.listContainer_.startBatchUpdates();
+      }
+      this.scanUpdatedTimer_ = 0;
+    }, 200);
   }
 
-  this.hideSpinner_();
-  this.spinnerHideCallback_ = this.spinnerController_.showWithDelay(
-      500, this.onSpinnerShown_.bind(this));
-};
+  /**
+   * @private
+   */
+  onScanCancelled_() {
+    if (!this.scanInProgress_) {
+      console.error('Scan-cancelled event received. But scan is not started.');
+      return;
+    }
 
-/**
- * @private
- */
-ScanController.prototype.onScanCompleted_ = function() {
-  if (!this.scanInProgress_) {
-    console.error('Scan-completed event received. But scan is not started.');
-    return;
-  }
-
-  this.hideSpinner_();
-
-  if (this.scanUpdatedTimer_) {
-    clearTimeout(this.scanUpdatedTimer_);
-    this.scanUpdatedTimer_ = 0;
-  }
-
-  this.scanInProgress_ = false;
-  this.listContainer_.endBatchUpdates();
-};
-
-/**
- * @private
- */
-ScanController.prototype.onScanUpdated_ = function() {
-  if (!this.scanInProgress_) {
-    console.error('Scan-updated event received. But scan is not started.');
-    return;
-  }
-
-  if (this.scanUpdatedTimer_) {
-    return;
-  }
-
-  // Show contents incrementally by finishing batch updated, but only after
-  // 200ms elapsed, to avoid flickering when it is not necessary.
-  this.scanUpdatedTimer_ = setTimeout(() => {
     this.hideSpinner_();
 
-    // Update the UI.
+    if (this.scanUpdatedTimer_) {
+      clearTimeout(this.scanUpdatedTimer_);
+      this.scanUpdatedTimer_ = 0;
+    }
+
+    this.scanInProgress_ = false;
+    this.listContainer_.endBatchUpdates();
+  }
+
+  /**
+   * Handle the 'rescan-completed' from the DirectoryModel.
+   * @private
+   */
+  onRescanCompleted_() {
+    this.selectionHandler_.onFileSelectionChanged();
+  }
+
+  /**
+   * When a spinner is shown, updates the UI to remove items in the previous
+   * directory.
+   * @private
+   */
+  onSpinnerShown_() {
     if (this.scanInProgress_) {
       this.listContainer_.endBatchUpdates();
       this.listContainer_.startBatchUpdates();
     }
-    this.scanUpdatedTimer_ = 0;
-  }, 200);
-};
-
-/**
- * @private
- */
-ScanController.prototype.onScanCancelled_ = function() {
-  if (!this.scanInProgress_) {
-    console.error('Scan-cancelled event received. But scan is not started.');
-    return;
   }
 
-  this.hideSpinner_();
-
-  if (this.scanUpdatedTimer_) {
-    clearTimeout(this.scanUpdatedTimer_);
-    this.scanUpdatedTimer_ = 0;
+  /**
+   * Hides the spinner if it's shown or scheduled to be shown.
+   * @private
+   */
+  hideSpinner_() {
+    if (this.spinnerHideCallback_) {
+      this.spinnerHideCallback_();
+      this.spinnerHideCallback_ = null;
+    }
   }
-
-  this.scanInProgress_ = false;
-  this.listContainer_.endBatchUpdates();
-};
-
-/**
- * Handle the 'rescan-completed' from the DirectoryModel.
- * @private
- */
-ScanController.prototype.onRescanCompleted_ = function() {
-  this.selectionHandler_.onFileSelectionChanged();
-};
-
-/**
- * When a spinner is shown, updates the UI to remove items in the previous
- * directory.
- * @private
- */
-ScanController.prototype.onSpinnerShown_ = function() {
-  if (this.scanInProgress_) {
-    this.listContainer_.endBatchUpdates();
-    this.listContainer_.startBatchUpdates();
-  }
-};
-
-/**
- * Hides the spinner if it's shown or scheduled to be shown.
- * @private
- */
-ScanController.prototype.hideSpinner_ = function() {
-  if (this.spinnerHideCallback_) {
-    this.spinnerHideCallback_();
-    this.spinnerHideCallback_ = null;
-  }
-};
+}
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 1be8d8d..ce909e2 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -957,7 +957,8 @@
   'arguments':
       'GLuint pipeline, GLenum pname, GLint* params', },
 { 'return_type': 'GLuint',
-  'names': ['glGetProgramResourceIndex'],
+  'versions': [{'name': 'glGetProgramResourceIndex',
+                'extensions': ['GL_ARB_program_interface_query']}],
   'arguments':
       'GLuint program, GLenum programInterface, const GLchar* name', },
 { 'return_type': 'void',
diff --git a/ui/gl/gl_bindings_autogen_gl.cc b/ui/gl/gl_bindings_autogen_gl.cc
index beeedfd..5222d8c 100644
--- a/ui/gl/gl_bindings_autogen_gl.cc
+++ b/ui/gl/gl_bindings_autogen_gl.cc
@@ -1449,7 +1449,8 @@
         GetGLProcAddress("glGetProgramPipelineiv"));
   }
 
-  if (ver->IsAtLeastGL(4u, 3u) || ver->IsAtLeastGLES(3u, 1u)) {
+  if (ver->IsAtLeastGL(4u, 3u) || ver->IsAtLeastGLES(3u, 1u) ||
+      ext.b_GL_ARB_program_interface_query) {
     fn.glGetProgramResourceIndexFn =
         reinterpret_cast<glGetProgramResourceIndexProc>(
             GetGLProcAddress("glGetProgramResourceIndex"));
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb
index 49ec56e..51452b7 100644
--- a/ui/strings/translations/ui_strings_ar.xtb
+++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -71,7 +71,7 @@
 <translation id="3234408098842461169">مفتاح سهم  إلى أسفل</translation>
 <translation id="3291688615589870984">{DAYS,plural, =1{يوم واحد}zero{# من الأيام}two{يومان (#)}few{# أيام}many{# يومًا}other{# من الأيام}}</translation>
 <translation id="335581015389089642">الحديث</translation>
-<translation id="3443810440409579745">علامة التبويب المُستلمة</translation>
+<translation id="3443810440409579745">تم استلام علامة تبويب.</translation>
 <translation id="3479552764303398839">ليس الآن</translation>
 <translation id="348799646910989694">إخفاء الرف تلقائيًا</translation>
 <translation id="3600566671520689681">{DAYS,plural, =1{يتبقى يوم واحد}zero{يتبقى عدد # من الأيام}two{يتبقى يومان (#)}few{يتبقى # أيام}many{يتبقى # يومًا}other{يتبقى # من الأيام}}</translation>
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc
index d8c1c42..06896d0 100644
--- a/ui/views/controls/button/md_text_button.cc
+++ b/ui/views/controls/button/md_text_button.cc
@@ -30,25 +30,25 @@
 std::unique_ptr<LabelButton> MdTextButton::CreateSecondaryUiButton(
     ButtonListener* listener,
     const base::string16& text) {
-  return base::WrapUnique(
-      MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD));
+  return MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
 }
 
 // static
 std::unique_ptr<LabelButton> MdTextButton::CreateSecondaryUiBlueButton(
     ButtonListener* listener,
     const base::string16& text) {
-  auto* md_button =
+  auto md_button =
       MdTextButton::Create(listener, text, style::CONTEXT_BUTTON_MD);
   md_button->SetProminent(true);
-  return base::WrapUnique(md_button);
+  return md_button;
 }
 
 // static
-MdTextButton* MdTextButton::Create(ButtonListener* listener,
-                                   const base::string16& text,
-                                   int button_context) {
-  MdTextButton* button = new MdTextButton(listener, button_context);
+std::unique_ptr<MdTextButton> MdTextButton::Create(ButtonListener* listener,
+                                                   const base::string16& text,
+                                                   int button_context) {
+  auto button = base::WrapUnique<MdTextButton>(
+      new MdTextButton(listener, button_context));
   button->SetText(text);
   button->SetFocusForPlatform();
 
diff --git a/ui/views/controls/button/md_text_button.h b/ui/views/controls/button/md_text_button.h
index 55755fbf..f44c70e 100644
--- a/ui/views/controls/button/md_text_button.h
+++ b/ui/views/controls/button/md_text_button.h
@@ -27,9 +27,10 @@
   static std::unique_ptr<LabelButton> CreateSecondaryUiBlueButton(
       ButtonListener* listener,
       const base::string16& text);
-  static MdTextButton* Create(ButtonListener* listener,
-                              const base::string16& text,
-                              int button_context = style::CONTEXT_BUTTON_MD);
+  static std::unique_ptr<MdTextButton> Create(
+      ButtonListener* listener,
+      const base::string16& text,
+      int button_context = style::CONTEXT_BUTTON_MD);
 
   ~MdTextButton() override;
 
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc
index d2d0a9f..6e97d8e2 100644
--- a/ui/views/controls/native/native_view_host_aura.cc
+++ b/ui/views/controls/native/native_view_host_aura.cc
@@ -11,7 +11,6 @@
 #include "build/build_config.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/focus_client.h"
-#include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
 #include "ui/aura/window_occlusion_tracker.h"
diff --git a/ui/views/examples/animated_image_view_example.cc b/ui/views/examples/animated_image_view_example.cc
index 09bf0eea..98959097 100644
--- a/ui/views/examples/animated_image_view_example.cc
+++ b/ui/views/examples/animated_image_view_example.cc
@@ -38,35 +38,31 @@
                          public TextfieldController,
                          public ButtonListener {
  public:
-  AnimationGallery()
-      : animated_image_view_(new AnimatedImageView()),
-        image_view_container_(new views::View()),
-        size_input_(new Textfield()),
-        file_chooser_(new Textfield()),
-        file_go_button_(
-            MdTextButton::Create(this, base::ASCIIToUTF16("Render"))) {
-    AddChildView(size_input_);
-
-    image_view_container_->AddChildView(animated_image_view_);
-    image_view_container_->SetLayoutManager(std::make_unique<FillLayout>());
+  AnimationGallery() {
+    auto image_view_container = std::make_unique<views::View>();
+    animated_image_view_ = image_view_container->AddChildView(
+        std::make_unique<AnimatedImageView>());
+    image_view_container->SetLayoutManager(std::make_unique<FillLayout>());
     animated_image_view_->SetBorder(
         CreateSolidSidedBorder(1, 1, 1, 1, SK_ColorBLACK));
-    AddChildView(image_view_container_);
+    image_view_container_ = AddChildView(std::move(image_view_container));
 
     BoxLayout* box = SetLayoutManager(
         std::make_unique<BoxLayout>(BoxLayout::kVertical, gfx::Insets(10), 10));
     box->SetFlexForView(image_view_container_, 1);
 
-    file_chooser_->set_placeholder_text(
+    auto file_chooser = std::make_unique<Textfield>();
+    file_chooser->set_placeholder_text(
         base::ASCIIToUTF16("Enter path to lottie JSON file"));
-    View* file_container = new View();
+    auto file_container = std::make_unique<View>();
     BoxLayout* file_box =
         file_container->SetLayoutManager(std::make_unique<BoxLayout>(
             BoxLayout::kHorizontal, gfx::Insets(10), 10));
-    file_container->AddChildView(file_chooser_);
-    file_container->AddChildView(file_go_button_);
+    file_chooser_ = file_container->AddChildView(std::move(file_chooser));
+    file_go_button_ = file_container->AddChildView(
+        MdTextButton::Create(this, base::ASCIIToUTF16("Render")));
     file_box->SetFlexForView(file_chooser_, 1);
-    AddChildView(file_container);
+    AddChildView(std::move(file_container));
 
     size_input_->set_placeholder_text(
         base::ASCIIToUTF16("Size in dip (Empty for default)"));
@@ -118,7 +114,7 @@
 
   AnimatedImageView* animated_image_view_;
   View* image_view_container_;
-  Textfield* size_input_;
+  Textfield* size_input_ = AddChildView(std::make_unique<Textfield>());
   Textfield* file_chooser_;
   Button* file_go_button_;
 
@@ -136,7 +132,7 @@
 
 void AnimatedImageViewExample::CreateExampleView(View* container) {
   container->SetLayoutManager(std::make_unique<FillLayout>());
-  container->AddChildView(new AnimationGallery());
+  container->AddChildView(std::make_unique<AnimationGallery>());
 }
 
 }  // namespace examples
diff --git a/ui/views/examples/button_example.cc b/ui/views/examples/button_example.cc
index 515903e4d..154fafc 100644
--- a/ui/views/examples/button_example.cc
+++ b/ui/views/examples/button_example.cc
@@ -42,40 +42,42 @@
   layout->set_cross_axis_alignment(BoxLayout::CrossAxisAlignment::kCenter);
   container->SetLayoutManager(std::move(layout));
 
-  label_button_ = new LabelButton(this, ASCIIToUTF16(kLabelButton));
-  label_button_->SetFocusForPlatform();
-  label_button_->set_request_focus_on_press(true);
-  container->AddChildView(label_button_);
+  auto label_button =
+      std::make_unique<LabelButton>(this, ASCIIToUTF16(kLabelButton));
+  label_button->SetFocusForPlatform();
+  label_button->set_request_focus_on_press(true);
+  label_button_ = container->AddChildView(std::move(label_button));
 
-  styled_button_ = new LabelButton(this, ASCIIToUTF16("Styled Button"));
-  styled_button_->SetStyleDeprecated(Button::STYLE_BUTTON);
-  container->AddChildView(styled_button_);
+  auto styled_button =
+      std::make_unique<LabelButton>(this, ASCIIToUTF16("Styled Button"));
+  styled_button->SetStyleDeprecated(Button::STYLE_BUTTON);
+  styled_button_ = container->AddChildView(std::move(styled_button));
 
-  disabled_button_ = new LabelButton(this, ASCIIToUTF16("Disabled Button"));
-  disabled_button_->SetStyleDeprecated(Button::STYLE_BUTTON);
-  disabled_button_->SetState(Button::STATE_DISABLED);
-  container->AddChildView(disabled_button_);
+  auto disabled_button =
+      std::make_unique<LabelButton>(this, ASCIIToUTF16("Disabled Button"));
+  disabled_button->SetStyleDeprecated(Button::STYLE_BUTTON);
+  disabled_button->SetState(Button::STATE_DISABLED);
+  disabled_button_ = container->AddChildView(std::move(disabled_button));
 
-  md_button_ =
-      MdTextButton::Create(this, base::ASCIIToUTF16("Material design"));
-  container->AddChildView(md_button_);
+  md_button_ = container->AddChildView(
+      MdTextButton::Create(this, base::ASCIIToUTF16("Material design")));
 
-  md_default_button_ =
+  auto md_default_button =
       MdTextButton::Create(this, base::ASCIIToUTF16("Default"));
-  md_default_button_->SetIsDefault(true);
-  container->AddChildView(md_default_button_);
+  md_default_button->SetIsDefault(true);
+  md_default_button_ = container->AddChildView(std::move(md_default_button));
 
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  image_button_ = new ImageButton(this);
-  image_button_->SetFocusForPlatform();
-  image_button_->set_request_focus_on_press(true);
-  image_button_->SetImage(ImageButton::STATE_NORMAL,
-                          rb.GetImageNamed(IDR_CLOSE).ToImageSkia());
-  image_button_->SetImage(ImageButton::STATE_HOVERED,
-                          rb.GetImageNamed(IDR_CLOSE_H).ToImageSkia());
-  image_button_->SetImage(ImageButton::STATE_PRESSED,
-                          rb.GetImageNamed(IDR_CLOSE_P).ToImageSkia());
-  container->AddChildView(image_button_);
+  auto image_button = std::make_unique<ImageButton>(this);
+  image_button->SetFocusForPlatform();
+  image_button->set_request_focus_on_press(true);
+  image_button->SetImage(ImageButton::STATE_NORMAL,
+                         rb.GetImageNamed(IDR_CLOSE).ToImageSkia());
+  image_button->SetImage(ImageButton::STATE_HOVERED,
+                         rb.GetImageNamed(IDR_CLOSE_H).ToImageSkia());
+  image_button->SetImage(ImageButton::STATE_PRESSED,
+                         rb.GetImageNamed(IDR_CLOSE_P).ToImageSkia());
+  image_button_ = container->AddChildView(std::move(image_button));
 }
 
 void ButtonExample::LabelButtonPressed(LabelButton* label_button,
diff --git a/ui/views/examples/button_sticker_sheet.cc b/ui/views/examples/button_sticker_sheet.cc
index 6bc2a71..a76791e 100644
--- a/ui/views/examples/button_sticker_sheet.cc
+++ b/ui/views/examples/button_sticker_sheet.cc
@@ -72,11 +72,11 @@
                         ButtonListener* listener,
                         Button::ButtonState state) {
   const base::string16 button_text = base::ASCIIToUTF16("Button");
-  *primary = MdTextButton::Create(listener, button_text);
+  *primary = MdTextButton::Create(listener, button_text).release();
   (*primary)->SetProminent(true);
   (*primary)->SetState(state);
 
-  *secondary = MdTextButton::Create(listener, button_text);
+  *secondary = MdTextButton::Create(listener, button_text).release();
   (*secondary)->SetState(state);
 }
 
diff --git a/ui/views/examples/progress_bar_example.cc b/ui/views/examples/progress_bar_example.cc
index 27d48ba..1f640e2 100644
--- a/ui/views/examples/progress_bar_example.cc
+++ b/ui/views/examples/progress_bar_example.cc
@@ -44,13 +44,12 @@
                         GridLayout::USE_PREF, 0, 0);
 
   layout->StartRow(0, 0);
-  minus_button_ = MdTextButton::Create(this, base::ASCIIToUTF16("-"));
+  minus_button_ = MdTextButton::Create(this, base::ASCIIToUTF16("-")).release();
   layout->AddView(minus_button_);
   progress_bar_ = new ProgressBar();
   layout->AddView(progress_bar_);
-  plus_button_ = MdTextButton::Create(this, base::ASCIIToUTF16("+"));
+  plus_button_ = MdTextButton::Create(this, base::ASCIIToUTF16("+")).release();
   layout->AddView(plus_button_);
-
   layout->StartRowWithPadding(0, 0, 0, 10);
   layout->AddView(new Label(base::ASCIIToUTF16("Infinite loader:")));
   ProgressBar* infinite_bar = new ProgressBar();
diff --git a/ui/views/examples/vector_example.cc b/ui/views/examples/vector_example.cc
index 759e3b85..bae6772 100644
--- a/ui/views/examples/vector_example.cc
+++ b/ui/views/examples/vector_example.cc
@@ -32,41 +32,38 @@
                           public TextfieldController,
                           public ButtonListener {
  public:
-  VectorIconGallery()
-      : image_view_(new ImageView()),
-        image_view_container_(new views::View()),
-        size_input_(new Textfield()),
-        color_input_(new Textfield()),
-        file_chooser_(new Textfield()),
-        file_go_button_(
-            MdTextButton::Create(this, base::ASCIIToUTF16("Render"))) {
-    AddChildView(size_input_);
-    AddChildView(color_input_);
+  VectorIconGallery() {
+    size_input_ = AddChildView(std::make_unique<Textfield>());
+    color_input_ = AddChildView(std::make_unique<Textfield>());
 
-    image_view_container_->AddChildView(image_view_);
+    auto image_view_container = std::make_unique<views::View>();
+    image_view_ =
+        image_view_container->AddChildView(std::make_unique<ImageView>());
     auto image_layout = std::make_unique<BoxLayout>(BoxLayout::kHorizontal);
     image_layout->set_cross_axis_alignment(
         BoxLayout::CrossAxisAlignment::kCenter);
     image_layout->set_main_axis_alignment(
         BoxLayout::MainAxisAlignment::kCenter);
-    image_view_container_->SetLayoutManager(std::move(image_layout));
+    image_view_container->SetLayoutManager(std::move(image_layout));
     image_view_->SetBorder(CreateSolidSidedBorder(1, 1, 1, 1, SK_ColorBLACK));
-    AddChildView(image_view_container_);
+    image_view_container_ = AddChildView(std::move(image_view_container));
 
     BoxLayout* box = SetLayoutManager(
         std::make_unique<BoxLayout>(BoxLayout::kVertical, gfx::Insets(10), 10));
     box->SetFlexForView(image_view_container_, 1);
 
-    file_chooser_->set_placeholder_text(
+    auto file_chooser = std::make_unique<Textfield>();
+    file_chooser->set_placeholder_text(
         base::ASCIIToUTF16("Enter a file to read"));
-    View* file_container = new View();
+    auto file_container = std::make_unique<View>();
     BoxLayout* file_box =
         file_container->SetLayoutManager(std::make_unique<BoxLayout>(
             BoxLayout::kHorizontal, gfx::Insets(10), 10));
-    file_container->AddChildView(file_chooser_);
-    file_container->AddChildView(file_go_button_);
+    file_chooser_ = file_container->AddChildView(std::move(file_chooser));
+    file_go_button_ = file_container->AddChildView(
+        MdTextButton::Create(this, base::ASCIIToUTF16("Render")));
     file_box->SetFlexForView(file_chooser_, 1);
-    AddChildView(file_container);
+    AddChildView(std::move(file_container));
 
     size_input_->set_placeholder_text(base::ASCIIToUTF16("Size in dip"));
     size_input_->set_controller(this);
diff --git a/ui/views/focus/focus_traversal_unittest.cc b/ui/views/focus/focus_traversal_unittest.cc
index ed118ea..37d5e7cf4 100644
--- a/ui/views/focus/focus_traversal_unittest.cc
+++ b/ui/views/focus/focus_traversal_unittest.cc
@@ -372,10 +372,10 @@
 
   y += label_height + gap_between_labels;
 
-  LabelButton* button = MdTextButton::Create(nullptr, ASCIIToUTF16("Click me"));
+  auto button = MdTextButton::Create(nullptr, ASCIIToUTF16("Click me"));
   button->SetBounds(label_x, y + 10, 80, 30);
   button->SetID(FRUIT_BUTTON_ID);
-  left_container_->AddChildView(button);
+  left_container_->AddChildView(std::move(button));
   y += 40;
 
   cb =  new Checkbox(ASCIIToUTF16("This is another check box"));
@@ -471,19 +471,18 @@
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("OK"));
   button->SetID(OK_BUTTON_ID);
   button->SetIsDefault(true);
-
-  GetContentsView()->AddChildView(button);
   button->SetBounds(150, y, width, 30);
+  GetContentsView()->AddChildView(std::move(button));
 
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("Cancel"));
   button->SetID(CANCEL_BUTTON_ID);
-  GetContentsView()->AddChildView(button);
   button->SetBounds(220, y, width, 30);
+  GetContentsView()->AddChildView(std::move(button));
 
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("Help"));
   button->SetID(HELP_BUTTON_ID);
-  GetContentsView()->AddChildView(button);
   button->SetBounds(290, y, width, 30);
+  GetContentsView()->AddChildView(std::move(button));
 
   y += 40;
 
@@ -534,9 +533,9 @@
   text_field->SetID(SEARCH_TEXTFIELD_ID);
 
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("Search"));
-  contents->AddChildView(button);
   button->SetBounds(112, 5, 60, 30);
   button->SetID(SEARCH_BUTTON_ID);
+  contents->AddChildView(std::move(button));
 
   link = new Link(ASCIIToUTF16("Help"));
   link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
@@ -557,13 +556,13 @@
   contents->SetBackground(CreateSolidBackground(SK_ColorBLUE));
   contents->SetID(THUMBNAIL_CONTAINER_ID);
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("Star"));
-  contents->AddChildView(button);
   button->SetBounds(5, 5, 50, 30);
   button->SetID(THUMBNAIL_STAR_ID);
+  contents->AddChildView(std::move(button));
   button = MdTextButton::Create(nullptr, ASCIIToUTF16("SuperStar"));
-  contents->AddChildView(button);
   button->SetBounds(60, 5, 100, 30);
   button->SetID(THUMBNAIL_SUPER_STAR_ID);
+  contents->AddChildView(std::move(button));
 
   GetContentsView()->AddChildView(contents);
   contents->SetBounds(250, y, 200, 50);
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
index 8cce94f..78c43b6 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
@@ -31,12 +31,14 @@
         padding: 0 32px;
       }
     </style>
-    <iron-pages attr-for-selected="is"
+    <iron-pages id="ironPages"
+        attr-for-selected="is"
         selected="[[visiblePageName]]"
         selected-item="{{visiblePage_}}">
       <template is="dom-if" if="[[shouldPasswordPageBeIncluded_(delegate)]]"
           restamp>
-        <password-page auth-token="{{authToken_}}"
+        <password-page class="ui-page"
+            auth-token="{{authToken_}}"
             forward-button-disabled="{{passwordPageForwardButtonDisabled_}}"
             password-field-valid="{{passwordFieldValid}}"
             on-user-submitted-password="onUserSubmittedPassword_">
@@ -44,17 +46,18 @@
       </template>
       <template is="dom-if"
           if="[[shouldSetupSucceededPageBeIncluded_(delegate)]]" restamp>
-        <setup-succeeded-page></setup-succeeded-page>
+        <setup-succeeded-page class="ui-page"></setup-succeeded-page>
       </template>
-      <start-setup-page devices="[[devices_]]"
+      <start-setup-page class="ui-page"
+          devices="[[devices_]]"
           selected-device-id="{{selectedDeviceId_}}"
           delegate="[[delegate]]">
       </start-setup-page>
     </iron-pages>
     <div class="flex"></div>
-    <button-bar forward-button-hidden="[[!forwardButtonText]]"
-        backward-button-hidden="[[!backwardButtonText]]"
-        cancel-button-hidden="[[!cancelButtonText]]">
+    <button-bar forward-button-hidden="[[!forwardButtonTextId]]"
+        backward-button-hidden="[[!backwardButtonTextId]]"
+        cancel-button-hidden="[[!cancelButtonTextId]]">
       <slot name="backward-button" slot="backward-button"></slot>
       <slot name="cancel-button" slot="cancel-button"></slot>
       <slot name="forward-button" slot="forward-button"></slot>
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
index e97849f4..8545122 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
@@ -27,12 +27,12 @@
       delegate: Object,
 
       /**
-       * Text to be shown on the forward navigation button.
+       * ID of loadTimeData string to be shown on the forward navigation button.
        * @type {string|undefined}
        */
-      forwardButtonText: {
+      forwardButtonTextId: {
         type: String,
-        computed: 'getForwardButtonText_(visiblePage_)',
+        computed: 'getForwardButtonTextId_(visiblePage_)',
         notify: true,
       },
 
@@ -45,22 +45,23 @@
       },
 
       /**
-       * Text to be shown on the cancel button.
+       * ID of loadTimeData string to be shown on the cancel button.
        * @type {string|undefined}
        */
-      cancelButtonText: {
+      cancelButtonTextId: {
         type: String,
-        computed: 'getCancelButtonText_(visiblePage_)',
+        computed: 'getCancelButtonTextId_(visiblePage_)',
         notify: true,
       },
 
       /**
-       * Text to be shown on the backward navigation button.
+       * ID of loadTimeData string to be shown on the backward navigation
+       * button.
        * @type {string|undefined}
        */
-      backwardButtonText: {
+      backwardButtonTextId: {
         type: String,
-        computed: 'getBackwardButtonText_(visiblePage_)',
+        computed: 'getBackwardButtonTextId_(visiblePage_)',
         notify: true,
       },
 
@@ -142,6 +143,11 @@
           this.initializeSetupFlow.bind(this));
     },
 
+    updateLocalizedContent: function() {
+      this.$.ironPages.querySelectorAll('.ui-page')
+          .forEach(page => page.i18nUpdateLocale());
+    },
+
     initializeSetupFlow: function() {
       this.mojoInterfaceProvider_.getMojoServiceProxy()
           .getEligibleHostDevices()
@@ -240,15 +246,16 @@
     },
 
     /**
-     * @return {string|undefined} The forward button text, which is undefined
-     *     if no button should be displayed.
+     * @return {string|undefined} The ID of loadTimeData string for the
+     *     forward button text, which is undefined if no button should be
+     *     displayed.
      * @private
      */
-    getForwardButtonText_: function() {
+    getForwardButtonTextId_: function() {
       if (!this.visiblePage_) {
         return undefined;
       }
-      return this.visiblePage_.forwardButtonText;
+      return this.visiblePage_.forwardButtonTextId;
     },
 
     /**
@@ -261,27 +268,29 @@
     },
 
     /**
-     * @return {string|undefined} The cancel button text, which is undefined
-     *     if no button should be displayed.
+     * @return {string|undefined} The ID of loadTimeData string for the
+     *     cancel button text, which is undefined if no button should be
+     *     displayed.
      * @private
      */
-    getCancelButtonText_: function() {
+    getCancelButtonTextId_: function() {
       if (!this.visiblePage_) {
         return undefined;
       }
-      return this.visiblePage_.cancelButtonText;
+      return this.visiblePage_.cancelButtonTextId;
     },
 
     /**
-     * @return {string|undefined} The backward button text, which is undefined
-     *     if no button should be displayed.
+     * @return {string|undefined} The ID of loadTimeData string for the
+     *     backward button text, which is undefined if no button should be
+     *     displayed.
      * @private
      */
-    getBackwardButtonText_: function() {
+    getBackwardButtonTextId_: function() {
       if (!this.visiblePage_) {
         return undefined;
       }
-      return this.visiblePage_.backwardButtonText;
+      return this.visiblePage_.backwardButtonTextId;
     },
 
     /**
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
index b5c52c0f..a12f238 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.html
@@ -18,7 +18,7 @@
       #profile-photo {
         border-radius: 50%;
         height: 20px;
-        margin-right: 8px;
+        margin-inline-end: 8px;
         width: 20px;
       }
 
@@ -28,16 +28,17 @@
         width: 560px;
       }
     </style>
-    <ui-page header-text="[[headerText]]" icon-name="google-g">
+    <ui-page header-text="[[i18nDynamic(locale, 'passwordPageHeader')]]"
+        icon-name="google-g">
       <div id="content-container" slot="additional-content">
         <div id="user-info-container">
           <img id="profile-photo" src="[[profilePhotoUrl_]]"></img>
           <span id="email">[[email_]]</span>
         </div>
         <cr-input id="passwordInput" type="password"
-            placeholder="[[i18n('enterPassword')]]"
+            placeholder="[[i18nDynamic(locale, 'enterPassword')]]"
             invalid="[[passwordInvalid_]]"
-            error-message="[[i18n('wrongPassword')]]"
+            error-message="[[i18nDynamic(locale, 'wrongPassword')]]"
             value="{{inputValue_}}"
             aria-disabled="false"
             on-keypress="onInputKeypress_"
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js
index 80b4f75..8f73387 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/password_page.js
@@ -41,12 +41,6 @@
       value: 'back',
     },
 
-    /** Overridden from UiPageContainerBehavior. */
-    headerId: {
-      type: String,
-      value: 'passwordPageHeader',
-    },
-
     /**
      * Authentication token; retrieved using the quickUnlockPrivate API.
      * @type {string}
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
index a899610..0606e52 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.html
@@ -23,8 +23,9 @@
         width: 416px;
       }
     </style>
-    <ui-page header-text="[[headerText]]" icon-name="google-g">
-      <span slot="message" inner-h-t-m-l="[[messageHtml]]"></span>
+    <ui-page header-text="[[i18nDynamic(locale, 'setupSucceededPageHeader')]]"
+        icon-name="google-g">
+      <span slot="message" inner-h-t-m-l="[[getMessageHtml_()]]"></span>
       <div id="page-icon-container" slot="additional-content">
         <div id="page-icon"></div>
       </div>
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
index e9c4eac..a679e6d 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/setup_succeeded_page.js
@@ -13,23 +13,9 @@
       type: String,
       value: 'done',
     },
-
-    /** Overridden from UiPageContainerBehavior. */
-    headerId: {
-      type: String,
-      value: 'setupSucceededPageHeader',
-    },
-
-    /** Overridden from UiPageContainerBehavior. */
-    messageId: {
-      type: String,
-      value: 'setupSucceededPageMessage',
-    },
   },
 
-  behaviors: [
-    UiPageContainerBehavior,
-  ],
+  behaviors: [UiPageContainerBehavior],
 
   /** @private {?multidevice_setup.BrowserProxy} */
   browserProxy_: null,
@@ -50,9 +36,17 @@
     this.fire('setup-exited');
   },
 
+  /** @private */
+  getMessageHtml_: function() {
+    const validNodeFn = (node, value) => node.tagName == 'A';
+    return this.i18nAdvanced(
+        'setupSucceededPageMessage',
+        {attrs: {'id': validNodeFn, 'href': validNodeFn}});
+  },
+
   /** @override */
   ready: function() {
-    let linkElement = this.$$('#settings-link');
+    const linkElement = this.$$('#settings-link');
     linkElement.setAttribute('href', '#');
     linkElement.addEventListener('click', () => this.onSettingsLinkClicked_());
   },
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
index a410816b..4e8c5692 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.html
@@ -5,7 +5,6 @@
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page.html">
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html">
 <link rel="import" href="chrome://resources/html/cr.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 
@@ -47,8 +46,8 @@
       #feature-details-container {
         @apply --layout-vertical;
         @apply --layout-center-justified;
-        border-left: 1px solid rgb(218, 220, 224);
-        padding-left: 24px;
+        border-inline-start: 1px solid rgb(218, 220, 224);
+        padding-inline-start: 24px;
       }
 
       #feature-details-container-header {
@@ -70,7 +69,7 @@
       }
 
       .feature-detail span {
-        margin-left: 8px;
+        margin-inline-start: 8px;
       }
 
       #footnote {
@@ -79,8 +78,11 @@
       }
     </style>
 
-    <ui-page header-text="[[headerText]]" icon-name="google-g">
-      <span slot="message" id="multidevice-summary-message" inner-h-t-m-l="[[messageHtml]]"></span>
+    <ui-page header-text="[[i18nDynamic(locale, 'startSetupPageHeader')]]"
+        icon-name="google-g">
+      <span slot="message" id="multidevice-summary-message" inner-h-t-m-l=
+          "[[i18nAdvancedDynamic_(locale, 'startSetupPageMessage')]]">
+      </span>
       <div slot="additional-content">
         <div id="selector-and-details-container">
           <div id="deviceSelectionContainer" class="flex">
@@ -107,26 +109,33 @@
           </div>
           <div id="feature-details-container" class="flex">
             <div id="feature-details-container-header">
-              [[i18n('startSetupPageFeatureListHeader')]]
+              [[i18nDynamic(locale, 'startSetupPageFeatureListHeader')]]
             </div>
             <div class="feature-detail">
               <iron-icon icon="multidevice-setup-icons-20:messages"></iron-icon>
               <span id="awm-summary-message" inner-h-t-m-l="
-                  [[i18nAdvanced('startSetupPageFeatureListAwm')]]">
+                  [[i18nAdvancedDynamic_(
+                      locale, 'startSetupPageFeatureListAwm')]]">
               </span>
             </div>
             <div class="feature-detail">
               <iron-icon icon="multidevice-setup-icons-20:downloads">
               </iron-icon>
-              <span>[[i18n('startSetupPageFeatureListInstallApps')]]</span>
+              <span>
+                [[i18nDynamic(locale, 'startSetupPageFeatureListInstallApps')]]
+              </span>
             </div>
             <div class="feature-detail">
               <iron-icon icon="multidevice-setup-icons-20:features"></iron-icon>
-              <span>[[i18n('startSetupPageFeatureListAddFeatures')]]</span>
+              <span>
+                [[i18nDynamic(locale, 'startSetupPageFeatureListAddFeatures')]]
+              </span>
             </div>
           </div>
         </div>
-        <div id="footnote">[[i18n('startSetupPageFootnote')]]</div>
+        <div id="footnote">
+          [[i18nAdvancedDynamic_(locale, 'startSetupPageFootnote')]]
+        </div>
       </div>
     </ui-page>
   </template>
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.js
index f5445d9..b85f3724 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/start_setup_page.js
@@ -18,18 +18,6 @@
       computed: 'getCancelButtonTextId_(delegate)',
     },
 
-    /** Overridden from UiPageContainerBehavior. */
-    headerId: {
-      type: String,
-      value: 'startSetupPageHeader',
-    },
-
-    /** Overridden from UiPageContainerBehavior. */
-    messageId: {
-      type: String,
-      value: 'startSetupPageMessage',
-    },
-
     /**
      * Array of objects representing all potential MultiDevice hosts.
      *
@@ -63,7 +51,6 @@
 
   behaviors: [
     UiPageContainerBehavior,
-    I18nBehavior,
     WebUIListenerBehavior,
   ],
 
@@ -79,7 +66,7 @@
     // The "Learn More" links are inside a grdp string, so we cannot actually
     // add an onclick handler directly to the html. Instead, grab the two and
     // manaully add onclick handlers.
-    let helpArticleLinks = [
+    const helpArticleLinks = [
       this.$$('#multidevice-summary-message a'),
       this.$$('#awm-summary-message a')
     ];
@@ -153,4 +140,17 @@
   onDeviceDropdownSelectionChanged_: function() {
     this.selectedDeviceId = this.$.deviceDropdown.value;
   },
+
+  /**
+   * Wrapper for i18nAdvanced for binding to location updates in OOBE.
+   * @param {string} locale The language code (e.g. en, es) for the current
+   *     display language for CrOS. As with I18nBehavior.i18nDynamic(), the
+   *     parameter is not used directly but is provided to allow HTML binding
+   *     without passing an unexpected argument to I18nBehavior.i18nAdvanced().
+   * @param {string} textId The loadTimeData ID of the string to be translated.
+   * @private
+   */
+  i18nAdvancedDynamic_: function(locale, textId) {
+    return this.i18nAdvanced(textId);
+  },
 });
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js
index cb31b51..35a578ca 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js
@@ -6,102 +6,28 @@
 const UiPageContainerBehaviorImpl = {
   properties: {
     /**
-     * ID for forward button label, which must be translated for display.
-     *
-     * Undefined if the visible page has no forward-navigation button.
-     *
+     * ID of loadTimeData string for forward button label, which must be
+     * translated for display. Undefined if the visible page has no
+     * forward-navigation button.
      * @type {string|undefined}
      */
     forwardButtonTextId: String,
 
     /**
-     * ID for cancel button label, which must be translated for display.
-     *
-     * Undefined if the visible page has no cancel button.
-     *
+     * ID of loadTimeData string for cancel button label, which must be
+     * translated for display. Undefined if the visible page has no
+     * cancel button.
      * @type {string|undefined}
      */
     cancelButtonTextId: String,
 
     /**
-     * ID for backward button label, which must be translated for display.
-     *
-     * Undefined if the visible page has no backward-navigation button.
-     *
+     * ID of loadTimeData string for backward button label, which must be
+     * translated for display. Undefined if the visible page has no
+     * backward-navigation button.
      * @type {string|undefined}
      */
     backwardButtonTextId: String,
-
-    /**
-     * ID for text of main UI Page heading.
-     *
-     * @type {string}
-     */
-    headerId: String,
-
-    /**
-     * ID for text of main UI Page message body.
-     *
-     * @type {string}
-     */
-    messageId: String,
-
-    /**
-     * Translated text to display on the forward-naviation button.
-     *
-     * Undefined if the visible page has no forward-navigation button.
-     *
-     * @type {string|undefined}
-     */
-    forwardButtonText: {
-      type: String,
-      computed: 'computeLocalizedText_(forwardButtonTextId)',
-    },
-
-    /**
-     * Translated text to display on the cancel button.
-     *
-     * Undefined if the visible page has no cancel button.
-     *
-     * @type {string|undefined}
-     */
-    cancelButtonText: {
-      type: String,
-      computed: 'computeLocalizedText_(cancelButtonTextId)',
-    },
-
-    /**
-     * Translated text to display on the backward-naviation button.
-     *
-     * Undefined if the visible page has no backward-navigation button.
-     *
-     * @type {string|undefined}
-     */
-    backwardButtonText: {
-      type: String,
-      computed: 'computeLocalizedText_(backwardButtonTextId)',
-    },
-
-    /**
-     * Translated text of main UI Page heading.
-     *
-     * @type {string|undefined}
-     */
-    headerText: {
-      type: String,
-      computed: 'computeLocalizedText_(headerId)',
-    },
-
-    /**
-     * Translated text of main UI Page heading. In general this can include
-     * some markup.
-     *
-     * @type {string|undefined}
-     */
-    messageHtml: {
-      type: String,
-      computed: 'computeLocalizedText_(messageId)',
-    },
   },
 
   /**
@@ -116,23 +42,6 @@
       resolve(true /* canNavigate */);
     });
   },
-
-  /**
-   * @param {string} textId Key for the localized string to appear on a
-   *     button.
-   * @return {string|undefined} The localized string corresponding to the key
-   *     textId. Return value is undefined if textId is not a key
-   *     for any localized string. Note: this includes the case in which
-   *     textId is undefined.
-   * @private
-   */
-  computeLocalizedText_: function(textId) {
-    if (!this.i18nExists(textId)) {
-      return;
-    }
-
-    return loadTimeData.getString(textId);
-  },
 };
 
 /** @polymerBehavior */
diff --git a/ui/webui/resources/cr_elements/cr_link_row/BUILD.gn b/ui/webui/resources/cr_elements/cr_link_row/BUILD.gn
index 4ea265f..790a81ccb 100644
--- a/ui/webui/resources/cr_elements/cr_link_row/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_link_row/BUILD.gn
@@ -13,7 +13,5 @@
 js_library("cr_link_row") {
   deps = [
     "../cr_icon_button:cr_icon_button",
-    "//third_party/polymer/v1_0/components-chromium/iron-behaviors:iron-button-state-extracted",
-    "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted",
   ]
 }
diff --git a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
index 2eb59ef..d7ab527 100644
--- a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
+++ b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
@@ -1,15 +1,14 @@
 <link rel="import" href="../../html/polymer.html">
 
 <link rel="import" href="../cr_icon_button/cr_icon_button.html">
-<link rel="import" href="../cr_icons_css.html">
 <link rel="import" href="../hidden_style_css.html">
+<link rel="import" href="../icons.html">
 <link rel="import" href="../shared_vars_css.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-ripple-behavior.html">
 
 <dom-module id="cr-link-row">
   <template strip-whitespace="">
-    <style include="cr-hidden-style cr-icons">
+    <style include="cr-hidden-style">
       :host {
         align-items: center;
         align-self: stretch;
@@ -63,16 +62,17 @@
     <iron-icon id="startIcon" icon="[[startIcon]]" hidden="[[!startIcon]]"
         aria-hidden="true">
     </iron-icon>
-    <div id="labelWrapper" hidden="[[!label]]">
-      <div id="label" class="label">[[label]]</div>
-      <div id="subLabel" class="secondary label">[[subLabel]]</div>
+    <div id="labelWrapper" hidden="[[hideLabelWrapper_]]">
+      <div id="label" class="label">[[label]]<slot name="label"></slot></div>
+      <div id="subLabel" class="secondary label">
+        [[subLabel]]
+        <slot name="sub-label"></slot>
+      </div>
     </div>
     <slot></slot>
-    <cr-icon-button id="icon" class$="[[getIconClass_(external)]]"
-        aria-describedby$="[[ariaDescribedBy_]]"
-        aria-label$="[[label]]"
-        disabled="[[disabled]]">
-    </cr-icon-button>
+    <cr-icon-button id="icon" iron-icon="[[getIcon_(external)]]" role="link"
+        aria-describedby="subLabel" aria-labelledby="label"
+        disabled="[[disabled]]"></cr-icon-button>
   </template>
   <script src="cr_link_row.js"></script>
 </dom-module>
diff --git a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js
index 2ac17c5..5896388 100644
--- a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js
+++ b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.js
@@ -27,7 +27,6 @@
       type: String,
       /* Value used for noSubLabel attribute. */
       value: '',
-      observer: 'onSubLabelChange_',
     },
 
     disabled: {
@@ -40,8 +39,16 @@
       value: false,
     },
 
-    /** @private {string|undefined} */
-    ariaDescribedBy_: String,
+    usingSlottedLabel: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    hideLabelWrapper_: {
+      type: Boolean,
+      computed: 'computeHideLabelWrapper_(label, usingSlottedLabel)',
+    },
   },
 
   /** @type {boolean} */
@@ -58,13 +65,19 @@
     this.$.icon.focus();
   },
 
-  /** @private */
-  getIconClass_: function() {
-    return this.external ? 'icon-external' : 'subpage-arrow';
+  /**
+   * @return {boolean}
+   * @private
+   */
+  computeHideLabelWrapper_: function() {
+    return !(this.label || this.usingSlottedLabel);
   },
 
-  /** @private */
-  onSubLabelChange_: function() {
-    this.ariaDescribedBy_ = this.subLabel ? 'subLabel' : undefined;
+  /**
+   * @return {string}
+   * @private
+   */
+  getIcon_: function() {
+    return this.external ? 'cr:open-in-new' : 'cr:arrow-right';
   },
 });
diff --git a/ui/webui/resources/cr_elements/icons.html b/ui/webui/resources/cr_elements/icons.html
index e072289..75a2cd0 100644
--- a/ui/webui/resources/cr_elements/icons.html
+++ b/ui/webui/resources/cr_elements/icons.html
@@ -35,6 +35,7 @@
       <g id="arrow-drop-up"><path d="M7 14l5-5 5 5z"></g>
       <g id="arrow-drop-down"><path d="M7 10l5 5 5-5z"></path></g>
       <g id="arrow-forward"><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"></path></g>
+      <g id="arrow-right"><path d="M10 7l5 5-5 5z"></path></g>
 <if expr="chromeos">
       <g id="bluetooth"><path d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z"></path></g>
       <g id="camera-alt"><circle cx="12" cy="12" r="3.2"></circle><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"></path></g>
diff --git a/ui/wm/core/transient_window_manager.cc b/ui/wm/core/transient_window_manager.cc
index 3512abfa..e7803a2ed 100644
--- a/ui/wm/core/transient_window_manager.cc
+++ b/ui/wm/core/transient_window_manager.cc
@@ -124,7 +124,7 @@
 
 void TransientWindowManager::RestackTransientDescendants() {
   Window* parent = window_->parent();
-  if (!parent || !parent->ShouldRestackTransientChildren())
+  if (!parent)
     return;
 
   // Stack any transient children that share the same parent to be in front of
diff --git a/ui/wm/core/transient_window_stacking_client.cc b/ui/wm/core/transient_window_stacking_client.cc
index ff373762..9a6b1fc 100644
--- a/ui/wm/core/transient_window_stacking_client.cc
+++ b/ui/wm/core/transient_window_stacking_client.cc
@@ -79,9 +79,6 @@
   if (transient_manager && transient_manager->IsStackingTransient(*target))
     return true;
 
-  if (!(*child)->parent()->ShouldRestackTransientChildren())
-    return true;
-
   // For windows that have transient children stack the transient ancestors that
   // are siblings. This prevents one transient group from being inserted in the
   // middle of another.